lamensterms 发表于 2022-7-6 06:32:25

将对象添加到新选择中

嘿伙计们,
 
我有一个我一直在做的程序……这是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))
)
)
 
虽然上面的这个例程确实执行了我需要的任务,但我想更改如何处理选择集以隐藏/显示。
 
目前,该代码将识别并隐藏所有没有孔修改的对象-逐个处理选择集。我不想使用这种方法,而是将每个已识别的元素添加到选择集,并一次将它们全部隐藏。我认为需要注意的代码区域以粗体突出显示。在我看来,这可以通过将每个对象添加到选择集来实现,但根据我的理解……我只能添加到已经存在的选择集。我对如何绕过这个障碍知之甚少。
 
所以,我只是想知道是否有人能帮我想出一个解决这个难题的办法。
 
任何帮助都将不胜感激。

MSasu 发表于 2022-7-6 06:43:15

此添加将从传递给PS\u HIDE命令的所有项目中构建一个选择集;因为我不熟悉这个命令,所以无法进一步调整代码。
...
(setq con 0)
(setq ssetHidenItems (ssadd))
(repeat num
...
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
(command "Ps_Hide" ent3b "")
)
)
...

lamensterms 发表于 2022-7-6 06:50:38

好极了
 
非常感谢您抽出时间回复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 "")
)
 
工作出色。
 
再次感谢。

MSasu 发表于 2022-7-6 07:00:54

很高兴我能帮上忙!不客气!
 
一个观察结果是,由于您将一条语句移出了IF评估,因此不再需要PROGN:
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
)
)

lamensterms 发表于 2022-7-6 07:10:10

别担心Mircea,
 
你同意移动(命令“Ps\u Hide”ssetHidenItems”)行是正确的做法吗?似乎我把它留在了IF评估中。。。元素仍然被一一隐藏。所以通过将这条线移出IF评估。。。它只允许PS_HIDE命令对“ssetHidenItems”操作一次。
 
再次感谢您的帮助。

MSasu 发表于 2022-7-6 07:18:47

如果PS\u HIDE命令接受选择集作为输入,则最好将其移到循环之外。在内部,它将在每次解析时触发,因此可能很耗时。
它一次处理一个项目的原始代码;如果您将其更改为:
(if (= HFCs1 0)
(progn
(setq ssetHidenItems (ssadd ent3b ssetHidenItems))
(command "Ps_Hide" ssetHidenItems "")
)
)
然后,屏幕上的效果类似,但评估时间可能会增加,因为它必须在一次调用中处理更多项目(每个周期多处理一个项目),甚至有些项目已经隐藏。

lamensterms 发表于 2022-7-6 07:32:05

理解。谢谢你花时间解释。

MSasu 发表于 2022-7-6 07:38:03

这是我的荣幸;很高兴我能帮忙!
页: [1]
查看完整版本: 将对象添加到新选择中