关于TextBlock中的TextPart


MicroStation CE相较于MicroStation V8i的一个显著变化就是在文字处理方面。它采用了Unicode取代了以前的多种杂乱的文字表达。

从编程角度看,MSCE的MDL(C/C++)中不再使用char、MSWChar和MSWideChar这三种字符类型而统一改用WChar了。我们再也不用使用如下图所示的几个函数在三种字符类型间转来转去了。

原来的mdlText_xxx函数也被废弃,需要改用全新的TextBlock来表达文字。而这个TextBlock不仅仅能处理文本(Text)或文本节点(TextNode)元素中的文字,它还用于处理其他可能含有文字的元素,比如尺寸标注(Dimension)或表(Table)元素。那么对于后两种,可能会在多个部分含有文字,因此就引入了TextPart这个概念。请看下图:

communities.bentley.com/.../TextPartTest.dgn

上图中总共有5个元素,依次是单行文本元素、多行文本元素(也叫文本节点)、表元素、标注元素、双行尺寸标注元素(可在尺寸标注样式中定义这种样子)。用如下C# 代码(C++代码也类似)分别取得它们的TextPart并输出个数。

ulong id = 1193;
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
Element elem = dgnModel.FindElementById(new ElementId(ref id));
TextQuery txtQuery = TextQuery.GetAsTextQuery(elem);
TextQueryOptions options = new TextQueryOptions();
TextPartIdCollection txtParts = txtQuery.GetTextPartIds(options);
MessageCenter.Instance.ShowInfoMessage("num of TextPart = " + txtParts.Count, null, false);

依次得到的TextPart个数为:1、1、12、1、2。可见多行文字也是一个TextPart,而表元素中的每个单元格中的文字是一个TextPart。双行尺寸标注元素的TextPart为2,分别对应主单位和次单位两个标注。

有了TextPart(实际是TextPartId)后就能获得该TextPart对应的TextBlock了。

TextBlock txtBlk = txtQuery.GetTextPart(txtParts[0]);