明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 自贡黄明儒

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

  [复制链接]
发表于 2012-6-11 09:18:51 | 显示全部楼层
楼主能否给出那个经典的多段线相接的程序或者链接?

点评

见15楼  发表于 2012-6-12 11:34
发表于 2012-6-11 13:34:50 | 显示全部楼层
沾楼主的光,请楼主不要介意,发个支持直线、圆弧、多义线的
  1. (defun c:tt ( / ss pda en fuzz val)
  2.   (vl-load-com)
  3.   (setq val (getvar "cmdecho"))
  4.   (setvar "cmdecho" 0)
  5.   (if (and (setq en (car (entsel "\n选择第一条线:")))
  6.            (wcmatch (cdr (assoc 0 (entget en))) "ARC,LINE,*POLYLINE")
  7.            (setq en (vlax-ename->vla-object en))
  8.            (/= "AcDb3dPolyline" (vla-get-ObjectName en))
  9.       )
  10.       (progn
  11.          (if (null (setq fuzz (getdist "\n输入模糊距离<0>: ")))
  12.              (setq fuzz 0)
  13.          )
  14.          (setq ss (ssadd))
  15.          (foreach item
  16.             (setq lst (ChainSelectFromAny en (+ fuzz 1e-6)))
  17.             (ssadd (vlax-vla-object->ename item) ss)
  18.          )
  19.          (mip:mark)
  20.          (vl-catch-all-apply
  21.              '(lambda ()
  22.                 (if (setq pda (getvar "PEDITACCEPT"))
  23.                     (progn
  24.                        (setq pda (getvar "peditaccept"))
  25.                        (setvar "peditaccept" 1)
  26.                        (command "_pedit" "_M" ss "" "_j" "_j" "_b" fuzz "")
  27.                        (setvar "peditaccept" pda)
  28.                     )
  29.                     (command "_pedit" "_M" ss "" "_Y" "_j" "_j" "_b" fuzz "")
  30.                 )
  31.               )
  32.          )
  33.          (setq lst (vl-remove-if 'vlax-erased-p lst))
  34.          (if (setq ss nil ss (mip:get-last-ss))
  35.              (progn
  36.                 (if lst (foreach item lst (ssadd (vlax-vla-object->ename item) ss)))
  37.                 (setq fuzz 0)
  38.                 (while (setq en (ssname ss fuzz))
  39.                     (if (/= (cdr (assoc 0 (entget en))) "LWPOLYLINE")
  40.                         (ssdel en ss)
  41.                         (setq fuzz (1+ fuzz))
  42.                     )
  43.                 )
  44.                 (sssetfirst ss ss)
  45.              )
  46.          )
  47.          (setq ss nil)
  48.       )
  49.       (princ "\n需选择LINE, ARC or Polyline")
  50.   )
  51.   (setvar "cmdecho" val)
  52.   (princ)
  53. )
  54. (defun ChainSelectFromAny (pt fuzz / chain_list couple ept line_list ln loop pda spt ss ln1 cycl)
  55.   (vl-load-com)
  56.   (cond
  57.     ((= (type pt) 'ENAME)
  58.         (setq ln (vlax-ename->vla-object pt)
  59.               pt nil
  60.         )
  61.     )
  62.     ((= (type pt) 'VLA-OBJECT)
  63.       (setq ln pt pt nil)
  64.     )
  65.     (t nil)
  66.   )
  67.   (if (setq ss (ssget "_I") ss nil ss (ssget "_X" '((0 . "ARC,LINE,*POLYLINE"))))
  68.       (progn
  69.          (if pt
  70.            (progn
  71.               (setq ln1
  72.                  (vla-addLine
  73.                      (if (and (zerop (vla-get-ActiveSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  74.                               (= :vlax-false (vla-get-MSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  75.                          )
  76.                          (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  77.                          (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  78.                      )
  79.                      (vlax-3D-point pt)
  80.                      (vlax-3D-point (mapcar '- pt '(1 1 0)))
  81.                  )
  82.               )
  83.               (setq ln ln1)
  84.            )
  85.          )
  86.          (setq spt (vlax-curve-getStartPoint ln)
  87.                ept (vlax-curve-getEndPoint ln)
  88.          )
  89.          (setq line_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  90.                chain_list nil
  91.                chain_list (cons ln chain_list)
  92.          )
  93.          (setq line_list (vl-remove-if '(lambda (x) (eq "AcDb3dPolyline" (vla-get-ObjectName x))) line_list))
  94.          (setq loop t cycl 0)
  95.          (while loop
  96.            (while
  97.               (setq couple
  98.                  (vl-remove-if-not
  99.                     (function (lambda (x)
  100.                                 (or (equal (vlax-curve-getStartPoint x) (vlax-curve-getStartPoint ln) fuzz)
  101.                                     (equal (vlax-curve-getStartPoint x) (vlax-curve-getEndPoint ln) fuzz)
  102.                                     (equal (vlax-curve-getEndPoint x) (vlax-curve-getStartPoint ln) fuzz)
  103.                                     (equal (vlax-curve-getEndPoint x) (vlax-curve-getEndPoint ln) fuzz)
  104.                                 )
  105.                               )
  106.                     )
  107.                     line_list
  108.                  )
  109.               )
  110.               (grtext -1 (strcat "正在连线,请稍等 - " (itoa (setq cycl (1+ cycl)))))
  111.               (if couple
  112.                  (progn
  113.                     (setq chain_list (append couple chain_list))
  114.                     (setq line_list (vl-remove ln line_list))
  115.                     (setq ln (car chain_list))
  116.                  )
  117.                  (setq line_list (cdr line_list))
  118.               )
  119.            )
  120.            (setq loop nil)
  121.          )
  122.       )
  123.   )
  124.   (setq chain_list (vl-remove ln1 chain_list))
  125.   (if (= (type ln1) 'VLA-OBJECT)
  126.       (vl-catch-all-apply 'vla-erase (list ln1))
  127.   )
  128.   (vl-cmdf "_.redraw")
  129.   chain_list
  130. )
  131. (defun mip:mark (/ val)
  132.   (setq val (getvar "cmdecho")) (setvar "cmdecho" 0)
  133.   (if (setq *mip:mark (entlast)) nil
  134.       (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
  135.              (setq *mip:mark (entlast))
  136.              (entdel *mip:mark)
  137.       )
  138.   )
  139.   (setvar "cmdecho" val)
  140.   (princ)
  141. )
  142. (defun mip:get-last-ss (/ ss tmp val)
  143.   (setq val (getvar "cmdecho"))
  144.   (setvar "cmdecho" 0)
  145.   (if *mip:mark
  146.      (progn
  147.         (setq ss (ssadd))
  148.         (while
  149.            (setq *mip:mark (entnext *mip:mark))
  150.            (ssadd *mip:mark ss)
  151.         )
  152.         (command "._select" ss "")
  153.         (setq tmp ss ss nil)
  154.      )
  155.      (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss.")
  156.   )
  157.   (setvar "cmdecho" val)
  158.   tmp
  159. )

点评

试用了,cad2006可以用,很好!  发表于 2012-6-12 14:05
你的程序与15楼功能差不多  发表于 2012-6-12 11:33
在cad2006中似乎不能运行  发表于 2012-6-11 20:54
发表于 2012-6-11 21:31:04 | 显示全部楼层
不可能,我用的也是cad2006
发表于 2012-6-12 06:09:40 来自手机 | 显示全部楼层
支持框选。
 楼主| 发表于 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

使用道具 举报

发表于 2012-6-12 11:48:51 | 显示全部楼层
自贡黄明儒 发表于 2012-6-12 11:33
(defun hh:ELg (/ PET SS1 ss)
  (setq ss (ssget '((0 . "ARC,*LINE"))))
  (setq pet (getvar "PEDITAC ...

谢谢指点!
发表于 2012-6-13 12:19:10 | 显示全部楼层
zyhandw 发表于 2012-6-11 17:48
谢谢指点!

(defun c:pj ( / peditaccept ss )
    (if (setq ss (ssget "_:L" '((0 . "ARC,LINE,LWPOLYLINE"))))
        (progn
            (setq peditaccept (getvar 'peditaccept))
            (setvar 'peditaccept 1)
            (command "_.pedit" "_M" ss "" "_J" "" "")
            (setvar 'peditaccept peditaccept)
        )
    )
    (princ)
)

点评

很不错!可不可以优化一下:如果合并前的线段共线,则合并后不在合并处产生顶点?即合并后的直线只有两个夹点  发表于 2012-9-4 13:41
很好!!!  发表于 2012-6-14 14:04

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 很给力!

查看全部评分

发表于 2012-6-13 14:38:44 | 显示全部楼层
1993063 发表于 2012-6-13 12:19
(defun c:pj ( / peditaccept ss )
    (if (setq ss (ssget "_:L" '((0 . "ARC,LINE,LWPOLYLINE"))))
...

谢谢回复,不过,试用并看了下程序,该程序好像只适合有共同点的线的连接吧
发表于 2012-6-14 10:43:45 | 显示全部楼层
在CAD2004中其实就有连接多段线的功能了。
PEDIT命令有一个“J”参数,还可以指定模糊距离和合并类型。如下:
输入模糊距离或 [合并类型(J)] <0.0000>:
输入合并类型 [延伸(E)/添加(A)/两者都(B)] <延伸>:

评分

参与人数 1明经币 +1 收起 理由
VBALISPER + 1 很给力!

查看全部评分

发表于 2012-6-17 12:59:24 | 显示全部楼层
程序很好,希望在写一个合并共线但是直线顶点不相接的直线的程序,谢谢啦~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 19:03 , Processed in 0.176562 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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