Message 1 of 1
How to use AcDbField::setFieldCode with children?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
the children don't stick
static auto postToModelSpace(AcDbEntity* pEnt)
{
if (pEnt == nullptr)
return std::make_tuple(Acad::eNullEntityPointer, AcDbObjectId::kNull);
AcDbObjectId id;
AcDbDatabase* pDb = acdbCurDwg();
AcDbBlockTableRecordPointer model(getblockModelSpaceId(pDb), AcDb::OpenMode::kForWrite);
Acad::ErrorStatus es = model->appendAcDbEntity(id, pEnt);
return std::make_tuple(es, id);
}
static auto entsel(const TCHAR* msg = L"\nSelect Entity: ", const AcRxClass* desc = AcDbEntity::desc())
-> std::tuple<Acad::PromptStatus, AcDbObjectId, AcGePoint3d>
{
AcDbObjectId id;
AcGePoint3d pnt;
ads_name name = { 0L };
auto res = static_cast<Acad::PromptStatus>(acedEntSel(msg, name, asDblArray(pnt)));
if (res == Acad::eNormal)
{
if (auto es = acdbGetObjectId(id, name); es != eOk)
return std::make_tuple(Acad::PromptStatus::eError, id, pnt);
if (!id.objectClass()->isDerivedFrom(desc))
return std::make_tuple(Acad::PromptStatus::eRejected, id, pnt);
}
return std::make_tuple(res, id, pnt);
}
static void createField()
{
using AcDbFieldPtr = AcDbObjectPointer<AcDbField>;
using AcDbMTextPtr = AcDbObjectPointer<AcDbMText>;
auto [ps, id, pnt] = entsel(L"\nPick a line", AcDbLine::desc());
if (ps != Acad::PromptStatus::eNormal)
return; //oof
AcDbDatabase* pDb = acdbCurDwg();
//child1
auto childCode1 = std::format(L"%<\\AcObjProp Object(%<\\_ObjId {}>%).Layer>%", id.asOldId());
auto childFlag1 = AcDbField::FieldCodeFlag(
AcDbField::FieldCodeFlag::kObjectReference |
AcDbField::FieldCodeFlag::kPreserveFields
);
AcDbFieldPtr childField1;
childField1.create();
childField1->postInDatabase(pDb);
childField1->setEvaluationOption(AcDbField::EvalOption::kAutomatic);
childField1->setFieldCode(childCode1.c_str(), childFlag1);
childField1->evaluate(AcDbField::EvalContext::kDemand,pDb);
acutPrintf(L"\nchildField1 = %ls", childField1->getFieldCode(AcDbField::kEvaluatedText));
//child2
auto childCode2 = std::format(L"%<\\AcObjProp Object(%<\\_ObjId {}>%).Length>%", id.asOldId());
auto childFlag2 = AcDbField::FieldCodeFlag(
AcDbField::FieldCodeFlag::kObjectReference |
AcDbField::FieldCodeFlag::kPreserveFields
);
AcDbFieldPtr childField2;
childField2.create();
childField2->postInDatabase(pDb);
childField2->setEvaluationOption(AcDbField::EvalOption::kAutomatic);
childField2->setFieldCode(childCode2.c_str(), childFlag2);
childField2->evaluate(AcDbField::EvalContext::kDemand, pDb);
acutPrintf(L"\nchildField2 = %ls", childField2->getFieldCode(AcDbField::kEvaluatedText));
//parent
AcDbFieldArray children;
children.append(childField1);
children.append(childField2);
const auto parentCode = L"hi %<\\_FldIdx 0>%, %<\\_FldIdx 1>%";
auto parentFlag = AcDbField::FieldCodeFlag(
AcDbField::FieldCodeFlag::kTextField
);
AcDbFieldPtr parentField;
parentField.create();
parentField->postInDatabase(pDb);
parentField->setEvaluationOption(AcDbField::EvalOption::kAutomatic);
parentField->setFieldCode(parentCode, parentFlag, &children);
parentField->evaluate(AcDbField::EvalContext::kDemand, pDb);
acutPrintf(L"\nparentField = %ls", parentField->getFieldCode(AcDbField::kEvaluatedText));
//set
AcDbMTextPtr pMtext;
pMtext.create();
pMtext->setLocation(pnt);
postToModelSpace(pMtext);
AcDbObjectId fid;
pMtext->setField(L"TEXT", parentField, fid);
}
static void AcRxPyApp_idoit1(void)
{
createField();
}
the result:
Command: IDOIT1
Pick a line
childField1 = 0
childField2 = 19.036052
parentField = hi ,
Python for AutoCAD, Python wrappers for ARX https://github.com/CEXT-Dan/PyRx