21/08/2015
Как сохранить идентификатор объекта в словаре расширения другого объекта?
Следующий код показывает как это сделать. Обратите внимание, что необходимо преобразовать ObjectId в ads_name для сохранения результата в Xrecord, и наоборот для получения ObjectId из буфера результата Xrecord. Также отметьте, что необходимо передать ссылку на первый элемент цепочки буферов методу setFromRbChain() вместо указателя на resbuf.
Код - C++: [Выделить]
- int AddSoftpointerIntoXdict(AcDbObjectId id1, AcDbObjectId id2)
- {
- Acad::ErrorStatus retStat;
- AcDbXrecord * pXrec = new AcDbXrecord;
- AcDbDictionary *pDict = NULL;
- AcDbObjectId dictid, xrecid;
- AcDbSoftPointerId SP(id2);
- AcDbObject * pobj;
- struct resbuf * head = NULL;
- ads_name adsName;
- if ((retStat = acdbOpenObject(pobj, id1, AcDb::kForWrite)) != Acad::eOk)
- return 0;
- pobj->createExtensionDictionary();
- dictid = pobj->extensionDictionary();
- pobj->close();
- acdbOpenObject(pDict, dictid, AcDb::kForWrite);
- pDict->setAt(_T("TEST"), pXrec, xrecid);
- pDict->close();
- acdbGetAdsName(adsName, id2);
- head = acutBuildList(AcDb::kDxfSoftPointerId, adsName, 0);
- pXrec->setFromRbChain(*head);
- pXrec->close();
- acutRelRb(head);
- return 1;
- }
- void AddInfo()
- {
- int rt;
- ads_name en1, en2;
- ads_point pickpt;
- AcDbObjectId id1, id2;
- Acad::ErrorStatus retStat;
- rt = acedEntSel(_T("\nВыберите примитив который будет ссылаться: "), en1, pickpt);
- if (rt != RTNORM)
- return;
- retStat = acdbGetObjectId(id1, en1);
- assert(retStat == Acad::eOk);
- rt = acedEntSel(_T("\nВыберите примитив на который будет ссылка: "), en2, pickpt);
- if (rt != RTNORM)
- return;
- retStat = acdbGetObjectId(id2, en2);
- assert(retStat == Acad::eOk);
- acutPrintf(_T("\nid2=%ld"), id2);
- rt = AddSoftpointerIntoXdict(id1, id2);
- if (rt == 0)
- return;
- }
- void GetInfo()
- {
- int rt;
- ads_name en1;
- ads_point pickpt;
- AcDbObjectId id1;
- Acad::ErrorStatus retStat;
- AcDbXrecord * pXrec = NULL;
- AcDbDictionary * pDict;
- AcDbObjectId dictid, xrecid;
- struct resbuf * rb;
- AcDbObjectId tmpId = NULL;
- rt = acedEntSel( _T("\nВыберите примитив с словарём расширения:"), en1, pickpt);
- if (rt != RTNORM)
- return;
- retStat = acdbGetObjectId(id1, en1);
- assert(retStat == Acad::eOk);
- AcDbObject * pobj;
- retStat = acdbOpenObject(pobj, id1, AcDb::kForRead);
- assert(retStat == Acad::eOk);
- dictid = pobj->extensionDictionary();
- if (dictid == AcDbObjectId::kNull)
- {
- acutPrintf(_T("\nId равен NULL."));
- pobj->close();
- return;
- }
- pobj->close();
- acdbOpenObject(pDict, dictid, AcDb::kForRead);
- pDict->getAt(_T("TEST"), (AcDbObject * &)pXrec, AcDb::kForRead);
- pDict->close();
- pXrec->rbChain(&rb);
- pXrec->close();
- if (rb == NULL) acutPrintf(_T("\nНулевой буфер результата."));
- if (rb->restype == AcDb::kDxfSoftPointerId)
- {
- acdbGetObjectId(tmpId, rb->resval.rlname);
- acutPrintf(_T("\nСсылочный Id=%ld"), tmpId);
- }
- acutRelRb(rb);
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=2932
Опубликовано 21.08.2015