在内部或外部偏移多段线
大家好,我发现这段代码在内部偏移了一条多段线。这似乎表明,通过将符号从-改为+可以从内部切换到外部。
我已经花了几个小时尝试不同的事情,但无法让它发挥作用。
我试图将其集成到一个更大的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,但还有一大堆我不想要的东西。我怎样才能隔离它? 试试看。对不起,我英语不好。
plpoint。lsp 谢谢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。
我希望你能理解我的英语。 PPV变量只包含一个点的坐标,即直线的起点。运行此选项。在命令提示下,显示特征PRINC的双组坐标。
plpoint。lsp (166.615 343.075 0.0)(166.615 343.075 0.0) 谢谢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。
这能做到吗? 如果只是寻找第一个顶点,也可以使用:
(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")
) 谢谢BKT。完全按照我的要求做了。。。。。 很高兴它对你有用! Woodman78这里是V形。lsp接近于匹配您的图表。
(defun c:test ()
(setq ppv (cdr (assoc 10 (entget (car (entsel "\nSelect Polyline: "))))))
(command "_circle" PPV "3")
(princ ppv)
)
页:
[1]
2