乐筑天下

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

[编程交流] 加速代码。使用comman

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 15:56:41 | 显示全部楼层 |阅读模式
我正在尝试优化我的代码,这些代码通过许多行元素(代表3D管网)进行解析,这些行元素可能有上万行。为了执行各种任务,我使用ucs命令对齐一些项目(例如块),这些项目需要连接到while循环内的每一行。这大大减少了计算和代码大小,但其缺点是需要相当长的时间(对于2000行的系统,通过命令“.ucs”..和命令“\u insert”..为所有行调用ucs和插入命令需要5分钟)。下面这行是我最常用的
 
  1. (command "_.ucs" "_3p" p1 p2 p3)

  1. (command "_.ucs" "za" p1 p2)

然而,对于大型网络,这可能需要大量时间来完成对所有元素的解析。以下代码片段只是某种基准测试,在我的系统上需要22秒才能完成。
 
为了优化代码,我认为使用vla过程和方法会加快速度。因此,我尝试了以下方法,
 
使用“命令”调用的经典方法在我的系统上花费了23秒。第二种使用vla方法,需要19。在我看来,重写代码以切换到vla方法(这会增加代码大小和复杂性)是不值得的。
 
归根结底,使用vl和vla方法而不是对标准autocad命令的命令调用值得吗?你有相同的观点吗?值得听取更有经验的Auto/Visual Lisp程序员/开发人员的意见。
 
非常感谢。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:04:12 | 显示全部楼层
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
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 16:05:27 | 显示全部楼层
谢谢我想解决方案是深入研究点的变换,而不是采取我上面写的任何方向。我相信李在我之前的帖子中为我发布了这个问题的解决方案。谢谢你的代码。我只需要仔细研究一下。22年前,我在向量数学和变换方面所学的知识都没有用完,现在我需要再次坐在学校的板凳上。让我们看看情况如何。。。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:08:53 | 显示全部楼层
好的,学校,但实际上,你不需要比这段代码更多的东西:
 
  1. (defun c:transform ( / x y z e m )
  2. (vl-load-com)
  3. (setq x (getvar 'ucsxdir))
  4. (setq y (getvar 'ucsydir))
  5. (setq z (trans '(0 0 1) 1 0 t))
  6. (setq e (car (entsel "\nPick entity to transform it from WCS to UCS")))
  7. (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)))
  8. (vla-transformby (vlax-ename->vla-object e) (vlax-tmatrix m))
  9. (princ)
  10. )

 
M、 R。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:15:27 | 显示全部楼层
我通常不担心速度,因为迭代次数很小,可以肯定的是,有人讨论过使用entmake来提高速度,也许对于你的命令插入来说,让它成为一个defun。我相信,如果我错了,别人很快就会建议我。任何其他重复的代码行都可以考虑取消它,同样不确定,但由于此代码已经加载到lisp过程中,因此速度应该更快。对于ucs更改,您可以创建新的ucs,只需对其进行更改,注意需要一个名为“myworld”的名称,因为“World”不是直接支持的名称。
 
  1. ; from autodesk
  2. (vl-load-com)
  3. (defun c:Example_ActiveUCS()
  4.    ;; This example returns the current saved UCS (or saves a new one dynamically)
  5.    ;; and then sets a new UCS.
  6.    ;; Finally, it returns the UCS to the previous setting.
  7.    (setq acadObj (vlax-get-acad-object))
  8.    (setq doc (vla-get-ActiveDocument acadObj))
  9.    (setq UCSs (vla-get-UserCoordinateSystems doc))
  10.    ;; Get the current saved UCS of the active document. If the current UCS is
  11.    ;; not saved, then add a new UCS to the UserCoordinateSystems collection
  12.    (if (= (vlax-variant-value (vla-GetVariable doc "UCSNAME")) "")
  13.        (progn
  14.            (setq utility (vla-get-Utility doc))
  15.            (setq currUCS (vla-Add UCSs
  16.                                   (vla-GetVariable doc "UCSORG")
  17.                                   (vla-TranslateCoordinates utility (vla-GetVariable doc "UCSXDIR") acUCS acWorld :vlax-false)
  18.                                   (vla-TranslateCoordinates utility (vla-GetVariable doc "UCSYDIR") acUCS acWorld :vlax-false)
  19.                                   "OriginalUCS"
  20.                                        )
  21.            )
  22.        )
  23.        (setq currUCS (vla-get-ActiveUCS doc))  ;; current UCS is saved
  24.    )
  25.    
  26.    (alert (strcat "The current UCS is " (vla-get-Name currUCS)))
  27.    
  28.    ;; Create a UCS and make it current
  29.    (setq origin (vlax-3d-point 0 0 0)
  30.          xAxis (vlax-3d-point 1 1 0)
  31.          yAxis (vlax-3d-point -1 1 0))
  32.    (setq newUCS (vla-Add UCSs origin xAxis yAxis "TestUCS"))
  33.    (vla-put-ActiveUCS doc newUCS)
  34.    (alert (strcat "The new UCS is " (vla-get-Name newUCS)))
  35.    
  36.    ;; Restore the previous UCS
  37.    (vla-put-ActiveUCS doc currUCS)
  38.    (alert (strcat "The UCS is restored to " (vla-get-Name currUCS)))
  39. )
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 16:15:44 | 显示全部楼层
我使用了块的“entmake”而不是insert,并且确实工作得更快。然而,当我意识到“entmake”不考虑活动ucs方向,并且插入仅针对WCS时,我退出了使用它。这意味着我需要在之后开始在3D中旋转。通过使用insert命令,这不是问题。然而,这是懒惰的方式。就挽救UCS而言,我认为我的问题本质上没有任何好处。网络可以有任何3D形式,每条线只处理一次。当然,许多线有相同的方向,但我必须再次从一个ucs转换到另一个ucs等。
 
我认为我的问题的解决方案是简单地使用一个且唯一的WCS,将我的所有块插入到具有默认方向的各个点,然后使用这些函数平移块所附着的线上的一些点,并旋转块以使其处于正确的方向。
 
顺便说一句,我在使用entmake时使用了下面的代码段。看来我第一次用不了它,其余的都用不了了。
 
有没有一种方法可以在我第一次遇到的情况下使用entmake?
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:19:43 | 显示全部楼层
MJLM,
请注意,如果要entmake属性块引用,也必须entmake其属性引用,
因此,如果在块定义中有带“TAG1”和“TAG2”的定位属性定义,则该片段将如下所示:
 
  1. 8

 
我不记得哪些是强制的“ATTRIB”组码,所以你可能想在这里检查一下。
我想最好编写一个泛型(_VanillaInsert)函数,检查“块”定义中的“ATTDEF”,并自动生成插入的“ATTRIB”-s。[很遗憾,我没有时间玩这个]
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 16:25:50 | 显示全部楼层
非常感谢。我知道这一点。然而,在这种情况下,所有块都没有属性。这仅适用于视觉表示(二维到三维体积表示模型)。
 
目前,我正试图找出必要的点来定义三维旋转轴,以对齐插入的块。我可能会回来。
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:30:08 | 显示全部楼层
并不是说它不尊重活动ucs,它只是在WCS坐标旋转后工作,或者使用insert命令要么步骤太多,要么速度太慢。这就像把圆木绑在一起,做成一个木筏,在桥旁边过河。在UCS中有坐标,在WCS中需要坐标,只需使用trans函数
 
我随机放置了一个点。在WCS中,这是坐标
现在我更改UCS,并随机单击。Getpoint返回当前UCS中的一个点,仍然可以用于为WCS中的任何函数(如Entmake)提供坐标,
 
直接在需要的地方进行Entmaking,立即正确定位很容易,而且比使用insert或必须插入、计算点以定义三维旋转轴、计算矩阵、应用矩阵或更糟的是,使用三维旋转命令更快。外观Trans
 
干杯
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 16:33:48 | 显示全部楼层
 
你能详细说明一下吗?请看下面的图片。让我们假设红线是插入到与白线接触处的块。块的方向需要如图所示,与白线对齐。插入点以及块需要旋转的三个角度都是已知的。如果不使用对标准Autocad命令的命令调用,我如何实现这一点?我找到的唯一方法是使用Lee Mac的例程“rotateobject”(我的帖子6中的链接),但这需要定义一个轴,我在定义一个垂直于白线定义的平面并垂直于xy平面的轴时遇到了问题。另外两个旋转很容易,一个绕z旋转,一个绕白线旋转。
 
任何帮助都将不胜感激。
 
第一张图片和第二张相同。为了更容易理解模型的方向,我只从不同的角度包括了两个。
165645fo5jf9o8os6269zz.png
 
 
165647v77t1suatrnrb7bb.png
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:08 , Processed in 1.471061 second(s), 74 queries .

© 2020-2025 乐筑天下

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