woodman78 发表于 2022-7-5 16:38:21

在内部或外部偏移多段线

大家好,
 
我发现这段代码在内部偏移了一条多段线。这似乎表明,通过将符号从-改为+可以从内部切换到外部。
 
我已经花了几个小时尝试不同的事情,但无法让它发挥作用。
我试图将其集成到一个更大的lisp中,该lisp将偏移多段线outisde,然后在该多段线上拾取一个点,并将该点与原始多段线一起馈送到Extrim中,以切断围栏外的所有内容。
 
有人能帮忙把它搬到外面去吗?
此外,代码不会在任何地方声明“选择对象”。这显然不是香草Lisp程序。是否可以解释所选对象在代码中的位置?
 
提前谢谢。
 
;;;Eugeni Elpanov
;;; Arguments
;;;         lw - ename or vla object of polyline
;;; Return
;;;   t - clockwise
;;;    nil - counter-clockwise
(defun lib:pline_clockwise ( lw/ LST MAXP MINP)
(if (= (type lw) 'ENAME)
   (setq lw (vlax-ename->vla-object lw)))
(vla-GetBoundingBox lw 'MinP 'MaxP)
(setq
minp(vlax-safearray->list minp)
MaxP(vlax-safearray->list MaxP)
lst(mapcar(function(lambda(x)
(vlax-curve-getParamAtPoint lw
(vlax-curve-getClosestPointTo lw x))))
(list minp(list(car minp)(cadr MaxP))
MaxP(list(car MaxP)(cadr minp)))))
(if(or
(<=(car lst)(cadr lst)(caddr lst)(cadddr lst))
(<=(cadr lst)(caddr lst)(cadddr lst)(car lst))
(<=(caddr lst)(cadddr lst)(car lst)(cadr lst))
(<=(cadddr lst)(car lst)(cadr lst)(caddr lst))) t nil))

(defun C:OFF40 ( )
(vl-load-com)
(if
(and
(setq en (car(entsel)))
(wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE")
(or (initget 7) t)
(setq d (getdist "\nOffset distanse: "))
(setq en (vlax-ename->vla-object en))
(vlax-write-enabled-p en)
(vlax-method-applicable-p en 'Offset)
(if (lib:pline_clockwise en)
   d
   (setq d (- 0 d));_ Plus or minus To change a sign
   )
(setq i 1)
(repeat 40
   (vl-catch-all-apply
   '(lambda()
      (vla-offset en (* i d))
      (setq i (1+ i))
      )
   )
   )
)
(princ " Offset OK")
(princ "Not a polyline or on locket layer")
)
(princ)
)
 
我在这里找到了代码:
http://forums.augi.com/showthread.php?83935-创建列表多段线顶点
 
 
这是输出:
LWPOLYLINE3DC1AcDbEntity0Model0AcDbPolyline310.00.00.0(166.615 343.075)0.00
 
它给了coord,但还有一大堆我不想要的东西。我怎样才能隔离它?

woodman78 发表于 2022-7-5 16:42:15

试试看。对不起,我英语不好。
plpoint。lsp

woodman78 发表于 2022-7-5 16:45:49

谢谢1985,但我得到的结果是:
 
(defun c:plpoint ( )
(SETQ LP1 1)
(WHILE LP1
(PROMPT "\nSelect polyline boundary: ")
(SETQ PSS (SSGET ":S" '((0 . "LWPOLYLINE"))))
(IF (/= PSS NIL) (SETQ LP1 NIL) (PROMPT "\nNO POLYLINE SELECTED, TRY AGAIN. "))
);END LP1
(SETQ PEN (SSNAME PSS 0))
(SETQ PENL (ENTGET PEN))
(SETQ PPL (LIST))
(FOREACH N PENL
(PROGN
(SETQ PPA (CAR N))
(SETQ PPV (CDR N))
(princ PPV)
;(IF (= PPA 10) (SETQ PPL (APPEND PPL (LIST PPV))))
));END N
;(SETQ SHSS (SSGET "WP" PPL '((0 . "INSERT") (8 . "L-Irr-Sprayhead"))))
)
 
我只需要把它丢给coords。
 
我希望你能理解我的英语。

BIGAL 发表于 2022-7-5 16:49:20

PPV变量只包含一个点的坐标,即直线的起点。运行此选项。在命令提示下,显示特征PRINC的双组坐标。
plpoint。lsp

woodman78 发表于 2022-7-5 16:53:22

(166.615 343.075 0.0)(166.615 343.075 0.0)

1958 发表于 2022-7-5 16:55:52

谢谢1958年
 
如果我试着使用下面的坐标,它不会起作用。
 
(defun c:plpoint (/)
(vl-load-com)
(setq LP1 1)
(while LP1
(prompt "\nSelect polyline boundary: ")
(setq PSS (ssget "_:S" '((0 . "LWPOLYLINE"))))
(if (/= PSS nil)
(setq LP1 nil)
(prompt "\nNO POLYLINE SELECTED, TRY AGAIN. ")
)
)
(setq PPV (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname PSS 0))))
(vl-princ-to-string PPV)
)
 
我希望能够将坐标传递给另一个lisp。
 
这能做到吗?

woodman78 发表于 2022-7-5 16:58:07

如果只是寻找第一个顶点,也可以使用:
 
(defun c:plpoint (/)
(vl-load-com)
(setq LP1 1)
(while LP1
(prompt "\nSelect polyline boundary: ")
(setq PSS (ssget "_:S" '((0 . "LWPOLYLINE"))))
(if (/= PSS nil)
(setq LP1 nil)
(prompt "\nNO POLYLINE SELECTED, TRY AGAIN. ")
)
)
(setq PPV (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname PSS 0))))
(vl-princ-to-string PPV)
(command "_circle" PPV "3")
)

1958 发表于 2022-7-5 17:01:22

谢谢BKT。完全按照我的要求做了。。。。。

1958 发表于 2022-7-5 17:04:52

很高兴它对你有用!

woodman78 发表于 2022-7-5 17:07:38

Woodman78这里是V形。lsp接近于匹配您的图表。
 
(defun c:test ()

(setq ppv (cdr (assoc 10 (entget (car (entsel "\nSelect Polyline: "))))))

(command "_circle" PPV "3")

(princ ppv)

)
页: [1] 2
查看完整版本: 在内部或外部偏移多段线