Tharwat,哈哈哈,我想这会限制观众数量。。。现在已设置为公开。 虽然我不是3D用户,但我想这段代码应该可以用,试试吧,让我知道。
注意:我无法用那个动态块打开您的图形,它是在多面网格中打开的。
(vl-load-com)
(defun c:test (/ ss ang i e sn pt)
(if (and (setq ss (ssget "_:L" '((0 . "INSERT"))))
(setq ang (getangle "\n Specify Angle: "))
)
(repeat (setq i (sslength ss))
(setq e (entget (setq sn (ssname ss (setq i (1- i))))))
(setq pt (cdr (assoc 10 e)))
(vla-Rotate3D
(vlax-ename->vla-object sn)
(vlax-3D-point (trans pt 1 0))
(vlax-3D-point (mapcar '+ (trans pt 1 0) '(1. 0. 0.)))
ang
)
)
)
(princ)
) 我建议:
(defun c:bx90r ( / a e i p q r s x )
(setq a (/ pi 2.0))
(if (setq s (ssget "_:L" '((0 . "INSERT"))))
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i)))
x (entget e)
p (trans (cdr (assoc 10 x)) e 0)
r (cdr (assoc 50 x))
q (trans (mapcar '+ (cdr (assoc 10 x)) (list (cos r) (sin r) 0.0)) e 0)
)
(vlax-invoke (vlax-ename->vla-object e) 'rotate3d p q a)
)
)
(princ)
)
(vl-load-com) (princ)
基于图形轴旋转块效果很好,这对于我的问题的第一部分来说是完美的。使用相同的代码位,我编辑了您的代码以在图形Z轴上旋转,但是,当我复制最初插入的块时,它不是使用复制的块插入点,而是使用插入原始块的插入点。
说明:
如果我在0,0,0处插入块
基于插入点复制该块
将其放置在坐标为1,0,0的位置
使用lisp将块旋转90度(测试)
块现在将旋转90度,但坐标为0,1,0
我需要它在旋转90度时保持在0,0,0,这可以实现吗?
(vl-load-com)
(defun c:test (/ ss ang i e sn pt)
(if (and (setq ss (ssget "_:L" '((0 . "INSERT"))))
(setq ang (getangle "\n Specify Angle: "))
)
(repeat (setq i (sslength ss))
(setq e (entget (setq sn (ssname ss (setq i (1- i))))))
(setq pt (cdr (assoc 10 e)))
(vla-Rotate3D
(vlax-ename->vla-object sn)
(vlax-3D-point (trans pt 1 0))
(vlax-3D-point (mapcar '+ (trans pt 1 0) '(0. 0. 1.)))
ang
)
)
)
(princ)
)
我使用多面网格来允许拉伸并最小化文件大小。 我去吃午饭,一切都安排好了。干得好,李。
干杯伙计
谢谢李!该代码适用于基于块x轴围绕其插入点旋转块。你能让它基于块z轴旋转吗?如何提示输入轴“\n指定轴:”?
Tharwat在基于图形UCS旋转块的代码中找到了一些东西——可能是两者的混合。
(vl-load-com)
(defun c:test (/ ss ang i e sn pt)
(if (and (setq ss (ssget "_:L" '((0 . "INSERT"))))
(setq ang (getangle "\n Specify Angle: "))
)
(repeat (setq i (sslength ss))
(setq e (entget (setq sn (ssname ss (setq i (1- i))))))
(setq pt (cdr (assoc 10 e)))
(vla-Rotate3D
(vlax-ename->vla-object sn)
(vlax-3D-point (trans pt 1 0))
(vlax-3D-point (mapcar '+ (trans pt 1 0) '(1. 0. 0.)))
ang
)
)
)
(princ)
)
我不知道这段代码,否则我会尝试编辑它并使其工作。
尝试以下程序:
(defun c:b90r ( / a f i k s )
(setq a (/ pi 2.0))
(if (setq s (ssget "_:L" '((0 . "INSERT"))))
(progn
(initget "X Y Z")
(if (= "Z" (setq k (getkword "\nChoose Block Rotation Axis <X>: ")))
(setq f
(lambda ( l / r )
(setq r (assoc 50 l))
(entmod (subst (cons 50 (+ a (cdr r))) r l))
)
)
(setq f
(lambda ( l / e r )
(setq e (cdr (assoc -1 l))
r (cdr (assoc 50 l))
)
(vlax-invoke (vlax-ename->vla-object e) 'rotate3d
(trans (cdr (assoc 10 l)) e 0)
(trans
(mapcar '+ (cdr (assoc 10 l))
(if (= "Y" k)
(list (- (sin r)) (cos r) 0.0)
(list (cos r) (sin r) 0.0)
)
)
e 0
)
a
)
)
)
)
(repeat (setq i (sslength s))
(f (entget (ssname s (setq i (1- i)))))
)
)
)
(princ)
)
(vl-load-com) (princ)
顺便说一句,Tharwat的代码没有基于活动UCS执行旋转;我可以想象,他的代码将产生一些模糊的结果,因为块插入点是相对于块OCS表示的,然而,在代码中,相对于活动UCS转换为WCS。这将导致仅当活动UCS与OCS平面平行时,程序才会执行相对于WCS X轴的旋转。 谢谢李,你真的很有天赋,我很感激你所做的一切。我的下一个任务是这个周末坐下来,试着破译这个代码并理解它是如何工作的——这可能需要一点时间,但我想理解“如何以及为什么”,并尝试自己编写代码,而不是要求别人为我写些东西。我已经使用AutoCAD 15年了,在编写代码方面涉猎很少;宏、简单的LiSP例程和较小的自定义,但看到这些让我兴奋不已,想了解更多。它开始于我有了一个想法,我写了一些简单的东西,你我的朋友把它带到了一个全新的水平。非常感谢您抽出时间。
页:
1
[2]