旋转多个对象/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,然后选择要旋转的相对对象
提前感谢 您可以尝试首先将UCS设置为所需的平面-您的立面视图,然后可以选择文本实体并在选择集ENT中迭代修改每个210 DXF关联代码,以匹配先前设置为正确三维方向的UCS的法线单位向量。。。 嗨,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)。。。没有错误处理程序,我会给你留下一些乐趣。
我希望这有帮助。干杯
杰夫! 大家好,谢谢大家的快速回复,
尝试了你的常规Jef,效果很好,但没有给出我想要的结果。。。
为了进一步解释,我希望三维多段线/轮廓保持在三维中的相同位置,文本/块旋转到新方向,但保持相同的插入点。
使用Acad命令rotate3d,围绕一个基线旋转选定的项目,我在绕单个基线旋转元素后,沿着每个剖面线设置的UCS上的同一平面旋转。希望下图能更好地说明这一点
http://www.imageupload.co.uk/images/2015/12/11/acadrottxt6.jpg
再次感谢您迄今为止的帮助。。。 也许这个线程可能有用 基于我的第一个例程,我刚刚删除了非块/文本/多行文字对象的旋转。然后,我在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]