大家好,
我们正在使用高度脚本化的自定义组件,以尽可能简化配置(基于接口连接自动连接信号、根据设置参数化路径等)。
我们注意到,当从目录加载这些模型时,它们的行为符合预期:我们可以按照预期更改组件(如宽度、传感器数量等)。然而,当在3D环境中复制现有模型时,复制的模型无法正确更新。我已将简短的示例视频附在此主题中。
我们想知道从eCat加载模型与在虚拟环境中复制粘贴模型之间有什么区别?唯一可观察到的区别是,在复制粘贴过程中不会显示“正在打开文件”的弹窗。
是否有办法解决此问题,并在复制粘贴过程中“正确”加载我们的模型?
此致,
Boon
开关特性可能无法接受包含空格的属性(如“With Drive”),因此我推测您要么使用了另一个属性来在“开关”特性中更改几何形状(根据“With Drive”的值在脚本中修改),要么是直接在脚本中更改可见性?
如果是这样,您在脚本中把“OnChanged”放在哪里了?或者您能展示脚本中应该发生更改的部分吗?
嗨,Tilma,
感谢您的快速回复!以下是根据您的问题提供的更详细解答:
-
属性名称与开关特性在我们的案例中,我们并未使用“开关特性”(Switch Feature),而是通过脚本直接控制可见性。
-
OnChanged处理器的位置:“With Drive”属性的OnChanged处理器在我们的配置脚本(Configscript)第1576行注册:
if with_drive_prop:
with_drive_prop.OnChanged = onToggleMotor
onToggleMotor(with_drive_prop)
else:
safe_print("Error: 'VDB::With Drive' property not found")
-
变化如何发生:可见性变化发生在第1164行的`onToggleMotor`函数中:
def onToggleMotor(property_object):
"""Toggle motor visibility based on 'With Drive' property."""
if motor_object_to_toggle:
motor_object_to_toggle.Visible = property_object.Value
# Force visual refresh to make changes appear immediately
force_visual_refresh_local()
else:
safe_print("Warning: 'Motor(Transmission)' feature not found")
`motor_object_to_toggle`的定义如下:
motor_object_to_toggle = comp.getFeature("TransformMotor")
此外,一位工程师指出了以下内容:
关于复制粘贴与目录加载的区别:我怀疑问题与脚本初始化时机有关。从目录加载时,完整的初始化流程会执行(属性加载 → 脚本执行 → OnChanged 事件处理程序注册 → OnStart() 调用)。但在复制粘贴操作中,这一流程可能被中断或执行顺序不同,导致某些 OnChanged 事件处理程序未能正确注册或执行。不过这只是我的猜测。
再次感谢您抽出时间,
Boon
你好,我这里也遇到了同样的问题。从Ecat加载我们自定义的组件时,属性更改是正常的。但是,当我们复制组件并粘贴到3D世界中时,复制出来的组件的属性会错误地关联到之前的组件上。
我们该如何解决这个问题?
嗨 nattika,
我们的“解决方案”涉及重新设计组件的构建方式。现在,我们尝试更多地依赖在 Python 脚本中操作从基类继承的现有参数(例如基础传送带)。这样,复制粘贴似乎就能正确运行了。
之前,我们会基于自定义属性来设置组件尺寸等参数。
希望这些信息能有所帮助,尽管这可能不是“标准”答案!
你好!我是BionicBoon,很高兴为你服务!有什么我可以帮助你的吗?
非常感谢您分享这些想法!我不太确定您提到的“继承自基类的现有参数”具体指什么。
在我们的案例中,我们试图更改自定义对象的“文本标签”。第一个对象运行正常,但复制粘贴组件后,新组件的属性仍然链接到第一个组件。
即使选择“使组件唯一”也无济于事。
欢迎大家提出任何建议。