ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/08/2015

Как сохранить идентификатор объекта в словаре расширения другого объекта?

Следующий код показывает как это сделать. Обратите внимание, что необходимо преобразовать ObjectId в ads_name для сохранения результата в Xrecord, и наоборот для получения ObjectId из буфера результата Xrecord. Также отметьте, что необходимо передать ссылку на первый элемент цепочки буферов методу setFromRbChain() вместо указателя на resbuf.

Код - C++: [Выделить]
  1. int AddSoftpointerIntoXdict(AcDbObjectId id1, AcDbObjectId id2)
  2. {
  3.   Acad::ErrorStatus retStat;
  4.   AcDbXrecord * pXrec = new AcDbXrecord;
  5.   AcDbDictionary *pDict = NULL;
  6.   AcDbObjectId dictid, xrecid;
  7.   AcDbSoftPointerId SP(id2);
  8.   AcDbObject * pobj;
  9.   struct resbuf * head = NULL;
  10.  
  11.   ads_name adsName;
  12.  
  13.   if ((retStat = acdbOpenObject(pobj, id1, AcDb::kForWrite)) != Acad::eOk)
  14.     return 0;
  15.  
  16.   pobj->createExtensionDictionary();
  17.   dictid = pobj->extensionDictionary();
  18.   pobj->close();
  19.  
  20.   acdbOpenObject(pDict, dictid, AcDb::kForWrite);
  21.  
  22.   pDict->setAt(_T("TEST"), pXrec, xrecid);
  23.  
  24.   pDict->close();
  25.  
  26.   acdbGetAdsName(adsName, id2);
  27.  
  28.   head = acutBuildList(AcDb::kDxfSoftPointerId, adsName, 0);
  29.  
  30.   pXrec->setFromRbChain(*head);
  31.  
  32.   pXrec->close();
  33.  
  34.   acutRelRb(head);
  35.  
  36.   return 1;
  37.  
  38. }
  39.  
  40. void AddInfo()
  41.  
  42. {
  43.  
  44.   int rt;
  45.   ads_name en1, en2;
  46.   ads_point pickpt;
  47.   AcDbObjectId id1, id2;
  48.   Acad::ErrorStatus retStat;
  49.   rt = acedEntSel(_T("\nВыберите примитив который будет ссылаться: "),  en1, pickpt);
  50.  
  51.   if (rt != RTNORM)
  52.     return;
  53.  
  54.   retStat = acdbGetObjectId(id1, en1);
  55.  
  56.   assert(retStat == Acad::eOk);
  57.  
  58.   rt = acedEntSel(_T("\nВыберите примитив на который будет ссылка: "),  en2, pickpt);
  59.  
  60.   if (rt != RTNORM)
  61.     return;
  62.  
  63.   retStat = acdbGetObjectId(id2, en2);
  64.  
  65.   assert(retStat == Acad::eOk);
  66.  
  67.   acutPrintf(_T("\nid2=%ld"), id2);
  68.  
  69.   rt = AddSoftpointerIntoXdict(id1, id2);
  70.  
  71.   if (rt == 0)
  72.     return;
  73.  
  74. }
  75.  
  76. void GetInfo()
  77. {
  78.   int rt;
  79.   ads_name en1;
  80.   ads_point pickpt;
  81.   AcDbObjectId id1;
  82.   Acad::ErrorStatus retStat;
  83.   AcDbXrecord * pXrec = NULL;
  84.   AcDbDictionary * pDict;
  85.   AcDbObjectId dictid, xrecid;
  86.   struct resbuf * rb;
  87.  
  88.   AcDbObjectId tmpId = NULL;
  89.  
  90.   rt = acedEntSel( _T("\nВыберите примитив с словарём расширения:"), en1, pickpt);
  91.  
  92.   if (rt != RTNORM)
  93.     return;
  94.  
  95.   retStat = acdbGetObjectId(id1, en1);
  96.  
  97.   assert(retStat == Acad::eOk);
  98.  
  99.   AcDbObject * pobj;
  100.  
  101.   retStat = acdbOpenObject(pobj, id1, AcDb::kForRead);
  102.  
  103.   assert(retStat == Acad::eOk);
  104.  
  105.   dictid = pobj->extensionDictionary();
  106.  
  107.   if (dictid == AcDbObjectId::kNull)
  108.   {
  109.     acutPrintf(_T("\nId равен NULL."));
  110.     pobj->close();
  111.     return;
  112.   }
  113.  
  114.   pobj->close();
  115.  
  116.   acdbOpenObject(pDict, dictid, AcDb::kForRead);
  117.  
  118.   pDict->getAt(_T("TEST"), (AcDbObject * &)pXrec, AcDb::kForRead);
  119.  
  120.   pDict->close();
  121.  
  122.   pXrec->rbChain(&rb);
  123.  
  124.   pXrec->close();
  125.  
  126.   if (rb == NULL) acutPrintf(_T("\nНулевой буфер результата."));
  127.  
  128.   if (rb->restype == AcDb::kDxfSoftPointerId)
  129.   {
  130.  
  131.     acdbGetObjectId(tmpId, rb->resval.rlname);
  132.     acutPrintf(_T("\nСсылочный Id=%ld"), tmpId);
  133.   }
  134.  
  135.   acutRelRb(rb);
  136.  
  137. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/01/how-to-store-an-object-id-into-an-xrecord-in-an-extension-dictionary-of-another-object.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2932

Опубликовано 21.08.2015