Shape⇒DWG⇒Shapeへ変換する場合属性値を保持する方法

1,244 views
Skip to first unread message

TJ

unread,
Dec 18, 2015, 6:35:43 AM12/18/15
to FMEユーザーフォーラム
Shape形式からDWG形式に変換後、Shapeデータ持っている属性が失われます。変換後のDWGからShape変換した場合、元のShapeファイルの属性が失われます。

ShapeデータをDWG形式に変換する際、属性を保持する方法がもしあれば教えていただきたいです。

Takashi Iijima

unread,
Dec 18, 2015, 6:59:32 AM12/18/15
to FMEユーザーフォーラム
DWGライターで書き込むフィーチャーに、次の属性を設定してみてください。User Attribute として書き込むことは必須ではありません。
属性名: autocad_attributes
値: insert_attributes

DWGリーダーで読み込むときは、Add Reader でパラメーター設定画面を開き、Group Entities Byとして "Attribute Schema" を選択すると、属性が Expose されます。

しかし、CADとGISでは属性の取り扱いの仕組みが異なるので、データ型を復元することは難しいかもしれません。
フォーマットの設計コンセプトの違いによる限界はあります。

TJ

unread,
Dec 18, 2015, 10:04:37 PM12/18/15
to FMEユーザーフォーラム
ありがとうございます。

属性名: autocad_attributes
値: insert_attributes

教えていただいたこの方法で、属性が保持したままでShapeとDWGの相互変換ができました。
変換したDWGでも属性の確認ができました。

今回複雑な属性は使用していませんので、元のShapeデータのスキーマと使ってShape形式に逆変換して、特に問題がありませんでした。

Takashi Iijima

unread,
Dec 19, 2015, 2:32:24 AM12/19/15
to FMEユーザーフォーラム
解決して何よりです。
変更後のShapeを作成するときに元のShapeのスキーマを参照するのは良い方法だと思います。

DWGに属性を記録することはできますが、属性の数が多い場合にはデータサイズが無駄に大きくなる可能性があります。
CADでは図形データだけの編集をする(属性には変更を加えない)ということであれば、DWGにはフィーチャーを識別するためのユニークなIDだけを与えておき、DWG->Shapeのときに、そのIDをキーとして元のShapeの属性を結合してやる、という方法も考えれます。
元のShapeにIDとして使える属性がない場合には、レコード番号をキーとすることができます(元のShapeが編集されることはないという前提)。

TJ

unread,
Dec 20, 2015, 1:10:11 AM12/20/15
to FMEユーザーフォーラム
DWGにShapeと共通なユニークなIDだけを与えるのがいい方法ですね、とても参考になりました。ありがとうございます。

DWGライダーのautocad_attributesの解説を読むと、 insert_attributesのほかに、external_attributesという値もあります。
”This is the default value. Limited attributes are written to the AutoCAD file. This is useful if the attributes are being stored in an external database.”

属性データを外部データベースに保存して、図形と属性をリンクできるように読み取れます。
これでしたら、この方法もあるかなと思います。
autocad_attributesをexternal_attributesに設定した場合、外部データベースと連携する方法を教えていただけますでしょうか。


Takashi Iijima

unread,
Dec 20, 2015, 3:22:20 AM12/20/15
to fm...@googlegroups.com
autocad_attributes 属性の使い方について、ヘルプにはあまり詳しい説明がないので、以下は、私が試した範囲での知見です。

(1) extended_entity_data
DWGファイルにユーザー属性が書き込まれる (extended_data_list{} リスト)。

(2) insert_attributes
DWGファイルにユーザー属性が書き込まれる (fme_attrib_info{} リスト)。

(3) external_attributes (デフォルト)
デフォルトではDWGファイルにユーザー属性は書き込まれない。
ただし、フィーチャーに extended_data_list{} 属性を与えることによって必要な属性を書き込むことができる。その場合の書式は次のとおり。

string:<属性名>=<値>

例: AttributeCreator でフィーチャーの属性を extended_data_list{} リストに格納する。
extended_data_list{0} <-- string:ID=@Value(ID)
extended_data_list{1} <-- string:都道府県名=@Value(都道府県名)

DWGライターのヘルプでの external_attributes に関する説明:
”This is the default value. Limited attributes are written to the AutoCAD file. This is useful if the attributes are being stored in an external database.”
は、属性が外部データベースに記録されている場合は、そのテーブルと結合するためのキー属性を "extended_data_list{0}" に設定して書き込むと便利ですよ、ということを言いたいのだと思います。
これは、(1) extended_entity_data または (2) insert_attributes で、外部テーブルと結合するためのキー属性を書き込むことと等価です。

Takashi Iijima

unread,
Dec 20, 2015, 3:58:21 AM12/20/15
to FMEユーザーフォーラム
属性出力のオプションは、DWGライターのパラメーターとして設定できますね。

ワークベンチにDWGライターを追加するときのパラメーター:


または、Navigator ウィンドウで DWGライター/Parameters/Advanced/Attribute Output でも設定できます。
簡単でした。

参考
How to convert SHP to DWG (Esri Shapefile to AutoCAD)

TJ

unread,
Dec 20, 2015, 4:11:04 AM12/20/15
to FMEユーザーフォーラム
試していただいてありがとうございました。


(1) extended_entity_data
DWGファイルにユーザー属性が書き込まれる (extended_data_list{} リスト)。

(2) insert_attributes
DWGファイルにユーザー属性が書き込まれる (fme_attrib_info{} リスト)。
この二つの違いはリストの名称だけでしょうか。

DWGライターのパラメーターとして設定するのが確か簡単ですね。

それぞれの使い方について、まだ十分に理解できていない部分がありますが、添付のサイトも参考しながら試してみます。

Takashi Iijima

unread,
Dec 20, 2015, 4:41:16 AM12/20/15
to FMEユーザーフォーラム
AutoCAD には関連のある複数の図形をまとめて扱うための「ブロック」という機能があるのはご存じだと思います。
DWGフォーマットは GIS で言うところのマルチパートジオメトリをサポートしませんが、DWGライターは自動的に、マルチパートジオメトリをシングルパートに分解し、それらをブロックとして定義します。

私の観察によれば、
- insert_attributes の場合は、シングルパートも含めてフィーチャー単位でブロックを定義し、ブロックに付随するデータとしてユーザー属性を書き込みます。
- extended_entity_data の場合は、各図形(エンティティ)に付随するデータとしてユーザー属性を書き込みます(シングルパートのフィーチャーについてのブロックは定義されません)。

FME のDWG リーダーで読み込むときはどちらもユーザー属性として解釈されるので違いは見えませんが、AutoCAD では扱い方が異なると思います。



Takashi Iijima

unread,
Dec 20, 2015, 5:10:54 AM12/20/15
to FMEユーザーフォーラム
DWGライターを Inserts モード (insert_attributes) にして ライターフィーチャータイプの User Attributes タブでユーザー属性 A を書き込み、各フィーチャーに extended_data_list{0} = "string:B=@Value(value)" を与えると、ブロックに付随する属性 A と、エンティティに付随する属性 B の両方を書き込むこともできますね。
面白い。

TJ

unread,
Dec 20, 2015, 10:26:50 AM12/20/15
to FMEユーザーフォーラム
- insert_attributesはシングルパートかマルチパートに関係なく、ブロックを作成定義して、ブロックの属性として付与する
- extended_entity_dataはフィーチャーに対して、個々の図形(エンティティ)の属性として付与する、マルチパートの場合、ブロックを作成するが、個々の図形(エンティティ)の属性として付与する
こういうことでしょうか。

>DWGライターを Inserts モード (insert_attributes) にして ライターフィーチャータイプの User Attributes タブでユーザー属性 A を書き込み、各フィーチャーに extended_data_list{0} = "string:B=@Value(value)" を与えると、ブロックに付随する属性 A と、エンティティに付随する属性 B の両方を書き込むこともできますね。
これは確かに面白いですね。グループと単独図形別々の属性を持たしたい場合、使えそうですね。
FMEを使用すれば、extended_data_listの内容を読み取って、Shapeの属性に再変換できるのですが、AutoCADでエンティティの属性を確認する方法が分かりません(ブロックの属性の確認ができました)。付随する属性 Bの確認方法を教えていただけますでしょうか。

Takashi Iijima

unread,
Dec 20, 2015, 12:05:34 PM12/20/15
to FMEユーザーフォーラム
AutoCAD の標準機能では、DWGファイルの extended data (拡張データ) の読み書きはできません。
LISP言語によって AutoCAD のカスタマイズをすれば拡張データにアクセスできるようですが、具体的な方法ついては私の守備範囲外です。

TJ

unread,
Dec 20, 2015, 6:21:12 PM12/20/15
to FMEユーザーフォーラム
いろいろ調べましたが、ブロックに属性付与する記載はほとんどのため、質問をいたしました。そういえば、昨日調べた際、そのような内容を目にした記憶があります。内容はVBAを使った方法のようです。
標準でそのような機能はなく、LISP、VBAなどを介して実現する必要があるということですね。
ヒントいただいてありがとうございます。調べてみます。
Reply all
Reply to author
Forward
0 new messages