DWG Destroyer 发表于 2022-7-6 12:16:28

在边缘上打开多段线

当通过双击选择闭合多段线时,多段线编辑对话框将接合。如果选择“打开”选项,多段线将通过删除其中一条线而打开,看起来是随机的。但是,如果以某种方式可以控制要擦除的行的选择呢?如果我可以双击一条多段线,一旦选择“打开”,多段线就会在我双击的线上打开,这将证明是最有用的。是一种可能性还是只是一种玩笑?

NBC 发表于 2022-7-6 12:22:01

我无法解决你的问题;但我只是想说,当打开一个闭合的pline时,“擦除一行”并不是随机的。它将始终在普林线关闭的地方打开。

Lee Mac 发表于 2022-7-6 12:25:29

作为你正在做的事情的捷径:
 

(defun c:PlOpen (/ ent Obj)
(vl-load-com)
(if (and (setq ent (entsel "\nSelect LWPolyline: "))
          (eq "AcDbPolyline"
            (vla-get-ObjectName
            (setq Obj (vlax-ename->vla-object (car ent))))))
   (vla-put-Closed Obj :vlax-false))
(princ))

Lee Mac 发表于 2022-7-6 12:27:17

试试这个Mr Destroyer,它只适用于没有弧和有趣东西的多段线。
 

(defun c:PlOpen (/ ent Obj pPar pCrds)
(vl-load-com)
(if (and (setq ent (entsel "\nSelect LWPolyline: "))
          (eq "AcDbPolyline"
            (vla-get-ObjectName
            (setq Obj (vlax-ename->vla-object (car ent))))))
   (if (eq :vlax-true (vla-get-Closed Obj))         
   (progn
       (setq pPar
         (1+
         (fix
             (vlax-curve-getParamatPoint Obj
               (vlax-curve-getClosestPointto Obj (cadr ent))))))
       (setq pCrds
         (apply 'append
         (remake-list
             (vlax-list->2D-point
               (vlax-safearray->list
               (vlax-variant-value
                   (vla-get-Coordinates Obj)))) pPar)))
       (vla-put-Coordinates Obj
         (vlax-make-variant
         (vlax-safearray-fill
             (vlax-make-safearray
               vlax-vbdouble
               (cons 0 (1- (length pCrds)))) pCrds)))
       (vla-put-closed Obj :vlax-false))
   (princ "\n** LWPolyline not Closed **"))
   (princ "\n** Object Not an LWPolyline **"))
(princ))

(defun vlax-list->2D-point (lst)
(if lst
   (cons (list (car lst) (cadr lst))
         (vlax-list->2D-point (cddr lst)))))

(defun Remake-List (lst i / j k)
(setq j -1 k -1)
(append
   (vl-remove-if
   (function
       (lambda (x)
         (< (setq j (1+ j)) i))) lst)
   (vl-remove-if
   (function
       (lambda (x)
         (>= (setq k (1+ k)) i))) lst)))

DWG Destroyer 发表于 2022-7-6 12:30:52

嘿,不错!但是,有没有办法将其合并到“编辑多段线”命令中的选项集合中?以及打开/连接/宽度等。?如果我只需双击一条多段线就能得到所有这些,那就太棒了。

Lee Mac 发表于 2022-7-6 12:35:19

 
哈哈,你会很幸运的。。。我怀疑您是否可以像这样编辑AutoCAD命令…:眨眼:

Lee Mac 发表于 2022-7-6 12:37:57

以下是允许多段线中的圆弧的升级:
 
 

;; Open Polylines at Selected Edge
;; Copyright © 2009 Lee McDonnell ~ 20.08.2009

(defun c:PlOpen (/ ent Obj pPar pCrds lst Blg i)
(vl-load-com)
(setq doc (vla-get-ActiveDocument
             (vlax-get-acad-object)))
(if (and (setq ent (entsel "\nSelect LWPolyline: "))
          (eq "AcDbPolyline"
            (vla-get-ObjectName
            (setq Obj (vlax-ename->vla-object (car ent))))))
   (if (eq :vlax-true (vla-get-Closed Obj))         
   (progn
       (vla-StartUndoMark doc)
       (setq pPar
         (1+
         (fix
             (vlax-curve-getParamatPoint Obj
               (vlax-curve-getClosestPointto Obj (cadr ent))))))
       (setq pCrds
         (vlax-list->2D-point
         (vlax-safearray->list
             (vlax-variant-value
               (vla-get-Coordinates Obj))))
             lst (list (fix (vlax-curve-getStartParam Obj))) i -1)
       (repeat (1- (length pCrds))
         (setq lst (cons (1+ (car lst)) lst)))
       (setq Blg
         (remake-list
         (mapcar
             (function
               (lambda (x)
               (vla-getBulge Obj x)))
             (reverse lst))
         pPar))
       (vla-put-Coordinates Obj
         (vlax-make-variant
         (vlax-safearray-fill
             (vlax-make-safearray
               vlax-vbdouble (cons 0 (1- (* (length pCrds) 2))))
             (apply 'append (remake-list pCrds pPar)))))
       (mapcar
         (function
         (lambda (x)
             (vla-setBulge Obj
               (setq i (1+ i)) x))) Blg)
       (vla-put-closed Obj :vlax-false)
       (vla-EndUndoMark doc))      
   (princ "\n** LWPolyline not Closed **"))
   (princ "\n** Object Not an LWPolyline **"))
(princ))

(defun vlax-list->2D-point (lst)
(if lst
   (cons (list (car lst) (cadr lst))
         (vlax-list->2D-point (cddr lst)))))

(defun Remake-List (lst i / j k)
(setq j -1 k -1)
(append
   (vl-remove-if
   (function
       (lambda (x)
         (< (setq j (1+ j)) i))) lst)
   (vl-remove-if
   (function
       (lambda (x)
         (>= (setq k (1+ k)) i))) lst)))

alanjt 发表于 2022-7-6 12:38:42

相当圆滑

DWG Destroyer 发表于 2022-7-6 12:42:07

啊,不用担心。嘿,它甚至记得当你再次关闭它时,删除了什么类型的线!最棒的东西,谢谢!

Lee Mac 发表于 2022-7-6 12:46:45

 
谢谢伙计
 
 
是-由于在特定顶点设置了凸出值:wink:
页: [1] 2
查看完整版本: 在边缘上打开多段线