tmduk 发表于 2022-7-5 18:16:36

旋转多个对象/te

大家好
 
第一个帖子,它是一个帮助请求(虽然是一个很长时间的潜伏者)
 
我有一个3d绘图,在3d位置有一个水平负载,文本显示高度值。这些都是定向的,在平面图中可读。
 
我想使用3d信息创建一些剖面,我想解决的是操纵横截面(块)和相关文本的最佳方法,以便将其旋转到剖面视图的一侧。(在模型空间中,而不仅仅是在图纸空间视口中)
 
我试过在mass上使用rotate3d命令,但无法得到我想要的结果,基本上它会旋转文本,使其在部分中可读,但当选择多个项目时,它会围绕一个基准旋转整个批次,而不是围绕其自己的插入/对齐点旋转每个项目。
 
https://www.imageupload.co.uk/images/2015/12/10/acadrottxt.jpg
 
在上图中,左边是我从3d中的级别(红色)开始的
 
-接下来是我使用命令rotate3d(白色级别)获得的结果,当一次选中它们时。旋转文字,使其清晰可辨,但已远离三维多段线
 
-右边的2显示了我的目标,已经手动将它们移动到它们的代表点,然后旋转,但是会有很多沿着不同的部分旋转和移动,所以最好让它更自动化一些
 
https://www.imageupload.co.uk/images/2015/12/10/acadrottxt1.jpg
 
https://www.imageupload.co.uk/images/2015/12/10/acadrottxt2.jpg
 
https://www.imageupload.co.uk/images/2015/12/10/acadrottxt4.jpg
 
有什么建议吗?我是不是没有使用rotate3d来充分发挥它的潜力,还是这需要用lisp例程来解决?沿剖面线拾取临时ucs,然后选择要旋转的相对对象
 
提前感谢

marko_ribar 发表于 2022-7-5 18:39:26

您可以尝试首先将UCS设置为所需的平面-您的立面视图,然后可以选择文本实体并在选择集ENT中迭代修改每个210 DXF关联代码,以匹配先前设置为正确三维方向的UCS的法线单位向量。。。

Jef! 发表于 2022-7-5 18:51:13

嗨,tmduk。
 
首先,欢迎来到论坛。
 
如果我理解正确,您希望对所选实体进行三维旋转,但需要文本(或基准块?)在三维旋转后保持朝向同一方向。这不是使用本机rotate3D得到的结果。我通过做一个例行公事成功地做到了这一点。让cad准确地完成您需要的工作,尤其是在您的需求非常具体的情况下,这始终是一种节省时间的好方法。
 
这里是我的建议:我想出的最简单的方法。。。我使用(getpoint)检索旋转轴,然后使用ssget进行选择集。
之后,我使用了if语句。如果它不是块/文本/多行文字,我使用(vla-Rotate3D。如果它是块/文本/多行文字,为了避免处理其接触网的麻烦,我在块/文本/多行文字的插入点上创建了一个临时点,(vla-Rotate3D是临时点,然后检索其坐标属性并使用它更改块/文本/多行文字的插入点(而不是旋转它)。然后我删除了临时点。如果它是一个块,我也会将其同步,以将属性替换回其正确的位置。
很有魅力!
http://s9.postimg.org/5r32mblof/delete.png
 
即使您当前在ucs上,使用trans获取WCS中的坐标也是一件好事,因为您需要将WCS坐标馈送到(vla-Rotate3D)。当然,有必要将p1coord传回以馈送到第二个(getpoint),因为它需要当前ucs中的坐标。
 
这是我写的代码
(defun c:test ( / p1coord p2coord point1 point2 delta obj vlss tmppoint)
;made by Jef! 2015-12-10.
(princ "\nSelect things to rotate")
(if (ssget)
       (progn
         (setq point1 (vlax-3d-point (setq p1coord (trans (getpoint "\nPick 1rst rotation axis point") 1 0)))
               point2 (vlax-3d-point (setq p2coord (trans (getpoint (trans p1coord 0 1) "\nPick 2nd rotation axis point")1 0)))
               delta(mapcar '- p2coord p1coord)
         )
         (vlax-for obj (setq vlss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
            (if (or (eq (vla-get-objectname obj) "AcDbMText")
                      (eq (vla-get-objectname obj) "AcDbText")
                      (eq (vla-get-objectname obj) "AcDbBlockReference")
                  )
                  (progn
                     (setq tmppoint(vlax-ename->vla-object(entmakex (list (cons 0 "POINT") (cons 10 (vlax-get obj 'InsertionPoint))))))
                     (vla-Rotate3D tmppoint point1 point2 (/ pi 2))
                     (vlax-put obj 'InsertionPoint (vlax-get tmppoint 'coordinates))
                     (vla-erase tmppoint)
                     (if (eq (vla-get-objectname obj) "AcDbBlockReference")
                         (vl-cmdf "_.AttSync" "Name" (vla-get-name obj))
                     )
                  )
                  (vla-Rotate3D obj point1 point2 (/ pi 2))
               )
            )
      )
    )
)
我编写了一个90度旋转的代码,它可以被提示询问并应用,而不是(/pi 2)。。。没有错误处理程序,我会给你留下一些乐趣。
 
我希望这有帮助。干杯
杰夫!

tmduk 发表于 2022-7-5 18:52:37

大家好,谢谢大家的快速回复,
 
尝试了你的常规Jef,效果很好,但没有给出我想要的结果。。。
 
为了进一步解释,我希望三维多段线/轮廓保持在三维中的相同位置,文本/块旋转到新方向,但保持相同的插入点。
使用Acad命令rotate3d,围绕一个基线旋转选定的项目,我在绕单个基线旋转元素后,沿着每个剖面线设置的UCS上的同一平面旋转。希望下图能更好地说明这一点
 
http://www.imageupload.co.uk/images/2015/12/11/acadrottxt6.jpg
 
再次感谢您迄今为止的帮助。。。

eldon 发表于 2022-7-5 19:08:54

也许这个线程可能有用

Jef! 发表于 2022-7-5 19:26:36

基于我的第一个例程,我刚刚删除了非块/文本/多行文字对象的旋转。然后,我在if中为text/mtexts/blocks添加了旋转。我没有拾取点,而是获取了它们的原始插入点。当它们围绕我根据自己的“插入点坐标”创建的轴旋转时,我删除了2个手动拾取点。现在,您只需从视图中选择所有项目。所有文本/多行文字和块将围绕x轴上对齐的轴进行3d旋转,并通过各自的插入点。经过几次快速修改,结果就达到了。
 
我还删除了我最后从未使用过的delta变量,也就是vlss变量。我添加了一个错误处理程序,在执行attsync之前,我实际上验证了一个块是否具有属性。没有乐趣留给你。享受
 
(defun c:3rtx ( / *error* obj tmppoint)
;3D rotate texts mtexts and blocks aound an axis aligned
;on the x axis, passing by their individual insertion points.
;made by Jef! 2015-12-11.
(defun *error* ( msg )
       (if (not (member msg '("Function cancelled" "quit / exit abort")))
         (princ (strcat "\nError: " msg))
       )
       (princ)
)
(princ "\nSelect objects to rotate")
(if (ssget)
       (progn
         (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
            (if (or (eq (vla-get-objectname obj) "AcDbMText")
                      (eq (vla-get-objectname obj) "AcDbText")
                      (eq (vla-get-objectname obj) "AcDbBlockReference")
                  )
                  (progn
                     (vla-Rotate3D obj (vlax-3d-point (setq tmppoint (vlax-get obj 'InsertionPoint))) (vlax-3d-point (mapcar '+ tmppoint '(1 0 0))) (/ pi 2))
                     (if (and (eq (vla-get-objectname obj) "AcDbBlockReference")
                              (= (vlax-get-property obj 'HasAttributes) :vlax-true)
                         )
                         (vl-cmdf "_.AttSync" "Name" (vla-get-name obj))
                     )
                  )
               )
            )
      )
   (princ "nothing selected")
    )
(princ)
)
 
附言:我希望你的目标是学习。。。Lisp程序是有趣和强大的。
干杯
杰夫!
页: [1]
查看完整版本: 旋转多个对象/te