杜阳 发表于 2014-9-12 13:35:51

求助:根据z值连接多段线的代码

我写了一个简单的根据z值连接多段线的代码,思路:先根据选择的两条线的z值判断来确定是否连接,如果z值相同就实现连接并拟合连接后的线,如果z值不等,就重新选择,可是代码实现的是:z值相等连接并拟合成同一条线,z值不等时,两条线只连接,不拟合,也不是一条线 是三段不同的线。望各位老师给予帮助。
这段代码还有一个缺点就是,能不能根据两条线的相邻顶点进行连接,如果多段线的起始方向不合理,连接就不合理了。
学生在此感谢各位老师给予指导,谢谢。
一下是代码:
(Defun C:cjlj (/ Ss1 ss2 Pt1 Pt2 p1 p2)
(vl-load-com)
(Setvar "Cmdecho" 0)
    (Setq Pt1 (Getvar "Vsmin"))
    (Setq Pt2 (Getvar "Vsmax"))
    (Setq Ss1 (Entsel "\n 选择1线:"))
    (Setq Ss2 (Entsel "\n 选择2线:"))
    (Setq p1 (vlax-curve-getendpoint (car ss1)))
    (Setq p2 (vlax-curve-getstartpoint (car ss2)))
    (setq Z1(car(assoc 38 (entget (car ss1)))))
    (setq Z2(car(assoc 38 (entget (car ss2)))))
(if (= z1 z2)
(progn
(Vl-Cmdf "line" p1 p2 "")
(Vl-Cmdf ".Pedit" Ss1 "Yes" "J" "C" Pt1 Pt2 "" "" )
(Vl-Cmdf ".Pedit" Ss1 "Yes" "s" Pt1 Pt2 "" "")
)
)
(Setvar "Cmdecho" 1)
(Princ)
)

自贡黄明儒 发表于 2014-9-12 13:48:54

写好这个代码不容易,我至今还是用overkill

杜阳 发表于 2014-9-12 14:00:45

自贡黄明儒 发表于 2014-9-12 13:48 static/image/common/back.gif
写好这个代码不容易,我至今还是用overkill

黄老师能不能你给看看代码 条件判断是不是不对啊

自贡黄明儒 发表于 2014-9-12 14:17:29

本帖最后由 自贡黄明儒 于 2014-9-12 14:37 编辑

杜阳 发表于 2014-9-12 14:00 static/image/common/back.gif
黄老师能不能你给看看代码 条件判断是不是不对啊
;;164.29 [功能] 连接线、弧成多段线
;;(HH:JionToPolyline)
(defun HH:JionToPolyline (/ PET SS)
(setq pet (getvar "PEDITACCEPT"))
(setvar "PEDITACCEPT" 1)
(while (setq ss (ssget '((0 . "ARC,*LINE"))))
    (command "_.pedit" (ssname ss 0) "j" ss "" "")
)
(setvar "PEDITACCEPT" pet)
(princ)
)

;;假如我要写的话,可能会这样
(Defun C:cjlj (/ PET SS1 SS2 Z1)
(vl-load-com)
(setq pet (getvar "PEDITACCEPT"))
(setvar "PEDITACCEPT" 1)
(Setq Ss1 (Entsel "\n 选择1线:"))
(setq Z1 (car (assoc 38 (entget (car ss1)))))
(Setq Ss2 (ssget (list '(0 . "ARC,*LINE") (cons 38 Z1))))
(command "_.pedit" (ssname ss2 0) "j" ss2 "" "")
(setvar "PEDITACCEPT" pet)
(princ)
)

杜阳 发表于 2014-9-12 22:12:18

自贡黄明儒 发表于 2014-9-12 14:17 static/image/common/back.gif
;;164.29 [功能] 连接线、弧成多段线
;;(HH:JionToPolyline)
(defun HH:JionToPolyline (/ PET SS)


谢谢黄老师百忙之中给予解答,可是我实验 光有选线其他的就不执行了

gzxl 发表于 2014-9-13 02:04:53

这个单靠Z值相等来判断,我觉得不合理,如果两条线相隔较远,那是不是会出错?
这里提供以前找到的,现在不知道是那个高手编的,仅供参考;;智能连接线
(defun c:BJ_CurveJoin ( / ss pda en fuzz val)
(vl-load-com)
(setq val (getvar "cmdecho"))
(setvar "cmdecho" 0)
(princ (strcat "\n请选择线"))
(if (and (setq en (car (entsel "\n选择第一条线:")))
         (wcmatch (cdr (assoc 0 (entget en))) "ARC,LINE,*POLYLINE")
         (setq en (vlax-ename->vla-object en))
         (/= "AcDb3dPolyline" (vla-get-ObjectName en))
      )
      (progn
         (if (null (setq fuzz (getdist "\n输入模糊距离<0>: ")))
             (setq fuzz 0)
         )
         (setq ss (ssadd)) ;创建新的选择集
         (foreach item
            (setq lst (ChainSelectFromAny en (+ fuzz 1e-6)))
            (ssadd (vlax-vla-object->ename item) ss)
         )
         (mip:mark)
         (vl-catch-all-apply
             '(lambda ()
                (if (setq pda (getvar "PEDITACCEPT"))
                  (progn
                     (setq pda (getvar "peditaccept"))
                     (setvar "peditaccept" 1)
                     (command "_pedit" "_M" ss "" "_j" "_j" "_b" fuzz "")
                     (setvar "peditaccept" pda)
                  )
                  (command "_pedit" "_M" ss "" "_Y" "_j" "_j" "_b" fuzz "")
                )
            )
         )
         (setq lst (vl-remove-if 'vlax-erased-p lst))
         (if (setq ss nil ss (mip:get-last-ss))
             (progn
                (if lst (foreach item lst (ssadd (vlax-vla-object->ename item) ss)))
                (setq fuzz 0)
                (while (setq en (ssname ss fuzz))
                  (if (/= (cdr (assoc 0 (entget en))) "LWPOLYLINE")
                        (ssdel en ss)
                        (setq fuzz (1+ fuzz))
                  )
                )
                (sssetfirst ss ss)
             )
         )
         (setq ss nil)
      )
      (princ "\n需选择LINE, ARC or Polyline")
)
(setvar "cmdecho" val)
(princ)
)
(defun ChainSelectFromAny (pt fuzz / chain_list couple ept line_list ln loop pda spt ss ln1 cycl)
(vl-load-com)
(cond
    ((= (type pt) 'ENAME)
      (setq ln (vlax-ename->vla-object pt)
            pt nil
      )
    )
    ((= (type pt) 'VLA-OBJECT)
      (setq ln pt pt nil)
    )
    (t nil)
)
(if (setq ss (ssget "_I") ss nil ss (ssget "_X" '((0 . "ARC,LINE,*POLYLINE"))))
      (progn
         (if pt
         (progn
            (setq ln1
               (vla-addLine
                     (if (and (zerop (vla-get-ActiveSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
                              (= :vlax-false (vla-get-MSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
                         )
                         (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
                         (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
                     )
                     (vlax-3D-point pt)
                     (vlax-3D-point (mapcar '- pt '(1 1 0)))
               )
            )
            (setq ln ln1)
         )
         )
         (setq spt (vlax-curve-getStartPoint ln)
               ept (vlax-curve-getEndPoint ln)
         )
         (setq line_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
               chain_list nil
               chain_list (cons ln chain_list)
         )
         (setq line_list (vl-remove-if '(lambda (x) (eq "AcDb3dPolyline" (vla-get-ObjectName x))) line_list))
         (setq loop t cycl 0)
         (while loop
         (while
            (setq couple
               (vl-remove-if-not
                  (function (lambda (x)
                              (or (equal (vlax-curve-getStartPoint x) (vlax-curve-getStartPoint ln) fuzz)
                                    (equal (vlax-curve-getStartPoint x) (vlax-curve-getEndPoint ln) fuzz)
                                    (equal (vlax-curve-getEndPoint x) (vlax-curve-getStartPoint ln) fuzz)
                                    (equal (vlax-curve-getEndPoint x) (vlax-curve-getEndPoint ln) fuzz)
                              )
                              )
                  )
                  line_list
               )
            )
            (grtext -1 (strcat "正在连线,请稍等 - " (itoa (setq cycl (1+ cycl)))))
            (if couple
               (progn
                  (setq chain_list (append couple chain_list))
                  (setq line_list (vl-remove ln line_list))
                  (setq ln (car chain_list))
               )
               (setq line_list (cdr line_list))
            )
         )
         (setq loop nil)
         )
      )
)
(setq chain_list (vl-remove ln1 chain_list))
(if (= (type ln1) 'VLA-OBJECT)
      (vl-catch-all-apply 'vla-erase (list ln1))
)
(vl-cmdf "_.redraw")
chain_list
)
(defun mip:mark (/ val)
(setq val (getvar "cmdecho")) (setvar "cmdecho" 0)
(if (setq *mip:mark (entlast)) nil
      (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
             (setq *mip:mark (entlast))
             (entdel *mip:mark)
      )
)
(setvar "cmdecho" val)
(princ)
)
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))
(setvar "cmdecho" 0)
(if *mip:mark
   (progn
      (setq ss (ssadd))
      (while
         (setq *mip:mark (entnext *mip:mark))
         (ssadd *mip:mark ss)
      )
      (command "._select" ss "")
      (setq tmp ss ss nil)
   )
   (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss.")
)
(setvar "cmdecho" val)
tmp
)

杜阳 发表于 2014-9-13 10:45:37

gzxl 发表于 2014-9-13 02:04 static/image/common/back.gif
这个单靠Z值相等来判断,我觉得不合理,如果两条线相隔较远,那是不是会出错?
这里提供以前找到的,现在不 ...

谢谢 gzxl老师的指导,使用了一下没有实现任何结果我再学习一下吧谢谢老师

xyp1964 发表于 2014-9-13 14:14:57


杜阳 发表于 2014-9-13 15:44:06

xyp1964 发表于 2014-9-13 14:14 static/image/common/back.gif


呵呵院长你可来了 呵呵把你的代码发出来学习吧   就是你平常用的代码就行

香田里浪人 发表于 2014-9-13 17:19:03

gzxl 发表于 2014-9-13 02:04 static/image/common/back.gif
这个单靠Z值相等来判断,我觉得不合理,如果两条线相隔较远,那是不是会出错?
这里提供以前找到的,现在不 ...

这个确实很实用。
页: [1] 2
查看完整版本: 求助:根据z值连接多段线的代码