development of

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

【AutoCAD Mechanical】パーツ参照を作成する その4

パーツ一覧に表示されないパーツ参照

前回、パーツ参照のプロパティの値を設定していきましたが、パーツ一覧から除外は他の値と設定方法が異なるため触れませんでした。

今回は、パーツ一覧から除外の設定を変更していきたいと思います。 f:id:tknmt:20190522150656p:plain  

サンプルコード

// パーツ参照を選択
AmiPickObj PickObj;
if (amiPick(
    _T("\nパーツ参照を選択"),
    AmiKeyType::partKey,
    NULL,
    PickObj,
    Adesk::kFalse) != Acm::eOk) return;

AcDbFullSubentPath subentPath;
AcGePoint3d pickPoint;
AcGeVector3d pickVector;
AcGeMatrix3d viewTrans;
Adesk::Boolean isGhost;

// 選択したときの情報を取得
if (amiGetPickInfo(
    &PickObj,
    subentPath,
    pickPoint,
    pickVector,
    viewTrans,
    isGhost) != Acm::eOk) return;

// パーツ参照のObjectIdを取得
AcDbObjectId partRefId = subentPath.objectIds().first();

// 現在のデータベースを取得
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();

AcDbObjectId bomId;
bool braekFlg = false;

// 現在の部品表のObjectIdを取得
acmBomMgr->getCurrentBom(bomId, pDb);
// 部品表の項目のイテレータを取得
AcmIterator *pIter = acmBomMgr->newItemIterator(bomId);

while (!pIter->done())
{
    AcmCObjArray<AcDbObjectIdArray> referenceArray;
    AcDbIntArray numItemArray;
    // 部品表の項目で参照されているパーツ参照のObjectIdのコレクションを取得
    acmBomMgr->getItemReferences(pIter->objectId(), referenceArray, numItemArray);
    for each (AcDbObjectIdArray *ids in referenceArray)
    {
        for each (AcDbObjectId id in *ids)
        {
            // 選択したパーツ参照と一致するかどうか
            if (id == partRefId)
            {
                bool data;
                // パーツ参照がパーツ一覧から除外されているかどうかを取得
                if (acmBomMgr->getItemExtendedData(pIter->objectId(), AcmBOMManager::eExcludeFromPartlistState, data) != Acm::eOk)
                {
                    acutPrintf(_T("\nパーツ参照のデータの取得に失敗しました。"));
                    return;
                }
                acutPrintf(_T("\n選択されたパーツ参照はパーツ一覧から除外%s"), data ? _T("されています。") : _T("されていません。"));

                ACHAR answer[255];
                acedInitGet(0, _T("Yes No"));
                if (acedGetKword(_T("\n「パーツ一覧から除外」の設定を変更しますか?: [はい(Y)/いいえ(N)] "), answer) != RTNORM) return;

                if (!_tcscmp(answer, _T("Yes")))
                {
                    // パーツ参照のパーツ一覧から除外の設定を変更
                    if (acmBomMgr->setItemExtendedData(pIter->objectId(), AcmBOMManager::eExcludeFromPartlistState, !data) != Acm::eOk)
                    {
                        acutPrintf(_T("\nパーツ参照のデータの変更に失敗しました。"));
                    }
                }
            }
        }
    }
    pIter->next();
}

AcDbObjectIdArray partListIds;
// パーツ一覧を取得
acmBomMgr->getBomPartsLists(bomId, partListIds);
for each (AcDbObjectId partListId in partListIds)
{
    AcmPartList *pPartList;
    acdbOpenObject(pPartList, partListId, AcDb::kForWrite);
    //パーツ一覧を更新
    pPartList->regen();
    pPartList->close();
}

※サンプルコードについての補足

パーツ一覧から除外の設定を取得するには AcmBOMManager::getItemExtendedDataメソッドを使用し、パーツ一覧から除外の設定を変更するには AcmBOMManager::setItemExtendedDataメソッドを使用します。

これらのメソッドは、特定のデータが部品表の項目に関連付けられているかの取得や設定を行い、パーツ一覧から除外の設定を扱う場合は、いずれも第2引数に AcmBOMManager::ItemDataType列挙型の、eExcludeFromPartlistStateを渡す必要があります。

また、このメソッドを使用して部品表の項目を設定しただけではパーツ一覧が更新されませんので、処理の最後にパーツ一覧を取得して更新を行っています。