Autolisp移动函数
我正在尝试编写一个LISP,它将取点1、2和3的Z维度并对其进行平均,然后使用该平均数移动Z轴上的第四个点(几何空间点)。我主要想把Z值为0的几何空间移动到前三个点的平均“Z”的高度。希望这有意义!以下是我到目前为止得到的信息:
(defun C:za (/ pt1 pt2 pt3 z1 z2 z3 z4 zdev1 ss x1 y1 pta ptb )
(setq pt1 (getpoint "\n Point 1: "))
(setq pt2 (getpoint "\n Point 2: "))
(setq pt3 (getpoint "\n Point 3: "))
(setq z1 (caddr pt1))
(setq z2 (caddr pt2))
(setq z3 (caddr pt3))
(setq zdev1 (/ (+ z1 z2 z3) 3))
(princ (rtos zdev1 2 2))
(setq ss (ssget "_+.:E:S" '((0 . "AECC_COGO_POINT"))))
(setq pta (getpoint "Basepoint: ")) ;;Basepoint of forth point so i can use the X and Y coordinates
(setq x1 (car pt1))
(setq y1 (cadr pt1))
(setq z4 (/ (+ z1 z2 z3) 3))
(setq ptb (x1 y1 zdev1)) ;;trying to add in the averaged Z to set pt2
(command "move" ss "" pt1 pt2)
(princ)
)
请帮忙!
谢谢
约翰
(defun C:za (/ pt1 pt2 pt3 z1 z2 z3 z4 zdev1 ss x1 y1 pta ptb )
(setq pt1 (getpoint "\n Point 1: "))
(setq pt2 (getpoint "\n Point 2: "))
(setq pt3 (getpoint "\n Point 3: "))
(setq z1 (caddr pt1))
(setq z2 (caddr pt2))
(setq z3 (caddr pt3))
(setq zdev1 (/ (+ z1 z2 z3) 3))
(princ (rtos zdev1 2 2))
(setq ss (ssget "_+.:E:S" '((0 . "AECC_COGO_POINT"))))
(setq pta (getpoint "Basepoint: "))
(setq x1 (car pta))
(setq y1 (cadr pta))
;;;(setq z4 (/ (+ z1 z2 z3) 3))
(setq ptb (list x1 y1 zdev1))
(command "move" ss "" pta ptb)
(princ)
)
对不起,我不太清楚。这是我的理解
1.您只想将坐标几何点移动到平均高程?它的x,y位置不变?只有z?
2.只有单程?
3.基点(第4点)不应移动到第5点?
4.pta=x,y的ptb?差值ptb的z=p1、p2、p3的平均值?
尝试一下:
(vl-load-com)
(defun c:MoveCogoToAverageElevation (/ *error* osnapz pt1 pt2 pt3 average acDoc)
(defun *error* (msg)
(and osnapz (setvar 'osnapz osnapz))
(if acDoc
(vla-endundomark acDoc)
)
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** "))) ; Fatal error, display it
)
(princ)
)
(if
(and
(setq osnapz (getvar 'osnapz))
(setvar 'osnapz 0)
(setq pt1 (getpoint "\nSpecify first point: "))
(not (initget 32))
(setq pt2 (getpoint pt1 "\nSpecify second point: "))
(not (initget 32))
(setq pt3 (getpoint pt2 "\nSpecify tertiary point: "))
(princ
(strcat
"\nSelect COGO points to move to "
(rtos
(setq average
(/ (apply
'+
(mapcar (function (lambda (x) (caddr x)))
(list pt1 pt2 pt3)
)
)
3
)
)
2
2
)
" average elevation: "
)
)
(princ)
(ssget "_:L" '((0 . "AECC_COGO_POINT")))
)
(progn
(vla-startundomark
(setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
)
(vlax-for x (vla-get-activeselectionset acDoc)
(vla-put-elevation x average)
)
)
)
(*error* nil)
)
1) 是的
2) 如果你的意思是只选择一个几何空间点,我相信是这样的
3) 第四个点是选择几何空间点的ssget,第五个点是单击几何空间,以便使用其“X”和“Y”坐标
4) 是的 黑匣子,
这太棒了!
谢谢
约翰
不客气,约翰;我很乐意帮忙。
干杯
几何空间点是我们在Civil 3D中使用的东西,它们帮助我们了解地形、识别结构或关键高程,甚至建筑表面。一些属性、方法和事件暴露在LISP中,而另一些则不暴露在LISP中。
如果您可以使用Civil 3D进行测试、编码等,并使用LISP进行编码,那么您会发现vlax Dump对象函数非常有用。如果您使用Civil 3D进行制作,并开始深入研究COM/。NET方面(不仅仅是Visual LISP),那么我还建议您将MgdDbg和SnoopC3D插件添加到工具箱中。
干杯 黑匣子,
我对autolisp很陌生,我注意到您在为我编写的LISP中使用了“vla”。什么是vla?
谢谢
这是一个复杂的问题。
简而言之,LISP通常指提供两种不同的“风格”。。。vanilla LISP(也称为AutoLISP)是AutoCAD附带的原始实现,后来添加了Visual LISP(类似VBA的ActiveX COM API)以扩展功能等。
特别是当你是LISP新手时,这个主题可能会让人困惑,但一旦你掌握了其中的概念,通常很容易建立在。。。VL、VLA、VLAX等前缀之间存在差异,David在这里很好地解释了这一点。
HTH公司 另外,您提到的两个插件的用途是什么。我使用C3D主要用于调查目的(结构布局、竣工等),它们对我有用吗。
页:
[1]
2