将实体添加到实体集合?

时间:2012-05-17 03:36:30

标签: ruby sketchup

https://developers.google.com/sketchup/docs/ourdoc/entities

我想在实体集合中添加一个实体数组,但实体集合(正如您在参考文献中看到的那样)要求我按类型添加它们,即。 entities.add_edge()。对于一系列混合类型,最好的方法是什么?

这是一个片段 - 第二行是无效的(通用.add不存在)

layers.each do |layer|
    layerEnts = []
    entities.each { |e| layerEnts << e if layer == (e.layer) }
    layerGroup = entities.add_group
    layerGroup.name = layer.name
    layerGroup.entities.add(layerEnts)
end

2 个答案:

答案 0 :(得分:1)

添加组时,可以指定要添加到该组的一组现有实体。

layers.each do |layer|
  layerEnts = []
  entities.each { |e| layerEnts << e if layer == (e.layer) }
  layerGroup = entities.add_group(layerEnts)
  layerGroup.name = layer.name
end

注意!如果不正确地在这样的上下文之间移动实体很容易崩溃 - 并且做错了很容易 - SU在这里没有做太多的保护。

只有entities.add_group(ents) entities model.active_entitiesentsmodel.active_entities内的实体时才使用{{1}}。

并且,我不是百分百肯定在这里,如果你尝试分组一个面而不添加它的边缘可能会有问题。 (这需要测试。)

如果您的插件创建了要分组的几何体,那么最好将它们直接添加到目标组 - 而不是将它们添加到一个上下文中,然后再进行分组。它避免了这么多潜在的问题,崩溃 - 而且速度更快。

如果您描述了插件或功能的更抽象的目的,那么答案可能就完全不同了。

答案 1 :(得分:0)

您可以使用send

以动态方式调用方法

假设您可以获得执行layer.type的类型,这可以解决您的问题。

layerEnts.each do |l|
  type = l.typename.downcase
  layerGroup.entities.send("add_#{type}".to_sym, l)
end

更新:只是阅读文档似乎实际上有一种获取类型的方法,它的类型名称,似乎它是骆驼套装,所以我们需要将其缩写。

https://developers.google.com/sketchup/docs/ourdoc/entity#typename


此外,似乎有多个类型的单词,因此您需要一些下划线。这是一个解决方案

layerEnts.each do |l|
  type = l.typename.gsub(/(.)([A-Z])/,'\1_\2').downcase
  layerGroup.entities.send("add_#{type}".to_sym, l)
end