使用KOMPAS-3D API→第10课→特殊字符,包括字符串

在本周期的第4课中,我们已经熟悉特殊字符。 在此显示了它们最简单的用法。 它还说,如果ksTextItemParam接口同时指定了特殊字符和字符串,则该字符串将立即位于特殊字符之后。 但是,有些特殊字符违反了此规则。 今天我们将讨论它们。




课程系列“使用KOMPAS-3D API的工作”的内容


  1. 基础知识
  2. 图纸设计
  3. 正确连接到KOMPAS
  4. 主题词
  5. 图形图元
  6. 以各种格式保存文档
  7. 了解设置
  8. 标题栏中更复杂的书写方法
  9. 读取字幕单元
  10. 特殊字符,包括字符串


特殊字符,包括字符串



特殊符号表在KOMPAS主要帮助的附录V中

字符串包括带有数字78-80,83,93-99,171172的特殊字符。 在这种情况下, ksTextItemParam接口的字符串s不在特殊字符之后,而是在特殊字符之后。 例如,带有数字80的特殊字符将在框架中显示文本。 下面是一个程序示例,演示了如何使用这种特殊字符。

//    TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //  TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L""); TextItemParam->set_s(str); SysFreeString(str); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextItemParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

为简单起见,此示例省略了负责创建和执行文档的代码(在本周期的先前课程中讨论了该主题)。 下图显示了此程序形成的主要标签。



为简单起见,我们仅填写一个单元格。 带有数字98的特殊字符定义平方根的符号。 请注意, ksTextItemParam接口的s属性的值完全在根符号下。 其他特殊字符(包括字符串)的工作方式也完全相同。

特殊字符和ksTextLineParam


特殊字符的作用不仅限于ksTextItemParam接口。 考虑下面的示例。

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

在此示例中,在标题栏中输入了由三个组件组成的行。 前两个包含特殊字符和字符串。 第三部分仅包含一个字符串,没有特殊字符。 让我们看一下程序的结果(下图仅显示了生成的行,没有主标题)。



请注意,第二个特殊字符包含“第2页”行和“第3页”行,我们计划将其显示在特殊字符之外。 而且,这两个行都包含在第一个特殊字符中(我们也不打算这样做)。 此示例说明了两个重要点:

  • 特殊字符可能包括其他特殊字符;
  • 特殊字符的作用扩展到组成ksTextLineParam接口的所有组件。

出现一个合理的问题-是否有办法限制特殊字符的作用? 是的,有。 但是,为了理解它,您首先需要熟悉ksTextItemFont接口。

文本组件字体选项( ksTextItemFont


根据文档, ksTextItemFont接口描述了文本组件的字体参数。 但是实际上,它的功能超出了所使用字体的简单描述。 该界面允许您创建复合线(关于它们-在本周期的下一课中)。

您可以通过多种方式获得它。 首先,使用KompasObject接口的GetParamStruct方法:为此,应将常数ko_TextItemFont作为唯一参数传递给此方法。 其次,使用ksTextItemParam接口的GetItemFont方法。 此方法没有输入参数,并返回已经与文本组件关联的ksTextItemFont接口。

考虑ksTextItemFont接口的属性。
位向量-定义文本特征的位向量(将在本周期的下一课中详细讨论)。
color -RGB格式字符的颜色。
fontName-具有字体名称的字符串。
height-字体高度,以毫米为单位。
ksu是文本拉伸因子。
ksTextItemFont接口只有三种方法。
Init()重置所有接口属性。 没有输入参数。 如果成功,则返回TRUE ,如果出现错误,则返回-FALSE
GetBitVectorValue从位向量集中返回单个标志的值。 它以标志作为唯一参数,我们要确定其值。 如果设置,则该方法返回TRUE ;如果重置,则返回FALSE
SetBitVectorValue更改单个标志的值。 以下是此方法的原型:

 BOOL SetBitVectorValue ( long bitVector, //  BOOL state //   ); 

如果状态参数值为TRUE ,则bitVector标志将竖起,否则将被重置。
如果成功,则SetBitVectorValue方法返回TRUE ,如果发生错误,则返回FALSE
GetBitVectorValueSetBitVectorValue方法允许您使用bitvector属性,而无需直接访问它。

特殊字符限制


设计了两个标志来控制特殊字符。 它们在下表中列出。



描述接口ksTextItemParam时已经考虑过标志SPECIAL_SYMBOL 。 为了指示-需要一个特殊字符而显示。 ksTextItemFont接口的bitVector属性中复制了相同的标志(如我的实验所示,此复制是可选的)。

第二个标志( SPECIAL_SYMBOL_END )仅对包含字符串的特殊字符有意义。 取消特殊字符的动作。 该标志之后显示的行不包含在特殊字符中。

两个标志的组合动作取消特殊字符的动作。 在这种情况下,特殊字符将不会显示在文档中。

例子


下面是修改后的程序的源代码。 使用上述标志,它可以实现组件的正确输出。

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont->Init(); TextItemFont.Unbind(); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

此示例与上一个示例之间的唯一区别是,在每个特殊字符之后都会显示一个组件,该组件的ksTextItemFont接口中设置了SPECIAL_SYMBOL_END标志。 其唯一目的是取消特殊字符的动作。 在第一种情况下,它不包含任何数据(当然,标志除外)。 在第二种情况下,它包含字符串“ Page 3”

您不能将SPECIAL_SYMBOL_END标志与第二个特殊字符的输出结合使用。 由于在这种情况下,此标志将取消两个特殊字符的动作。 将显示“页2”行而没有删除线。

下图显示了该程序在标题栏中显示的行。



如您所见,特殊字符的动作现在仅适用于“您的”组件。

嵌套的特殊符号


今天的课程的第一个示例清楚地显示了-特殊字符可以相互嵌入。 SPECIAL_SYMBOL_END标志取消一个(最后一个)特殊字符的动作。 这使您可以使用嵌入的特殊字符来构建复杂的行。

下面是修改示例的源代码,其中子字符串“ Page 2”也包含在平方根符号下的表达式中。

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

请注意,在替换字符串“ Page 2”之后,我们将输出带有标志SPECIAL_SYMBOL_END的组件(第一次-作为空组件的一部分,第二次-与字符串“ Page 3”一起 )。 这是取消特殊字符的操作所必需的。 我们第一次取消特殊字符169 (删除线),第二次取消98 (平方根)。 如果我们只显示一个带有SPECIAL_SYMBOL_END标志的组件,这将仅取消特殊字符169 ,而不取消98 。 在这种情况下, “页3”行不会被划掉,而是会包含在表达式中的根符号下。
下图显示了该程序的结果。



结论

在本课程中,我们遇到了包含字符串的特殊字符。 如您所见,它们与简单的特殊字符(例如,希腊字母)大不相同。 尽管我们在主铭文示例中显示了它们,但这不应使您感到困惑。 这些字符可以在其他文本输出方法中使用。 在下一课中,我们将考虑其中一种方法。

要继续,请关注博客新闻。

Sergey Norseev博士,《在Delphi中进行COMPAS的应用程序开发》一书的作者。

Source: https://habr.com/ru/post/zh-CN414701/


All Articles