联动文本元素


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