乐筑天下

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

[编程交流] (3D)多段线到样条曲线?

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:33:14 | 显示全部楼层
 
这很聪明,修改了我的建议-每当OP决定升级他的ACAD(IMO这是不可避免的)以使用Marko的代码或我的代码(用它制作芯片3D多段线)。
不知道在哪里使用此任务。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:36:41 | 显示全部楼层
@Grrr:
当涉及到三维建模时,多段线不是很好的实体类型。。。我曾经不得不以多段线为基准,以直线为旋转轴进行旋转冲浪。。。当分解表面时,3dfaces的顺序不正确,也可能会产生不良的旋转表面。。。如果有足够的替换(样条),则情况并非如此。。。也可以使用多段线沿路径扫掠或挤出,因为路径并没有那个么令人感激。。。我没有研究过,但我可以从之前的陈述中得出结论,也不建议进行放样。。。总而言之,当涉及到三维建模时,样条曲线更好,但二维多段线是技术实体,我记得有人在过去说过,样条曲线不是技术性的-它们只是很漂亮。。。我当然不同意这一点,但考虑到顶点更容易通过Vanilla或Visual Lisp获得,并且使用样条线这有点重和刚性-不那么精确-DXF10和DXF11代码都与样条线顶点计算相连,因此使用样条线标注或编程某些代码要比使用样条线灵活得多。。。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:39:51 | 显示全部楼层
谢谢你告诉我这件事,马尔科。
很明显,样条曲线为“弯曲的”3D对象提供了平滑的几何体。
在看到这些属性后,对于lisp,IMO有点复杂:
  1. ;   ControlPoints = (-96.6695 52.3015 0.0 -30.6433 148.557 0.0 ... )
  2. ;   FitPoints = (-96.6695 52.3015 0.0 128.612 251.271 0.0 ... )
  3. ;   Knots = (0.0 0.0 0.0 0.0 300.567 646.999 ... )

 
 
============================
无论如何,我写了一些相关的东西:
 
  1. ; Test function for (LWPolyline->Spline)
  2. (defun C:test ( / SS i )
  3. (if (setq SS (ssget "_:L" (list (cons 0 "LWPOLYLINE"))))
  4.    (repeat (setq i (sslength SS))
  5.      (LWPolyline->Spline (ssname SS (setq i (1- i))))
  6.    )
  7. )
  8. (princ)
  9. ); defun C:test for (LWPolyline->Spline)
  10. (defun LWPolyline->Spline ( e / crds VLApointsLst cnt Spline )
  11. (if
  12.    (and
  13.      (eq 'ENAME (type e))
  14.      (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
  15.      (setq crds (vla-get-Coordinates (vlax-ename->vla-object e))) ; obtain the coordinates
  16.      (setq VLApointsLst ; convert from 2D to 3D coordinates
  17.        (apply 'append
  18.          (mapcar
  19.            (function
  20.              (lambda (x)
  21.                (and (not cnt) (setq cnt 0))
  22.                (if (< cnt 2) (setq cnt (1+ cnt)) (setq cnt 1))
  23.                (if (= 2 cnt)
  24.                  (list x (cdr (assoc 38 (entget e)))) ; obtain the elevation, old was: (list x 0.)
  25.                  (list x)
  26.                )
  27.              ); lambda
  28.            )
  29.            (vlax-safearray->list (vlax-variant-value crds))
  30.          ); mapcar
  31.        ); apply 'append
  32.      ); setq VLApointsLst
  33.    ); and
  34.    (vla-put-Closed2
  35.      (setq Spline
  36.        (vla-AddSpline
  37.          (vlax-get (vla-get-ActiveDocument (vlax-get-acad-object))
  38.            (if (equal (getvar "CVPORT") 1) 'PaperSpace 'ModelSpace)   
  39.          )
  40.          (vlax-safearray-fill
  41.            (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length VLApointsLst))))
  42.            VLApointsLst
  43.          )
  44.          (vlax-3d-point '(0. 0. 0.))
  45.          (vlax-3d-point '(0. 0. 0.))
  46.        ); vla-AddSpline
  47.      ); setq Spline
  48.      (vla-get-Closed (vlax-ename->vla-object e))
  49.    ); vla-put-Closed2
  50. ); if
  51. Spline
  52. ); defun LWPolyline->Spline

虽然它只适用于LWplines,但我认为它不会适用于ACAD 2002。(只想把这个留在这里)
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 17:46:04 | 显示全部楼层
@grr公司
我不太清楚你这是什么意思。我没有测试你们的代码,但我们所有的代码的最终结果都一样吗? 
我已经修改了我的代码,以接受lwpolyline和3dpolyline,并考虑原始对象是否闭合。
 
  1. (defun c:test ( / ss 3dplobj coords ms splobj objn n li)
  2. (vl-load-com)
  3. (setq ss (ssget ":s:e" '(( 0 . "POLYLINE,LWPOLYLINE"))))
  4. (if ss
  5.    (progn
  6.      (setq 3dplobj (vlax-ename->vla-object (ssname ss 0)))
  7.      (setq objn (vlax-get-property 3dplobj 'ObjectName))
  8.      (setq coords (vlax-get-property 3dplobj 'Coordinates))
  9.      (if (= "AcDbPolyline" objn)
  10. (progn
  11.   (setq coords (vlax-safearray->list (vlax-variant-value coords)))
  12.   (setq elev (vlax-get-property 3dplobj 'Elevation))
  13.   (setq n 0)
  14.   (repeat (/ (length coords) 2)
  15.     (setq li (append li (list (nth n coords)(nth (+ n 1) coords) elev)))
  16.     (setq n (+ n 2))
  17.     )
  18.   (setq coords (pl->var li))
  19.   )
  20. )
  21.      (setq ms (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'ModelSpace))
  22.      (setq splobj (vlax-invoke-method ms 'AddSpline coords (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 0)))
  23.      (if (= :vlax-true (vlax-get-property 3dplobj 'Closed))
  24. (vlax-put-property splobj 'Closed2 :vlax-true))
  25.      (vlax-invoke-method 3dplobj 'Delete)
  26.      )
  27.    (princ "\nOops. Nothing was selected.")
  28.    )
  29. (princ)
  30. )
  31. ;Given Pointlist returns pointlist in variant form
  32. (defun pl->var ( pl / pl ub sa var)
  33. (setq ub (- (length pl) 1))
  34. (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  35. (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  36. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:49:42 | 显示全部楼层
这是一个笑话(闭合的3Dpolyline得到了一个像芯片一样的形状)。
 
嗯,你和我的建议会有相同的结果,但不是马尔科的。
你发布的第一个代码在LwPolyline上不起作用,所以我决定为自己编写一个版本(+我可以更容易地理解代码中发生了什么)。
编辑:我没有提到你,因为OP确认你的代码在上述版本的ACAD 2002-I ment上有效。
回复

使用道具 举报

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 17:53:57 | 显示全部楼层
@Grrr,否在2002年不起作用
 
@Hippie013,你的最后一个代码很好用
 
非常感谢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-2 20:02 , Processed in 0.255280 second(s), 63 queries .

© 2020-2025 乐筑天下

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