16/03/2015
Программное добавление поля к тексту
Мы хотим знать как можно при помощи поля добавить к одному примитиву AcDbText содержимое другого примитива AcDbText.Для этого есть два API,
- AcFdMakeFieldCode – для форматирования поля, используя особые компоненты.
- acdbEvaluateFields – вычисляет все поля в объектах базы данных (подобно тому, как это делает команда _UpdateFields).
Код - C++: [Выделить]
- void AddField()
- {
- CString sPrompt(_T("\nВыберите примитив (текст): "));
- ads_name an;
- ads_point ap;
- int nReturn = acedEntSel(sPrompt, an, ap);
- // Выход если прервали или ничего не выбрали
- if (nReturn == RTCAN || nReturn == RTNONE)
- {
- return;
- }
- // Преобразуем ads_name в идентификатор объекта (AcDbObjectId)
- AcDbObjectId id;
- acdbGetObjectId(id, an);
- AcTransaction* pTrans = acdbTransactionManager->startTransaction();
- if (NULL == pTrans)
- {
- return;
- }
- AcDbText* pExistingText = NULL;
- Acad::ErrorStatus es = acdbTransactionManager->getObject((AcDbObject*&)pExistingText, id, AcDb::kForRead);
- if (!eOkVerify(es))
- {
- acdbTransactionManager->abortTransaction();
- acedPrompt(_T("\nЭто не текст"));
- return;
- }
- AcDbText* pText = new AcDbText();
- pText->setPosition(
- AcGePoint3d(pExistingText->position().x,
- pExistingText->position().y + 20.00,
- pExistingText->position().z));
- ads_name objName;
- acdbGetAdsName(objName, id);
- ACHAR* strField;
- AcFdMakeFieldCode(id,(AcDbEvalNodeId)0,
- _T("TextString"),
- AcFdEval::kObjFieldNone,
- _T(""),
- (AcHyperlink*)NULL,
- (ACHAR*&)strField);
- pText->setTextString(strField);
- AcDbBlockTableRecord* pModelSpace = NULL;
- es = acdbTransactionManager->getObject((AcDbObject*&)pModelSpace,
- acdbSymUtil()->blockModelSpaceId(
- acdbHostApplicationServices()->workingDatabase()),
- AcDb::kForWrite);
- if (!eOkVerify(es))
- {
- acdbTransactionManager->abortTransaction();
- acedPrompt(_T("\nНельзя открыть Пространство Модели для записи."));
- return;
- }
- AcDbObjectId outId;
- es = pModelSpace->appendAcDbEntity(outId, pText);
- if (!eOkVerify(es))
- {
- acdbTransactionManager->abortTransaction();
- acedPrompt(_T("\nНельзя добавить новый примитив."));
- return;
- }
- pText->close();
- /* Обновляем поля */
- es = acdbEvaluateFields(outId,
- AcDbField::kRegen,
- NULL,
- acdbHostApplicationServices()->workingDatabase(),
- AcFd::kEvalRecursive);
- if(!eOkVerify(es))
- {
- CString esText = acadErrorStatusText(es);
- esText = esText + _T(": Не удалось вычислить поле.");
- acedAlert(esText);
- }
- /* Чистим за собой */
- acutDelString(strField);
- acdbTransactionManager->endTransaction();
- }
Источник: 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