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();