明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 886|回复: 4

[已解答] 请求功能完善线段之间增加线连接

[复制链接]
发表于 2015-7-30 10:48:21 | 显示全部楼层 |阅读模式
本帖最后由 434939575 于 2015-8-3 10:13 编辑

本程序想要达到最右边的连线效果,颜色不要那样子[em0]。自己只能弄出中间的效果。望大家多多帮助。谢谢!


  1. (defun  c:tt()

  2. (setq ss(ssget))
  3. (tmp_2 ss)
  4.   )

  5. ;;; 功能  水平线端点增线连线
  6. (defun tmp_2 (ss / one_pt:ab pt_jion sort_y<  two_pt:a two_pt:ab)
  7.   (setq lis_app nil)
  8.     (setq sort_y< (tmp_1 ss))
  9.      ;(setq pa (cadar sort_y<));第一点
  10.   (while (/= sort_y< nil)
  11.     (setq one_pt:ab (cdar sort_y<))
  12.     (setq two_pt:ab (reverse (cdadr sort_y<)))
  13.     (setq two_pt:a (car two_pt:ab))
  14.     (setq two_pt:a (cadr two_pt:ab))
  15.     (if  (/= pt_jion nil)
  16.       (progn
  17.   (if (/= two_pt:a nil)
  18.     (setq  lis> (list pt_jion
  19.          (car one_pt:ab)
  20.          (cadr one_pt:ab)
  21.          (car two_pt:ab)
  22.          (cadr two_pt:ab)
  23.          )
  24.     )
  25.     (setq lis> (list pt_jion (car one_pt:ab) (cadr one_pt:ab)))
  26.   ) ;if
  27.       ) ;progn <<
  28.       (progn (if (/= two_pt:a nil)
  29.          (setq lis> (list  (car one_pt:ab)
  30.         (cadr one_pt:ab)
  31.         (car two_pt:ab)
  32.         (cadr two_pt:ab)
  33.         )
  34.          )
  35.          (setq lis> (list (car one_pt:ab) (cadr one_pt:ab)))
  36.        ) ;if
  37.       ) ;progn <<
  38.     ) ;if
  39.     (setq sort_y< (cddr sort_y<))
  40.     (setq pt_jion two_pt:a)
  41.     (setq lis_app (append lis_app lis>))
  42.   )  ;while
  43.   (entmake_pline lis_app)
  44. )    ;end

  45. ;;;********************************
  46. (defun entmake_pline (lst)
  47.   (entmake (append (list '(0 . "LWPOLYLINE")
  48.        '(100 . "AcDbEntity")
  49.        '(100 . "AcDbPolyline")
  50.        (cons 90 (length lst))
  51.        )
  52.        (mapcar '(lambda (pt) (cons 10 pt)) lst)
  53.      )
  54.   )
  55. )


  56. ;;水平线-名字 2端点 从下到上排序
  57. (defun tmp_1 (ss       /
  58.                  e1       e2
  59.                  ii       na+pt>ab
  60.                  na+pt>ab+
  61.                  name    pt_lis
  62.                  pta     pta_x
  63.                  ptb     ptb_x
  64.                  vl_y<
  65.                 )
  66.   (setq na+pt>ab+ nil)
  67.   (setq ii 0)
  68.   (repeat (sslength ss)
  69.     (setq name (ssname ss ii)
  70.     ii   (1+ ii)
  71.     )
  72.     (setq pta (vlax-curve-getstartpoint name))
  73.     (setq ptb (vlax-curve-getendpoint name))
  74.     (setq pta_x (car pta))
  75.     (setq ptb_x (car ptb))
  76.     (if  (< pta_x ptb_x) ;水平线排序
  77.       (setq pt_lis (list pta ptb))
  78.       (setq pt_lis (list ptb pta))
  79.     )
  80.     (setq na+pt>ab (append (list name) pt_lis))
  81.     (setq na+pt>ab+ (append (list na+pt>ab) na+pt>ab+))
  82.   )  ;repeat
  83.   (setq
  84.     vl_y< (vl-sort
  85.       na+pt>ab+
  86.       (function (lambda (e1 e2) (< (cadadr e1) (cadadr e2))))
  87.     )
  88.   )
  89. )    ;end


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-7-30 13:29:55 | 显示全部楼层
没有仔细看你是怎么做到中间这个图的结果的,只是比较了中间和右边两个图的区别,要做到最右边的结果
个人认为可以在你目前能做出中间图的基础上按下边的方法进行处理
选出所有待处理线段(按y坐标从小至大排序)
(while 待处理线段表非空
  从第一条线段开始处理
  (如果该线段与第二条线段端点间距离过大,不进行连接处理,否则进行连接)
   (将处理过的线段从待处理线段中去掉)

点评

谢谢大师光临指导,我现在做法是按Y从下到上排序,2条为一组,现在我的想法是把每组每条长度比较,如果超过容差就,重新做个表、  发表于 2015-7-30 15:20
发表于 2015-7-30 13:38:59 | 显示全部楼层
处理到第3个的可能性很小。
发表于 2015-8-3 09:50:45 | 显示全部楼层
可不可以将直线按长度分组呢?
 楼主| 发表于 2015-8-3 10:11:52 | 显示全部楼层
77077 发表于 2015-8-3 09:50
可不可以将直线按长度分组呢?

分组倒是可以,我还处理不好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 15:50 , Processed in 0.305107 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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