找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 758|回复: 3

[求助] [求助]:編了個交點處打斷,有錯.請各位指點一下!

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2006-1-21 08:29:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
編了個交點處打斷,有錯.請各位指點一下!

程序思路:
1.先求實體交點表.
2.對選擇集中的每個實體,看哪些點在這個實體上.
3.將在這個實體上的點進行按離起點的距離排序.(正方向)
4.先將離起點近的實體打斷.用entlast求得離起點較遠的部,再從離起點近的點開始打斷.


主程序:



  1.   [FONT=courier new]
  2. (defun th-breakatintersec (ss / ename i j k l m n ptj ptlist ptlisti
  3.                               ptlistmin2max ssnamei
  4.                           )
  5.   (if (= ss nil)
  6.     (setq ss (ssget '((0 . "*LINE,ARC"))))
  7.   )
  8.   (if (setq ptlist (th2-ssinters ss))
  9.     (progn
  10.       (setq i -1
  11.             j -1
  12.             m (1- (sslength ss))
  13.             n (1- (length ptlist))
  14.       )
  15.       (while (< i m)
  16.         (setq ssnamei (ssname ss (setq i (1+ i))))
  17.         (setq ptlisti '())
  18.         (while (< j n)
  19.           (setq ptj (nth (setq j (1+ j))
  20.                          ptlist
  21.                     )
  22.           )
  23.           (if (vlax-curve-getdistatpoint ssnamei ptj)
  24.             (setq ptlisti (cons ptj ptlisti))
  25.           )
  26.         )
  27.         (if ptlisti
  28.           (progn
  29.             (setq ptlistmin2max (th-getnin2maxpts ssnamei ptlisti)
  30.                   k 1
  31.                   l (1- (length ptlistmin2max))
  32.             )
  33.             (while (< k l)
  34.               (command "break" ssnamei (nth (setq k (1+ k))
  35.                                             ptlistmin2max
  36.                                        ) "@"
  37.               )
  38.               (setq ssnamei (entlast))
  39.             )
  40.           )
  41.         )
  42.       )
  43.     )
  44.   )
  45. )
  46.   [/FONT]

求交點集子程序(函數庫裏有,改了個名):


  1.   [FONT=courier new]
  2. (defun th2-ssinters (ss            /           ss          ssl         pts        aobj1  aobj2
  3.                      n1            n2           ipts          a         n        nn
  4.                      holdosmode
  5.                     )
  6.   (vl-load-com)
  7.   (setq holdosmode (getvar "OSMODE"))
  8.   (setvar "OSMODE" 0)
  9.   (if (= nil ss)
  10.     (setq ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
  11.   )
  12.   (setq        n1  0
  13.         ssl (sslength ss)
  14.   )
  15.   (while (< n1 (1- ssl))
  16.     (setq aobj1        (ssname ss n1)
  17.           aobj1        (vlax-ename->vla-object aobj1)
  18.           n2        (1+ n1)
  19.     )
  20.     (while (< n2 ssl)
  21.       (setq aobj2 (ssname ss n2)
  22.             aobj2 (vlax-ename->vla-object aobj2)
  23.             ipts  (vla-intersectwith aobj1 aobj2 acextendnone)
  24.             ipts  (vlax-variant-value ipts)
  25.       )
  26.       (if (> (vlax-safearray-get-u-bound ipts 1) 0)
  27.         (progn
  28.           (setq ipts (vlax-safearray->list ipts))
  29.           (while (> (length ipts) 0)
  30.             (setq pts  (cons (list (car ipts) (cadr ipts) (caddr ipts)) pts)
  31.                   ipts (cdddr ipts)
  32.             )
  33.           )
  34.         )
  35.       )
  36.       (setq n2 (1+ n2))
  37.     )
  38.     (setq n1 (1+ n1))
  39.   )
  40.   (setvar "OSMODE" holdosmode)
  41.   pts
  42. )
  43.   [/FONT]

子程序 點集排序:
http://www.xdcad.net/forum/showthread.php?s=&threadid=518698

還有點問題
1.只能把第一實體打斷
2.對於閉合多義線,會將起點處打斷(本意只將交點打斷)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-1-22 18:52:42 | 显示全部楼层
请问:你如何能确定用(entlast)得到的实体就是你的程序下一个要操作 (打断)的对象???线条的起点终点方向不同都会有影响的!!自己试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2006-1-23 08:58:11 | 显示全部楼层
再修改,用eachy版主新編的函數.
運行還是有點問題.最外層的循環好象只能運行一次,即i=-1時運行,i=0時就不執行BREAK命令了.請高手幫忙看看.


  1.   [FONT=courier new]
  2. (defun th-breakatintersec (ss           /           ename   i           j
  3.                            k           l           m           n           ptj
  4.                            ptlist  ptlisti ptlistmin2max   ssnamei
  5.                           )
  6.   (if (= ss nil)
  7.     (setq ss (ssget '((0 . "*LINE,ARC"))))
  8.   )                                        ; 如果選擇集不存在,重新選擇
  9.   (if (setq ptlist (th2-ssinters ss))        ; if1
  10.     (progn                                ; progn1
  11.       (setq i -1
  12.             j -1
  13.             m (1- (sslength ss))
  14.             n (1- (length ptlist))
  15.       )
  16.       (while (< i m)                        ; while ssname
  17.         (setq ssnamei (ssname ss (setq i (1+ i))))
  18.         (setq ptlisti '())
  19.         (while (< j n)                        ; while ptlist nth
  20.           (setq        ptj (nth (setq j (1+ j))
  21.                          ptlist
  22.                     )
  23.           )
  24.           (if (vlax-curve-getdistatpoint ssnamei ptj) ; if2
  25.             (setq ptlisti (cons ptj ptlisti))
  26.           )                                ; end if2
  27.         )                                ; end while ptlist nth
  28.         (if ptlisti                        ; if3
  29.           (progn                        ; progn2
  30.             (setq ptlistmin2max        (cadr (xdl-pts-sortonpl ssnamei ptlisti))
  31.                   k                -1
  32.                   l                (1- (length ptlistmin2max))
  33.             )
  34.             (while (< k l)                ; while break
  35.               (command "break"
  36.                        ssnamei
  37.                        (nth (setq k (1+ k))
  38.                             ptlistmin2max
  39.                        )
  40.                        "@"
  41.               )
  42.               (setq ssnamei (entlast))
  43.             )                                ; end while break
  44.           )                                ; end progn2
  45.         )                                ; end if3
  46.       )                                        ; end while ssname
  47.     )                                        ; end progn1
  48.   )                                        ; end if1

  49. )

  50.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-23 19:57:48 | 显示全部楼层
[php]最好把函数放到一起,形成完整的链,否则有点看不懂!
xdl-pts-sortonpl 函数未定义?!无法继续测试。[/php]

以下尚未完成,暂把所有函数放到一处!
  1. [FONT=courier new]
  2. (defun c:test ()
  3.   (CMDLA0)
  4.   (setvar "OSMODE" 0)
  5.   (if (setq ss (ssget '((0 . "*LINE,ARC"))))
  6.     (th-breakatintersec ss)
  7.   )
  8.   (CMDLA1)
  9. )

  10. ;;;交點處打斷
  11. (defun th-breakatintersec (ss           /           ename   i           j
  12.                            k           l           m           n           ptj
  13.                            ptlist  ptlisti ptlistmin2max   ssnamei
  14.                           )
  15.   (if (setq ptlist (th2-ssinters ss))
  16.     (progn
  17.       (setq i            -1
  18.             j            -1
  19.             m            (1- (sslength ss))
  20.             n            (1- (length ptlist))
  21.             ptlisti '()
  22.       )
  23.       (while (< i m)
  24.         (setq ssnamei (ssname ss (setq i (1+ i)))
  25.                                         ;ptlisti '()
  26.         )
  27.         (while (< j n)
  28.           (setq        ptj (nth (setq j (1+ j))
  29.                          ptlist
  30.                     )
  31.           )
  32.           (if (vlax-curve-getdistatpoint ssnamei ptj)
  33.             (setq ptlisti (cons ptj ptlisti))
  34.           )
  35.         )
  36.         (if ptlisti
  37.           (progn
  38.             (setq ptlistmin2max        (cadr (xdl-pts-sortonpl ssnamei ptlisti))
  39.                   k                -1
  40.                   l                (1- (length ptlistmin2max))
  41.             )
  42.             (while (< k l)
  43.               (command "break"
  44.                        ssnamei
  45.                        (nth (setq k (1+ k))
  46.                             ptlistmin2max
  47.                        )
  48.                        "@"
  49.               )
  50.               (setq ssnamei (entlast))
  51.             )
  52.           )
  53.         )
  54.       )
  55.     )
  56.   )
  57. )
  58. ;;;求交點集子程序
  59. (defun th2-ssinters (ss        / ssl pts aobj1        aobj2 n1 n2 ipts a n nn
  60.                      holdosmode)
  61.   (setq        n1  0
  62.         ssl (sslength ss)
  63.   )
  64.   (while (< n1 (1- ssl))
  65.     (setq aobj1        (ssname ss n1)
  66.           aobj1        (vlax-ename->vla-object aobj1)
  67.           n2        (1+ n1)
  68.     )
  69.     (while (< n2 ssl)
  70.       (setq aobj2 (ssname ss n2)
  71.             aobj2 (vlax-ename->vla-object aobj2)
  72.             ipts  (vla-intersectwith aobj1 aobj2 acextendnone)
  73.             ipts  (vlax-variant-value ipts)
  74.       )
  75.       (if (> (vlax-safearray-get-u-bound ipts 1) 0)
  76.         (progn
  77.           (setq ipts (vlax-safearray->list ipts))
  78.           (while (> (length ipts) 0)
  79.             (setq pts  (cons (list (car ipts) (cadr ipts) (caddr ipts)) pts)
  80.                   ipts (cdddr ipts)
  81.             )
  82.           )
  83.         )
  84.       )
  85.       (setq n2 (1+ n2))
  86.     )
  87.     (setq n1 (1+ n1))
  88.   )
  89.   pts
  90. )

  91. ;;点集按Pl起点到终点排序,返回(pline实体 排序后的点表)
  92. (defun xdl-pts-sortonpl        (pl pts)
  93.   (setq        pts (mapcar
  94.               '(lambda (x)
  95.                  (list (vlax-curve-getdistatpoint
  96.                          pl
  97.                          (vlax-curve-getclosestpointto pl x)
  98.                        )
  99.                        x
  100.                  )
  101.                )
  102.               pts
  103.             )
  104.         pts (vl-sort pts
  105.                      '(lambda (e1 e2)
  106.                         (< (car e1) (car e2))
  107.                       )
  108.             )
  109.   )
  110.   (list        pl
  111.         (mapcar
  112.           'cadr
  113.           pts
  114.         )
  115.   )
  116. )[/FONT]

测试结果太怪!
程序较长,一时看不懂!
还是偶的(xyp-break(ssget))比较方便,卖瓜了!呵呵……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 03:14 , Processed in 0.186240 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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