jcmtxgt 发表于 2011-3-31 20:02:37

帮我将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"))

Andyhon 发表于 2011-3-31 21:54:55

您未附调试用图纸(*.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:16:47

本帖最后由 jcmtxgt 于 2011-3-31 22:23 编辑

先谢谢高手的回得,可是运行不了。提示error: bad ssget mode string
附上原程序示意图,感觉对直线还可以,对圆弧,和圆内剪就会出错。只有线剪的方法才对

jcmtxgt 发表于 2011-3-31 23:25:39

感觉用这个程序执行起来也好慢。高手能不能给我新编一个,只需点先其中一个圆,其它相同层的圆都会执行圆内删掉。先谢了

Andyhon 发表于 2011-4-1 16:04:34

能否附上如您所贴的调试用 Dwg 文件
原程序有其实务上考量,用的是 720 个点位模拟圆
若只依您的贴图,在算法上是多耗费了不少的运算....
最好是能附上您实际应用情况时的调试用 Dwg 文件
有利于定制量身的效率优化

jcmtxgt 发表于 2011-4-2 15:44:52

我想到了其它的解决办法,谢谢高手的帮忙

jcmtxgt 发表于 2011-4-2 15:45:34

我想到了其它的解决办法,谢谢高手的帮忙
页: [1]
查看完整版本: 帮我将lisp修改为批量删掉圆内实体