Mstn中放置文本元素的工具有一个是否关联元素的选项,如下图所示:
选中此选项以后,在放置文本元素之前,我们需要先选中当前模型中任意图形元素上的一点,然后才是指定文本元素放置的位置。这样放置出来的文本元素会随着我们选中图形元素的移动而移动,可以保证文本元素相对于图形元素的位置不变。那么我们如果通过代码实现呢?我们需要调用到C/C++类TextHandlerBase下的一个成员函数,此成员函数的原型如下所示:
DGNPLATFORM_EXPORT static BentleyStatus SetupOffsetAssociation(EditElementHandleR textElement, ElementHandleCR targetElement, AssocPoint const& assoc);
具体用法可参考如下代码:
ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (selectset.GetCount() < 1) { return; } EditElementHandleR eeh = selectset[0]; TextBlockPropertiesPtr txtBlockProp = TextBlockProperties::Create(*ACTIVEMODEL->AsDgnModelP()); ParagraphPropertiesPtr paraProp = ParagraphProperties::Create(*ACTIVEMODEL->AsDgnModelP()); DgnTextStylePtr dgnTxtStyle = DgnTextStyle::GetActive(); RunPropertiesPtr runProp = RunProperties::Create(*dgnTxtStyle, *ACTIVEMODEL->AsDgnModelP()); TextBlockPtr txtBlock = TextBlock::Create(*txtBlockProp, *paraProp, *runProp, *ACTIVEMODEL->GetDgnModelP()); txtBlock->AppendText(L"AAA"); EditElementHandle eehTxt; TextHandlerBase::CreateElement(eehTxt, NULL, *txtBlock); AssocPoint assocPt; AssociativePoint::InitKeypoint(assocPt, 0, 0, 0, 1); AssociativePoint::SetRoot(assocPt, eeh.GetElementId(), 0); TextHandlerBase::SetupOffsetAssociation(eehTxt, eeh, assocPt); eehTxt.AddToModel();