明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 392|回复: 6

[函数] 多段线首尾相连,选择后按顺序返回表

[复制链接]
发表于 2023-12-4 10:17 | 显示全部楼层 |阅读模式
写了一个框选很多条多段线,多段线首尾相连,然后选择起始点以后,返回按照前后顺序排列的表


试了很多图都能实现,就附件那个图出问题了,8条多段线,返回前6条,不知道问题出在哪,大佬们帮忙看看

代码:

  • ;保证所有线的方向一致
  • ;使用:(Zport (getpoint))
  • (defun Zport (firstpt / a )
  •   (setq ss (ssget '((8 . "主管"))) i 0 lenth 0);选择平面图
  •   (prompt "选择平面图")
  •   (repeat (sslength ss)
  •     (setq lyname (cdr (assoc 8 (entget (ssname ss i)))))
  •     (cond ((= "主管" lyname)
  •           (setq ss1 (cons (ssname ss i) ss1)))
  •     )
  •     (setq i (1+ i))
  •   );分别记录主管支管的图元名
  •   (setq i 0)
  •   (repeat (length ss1)
  •     (setq obj (vlax-ename->vla-object (nth i ss1)))
  •     (setq startpt (vlax-curve-getstartpoint obj));多段线第一个点
  •     (if (= (car firstpt) (car startpt))
  •       (if(= (car(cdr firstpt)) (car(cdr startpt)))
  •         (setq ssreal (list (nth i ss1)))
  •       )
  •     )
  •     (setq i (1+ i))
  •   );确定了第一条线
  •   (setq i 0)
  •   (repeat (length ss1)
  •     (setq obj (vlax-ename->vla-object (nth 0 ssreal)));排列合集!里面第一个元素(目前合集反着)
  •     (setq endpt (vlax-curve-getendpoint obj))
  •     (setq a 0)
  •       (repeat (length ss1)
  •       (setq obj1 (vlax-ename->vla-object (nth a ss1)));选择合集里面每一个元素
  •       (setq startpt1 (vlax-curve-getstartpoint obj1));选择合集里面每一个元素第一个点
  •       (if (= (car endpt) (car startpt1))
  •         (if (= (car(cdr endpt)) (car(cdr startpt1)))
  •           (setq ssreal (cons (nth a ss1) ssreal))
  •         )
  •       )
  •         (setq a (1+ a))
  •       )
  •   )
  •   (setq ssreal (reverse ssreal))
  • )

本帖子中包含更多资源

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

x
发表于 2023-12-4 14:34 | 显示全部楼层
实际的  vlax-curve-getstartpoint 并不都是理想的状态
 楼主| 发表于 2023-12-4 14:58 | 显示全部楼层
飞雪神光 发表于 2023-12-4 14:34
实际的  vlax-curve-getstartpoint 并不都是理想的状态

那这个思路就行不通了,能不能提点一下,应该按什么思路来写
发表于 2023-12-4 15:22 | 显示全部楼层
用起始和结束两个点来比对 每确定一个图元后 将该图元从选择集中删除
发表于 2023-12-4 21:17 | 显示全部楼层
本帖最后由 xyp1964 于 2023-12-4 21:22 编辑

  1. (defun c:tt ()
  2.   "多段线首尾相连,选择后按顺序返回表"
  3.   (if (setq ss (ssget '((8 . "主管"))))
  4.     (progn
  5.       (setq lst (ssnamex ss)
  6.             lst (vl-remove-if '(lambda (x) (/= (type (cadr x)) 'ENAME)) lst)
  7.             lst (mapcar 'cadr lst)
  8.             lst (mapcar '(lambda (x)(list x(vlax-curve-getStartPoint x)(vlax-curve-getEndPoint x)))lst)
  9.             s1 (car lst)
  10.             lst (cdr lst)
  11.             lst0 (list (list 0 s1))
  12.             p1 (last s1)
  13.             p2 (cadr s1)
  14.             i 0
  15.       )
  16.       (while (setq a (vl-remove-if-not '(lambda (x) (member p1 (cdr x))) lst))
  17.         (setq s2 (car a)
  18.               i (1+ i)
  19.               lst0 (cons (list i s2) lst0)
  20.               p1 (car (vl-remove p1 (cdr s2)))
  21.               lst (vl-remove s2 lst)
  22.         )
  23.       )
  24.       (setq i 0)
  25.       (while (setq a (vl-remove-if-not '(lambda (x) (member p2 (cdr x))) lst))
  26.         (setq s2 (car a)
  27.               i (1- i)
  28.               lst0 (cons (list i s2) lst0)
  29.               p2 (car (vl-remove p2 (cdr s2)))
  30.               lst (vl-remove s2 lst)
  31.         )
  32.       )
  33.       (setq lst (vl-sort lst0 '(lambda (x y) (< (car x) (car y)))))
  34.       (setq lst (mapcar 'caadr lst))
  35.       ;|(setq ptn (mapcar 'xyp-CurveMidPoint lst)
  36.             i 0
  37.             aa(mapcar '(lambda (x) (setq i (1+ i)) (xyp-Text 5 x (itoa i)))ptn)
  38.             l1 (xyp-Pline ptn nil)
  39.       )|;
  40.     )
  41.   )
  42.   (princ)
  43. )
 楼主| 发表于 2023-12-4 23:34 | 显示全部楼层
发表于 2023-12-5 00:13 | 显示全部楼层
本帖最后由 xyp1964 于 2023-12-5 00:14 编辑

  1. (defun c:tt ()
  2.   "多段线首尾相连,选择后按顺序返回表"
  3.   (if (setq ss (ssget '((8 . "主管"))))
  4.     (progn
  5.       (setq lst (vl-remove-if '(lambda (x) (/= (type (cadr x)) 'ENAME)) (ssnamex ss))
  6.             lst (mapcar 'cadr lst)
  7.             lst (mapcar '(lambda (x)(list x(vlax-curve-getStartPoint x)(vlax-curve-getEndPoint x)))lst)
  8.             s1 (car lst)
  9.             lst (cdr lst)
  10.             lst0 (list s1)
  11.             p1 (last s1)
  12.             p2 (cadr s1)
  13.       )
  14.       (while (setq a (vl-remove-if-not '(lambda (x) (member p1 (cdr x))) lst))
  15.         (setq s2 (car a)
  16.                lst0 (append lst0 (list s2) lst0)
  17.               p1 (car (vl-remove p1 (cdr s2)))
  18.               lst (vl-remove s2 lst)
  19.         )
  20.       )
  21.        (while (setq a (vl-remove-if-not '(lambda (x) (member p2 (cdr x))) lst))
  22.         (setq s2 (car a)
  23.                lst0 (cons s2 lst0)
  24.               p2 (car (vl-remove p2 (cdr s2)))
  25.               lst (vl-remove s2 lst)
  26.         )
  27.       )
  28.       (setq lst(mapcar 'car lst0))
  29.       (princ lst)
  30.      )
  31.   )
  32.   (princ)
  33. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 09:43 , Processed in 5.649131 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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