明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: theisland

[已解答] 急求按顺序打断线条的程序!!!

[复制链接]
发表于 2015-8-29 18:38 来自手机 | 显示全部楼层
从优先纸最高的图层开始遍历,只会新产生低优先级的图元。这样程序运行速度会快很多。
回复

使用道具 举报

发表于 2015-8-29 18:44 来自手机 | 显示全部楼层
貌似楼主用于表示管线遮挡用
回复

使用道具 举报

 楼主| 发表于 2015-8-29 18:51 | 显示全部楼层
etoxp 发表于 2015-8-29 18:44
貌似楼主用于表示管线遮挡用

对,就是这个作用,表达一种遮挡关系
回复

使用道具 举报

发表于 2015-8-29 21:27 | 显示全部楼层
没有做交互程序,使用时自行设置图层及断线宽度两个参数
开始觉得蛮简单,实际还是有点复杂的,借用了不少论坛里的代码,封闭曲线暂时不能处理。
未经严格测试。

  1. (setq *layer-sequence* '("图层1" "图层2" "图层3" "图层4" "图层5" "图层6" "图层7")
  2.       *break-width*    200.0
  3. )


  4. (defun select-curves (/ ent i n rt ss)

  5.   (setq        ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")))
  6.         i  0
  7.         n  (sslength ss)
  8.   )
  9.   (repeat n
  10.     (setq ent (ssname ss i)
  11.           rt  (cons (list ent
  12.                           (cdr (assoc 8 (entget ent)))
  13.                     )
  14.                     rt
  15.               )
  16.           i   (1+ i)
  17.     )
  18.   )

  19.   ;; (<图元名: -24a300> "图层2")
  20.   ;; ...
  21.   rt
  22. )


  23. (defun append-break-point (lst layerorder / ipts old pts rt)
  24.   (foreach e1 lst
  25.     (foreach e2        (cdr lst)

  26.       ;; 图层不打断
  27.       (if (< (vl-position (cadr e1) layerorder) (vl-position (cadr e2) layerorder))
  28.         (progn
  29.           (setq        ipts (vlax-variant-value
  30.                        (vla-intersectwith
  31.                          (vlax-ename->vla-object (car e1))
  32.                          (vlax-ename->vla-object (car e2))
  33.                          0
  34.                        )
  35.                      )
  36.           )

  37.           (if (> (vlax-safearray-get-u-bound ipts 1) 0)
  38.             (progn
  39.               (setq ipts (vlax-safearray->list ipts))
  40.               (while ipts
  41.                 (setq pts  (cons (list (car ipts)
  42.                                        (cadr ipts)
  43.                                        (caddr ipts)
  44.                                  )
  45.                                  pts
  46.                            )
  47.                       ipts (cdddr ipts)
  48.                 )
  49.               )
  50.               (if (setq old (assoc (car e2) rt))
  51.                 (setq rt (subst (append old pts) old rt))
  52.                 (setq rt (cons (cons (car e2) pts) rt))
  53.               )
  54.               (setq pts nil)
  55.             )
  56.           )
  57.         )
  58.       )
  59.     )
  60.   )

  61.   ;; (<图元名: -2306e0> (-224414.0 66920.2 0.0) (-224414.0 65920.2 0.0))..
  62.   ;; ...
  63.   rt
  64. )



  65. (defun v-length        (v /)
  66.   (sqrt (apply '+ (mapcar '(lambda (e) (* e e)) v)))
  67. )


  68. (defun v-normal        (v / len)
  69.   (setq len (v-length v))
  70.   (if (/= 0 len)
  71.     (mapcar '(lambda (e) (/ e len)) v)
  72.     '(0.0 0.0 0.0)
  73.   )
  74. )


  75. ;;; Author: Copyright? 2006,2007 Charles Alan Butler
  76. ;;; Contact @  www.TheSwamp.org
  77. (defun break_obj (ent brkptlst / brkobjlst closedobj deriv e enttype obj obj2break)
  78.   (setq        obj2break ent
  79.         brkobjlst (list ent)
  80.         enttype          (cdr (assoc 0 (entget ent)))
  81.   )
  82.   (foreach brkpt brkptlst                ;  get last entity created via break
  83.                                         ; in case multiple breaks
  84.     (if        brkobjlst
  85.       (progn                                ;  if pt not on object x, switch
  86.                                         ; objects
  87.         (if (not (numberp (vl-catch-all-apply
  88.                             'vlax-curve-getdistatpoint
  89.                             (list obj2break brkpt)
  90.                           )
  91.                  )
  92.             )
  93.           (foreach obj brkobjlst        ; find the one that pt is on
  94.             (if        (numberp (vl-catch-all-apply
  95.                            'vlax-curve-getdistatpoint
  96.                            (list obj brkpt)
  97.                          )
  98.                 )
  99.               (setq obj2break obj)        ; switch objects
  100.             )
  101.           )
  102.         )
  103.       )
  104.     )

  105.     (setq
  106.       obj   (vlax-ename->vla-object obj2break)
  107.       deriv (vlax-curve-getfirstderiv obj (vlax-curve-getparamatpoint obj brkpt))
  108.       deriv (v-normal deriv)
  109.       deriv (mapcar '(lambda (e) (* e (/ *break-width* 2.0))) deriv)
  110.     )


  111.     (setq closedobj (vlax-curve-isclosed obj2break))
  112.     (command "._break"
  113.              obj2break
  114.              "_non"
  115.              (trans (mapcar '+ brkpt deriv) 0 1)
  116.              "_non"
  117.              (trans (mapcar '- brkpt deriv) 0 1)
  118.     )
  119.     (if        (not closedobj)                        ; new object was created
  120.       (setq brkobjlst (cons (entlast) brkobjlst))
  121.     )
  122.   )
  123. )


  124. (defun c:tt (/ rt)
  125.   (setvar "CMDECHO" 0)

  126.   (setq        rt (append-break-point
  127.              (select-curves)
  128.              *layer-sequence*
  129.            )
  130.   )

  131.   (command ".undo" "BE")
  132.   (foreach e rt
  133.     (break_obj (car e) (cdr e))
  134.   )
  135.   (command ".undo" "E")

  136.   (setvar "CMDECHO" 1)
  137.   (princ)
  138. )

评分

参与人数 1明经币 +1 收起 理由
theisland + 1 给力!感谢回复!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-8-29 23:10 | 显示全部楼层
本帖最后由 theisland 于 2015-8-29 23:13 编辑
vectra 发表于 2015-8-29 21:27
没有做交互程序,使用时自行设置图层及断线宽度两个参数
开始觉得蛮简单,实际还是有点复杂的,借用了不少 ...

非常感谢!基本能满足使用要求了,如果能临时指定打断距离,以及临时点选图层顺序的话就完美了!
闭合曲线实际工作中用不着,不用考虑,
希望框选时,指定图层之外的其他对象不被选择,
程序里面的图层罗列,有更好的格式吗?比如说弄成一行一行的格式,更方便编辑
盼你完善一下就好了,强烈期待啊!
回复

使用道具 举报

发表于 2015-8-29 23:44 | 显示全部楼层
本帖最后由 etoxp 于 2015-8-30 00:01 编辑

或许也可以这样做:
直接画成三维的,然后用flatshot命令画出俯视图,可以体现出遮挡效果。
也可以在布局里面绘图,在一个视口里展现三维模型的俯视图。

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2015-8-30 00:46 | 显示全部楼层
etoxp 发表于 2015-8-29 23:44
或许也可以这样做:
直接画成三维的,然后用flatshot命令画出俯视图,可以体现出遮挡效果。
也可以在布局 ...

这样就整复杂了~~

点评

其实楼上说的办法应该更合理些,虽然我没绘过管网图,但始终保持管线的连续性在很多应用分析方面相当重要  发表于 2015-8-30 03:37
回复

使用道具 举报

 楼主| 发表于 2015-8-30 06:31 | 显示全部楼层
llsheng_73 发表于 2015-8-30 02:51
郁闷死了,上传不了图片也传不了附件,该死的IE11?
命令tt,用测试图测试没发现问题,可以调整图层顺序( ...

你这个思路很不错,更好用,问题是如果图中图层很多,你的程序一下子读取太多无关图层出来,反而不方便操作;如果能在你这个基础上增加一些默认图层及其排序就太好了!程序里面的图层列表要便于编辑,对话框里面增加一个“点选添加图层”按钮,可以临时补充程序中没有列出的新图层,强烈期待!

点评

所以有了一个可以移除。。。。  发表于 2015-8-30 08:51
回复

使用道具 举报

发表于 2015-8-30 09:12 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-8-30 09:13 编辑
theisland 发表于 2015-8-30 06:31
你这个思路很不错,更好用,问题是如果图中图层很多,你的程序一下子读取太多无关图层出来,反而不方便操 ...


今天要出去,晚上回来再加上可以在图形中选择一些图层,另外增加一个反选。。。
另外列表是可以多选并能移除,所以无关图层太多的问题应该不是太大问题。。。。
回复

使用道具 举报

发表于 2015-8-30 09:46 | 显示全部楼层
本帖最后由 vectra 于 2015-8-30 09:52 编辑

增加了交互部分

  1. (setq *layer-sequence* '("图层1" "图层2" "图层3" "图层4" "图层5" "图层6" "图层7")
  2.       *break-width*    200.0
  3. )

  4. (defun strcatlayernames        (layernames / a)
  5.   (setq        a           (car layernames)
  6.         layernames (cdr layernames)
  7.   )

  8.   (while layernames
  9.     (setq a             (strcat a "," (car layernames))
  10.           layernames (cdr layernames)
  11.     )
  12.   )
  13.   a
  14. )


  15. (defun select-layer-sequence (/ en rt)
  16.   (while (setq en (entsel "选择对象:"))
  17.     (setq rt (cons (cdr (assoc 8 (entget (car en)))) rt))
  18.   )
  19.   (setq *layer-sequence* (reverse rt))
  20. )


  21. (defun get-break-dist (/ rt)
  22.   (setq        rt (getdist
  23.              (strcat "\n输入断开间距 <" (rtos *break-width* 2 2) ">: ")
  24.            )
  25.   )

  26.   (if (not (null rt))
  27.     (setq *break-width* rt)
  28.   )
  29. )


  30. (defun select-curves (/ ent i n rt ss)

  31.   (setq        ss (ssget (list        '(0 . "*LINE,ARC,CIRCLE,ELLIPSE")
  32.                         (cons 8 (strcatlayernames *layer-sequence*))
  33.                   )
  34.            )
  35.         i  0
  36.         n  (sslength ss)
  37.   )
  38.   (repeat n
  39.     (setq ent (ssname ss i)
  40.           rt  (cons (list ent
  41.                           (cdr (assoc 8 (entget ent)))
  42.                     )
  43.                     rt
  44.               )
  45.           i   (1+ i)
  46.     )
  47.   )

  48.   ;; (<图元名: -24a300> "图层2")
  49.   ;; ...
  50.   rt
  51. )


  52. (defun append-break-point (lst layerorder / ipts old pts rt)
  53.   (foreach e1 lst
  54.     (foreach e2        (cdr lst)

  55.       ;; 图层不打断
  56.       (if (< (vl-position (cadr e1) layerorder) (vl-position (cadr e2) layerorder))
  57.         (progn
  58.           (setq        ipts (vlax-variant-value
  59.                        (vla-intersectwith
  60.                          (vlax-ename->vla-object (car e1))
  61.                          (vlax-ename->vla-object (car e2))
  62.                          0
  63.                        )
  64.                      )
  65.           )

  66.           (if (> (vlax-safearray-get-u-bound ipts 1) 0)
  67.             (progn
  68.               (setq ipts (vlax-safearray->list ipts))
  69.               (while ipts
  70.                 (setq pts  (cons (list (car ipts)
  71.                                        (cadr ipts)
  72.                                        (caddr ipts)
  73.                                  )
  74.                                  pts
  75.                            )
  76.                       ipts (cdddr ipts)
  77.                 )
  78.               )
  79.               (if (setq old (assoc (car e2) rt))
  80.                 (setq rt (subst (append old pts) old rt))
  81.                 (setq rt (cons (cons (car e2) pts) rt))
  82.               )
  83.               (setq pts nil)
  84.             )
  85.           )
  86.         )
  87.       )
  88.     )
  89.   )

  90.   ;; (<图元名: -2306e0> (-224414.0 66920.2 0.0) (-224414.0 65920.2 0.0))..
  91.   ;; ...
  92.   rt
  93. )



  94. (defun v-length        (v /)
  95.   (sqrt (apply '+ (mapcar '(lambda (e) (* e e)) v)))
  96. )


  97. (defun v-normal        (v / len)
  98.   (setq len (v-length v))
  99.   (if (/= 0 len)
  100.     (mapcar '(lambda (e) (/ e len)) v)
  101.     '(0.0 0.0 0.0)
  102.   )
  103. )


  104. ;;; Author: Copyright? 2006,2007 Charles Alan Butler
  105. ;;; Contact @  <a rel=\"nofollow\" href=\"/plugin.php?id=laoyang_wailianx&url=http://www.TheSwamp.org\" target=\"_blank\">www.TheSwamp.org</a>
  106. (defun break_obj (ent brkptlst / brkobjlst closedobj deriv e enttype obj obj2break)
  107.   (setq        obj2break ent
  108.         brkobjlst (list ent)
  109.         enttype          (cdr (assoc 0 (entget ent)))
  110.   )
  111.   (foreach brkpt brkptlst                ;  get last entity created via break
  112.                                         ; in case multiple breaks
  113.     (if        brkobjlst
  114.       (progn                                ;  if pt not on object x, switch
  115.                                         ; objects
  116.         (if (not (numberp (vl-catch-all-apply
  117.                             'vlax-curve-getdistatpoint
  118.                             (list obj2break brkpt)
  119.                           )
  120.                  )
  121.             )
  122.           (foreach obj brkobjlst        ; find the one that pt is on
  123.             (if        (numberp (vl-catch-all-apply
  124.                            'vlax-curve-getdistatpoint
  125.                            (list obj brkpt)
  126.                          )
  127.                 )
  128.               (setq obj2break obj)        ; switch objects
  129.             )
  130.           )
  131.         )
  132.       )
  133.     )

  134.     (setq
  135.       obj   (vlax-ename->vla-object obj2break)
  136.       deriv (vlax-curve-getfirstderiv obj (vlax-curve-getparamatpoint obj brkpt))
  137.       deriv (v-normal deriv)
  138.       deriv (mapcar '(lambda (e) (* e (/ *break-width* 2.0))) deriv)
  139.     )


  140.     (setq closedobj (vlax-curve-isclosed obj2break))
  141.     (command "._break"
  142.              obj2break
  143.              "_non"
  144.              (trans (mapcar '+ brkpt deriv) 0 1)
  145.              "_non"
  146.              (trans (mapcar '- brkpt deriv) 0 1)
  147.     )
  148.     (if        (not closedobj)                        ; new object was created
  149.       (setq brkobjlst (cons (entlast) brkobjlst))
  150.     )
  151.   )
  152. )


  153. (defun c:tt (/ rt option)
  154.   (setvar "CMDECHO" 0)

  155.   (princ (strcat "\n图层顺序: \"" (strcatlayernames *layer-sequence*) "\""))
  156.   (while (/= "E" option)
  157.     (initget "L D S E")
  158.     (setq option
  159.            (getkword
  160.              "\n输入选项 [图层(L)/间距(D)/开始选择(S)] <退出>:"
  161.            )
  162.     )
  163.     (cond
  164.       ((= "L" option)
  165.        (select-layer-sequence)
  166.        (princ (strcat "\n图层顺序: \"" (strcatlayernames *layer-sequence*) "\""))
  167.       )
  168.       ((= "D" option)
  169.        (get-break-dist)
  170.       )
  171.       ((= "S" option)
  172.        (setq rt        (append-break-point
  173.                   (select-curves)
  174.                   *layer-sequence*
  175.                 )
  176.        )

  177.        (command ".undo" "BE")
  178.        (foreach        e rt
  179.          (break_obj (car e) (cdr e))
  180.        )
  181.        (command ".undo" "E")
  182.        (setq option "E")
  183.       )
  184.       ((= nil option)
  185.        (setq option "E")
  186.       )
  187.     )
  188.   )

  189.   (setvar "CMDECHO" 1)
  190.   (princ)
  191. )
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 15:30 , Processed in 0.681178 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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