2017-10-11 26 views
1

エンティティを選択および変更するためのMVVMパターンを作成するAutoCADの.netプロジェクトで作業しています。私は、選択したエンティティの情報/値をビューモデルに保存し、情報/値を変更し(WPF UIをポップアップし、コードを介して)、エンティティに変更を適用します。AutoCAD。ObjectIdを使用せずにオブジェクトIDを格納および取得する

問題は、エンティティに変更を適用する場合、「どのエンティティが変更を受け取るか」を知る必要があります。したがって、私はエンティティObjectIdを保存し、後でそれを取得するObjectId構造体を使用しないでAutoCADのacdbmgd.dllからUIプロジェクトが特定のバージョンのAutoCADに依存するようになります(はい、UIプロジェクトが動作する必要があります.netフレームワークのみ)。

私はこれを行う方法はありますか? objectIdをオブジェクトに格納してから、それをobjecIdにキャストしようとしましたが、うまくいきませんでした。助けてください。どうもありがとうございました。

+0

データベース内の 'ObjectId'のタイプは何ですか? – grek40

+0

私は本当にあなたの質問を理解していないと申し訳なく思っています。 1.「エンティティObjectId」は、変更したいエンティティのIDです。 2. "ObjectId"は、タイプがAutodesk.AutoCAD.DatabaseServices.ObjectIdです。それは構造体です。 これがあなたが知りたいことでない場合は、私に説明してください。私は初心者なので、分かりません。 –

+0

あなたのUIプロジェクトが.Net Framework以外のものに依存できないと言うなら、これはUIプロジェクトがモデルプロジェクトに依存し、モデルプロジェクトがAutoCADに依存することは大丈夫ですModelProjectのインターフェイスはAutoCADとは独立しているため、UIプロジェクトはAutoCADに直接依存しません。それ以外の場合は、AutoCADとUIの間のデータ転送がどのように機能するのかを理解していない – grek40

答えて

0

あなたが知っているかどうかはわかりませんが、図面内のすべてのエンティティは3ユニークな方法:ObjectIDHandleとインスタンスポインタ。オブジェクトIDは、図面データベースが開かれるたびに各エンティティごとに作成されるため、現在の図面が閉じられるまでは一意でしかありません。再オープンすると、ObjectIDはすべて完全に異なります。しかしながら、ハンドルはセッションの間に存続し、奇妙なことに言えば、長い背中に変換することができます。セッション間のエンティティへの参照を保持することに気を配っているかどうかは不明ですが、少なくともデータ型の問題を解決します。私は、オートデスクをメインアセンブリから分離したいというあなたの希望を完全に理解しています。 This postには、必要な情報がすべて含まれています。

+0

あなたの提案に感謝します。エンティティハンドルをビューモデルの文字列フィールドとして保存し、そのObjectIdは次のようになります。 viewModel.EntityHandle = entity.Handle.ToString(); ObjectId cylinderId = acDb.GetObjectId(false、新しいハンドル(Convert.ToInt64(viewModel.EntityHandle、16))、0); 前に直接ハンドルを使用してエンティティを取得することはありません。それがより簡単に、より良いパフォーマンスになるでしょうか?あなたのアドバイスは大歓迎です。 残念なコメントを残して申し訳ありませんが、まだ改行で苦労しています –

+0

ハンドルでエンティティに直接アクセスできるとは思いません。 .Net APIは、ハンドルを使用して取得できるすべてのオブジェクトIDを使用しています。ハンドルを使用する主な理由の1つは、セッション間で特定の図面内の特定のエンティティへの永続的な参照を持つことです。 – Nik

0

ObjectIdの代わりに、ハンドルの値を(long)として格納できます。エンティティを取得するときにハンドル値をAutoCADハンドルに変換する必要がありますが、それをエスケープする方法はありません。

関連する問題