Phiphi 发表于 2022-7-6 15:04:47

LISP绘制样条线或三维Plin

我后LISP绘制样条线或三维样条线从点或线,如所附图纸。
非常感谢您的帮助。干杯
线条2样条-。拉链

JohnM 发表于 2022-7-6 15:12:32

尝试一下:
 

(vl-load-com)
;;; to make a 3d polyline*******************************************
(defun c:pol (/ adoc spc ss cnt plst 3dline)
(setq adoc(vla-get-activedocument(vlax-get-acad-object)))
(setq spc(vlax-get adoc
(if (equal (getvar "cvport") 1)
'PaperSpace
'ModelSpace
);_if
)
);_setq
(setq ss (ssget '((0 . "POINT"))));_select only point objects
(if ss
(progn
(setq cnt 0);_loop counter
(setq plst '());_empty list
(while (< cnt (sslength ss))
(setq plst (cons(cdr(assoc 10(entget (ssname ss cnt))))plst));_make point list
(setq cnt (1+ cnt));_incerase counter
    );_while
(setq 3dline (vla-add3dpoly ;_make 3d polyline
      spc
      (vlax-safearray-fill
(vlax-make-safearray vlax-vbDouble
(cons 0 (1- (length (apply 'append plst)))))
(apply 'append plst)))
      );_setq add 3dpoly
);_progn
);_if
(princ)
);_defun
;;; to make a 3dspline******************************************
(defun c:spl (/ adoc spc ss cnt plst 3dline stpt ept)
(setq adoc(vla-get-activedocument(vlax-get-acad-object)))
(setq spc(vlax-get adoc
(if (equal (getvar "cvport") 1)
'PaperSpace
'ModelSpace
);_if
)
);_setq
(setq ss (ssget '((0 . "POINT"))))
(if ss
(progn
(setq cnt 0);_loop counter
(setq plst '());_empty list
(while (< cnt (sslength ss))
(setq plst (cons(cdr(assoc 10(entget (ssname ss cnt))))plst))
(setq cnt (1+ cnt));_incerase counter
    );_while
(setq stpt (vlax-3d-point '(0.0 0.0 0.0)));_start pt for spline
(setq ept (vlax-3d-point '(0.0 0.0 0.0)));_end pt for spline
(setq cline (vla-addspline
      spc
      (vlax-safearray-fill
(vlax-make-safearray vlax-vbDouble
(cons 0 (1- (length (apply 'append plst)))))
(apply 'append plst))
      stpt
      ept
      )
      );_setq add 3d spline
);_progn
);_if
(princ)
);_defun

uddfl 发表于 2022-7-6 15:17:24

^JohnM,请原谅我的愚蠢,但是程序怎么知道按照什么顺序来执行这些点呢?

CarlB 发表于 2022-7-6 15:27:56

没有试过,但看起来不错。
 
..您不需要测试点的顺序是否正确吗?这取决于点的创建方式。它们在选择集中的顺序可能不沿多段线。。
 
**哎呀,同样的问题太慢了

JohnM 发表于 2022-7-6 15:30:02

关于点,你有一个很好的观点,所以让我指出,你应该以正确的顺序创建点。
你可以写一个例程,把它们按顺序排列,但取决于你到底在做什么,它可能会变得非常复杂,我不相信你能涵盖所有可以计算的方法。

Phiphi 发表于 2022-7-6 15:36:05

非常感谢您抽出时间。
我重新上传了另一个带有ID点的图形。
LISP将按照此顺序创建样条线或三维多段线。还包括坐标的文本文件。
点和线2样条曲线。拉链
坐标点2样条。txt文件

jammie 发表于 2022-7-6 15:42:10

嘿Phiphi,
 
如果信息可以来自包含X、Y和Z值的文件,您考虑过使用脚本文件吗?
 
对于三维多边形

;;Turn off osnap
osmode
0
;;start the 3d polyline command
3dpoly
60.8628,72.8892,0.6110
56.3497,70.7362,0.6110
51.8366,68.5842,0.6110
47.3235,66.4322,0.6110
42.9999,63.9422,0.6110
39.4092,60.4812,0.6110
36.7864,56.2392,0.6110
35.2290,51.4962,1.0850
33.9393,46.6652,1.3060
32.6496,41.8352,0.7110
31.3600,37.0042,0.7110
29.6437,32.3202,0.7110
26.8343,28.1992,0.6890
23.0929,24.9022,0.6590
18.6520,22.6332,0.6290
13.7887,21.5262,0.5560
8.8277,20.9022,0.4150
3.8668,20.2782,0.2720
-1.0941,19.6542,0.1450
-6.0551,19.0312,0.0650
-11.0160,18.4072,0.0000


 
对于样条曲线
 
;;Turn off osnap
osmode
0
;;start the 3d polyline command
spline
60.8628,72.8892,0.6110
56.3497,70.7362,0.6110
51.8366,68.5842,0.6110
47.3235,66.4322,0.6110
42.9999,63.9422,0.6110
39.4092,60.4812,0.6110
36.7864,56.2392,0.6110
35.2290,51.4962,1.0850
33.9393,46.6652,1.3060
32.6496,41.8352,0.7110
31.3600,37.0042,0.7110
29.6437,32.3202,0.7110
26.8343,28.1992,0.6890
23.0929,24.9022,0.6590
18.6520,22.6332,0.6290
13.7887,21.5262,0.5560
8.8277,20.9022,0.4150
3.8668,20.2782,0.2720
-1.0941,19.6542,0.1450
-6.0551,19.0312,0.0650
-11.0160,18.4072,0.0000



Phiphi 发表于 2022-7-6 15:49:24

从不使用脚本文件,但会学习并尝试。谢谢你,杰米。PP。

motee-z 发表于 2022-7-6 15:55:45

helo JohnM公司
能否改进lisp以从文件中绘制三维多段线(n x y x)n=点的三维多段线数x y z
谢谢你的努力

uddfl 发表于 2022-7-6 15:59:06

哈哈,我知道你在那里做了什么。上次真的没注意到。
页: [1] 2
查看完整版本: LISP绘制样条线或三维Plin