乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 30|回复: 5

[编程交流] 旋转多个对象/te

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:16:36 | 显示全部楼层 |阅读模式
大家好
 
第一个帖子,它是一个帮助请求(虽然是一个很长时间的潜伏者)
 
我有一个3d绘图,在3d位置有一个水平负载,文本显示高度值。这些都是定向的,在平面图中可读。
 
我想使用3d信息创建一些剖面,我想解决的是操纵横截面(块)和相关文本的最佳方法,以便将其旋转到剖面视图的一侧。(在模型空间中,而不仅仅是在图纸空间视口中)
 
我试过在mass上使用rotate3d命令,但无法得到我想要的结果,基本上它会旋转文本,使其在部分中可读,但当选择多个项目时,它会围绕一个基准旋转整个批次,而不是围绕其自己的插入/对齐点旋转每个项目。
 

                               
登录/注册后可看大图

 
在上图中,左边是我从3d中的级别(红色)开始的
 
-接下来是我使用命令rotate3d(白色级别)获得的结果,当一次选中它们时。旋转文字,使其清晰可辨,但已远离三维多段线
 
-右边的2显示了我的目标,已经手动将它们移动到它们的代表点,然后旋转,但是会有很多沿着不同的部分旋转和移动,所以最好让它更自动化一些
 

                               
登录/注册后可看大图

 

                               
登录/注册后可看大图

 

                               
登录/注册后可看大图

 
有什么建议吗?我是不是没有使用rotate3d来充分发挥它的潜力,还是这需要用lisp例程来解决?沿剖面线拾取临时ucs,然后选择要旋转的相对对象
 
提前感谢
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:39:26 | 显示全部楼层
您可以尝试首先将UCS设置为所需的平面-您的立面视图,然后可以选择文本实体并在选择集ENT中迭代修改每个210 DXF关联代码,以匹配先前设置为正确三维方向的UCS的法线单位向量。。。
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 18:51:13 | 显示全部楼层
嗨,tmduk。
 
首先,欢迎来到论坛。
 
如果我理解正确,您希望对所选实体进行三维旋转,但需要文本(或基准块?)在三维旋转后保持朝向同一方向。这不是使用本机rotate3D得到的结果。我通过做一个例行公事成功地做到了这一点。让cad准确地完成您需要的工作,尤其是在您的需求非常具体的情况下,这始终是一种节省时间的好方法。
 
这里是我的建议:我想出的最简单的方法。。。我使用(getpoint)检索旋转轴,然后使用ssget进行选择集。
之后,我使用了if语句。如果它不是块/文本/多行文字,我使用(vla-Rotate3D。如果它是块/文本/多行文字,为了避免处理其接触网的麻烦,我在块/文本/多行文字的插入点上创建了一个临时点,(vla-Rotate3D是临时点,然后检索其坐标属性并使用它更改块/文本/多行文字的插入点(而不是旋转它)。然后我删除了临时点。如果它是一个块,我也会将其同步,以将属性替换回其正确的位置。
很有魅力!

                               
登录/注册后可看大图

 
即使您当前在ucs上,使用trans获取WCS中的坐标也是一件好事,因为您需要将WCS坐标馈送到(vla-Rotate3D)。当然,有必要将p1coord传回以馈送到第二个(getpoint),因为它需要当前ucs中的坐标。
 
这是我写的代码
  1. (defun c:test ( / p1coord p2coord point1 point2 delta obj vlss tmppoint)
  2. ;made by Jef! 2015-12-10.
  3.   (princ "\nSelect things to rotate")
  4.   (if (ssget)
  5.        (progn
  6.            (setq point1 (vlax-3d-point (setq p1coord (trans (getpoint "\nPick 1rst rotation axis point") 1 0)))
  7.                  point2 (vlax-3d-point (setq p2coord (trans (getpoint (trans p1coord 0 1) "\nPick 2nd rotation axis point")1 0)))
  8.                  delta  (mapcar '- p2coord p1coord)
  9.            )
  10.            (vlax-for obj (setq vlss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  11.               (if (or (eq (vla-get-objectname obj) "AcDbMText")
  12.                       (eq (vla-get-objectname obj) "AcDbText")
  13.                       (eq (vla-get-objectname obj) "AcDbBlockReference")
  14.                   )
  15.                   (progn
  16.                      (setq tmppoint(vlax-ename->vla-object(entmakex (list (cons 0 "POINT") (cons 10 (vlax-get obj 'InsertionPoint))))))
  17.                      (vla-Rotate3D tmppoint point1 point2 (/ pi 2))
  18.                      (vlax-put obj 'InsertionPoint (vlax-get tmppoint 'coordinates))
  19.                      (vla-erase tmppoint)
  20.                      (if (eq (vla-get-objectname obj) "AcDbBlockReference")
  21.                          (vl-cmdf "_.AttSync" "Name" (vla-get-name obj))
  22.                      )
  23.                   )
  24.                   (vla-Rotate3D obj point1 point2 (/ pi 2))
  25.                )
  26.             )
  27.         )
  28.     )
  29. )

我编写了一个90度旋转的代码,它可以被提示询问并应用,而不是(/pi 2)。。。没有错误处理程序,我会给你留下一些乐趣。
 
我希望这有帮助。干杯
杰夫!
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:52:37 | 显示全部楼层
大家好,谢谢大家的快速回复,
 
尝试了你的常规Jef,效果很好,但没有给出我想要的结果。。。
 
为了进一步解释,我希望三维多段线/轮廓保持在三维中的相同位置,文本/块旋转到新方向,但保持相同的插入点。
使用Acad命令rotate3d,围绕一个基线旋转选定的项目,我在绕单个基线旋转元素后,沿着每个剖面线设置的UCS上的同一平面旋转。希望下图能更好地说明这一点
 

                               
登录/注册后可看大图

 
再次感谢您迄今为止的帮助。。。
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 19:08:54 | 显示全部楼层
也许这个线程可能有用
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 19:26:36 | 显示全部楼层
基于我的第一个例程,我刚刚删除了非块/文本/多行文字对象的旋转。然后,我在if中为text/mtexts/blocks添加了旋转。我没有拾取点,而是获取了它们的原始插入点。当它们围绕我根据自己的“插入点坐标”创建的轴旋转时,我删除了2个手动拾取点。现在,您只需从视图中选择所有项目。所有文本/多行文字和块将围绕x轴上对齐的轴进行3d旋转,并通过各自的插入点。经过几次快速修改,结果就达到了。
 
我还删除了我最后从未使用过的delta变量,也就是vlss变量。我添加了一个错误处理程序,在执行attsync之前,我实际上验证了一个块是否具有属性。没有乐趣留给你。享受
 
  1. (defun c:3rtx ( / *error* obj tmppoint)
  2. ;3D rotate texts mtexts and blocks aound an axis aligned
  3. ;on the x axis, passing by their individual insertion points.
  4. ;made by Jef! 2015-12-11.
  5.   (defun *error* ( msg )
  6.        (if (not (member msg '("Function cancelled" "quit / exit abort")))
  7.            (princ (strcat "\nError: " msg))
  8.        )
  9.        (princ)
  10.   )
  11.   (princ "\nSelect objects to rotate")
  12.   (if (ssget)
  13.        (progn
  14.            (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
  15.               (if (or (eq (vla-get-objectname obj) "AcDbMText")
  16.                       (eq (vla-get-objectname obj) "AcDbText")
  17.                       (eq (vla-get-objectname obj) "AcDbBlockReference")
  18.                   )
  19.                   (progn
  20.                      (vla-Rotate3D obj (vlax-3d-point (setq tmppoint (vlax-get obj 'InsertionPoint))) (vlax-3d-point (mapcar '+ tmppoint '(1 0 0))) (/ pi 2))
  21.                      (if (and (eq (vla-get-objectname obj) "AcDbBlockReference")
  22.                               (= (vlax-get-property obj 'HasAttributes) :vlax-true)
  23.                          )
  24.                          (vl-cmdf "_.AttSync" "Name" (vla-get-name obj))
  25.                      )
  26.                   )
  27.                )
  28.             )
  29.         )
  30.      (princ "nothing selected")
  31.     )
  32.   (princ)
  33. )

 
附言:我希望你的目标是学习。。。Lisp程序是有趣和强大的。
干杯
杰夫!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 19:57 , Processed in 0.583102 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表