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

16/03/2015

Программное добавление поля к тексту

Мы хотим знать как можно при помощи поля добавить к одному примитиву AcDbText содержимое другого примитива AcDbText.

Для этого есть два API,

  1. AcFdMakeFieldCode – для форматирования поля, используя особые компоненты.
  2. acdbEvaluateFields – вычисляет все поля в объектах базы данных (подобно тому, как это делает команда _UpdateFields).

Код - C++: [Выделить]
  1. void AddField()
  2. {
  3.   CString sPrompt(_T("\nВыберите примитив (текст): "));
  4.   ads_name  an;
  5.   ads_point ap;
  6.   int nReturn = acedEntSel(sPrompt, an, ap);
  7.   // Выход если прервали или ничего не выбрали
  8.   if (nReturn == RTCAN || nReturn == RTNONE)
  9.   {
  10.     return;
  11.   }
  12.   // Преобразуем ads_name в идентификатор объекта (AcDbObjectId)
  13.   AcDbObjectId id;
  14.   acdbGetObjectId(id, an);
  15.   AcTransaction* pTrans = acdbTransactionManager->startTransaction();
  16.   if (NULL == pTrans)
  17.   {
  18.     return;
  19.   }
  20.  
  21.   AcDbText* pExistingText = NULL;
  22.   Acad::ErrorStatus es = acdbTransactionManager->getObject((AcDbObject*&)pExistingText, id, AcDb::kForRead);
  23.   if (!eOkVerify(es))
  24.   {
  25.     acdbTransactionManager->abortTransaction();
  26.     acedPrompt(_T("\nЭто не текст"));
  27.     return;
  28.   }
  29.  
  30.   AcDbText* pText = new AcDbText();
  31.   pText->setPosition(
  32.     AcGePoint3d(pExistingText->position().x,
  33.     pExistingText->position().y + 20.00,
  34.     pExistingText->position().z));
  35.  
  36.   ads_name objName;
  37.   acdbGetAdsName(objName, id);
  38.   ACHAR* strField;
  39.  
  40.   AcFdMakeFieldCode(id,(AcDbEvalNodeId)0,
  41.     _T("TextString"),
  42.     AcFdEval::kObjFieldNone,
  43.     _T(""),
  44.     (AcHyperlink*)NULL,
  45.     (ACHAR*&)strField);
  46.   pText->setTextString(strField);
  47.  
  48.   AcDbBlockTableRecord* pModelSpace = NULL;
  49.   es = acdbTransactionManager->getObject((AcDbObject*&)pModelSpace,
  50.     acdbSymUtil()->blockModelSpaceId(
  51.     acdbHostApplicationServices()->workingDatabase()),
  52.     AcDb::kForWrite);
  53.  
  54.   if (!eOkVerify(es))
  55.   {
  56.     acdbTransactionManager->abortTransaction();
  57.     acedPrompt(_T("\nНельзя открыть Пространство Модели для записи."));
  58.     return;
  59.   }
  60.  
  61.   AcDbObjectId outId;
  62.   es = pModelSpace->appendAcDbEntity(outId, pText);
  63.   if (!eOkVerify(es))
  64.   {
  65.     acdbTransactionManager->abortTransaction();
  66.     acedPrompt(_T("\nНельзя добавить новый примитив."));
  67.     return;
  68.   }
  69.  
  70.   pText->close();
  71.   /* Обновляем поля */
  72.   es = acdbEvaluateFields(outId,
  73.     AcDbField::kRegen,
  74.     NULL,
  75.     acdbHostApplicationServices()->workingDatabase(),
  76.     AcFd::kEvalRecursive);
  77.  
  78.   if(!eOkVerify(es))
  79.   {
  80.     CString esText = acadErrorStatusText(es);
  81.     esText = esText + _T(": Не удалось вычислить поле.");
  82.     acedAlert(esText);
  83.   }
  84.  
  85.   /* Чистим за собой */
  86.   acutDelString(strField);
  87.   acdbTransactionManager->endTransaction();
  88. }

 

Источник: http://adndevblog.typepad.com/autocad/2015/03/adding-field-to-text-programmatically.html

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

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