Тема: работа с XREf

Подскажите пожалуйста как программно достать существующие ссылки из файла dwg?и как программно их туда поместить?Мне нужно написать на С внешнюю программу и поместить ее в меню.Она должна уметь работать со ссылками-извлекать их(пути к ним) из открытого DWG в базу данных и формировать ссылки в dwg по указанным путям к ним.поясню задачу - все чертежи хранятся в системе документооборота.Надо ее сопрячь с автокадом.То есть нужна функция "Новая ссылка",в которой можно выбирать нужный файл из системы документооборота , прописывать его id в карточку документа и в сам файл чертежа как ссылку ,а при  загрузке этого документа ссылки должны ,браться из карточки и тоже подгружаться из системы документооборота .

Re: работа с XREf

> Ирина И.
Вот пример, как с помощью ObjectARX получить в текущем чертеже список всех Xref-ов:

  static void XrefUtilsGetAllXrefs(void)
  {
    Acad::ErrorStatus es;
    AcDbXrefGraph graphXref;
    if ((es = acdbGetHostDwgXrefGraph(acdbCurDwg(), graphXref)) == Acad::eOk) {
      //////////////////////////////////////////////////////////////////////////
      //     Дерево внешних ссылок всегда начинается с текущей базы.
      //     По этой причине начинаем индексацию с 1, а не 0.
      //////////////////////////////////////////////////////////////////////////
      acutPrintf("\nВсего %d внешних ссылок",graphXref.numNodes()-1);
      for (int idx=1; idx < graphXref.numNodes(); idx++) {
        AcDbXrefGraphNode *nodeXref = graphXref.xrefNode(idx);
        if (nodeXref) {
          AcDbObjectId btrId = nodeXref->btrId();
          AcDbBlockTableRecordPointer pBTR(btrId,AcDb::kForRead);
          const char *path = NULL;
          if ((es = pBTR.openStatus()) == Acad::eOk && (es = pBTR->pathName(path)) == Acad::eOk) {
            acutPrintf("\n  Xref[%d]=%s path=\"%s\"",idx,nodeXref->name(),path);
          } else {
            acutPrintf("\nError=%s",acadErrorStatusText(es));
          }
        }
      }
    } else {
      acutPrintf("\nacdbGetHostDwgXrefGraph(acdbCurDwg(), graphXref)=%s",acadErrorStatusText(es));
    }
  }

Это один из возможных способов. Id (если понимать под Id AcDbObjectId)  прописывать в "карточку" не имеет смысла, так его значение меняется при каждой загрузке чертежа в AutoCAD. Имеет смысл прописывать полный путь.
Это все IMHO, т.к. я не работаю с системами документооборота и не знаю их специфики.

Re: работа с XREf

Спасибо большое! Cсылки помещать в dwg попробую сама...Это ведь возможно с help ARX?

Re: работа с XREf

> Ирина И.
Пожалуйста! :) А поместить ссылку можно так (хотя это тоже не единственный способ):

  static void XrefUtilsAttachXref(void)
  {
    Acad::ErrorStatus es;
    resbuf rb;
    if (acedGetFileD("Файл для Xref",NULL,"dwg",8,&rb) == RTNORM && rb.restype == RTSTR && rb.resval.rstring) {
      char fullPath[_MAX_PATH]=""; strcpy(fullPath,rb.resval.rstring);
      acedFindFile(rb.resval.rstring,fullPath);
      acutPrintf("\nPath=%s",fullPath);
      char blkname[_MAX_PATH]="";
      // Имя блока = имя файла без расширения.
      _splitpath(rb.resval.rstring,NULL,NULL,blkname,NULL);
      AcGePoint3d pIns;
      AcGeScale3d pScale(1,1,1);
      double pRot = 0;
      if (acedGetPoint(NULL,"\nУкажите точку вставки: ",asDblArray(pIns)) == RTNORM) {
        acdbUcs2Wcs(asDblArray(pIns),asDblArray(pIns),false);
        acedGetReal("\nМасштаб по X <1> : ",&pScale.sx);
        acedGetReal("\nМасштаб по Y <1> : ",&pScale.sy);
        acedGetReal("\nМасштаб по Z <1> : ",&pScale.sz);
        acedGetAngle(asDblArray(pIns),"\nУгол поворота <0> : ",&pRot);
        AcDbObjectId btrId;
        es = acedXrefAttach(fullPath, blkname, &btrId, NULL, &pIns, &pScale,&pRot);
        if (es != Acad::eOk) {
          acutPrintf("\nacedXrefAttach=%s",acadErrorStatusText(es));
        }
      }
    }
  }