[MSCE C++] 利用dgnlib库中文字样式创建文字的疑问

DgnTextStylePtr textStyleLocalPtr = DgnTextStyle::GetByName(L"Annotation", StyleIteratorMode::ActiveFileAndLibraries);

利用如上代码可获取当前文件或者dgnlib库中的字体样式,但是当利用仅存在于库中的字体样式创建文字时,此时的字体样式并没有自动的拷贝到当前主文件,利用DgnTextStyle结构中的copy(),Add()方法均不能实现拷贝的过程,麻烦老师指导一下,谢谢~~

  • 请尝试如下代码。关键一点是Add函数的参数要明确给dgnFile为当前DGN。

    void copyTextStyleFromDgnlibToActiveDgn()
    {
    	DgnTextStylePtr txtStyle = DgnTextStyle::GetByName(L"5mm", StyleIteratorMode::ActiveFileOnly);
    	if (!txtStyle.IsValid())
    	{
    		txtStyle = DgnTextStyle::GetByName(L"5mm", StyleIteratorMode::ActiveFileAndLibraries);
    		if (!txtStyle.IsValid())
    		{
    			mdlDialog_dmsgsPrint(L"No such text style");
    			return;
    		}
    		DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile();
    		DgnTextStylePtr newTxtStyle = txtStyle->Copy();
    		newTxtStyle->Add(dgnFile);
    	}
    }



    Answer Verified By: Zemin.Li 

  • 感谢符老师给的方法。我测试了一下您的这个函数,可以从dgnlib中往当前dgn文件复制文字样式了。

    只是用复制的样式写入文本元素时发生了点奇怪的小问题,不知道是不是我电脑工作空间配置的原因:

    第一次运行插件从dgnlib往当前文件复制文字样式,并且应用该样式放置文本时,发现文本的属性中文本样式还是为空。但此时当前dgn文本确实已经有该文本样式了。

    第二次再执行同样的插件用该样式放置文本时,文本的属性中的文本样式就正常了。

    一开始我在想会不会是因为复制了库中的样式到本地文件时本地文件没有及时保存更改的原因,就在上面函数中加了

    dgnFile->ProcessChanges(DgnSaveReason::ApplInitiated)

    可结果还是这样。再次麻烦老师了。

    #include "Mstn/MdlApi/MdlApi.h"
    #include <DgnView/DgnElementSetTool.h>
    #include <Mstn/ISessionMgr.h>
    #include <DgnPlatform/TextHandlers.h>
    
    USING_NAMESPACE_BENTLEY;
    USING_NAMESPACE_BENTLEY_DGNPLATFORM;
    USING_NAMESPACE_BENTLEY_MSTNPLATFORM;
    USING_NAMESPACE_BENTLEY_MSTNPLATFORM_ELEMENT;
    
    bool copyTextStyleFromDgnlibToActiveDgn(DgnTextStylePtr& localTextStyle, const WString& textStyleName)
    {
    	DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile();
    	localTextStyle = DgnTextStyle::GetByName(textStyleName.GetWCharCP(), StyleIteratorMode::ActiveFileOnly);
    	if (!localTextStyle.IsValid())
    	{
    		DgnTextStylePtr dgnlibTextStyle = DgnTextStyle::GetByName(textStyleName.GetWCharCP(), StyleIteratorMode::LibrariesOnly);
    		if (!dgnlibTextStyle.IsValid())
    			return false;
    		localTextStyle = dgnlibTextStyle->Copy();
    		if (localTextStyle->Add(dgnFile) != SUCCESS)
    			return false;
    		if (dgnFile->ProcessChanges(DgnSaveReason::ApplInitiated) != SUCCESS)
    			return false;
    	}
    	return true;
    }
    
    void addTextElement( )
    {
    	WString textStyleName = L"5mm";
    	DgnTextStylePtr localTextStyle;
    	if (!copyTextStyleFromDgnlibToActiveDgn(localTextStyle, textStyleName))
    		return;
    
    	DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP();
    	TextBlockPropertiesPtr  pTBProp = TextBlockProperties::Create(*pActiveModel);
    	pTBProp->SetIsViewIndependent(true);
    	ParagraphPropertiesPtr  pParaProp = ParagraphProperties::Create(*pActiveModel);
    	RunPropertiesPtr        pRunProp = RunProperties::Create(*localTextStyle, *pActiveModel);
    
    	if (pParaProp != nullptr)
    	{
    		TextBlockPtr pTextBlock = TextBlock::Create(*pTBProp, *pParaProp, *pRunProp, *pActiveModel);
    		pTextBlock->AppendText(L"This is a ViewIndependent text");
    
    		EditElementHandle  eeh;
    		if (TEXTBLOCK_TO_ELEMENT_RESULT_Success == TextHandlerBase::CreateElement(eeh, nullptr, *pTextBlock))
    		{
    			eeh.AddToModel();
    		}
    	}
    }
    
    extern "C" void MdlMain(int argc, WCharCP argv[])
    {
    	addTextElement();
    }

  • 管工你好,我也遇到了同样的问题,请指教。