2012-05-17 136 views
0

https://developers.google.com/sketchup/docs/ourdoc/entities将实体添加到实体集合?

我想实体的阵列添加到实体集合,但实体集合(你可以在参考见)要求我按类型,即添加它们。 entities.add_edge()。对于一系列混合类型,最好的方法是什么?

这里有一个片段 - 倒数第二行心不是有效的(通用。新增犯规存在)

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 
+0

你想分层现有的实体 - 是吗?或者,你自己创建所有实体吗?如果您自己创建所有几何,最好将它们直接添加到目标上下文中,而不是稍后对它们进行分组。 (这与您使用SU UI进行建模时通常所做的不同) – thomthom

回答

0

可以使用send

假设你可以得到呼叫类型以动态的方式方法做layer.type这应该可以解决你的问题。

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

UPDATE:只是阅读文档看来,实际上是那里得到的类型的方法,它的类型名称,似乎它的骆驼套管,所以我们需要downcase它。

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 
+0

谢谢!这似乎有不同的方法的一些特点,但这使我走上了正确的轨道。 –

+1

否 - 不要使用#typename来确定实体的类型 - 因为它会进行字符串比较,所以速度很慢。由于您迭代的实体可能是数百万个您想要避免处理字符串。而是测试类 - #is_a?()或#kind_of?() – thomthom

+0

要进一步阅读有关性能影响的原因和示例,请参阅此主题的文章:http://www.thomthom.net/thoughts/2011/12/never-ever-use-typename/ – thomthom

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)entitiesmodel.active_entitiesentsmodel.active_entities内的实体。

而且,在这里我不是100%确定的,如果您尝试对面部进行分组而不添加边缘,则可能会出现问题。 (这需要测试。)

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

如果您描述了您的插件或功能的更抽象的目的可能是答案是完全不同的东西。

相关问题