Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

ObjectARX:自動調整配列複写の判定と分解

Issue

選択したオブジェクトが自動調整配列複写の要素かどうか判定して、自動調整配列複写であった場合に分解する実装するには、どのようなコードを記述すればいいでしょうか? 

 array.jpg

  

Solution

自動調整配列複写の対象となっているオブジェクト一式は、匿名ブロック(Anonymous Block)として自動調整フレームワークで管理、維持されています。

 

自動調整配列複写の判定には、AcDbAssocArrayActionBody::isAssociativeArray() メンバー関数を利用することが出来ます。同様に、分解には AcDbAssocArrayActionBody::explode() メンバー関数 を利用することが出来ます。

 

次のコードは、選択したオブジェクトが自動調整配列複写の構成要素だった場合に、トップレベルの調整配列複写を分解する例です。

 

ads_name ename;
ads_point pt;
int stat = acedEntSel(_T("\nオブジェクトを選択 : "), ename, pt);
if (stat != RTNORM) return;

AcDbEntity* pEnt;
AcDbObjectId objId;
acdbGetObjectId(objId, ename);
Acad::ErrorStatus err = acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);
if (err != Acad::eOk) return;

if (AcDbAssocArrayActionBody::isAssociativeArray(pEnt)) {
	acutPrintf(_T("\n自動調整配列です"));

	AcDbObjectId actId = AcDbAssocArrayActionBody::getControllingActionBody(pEnt, NULL);
	AcDbAssocArrayActionBody* pAryAct = NULL;
	err = acdbOpenAcDbObject((AcDbObject*&)pAryAct, actId, AcDb::kForWrite);
	if (err != Acad::eOk) {
        pEnt->close();
        return;
	}

	if (AcDbAssocArrayPathParameters::cast(pAryAct->parameters()))
        acutPrintf(_T("\n - パス"));
	if (AcDbAssocArrayPolarParameters::cast(pAryAct->parameters()))
        acutPrintf(_T("\n - 円形状"));
	if (AcDbAssocArrayRectangularParameters::cast(pAryAct->parameters()))
        acutPrintf(_T("\n - 矩形状"));

	AcDbObjectIdArray newIds;
	pAryAct->explode(pEnt, newIds);

	pAryAct->close();

} else
	acutPrintf(_T("\n自動調整配列ではありません"));

pEnt->close();

return;

 

EXPLODE コマンドで自動調整配列複写を分解する場合には、次のようなコードで AcDbAssocArrayActionBody::explode()  メンバー関数を代替することが出来ます。いずれの場合も、自動調整フレームワークが構成要素オブジェクトを保持しているため、すべてのオブジェクトを指定する必要はありません。

 

	ads_name sset;
	acedSSAdd(NULL, NULL, sset);
	acedSSAdd(ename, sset, sset);
	acedCommandS(RTSTR, _T("EXPLODE"), RTPICKS, sset);

 

exploded.jpg