You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ruby API修改动态组件的坐标轴?

如何通过Ruby API修改动态组件的坐标轴?

嘿,我懂你碰到的这个坎儿——动态组件的坐标轴可不是普通组件那样直接改axes.set()就行的,它们的坐标逻辑是绑定到组件的动态属性上的,直接操作axes对象的话,修改不会被持久化,甚至刷新一下就打回原形了。

给你几个可行的思路和代码示例:

方法一:修改动态组件实例的属性字典

动态组件的坐标轴相关参数(原点、X/Y轴方向)都存在实例的dynamic_attributes属性字典里,咱们直接修改这些属性就能生效:

# 获取选中的动态组件实例
dc_instance = Sketchup.active_model.selection.first
return unless dc_instance.is_a?(Sketchup::ComponentInstance) && dc_instance.definition.get_attribute("dynamic_attributes")

# 获取动态组件的属性字典
dc_attrs = dc_instance.get_attribute("dynamic_attributes")

# 定义你想要设置的原点和轴方向(替换成你需要的坐标/向量)
new_origin = Geom::Point3d.new(0, 0, 0)
new_x_axis = Geom::Vector3d.new(1, 0, 0)
new_y_axis = Geom::Vector3d.new(0, 1, 0)

# 更新动态组件属性
dc_attrs["_origin"] = new_origin.to_s
dc_attrs["_axisX"] = new_x_axis.to_s
dc_attrs["_axisY"] = new_y_axis.to_s

# 刷新视图让修改生效
Sketchup.active_model.active_view.refresh

方法二:修改组件定义的坐标轴(影响所有实例)

如果你想让所有同定义的动态组件实例都同步修改坐标轴,那就去修改组件定义的属性字典:

dc_instance = Sketchup.active_model.selection.first
return unless dc_instance.is_a?(Sketchup::ComponentInstance)

dc_def = dc_instance.definition
dc_def_attrs = dc_def.get_attribute("dynamic_attributes")

# 设置定义级别的坐标轴属性
dc_def_attrs["_origin"] = Geom::Point3d.new(0,0,0).to_s
dc_def_attrs["_axisX"] = Geom::Vector3d.new(1,0,0).to_s
dc_def_attrs["_axisY"] = Geom::Vector3d.new(0,1,0).to_s

# 刷新所有实例和视图
Sketchup.active_model.definitions.purge_unused
Sketchup.active_model.active_view.refresh

为什么你的原代码不生效?

普通组件的axes.set()是直接修改实例的坐标系统,但动态组件的坐标是由它的dynamic_attributes里的_origin、_axisX、_axisY这些参数驱动的——你直接改axes对象,相当于临时覆盖了显示,但动态组件的逻辑会根据属性重新计算坐标,所以刷新后就变回原来的样子了。

备注:内容来源于stack exchange,提问作者Alex bizzon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:23:12