乐筑天下

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

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

[复制链接]

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 16:50:24 | 显示全部楼层 |阅读模式
你好
 
是否有将多段线(三维多段线)的节点点用作样条曲线的跟踪点的例程来将其转换为样条曲线?
 
附笔。
无法使用拟合多段线,因为它的结果与样条线不同,并且与我使用的其他软件兼容。
 
非常感谢。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-5 16:57:38 | 显示全部楼层
试试这个
 
  1. ;;;                                   ;;;
  2. ;;;         Polyline to Spline        ;;;
  3. ;;;            22 dec. 2016           ;;;
  4. ;;;        Gian Paolo Cattaneo        ;;;
  5. ;;;                                   ;;;
  6. (defun c:pl2spl ( / Lv SPL spl* 3DP Lv n )
  7.    (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  8.    (if (and
  9.            (princ "\nPick POLYLINE to convert it to SPLINE")
  10.            (setq 3DP (ssget ":S:E" '((0 . "*POLYLINE"))))
  11.        )
  12.        (progn
  13.            (setq 3DP (ssname 3DP 0))
  14.            (repeat (setq n (1+ (fix (vlax-curve-getEndParam 3DP))))
  15.                (setq Lv (cons (vlax-curve-getPointAtParam 3DP (setq n (1- n))) Lv))
  16.            )
  17.            (setq SPL (ssadd))            
  18.            (repeat (setq n (1- (length Lv)))
  19.                (setq spl* (ms (car Lv) (cadr Lv)))
  20.                (setq Lv (cdr Lv))
  21.                (setq SPL (ssadd spl* SPL))
  22.            )
  23.            (command "_join" )
  24.            (repeat (setq n (sslength SPL))
  25.                (command (ssname SPL (setq n (1- n))))
  26.            )
  27.            (command "")
  28.            (command "_matchprop" 3DP SPL "")
  29.            (entdel 3DP)
  30.        )
  31.    )
  32.    (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  33.    (princ)
  34. )
  35. (defun ms (v1 v2 /)
  36.    (entmakex
  37.        (list
  38.            '(0 . "SPLINE")
  39.            '(100 . "AcDbEntity")
  40.            '(100 . "AcDbSpline")
  41.            '(70 . 40)
  42.            '(71 . 3)
  43.            (cons 74 (length Lv))
  44.            '(44 . 1.0e-005)
  45.            (cons 11 v1)
  46.            (cons 11 v2)
  47.        )
  48.    )
  49. )
  50. (vl-load-com)
回复

使用道具 举报

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 17:00:28 | 显示全部楼层
非常感谢。
 
不幸的是,它在join命令上失败(Autocad 2002没有它?)
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 17:02:33 | 显示全部楼层
也许可以试试?这没有在AutoCAD 2002上测试,因为我使用的是Civil 3D 2017。
 
  1. (defun c:test ( / ss 3dplobj coords ms splobj)
  2. (vl-load-com)
  3. (setq ss (ssget ":s:e" '(( 0 . "POLYLINE"))))
  4. (if ss
  5.    (progn
  6.      (setq 3dplobj (vlax-ename->vla-object (ssname ss 0)))
  7.      (setq coords (vlax-get-property 3dplobj 'Coordinates))
  8.      (setq ms (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'ModelSpace))
  9.      (setq splobj (vlax-invoke-method ms 'AddSpline coords (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 0)))
  10.      (vlax-invoke-method 3dplobj 'Delete)
  11.      )
  12.    (princ "\nOops. Nothing was selected.")
  13.    )
  14. (princ)
  15. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:08:07 | 显示全部楼层
  1. [color=#8b4513]; written by: Grrr[/color]
  2. [color=#8b4513]; Create Spline from 2D/3D Polyline, and match the closed status:[/color]
  3. [b][color=BLACK]([/color][/b]defun C:Pline2Spline [color=#8b4513];| credits to: Lee Mac |; [b][color=FUCHSIA]([/color][/b] / Get3DpolyVertices AddSpline e pLst spl [b][color=FUCHSIA])[/color][/b][/color]
  4. [b][color=FUCHSIA]([/color][/b]defun Get3DpolyVertices [b][color=NAVY]([/color][/b] e / pLst [b][color=NAVY])[/color][/b]
  5.    [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]eq 'ENAME [b][color=BLUE]([/color][/b]type e[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]= [color=#2f4f4f]"POLYLINE"[/color] [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 [b][color=PURPLE]([/color][/b]entget e[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  6.      [b][color=MAROON]([/color][/b]reverse
  7.        [b][color=GREEN]([/color][/b]while [b][color=BLUE]([/color][/b]and [b][color=RED]([/color][/b]setq e [b][color=PURPLE]([/color][/b]entnext e[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b]/= [color=#2f4f4f]"SEQEND"[/color] [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 0 [b][color=OLIVE]([/color][/b]entget e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  8.          [b][color=BLUE]([/color][/b]setq pLst [b][color=RED]([/color][/b]cons [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 10 [b][color=OLIVE]([/color][/b]entget e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] pLst[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  9.        [b][color=GREEN])[/color][/b]
  10.      [b][color=MAROON])[/color][/b]
  11.    [b][color=NAVY])[/color][/b]
  12. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; defun Get3DpolyVertices[/color]
  13. [b][color=FUCHSIA]([/color][/b]defun AddSpline [b][color=NAVY]([/color][/b] 3DPtLst / Spline [b][color=NAVY])[/color][/b]
  14.    [b][color=NAVY]([/color][/b]if
  15.      [b][color=MAROON]([/color][/b]and
  16.        [b][color=GREEN]([/color][/b]vl-consp 3DPtLst[b][color=GREEN])[/color][/b]
  17.        [b][color=GREEN]([/color][/b]vl-every [b][color=BLUE]([/color][/b]function [b][color=RED]([/color][/b]lambda [b][color=PURPLE]([/color][/b]x[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]and [b][color=TEAL]([/color][/b]vl-consp x[b][color=TEAL])[/color][/b] [b][color=TEAL]([/color][/b]= 3 [b][color=OLIVE]([/color][/b]length x[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b] [b][color=TEAL]([/color][/b]apply 'and [b][color=OLIVE]([/color][/b]mapcar 'numberp x[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] 3DPtLst[b][color=GREEN])[/color][/b]
  18.      [b][color=MAROON])[/color][/b][color=#8b4513]; and[/color]
  19.      [b][color=MAROON]([/color][/b]setq Spline
  20.        [b][color=GREEN]([/color][/b]vla-AddSpline
  21.          [b][color=BLUE]([/color][/b]vlax-get [b][color=RED]([/color][/b]vla-get-ActiveDocument [b][color=PURPLE]([/color][/b]vlax-get-acad-object[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
  22.            [b][color=RED]([/color][/b]if [b][color=PURPLE]([/color][/b]equal [b][color=TEAL]([/color][/b]getvar [color=#2f4f4f]"CVPORT"[/color][b][color=TEAL])[/color][/b] 1[b][color=PURPLE])[/color][/b] 'PaperSpace 'ModelSpace[b][color=RED])[/color][/b]   
  23.          [b][color=BLUE])[/color][/b]
  24.          [b][color=BLUE]([/color][/b]vlax-safearray-fill
  25.            [b][color=RED]([/color][/b]vlax-make-safearray vlax-vbDouble [b][color=PURPLE]([/color][/b]cons 0 [b][color=TEAL]([/color][/b]1- [b][color=OLIVE]([/color][/b]length [b][color=GRAY]([/color][/b]apply 'append 3DPtLst[b][color=GRAY])[/color][/b][b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
  26.            [b][color=RED]([/color][/b]apply 'append 3DPtLst[b][color=RED])[/color][/b]
  27.          [b][color=BLUE])[/color][/b]
  28.          [b][color=BLUE]([/color][/b]vlax-3d-point '[b][color=RED]([/color][/b]0. 0. 0.[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  29.          [b][color=BLUE]([/color][/b]vlax-3d-point '[b][color=RED]([/color][/b]0. 0. 0.[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  30.        [b][color=GREEN])[/color][/b]
  31.      [b][color=MAROON])[/color][/b][color=#8b4513]; setq Spline[/color]
  32.    [b][color=NAVY])[/color][/b][color=#8b4513]; if [/color]
  33. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; defun AddSpline    [/color]
  34. [b][color=FUCHSIA]([/color][/b]setvar 'errno 0[b][color=FUCHSIA])[/color][/b]
  35. [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]/= 52 [b][color=MAROON]([/color][/b]getvar 'errno[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  36.    [b][color=NAVY]([/color][/b]setq e [b][color=MAROON]([/color][/b]car [b][color=GREEN]([/color][/b]entsel [color=#2f4f4f]"\nPick a pline <exit>: "[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  37.    [b][color=NAVY]([/color][/b]cond
  38.      [b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]= 7 [b][color=BLUE]([/color][/b]getvar 'errno[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]princ [color=#2f4f4f]"\nMissed, try again."[/color][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]setvar 'errno 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  39.      [b][color=MAROON]([/color][/b]e
  40.        [b][color=GREEN]([/color][/b]cond
  41.          [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]wcmatch [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 0 [b][color=OLIVE]([/color][/b]entget e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] [color=#2f4f4f]"~*POLYLINE"[/color][b][color=RED])[/color][/b] [b][color=RED]([/color][/b]princ [color=#2f4f4f]"\nInvalid object."[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  42.          [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]= [color=#2f4f4f]"POLYLINE"[/color] [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 0 [b][color=OLIVE]([/color][/b]entget e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
  43.            [b][color=RED]([/color][/b]and
  44.              [b][color=PURPLE]([/color][/b]setq spl [b][color=TEAL]([/color][/b]AddSpline [b][color=OLIVE]([/color][/b]Get3DpolyVertices e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
  45.              [b][color=PURPLE]([/color][/b]vla-put-Closed2 spl [b][color=TEAL]([/color][/b]vla-get-Closed [b][color=OLIVE]([/color][/b]vlax-ename->vla-object e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
  46.              [b][color=PURPLE]([/color][/b]setvar 'errno 52[b][color=PURPLE])[/color][/b]
  47.            [b][color=RED])[/color][/b][color=#8b4513]; and[/color]
  48.          [b][color=BLUE])[/color][/b]
  49.          [b][color=BLUE]([/color][/b][b][color=RED]([/color][/b]= [color=#2f4f4f]"LWPOLYLINE"[/color] [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 0 [b][color=OLIVE]([/color][/b]entget e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
  50.            [b][color=RED]([/color][/b]and
  51.              [b][color=PURPLE]([/color][/b]setq pLst [b][color=TEAL]([/color][/b]mapcar 'cdr [b][color=OLIVE]([/color][/b]vl-remove-if-not [b][color=GRAY]([/color][/b]function [b][color=AQUA]([/color][/b]lambda [b][color=LIME]([/color][/b]x[b][color=LIME])[/color][/b] [b][color=LIME]([/color][/b]= 10 [b][color=SILVER]([/color][/b]car x[b][color=SILVER])[/color][/b][b][color=LIME])[/color][/b][b][color=AQUA])[/color][/b][b][color=GRAY])[/color][/b] [b][color=GRAY]([/color][/b]entget e[b][color=GRAY])[/color][/b][b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
  52.              [b][color=PURPLE]([/color][/b]if [b][color=TEAL]([/color][/b]= 2 [b][color=OLIVE]([/color][/b]length [b][color=GRAY]([/color][/b]car pLst[b][color=GRAY])[/color][/b][b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b] [color=#8b4513]; convert to 3D point list[/color]
  53.                [b][color=TEAL]([/color][/b]setq pLst [b][color=OLIVE]([/color][/b]mapcar [b][color=GRAY]([/color][/b]function [b][color=AQUA]([/color][/b]lambda [b][color=LIME]([/color][/b]x[b][color=LIME])[/color][/b] [b][color=LIME]([/color][/b]append x [b][color=SILVER]([/color][/b]list [b][color=YELLOW]([/color][/b]cdr [b][color=WHITE]([/color][/b]assoc 38 [b][color=BLACK]([/color][/b]entget e[b][color=BLACK])[/color][/b][b][color=WHITE])[/color][/b][b][color=YELLOW])[/color][/b][b][color=SILVER])[/color][/b][b][color=LIME])[/color][/b][b][color=AQUA])[/color][/b][b][color=GRAY])[/color][/b] pLst[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b] [color=#8b4513]; assoc 38, elevation[/color]
  54.                pLst
  55.              [b][color=PURPLE])[/color][/b]
  56.              [b][color=PURPLE]([/color][/b]setq spl [b][color=TEAL]([/color][/b]AddSpline pLst[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
  57.              [b][color=PURPLE]([/color][/b]vla-put-Closed2 spl [b][color=TEAL]([/color][/b]vla-get-Closed [b][color=OLIVE]([/color][/b]vlax-ename->vla-object e[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
  58.              [b][color=PURPLE]([/color][/b]setvar 'errno 52[b][color=PURPLE])[/color][/b]
  59.            [b][color=RED])[/color][/b][color=#8b4513]; and[/color]
  60.          [b][color=BLUE])[/color][/b]
  61.        [b][color=GREEN])[/color][/b][color=#8b4513]; cond[/color]
  62.      [b][color=MAROON])[/color][/b][color=#8b4513]; e[/color]
  63.    [b][color=NAVY])[/color][/b][color=#8b4513]; cond[/color]
  64. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; while[/color]
  65. [b][color=BLACK])[/color][/b][color=#8b4513];| defun Spline2Pline |; [b][color=BLACK]([/color][/b]vl-load-com[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]princ[b][color=BLACK])[/color][/b][/color]

2D:
3D:
 
我不知道为什么marko_ribar没有回应这个帖子(通常他喜欢这些东西-[曲线:普林斯,样条])。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:14:25 | 显示全部楼层
 
您好,我有问题的电力供应,为我的家。。。以下是我的一些资料:
 
  1. (defun c:allpls2spls ( / ss i pl )
  2. (setq ss (ssget "_:L" '((0 . "*POLYLINE"))))
  3. (setq i -1)
  4. (while (setq pl (ssname ss (setq i (1+ i))))
  5.    (cond
  6.      ( (eq (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  7.        (sssetfirst nil (ssadd pl))
  8.        (c:lw2spl)
  9.      )
  10.      ( (and (eq (cdr (assoc 0 (entget pl))) "POLYLINE") (< -1 (cdr (assoc 70 (entget pl))) 2))
  11.        (command "_.convertpoly" "l" pl "")
  12.        (sssetfirst nil (ssadd pl))
  13.        (c:lw2spl)
  14.      )
  15.      ( (and (eq (cdr (assoc 0 (entget pl))) "POLYLINE") (< 7 (cdr (assoc 70 (entget pl))) 10))
  16.        (sssetfirst nil (ssadd pl))
  17.        (c:3p2spl)
  18.      )
  19.    )
  20. )
  21. (princ)
  22. )

 
  1. (defun c:lw2spl ( / *error* arc2spl line2spl loop pl e s ss sss qaf )
  2. (vl-load-com)
  3. (defun *error* ( msg )
  4.    (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  5.    (if qaf (setvar 'qaflags qaf))
  6.    (if msg (prompt msg))
  7.    (princ)
  8. )
  9. (defun arc2spl ( e / make_spline points q1 q2 a pc f pe ps w )
  10.           (setq q1 (vlax-curve-GetStartParam e)
  11.                 q2 (vlax-curve-GetEndParam e)
  12.                 a  (/ (- (vlax-curve-GetEndParam e) (vlax-curve-GetStartParam e)) 3.0) ; a - parameter interval... and angle
  13.                 pc (mapcar                              ; pc - points on contur
  14.                      (function
  15.                        (lambda (p)
  16.                         (vlax-curve-GetPointAtParam e p)
  17.                          )
  18.                        )
  19.                      (list q1 (+ q1 a) (- q2 a) q2)
  20.                    )
  21.                 f  (mapcar                               ; f - first deriv on pc
  22.                      (function
  23.                        (lambda (p)
  24.                          (vlax-curve-GetFirstDeriv e p)
  25.                          )
  26.                        )
  27.                      (list q1 (+ q1 a) (- q2 a) q2)
  28.                    )
  29.                 pe (mapcar                              ; pe - extra control points for spline construction
  30.                      (function
  31.                        (lambda (p1 p2 d1 d2)
  32.                          (inters p1 (mapcar '+ p1 d1)
  33.                                  p2 (mapcar '+ p2 d2)
  34.                                  nil
  35.                                  )
  36.                        )
  37.                      )
  38.                     pc (cdr pc) f (cdr f)
  39.                    )
  40.                 ps  (list (car pc) (car pe) (cadr pc) (cadr pe) (caddr pc) (caddr pe) (cadddr pc)) ; ps - control points for spline
  41.                 w   (list 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0)  ; weights for spline
  42.           )
  43.    (defun make_spline ( pts )
  44.      (entmakex
  45.        (append
  46.           '((0 . "SPLINE") (100 . "AcDbEntity") (100 . "AcDbSpline")
  47.              (70 . 4) (71 . 2) (72 . 10) (73 . 7) (74 . 0)
  48.              (42 . 1.0e-010) (43 . 1.0e-010)
  49.              (40 . 0.0) (40 . 0.0) (40 . 0.0) (40 . 1.0) (40 . 1.0)
  50.              (40 . 2.0) (40 . 2.0) (40 . 3.0) (40 . 3.0) (40 . 3.0))
  51.           pts
  52.        )
  53.      )
  54.    )
  55.    (defun points ( p w )
  56.      (apply 'append (mapcar '(lambda (a b) (list (cons 10 a) (cons 41 b))) p w))
  57.    )
  58.    (entdel e)
  59.    (make_spline (points ps w))
  60. )
  61. (defun line2spl ( e / sp ep d )
  62.    (setq sp (cdr (assoc 10 (entget e)))
  63.          ep (cdr (assoc 11 (entget e)))
  64.          d (distance sp ep)
  65.    )
  66.    (entdel e)
  67.    (entmakex
  68.      (list
  69.        '(0 . "SPLINE") '(100 . "AcDbEntity") '(100 . "AcDbSpline") '(210 0.0 0.0 1.0) '(71 . 1) '(73 . 2)
  70.        '(42 . 1.0e-010) '(43 . 1.0e-010) '(40 . 0.0) '(40 . 0.0) (cons 40 d) (cons 40 d) (cons 10 sp) (cons 10 ep)
  71.      )
  72.    )
  73. )
  74. (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))  
  75. (setq loop T)
  76. (setq sss (ssget "_I"))
  77. (if (and sss (eq (cdr (assoc 0 (entget (setq pl (ssname sss 0))))) "LWPOLYLINE")) (setq loop nil))
  78. (while loop
  79.    (setq pl (car (entsel "\nPick LWPOLYLINE to convert it to SPLINE")))
  80.    (if (and pl (eq (cdr (assoc 0 (entget pl))) "LWPOLYLINE")) (setq loop nil))
  81. )
  82. (setq e (entlast))
  83. (command "_.EXPLODE" pl)
  84. (while (> (getvar 'cmdactive) 0) (command ""))
  85. (setq ss (ssadd))
  86. (while (setq e (entnext e))
  87.    (if (eq (cdr (assoc 0 (entget e))) "LINE")
  88.      (progn
  89.        (setq s (line2spl e))
  90.        (ssadd s ss)
  91.      )
  92.    )
  93.    (if (eq (cdr (assoc 0 (entget e))) "ARC")
  94.      (progn
  95.        (setq s (arc2spl e))
  96.        (ssadd s ss)
  97.      )
  98.    )
  99. )
  100. (setq qaf (getvar 'qaflags))
  101. (setvar 'qaflags 1)
  102. (command "_.JOIN" (ssname ss 0) ss)
  103. (while (> (getvar 'cmdactive) 0) (command ""))
  104. (*error* nil)
  105. )

 
  1. (defun c:3p2spl ( / *error* line2spl loop pl e s ss sss qaf )
  2. (vl-load-com)
  3. (defun *error* ( msg )
  4.    (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  5.    (if qaf (setvar 'qaflags qaf))
  6.    (if msg (prompt msg))
  7.    (princ)
  8. )
  9. (defun line2spl ( e / sp ep d )
  10.    
  11.    (setq sp (cdr (assoc 10 (entget e)))
  12.          ep (cdr (assoc 11 (entget e)))
  13.          d (distance sp ep)
  14.    )
  15.    
  16.    (entdel e)
  17.    
  18.    (entmakex
  19.      (list
  20.        '(0 . "SPLINE") '(100 . "AcDbEntity") '(100 . "AcDbSpline") '(210 0.0 0.0 1.0) '(71 . 1) '(73 . 2)
  21.        '(42 . 1.0e-010) '(43 . 1.0e-010) '(40 . 0.0) '(40 . 0.0) (cons 40 d) (cons 40 d) (cons 10 sp) (cons 10 ep)
  22.      )
  23.    )
  24.    
  25. )
  26. (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))  
  27. (setq loop T)
  28. (setq sss (ssget "_I"))
  29. (if (and sss (eq (cdr (assoc 0 (entget (setq pl (ssname sss 0))))) "POLYLINE") (< 7 (cdr (assoc 70 (entget pl))) 10)) (setq loop nil))
  30. (while loop
  31.    (setq pl (car (entsel "\nPick 3DPOLYLINE to convert it to SPLINE")))
  32.    (if (and pl (eq (cdr (assoc 0 (entget pl))) "POLYLINE") (< 7 (cdr (assoc 70 (entget pl))) 10)) (setq loop nil))
  33. )
  34. (setq e (entlast))
  35. (command "_.EXPLODE" pl)
  36. (while (> (getvar 'cmdactive) 0) (command ""))
  37. (setq ss (ssadd))
  38. (while (setq e (entnext e))
  39.    (if (eq (cdr (assoc 0 (entget e))) "LINE")
  40.      (progn
  41.        (setq s (line2spl e))
  42.        (ssadd s ss)
  43.      )
  44.    )
  45. )
  46. (setq qaf (getvar 'qaflags))
  47. (setvar 'qaflags 1)
  48. (command "_.JOIN" (ssname ss 0) ss)
  49. (while (> (getvar 'cmdactive) 0) (command ""))
  50. (*error* nil)
  51. )

 
  1. (defun c:2ndss2spls ( / *error* arc2spl line2spl loop sss i ent ssss )
  2. (vl-load-com)
  3. (defun *error* ( msg )
  4.    (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  5.    (if msg (prompt msg))
  6.    (princ)
  7. )
  8. (defun arc2spl ( e / make_spline points q1 q2 a pc f pe ps w )
  9.           (setq q1 (vlax-curve-GetStartParam e)
  10.                 q2 (vlax-curve-GetEndParam e)
  11.                 a  (/ (- (vlax-curve-GetEndParam e) (vlax-curve-GetStartParam e)) 3.0) ; a - parameter interval... and angle
  12.                 pc (mapcar                              ; pc - points on contur
  13.                      (function
  14.                        (lambda (p)
  15.                         (vlax-curve-GetPointAtParam e p)
  16.                          )
  17.                        )
  18.                      (list q1 (+ q1 a) (- q2 a) q2)
  19.                    )
  20.                 f  (mapcar                               ; f - first deriv on pc
  21.                      (function
  22.                        (lambda (p)
  23.                          (vlax-curve-GetFirstDeriv e p)
  24.                          )
  25.                        )
  26.                      (list q1 (+ q1 a) (- q2 a) q2)
  27.                    )
  28.                 pe (mapcar                              ; pe - extra control points for spline construction
  29.                      (function
  30.                        (lambda (p1 p2 d1 d2)
  31.                          (inters p1 (mapcar '+ p1 d1)
  32.                                  p2 (mapcar '+ p2 d2)
  33.                                  nil
  34.                                  )
  35.                        )
  36.                      )
  37.                     pc (cdr pc) f (cdr f)
  38.                    )
  39.                 ps  (list (car pc) (car pe) (cadr pc) (cadr pe) (caddr pc) (caddr pe) (cadddr pc)) ; ps - control points for spline
  40.                 w   (list 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0)  ; weights for spline
  41.           )
  42.    (defun make_spline ( pts )
  43.      (entmakex
  44.        (append
  45.           '((0 . "SPLINE") (100 . "AcDbEntity") (100 . "AcDbSpline")
  46.              (70 . 4) (71 . 2) (72 . 10) (73 . 7) (74 . 0)
  47.              (42 . 1.0e-010) (43 . 1.0e-010)
  48.              (40 . 0.0) (40 . 0.0) (40 . 0.0) (40 . 1.0) (40 . 1.0)
  49.              (40 . 2.0) (40 . 2.0) (40 . 3.0) (40 . 3.0) (40 . 3.0))
  50.           pts
  51.        )
  52.      )
  53.    )
  54.    (defun points ( p w )
  55.      (apply 'append (mapcar '(lambda (a b) (list (cons 10 a) (cons 41 b))) p w))
  56.    )
  57.    (entdel e)
  58.    (make_spline (points ps w))
  59.    
  60. )
  61. (defun line2spl ( e / sp ep d )
  62.    (setq sp (cdr (assoc 10 (entget e)))
  63.          ep (cdr (assoc 11 (entget e)))
  64.          d (distance sp ep)
  65.    )
  66.    (entdel e)
  67.    (entmakex
  68.      (list
  69.        '(0 . "SPLINE") '(100 . "AcDbEntity") '(100 . "AcDbSpline") '(210 0.0 0.0 1.0) '(71 . 1) '(73 . 2)
  70.        '(42 . 1.0e-010) '(43 . 1.0e-010) '(40 . 0.0) '(40 . 0.0) (cons 40 d) (cons 40 d) (cons 10 sp) (cons 10 ep)
  71.      )
  72.    )
  73.    
  74. )
  75. (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))  
  76. (setq loop T)
  77. (setq sss (ssget "_I"))
  78. (if
  79.    (and
  80.      sss
  81.      (vl-some '(lambda ( x ) (wcmatch (cdr (assoc 0 (entget x))) "LINE,ARC,*POLYLINE")) (vl-remove-if 'listp (mapcar 'cadr (ssnamex sss))))
  82.    )
  83.    (setq loop nil)
  84. )
  85. (while loop
  86.    (setq sss (ssget "_:L" (list '(-4 . "<or") '(0 . "LINE,ARC,LWPOLYLINE") '(-4 . "<and") '(0 . "POLYLINE") '(-4 . "<or") '(70 . 0) '(70 . 1) '(70 .  '(70 . 9) '(70 . 128) '(70 . 129) '(-4 . "or>") '(-4 . "and>") '(-4 . "or>"))))
  87.    (if sss (setq loop nil))
  88. )
  89. (setq ssss (ssadd))
  90. (repeat (setq i (sslength sss))
  91.    (setq ent (ssname sss (setq i (1- i))))
  92.    (cond
  93.      ( (eq (cdr (assoc 0 (entget ent))) "LINE")
  94.        (line2spl ent)
  95.        (ssadd (entlast) ssss)
  96.      )
  97.      ( (eq (cdr (assoc 0 (entget ent))) "ARC")
  98.        (arc2spl ent)
  99.        (ssadd (entlast) ssss)
  100.      )
  101.      ( (eq (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
  102.        (sssetfirst nil (ssadd ent))
  103.        (c:lw2spl)
  104.        (ssadd (entlast) ssss)
  105.        (sssetfirst nil nil)
  106.      )
  107.      ( (and
  108.          (eq (cdr (assoc 0 (entget ent))) "POLYLINE")
  109.          (or
  110.            (eq (cdr (assoc 70 (entget ent))) 0)
  111.            (eq (cdr (assoc 70 (entget ent))) 1)
  112.            (eq (cdr (assoc 70 (entget ent))) 128)
  113.            (eq (cdr (assoc 70 (entget ent))) 129)
  114.          )
  115.        )
  116.        (command "_.CONVERTPOLY" "_L" ent)
  117.        (while (> (getvar 'cmdactive) 0) (command ""))
  118.        (sssetfirst nil (ssadd ent))
  119.        (c:lw2spl)
  120.        (ssadd (entlast) ssss)
  121.        (sssetfirst nil nil)
  122.      )
  123.      ( (and
  124.          (eq (cdr (assoc 0 (entget ent))) "POLYLINE")
  125.          (or
  126.            (eq (cdr (assoc 70 (entget ent)))
  127.            (eq (cdr (assoc 70 (entget ent))) 9)
  128.          )
  129.        )
  130.        (sssetfirst nil (ssadd ent))
  131.        (c:3p2spl)
  132.        (ssadd (entlast) ssss)
  133.        (sssetfirst nil nil)
  134.      )
  135.    )
  136. )
  137. (sssetfirst nil ssss)
  138. (*error* nil)
  139. )

 
我的版本与Grrr不同-它们创建的样条线与参考实体完全匹配。。。所以很高兴有这么多不同的版本。。。我几乎从不需要那些像Grrr张贴-他们只是触摸顶点,但弯曲远离原始参考。。。
 
您好,M.R。
回复

使用道具 举报

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 17:14:57 | 显示全部楼层
谢谢大家的代码。
 
@Hippe013:
您的例程效果很好,但仅适用于三维多段线
正在尝试将LWDOLYLINE添加到选择中
  1.     (SETQ ss (SSGET ":s:e" '((-4 . "<or")(0 . "POLYLINE")(0 . "LWPOLYLINE")(-4 . "or>"))))
返回错误:
  1. (SETQ splobj (VLAX-INVOKE-METHOD
线上
 
@Grrr:
获取错误
但在继续后,它会在闭合多段线上创建4条边中的3条。但在非闭合多段线上没有创建任何内容。 
@marko_ribar:
就像GP_的例程一样,它在JOIN命令时失败
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:20:36 | 显示全部楼层
@瓦诺姆:
您使用的是什么版本的AutoCAD-2002?我正在使用安装了VBA enabler的A2014 sp1、Express Tools、Doslib。。。如果我指定了内部代码(setvar'qaflags 1),我对JOIN命令没有问题,但请确保在将其重置为0后,恢复ACAD的正常行为。。。此外,我认为GP的代码可能工作正常,因为有时无论您是否使用QAFLAGS,这只是我的偏好,因为我最近的测试表明,例程不会以这种方式失败。。。当您仅在命令提示符下使用JOIN时,无论QAFLAGS的值是多少,都应该没有问题,但我担心您的ACAD版本在此方面已经过时了。。。我会上传GIF让你看看我的代码应该做什么。。。我刚刚在实践中演示了“2ndss2spls.lsp”,但它们中的每一个都对我有好处。。。M、 R。
 

                               
登录/注册后可看大图

 

                               
登录/注册后可看大图

                               
登录/注册后可看大图
回复

使用道具 举报

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 17:24:25 | 显示全部楼层
是的,2002年。它没有JOIN命令。
 
因此,只需稍加修改,即可在二维和三维多段线上运行Hippe013例程:
  1. (DEFUN c:p2s (/ ss 3dplobj coords ms splobj l n)
  2.    (VL-LOAD-COM)
  3.    (SETQ ss (SSGET ":s:e" '((-4 . "<or") (0 . "POLYLINE") (0 . "LWPOLYLINE") (-4 . "or>"))))
  4.    (IF ss
  5.        (PROGN
  6.            (SETQ 3dplobj (VLAX-ENAME->VLA-OBJECT (SSNAME ss 0)))
  7.            (SETQ coords (VLAX-GET-PROPERTY 3dplobj 'Coordinates))
  8.            (SETQ ms (VLAX-GET-PROPERTY
  9.                         (VLAX-GET-PROPERTY (VLAX-GET-ACAD-OBJECT) 'ActiveDocument)
  10.                         'ModelSpace
  11.                     )
  12.            )
  13.            (IF (= (CDR (ASSOC 0 (ENTGET (SSNAME ss 0)))) "LWPOLYLINE")
  14.                (PROGN
  15.                    (SETQ l      (VLAX-SAFEARRAY->LIST (VARIANT-VALUE coords))
  16.                          n      0
  17.                          coords (LIST)
  18.                    )
  19.                    (REPEAT (/ (LENGTH l) 2)
  20.                        (SETQ coords (APPEND coords (LIST (NTH n l) (NTH (1+ n) l) 0))
  21.                              n      (+ n 2)
  22.                        )
  23.                    )
  24.                    (SETQ coords (VLAX-SAFEARRAY-FILL
  25.                                      (VLAX-MAKE-SAFEARRAY
  26.                                          VLAX-VBDOUBLE
  27.                                          (CONS 0 (1- (LENGTH coords)))
  28.                                      )
  29.                                      coords
  30.                                  )
  31.                                 
  32.                    )
  33.                )
  34.            )
  35.            (SETQ splobj (VLAX-INVOKE-METHOD
  36.                             ms
  37.                             'AddSpline
  38.                             coords
  39.                             (VLAX-3D-POINT 0 0 0)
  40.                             (VLAX-3D-POINT 0 0 0)
  41.                         )
  42.            )
  43. ;      (vlax-invoke-method 3dplobj 'Delete)
  44.        )
  45.        (PRINC "\nOops. Nothing was selected.")
  46.    )
  47.    (PRINC)
  48. )

谢谢大家!
 
P、 必须有更好的方法将2d点坐标变量列表转换为3d点。
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 17:28:30 | 显示全部楼层
您可能需要考虑的另一件事是使用LWPolyline的高程特性,并在构建坐标列表时将其用于z。现在你只需要使用零海拔。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 13:01 , Processed in 0.562266 second(s), 75 queries .

© 2020-2025 乐筑天下

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