如何通过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
相关产品推荐
相关产品推荐

