乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: prodromosm

[编程交流] 将二维多段线转换为三维fr

[复制链接]

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 23:41:08 | 显示全部楼层
佩德罗,
 
我告诉过你这是部分解决方案。
 
现在,您可以使用新高程构建坐标列表
然后制作3D多边形。
 
这里有一个由艾伦J汤普森,将entmake你的3dpoly例程。
您提供了一个点列表:
  1. ;; entmake a 3dpoly      by AlanJT                                            ;
  2. (defun _pline (lst)
  3.    (if (and (> (length lst) 1)
  4.             (entmakex '((0 . "POLYLINE") (10 0. 0. 0.) (70 . ))
  5.             (foreach x lst (entmakex (list '(0 . "VERTEX") (cons 10 x) '(70 . 32))))
  6.        )
  7.      (cdr (assoc 330 (entget (entmakex '((0 . "SEQEND"))))))
  8.    )
  9. )

 
 
ymg公司
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 23:45:11 | 显示全部楼层
谢谢你ymg3
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 23:48:02 | 显示全部楼层
试试这个制作3D多边形。
 
  1. (defun c:chgpoly ( )
  2. (setq en1 (car (entsel"\nSelect Polyline: "))
  3. pl (listpol en1)
  4. ss (ssget "_F" pl '((0 . "INSERT")))
  5.        lst nil       
  6. )
  7. (repeat (setq i (sslength ss))     
  8.     (setq blk (ssname ss (setq i (1- i)))  
  9.           enb (entget blk)
  10.    ipt (cdr (assoc 10 enb))
  11.     en (entnext blk)
  12.    enl (entget en)
  13.     )
  14.     (while (= (cdr (assoc 0 enl)) "ATTRIB")
  15.        (if (= (cdr (assoc 2 enl)) "ELEV")
  16.    (progn
  17.       (setq  p (list (car ipt) (cadr ipt) (atof (cdr (assoc 1 enl))))
  18.            lst (cons p lst)
  19.       )
  20.    )  
  21. )         
  22.        (setq en (entnext en) enl (entget en))                                                
  23.     )
  24. )
  25. (if (vlax-curve-IsClosed en1) (setq lst (cons (last lst) lst)))
  26. (_pline lst)
  27. (entdel en1)
  28. )
  29.    
  30.          
  31.   
  32. ;; entmake a 3dpoly      by Alan J Thompson                                   ;
  33. (defun _pline (lst)
  34.    (if (and (> (length lst) 1)
  35.             (entmakex '((0 . "POLYLINE") (10 0. 0. 0.) (70 . ))
  36.             (foreach x lst (entmakex (list '(0 . "VERTEX") (cons 10 x) '(70 . 32))))
  37.        )
  38.      (cdr (assoc 330 (entget (entmakex '((0 . "SEQEND"))))))
  39.    )
  40. )
  41. ;; List vertices of a polyline  Original code by Gile Chanteau                ;
  42. (defun listpol (en / i p l)  
  43. (setq        i (if (vlax-curve-IsClosed en)
  44.              (vlax-curve-getEndParam en)
  45.      (+ (vlax-curve-getEndParam en) 1)
  46.   )
  47. )       
  48. (while (setq p (vlax-curve-getPointAtParam en (setq i (1- i))))
  49.      (setq l (cons p l))
  50. )
  51. )
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 23:49:47 | 显示全部楼层
谢谢你,ymg3很好用。。。
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 23:52:17 | 显示全部楼层
 
嗨,prodromosm,
将以下代码视为“快速而肮脏的演示,而不是最终确定的代码”,并将其视为实现目标的不同方法。
这个“演示”应该在WCS中按预期工作。。。
 
使用demo1,您只需选择连接所有“点”块的LWMOLYLINE(2D),即可生成具有“ELEV”信息的3D多段线。
 
  1. (defun c:demo1 (/ attlst e lst obj par poly pt s s1 z)
  2. (if (setq s (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))
  3.    (progn
  4.      (vl-cmdf "_.DRAWORDER"  (ssname s 0) "" "_B"
  5.        "_.zoom" "_O" (ssname s 0) ""
  6.        "_.-layer" "_M" "3DPoly_Test" "_C" "3" "3DPoly_Test" "" ""
  7.      );; vl-cmdf
  8.      (setq poly (vlax-ename->vla-object (ssname s 0))
  9.     e         (fix (vlax-curve-getEndParam poly))
  10.     par         0
  11.     lst         nil
  12.      );; setq
  13.      (while (/= par (1+ e))
  14. (setq pt (vlax-curve-getPointAtParam poly par))
  15. (if (setq s1 (ssget pt '((0 . "INSERT") (2 . "Point") (66 . 1))))
  16.   (progn
  17.     (setq obj         (vlax-ename->vla-object (ssname s1 0))
  18.           attlst (vlax-invoke obj 'GetAttributes)
  19.     );; setq
  20.     (foreach att attlst
  21.       (if (= (vla-get-TagString att) "ELEV")
  22.         (setq z          (atof (vla-get-TextString att))
  23.               pt  (list (car pt) (cadr pt) z)
  24.               lst (cons pt lst)
  25.         );; setq
  26.       );; if
  27.     );; foreach
  28.   );; progn
  29. );; if
  30. (setq par (1+ par))
  31.      );; while
  32.      (if lst
  33. (progn
  34.   (setq lst (reverse lst))
  35.   (entmake (list '(0 . "POLYLINE")
  36.                  (if (vlax-curve-IsClosed poly)
  37.                    '(70 . 9)
  38.                    '(70 .
  39.                  );; if
  40.            );; list
  41.   );; entmake
  42.   (foreach x lst
  43.     (entmake (list '(0 . "VERTEX")
  44.                    '(70 . 32)
  45.                    (cons 10 x)
  46.              );; list
  47.     );; entmake
  48.   );; foreach
  49.   (entmake '((0 . "SEQEND")))
  50. );; progn
  51.      );; if
  52.      (vl-cmdf "_.zoom" "_P")
  53.    );; progn
  54. );; if
  55. (princ)
  56. );; demo1

 
在演示2中,您只需要选择连接所有“点”块的3DPolyline,以使用高程值填充“高程”“标记”。
 
  1. (defun c:demo2 (/ attlst e obj par poly pt s s1 )
  2. (if (setq s (ssget "_+.:E:S" '((0 . "POLYLINE") (-4 . "&") (70 . )))
  3.    (progn
  4.      (vl-cmdf "_.DRAWORDER" (ssname s 0) "" "_B"
  5.        "_.zoom" "_O" (ssname s 0) ""
  6.      );; vl-cmdf
  7.      (setq poly (vlax-ename->vla-object (ssname s 0))
  8.     e         (fix (vlax-curve-getEndParam poly))
  9.     par         0
  10.      );; setq
  11.      (while (/= par (1+ e))
  12. (setq pt (vlax-curve-getPointAtParam poly par))
  13. (if (setq s1 (ssget pt '((0 . "INSERT") (2 . "Point") (66 . 1))))
  14.   (progn
  15.     (setq obj         (vlax-ename->vla-object (ssname s1 0))
  16.           attlst (vlax-invoke obj 'GetAttributes)
  17.     );; setq
  18.     (foreach att attlst
  19.       (if (= (vla-get-TagString att) "ELEV")
  20.         (vla-put-TextString att (rtos (caddr pt) 2 2))
  21.       );; if
  22.     );; foreach
  23.   );; progn
  24. );; if
  25. (setq par (1+ par))
  26.      );; while
  27.      (vl-cmdf "_.zoom" "_P")
  28.    );; progn
  29. );; if
  30. (princ)
  31. );; demo2

 
希望这有帮助。。。
亨里克
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 23:58:09 | 显示全部楼层
谢谢你,干得好。我还有一个问题
 
我正在搜索lisp以将三维多段线转换为多段线。到目前为止,我找到的所有lisp都将三维多段线转换为二维多段线,但不会转换为多段线。当我在“属性”选项板中选择多段线时,我的意思是写多段线而不是二维多段线。
你能帮忙吗?
 
这是我说的lisp,但是当我选择多段线时,比如说2d多段线,而不仅仅是多段线。
 
  1. ;;CADALYST 09/03 AutoLISP Solutions
  2. ;;; PLINE-3D-2D.LSP - a program to convert
  3. ;;; 3D polylines to 2D
  4. ;;; Program by Tony Hotchkiss
  5. (defun pline-3d-2d ()
  6. (vl-load-com)
  7. (setq        *thisdrawing* (vla-get-activedocument
  8.                 (vlax-get-acad-object)
  9.               ) ;_ end of vla-get-activedocument
  10. *modelspace*  (vla-get-ModelSpace *thisdrawing*)
  11. ) ;_ end of setq
  12. (setq        3d-pl-list
  13. (get-3D-pline)
  14. ) ;_ end of setq
  15. (if 3d-pl-list
  16.    (progn
  17.      (setq vert-array-list (make-list 3d-pl-list))
  18.      (setq n (- 1))
  19.      (repeat (length vert-array-list)
  20. (setq vert-array (nth (setq n (1+ n)) vert-array-list))
  21. (setq lyr (vlax-get-property (nth n 3d-pl-list) 'Layer))
  22. (setq obj (vla-AddPolyline *modelspace* vert-array))
  23. (vlax-put-property obj 'Layer lyr)
  24.      ) ;_ end of repeat
  25.      (foreach obj 3d-pl-list (vla-delete obj))
  26.    ) ;_ end of progn
  27. ) ;_ end of if
  28. ) ;_ end of pline-3d-2d
  29. (defun get-3D-pline ()
  30. (setq        pl3dobj-list nil
  31. obj             nil
  32. 3d             "AcDb3dPolyline"
  33. ) ;_ end of setq
  34. (setq selsets (vla-get-selectionsets *thisdrawing*))
  35. (setq ss1 (vlax-make-variant "ss1"))
  36. (if (= (vla-get-count selsets) 0)
  37.    (setq ssobj (vla-add selsets ss1))
  38. ) ;_ end of if
  39. (vla-clear ssobj)
  40. (setq Filterdata (vlax-make-variant "POLYLINE"))
  41. (setq no-ent 1)
  42. (while no-ent
  43.    (vla-Selectonscreen ssobj)
  44.    (if        (> (vla-get-count ssobj) 0)
  45.      (progn
  46. (setq no-ent nil)
  47. (setq i (- 1))
  48. (repeat        (vla-get-count ssobj)
  49.   (setq
  50.     obj        (vla-item ssobj
  51.                   (vlax-make-variant (setq i (1+ i)))
  52.         ) ;_ end of vla-item
  53.   ) ;_ end of setq
  54.   (cond
  55.     ((= (vlax-get-property obj "ObjectName") 3d)
  56.      (setq pl3dobj-list
  57.             (append pl3dobj-list (list obj))
  58.      ) ;_ end of setq
  59.     )
  60.   ) ;_ end-of cond
  61. ) ;_ end of repeat
  62.      ) ;_ end of progn
  63.      (prompt "\nNo entities selected, try again.")
  64.    ) ;_ end of if
  65.    (if        (and (= nil no-ent) (= nil pl3dobj-list))
  66.      (progn
  67. (setq no-ent 1)
  68. (prompt "\nNo 3D-polylines selected.")
  69. (quit)
  70.      ) ;_ end of progn
  71.    ) ;_ end of if
  72. ) ;_ end of while  
  73. (vla-delete (vla-item selsets 0))
  74. pl3dobj-list
  75. ) ;_ end of get-3D-pline
  76. (defun get-3D-pline-old ()
  77. (setq no-ent 1)
  78. (setq        filter '((-4 . "<AND")
  79.          (0 . "POLYLINE")
  80.          (70 .
  81.          (-4 . "AND>")
  82.         )
  83. ) ;_ end of setq
  84. (while no-ent
  85.    (setq ss               (ssget filter)
  86.   k               (- 1)
  87.   pl3dobj-list nil
  88.   obj               nil
  89.   3d               "AcDb3dPolyline"
  90.    ) ;_ end-of setq
  91.    (if        ss
  92.      (progn
  93. (setq no-ent nil)
  94. (repeat        (sslength ss)
  95.   (setq        ent (ssname ss (setq k (1+ k)))
  96.         obj (vlax-ename->vla-object ent)
  97.   ) ;_ end-of setq
  98.   (cond
  99.     ((= (vlax-get-property obj "ObjectName") 3d)
  100.      (setq pl3dobj-list
  101.             (append pl3dobj-list (list obj))
  102.      ) ;_ end of setq
  103.     )
  104.   ) ;_ end-of cond
  105. ) ;_ end-of repeat
  106.      ) ;_ end-of progn
  107.      (prompt "\nNo 3D-polylines selected, try again.")
  108.    ) ;_ end-of if
  109. ) ;_ end-of while
  110. pl3dobj-list
  111. ) ;_ end of get-3D-pline-old
  112. (defun make-list (p-list)
  113. (setq        i (- 1)
  114. vlist nil
  115. calist nil
  116. ) ;_ end of setq
  117. (repeat (length p-list)
  118.    (setq obj         (nth (setq i (1+ i)) p-list)
  119.   coords (vlax-get-property obj "coordinates")
  120.   ca         (vlax-variant-value coords)
  121.    ) ;_ end-of setq
  122.    (setq calist (append calist (list ca)))
  123. ) ;_ end-of repeat
  124. ) ;_ end-of make-list
  125. (defun c:pl32 ()
  126. (pline-3d-2d)
  127. (princ)
  128. ) ;_ end of pl32
  129. (prompt "Enter PL32 to start: ")
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 00:00:40 | 显示全部楼层
佩德罗,
 
我不明白你为什么要这样做,但是,listpol例程
将为您提供任何类型的多段线或lwpoly的顶点。只需应用退货列表
按照AlanJT的惯例。
 
ymg公司
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 00:03:25 | 显示全部楼层
 
不客气,prodromosm!
 
我们不能转换二维多段线,也不能转换lwpolyline中的三维多段线,我们可以做的是选择一条二维/三维多段线,将vértices点合并,用以前的数据生成一条新的lwpolyline,并输入原始多段线。。。
作为演示,如果多段线有弧,将失败,并且不会删除原始多段线,只是一个起点。。。
 
  1. (defun c:demo3 (/ E ELV LST PAR POLY PT PT0 LST S X ZDIR)
  2. (vl-load-com)
  3. (if (setq s (ssget "_+.:E:S" '((0 . "POLYLINE") )))
  4.    (progn
  5.      (setq poly (vlax-ename->vla-object (ssname s 0))
  6.     e         (fix (vlax-curve-getEndParam poly))
  7.     par         0
  8.     lst         nil
  9.      );; setq
  10.      (while (/= par (1+ e))
  11. (setq pt  (vlax-curve-getPointAtParam poly par)
  12.       pt0 (list (car pt) (cadr pt) 0.0)
  13.       lst (cons pt0 lst)
  14. );; setq
  15. (setq par (1+ par))
  16.      );; while
  17.      (if lst
  18. (progn
  19.   (setq        lst  (reverse lst)
  20.         zdir (trans '(0 0 1) 1 0 T)
  21.         elv  (caddr (trans (car lst) 1 zdir))
  22.   );; setq
  23.   (entmake
  24.     (append
  25.       (list (cons 0 "LWPOLYLINE")
  26.             (cons 100 "AcDbEntity")
  27.            ;(cons 8 "YourLayer")
  28.            ;(cons 62 "YourColor")
  29.             (cons 100 "AcDbPolyline")
  30.             (cons 90 (length lst))
  31.             (if        (vlax-curve-IsClosed poly)
  32.               '(70 . 1)
  33.               '(70 . 0)
  34.             );; if
  35.             (cons 38 elv)
  36.            ;(cons 43 "YourWidth)
  37.             (cons 210 zdir)
  38.       );; list
  39.       (mapcar '(lambda (x) (cons 10 (trans x 1 zdir))) lst)
  40.     );; append
  41.   );; entmake
  42. );; progn
  43.      );; if
  44.    );; progn
  45. );; if
  46. (princ)
  47. );; demo3

 
HTH公司
亨里克
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-6 00:06:11 | 显示全部楼层
我无法理解你的答案。我和post pline-3d-2d lisp无法理解为什么将三维多段线转换为二维多段线而不是简单的多段线。有可能改变吗?
 
谢谢
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-6 00:10:53 | 显示全部楼层
谢谢你hmsilva
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 02:59 , Processed in 0.751995 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表