加速代码。使用comman
我正在尝试优化我的代码,这些代码通过许多行元素(代表3D管网)进行解析,这些行元素可能有上万行。为了执行各种任务,我使用ucs命令对齐一些项目(例如块),这些项目需要连接到while循环内的每一行。这大大减少了计算和代码大小,但其缺点是需要相当长的时间(对于2000行的系统,通过命令“.ucs”..和命令“\u insert”..为所有行调用ucs和插入命令需要5分钟)。下面这行是我最常用的(command "_.ucs" "_3p" p1 p2 p3)或
(command "_.ucs" "za" p1 p2)和
然而,对于大型网络,这可能需要大量时间来完成对所有元素的解析。以下代码片段只是某种基准测试,在我的系统上需要22秒才能完成。
为了优化代码,我认为使用vla过程和方法会加快速度。因此,我尝试了以下方法,
使用“命令”调用的经典方法在我的系统上花费了23秒。第二种使用vla方法,需要19。在我看来,重写代码以切换到vla方法(这会增加代码大小和复杂性)是不值得的。
归根结底,使用vl和vla方法而不是对标准autocad命令的命令调用值得吗?你有相同的观点吗?值得听取更有经验的Auto/Visual Lisp程序员/开发人员的意见。
非常感谢。 ucs命令以其速度不足而闻名。。。你需要在不同的ucs工作吗。。。如果你可以在wcs中做一些事情,也许从wcs到虚拟ucs的转换实体会更快一些,也许可以使用(vla transformby)函数和提供的“ucs”的转换矩阵,现在是虚拟的。。。如果需要(trans)或类似的计算,使用矩阵计算也比使用“ucs”命令设置ucs,然后(trans pt 0 1)或(trans pt 1 0)要高效得多;在这种情况下,我建议您搜索我的(transptucs)函数和(transptwcs)函数。。。您可以从此处删除这些子功能,例如:
https://www.theswamp.org/index.php?topic=42773.msg479708#msg479708 谢谢我想解决方案是深入研究点的变换,而不是采取我上面写的任何方向。我相信李在我之前的帖子中为我发布了这个问题的解决方案。谢谢你的代码。我只需要仔细研究一下。22年前,我在向量数学和变换方面所学的知识都没有用完,现在我需要再次坐在学校的板凳上。让我们看看情况如何。。。 好的,学校,但实际上,你不需要比这段代码更多的东西:
(defun c:transform ( / x y z e m )
(vl-load-com)
(setq x (getvar 'ucsxdir))
(setq y (getvar 'ucsydir))
(setq z (trans '(0 0 1) 1 0 t))
(setq e (car (entsel "\nPick entity to transform it from WCS to UCS")))
(setq m (list (list (car x) (car y) (car z) (car (trans '(0 0 0) 1 0))) (list (cadr x) (cadr y) (cadr z) (cadr (trans '(0 0 0) 1 0))) (list (caddr x) (caddr y) (caddr z) (caddr (trans '(0 0 0) 1 0))) '(0.0 0.0 0.0 1.0)))
(vla-transformby (vlax-ename->vla-object e) (vlax-tmatrix m))
(princ)
)
M、 R。 我通常不担心速度,因为迭代次数很小,可以肯定的是,有人讨论过使用entmake来提高速度,也许对于你的命令插入来说,让它成为一个defun。我相信,如果我错了,别人很快就会建议我。任何其他重复的代码行都可以考虑取消它,同样不确定,但由于此代码已经加载到lisp过程中,因此速度应该更快。对于ucs更改,您可以创建新的ucs,只需对其进行更改,注意需要一个名为“myworld”的名称,因为“World”不是直接支持的名称。
; from autodesk
(vl-load-com)
(defun c:Example_ActiveUCS()
;; This example returns the current saved UCS (or saves a new one dynamically)
;; and then sets a new UCS.
;; Finally, it returns the UCS to the previous setting.
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
(setq UCSs (vla-get-UserCoordinateSystems doc))
;; Get the current saved UCS of the active document. If the current UCS is
;; not saved, then add a new UCS to the UserCoordinateSystems collection
(if (= (vlax-variant-value (vla-GetVariable doc "UCSNAME")) "")
(progn
(setq utility (vla-get-Utility doc))
(setq currUCS (vla-Add UCSs
(vla-GetVariable doc "UCSORG")
(vla-TranslateCoordinates utility (vla-GetVariable doc "UCSXDIR") acUCS acWorld :vlax-false)
(vla-TranslateCoordinates utility (vla-GetVariable doc "UCSYDIR") acUCS acWorld :vlax-false)
"OriginalUCS"
)
)
)
(setq currUCS (vla-get-ActiveUCS doc));; current UCS is saved
)
(alert (strcat "The current UCS is " (vla-get-Name currUCS)))
;; Create a UCS and make it current
(setq origin (vlax-3d-point 0 0 0)
xAxis (vlax-3d-point 1 1 0)
yAxis (vlax-3d-point -1 1 0))
(setq newUCS (vla-Add UCSs origin xAxis yAxis "TestUCS"))
(vla-put-ActiveUCS doc newUCS)
(alert (strcat "The new UCS is " (vla-get-Name newUCS)))
;; Restore the previous UCS
(vla-put-ActiveUCS doc currUCS)
(alert (strcat "The UCS is restored to " (vla-get-Name currUCS)))
)
我使用了块的“entmake”而不是insert,并且确实工作得更快。然而,当我意识到“entmake”不考虑活动ucs方向,并且插入仅针对WCS时,我退出了使用它。这意味着我需要在之后开始在3D中旋转。通过使用insert命令,这不是问题。然而,这是懒惰的方式。就挽救UCS而言,我认为我的问题本质上没有任何好处。网络可以有任何3D形式,每条线只处理一次。当然,许多线有相同的方向,但我必须再次从一个ucs转换到另一个ucs等。
我认为我的问题的解决方案是简单地使用一个且唯一的WCS,将我的所有块插入到具有默认方向的各个点,然后使用这些函数平移块所附着的线上的一些点,并旋转块以使其处于正确的方向。
顺便说一句,我在使用entmake时使用了下面的代码段。看来我第一次用不了它,其余的都用不了了。
有没有一种方法可以在我第一次遇到的情况下使用entmake? MJLM,
请注意,如果要entmake属性块引用,也必须entmake其属性引用,
因此,如果在块定义中有带“TAG1”和“TAG2”的定位属性定义,则该片段将如下所示:
8
我不记得哪些是强制的“ATTRIB”组码,所以你可能想在这里检查一下。
我想最好编写一个泛型(_VanillaInsert)函数,检查“块”定义中的“ATTDEF”,并自动生成插入的“ATTRIB”-s。[很遗憾,我没有时间玩这个] 非常感谢。我知道这一点。然而,在这种情况下,所有块都没有属性。这仅适用于视觉表示(二维到三维体积表示模型)。
目前,我正试图找出必要的点来定义三维旋转轴,以对齐插入的块。我可能会回来。 并不是说它不尊重活动ucs,它只是在WCS坐标旋转后工作,或者使用insert命令要么步骤太多,要么速度太慢。这就像把圆木绑在一起,做成一个木筏,在桥旁边过河。在UCS中有坐标,在WCS中需要坐标,只需使用trans函数
我随机放置了一个点。在WCS中,这是坐标
现在我更改UCS,并随机单击。Getpoint返回当前UCS中的一个点,仍然可以用于为WCS中的任何函数(如Entmake)提供坐标,
直接在需要的地方进行Entmaking,立即正确定位很容易,而且比使用insert或必须插入、计算点以定义三维旋转轴、计算矩阵、应用矩阵或更糟的是,使用三维旋转命令更快。外观Trans
干杯
你能详细说明一下吗?请看下面的图片。让我们假设红线是插入到与白线接触处的块。块的方向需要如图所示,与白线对齐。插入点以及块需要旋转的三个角度都是已知的。如果不使用对标准Autocad命令的命令调用,我如何实现这一点?我找到的唯一方法是使用Lee Mac的例程“rotateobject”(我的帖子6中的链接),但这需要定义一个轴,我在定义一个垂直于白线定义的平面并垂直于xy平面的轴时遇到了问题。另外两个旋转很容易,一个绕z旋转,一个绕白线旋转。
任何帮助都将不胜感激。
第一张图片和第二张相同。为了更容易理解模型的方向,我只从不同的角度包括了两个。
页:
[1]
2