明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 6

帮我将lisp修改为批量删掉圆内实体

[复制链接]
发表于 2011-3-31 20:02 | 显示全部楼层 |阅读模式
1明经币
也是在明经找到的这个代码,请高手帮帮忙吧:我在图档里先新建一个图层并置为当前,在这个层我画圆,而这些圆与其它的实体相交(圆内会是直线,圆弧,或者多义线)。我只要输入命令选中其中一个圆,与这圆相同图层的圆,都会将圆内实体删掉。这是我找到的代码,一次只能点选一个执行一次圆内删掉,请帮帮忙,不胜感激
(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"))

发表于 2011-3-31 21:54 | 显示全部楼层
您未附调试用图纸(*.dwg)
先提供初步用的 ....

  1. (defun c:trc (/ oldcmdcho oldosmode enobj kk endata)
  2.   ;; hy_trim_in
  3.   (setq oldcmdcho (getvar "cmdecho"))
  4.   (setvar "cmdecho" 0)
  5.   (setq oldosmode (getvar "osmode"))
  6.   (setvar "osmode" 0)
  7.   (command "ucs" "w")
  8.   (COMMAND "REGEN")
  9.   (princ "\n选圆: ")
  10.   (setq enobj (ssname (ssget ":S" '((0 . "Circle"))) 0))
  11.   ;|
  12.   (initget "1 2")
  13.   (setq kk (getkword "\n剪除内部物体<1>,剪除外部物体<2>:<1?>"))
  14.   (if (= kk nil)
  15.     (setq kk "1")
  16.   )
  17.   (setq endata (entget enobj))
  18.   (cond
  19.     ;; 如果enobj为一个圆;;;;;;;
  20.     ((= (cdr (assoc 0 endata)) "CIRCLE")
  21.   |;   
  22.    (setq endata (entget enobj)
  23.           ssCir (ssget "X" (list (assoc 0 endata) (assoc 8 endata)))
  24.            idx  0
  25.    )
  26.    (while (setq enobj (ssname ssCir idx))
  27.      (setq idx (1+ idx))         
  28.      (hy_trim_in_circle)
  29.    )  
  30.   ;|   
  31.    
  32.     (t (progn (alert "\n你选的物体不是圆!重新确认") (exit)))
  33.   );end cond
  34.   
  35.   |;
  36.   
  37.   (setvar "cmdecho" oldcmdcho)
  38.   (setvar "osmode" oldosmode)
  39.   (prin1)
  40. )
  41. ;;;;;;;;;;剪除圆内或外部的物体;;;;;;;;;;
  42. (defun hy_trim_in_circle (/ centerpoint radius point_list be_angle jk viu_point item)
  43.   (setq endata(entget enobj))
  44.   (setq centerpoint (cdr (assoc 10 endata)))
  45.   (setq radius (cdr (assoc 40 endata)))
  46.   (setq jk (- radius 0.01))
  47.   (setq point_list '())
  48.   ;; 以0.5度为一阶,半径缩小0.05圆上所有点
  49.   ;;(setq be_angle 0);起始角度为0
  50.   (setq i 0)
  51.   ;;计数器归0
  52.   (repeat 720
  53.     (setq viu_point (polar centerpoint
  54.                            (/ (* 0.5 i pi) 180)
  55.                            jk
  56.                     )                        ;end polar
  57.     )
  58.     (setq point_list (cons viu_point point_list))
  59.     (setq i (1+ i))
  60.   )                                        ;end repeat
  61.   (command "undo" "be")
  62.       (command "trim" enobj "" "f")
  63.       (foreach item point_list (command item))
  64.       (command "" "")
  65.   (command "undo" "e")
  66. )
回复

使用道具 举报

 楼主| 发表于 2011-3-31 22:16 | 显示全部楼层
本帖最后由 jcmtxgt 于 2011-3-31 22:23 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2011-3-31 23:25 | 显示全部楼层
感觉用这个程序执行起来也好慢。高手能不能给我新编一个,只需点先其中一个圆,其它相同层的圆都会执行圆内删掉。先谢了
回复

使用道具 举报

发表于 2011-4-1 16:04 | 显示全部楼层
能否附上如您所贴的调试用 Dwg 文件
原程序有其实务上考量,用的是 720 个点位模拟圆
若只依您的贴图,在算法上是多耗费了不少的运算....
最好是能附上您实际应用情况时的调试用 Dwg 文件
有利于定制量身的效率优化
回复

使用道具 举报

 楼主| 发表于 2011-4-2 15:44 | 显示全部楼层
我想到了其它的解决办法,谢谢高手的帮忙
回复

使用道具 举报

 楼主| 发表于 2011-4-2 15:45 | 显示全部楼层
我想到了其它的解决办法,谢谢高手的帮忙
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 06:10 , Processed in 0.200736 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表