357785513 发表于 2011-9-14 12:48:53

删除圆内的线

大家好,我有一个图里有很多圆,可圆里有很多线,我想选返回圆把圆里的线全都删除,有没有什么更好的办法呀
因为他们是块,后来被人炸开了,现在只要圆就行了.而这个块又到处都有,且又被炸开了,各位大帅看看有没有什么办

Andyhon 发表于 2011-9-14 13:35:17

只在 A 开头的图层 ?
直径范围 > 3828 或 what

问这些是关系到 滤取/排除 的条件式
关系到程序效率,特别是在数量大的时候 ....

Gu_xl 发表于 2011-9-14 13:53:28


(defun c:tt(/ getcirpts ssgetcir s en ss)
;;;计算园的分割点 en 园的图元名 n 园的分割段数
(defun getcirpts (en n / i d pl)
    (setq i 0 d (/ pi n 0.5))
    (repeat n
      (setq pl (cons (vlax-curve-getpointatparam en i) pl)
          i (+ i d)
          )
      )
    (reverse pl)
    )
;;;参数 cir 园的图元名 filter 过滤表 n 园的分割段数
(defun ssgetcir (cir filter n)
    (if filter
      (ssget "wp" (getcirpts cir n) filter)
      (ssget "wp" (getcirpts cir n))
      )   
    )
;;;选择的园要在图形可见范围内
(setq s (ssget '((0 . "circle"))))
(if s
    (repeat (setq k (sslength s))
      (setq en (ssname s (setq k (1- k))))
      (if (setq ss (ssgetcir en '((0 . "line")) 20)) ;_ 过滤表可自行修改
        (command "erase" ss "")
        )
      )
    )
)

xshrimp 发表于 2011-9-14 14:00:58


(defun gps->ss-2lst (ss / lst n)
(if (= (type ss) 'PICKSET)
    (repeat (setq n (sslength ss))
   (setq lst (cons (ssname ss (setq n (1- n))) lst))
    )   
);lst
)
(defun c:cc( / center0 entlst lll n oldosmode pt3 radius0)
(prompt "\n清理圆内部线,一窗口搞定:")
(setvar "osmode" 0)
(setq oldosmode (getvar "osmode") )   
(foreach n (gps->ss-2lst (ssget '((0 . "CIRCLE"))))
      (setq entlst (entget n)
        center0 (cdr (assoc 10 entlst))
        radius0 (cdr (assoc 40 entlst))
        LLL 0.0
      )
    (command "_.erase" "wp" )
    (while (< lll 6.29)
      (setq pt3 (polar center0 lll (* radius0 0.9)))
      (command pt3)
      (setq lll (+ 0.2 lll))
    )
(command "" "")   
)
(setvar "osmode" oldosmode)
)

戏男 发表于 2011-9-14 15:32:47

真不错 呵呵 圆内的线也不多啊

357785513 发表于 2011-9-14 17:16:42

三楼楼主的程序对于小于圆的直线来说真是非常棒,不过以下两种情况就不行了曾尝鼎一尝试
(if (setq ss (ssgetcir en '((0 . "line")(0 . "ARC")) 20))或 (if (setq ss (ssgetcir en '((0 . "line""line")) 20))
都不行

Gu_xl 发表于 2011-9-14 18:26:09

本帖最后由 Gu_xl 于 2011-9-14 19:01 编辑

357785513 发表于 2011-9-14 17:16 http://bbs.mjtd.com/static/image/common/back.gif
三楼楼主的程序对于小于圆的直线来说真是非常棒,不过以下两种情况就不行了曾尝鼎一尝试
(if (setq ss (ss ...

对于1楼的图形,3楼就是答案!对于6楼的图,就稍微复杂点,首先将选择方式 "wp" 要改为"CP",再将圆从选择集中剔除,或者"wP"选完后删掉选到的物体,再用 "F" 栏选,再将圆从选择集中剔除,再判断栏选选到的每图元是否落在园内,判断点是否在多边形内的相关代码明经都能搜到!自己再用用心,就能写出程序来了!
下面的代码,仅对删直线有效,对于其他类型实体,请参照自行修改!

(defun c:tt(/ getcirpts ssgetcir s en ss dxf ptincir-p lineincir-p SS->List)
;;;计算园的分割点 en 园的图元名 n 园的分割段数
(defun getcirpts (en n / i d pl)
    (setq i 0 d (/ pi n 0.5))
    (repeat n
      (setq pl (cons (vlax-curve-getpointatparam en i) pl)
            i (+ i d)
            )
      )
    (reverse pl)
    )
;;;参数 cir 园的图元名 filter 过滤表 n 园的分割段数
(defun ssgetcir (cir filter n / ss)
    (if filter
      (setq ss (ssget "cp" (getcirpts cir n) filter))
      (setq ss (ssget "cp" (getcirpts cir n)))
      )
    (ssdel cir ss)
    (if (> (sslength ss) 0)
      ss
      )
    )
(defun dxf (ent i)
    (cond ((= (type ent) 'ename)
   (cdr (assoc i (entget ent)))
      )
   ((= (type ent) 'list)
    (cdr (assoc i ent))
    )
    ) ;_ if
)
;;;判断点是否在园内
(defun ptincir-p (cir pt / r cp d)
    (setq r (dxf cir 40)
   cp (dxf cir 10)
   )
    (or (< (setq d (distance cp pt)) r) (equal d r 0.0001))
    )
;;;判断直线是否在园内
(defun lineincir-p (line cir)
    (and (ptincir-p cir (dxf line 10))
(ptincir-p cir (dxf line 11))
)
    )
;;;选择集->列表
(defun SS->List (ss / i s)
    (if ss
      (repeat (setq i (sslength ss))
(setq s (cons (ssname ss (setq i (1- i))) s))
      )
    )
)
;;;选择的园要在图形可见范围内
(setq s (ssget '((0 . "circle"))))
(if s
    (progn
      (setq s (ss->list s))
      (foreach cir s
      (if (setq ss (ssgetcir cir '((0 . "line")) 20))
      (progn
   (setq ss (ss->list ss))
   (foreach line ss
   (if (lineincir-p line cir) (entdel line))
   )
   )
      )
)
      )
    )
(princ)
)

357785513 发表于 2011-9-15 09:01:18

哦,毛塞敦开,受教了

sicky111 发表于 2013-4-23 21:12:31

无法删除和圆相交的线段。

随风缘 发表于 2013-4-23 23:50:53

要这么麻烦吗!快速选择不就可以了!
页: [1]
查看完整版本: 删除圆内的线