0

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

エンティティ コレクションにエンティティの配列を追加したいのですが、エンティティ コレクション (参照でわかるように) では、エンティティをタイプ別に追加する必要があります。entities.add_edge()。混合型の配列に対してこれを行う最良の方法は何ですか?

ここにスニペットがあります - 最後から 2 番目の行は有効ではありません (一般的な .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
4

2 に答える 2

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% 確信があるわけではありません。面のエッジも追加せずに面をグループ化しようとすると、問題が発生する可能性があります。(これにはテストが必要です。)

プラグインでグループ化するジオメトリを作成した場合は、それらを 1 つのコンテキストに追加して後でグループ化するよりも、ターゲット グループに直接追加する方がよいでしょう。非常に多くの潜在的な問題やクラッシュを回避し、はるかに高速です。

プラグインまたは機能のより抽象的な目的を説明した場合、答えはまったく異なるものになる可能性があります。

于 2012-05-22T11:01:35.837 に答える
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
于 2012-05-17T04:03:15.590 に答える