Small Fish 发表于 2022-7-6 14:39:23

查找圆的区域

你好
我想使用ssget或其他方法查找行中的圆区域。
 
例如,假设行上有3个圆,并且中心点y值相同。直径可能不同。
另一行可能有2个圆,并且中心点y值相同
另一行可能有4个圆。
我想计算的是每行的总面积。
因此,我的期末考试将有三个不同行的总面积。(三个答案)
 
 
我尝试在代码中执行以下操作:
1) 创建所有圆的选择集
2) 制作一个过滤器,查找具有相同中心点y值的圆的行。
3) 处理圆形行并找到该行的圆形总面积。
4) 从选择集中删除该行。
5) 转到下一行,计算该行的总面积
以此类推,直到计算出所有行区域。
 
我试图写一些东西,虽然它不起作用。也许有人可以重写一下让它继续?
如果你能破解这个,非常感谢!
这是我的代码:
 
(defun c:RowAreas(/js jsx js\u new n dxf\u ent)
new\u js m new\u xx areaobjn obj1 obj总计)
(vl load com)
(setq jsx(ssget’((0。“圆”))
js_new(ssadd))
(setq n(sslength jsx))
(setq dxf_ent(entget(ssname jsx(setq n(1-n k)а)));获取实体列表
(setq测试1)
(虽然(
(setq new_xx)
(ssget“_X”(列表)(0。“圆”)
“(-4”“*,=,*”)(assoc 10 dxf_ent));相同圆心y值
);setq公司
(setq i 0)
(setq总计0.0)
(setq lenrow(sslength new_xx))
(setq obj(vlax ename->vla object(ssname new\u xx i)))
(setq areaobj(vla get area obj))
(setq total(+total areaobj));同一行上圆的总面积
(setq i(1+i))
(ssdel js_new new_xx)
);虽然
(警报(rtos总计))
(普林斯)
)

wizman 发表于 2022-7-6 14:45:49

请尝试:
 
 
(defun c:RowAreas (/ areaobj dxf_ent i jsx jsx_ename jsx_ ename2 lenrow        new_xx obj test        total)
   (vl-load-com)
   (if        (setq jsx (ssget "_X" '((0 . "CIRCLE"))))
(progn
    (setq test 1)
    (while (not (zerop (sslength jsx)))
        (setq dxf_ent (entget (setq jsx_ename (ssname jsx 0))))
        (setq new_xx
               (ssget        "_X"
                        (list '(0 . "CIRCLE")
                              '(-4 . "*,=,*")
                              (assoc 10 dxf_ent)
                        )
               )
        )
        (setq i 0)
        (setq total 0.0)
        (setq lenrow (sslength new_xx))
        (while (< i lenrow)
          (setq obj (vlax-ename->vla-object (setq jsx_ename2 (ssname new_xx i))))
          (setq areaobj (vla-get-area obj))
          (setq total (+ total areaobj))
          (setq i (1+ i))
          (ssdel jsx_ename2 jsx)
        )
        (princ (strcat "Row "
                     (itoa test)
                     ";"
                     " Y = "
                     (rtos (caddr (assoc 10 dxf_ent)))
                     " => "
                     (rtos total)
                     "\n"
             )
        )
        (ssdel jsx_ename jsx)
        (setq test (1+ test))
    )
    (textscr)
)
   )
   (princ)
)

Lee Mac 发表于 2022-7-6 14:48:11

很酷的Wizman,从不知道你可以使用:
 

(-4."*,=,*")

 
作为一种过滤方式

Small Fish 发表于 2022-7-6 14:51:50

嘿,谢谢Wizman!太棒了!
我现在想修改它,使其在“while”循环中进行更多处理。所以我可能会有另一个帖子——当我的轮子开始在泥里打滑的时候。
干杯

Small Fish 发表于 2022-7-6 14:52:23

实际上,我已经被困在修改它了。
我想找到每一行上最左边位置的圆的中心点值(x,y)。换句话说,最小的x值。不知道在while循环中如何进行。
非常感谢您抽出时间。

Lee Mac 发表于 2022-7-6 14:56:11

试试看,伙计:
 

(defun c:RowAreas(/ jsx test dxf_ent jsx_ename new_xx total areaobj cLst)
(vl-load-com)
(if (setq jsx (ssget "_X" '((0 . "CIRCLE"))))
   (progn
   (setq test 1)
   (while (not (zerop (sslength jsx)))
       (setq dxf_ent (entget (setq jsx_ename (ssname jsx 0)))
             new_xx(ssget "_X"
                            (list '(0 . "CIRCLE")
                                  '(-4 . "*,=,*")
                                  (assoc 10 dxf_ent)))
             total   0.0)
       (foreach ent(setq new_xxlst (mapcar 'cadr (ssnamex new_xx)))
         (setq areaobj (vla-get-area
                         (vlax-ename->vla-object ent))
               total   (+ total areaobj)))
       (setq cLst (vl-sort
         (mapcar '(lambda (x) (cdr (assoc 10 (entget x)))) new_xxlst)
         '(lambda (x1 x2) (< (car x1) (car x2)))))
       (mapcar '(lambda (x) (ssdel x jsx)) new_xxlst)
       (princ (strcat "Row " (itoa test)
                      "; Center: " (vl-princ-to-string (car cLst))
                      " Y = " (rtos (caddr (assoc 10 dxf_ent)))
                      " => " (rtos total) "\n"))
       (ssdel jsx_ename jsx)
       (setq test (1+ test)))
   (textscr)))
(princ))

Small Fish 发表于 2022-7-6 14:59:25

嗨,谢谢Wizman-我差一点就到了,只是错过了一辆“车”,而“>”走错了路
再次感谢

Lee Mac 发表于 2022-7-6 15:03:03

好的,对不起,但现在我有另一个相当棘手的问题。
我的轮子真的在泥里打转。
正如我在第一篇文章中所描述的,我有一排圆圈。
如果我有一条垂直线,或多或少地穿过整组圆。
因此,大约一半的圆中心点位于直线的一侧,一半位于另一侧。
我想做两组答案(显示面积半径等)-一个用于左边的圆,另一个用于右边的圆。
 
假设Pt1和Pt2代表垂直线。
那么将两组分开的y值将为
(setq Yvalue(汽车Pt1))
现在下一步我真的不知道该怎么做?
虽然我想我需要使用vl排序,然后比较和
从中创建新的两个集合并处理这两个集合。
再次感谢您的时间和努力

Small Fish 发表于 2022-7-6 15:05:26

 
是的,我在沼泽上发了帖子,从CAB和其他人那里收到了一些好信息

wizman 发表于 2022-7-6 15:10:53

我还没有收到最后一条小鱼的回复,如果这条线是垂直的,那么他一定在检查Xvalue,对吗?
页: [1] 2
查看完整版本: 查找圆的区域