etoxp 发表于 2021-3-18 11:53:00

请教如何entmake polyline?

本帖最后由 etoxp 于 2021-3-18 12:01 编辑

请教如何entmake polyline?是要polyline,不是lwpolyline。而且要能控制是否闭合。

caoyin 发表于 2021-3-18 14:24:47

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)
)
)

etoxp 发表于 2021-3-18 16:00:15

caoyin 发表于 2021-3-18 14:24
POLYLINE 是被淘汰的多段线格式,LWPOLYLINE 不香吗?

(defun Add-Polyline (PTS)


谢谢!
再请教一下,lwpolyline是不是只是平面的,z坐标不起作用。我也因此才想用polyline。

vitalgg 发表于 2021-3-18 19:40:32

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)
)

etoxp 发表于 2021-3-18 22:41:36

vitalgg 发表于 2021-3-18 19:40


此程序好像将所有顶点的标高都设成了相同值,而不是每个顶点的标高都能不同。

vitalgg 发表于 2021-3-18 22:48:59

etoxp 发表于 2021-3-18 22:41
此程序好像将所有顶点的标高都设成了相同值,而不是每个顶点的标高都能不同。

也是啊,想办法改改

edata 发表于 2021-3-18 23:15:26

三维多段线才有有效z值,

etoxp 发表于 2021-3-18 23:47:45

本帖最后由 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)
)

edata 发表于 2021-3-19 00:38:59


(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]
查看完整版本: 请教如何entmake polyline?