请教如何entmake polyline?
本帖最后由 etoxp 于 2021-3-18 12:01 编辑请教如何entmake polyline?是要polyline,不是lwpolyline。而且要能控制是否闭合。
POLYLINE 是被淘汰的多段线格式,LWPOLYLINE 不香吗?
(defun Add-Polyline (PTS)
(entmake'((0 . "POLYLINE") (70 . 1)));;70组码包含1闭合,不包含1或70组码不存在则不闭合
(foreach P PTS
(entmake (list '(0 . "VERTEX") (cons 10 P)))
)
(entmakex '((0 . "SEQEND")))
)
(defun C:TT (/ P LST)
(while (setq P (getpoint "\n指定点:"))
(setq LST (cons P LST))
)
(if (> (length LST) 2)
(Add-Polyline LST)
)
)
caoyin 发表于 2021-3-18 14:24
POLYLINE 是被淘汰的多段线格式,LWPOLYLINE 不香吗?
(defun Add-Polyline (PTS)
谢谢!
再请教一下,lwpolyline是不是只是平面的,z坐标不起作用。我也因此才想用polyline。 http://atlisp.cn/static/make-polyline.gif
(defun entity:make-pline (plist convexity elevation closed)
"生成二维多段线.POLYLINE
参数:
plist:端点坐标点表,如:((x1 y1 z1) (x2 y2 z2) (x2 y2 z2))或((x1 y1) (x2 y2) (x2 y2))
convexity:各点与下一点的凸度(个数同坐标点表),可为nil
elevation:标高
closed:是否闭合,1:闭合,0:不闭合"
"返回值:生成多段线的图元名"
"示例:(entity:make-pline '((0 0 0) (5000 0 0) (5000 5000 0) (0 5000 0)) '(-1.0 -0.5 0 -0.3) 100 1)"
(if (= closed 1)
(entmake
(list '(0 . "POLYLINE") '(66 . 1) '(70 . 1) (cons 38 elevation)))
(entmake (list '(0 . "POLYLINE") '(66 . 1) (cons 38 elevation))))
(if convexity
(mapcar
'(lambda (x y)
(entmake (list (cons 0 "VERTEX")
(cons 10 x)
(cons 42 y)
)))
plist
convexity
)
(mapcar
'(lambda (x)
(entmake (list (cons 0 "VERTEX")
(cons 10 x)
)))
plist
))
(entmake '((0 . "SEQEND")))
(entlast)
) vitalgg 发表于 2021-3-18 19:40
此程序好像将所有顶点的标高都设成了相同值,而不是每个顶点的标高都能不同。 etoxp 发表于 2021-3-18 22:41
此程序好像将所有顶点的标高都设成了相同值,而不是每个顶点的标高都能不同。
也是啊,想办法改改 三维多段线才有有效z值, 本帖最后由 etoxp 于 2021-3-18 23:54 编辑
感谢各位,虽然还没有通过entmake生成满意的polyline,但已找到了其它办法实现了。
;;XP-MakePolyline 根据点表生成polyline
;;PntLst = (list (list 1 2 3) (list 10 20 30) (list 100 200 300))
;;example:
;;(XP-MakePolyline PntLst "closed")
(defun XP-MakePolyline (PntLst closed? / ACADOBJ
DOC MODELSPACE PNTLST2 POINTS
POLYOBJ
)
(setq PntLst2 '())
(if PntLst
(progn
(foreach e PntLst
(setq PntLst2 (append PntLst2 e))
)
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
;; Create the array of points
(setq points (vlax-make-safearray
vlax-vbDouble
(cons 0 (- (length PntLst2) 1))
)
)
(vlax-safearray-fill
points
PntLst2
)
;; Create a 3D polyline in model space
(setq modelSpace (vla-get-ModelSpace doc))
(setq polyObj (vla-Add3DPoly modelSpace points))
(if (= closed? "closed")
(vla-put-Closed (e2o (entlast)) :vlax-true)
)
)
)
(entlast)
);;e2o eName转objectName
(defun e2o (ename)
(vlax-ename->vla-object ename)
)
;;o2e objectName转eName
(defun o2e (vlaobj)
(vlax-vla-object->ename vlaobj)
)
(defun entity:make-pline (plist closed / ent)
"生成三维多段线.POLYLINE
参数:
plist:端点坐标点表,如:((x1 y1 z1) (x2 y2 z2) (x2 y2 z2))或((x1 y1) (x2 y2) (x2 y2))
closed:是否闭合,1:闭合,0:不闭合"
"返回值:生成多段线的图元名"
"示例:(entity:make-pline '((0 0 0) (5000 0 0) (5000 5000 0) (0 5000 0)) 1)"
(if (= closed 1)
(entmake (list '(0 . "POLYLINE") '(66 . 1) '(10 0.0 0.0 0.0) '(70 . 9) ))
(entmake (list '(0 . "POLYLINE") '(66 . 1) '(70 . 8) )))
(if plist
(mapcar
'(lambda (x)
(entmake (list (cons 0 "VERTEX")
(cons 10 x)
(cons 70 32)
)))
plist
))
(entmake '((0 . "SEQEND")))
(entlast)
)
页:
[1]