Тема: AcDbXrecord

необходимая задача - перевод кода с Lisp на ObjectARX.
Пример кода на Lisp:

(setq dict (list '(0 . "DICTIONARY")
                 '(100 . "AcDbDictionary")))
  (setq xname (entmakex dict))
  (setq dict (dictadd (namedobjdict) "AcStStandard" xname))
  (Setq ob1 (list
     (cons 0 "XRECORD")
     (cons 100 "AcDbXrecord")
     (cons 280 1)
     (cons 1 "C:\\test.dws")
    ))
  (setq xname (entmakex ob1))
  (if xname
   (dictadd dict "0" xname)
   (princ "\nCan't create XRECORD!")
  )

он работает без проблем.
на arx делаю так:

AcDbDictionary *pNamedobj;
    acdbHostApplicationServices()->workingDatabase()->
        getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
    AcDbDictionary *pDict = new AcDbDictionary;
    AcDbObjectId DictId;
    pNamedobj->setAt("DICTIONARY", pDict, DictId);
    pNamedobj->close();
    AcDbXrecord *pXrec = new AcDbXrecord;
    AcDbObjectId xrecObjId;
    struct resbuf *pHead;
    pHead = acutBuildList(
        280, 1,
        1, "C:\\test.dws",
        0);
    pXrec->setFromRbChain(*pHead);
    acutRelRb(pHead);
    pDict->setAt("XRECORD", pXrec, xrecObjId);
    pDict->close();
    pXrec->close();

код отрабатывает, Dictionary создается, но ссылку не создает... в чем может быть проблема?

Re: AcDbXrecord

Посмотри пример samples\database\xrecord_dg из ObjectARX SDK

Re: AcDbXrecord

> Александр Ривилис
я его уже 2-й день смотрю:)) он с текстом работает нормально, а с ссылкой на чертеж ну никак:(

Re: AcDbXrecord

меня еще смущает, что если в лиспе я могу сделать список:

(Setq ob1 (list
     (cons 0 "XRECORD")
     (cons 100 "AcDbXrecord")
     (cons 280 1)
     (cons 1 "C:\\test.dws")
    ))

то в ARX при сделать список

struct resbuf *pHead;
    pHead = acutBuildList(
    0, "XRECORD",
    100, "AcDbXrecord",
    280, 1,
    1, "C:\\test.dws",
        0);

не получается... он начинает ругаться... может изза этого??

Re: AcDbXrecord

> Serj!
Плохо смотришь. :(

static void CreateXrecord(void)
{
  AcDbDictionary *pNamedobj, *pDict;
  acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
  if (pNamedobj->getAt("AcStStandard", (AcDbObject*&) pDict,
    AcDb::kForWrite) == Acad::eKeyNotFound)
  {
    pDict = new AcDbDictionary;
    AcDbObjectId DictId;
    pNamedobj->setAt("AcStStandard", pDict, DictId);
  }
  pNamedobj->close();
  AcDbXrecord *pXrec = new AcDbXrecord;
  AcDbObjectId xrecObjId;
  pDict->setAt("test", pXrec, xrecObjId);
  pDict->close();
  struct resbuf *pHead;
  pHead = acutBuildList(
    280, 1,
    1, "C:\\test.dws",
    0);
  pXrec->setFromRbChain(*pHead);
  acutRelRb(pHead);
  pXrec->close();
}

Re: AcDbXrecord

struct resbuf *pHead;
    pHead = acutBuildList(
    0, "XRECORD",
    100, "AcDbXrecord",
    280, 1,
    1, "C:\\test.dws",
        0);

первый 0 нельзя. это конец списка. вместо него надо RTDXF0

Re: AcDbXrecord

> Александр Ривилис
код работает, но не выполняет своей основной обязанности... не создает ссылку на файл стандарта:(

Re: AcDbXrecord

> Serj!
млин:) вот так всегда:) 3 дня мучаешься, а потом за 10 минут все получается:)))
ссылка на файл не создавалась изза того, что не то имя давал ссылке...
вместо

pDict->setAt("XRECORD", pXrec, xrecObjId);

надо было всего лишь использовать

pDict->setAt("0", pXrec, xrecObjId);