「autodesk」タグアーカイブ

objectarx:2017の利用って変わったようだ

C#で開発していたので、2013から書き直した

autocad objectarxで最も利用されるライブラリの他に
C:\Program Files\Autodesk\AutoCAD 2017\Map\ManagedMapApi.dll
これを参照すれば、FDO以外は、利用できる。
全てここにライブラリあるので昔は、DLが必要だったと思うが便利になった。
Map 3dがプラグインで動作しているようなので、利用価値は高い。
昔は、(cast)でほぼほぼ行けたはずだけど、今は行けないな。ガックシ
後は、あまりサンプルが無かったので、とりあえず
これだけでいい
using Autodesk.Gis.Map;
using Autodesk.Gis.Map.ObjectData;
using Autodesk.Gis.Map.Utilities;

//オブジェクトテーブルの用意
MapApplication mapApp = HostMapApplicationServices.Application;
//現在開いているマップオブジェクトのテーブルを取得
Autodesk.Gis.Map.ObjectData.Tables odTables = mapApp.ActiveProject.ODTables;
・・・
//オブジェクトテーブルのレコードの全てを取得
using (Autodesk.Gis.Map.ObjectData.Table odTable2 = odTables[obtbname])
{
using (Records odrecords = odTable2.GetObjectTableRecords(Convert.ToUInt32(i1), acSSObj.ObjectId,
Autodesk.Gis.Map.Constants.OpenMode.OpenForRead, false))
{

//レコードフィールドに変換
Record odRecord = odrecords[i1];
//レコードフィールド列を入れるて構造を取得
MapValue mapval = odRecord[fieldint];
・・・
ここ迄ネストでないとCLRのデットロックを、起こすか
正常に動作しない。
Map 3dは、マネージモードなので、従来のように、autodeskのサンプルの連続したオブジェクト渡しだと
全くダメダメでした。
MapValueは、 Autodesk.Gis.Map.Utilitiesのオブジェクトだけど、早めにdispose
させたほうが、数万データはいけるけど、そのまま渡していたら、デットロックや落ちる。
なので、mapval.StrValueは、中にを精査してSystem変数で抱えた方が、うまく動作する。
using ステートメントが確実、メソッドの呼び出し中に例外でも Dispose が必ず呼び出されます。
tryよりある意味、動作は安定する。
昔は、
using (Transaction acTrans = db.TransactionManager.StartTransaction())
のトランザクションをネストしたり、関数で飛ばしけど、今それやったら、落ちる。
2011から、2013までのソースがほとんど書き直し。とほほ。
とりあえず、覚書