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

SketchUp Ruby API中add_3d_text使用报错及动态文本实现咨询

解答:SketchUp Ruby API文本标注与组件计数问题

1. 解决TypeError错误

你遇到的TypeError: no implicit conversion to float from false核心原因是**add_3d_text不支持多行文本(\n换行符)**,同时参数传递需严格匹配API规范。

关键修正点:

  • 移除文本中的换行符,add_3d_text仅支持单行字符串
  • 对齐方式常量需明确指定Sketchup命名空间(如Sketchup::TextAlignLeft)
  • 确保所有数值参数(高度、挤出深度等)为浮点型或长度类型

2. add_3d_text的正确使用方式

遵循SketchUp 2023 API的参数顺序,调用示例:

entities.add_3d_text(
  "单行文本内容",
  Sketchup::TextAlignLeft, # 对齐方式:Left/Center/Right
  "Arial",                 # 字体名称
  false,                   # 是否粗体
  false,                   # 是否斜体
  10.0,                    # 文本高度
  0.0,                     # 挤出深度(0则为平面文本)
  false,                   # 是否居中定位
  Geom::Point3d.new(10,0,0), # 定位点
  0.degrees                # 旋转角度(可选,默认0度)
)

修正后的完整代码

# 初始化计数器
enkeltreol_count = 0
dobbeltreol_count = 0

model = Sketchup.active_model
model.start_operation('Add Count Text', true)

# 递归遍历所有实体,统计组件实例(含嵌套)
def traverse_entities(entities, count_map)
  entities.each do |ent|
    if ent.is_a?(Sketchup::ComponentInstance)
      name = ent.definition.name
      count_map["Enkeltreol"] += 1 if name == "Enkeltreol"
      count_map["Dobbeltreol"] += 1 if name == "Dobbeltreol"
    elsif ent.is_a?(Sketchup::Group)
      traverse_entities(ent.entities, count_map)
    end
  end
end

count_map = {"Enkeltreol" => 0, "Dobbeltreol" => 0}
traverse_entities(model.active_entities, count_map)
enkeltreol_count = count_map["Enkeltreol"]
dobbeltreol_count = count_map["Dobbeltreol"]

total_shelf_units = enkeltreol_count + (dobbeltreol_count * 2)

# 拆分多行文本为多个单行3D文本,分别定位
entities = model.active_entities
base_point = Geom::Point3d.new(10, 0, 0)
line_height = 12.0 # 行间距

# 第一行文本
text1 = "Enkeltreol units: #{enkeltreol_count}"
entities.add_3d_text(text1, Sketchup::TextAlignLeft, "Arial", false, false, 10.0, 0.0, false, base_point, 0.degrees)

# 第二行文本(向下偏移)
point2 = Geom::Point3d.new(base_point.x, base_point.y - line_height, base_point.z)
text2 = "Dobbeltreol units: #{dobbeltreol_count}"
entities.add_3d_text(text2, Sketchup::TextAlignLeft, "Arial", false, false, 10.0, 0.0, false, point2, 0.degrees)

# 第三行文本
point3 = Geom::Point3d.new(base_point.x, base_point.y - line_height*2, base_point.z)
text3 = "Total shelf units: #{total_shelf_units}"
entities.add_3d_text(text3, Sketchup::TextAlignLeft, "Arial", false, false, 10.0, 0.0, false, point3, 0.degrees)

model.commit_operation
puts "计数文本已添加到模型中。"

3. 动态显示文本信息的其他方法

除了add_3d_text,还可以使用以下更灵活的方式:

  • 2D文本标注:使用entities.add_text创建平面文本,支持多行内容,更适合信息展示:
    # 创建多行2D文本
    text_content = "Enkeltreol units: #{enkeltreol_count}\nDobbeltreol units: #{dobbeltreol_count}\nTotal shelf units: #{total_shelf_units}"
    entities.add_text(text_content, base_point, Geom::Vector3d.new(0,0,1))
    
  • 动态组件集成:将计数存储到组件的属性字典(attribute_dictionary)中,结合动态组件的公式实现实时更新
  • 组内批量管理:创建一个空组,将所有文本实体添加到组内,方便统一移动和编辑

内容的提问来源于stack exchange,提问作者Karl Fredrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:50:58