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
相关产品推荐
相关产品推荐

