明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3101|回复: 12

[讨论] 悬挂点 并智能连线

[复制链接]
发表于 2019-3-18 12:30 | 显示全部楼层 |阅读模式
本帖最后由 chenjieq1990 于 2019-3-18 14:32 编辑

对论坛上的悬挂点程序进行了一定的修改,思路是这样的,源程序是在悬挂点处增加一个圆圈,本代码通过比较悬挂点之间的距离差,将距离差小于一定值的两个悬挂点通过直线连接,但是运行时候一直出错,看谁能帮忙看下。

悬挂点参考         http://bbs.mjtd.com/forum.php?mo ... D5%CF%DF&page=1


  1. ;;悬空线检查
  2. (defun c:tt (/ expert i lis n n100 nn pp pt1 pt2 pts rr ss ssd sslast)
  3.   (vl-Load-COM)
  4.   (setq ssd(ssget'((0 . "arc,*line,ELLIPSE")(-4 . "<not")(-4 . "&")(70 . 1)(-4 . "not>"))));过滤闭合多段线
  5.   (or rrno1* (setq rrno1* 10.))
  6.   (setq pt_cj(getpoint(strcat "\n输入点:")))
  7.   (setq sslast (ssadd)
  8.         sslast1 (ssadd)
  9.    
  10.   ss(try-ss2EnList ssd))
  11.   (princ "\n")

  12.   ;把所有图元的端点存入表
  13.   (foreach x ss (setq lis(cons(vlax-curve-getStartPoint x)(cons(vlax-curve-getEndPoint x)lis))));多段线可能是重点
  14.   (setq expert(getvar "expert" )n(/(length lis)100)i 0);n为端点个数除以100
  15.   (setvar "expert" 1);禁止提示重生成
  16.   (setvar "CMDECHO"0)
  17. ;;;;====================================================================找出孤立点,pts,显示进度
  18.   (command "UNDO" "BE")
  19.   (vl-cmdf "qaflags" 1 ".explode" ssd "" "qaflags" 0);炸开,当qaflags=1时,选择集都被炸开,=0时,只能炸开第一个?????

  20.   (foreach pt lis
  21.     (setq
  22.       pp lis   ;端点点表
  23.       n100(if (> n 0)(rem (setq i(1+ i)) n)1);           计算进度用参数
  24.       pt1 (mapcar '+ pt '(0.001 0.001));放大显示
  25.       pt2 (mapcar '- pt '(0.001 0.001))
  26.       );放大显示
  27.     (command "zoom" "w" "_non"pt1 "_non"pt2)
  28.     (setq ssd (ssget "C" pt pt))
  29.     (if (= 1 (sslength ssd))(setq pts(cons pt pts)));符合入点表,排除封闭的点,将孤立的点存入pts;;;===========
  30.     (if (and(> n 2)(= n100 0))(princ(strcat "\r当前进度【"(rtos(* 100(/ i (length lis)1.0))2 0)"%】")));;;进度显示
  31.     );foreach
  32.   (command "UNDO""end" "U" "UNDO" "be")
  33.   ;;;==================================================================找出孤立点,pts,显示进度

  34. ;  (foreach x pts   
  35. ;      (ssadd (entmakex (list '(0 . "LINE") (cons 10 x) (cons 11 pt_cj) (cons 62 1) )) sslast)
  36. ;    );遍历孤立点画圆,并将圆存入sslast



  37.   ;;===================================================================================连线悬挂点
  38. (setq ss1 (sslength pts)
  39.       i1 -1
  40.       objl '()
  41. )

  42.   (repeat (- ss1 1)
  43.     (setq aobj1 (nth(setq i1(1+ i1)) pts)
  44.      mm(- ss1 i1 1)
  45.      objl(cdr (member (nth i1 pts) pts))
  46.      nb -1
  47.     )
  48.     (if(objl)
  49.      (repeat mm
  50.        (setq aobj2 (nth(setq nb(1+ nb)) obj1))
  51.        (if (< (distance(aobj1 aobj2)) 10)
  52.          (ssadd (entmakex (list '(0 . "LINE") (cons 10 (nth i1 pts)) (cons 11 (nth nb obj1)) (cons 62 1) )) sslast1)
  53.          );if <
  54.        );repeat mm
  55.      );if obj1
  56.     );repeat ss1
  57. ;;======================================================================================连线悬挂点
  58.   (setvar "expert" expert)
  59.   (command "UNDO""end")(setvar "CMDECHO"1)
  60.   (sssetfirst nil sslast);;记住这两句即可(sssetfirst nil nil)取消所有亮显(sssetfirst nil ss)亮显ss
  61.   (sssetfirst nil sslast1)
  62.   (princ (strcat "\n找到悬空点"(itoa (length pts))"个。"))
  63.   (prin1)
  64.   )
  65. ;;;;;======================================================自定义函数,选择集转为图元表
  66. ;;参数:选择集;返回,图名表
  67. (defun try-ss2EnList(ss / a en lst)
  68.   (setq a -1)
  69.   (if ss
  70.     (while
  71.       (setq en(ssname ss(setq a(1+ a))))
  72.       (setq lst(cons en lst))
  73.     )
  74.   )
  75.   (reverse lst)

  76. )
  77. (prin1)



发表于 2019-3-18 22:21 | 显示全部楼层
  1. ;; 悬空线检查
  2. (defun c:tt (/ ptn pts)
  3.   (if (setq ss (ssget '((0 . "arc,*line,ELLIPSE"))))
  4.     (progn
  5.       (setq ss1 (ssadd))
  6.       (foreach x (xyp-Ss2List ss)
  7.         (setq p1 (vlax-curve-getStartPoint x)
  8.               p2 (vlax-curve-getEndPoint x)
  9.         )
  10.         (if (not (equal p1 p2))
  11.           (setq ptn (append (list p1 p2) ptn))
  12.         )
  13.       )
  14.       (foreach pt ptn
  15.         (setq p1 (mapcar '+ pt '(1 1))
  16.               p2 (mapcar '- pt '(1 1))
  17.         )
  18.         (command "zoom" "w" "_non" p1 "_non" p2)
  19.         (if (= 1 (sslength (ssget "C" pt pt)))
  20.           (setq pts (cons pt pts))
  21.         )
  22.       )
  23.       (setq nn (length pts))
  24.       (while (setq pt (car pts))
  25.         (setq pts (cdr pts))
  26.         (foreach p1 pts
  27.           (if (< (distance pt p1) 10)
  28.             (ssadd (entmakex
  29.                      (list '(0 . "LINE") (cons 10 pt) (cons 11 p1) (cons 62 1))
  30.                    )
  31.                    ss1
  32.             )
  33.           )
  34.         )
  35.       )
  36.       (command "zoom" "e")
  37.       (if ss1(sssetfirst nil ss1))
  38.       (princ (strcat "\n找到悬空点" (itoa nn) "个。"))
  39.     )
  40.   )
  41.   (princ)
  42. )
 楼主| 发表于 2019-3-18 14:33 | 显示全部楼层
这段代码运行出错


  1. (setq ss1 (sslength pts)
  2.       i1 -1
  3.       objl '()
  4. )

  5.   (repeat (- ss1 1)
  6.     (setq aobj1 (nth(setq i1(1+ i1)) pts)
  7.      mm(- ss1 i1 1)
  8.      objl(cdr (member (nth i1 pts) pts))
  9.      nb -1
  10.     )
  11.     (if(objl)
  12.      (repeat mm
  13.        (setq aobj2 (nth(setq nb(1+ nb)) obj1))
  14.        (if (< (distance(aobj1 aobj2)) 10)
  15.          (ssadd (entmakex (list '(0 . "LINE") (cons 10 (nth i1 pts)) (cons 11 (nth nb obj1)) (cons 62 1) )) sslast1)
  16.          );if <
  17.        );repeat mm
  18.      );if obj1
  19.     );repeat ss1
发表于 2021-2-28 19:42 | 显示全部楼层
cawy113116 发表于 2021-2-28 18:16
这个函数(xyp-Ss2List)可以分享一下吗?

  1. (defun xyp-Ss2List (ss / i s1 lst)
  2.   (setq i -1)
  3.   (while (setq s1 (ssname ss (setq i (1+ i))))
  4.     (setq lst (cons s1 lst))
  5.   )
  6.   lst
  7. )
 楼主| 发表于 2019-3-19 08:09 | 显示全部楼层

谢谢,优化了一下,程序简练了很多,也快了很多,谢谢,请教下,foreach是比while快的吗?

点评

原先的错误一大堆,根本就不能用!  发表于 2019-3-19 14:00
发表于 2019-3-19 19:11 | 显示全部楼层
chenjieq1990 发表于 2019-3-19 08:09
谢谢,优化了一下,程序简练了很多,也快了很多,谢谢,请教下,foreach是比while快的吗?

怎么用不起来,请问怎么用啊
发表于 2019-3-19 19:12 | 显示全部楼层
chenjieq1990 发表于 2019-3-19 08:09
谢谢,优化了一下,程序简练了很多,也快了很多,谢谢,请教下,foreach是比while快的吗?

怎么用不起来,请问怎么用啊
发表于 2019-6-19 19:06 来自手机 | 显示全部楼层
收藏了,谢谢分享!!!!
发表于 2019-12-23 11:43 | 显示全部楼层
您好,看了您的一些帖子,目前不封闭图形填充您做出插件了吗。可以用吗?
发表于 2021-2-28 18:05 | 显示全部楼层
学习学习,最近一直想学习拓扑相关的
发表于 2021-2-28 18:16 | 显示全部楼层
这个函数(xyp-Ss2List)可以分享一下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-30 17:47 , Processed in 0.399029 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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