帮我将lisp修改为批量删掉圆内实体
也是在明经找到的这个代码,请高手帮帮忙吧:我在图档里先新建一个图层并置为当前,在这个层我画圆,而这些圆与其它的实体相交(圆内会是直线,圆弧,或者多义线)。我只要输入命令选中其中一个圆,与这圆相同图层的圆,都会将圆内实体删掉。这是我找到的代码,一次只能点选一个执行一次圆内删掉,请帮帮忙,不胜感激(defun c:trc(/ oldcmdcho oldosmode enobj kk endata);;;hy_trim_in
(setq oldcmdcho (getvar"cmdecho"))
(setvar"cmdecho"0)
(setq oldosmode (getvar"osmode"))
(setvar"osmode"0)
(command"ucs""w")
(COMMAND"REGEN")
(setq enobj (car (entsel"\n选圆:")))
(initget"1 2")
(setq kk (getkword"\n剪除内部物体<1>,剪除外部物体<2>:<1?>"))
(if (= kk nil) (setq kk"1"))
(setq endata (entget enobj))
(cond
;;;;;如果enobj为一个圆;;;;;;;
((= (cdr (assoc 0 endata))"CIRCLE")
(hy_trim_in_circle))
(t (progn (alert"\n你选的物体不是圆!重新确认")(exit))))
;end cond
(setvar"cmdecho"oldcmdcho)
(setvar"osmode"oldosmode)
(prin1)
)
;;;;;;;;;;剪除圆内或外部的物体;;;;;;;;;;
(defun hy_trim_in_circle(/ centerpoint radius point_list be_angle jk viu_point item)
(setq centerpoint (cdr(assoc 10 endata)))
(setq radius (cdr(assoc 40 endata)))
(if (= kk"1") (setq jk (- radius 0.01)) (setq jk (+ radius 0.01)))
(setq point_list'());;;以0.5度为一阶,半径缩小0.05圆上所有点
;(setq be_angle 0);起始角度为0
(setq i 0);;计数器归0
(repeat 720
(setq viu_point (polar centerpoint
(/ (* 0.5 i pi) 180)
jk);end polar
)
(setq point_list (cons viu_point point_list))
(setq i (1+ i))
);end repeat
(command"undo""be")
(if (= kk"1")
(progn
(command"trim"enobj"""f")
(foreach item point_list (command item))
(command""""))
)
(if (/= kk"1") (progn (setq i 0)
(repeat (length point_list)
(command"trim"enobj"""f"(nth i point_list) (nth (1+ i) point_list)"""")
(setq i (1+ i))
)
)
)
(command"undo""e"))
您未附调试用图纸(*.dwg)
先提供初步用的 ....
(defun c:trc (/ oldcmdcho oldosmode enobj kk endata)
;; hy_trim_in
(setq oldcmdcho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)
(command "ucs" "w")
(COMMAND "REGEN")
(princ "\n选圆: ")
(setq enobj (ssname (ssget ":S" '((0 . "Circle"))) 0))
;|
(initget "1 2")
(setq kk (getkword "\n剪除内部物体<1>,剪除外部物体<2>:<1?>"))
(if (= kk nil)
(setq kk "1")
)
(setq endata (entget enobj))
(cond
;; 如果enobj为一个圆;;;;;;;
((= (cdr (assoc 0 endata)) "CIRCLE")
|;
(setq endata (entget enobj)
ssCir (ssget "X" (list (assoc 0 endata) (assoc 8 endata)))
idx0
)
(while (setq enobj (ssname ssCir idx))
(setq idx (1+ idx))
(hy_trim_in_circle)
)
;|
(t (progn (alert "\n你选的物体不是圆!重新确认") (exit)))
);end cond
|;
(setvar "cmdecho" oldcmdcho)
(setvar "osmode" oldosmode)
(prin1)
)
;;;;;;;;;;剪除圆内或外部的物体;;;;;;;;;;
(defun hy_trim_in_circle (/ centerpoint radius point_list be_angle jk viu_point item)
(setq endata(entget enobj))
(setq centerpoint (cdr (assoc 10 endata)))
(setq radius (cdr (assoc 40 endata)))
(setq jk (- radius 0.01))
(setq point_list '())
;; 以0.5度为一阶,半径缩小0.05圆上所有点
;;(setq be_angle 0);起始角度为0
(setq i 0)
;;计数器归0
(repeat 720
(setq viu_point (polar centerpoint
(/ (* 0.5 i pi) 180)
jk
) ;end polar
)
(setq point_list (cons viu_point point_list))
(setq i (1+ i))
) ;end repeat
(command "undo" "be")
(command "trim" enobj "" "f")
(foreach item point_list (command item))
(command "" "")
(command "undo" "e")
)
本帖最后由 jcmtxgt 于 2011-3-31 22:23 编辑
先谢谢高手的回得,可是运行不了。提示error: bad ssget mode string
附上原程序示意图,感觉对直线还可以,对圆弧,和圆内剪就会出错。只有线剪的方法才对 感觉用这个程序执行起来也好慢。高手能不能给我新编一个,只需点先其中一个圆,其它相同层的圆都会执行圆内删掉。先谢了 能否附上如您所贴的调试用 Dwg 文件
原程序有其实务上考量,用的是 720 个点位模拟圆
若只依您的贴图,在算法上是多耗费了不少的运算....
最好是能附上您实际应用情况时的调试用 Dwg 文件
有利于定制量身的效率优化 我想到了其它的解决办法,谢谢高手的帮忙 我想到了其它的解决办法,谢谢高手的帮忙
页:
[1]