development of

Tieghaに関する備忘録とおまけ

【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オブジェクトを返すと説明されています。

中略部分は過去の記事を参考にしてください。