BionicBoon 2025年9月4日 下午12:521
大家好,
我们正在使用大量脚本化的自定义组件,以尽可能简化配置(基于接口连接自动连接信号、基于设置的参数化路径等)。
我们注意到,当从我们的目录加载这些模型时,它们的行为符合预期:我们可以根据期望更改组件(如宽度、传感器数量等)。然而,当我们在 3D 环境中复制现有模型时,复制的模型无法正确更新。我在此帖中附上了一段简短视频作为示例。
我们想知道从 eCat 加载模型与在虚拟环境中复制粘贴模型有什么区别?唯一可观察到的区别是,复制粘贴期间不会弹出“打开文件”的弹窗。
有没有办法解决这个问题,并在复制粘贴期间“正确”加载我们的模型?
诚挚问候,
Boon
Tilma 2025年9月4日 下午3:332
Switch Feature 可能不接受像“With Drive”这样带空格的属性名称,所以我猜想您要么有另一个属性用于在“Switch”功能中更改几何体(您根据“With Drive”的值在脚本中更改该属性),要么您直接在脚本中更改可见性?
如果是这样,您将“OnChanged”放在脚本中的什么位置?或者您可以向我们展示应该发生更改的那部分脚本吗?
BionicBoon 2025年9月5日 上午7:183
你好 Tilma,
感谢您的快速回复!根据您的问题,以下是更详细的回答:
-
属性名称和 Switch Feature:在我们的案例中,我们没有使用 Switch Feature,而是直接通过脚本控制可见性。
-
OnChanged 处理程序的位置:在 Configscript 的第 1576 行,我们注册了“With Drive”属性的 OnChanged 处理程序:
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
nattika 2025年11月10日 下午7:294
你好,我在这里遇到了同样的问题。从 eCat 加载我们自定义的组件时,属性更改工作正常。但是,当我们复制组件并粘贴到 3D 世界中时,复制组件的属性错误地链接到了前一个组件。
我们该如何解决这个问题?
BionicBoon 2025年11月11日 上午7:565
你好 nattika,
我们的“解决方案”涉及重新设计我们构建组件的方式。现在,我们尝试更多地依赖从 Python 脚本中的基类继承的现有参数(例如,一个基本的输送机)。这样,复制粘贴似乎可以正常工作。
以前,我们会创建自己的属性,然后根据这些属性设置组件大小等。
希望这对你有帮助,尽管这可能不是“正确”的答案!
nattika 2025年11月12日 上午5:236
你好 BionicBoon,
非常感谢您分享想法!我不太明白您说的“从基类继承的现有参数”是什么意思。
在我们的案例中,我们试图更改自定义对象的“文本标签”。第一个对象工作正常,但复制粘贴一个组件后,新组件的属性仍然链接到第一个组件。
即使选择“使组件唯一”也无济于事。
欢迎任何人提出任何建议