明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1652|回复: 4

[已解答] 判断闭合轮廓的程序,求高手优化!

[复制链接]
发表于 2013-11-6 20:13:32 | 显示全部楼层 |阅读模式
;求简化优化下面的程序,
;查找不闭合点,由 "ARC"    "LINE"   "SPLINE"   "LWPOLYLINE" 组成的轮廓
;现在的问题是对单张图为全部选择,希望达到的效果是,框选图元 ,做类型判断

;1、选择所有
;2、判断类型
;     在圆弧两端50  51做圆
;     在直线两端10 11做圆
;     在曲线和多线10做圆
;3 选择所有的圆,判断同心的删除

(defun c:bfb()
  (setvar "cmdecho" 0)
  (alert "设定标记颜色默认<绿色>")
  (setq cc (acad_colordlg 3))
  (alert "设定标记圆直径默认<3>")
  (setq rc (getreal "\n指定标记圆的直径<3>:"))
  (if (= rc nil) (setq rc 3))


  ;做选择集
(setq ss1(ssget "X"'((0 . "ARC")))
       ss2(ssget "X"'((0 . "LINE")))
       ss3(ssget "X"'((0 . "SPLINE")))
       ss4(ssget "X"'((0 . "LWPOLYLINE"))))
  (setq i1 0
        i2 0
        i3 0
        i4 0)

  ;对圆弧两端做圆
  (repeat (sslength ss1)
    (setq en1 (ssname ss1 i1))
    (setq en1zm (entget en1))
    (setq p0 (cdr(assoc 10 en1zm)))
    (setq pl (cdr(assoc 40 en1zm)))
    (setq p1a (cdr(assoc 50 en1zm)))
    (setq p2a (cdr(assoc 51 en1zm)))
    (setq p1 (polar p0 p1a pl )
          p2 (polar p0 p2a pl ))
    (setq i1 (1+ i1))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p1)(cons 40 (/ rc 2)) (cons 62 cc)))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p2)(cons 40 (/ rc 2)) (cons 62 cc)))
    )

     ;对直线两端做圆
  (repeat (sslength ss2)
    (setq en2 (ssname ss2 i2))
    (setq en2zm (entget en2))
    (setq p3 (cdr (assoc 10 en2zm ))
          p4 (cdr (assoc 11 en2zm )))
    (setq i2 (1+ i2))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p3)(cons 40 (/ rc 2)) (cons 62 cc)))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p4)(cons 40 (/ rc 2)) (cons 62 cc)))
    )


    ;对曲线两端做圆
  (repeat (sslength ss3)
    (setq en3 (ssname ss3 i3))
    (setq en3zm (entget en3))
    (setq p5 (cdr (assoc 10 en3zm ))
          p6 (cdr (assoc 10 (reverse en3zm ))))
    (setq i3 (1+ i3))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p5)(cons 40 (/ rc 2)) (cons 62 cc)))
    (entmake (list(cons 0 "CIRCLE")(cons 10 p6)(cons 40 (/ rc 2)) (cons 62 cc)))
    )



    ;对多线两端做圆
    (repeat (sslength ss4)
      (setq en4 (ssname ss4 i4))
      (setq en4zm (entget en4))
      (setq p7 (cdr (assoc 10 en4zm ))
            p8 (cdr (assoc 10 (reverse en4zm ))))
      (setq i4 (1+ i4))
      (entmake (list(cons 0 "CIRCLE")(cons 10 p7)(cons 40 (/ rc 2)) (cons 62 cc)))
      (entmake (list(cons 0 "CIRCLE")(cons 10 p8)(cons 40 (/ rc 2)) (cons 62 cc)))
    )

;删除同心圆程序,由网友<llsheng_73>提供,此处致以谢意!
(setq ss(ssget "X"'((0 . "circle"))))
(if ss(progn
  (setq m(sslength ss)n 0)
  (while(< n m)
    (setq e(ssname ss n)
    n(1+ n)
    p(assoc 10(entget e))
    l n
    a nil)
    (while(< l m)
      (setq f(ssname ss l)l(1+ l)
      p1(entget f))
      (if(vl-position p p1)
        (progn
    (ssdel f ss)
    (entdel f)
    (setq l(1- l)
          m(1- m)
          a t))))
    (if a(progn
     (ssdel e ss)
     (entdel e)
     (setq n(1- n)
           m(1- m))))
    )
  ))

  (princ)
  )


发表于 2013-11-7 08:10:21 | 显示全部楼层
  1. ;1、窗选
  2. ;2、判断类型
  3. ;     在圆弧两端50  51做圆
  4. ;     在直线两端10 11做圆
  5. ;     在曲线和多线10做圆
  6. ;3 选择所有的圆,判断同心的删除
  7. (defun c:bfb()
  8.   (setvar "cmdecho" 0)
  9.   (alert "设定标记颜色默认<绿色>")
  10.   (setq cc (acad_colordlg 3))
  11.   (alert "设定标记圆直径默认<3>")
  12.   (setq rc (getreal "\n指定标记圆的直径<3>:"))
  13.   (if (= rc nil) (setq rc 3))
  14.   ;做选择集
  15.   (setq pt1 (getpoint "\n窗选角点: "))
  16.   (setq pt2 (getcorner pt1 "\n另一角点: "))
  17.   (setq ss1(ssget "W" pt1 pt2 '((0 . "ARC")))
  18.        ss2(ssget "W" pt2  pt1 '((0 . "LINE")))
  19.        ss3(ssget "W" pt1 pt2 '((0 . "SPLINE")))
  20.        ss4(ssget "W" pt2 pt1 '((0 . "LWPOLYLINE"))))
  21.   (setq i1 0
  22.         i2 0
  23.         i3 0
  24.         i4 0)
  25.   ;对圆弧两端做圆
  26.   (repeat (sslength ss1)
  27.     (setq en1zm (entget (ssname ss1 i1)))
  28.     (setq p0 (cdr(assoc 10 en1zm)))
  29.     (setq pl (cdr(assoc 40 en1zm)))
  30.     (setq p1a (cdr(assoc 50 en1zm)))
  31.     (setq p2a (cdr(assoc 51 en1zm)))
  32.     (setq p1 (polar p0 p1a pl )
  33.           p2 (polar p0 p2a pl ))
  34.     (setq i1 (1+ i1))
  35.     (entmake (list(cons 0 "CIRCLE")(cons 10 p1)(cons 40 (/ rc 2)) (cons 62 cc)))
  36.     (entmake (list(cons 0 "CIRCLE")(cons 10 p2)(cons 40 (/ rc 2)) (cons 62 cc)))
  37.     )
  38.      ;对直线两端做圆
  39.   (repeat (sslength ss2)
  40.     (setq en2zm (entget (ssname ss2 i2)))
  41.     (setq p3 (cdr (assoc 10 en2zm ))
  42.           p4 (cdr (assoc 11 en2zm )))
  43.     (setq i2 (1+ i2))
  44.     (entmake (list(cons 0 "CIRCLE")(cons 10 p3)(cons 40 (/ rc 2)) (cons 62 cc)))
  45.     (entmake (list(cons 0 "CIRCLE")(cons 10 p4)(cons 40 (/ rc 2)) (cons 62 cc)))
  46.    )
  47.     ;对曲线两端做圆
  48.   (repeat (sslength ss3)
  49.     (setq en3zm (entget (ssname ss3 i3)))
  50.     (setq p5 (cdr (assoc 10 en3zm ))
  51.           p6 (cdr (assoc 10 (reverse en3zm ))))
  52.     (setq i3 (1+ i3))
  53.     (entmake (list(cons 0 "CIRCLE")(cons 10 p5)(cons 40 (/ rc 2)) (cons 62 cc)))
  54.     (entmake (list(cons 0 "CIRCLE")(cons 10 p6)(cons 40 (/ rc 2)) (cons 62 cc)))
  55.     )
  56.     ;对多线两端做圆
  57.     (repeat (sslength ss4)
  58.       (setq en4zm (entget (ssname ss4 i4)))
  59.       (setq p7 (cdr (assoc 10 en4zm ))
  60.             p8 (cdr (assoc 10 (reverse en4zm ))))
  61.       (setq i4 (1+ i4))
  62.       (entmake (list(cons 0 "CIRCLE")(cons 10 p7)(cons 40 (/ rc 2)) (cons 62 cc)))
  63.       (entmake (list(cons 0 "CIRCLE")(cons 10 p8)(cons 40 (/ rc 2)) (cons 62 cc)))
  64.     )
  65. ;删除同心圆程序,由网友<llsheng_73>提供,此处致以谢意!
  66.   
  67.   (if (setq ss(ssget "W" pt2 pt1 '((0 . "circle")))) (progn
  68.    (setq m(sslength ss)n 0)
  69.    (while(< n m)
  70.     (setq e(ssname ss n)
  71.     n(1+ n)
  72.     p(assoc 10(entget e))
  73.     l n
  74.     a nil)
  75.     (while(< l m)
  76.      (setq f(ssname ss l)l(1+ l)
  77.       p1(entget f))
  78.      (if(vl-position p p1) (progn
  79.       (ssdel f ss)
  80.       (entdel f)
  81.       (setq l(1- l)
  82.           m(1- m)
  83.           a t)
  84.      ))
  85.     )
  86.     (if a(progn
  87.      (ssdel e ss)
  88.      (entdel e)
  89.      (setq n(1- n)
  90.            m(1- m))
  91.     ))
  92.    )
  93.   ))
  94.   (princ)
  95. )
 楼主| 发表于 2013-11-7 12:28:05 | 显示全部楼层
ZZXXQQ 发表于 2013-11-7 08:10

程序BUG ,对“ARC”两端的圆删除不了……
发表于 2013-11-7 12:54:27 | 显示全部楼层
一般程序只会依当时的需求从简编定
合乎甲 未必 合乎乙

暨是条件有差,就得依实务修定
这就意谓着,得学些编程...
发表于 2013-11-7 19:49:52 | 显示全部楼层
  1. (defun c:bfb ()
  2.   (setvar "cmdecho" 0)
  3.   (alert "设定标记颜色默认<绿色>")
  4.   (setq cc (acad_colordlg 3))
  5.   (alert "设定标记圆直径默认<3>")
  6.   (setq rc (getreal "\n指定标记圆的直径<3>:"))
  7.   (if (= rc nil)
  8.     (setq rc 3)
  9.   )
  10.   (setq        ss (ssget (LIST
  11.                     '(-4 . "<OR")
  12.                     '(0 . "LINE,ARC")
  13.                     '(-4 . "<AND")
  14.                     '(0 . "ELLIPSE")
  15.                     '(-4 . "<OR")
  16.                     '(-4 . "<>")
  17.                     '(41 . 0.0)
  18.                     '(-4 . "<>")
  19.                     (cons 42 (* pi 2))
  20.                     '(-4 . "OR>")
  21.                     '(-4 . "AND>")
  22.                     '(-4 . "<AND")
  23.                     '(0 . "LWPOLYLINE,SPLINE")
  24.                     '(-4 . "<NOT")
  25.                     '(-4 . "&=")
  26.                     '(70 . 1)
  27.                     '(-4 . "NOT>")
  28.                     '(-4 . "AND>")
  29.                     '(-4 . "<AND")
  30.                     '(0 . "PLOYLINE")
  31.                     '(-4 . "<NOT")
  32.                     '(-4 . "&")
  33.                     '(70 . 89)
  34.                     '(-4 . "NOT>")
  35.                     '(-4 . "AND>")
  36.                     '(-4 . "OR>")
  37.                     (if        (= 1 (getvar 'cvport))
  38.                       (cons 410 (getvar 'ctab))
  39.                       '(410 . "Model")
  40.                     )
  41.                   )
  42.            )
  43.   )
  44.   (setq i 0)
  45.   (if ss
  46.     (repeat (sslength ss)
  47.       (setq en (ssname ss i))
  48.       (setq spt        (vlax-curve-getstartpoint en)
  49.             ept        (vlax-curve-getendpoint en)
  50.       )
  51.       (entmake (list (cons 0 "CIRCLE")
  52.                      (cons 10 spt)
  53.                      (cons 40 (/ rc 2))
  54.                      (cons 62 cc)
  55.                )
  56.       )
  57.       (entmake (list (cons 0 "CIRCLE")
  58.                      (cons 10 ept)
  59.                      (cons 40 (/ rc 2))
  60.                      (cons 62 cc)
  61.                )
  62.       )
  63.       (setq i (1+ i))
  64.     )
  65.   )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 21:14 , Processed in 0.200078 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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