【AutoCAD Mechanical】パーツ参照を作成する その4.5
acedSSGet 関数でオブジェクトを選択する
これまでのサンプルコードでは、amiPick
メソッドを使用してオブジェクトの選択を行っていました。
今回は Mechanical 特有の関数を使用せずに、 acedSSGet
関数を使用してオブジェクトを選択した場合は、どのようにして選択セットからAmiPickObj
オブジェクトを取得するのかを調べてみました。
サンプルコード
// オブジェクトを選択 ads_name ss; ACHAR *promptPtrs[] = {_T("\nパーツ参照追加するオブジェクトを選択"), _T("\n選択を解除するオブジェクトを選択")}; if (acedSSGet(L"_+.:N:S:$", promptPtrs, NULL, NULL, ss) != RTNORM) return; // 選択セット内の情報を取得 struct resbuf *rb = NULL; if (acedSSNameXEx(&rb, ss, 0, 0x2) != RTNORM) { acedSSFree(ss); return; } AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase(); AcDbTransactionManager *pTransMgr = pDb->transactionManager(); try { AcTransaction *pTrans = pTransMgr->startTransaction(); AmiPickObj PickObj; // acedSSNameXで返されるリザルトバッファからPickObjを取得 if (amiFillPickObj(rb, Ami::geomKey, PickObj, 1) != Ami::eOk) { acutRelRb(rb); return; } // ピック選択時のリザルトバッファ // RTLB start of entity data sublist // RTSHORT selection method // RTENAME picked entity's entity name // RTSHORT GS marker // RTLB start of list for pick point // RTSHORT point descriptor // RT3DPOINT point on pick line (in WCS) // RT3DPOINT vector describing direction of pick line or direction & distance to other end of line segment (only present if viewpoint is not plan WCS) // RTLE end of list for pick point // RT3DPOINT // RT3DPOINT // RT3DPOINT // RT3DPOINT // RTENAME // RTENAME // RTLE end of entity data sublist AcGePoint3d pickPoint = asPnt3d(rb->rbnext->rbnext->rbnext->rbnext->rbnext->rbnext->resval.rpoint); acutRelRb(rb); // パーツ参照を作成 AcmPartRef *pPartRef = new AcmPartRef(); pPartRef->setSymbolDefaults(pDb); pPartRef->setOrigin(pickPoint); // 中略 pTransMgr->endTransaction(); } catch (...) { pTransMgr->abortTransaction(); }
※サンプルコードについての補足
標準の関数を使用してオブジェクトの選択を行った場合は、AmiPickObj
オブジェクトを取得するには amiFillPickObj
関数を使用します。
amiFillPickObj
関数は SDK 内ヘルプには、acedSSNameX
関数で取得したリザルトバッファから、指定指定されたキータイプのAmiPickObj
オブジェクトを返すと説明されています。
中略部分は過去の記事を参考にしてください。