広告
公式ドキュメントの和訳です。
原文:「Attributes」
Fusionの属性
Fusion Attributes
属性は、技術的に極めて簡単な何かですが、それらの機能は、極めて精巧なスクリプトとアドインの作成を可能にします。属性は、単純に、Fusionエンティティによる、名前をつけた値を結びつけるための機能です。名前をつけた値は、Fusionによって、保存され、そして、あとで、存在するエンティティのどちらからでも、あるいは、デザインを問い合わせることによって、取り出すことができます。これは、あまり好きではありませんが、それは、いくつかの面白い事を行う機能を提供します。
これが提供する、2つの基本的な低レベルの機能があります。1つ目は、エンティティに名前をつけて、後でそれを見つける機能です。2つ目は、情報をエンティティに追加します。ここに、両方の使い方を説明する、単純な例があります。それは、フライ・スルー機能を提供するアドインです。最初に実行するとき、ユーザーは、カメラが一緒について行くための、曲線を選択するよう促されます。また、それらは、いくつかの他の設定を指定することができます。それらが、「Animate」ボタンをクリックすると、Viewは、選択された曲線を辿るカメラでアニメーション化されます。属性が無ければ、アドインは、パス曲線を再度選択するために、ユーザーを必要とします。そして、コマンドを実行するたびに、他の設定を変更してください。属性で、選択された曲線は「名前」が付けられていることがあります。それで、コマンドが再び実行されると、以前に、選択されたパスがある場合、それは、最初に表示されます。そして、それを既定のパスとして使用します。また、属性は、設定の値を保存するために用いられます。それで、コマンドが、次に実行されるとき、それらは、既定の設定になります。
属性とは何か、そして、それらをどのように作成、照会、編集そして削除するのか、もう少し厳密に、詳細を見てみましょう。
属性を作成する
Creating Attributes
属性をサポートするすべてのオブジェクトは、そのエンティティで関連付けられた、Attributesコレクションを返す「attributes」プロパティを持っています。最初、既定のエンティティは、属性を持たないため、このコレクションは空です。エンティティの新しい属性を作成するために、あなたは、Attributesオブジェクトのaddメソッドを使用します。下記は、属性を追加する例です。属性は、ユーザーが、モデルで、選択する面に追加され、そして、値として、現在の領域の面を割り当てます。
# 面を選択します
selectedFace = ui.selectEntity('Select a face', 'Faces').entity
# 面に、属性を追加します。
selectedFace.attributes.add('ADSK-AttribSample', 'FaceArea', str(selectedFace.area))
属性を作成するとき、3つの引数が必要です。:
- groupName
最初の引数は、グループ名です。これは、あなたが、作成する属性の全てをグループ化する方法として、用いられる文字列です。グループ名は、2つの目的で用いられます。1つ目は、名前が重複する問題を回避します。固有のエンティティの上のすべて属性は、一意の名前を持つ必要があります。例えば、上の属性の名前は、『FaceArea』です。属性グループが、存在しない場合、他のアドインが、同じ面で、『FaceArea』と呼ばれる属性を作成するとき、すでに、その名前が存在するため、それは失敗します。属性名が、そのエンティティのグループ内で、一意である必要があるため、グループは、この問題を排除します。各々のアドインは、エンティティ上の同じ名前で、属性を作成するための別のアドインを提供するために、別のグループ名を使用する必要があります。最も一般的な使い方は、あなたが、あなたのアドインを作成するために、すべての属性に、同じグループ名を使用する場合です。一意性を保証するために、あなたが、あなたのグループ名として、あなたの会社のいくつかの組合せとアドイン名を使用することを、お勧めします。すなわち「ADSK-FlyThrough」。属性グループを用いる2つ目の目的は、問合せるための簡単な方法を提供することです。そして、それらが、どんなエンティティに関連付けられるかに関係なく、あなたのアドインに関連付けられている属性を検索します。属性のための問合せは、以下で、更に詳細に説明されていますが、あなたは、あなたが、速く、あなたのアドインが作成した属性の全てにアクセスできる、グループ名に基づいて、問い合わせることができます。
- name
2つ目の引数は、属性の名前です。これは、任意の文字列であり、通常は、名前です。それは、あなたに、そして、属性が表現するデータを説明する意味があります。それは、あなたが、プログラムで、変数に、どのように、名前を付けるかと、同様の考え方です。
- value
第3の引数は、属性の値です。上記の例で注意する必要のある重要な事は、値が、文字列に変換されていることです。属性値は、常に、文字列です。さまざまなプログラミング言語で利用できる、あなたが、バイナリデータからテキストに変換、そして、再び戻すことも、できる、さまざまなライブラリがあります。それで、それは、どんなデータでも属性に格納できます。JSONやXMLフォーマットを使用して、また、あなたは、一つの属性に、更に複雑なデータを格納することができます。
既存の属性を取得する
Getting Existing Attributes
既存の属性にアクセスするための、エンティティと問合せの2つの方法があります。
エンティティからの属性
Attributes from an Entity
あなたは、特定のエンティティに関連付けられる、どんな属性でも取得することができます。下記の例では、エンティティから属性を取得することについて、説明しています。どの面が選択されるか、そして、その次に、先程の例で追加された属性は読み込まれ、そして、値が、表示されます。選択した面が、指定された属性を持っていない場合、ユーザーに知らせるために、メッセージが、表示されます。
# 面を選択します
selectedFace = ui.selectEntity('Select a face', 'Faces').entity
# 選択した面から、領域属性を取得します。
areaAttrib = selectedFace.attributes.itemByName('ADSK-AttribSample', 'FaceArea')
# 属性が返されたかどうかを確認し、値を表示します。
if areaAttrib:
ui.messageBox('Original area: ' + areaAttrib.value + ' cm^2')
else:
ui.messageBox('The selected face does not have the attribute.')
itemByNameプロパティの他に、また、Attributesコレクションは、あなたが、それらのグループや名前に関係なく、全ての属性を繰り返すことができる、itemメソッドをサポートします。また、Attributesコレクションは、個々のグループに属するエンティティ上の、すべての属性の配列を返す、itemsByGroupメソッドをサポートします。そして、最後に、それは、groupNamesプロパティをサポートします。それは、そのエンティティに存在する、グループの名前の配列を返します。
属性の問合せ
Querying for Attributes
あなたが、どのエンティティが、あなたが興味を持っている属性に含まれているか、わかっているとき、エンティティから属性を取得する、上記の技術は、うまく動作します。しかしながら、多くの場合、そうではありません。この簡単な例でさえ、モデルは、何百や何千の面持つことができます。そして、属性は、それらの何らかの数字に適用することができました。あなたは、確認するためにデザインで、すべての面をみる必要ありません。それらのどれかに特定の属性がある場合、遙かに効率的な方法は、DesignオブジェクトのfindAttributesメソッドを使用することです。これは、あなたが、何らかの既存の属性を速く見つけるために、全体のデザインを問い合わせできます。これは、下記の例で説明されます。
# デザイン内の、特定の名前を持つ、すべての属性を検索します。
attribs = des.findAttributes('attributeSample', 'FaceArea')
# 属性が、見つかった場合、確かめるために、返された配列の長さを確認します。
if len(attribs) > 0:
ui.messageBox(str(len(attribs)) + ' FaceArea attributes were found.')
else:
ui.messageBox('No attributes were found.')
findAttributesメソッドは、先程、説明したitemByNameメソッドのように、2つの引数を持っています。しかしながら、それらの使い方は、findAttributesメソッドで、更に柔軟です。それらは、上記のように、グループと属性の正確な名前を指定するために、正確に一致する何かを見つけるために、使用することができますが、また、あなたは、どちらか一方だけを指定できます。そして、すべてを取得するために、空の文字列を使用します。例えば、あなたは、以下のコードを使用してfindAttributesを呼び出す場合、それは、グループ名「attributeSample」を持っている、すべての属性を返します。
attribs = des.findAttributes('attributeSample', '')
そして、以下は、それらのグループ名とは関係なく「FaceArea」という名前のすべての属性を返します。
attribs = des.findAttributes('', 'FaceArea')
完全な一致に加えて、また、あなたは、検索を実行するために、正規表現を使用することができます。あなたが、正規表現を使用するには、式の文字列の前に "re:"を付けます。あなたが、正規表現をよく知らない場合、それらは、最初は少し怯えさせるかもしれませんが、あなたは、それらについて、ワイルドカード検索と同等のものと、考えることができます。しかし、それは、あなたが、検索文字列を定義する方法が、異なります。正規表現は、簡単なワイルドカード検索より複雑ですが、また、非常に強力です。正規表現には、web上に、いくつかの素晴らしい紹介があります。ここに、正規表現に完全に専念している1つのサイト(http://regexone.com)があります。正規表現を使用するとき、正規表現はグループや属性の完全な名前に、よく一致します。
いくつかの一般的な検索の例を示します。:
- "re:abc"
「abc」が検索する名前である場合、一致します。
- "re:abc.*"
検索された名前の先頭に "abc"がある場合に、一致します。例えば、それは、「abc123」と一致します。
- "re:.*abc"
検索される名前の末尾に "abc"がある場合に、一致します。例えば、それは、"abcTest"ではなく "Some test abc"と一致します。
- "re:.*abc.*"
検索されている名前のどこかに "abc"がある場合に、一致します。例えば、それは、「abc」、「123abc456」と「123 456 abc」と一致します。
以下は、正規表現の検索が、どのように行われるかについての簡単な例です。私が、属性を作成する、いくつかのアドインを記述しているという前提があります。そして、それらのすべては、上記で説明されている推奨されたグループの命名法に準拠しています。私は、グループ「ADSK-FlyThrough」、「ADSK-MeshCut」、「ADSK-AttribSample」、「DSK-SpurGear」などを持っています。そして、現在、私は、私のアドインのいずれかが、それらのすべてを作成し、そして、削除したことを示す、全ての属性を見つけたいと考えています。全ての属性の明らかな類似点は、グループ名の会社部分です。以下のコードは、すべての私の属性を見つけ、そして、削除するために、正規表現を使用します。それは、すべての名前と一致するために、属性名として、空の文字列を使用します。
# グループ名が「ADSK」で始まるすべての属性を検索します。
attribs = des.findAttributes('re:ADSK.*', '')
# 見つかった属性の全てを削除します。
for attrib in attribs:
attrib.deleteMe()
関連するエンティティを取得する
Getting the Associated Entity
findAttributesメソッドは、Attributeオブジェクトの配列を返します。しばしば、あなたが、本当に望む何かは、属性が、それに、添付されているエンティティです。エンティティに名前をつける仕組みとして、ここは、属性が、役に立つ場所です。それで、あなたは、後で、それを見つけることができます。あなたが、Attributeオブジェクトを持っている場合、あなたは、その「parent」プロパティを使用して、それが添付されるエンティティを取得することができます。
最初は少し不自然に思われるかもしれませんが、その親エンティティが、もはや存在しない、属性を取得することは可能です。その場合、親プロパティを呼び出すと、nullが返されます。1つの例は、あなたが、取得することができる添付されていない属性は、この場合、B-Repエンティティ(モデルの面、稜線と頂点)です。属性が、B-Repエンティティ上で作成されるとき、それは、そのエンティティの寿命が、不明なため、決して自動的に削除されません。例えば、あなたが、稜線に、属性を追加する場合、そして、その次に、その稜線は、消費され、稜線は、フィレットになります。そして、もはや、モデルの中には存在しません。そして、属性の親のプロパティは、nullを返します。しかしながら、将来、稜線が戻ってくる可能性があります。;フィレットは、削除される、あるいは、抑制することができます。そして、その次に、属性の親のプロパティは、稜線を返します。属性が、所有者なしで存在することができるため、取得したエンティティが元に戻ったか検証するために、親のプロパティの戻り値を常に確認することは、重要です。
属性の使用例
Attribute Usage Examples
あなたが、属性の使い方を、どのように、適用するかは、ほとんど、プログラムがそれらを使うのと、同じくらい変化します。それらの可能性を、よりよく理解するために、先程のフライ・スルーの例のアドインで、より詳しく見てみましょう。
このアドインは、後で、それを見つけるために、IDをエンティティに添付すること(命名)、そして、ユーザー定義したデータを保存することの2つの目的のための属性を使用しています。エンティティが、ユーザーが選択した、パス曲線であることを覚えておきたいと考えています。それは、属性を選択された曲線に追加するために、以下のコードを使用して、追加することで、これを行います。グループ名は、「ADSK-FlyThrough」です。属性名は、「pathCurve」です。そして、値は、この場合、必要でないため、空の文字列です。コマンドが呼び出されるとき、それが、存在する場合、属性を取得するために、findAttributesメソッドを使用しました。それが、存在する場合、コマンドが実行されるとき、それは、コマンド・ダイアログに、選択をあらかじめ入力します。
pathCurve.attributes.add('ADSK-FlyThrough', 'pathCurve', '')
ユーザーが、パスとして別の曲線を選択できるため、また、元の属性は、元の曲線から削除する必要があります。以下は、確認するために、以前に説明した機能を使う小さな関数です。属性名が、エンティティ上に、すでに存在する場合、そして、それを行う場合、それは何もしませんが、それをしない場合、それは、他のエンティティから、同じ名前の属性を削除します。そして、その次に、新しい曲線に、属性を追加します。
# 関数は、属性をエンティティに追加します。それが、すでに存在しない場合、
# そして、それは、他のエンティティから同じ名前の属性を削除します。
# そのため、一度に、1つのエンティティだけが、この名前で属性を持つことができます。
def addSingleName(design, entity, groupName, attributeName):
attrib = entity.attributes.itemByName(groupName, attributeName)
if not attrib:
# この名前で、既存の属性を取得して、それらを削除します。
oldAttribs = design.findAttributes(groupName, attributeName)
for oldAttrib in oldAttribs:
oldAttrib.deleteMe()
#指定されたエンティティに、属性を追加します。
entity.attributes.add(groupName, attributeName, '')
パス曲線に名前をつけるために、属性を使用することに加えて、また、アドインは、Designオブジェクトの属性として、他の設定を保存します。それは、個々のエンティティで、関連付けられていない一般的な情報のため、それは、エンティティの代わりに、それらをそこに保存します。これは、上方向と平滑値が保存される以下のコードで説明されます。属性値が、常に文字列であることを覚えておいてください。それで、他の値は、まず、文字列に変換する必要があります。あなたが、同じ名前がすでに存在する、addメソッドと属性を呼び出した場合、それは、結果として、既存の属性の値の更新が生じます。
des.attributes.add('sampleCameraAnimate', 'upDir', upDir)
des.attributes.add('sampleCameraAnimate', 'smoothness', str(smoothness))
場合によっては、更に効率的にできる選択肢は、全てのあなたのデータを文字列に結合します。そして、一つの属性で、それを保存します。あなたは、データを保存するために、JSONやXMLや他の文字列に基づいた書式を使用することができます。下記の例では、既知の区切り文字と一緒に値を連結することについて、説明しています。文字列は、解析できます。それが、後で、それぞれの値を抽出するために、読み込まれるとき、複数の属性を作成すること、あるいは、一つの属性を使用することは、両方とも現実的な利用可能な選択肢です。そして、他のから、1つを選択することは、主に、あなたの特定の場合のために、何が最も便利かに基づいています。別々の属性のデータを維持することは、簡単に、それぞれの値を更新できます。一つの属性に、それを結合することは、あなたが、簡単に、複雑なデータを格納できます。そして、更に効率的です。
attribValue = upDir + '|' + str(smoothness)
des.attributes.add('sampleCameraAnimate', 'settings', attribValue)
広告