将对象添加到新选择中
嘿伙计们,我有一个我一直在做的程序……这是Carry帮我为ProSteel创建的另一个程序的修改版本。
常规背后的理念是,我将能够隐藏或显示具有特定修改类型的ProSteel对象。
例如,如果我想显示模型中所有有钻孔的元素,这个例程将允许我这样做。
我已经设法得到了这个例程的一个合理的工作版本——修改了Carry为另一个练习提供的代码。还有一些需要改进的地方。
我当前的代码是:
(defun c:hxd(/ ss num con ent3A ent3B acadapp shapeinfo HFCs1)
(vl-load-com)
;--------------------------Read Data From Bolt--------------------------------
(prompt "\nSelect ELEMENT:")(princ)
(setq ss (ssget '((0 . "KS_PLATE,KS_SHAPE"))));8=Name Layer 0=ks_object
(setq num (sslength ss));n° object
(setq con 0)
(repeat num
(setq ent3A (ssname ss con))
(setq ent3B ent3A)
(setq acadapp (vlax-get-acad-object))
(setq shapeinfo (vla-getinterfaceobject acadapp "PSCOMWRAPPER.Ks_ComShapeInfo"))
(vlax-invoke-method shapeinfo 'setobject(vlax-ename->vla-object ent3A))
(vlax-invoke-method shapeinfo 'getinfo);ritrova le informazioni nel database
(setq shapeinfo (vla-getinterfaceobject acadApp "PSCOMWRAPPER.Ks_ComShape"))
(setq shapeinfo (vlax-ename->vla-object ent3B))
(setq HFCs1 (vlax-get-property shapeinfo 'HoleFieldCount))
(if (= HFCs1 0)
(command "Ps_Hide" ent3b "")
)
(vlax-release-object shapeinfo)
(setq shapeinfo nil)
(setq acadApp nil)(princ)
(setq con (1+ con))
)
)
虽然上面的这个例程确实执行了我需要的任务,但我想更改如何处理选择集以隐藏/显示。
目前,该代码将识别并隐藏所有没有孔修改的对象-逐个处理选择集。我不想使用这种方法,而是将每个已识别的元素添加到选择集,并一次将它们全部隐藏。我认为需要注意的代码区域以粗体突出显示。在我看来,这可以通过将每个对象添加到选择集来实现,但根据我的理解……我只能添加到已经存在的选择集。我对如何绕过这个障碍知之甚少。
所以,我只是想知道是否有人能帮我想出一个解决这个难题的办法。
任何帮助都将不胜感激。 此添加将从传递给PS\u HIDE命令的所有项目中构建一个选择集;因为我不熟悉这个命令,所以无法进一步调整代码。
...
(setq con 0)
(setq ssetHidenItems (ssadd))
(repeat num
...
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
(command "Ps_Hide" ent3b "")
)
)
... 好极了
非常感谢您抽出时间回复Mircea。我理解当例程包含一些ProSteel函数时,可能很难看到整个画面,但你做到了。
工作代码:
(defun c:hxd(/ ss num con ent3A ent3B acadapp shapeinfo HFCs1 ssetHidenItems)
(vl-load-com)
(prompt "\nSelect ELEMENTS:")(princ)
(setq ss (ssget '((0 . "KS_PLATE,KS_SHAPE"))));8=Name Layer 0=ks_object
(setq num (sslength ss));n° object
(setq con 0)
(setq ssetHidenItems (ssadd))
(repeat num
(setq ent3A (ssname ss con)) ; (entsel "\nSelect BOLT: "))
(setq ent3B ent3A)
(setq acadapp (vlax-get-acad-object))
(setq shapeinfo (vla-getinterfaceobject acadapp "PSCOMWRAPPER.Ks_ComShapeInfo"))
(vlax-invoke-method shapeinfo 'setobject(vlax-ename->vla-object ent3A))
(vlax-invoke-method shapeinfo 'getinfo);ritrova le informazioni nel database
(setq shapeinfo (vla-getinterfaceobject acadApp "PSCOMWRAPPER.Ks_ComShape"))
(setq shapeinfo (vlax-ename->vla-object ent3B))
(setq HFCs1 (vlax-get-property shapeinfo 'HoleFieldCount));HoleFieldCountshape1
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
)
)
(vlax-release-object shapeinfo)
(setq shapeinfo nil)
(setq acadApp nil)(princ)
(setq con (1+ con))
)
(command "Ps_Hide" ssetHidenItems "")
)
工作出色。
再次感谢。 很高兴我能帮上忙!不客气!
一个观察结果是,由于您将一条语句移出了IF评估,因此不再需要PROGN:
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
)
) 别担心Mircea,
你同意移动(命令“Ps\u Hide”ssetHidenItems”)行是正确的做法吗?似乎我把它留在了IF评估中。。。元素仍然被一一隐藏。所以通过将这条线移出IF评估。。。它只允许PS_HIDE命令对“ssetHidenItems”操作一次。
再次感谢您的帮助。 如果PS\u HIDE命令接受选择集作为输入,则最好将其移到循环之外。在内部,它将在每次解析时触发,因此可能很耗时。
它一次处理一个项目的原始代码;如果您将其更改为:
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
(command "Ps_Hide" ssetHidenItems "")
)
)
然后,屏幕上的效果类似,但评估时间可能会增加,因为它必须在一次调用中处理更多项目(每个周期多处理一个项目),甚至有些项目已经隐藏。 理解。谢谢你花时间解释。 这是我的荣幸;很高兴我能帮忙!
页:
[1]