明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 19400|回复: 42

共线直线并批量连接-------多段线连接-------Join

  [复制链接]
发表于 2012-6-8 09:16:40 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2012-7-4 12:01 编辑

自从AutoCAD使用"打断br"以来,就一直没有其逆操作Join。直到前几天,我试用2012版,发现Autocad已经翻然醒悟,Join出现了。
其实明经的网友们早就写了该程序,但写得复杂,我一直没有读懂。下面是我写的,写得很简单。经试试用,比2012版中的join要好用得多。
牛皮吹完了,不信你可以试一试。
;;;;;  共线直线并批量连接,相当于命令Join
  (defun C:JOIN (/ E E1 EN EN1 I N ssLine)
    ;;1  p1是否在p2 p3线上,返回0.0
    ;;p1 is a point
    ;;p2 and p3 are points that form a line segment
    ;;returns  1 is p1 is on one side
    ;;        -1 if on the other side
    ;;         0 if on the line
    (defun what_side (p1 p2 p3 / a dx dx1 dy dy1)
      (setq dx (- (car p3) (car p2))
     dy (- (cadr p3) (cadr p2))
     dx1 (- (car p1) (car p2))
     dy1 (- (cadr p1) (cadr p2))
      )     ;setq
      (setq a (- (* dx dy1) (* dy dx1))
     a (rtos a 2 6)
     a (atof a)
      )     ;setq
      (if (not (equal 0.0 a))
(setq a (/ a (abs a)))  ;setq
      )     ;if
      a
    )     ;defun what_side
    ;;2 p1是否在p2 p3之间
    (defun Between (p1 p2 p3)
      (equal (+ (distance p1 p2) (distance p1 p3))
      (distance p2 p3)
      0.01
      )
    )
    ;;3 点表排序
    (defun Sort_XYZ_pList (PLIST / p1 p2)
      (setq plist (vl-sort plist
      '(lambda (p1 p2)
         (cond ((< (car p1) (car p2)) T)
        ((and (= (car p1) (car p2))
       (< (cadr p1) (cadr p2))
         )
         T
        )
        ((and (= (car p1) (car p2))
       (= (cadr p1) (cadr p2))
       (< (caddr p1) (caddr p2))
         )
         T
        )
        (T nil)
         )
       )
    )
      )
    )
    ;;4 与一条直线相连的所有直线  
    (defun joinLine (e e1 / EN EN1 P1 P2 P3 P4 PLIST)
      (setq en (entget e))
      (setq p1 (LI_item 10 en))
      (setq p2 (LI_item 11 en))
      (setq en1 (entget e1))
      (setq p3 (LI_item 10 en1))
      (setq p4 (LI_item 11 en1))
      (if (and (equal (what_side p3 p1 p2) 0.0)
        (equal (what_side p4 p1 p2) 0.0)
        (or (Between p3 p1 p2) (Between p4 p1 p2));对pdf转换成的dwg,不要这句更妥
   )
(progn
   (setq Plist (Sort_XYZ_pList (list p1 p2 p3 p4)))
   (setq p1 (car Plist))
   (setq p2 (car (reverse Plist)))
   (setq en (subst (cons 10 p1) (assoc 10 en) en))
   (entmod (subst (cons 11 p2) (assoc 11 en) en))
   (command "_.erase" e1 "")
)
      )
    )
    ;;5 本程序主程序
    (setq ssLine (ssget '((0 . "LINE"))))
    (repeat (setq n (sslength ssLine))
      (if (and (setq e (ssname ssLine (setq n (1- n))))
        (setq en (entget e))
   )
(repeat (setq i n)
   (if (and (setq e1 (ssname ssLine (setq i (1- i))))
     (setq en1 (entget e1))
       )
     (joinLine e e1)
   )
)
      )
    )
    (princ "\n written by 自贡黄明儒 命令:Join")
    (princ)
  )

本帖子中包含更多资源

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

x

点评

只能合并顶点相互重合的直线,但是无法合并共线但是直线不相接的直线,盼望改进~~~  发表于 2012-6-17 12:58
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-6-12 11:33:07 | 显示全部楼层
(defun hh:ELg (/ PET SS1 ss)
  (setq ss (ssget '((0 . "ARC,*LINE"))))
  (setq pet (getvar "PEDITACCEPT"))
  (setvar "PEDITACCEPT" 1)
  (command "select" ss "")
  (while (setq ss1 (ssget "_p" '((0 . "ARC,*LINE"))))
    (command "_pedit" (ssname ss1 0) "j" ss1 "" "")
  )
  (setvar "PEDITACCEPT" pet)
  (princ "\n*   圆、线、弧已经转成多段线   *\n")
)
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-12 15:14:38 | 显示全部楼层
錯誤: no function definition: LI_ITEM    大神这是怎么回事啊~~~   求修改,我是2007
回复 支持 1 反对 0

使用道具 举报

发表于 2012-6-8 09:36:13 | 显示全部楼层
只对line直线起作用!是否考虑一下针对多段线也写一个?

点评

见15楼  发表于 2012-6-12 11:35
明经上早就有了多段线相连,而且写得非常经典。  发表于 2012-6-10 13:45
发表于 2012-6-8 09:52:39 | 显示全部楼层
支持啊 要是多段线也行就更好了
我相信楼主完全可以办到 顶楼主
发表于 2012-6-8 10:46:41 | 显示全部楼层
本帖最后由 【KAIXIN】 于 2012-6-8 10:51 编辑

缺少函数:LI_item

是提取对应组码值的通用函数?

点评

调试时没有注意到,现补上  发表于 2012-6-8 16:01
发表于 2012-6-8 12:23:30 来自手机 | 显示全部楼层
好程序,支持!……
 楼主| 发表于 2012-6-8 12:24:40 | 显示全部楼层
【KAIXIN】 发表于 2012-6-8 10:46
缺少函数:LI_item

是提取对应组码值的通用函数?

(Defun LI_item (N E) (CDR (Assoc N E)))
发表于 2012-6-8 13:15:15 来自手机 | 显示全部楼层
弧线行不???

点评

且听下回分解,呵呵  发表于 2012-6-11 10:46
发表于 2012-6-8 15:46:26 | 显示全部楼层
两条直线只能点选,不能框选呀!改为框选就好了!!!!!!

点评

可以一次框选,AutoCAD的join必须选两次  发表于 2012-6-8 15:59
发表于 2012-6-8 15:54:33 | 显示全部楼层
好程序,能不能添加框选?

点评

可以一次框选,AutoCAD的join必须选两次  发表于 2012-6-8 15:58
发表于 2012-6-8 17:01:22 | 显示全部楼层
xingyun300 发表于 2012-6-8 15:46
两条直线只能点选,不能框选呀!改为框选就好了!!!!!!

框选不会用,只能点选呀,能不能执行命令后就能框选呢?????

点评

ssget 难道不是框选?  发表于 2012-6-12 08:32
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 21:42 , Processed in 0.190671 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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