Tharwat 发表于 2022-7-6 07:05:38

你的视频是私人的,不能公开观看悬念

dortega4269 发表于 2022-7-6 07:09:06

 
Tharwat,哈哈哈,我想这会限制观众数量。。。现在已设置为公开。

Tharwat 发表于 2022-7-6 07:14:38

虽然我不是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)
)

Lee Mac 发表于 2022-7-6 07:17:11

我建议:

(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)

dortega4269 发表于 2022-7-6 07:19:26

 
基于图形轴旋转块效果很好,这对于我的问题的第一部分来说是完美的。使用相同的代码位,我编辑了您的代码以在图形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)
)
 
 
我使用多面网格来允许拉伸并最小化文件大小。

alanjt 发表于 2022-7-6 07:22:48

我去吃午饭,一切都安排好了。干得好,李。

Lee Mac 发表于 2022-7-6 07:26:56

 
干杯伙计

dortega4269 发表于 2022-7-6 07:27:44

 
谢谢李!该代码适用于基于块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)
)
 
我不知道这段代码,否则我会尝试编辑它并使其工作。

Lee Mac 发表于 2022-7-6 07:31:06

 
尝试以下程序:

(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轴的旋转。

dortega4269 发表于 2022-7-6 07:35:53

谢谢李,你真的很有天赋,我很感激你所做的一切。我的下一个任务是这个周末坐下来,试着破译这个代码并理解它是如何工作的——这可能需要一点时间,但我想理解“如何以及为什么”,并尝试自己编写代码,而不是要求别人为我写些东西。我已经使用AutoCAD 15年了,在编写代码方面涉猎很少;宏、简单的LiSP例程和较小的自定义,但看到这些让我兴奋不已,想了解更多。它开始于我有了一个想法,我写了一些简单的东西,你我的朋友把它带到了一个全新的水平。非常感谢您抽出时间。
页: 1 [2]
查看完整版本: 在插入器上旋转动态块