本帖最后由 275437962 于 2013-12-29 12:33 编辑
我想让CAD中的所有满足固定长度和角度两个条件(如直线的长度为0.75,角度为0)的直线的中点插入事先命名的块,让新插入块的图层和它对应的直线所在图层一致,并让所有插入块的颜色改成bylayer(即随层),还有很重要的一点,并将距每一条满足条件直线中点的固定长度范围内(这个范围最好为以每一条直线中点为圆心的虚拟圆)的对象删除(删除的对像包括落在虚拟圆内的对像,也包括与虚拟圆相交的对象;包括每一条满足条件的直线)
说明:里面出现的长度 和角度以及虚拟圆的半径,最好可以更改。
上面是我最初提的问题,有一位朋友写了如下代码,但还存在如下三个问题:
一是“让新插入块的图层和它对应的直线所在图层一致,并让所有插入块的颜色改成bylayer(即随层)”,这个问题还是没有解决,现在程序是新插入块的图层是发生变化了,不是0层,但所有新插入的块的图层对应的应该是案例数据中黄色或紫色线(即满足上面两个条件的直线)所在的图层,现在新插入块的图层对应的是红色的线所在的图层(你可以用程序执行一下下面的“案例数据.dwg”)
二是,我测试时发现的,如果直线的长度不是整的,而是,比如0.75或是0.075,那么这时候直线是不能被选中插入块的
三是,还有就是那个角度条件 ,不起作用,如给成90度,根本就不能达到要求。
 - (defun c:tt ( / a ang bnm e en i la len pe pm ps pts ss sse ssl)
- (vl-load-com)
- (vl-cmdf "undo" "be")
- (if (and (setq bnm (getstring "\输入块名:"))
- (setq ss (ssget '((0 . "line")))))
- (progn
- (setq i -1 ssl (ssadd))
- (while (setq en (ssname ss (setq i (1+ i))))
- (setq len (Vlax-Get (Vlax-Ename->Vla-Object en) 'Length )
- ang (Vlax-Get (Vlax-Ename->Vla-Object en) 'Angle )
- la (Vlax-Get (Vlax-Ename->Vla-Object en) 'Layer )
- )
- (if (and (= len 1.0) (= ang 0.0));线长,角度可改
- (ssadd en ssl)
- )
- )
- (setq i -1)
- (while (setq e (ssname ssl (setq i (1+ i))))
- (progn
- (setq ps (Vlax-Get (Vlax-Ename->Vla-Object e) 'StartPoint )
- pe (Vlax-Get (Vlax-Ename->Vla-Object e) 'EndPoint )
- pm (mapcar '* '(0.5 0.5 0.5) (mapcar '+ ps pe))
- )
- (command "circle" pm 1.0);半径可改
- (setq a (entlast))
- (setq pts (divpts a 500))
- (setq sse (ssget "cp" pts))
- (command "erase" a sse "")
- (command "-insert" bnm pm "0.5" "" "")
- (Vlax-Put-Property (Vlax-Ename->Vla-Object (entlast)) 'Layer la)
- )
- )
- )
- )
- (vl-cmdf "undo" "e")
- )
- (defun divpts (ename n / ename endparam i nparam pt ptlst startparam)
- (setq startparam (vlax-curve-getstartparam ename)
- endparam (vlax-curve-getendparam ename)
- nparam (/ (- endparam startparam) n)
- i -1
- ptlst '()
- )
- (while (<= (setq i (1+ i))
- n
- )
- (setq pt (vlax-curve-getpointatparam ename (* i nparam))
- ptlst (cons pt ptlst)
- )
- )
- (reverse ptlst)
- )
|