乐筑天下

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

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

[复制链接]

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 20:16:42 | 显示全部楼层 |阅读模式
你好我有一个小问题,我需要一些帮助。我想使用等高线的删除将一些二维多段线转换为三维多段线。
 
我正在用lisp搜索一条二维多段线,并使用等高线元素将其转换为三维
 
谢谢
测试1.dwg
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 20:22:48 | 显示全部楼层
看看这是否能帮到你,这是个小傻瓜,但我能做到。。。
 
  1. (defun continue ( / sscurve ) (vl-load-com)
  2. (if (null el) (setq el (entlast)))
  3. (prompt "\nSelect curve you want to project on tin surface...")
  4. (setq sscurve (ssget "_+.:E:S:L"))
  5. (while (or (not sscurve) (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getstartparam (list (ssname sscurve 0)))))
  6.    (prompt "\nEmpty sel.set or selected entity doesn't belong to curves...")
  7.    (setq sscurve (ssget "_+.:E:S:L"))
  8. )
  9. (princ)
  10. )
  11. (defun finish ( / l-join ell )
  12. (defun l-join ( ell / ss sss k ent stpt enpt septs chkduppt septn stent ptlst nxtentst nxtenten ellss )
  13.    (if (vl-every '(lambda ( x ) (eq (cdr (assoc 0 (entget x))) "LINE")) ell)
  14.      (progn
  15.        (setq ss (ssadd))
  16.        (foreach l ell
  17.          (ssadd l ss)
  18.        )
  19.        (setq sss (ssadd))
  20.        (repeat (setq k (sslength ss))
  21.          (setq ent (ssname ss (setq k (1- k))))
  22.          (ssadd ent sss)
  23.        )   
  24.        (repeat (setq k (sslength ss))
  25.          (setq ent (ssname ss (setq k (1- k))))
  26.          (setq stpt (cdr (assoc 10 (entget ent))))
  27.          (setq enpt (cdr (assoc 11 (entget ent))))
  28.          (setq septs (cons stpt septs))
  29.          (setq septs (cons enpt septs))
  30.        )
  31.        (setq sept septs)
  32.        (defun chkduppt (pt lst / chk)
  33.          (foreach ptt lst
  34.            (if (equal pt ptt 1e-6) (setq chk (cons T chk)))
  35.          )
  36.          chk
  37.        )
  38.        (foreach pt septs
  39.          (if (eq (length (chkduppt pt septs)) 2) (setq septn (cons pt septn)))
  40.        )
  41.        (foreach pt septn
  42.          (setq sept (vl-remove pt sept))
  43.        )
  44.        (if (eq sept nil) (setq sept (acet-list-remove-duplicates septs 1e-6)))
  45.        (repeat (setq k (sslength ss))
  46.          (setq ent (ssname ss (setq k (1- k))))
  47.          (setq stpt (cdr (assoc 10 (entget ent))))
  48.          (if (equal stpt (car sept) 1e-6) (setq stent ent))
  49.        )
  50.        (if (eq stent nil)
  51.          (repeat (setq k (sslength ss))
  52.            (setq ent (ssname ss (setq k (1- k))))
  53.            (setq enpt (cdr (assoc 11 (entget ent))))
  54.            (if (equal enpt (car sept) 1e-6) (setq enent ent))
  55.          )
  56.        )
  57.        (if stent
  58.        (progn
  59.          (setq ptlst (cons (cdr (assoc 10 (entget stent))) ptlst))
  60.          (setq ptlst (cons (cdr (assoc 11 (entget stent))) ptlst))
  61.          (setq enpt (cdr (assoc 11 (entget stent))))
  62.          (ssdel stent ss)
  63.        )
  64.        (progn
  65.          (setq ptlst (cons (cdr (assoc 11 (entget enent))) ptlst))
  66.          (setq ptlst (cons (cdr (assoc 10 (entget enent))) ptlst))
  67.          (setq enpt (cdr (assoc 10 (entget enent))))
  68.          (ssdel enent ss)
  69.        )
  70.        )
  71.        (while (/= (sslength ss) 0)
  72.          (setq nxtentst nil)
  73.          (setq nxtenten nil)
  74.          (repeat (setq k (sslength ss))
  75.            (setq ent (ssname ss (setq k (1- k))))
  76.            (setq stpt (cdr (assoc 10 (entget ent))))
  77.            (if (equal enpt stpt 1e-6) (setq nxtentst ent))
  78.          )
  79.          (if nxtentst nil
  80.            (repeat (setq k (sslength ss))
  81.              (setq ent (ssname ss (setq k (1- k))))
  82.              (setq enptt (cdr (assoc 11 (entget ent))))
  83.              (if (equal enpt enptt 1e-6) (setq nxtenten ent))
  84.            )
  85.          )
  86.          (if nxtentst
  87.          (progn
  88.            (setq ptlst (cons (cdr (assoc 10 (entget nxtentst))) ptlst))
  89.            (setq ptlst (cons (cdr (assoc 11 (entget nxtentst))) ptlst))
  90.            (setq enpt (cdr (assoc 11 (entget nxtentst))))
  91.            (ssdel nxtentst ss)
  92.          )
  93.          (progn
  94.            (setq ptlst (cons (cdr (assoc 11 (entget nxtenten))) ptlst))
  95.            (setq ptlst (cons (cdr (assoc 10 (entget nxtenten))) ptlst))
  96.            (setq enpt (cdr (assoc 10 (entget nxtenten))))
  97.            (ssdel nxtenten ss)
  98.          )
  99.          )
  100.        )
  101.        (setq ptlst (acet-list-remove-duplicates ptlst 1e-6))
  102.        (command "_.3DPOLY")
  103.        (foreach pt ptlst
  104.          (command "_non" pt)
  105.        )
  106.        (command "")
  107.        (setq el (entlast))
  108.        (while (eq (cdr (assoc 0 (entget (setq el (entnext el))))) "VERTEX"))
  109.        (foreach l ell
  110.          (entdel l)
  111.        )
  112.      )
  113.      (progn
  114.        (setq ellss (ssadd))
  115.        (foreach l ell
  116.          (ssadd l ellss)
  117.        )
  118.        (foreach l ell
  119.          (command "_.JOIN" l ellss "")
  120.        )
  121.        (setq el (entlast))
  122.      )
  123.    )
  124. )
  125. (while (setq el (entnext el))
  126.    (setq ell (cons el ell))
  127. )
  128. (l-join ell)
  129. (princ)
  130. )
  131. (defun c:projcurvestotin nil
  132. (prompt "\nSelect tin surface made of 3D FACES...")
  133. (while (not (ssget "_:L" '((0 . "3DFACE"))))
  134.    (prompt "\nEmpty sel.set... Please select TIN surface again...")
  135.    (ssget "_:L" '((0 . "3DFACE")))
  136. )
  137. (command "_MESHSMOOTH")
  138. (prompt "\nType "P", then hit ENTER twicely and after that type "UNION" and select tin surface again, choose 3rd option, \nthen type "(continue)" and after that type "PROJECTGEOMETRY", then type "P", hit ENTER, then click on TIN surface and choose "UCS", \nand at the end type "(finish)"; Repeat steps from "(continue)" as much as you have curves you want to project...")
  139. (textscr)
  140. (princ)
  141. )
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 20:25:39 | 显示全部楼层
marko_ribar感谢您的回复。我测试了你的代码,但我有这个错误。
 
1) i wrire projcurvestotin公司
2) 我选择所有3d面
3) 我写p(并选择二维多段线)
4) 给我错误!!!
211647v7hkbx94zdnzr256.jpg
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:27:56 | 显示全部楼层
我假设您实际上希望在现有的二维等高线上覆盖一条线,并创建一条三维多段线。
 
我不久前写了这段代码。它还包括Lee Mac针对我发布的代码编写的代码。
 
 
  1. ;Drapes a 3dpolyline over polylines along a selected line.
  2. (vl-load-com)
  3. (defun c:sample-pl ( / li *ModSpc *ActDoc *Acad lobj p1 p2 ss sslen i plobj pnts n li pntli finli var)
  4. (setq li nil)
  5. (setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
  6. (setq lobj (vlax-ename->vla-object (car (entsel "\nSelect Line Object: "))))
  7. (setq p1 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'StartPoint))))
  8. (setq p2 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'EndPoint))))
  9. (setq ss (ssget "f" (list p1 p2) '(( 0 . "LWPOLYLINE"))))
  10. (setq sslen (sslength ss))
  11. (setq i 0)
  12. (repeat sslen
  13.    (setq plobj (vlax-ename->vla-object (ssname ss i)))
  14.    (setq el (vlax-get-property plobj 'Elevation))
  15.    (vlax-put-property plobj 'Elevation 0)
  16.    (setq pnts (vlax-invoke lobj 'IntersectWith plobj acExtendNone))
  17.    (vlax-put-property plobj 'Elevation el)
  18.    (vlax-release-object plobj)
  19.    (setq n 0)
  20.    (repeat (/ (length pnts) 3)
  21.      (setq li (append li (list (nth (+ n 0) pnts))))
  22.      (setq li (append li (list (nth (+ n 1) pnts))))
  23.      (setq li (append li (list el)))
  24.      (drxc (list (nth (+ n 0) pnts) (nth (+ n 1) pnts) el) 2)
  25.      (setq n (+ n 3))
  26.      )
  27.    (setq i (1+ i))
  28.    )
  29. (setq n 0)
  30. (setq pntli nil)
  31. (repeat (/ (length li) 3)
  32.    (setq pntli (append pntli (list (cons (distance (list (nth (+ n 0) li) (nth (+ n 1) li)) (list (nth 0 p1) (nth 1 p1))) (list (list (nth (+ n 0) li) (nth (+ n 1) li)(nth (+ n 2) li)))))))
  33.    (setq n (+ n 3))
  34.    )
  35. (setq pntli (vl-sort pntli (function (lambda (d1 d2) (< (car d1) (car d2))))))
  36. (setq n 0)
  37. (setq finli nil)
  38. (repeat (length pntli)
  39.    (setq finli (append finli (cadr (nth n pntli))))
  40.    (setq n (1+ n))
  41. )
  42. (setq var (pl->var finli))
  43. (setq 3dobj2 (vlax-invoke-method *ModSpc 'Add3DPoly var))
  44. (vlax-put-property 3dobj2 'Color 1)
  45. (vlax-release-object 3dobj2)
  46. )
  47. ;Given Pointlist returns pointlist in variant form
  48. (defun PL->VAR ( pl / pl ub sa var)
  49. (setq ub (- (length pl) 1))
  50. (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  51. (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  52. )
  53. ;Graphically at given point and color Example (drxc '( 1 2 3) 1) draws x at x=1 y=2 z=3 in the color red                        
  54. (defun drxc (ctr color / vs xs xs2 cor1 cor2 cor3 cor4 ctr color)
  55. (setq vs (getvar "viewsize"))
  56. (setq xs (/ vs 20))
  57. (setq xs2 (/ xs 2))
  58. (setq cor1 (polar ctr (* pi 0.25) xs2))
  59. (setq cor2 (polar ctr (* pi 0.75) xs2))
  60. (setq cor3 (polar ctr (* pi 1.25) xs2))
  61. (setq cor4 (polar ctr (* pi 1.75) xs2))
  62. (grdraw ctr cor1 color 0)
  63. (grdraw ctr cor2 color 0)
  64. (grdraw ctr cor3 color 0)
  65. (grdraw ctr cor4 color 0)
  66. )
  67. ;The following was written by LEE MAC ~ Cadtutor
  68. ;in response to my posting of the above code.
  69. (defun c:LWPolySample ( / _dxf doc spc lobj p1 ss ev tmp lst ) (vl-load-com)
  70. ;; © Lee Mac 2010
  71. (defun _dxf ( code entity ) (cdr (assoc code (entget entity))))
  72. (LM:ActiveSpace 'doc 'spc)
  73. (if
  74.    (and (setq lobj (car (entsel "\nSelect Line: "))) (eq "LINE" (_dxf 0 lobj))
  75.      (ssget "_F"
  76.        (list (setq p1 (_dxf 10 lobj)) (_dxf 11 lobj)) '((0 . "LWPOLYLINE"))
  77.      )
  78.    )
  79.    (progn (setq lobj (vlax-ename->vla-object lobj))
  80.      
  81.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  82.        (setq ev (vla-get-Elevation obj))
  83.        (vla-put-Elevation obj 0.0)
  84.        (setq lst
  85.          (cons
  86.            (mapcar
  87.              (function
  88.                (lambda ( x ) (list (car x) (cadr x) ev))
  89.              )
  90.              (GroupByNum (vlax-invoke obj 'IntersectWith lobj acExtendNone) 3)
  91.            )
  92.            lst
  93.          )
  94.        )
  95.        (vla-put-Elevation obj ev)
  96.      )
  97.      (vla-delete ss)
  98.      (vla-put-Color
  99.        (vlax-invoke spc 'Add3DPoly
  100.          (apply 'append
  101.            (vl-sort (apply 'append lst)
  102.             '(lambda ( a b )
  103.                (< (distance p1 (list (car a) (cadr a))) (distance p1 (list (car b) (cadr b))))
  104.              )
  105.            )
  106.          )
  107.        )
  108.        1
  109.      )
  110.    )
  111. )
  112. (princ)
  113. )
  114. (defun GroupByNum ( l n / r)
  115. ;; © Lee Mac 2010
  116. (setq r (list (car l)))
  117. (if l
  118.    (cons
  119.      (reverse
  120.        (repeat (1- n) (setq l (cdr l) r (cons (car l) r)))
  121.      )
  122.      (GroupByNum (cdr l) n)
  123.    )
  124. )
  125. )
  126. ;;--------------------=={ ActiveSpace }==---------------------;;
  127. ;;                                                            ;;
  128. ;;  Retrieves pointers to the Active Document and Space       ;;
  129. ;;------------------------------------------------------------;;
  130. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  131. ;;------------------------------------------------------------;;
  132. ;;  Arguments:                                                ;;
  133. ;;  *doc - quoted symbol (other than *doc)                    ;;
  134. ;;  *spc - quoted symbol (other than *spc)                    ;;
  135. ;;------------------------------------------------------------;;
  136. (defun LM:ActiveSpace ( *doc *spc )
  137. ;; © Lee Mac 2010
  138. (set *spc
  139.    (vlax-get-property
  140.      (set *doc
  141.        (vla-get-ActiveDocument
  142.          (vlax-get-acad-object)
  143.        )
  144.      )
  145.      (if (= 1 (getvar 'CVPORT)) 'PaperSpace 'ModelSpace)
  146.    )
  147. )
  148. )
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 20:30:18 | 显示全部楼层
Hi Hippe013。这个Lisp程序是怎么运行的?
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 20:33:58 | 显示全部楼层
Hippe013我已经准备好了所有3d轮廓。在它们上面我有二维多段线。我想使用等高线的删除将二维多段线转换为三维多段线。
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:36:01 | 显示全部楼层
你Lisp程序了吗?
 
你知道如何运行lisp吗?
 
这段代码在轮廓上覆盖一条线,并创建一条3dpolyline。这不是你想要的吗?将二维多段线(图形中的黄色)替换为直线。运行提供的代码。选择该线,您将看到一条三维多段线覆盖在等高线上。
 
如果这不是你想要的,那么也许你需要更清楚地了解你的要求。
 
当做
 
hippe013
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 20:41:27 | 显示全部楼层
Hippe013现在你可以理解如何运行Lisp程序了。我键入LWPOLYSAMPLE并选择一条线,然后将其转换为多段线。
我想将三维多段线添加到图层。你能告诉我我们要添加这个图层命令吗
 
(命令“_layer”“m”“3d polyline”“c”“3”)
 
谢谢
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 20:44:25 | 显示全部楼层
我已经修正了我的代码一点。。。我不知道,我可以按照我在例行程序中解释的那样做。。。我已经在A2014上测试过了,它应该可以使用3d曲线实体,而不仅仅是直线或柱脚。。。
 
请再试一次,因为我已将子功能更改为独立于主功能。。。
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:48:14 | 显示全部楼层
如果希望将三维多段线添加到某个图层。然后(使用我的代码c:sample pl)进行以下编辑。
 
  1. (vlax-put-property 3dobj2 'Color 1)
  2. [color="red"](vlax-put-property 3dobj2 'Layer "WHATEVER-LAYER-YOU-WANT")[/color]
  3. (vlax-release-object 3dobj2)

 
如果层不存在,则会出错。
 
在这种情况下:
 
  1. (setq lays (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Layers))
  2. ;This gets you to the layers collection
  3. (setq n-layer (vlax-invoke-method lays 'Add "MyNewLayer"))
  4. ;This adds a new layer to the layer collection

 
我希望这有帮助。
 
P、 我建议您使用VLIDE(visual lisp编辑器)进行编辑。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 08:57 , Processed in 0.783039 second(s), 74 queries .

© 2020-2025 乐筑天下

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