Это экспериментальный код с последним изменением по совету >Ведмедь.
Вот так функция выглядит сейчас:
root_param также удаляется, но другой функцией.
Это служебные функции нижнего уровня:
Acad::ErrorStatus eraseKeyFromNode(const CString &dictName, const CString &keyName)
{
Closer<AcDbDictionary> nod;
Acad::ErrorStatus es = acdbCurDwg()->getNamedObjectsDictionary(nod, AcDb::kForWrite);
if(es != Acad::eOk) return es;
AcDbObjectId objectId;
es = nod->getAt(dictName, objectId);
nod.close();
if(es != Acad::eOk) return es;
Closer<AcDbDictionary> root_param;
es = root_param.open(objectId, AcDb::kForRead);
if(es != Acad::eOk) return es;
es = root_param->remove(keyName, objectId);
root_param.close();
if(es != Acad::eOk) return es;
Closer<CMyDwgArchive> pArchive;
es = pArchive.open(objectId, AcDb::kForWrite);
if(es != Acad::eOk) return es;
return pArchive->erase();
}
Acad::ErrorStatus eraseRootKeyFromNode(const CString &dictName)
{
Closer<AcDbDictionary> nod;
Acad::ErrorStatus es = acdbCurDwg()->getNamedObjectsDictionary(nod, AcDb::kForRead);
if(es != Acad::eOk) return es;
AcDbObjectId objectId;
es = nod->remove(dictName, objectId);
nod.close();
if(es != Acad::eOk) return es;
Closer<AcDbDictionary> root_param;
es = root_param.open(objectId, AcDb::kForWrite);
if(es != Acad::eOk) return es;
return root_param->erase();
}
Вызов в команде выглядит так:
eraseKeyFromNode(consts::DocumentVarsRootDict, "Key1");
eraseKeyFromNode(consts::DocumentVarsRootDict, "Key2");
eraseKeyFromNode(consts::DocumentVarsRootDict, "Key3");
eraseRootKeyFromNode(consts::DocumentVarsRootDict);
"Key_" привел для примера, фактические имена немножко другие, здесь это не важно. Разделов всегда 3, имена их фиксированные.