查找圆的区域
你好我想使用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总计))
(普林斯)
) 请尝试:
(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)
) 很酷的Wizman,从不知道你可以使用:
(-4."*,=,*")
作为一种过滤方式 嘿,谢谢Wizman!太棒了!
我现在想修改它,使其在“while”循环中进行更多处理。所以我可能会有另一个帖子——当我的轮子开始在泥里打滑的时候。
干杯 实际上,我已经被困在修改它了。
我想找到每一行上最左边位置的圆的中心点值(x,y)。换句话说,最小的x值。不知道在while循环中如何进行。
非常感谢您抽出时间。 试试看,伙计:
(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))
嗨,谢谢Wizman-我差一点就到了,只是错过了一辆“车”,而“>”走错了路
再次感谢 好的,对不起,但现在我有另一个相当棘手的问题。
我的轮子真的在泥里打转。
正如我在第一篇文章中所描述的,我有一排圆圈。
如果我有一条垂直线,或多或少地穿过整组圆。
因此,大约一半的圆中心点位于直线的一侧,一半位于另一侧。
我想做两组答案(显示面积半径等)-一个用于左边的圆,另一个用于右边的圆。
假设Pt1和Pt2代表垂直线。
那么将两组分开的y值将为
(setq Yvalue(汽车Pt1))
现在下一步我真的不知道该怎么做?
虽然我想我需要使用vl排序,然后比较和
从中创建新的两个集合并处理这两个集合。
再次感谢您的时间和努力
是的,我在沼泽上发了帖子,从CAB和其他人那里收到了一些好信息 我还没有收到最后一条小鱼的回复,如果这条线是垂直的,那么他一定在检查Xvalue,对吗?
页:
[1]
2