我在hmsilva的代码中添加了while函数,效果很好
(defun c:demo (/ old_osm p1 p2)
(setq old_osm (getvar 'OSMODE))
(while (princ "\nSelect objects to align: ")
(setvar 'OSMODE 512)
(if (and (setq ss (ssget "_:L"))
(setq p1 (getpoint "\nSelect source line: "))
(setq p2 (getpoint "\nSelect destination line: "))
)
(progn
(setvar 'OSMODE 0)
(command "ROTATE" ss "" "APP" p1 p2 "R" "APP" p1 p2 p1 p2)
(setvar 'OSMODE old_osm)
)
)
(setvar 'OSMODE old_osm)
)
(princ)
)
唯一的问题是,它很少将图片中最上面的“大而复杂的对象1”与“大而复杂的对象2”对齐。无论如何,对于普通的ALIGN命令,总共需要24次单击才能得到我们尝试执行的结果,只需8次单击!
编辑:很抱歉第一张图片中的示例(使用ALIGN命令执行对齐更容易,需要更少的点击),请参阅第二张图片上的示例任务(其中没有任何内容在同一角度上)
当你有五个物体看起来像图像中最右边的物体,然后你需要返回并对齐其中的四个时,你会做什么工作? 我同意这比使用align命令快,但这不是align-它实际上是“旋转以对齐”命令。。。
编辑消息:
你必须考虑到你的工作图纸中没有这些矩形-你必须创建它们,我也有一个问题:这是什么样的图纸(没有这些矩形)?您的实体是否分散在中心矩形周围并具有可变旋转?也许我错了,但如果要对齐的矩形表示外部参照,那么将它们的旋转设置为0.0以与X轴对齐,然后沿X轴对它们进行阵列以使图形对齐不是更合适。。。
城市规划和设计,或以不同的旋转方式处理包含不同对象的旧扫描图纸,或绘制必须与现有对象对齐成斜线的正交形状和形式。
http://wiki.openstreetmap.org/w/images/f/fa/Cadastre-Style-Hausen-adZ.svg
无论它如何调用或如何工作,关键是用户的任务和最终结果,以使生活更轻松。
编辑:重点不是这是什么样的绘图,重点是当你有重复的任务绘制一些东西,并在其他东西上执行每次对齐时会发生什么。老实说,由于用户的任务,我更多地跳过了ALIGN命令,而使用了随参考角度旋转,这对我来说没有那么烦人。但这个Lisp程序消除了点击点的所有痛苦。 根据你的链接,你是在告诉我你必须使用“旋转以对齐”命令而不是“对齐”命令或只是“旋转”来旋转图纸中的这些房屋吗?你的图纸完全显示了现实生活中的情况-你不必进行精确的旋转对齐-根据街道网络,你做得大致正确。。。你不需要这个例行程序,只需要清晰的视野和“旋转”命令。。。若你们的图纸是详细的,那个么你们的房子图纸应该根据房子的主要街道边缘和X轴对齐来定位。。。 你说得对,但我通常会寻求某种精度。我的第一个目标是通过lisp将Revit中的一些二维命令实现到AutoCAD中。我删除了创建此帖子后的第一条消息,以便人们阅读它时简短明了,并为我获得有关我正在询问的lisp的一些答案。遗憾的是,与CAD软件相比,BIM软件在二维绘图方面具有优势。但也许有一天Autodesk会说“嘿,让我们也在AutoCAD中内置这些选项吧”。 高Grrr
这个简单的例程仅用于测试目的,没有错误陷阱。
到目前为止,它适用于多段线,可以适用于直线,但如果您的“复杂对象”是块,则编写代码会更困难。
观看此视频可以根据拾取的点查看不同的结果。
(源对象上最近的顶点是第一个对齐点;同一线段上的另一个顶点是第二个对齐点等)
[编辑:gif已删除。]
(defun c:al2p ( / ss e1 e2 l1 l2 p1)
(if
(and
(setq ss (ssget ":L"))
(setq e1 (entsel "\nSelect source object: "))
(setq e2 (entsel "\nSelect destination object: "))
)
(progn
(setq l1 (get_ends e1)
l2 (get_ends e2)
)
(command "_align" ss ""
"_non" (carl1)
"_non" (carl2)
"_non" (cadr l1)
"_non" (cadr l2)
"" "_n"
)
;;; (if
;;; (setq p1 (getpoint "\nSpecify base point to move objects or press Enter to exit: "))
;;; (progn
;;; (command "_move" ss "" "_non" p1)
;;; (while (> (getvar 'cmdactive) 0) (command pause))
;;; )
;;; )
)
)
(princ)
)
(defun get_ends (e / o p p1 p2)
(setq o (car e)
p (vlax-curve-getparamatpoint o
(vlax-curve-getclosestpointto o (cadr e))
)
p1 (fix p)
p2 (1+ p1)
)
(if (> (- p2 p) (- p p1))
(list
(vlax-curve-getpointatparam o p1)
(vlax-curve-getpointatparam o p2)
)
(list
(vlax-curve-getpointatparam o p2)
(vlax-curve-getpointatparam o p1)
)
)
)
如果您正在绘制这些对象(例如街道平面上的房屋),那么首先旋转十字光标或UCS是否更有意义,这样就不需要使用“对齐”命令了。似乎您使用了错误的技术,并要求使用lisp例程来修复您创建的问题,而不是使用正确的技术。在我的CAD生涯中,我在各种不同的学科中绘制了很多很多图形,但我很少需要使用align命令。 我可能会使用带引用的Rotate。
我不知道为什么强调保存点击。我使用了一个默认设置为“在左边拾取,在右边返回”的两键鼠标,可以非常快速地进行操作。也许有一个医学原因可以节省点击次数。 我认为对“快速对齐”的需求可能足够公平。根据用于创建这些平面的方法,首先旋转UCS可能不是最简单的选项。例如,如果道路移动,您可能需要一种简单的方法来移动/重新对齐房屋以适应新道路。或者,如果你在平面图周围复制相同的房子/建筑块,最好是快速将每个新的块与其周围环境的方向相匹配。
页:
1
[2]