使用KOMPAS-3D API→第14课→多行文本

在上一课中,我们研究了如何使用段落显示多行文本。 所描述的方法需要手动遍历输出字符串数组。 在本课程中,我们将探讨一种没有此缺点的替代方法。 它基于ksTextParam接口和ksTextEx方法。



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


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

文字选项( ksTextParam


ksTextParam接口是ksParagraphParam接口的附加组件,并且是输出字符串的数组。 要获取它,您需要使用常量ko_TextParam调用KompasObject接口的GetParamStruct方法。
ksTextParam接口没有属性 ,因此我们立即开始考虑其方法。
GetParagraphParam() -返回ksParagraphParam段落的参数接口。 没有输入参数。
GetTextLineArr() -返回输出行ksDynamicArray的动态数组。 没有输入参数。
Init() -重置文本参数。 没有输入参数。 如果成功,则返回true。
SetParagraphParam-设置段落参数。 作为唯一参数,它接受包含可设置参数的ksParagraphParam接口。 如果成功,则返回true ,如果发生错误,则返回false
SetTextLineArr-设置输出字符串的数组。 作为唯一参数,它采用包含输出行的ksDynamicArray接口。 如果成功,则返回true ,如果发生错误,则返回false
GetTextLineArr()方法返回并由SetTextLineArr方法设置的动态数组的类型为TEXT_LINE_ARR 。 这意味着数组的元素是ksTextLineParam接口。

KsTextEx方法


要显示多行文本,请使用ksDocument2D界面的ksTextEx方法。 下面是它的原型:

long ksTextEx ( LPDISPATCH txtParam, //  ksTextParam long align //   ); 

下表显示align参数的有效值。



如果成功,则ksTextEx方法将返回一个指向生成的文本的整数指针。 并且在错误为零的情况下。

例子


以下是演示使用ksTextEx方法输出多行文本的程序的摘要。
 //  DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); DynamicArrayPtr lines; lines = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_LINE_ARR)); lines->ksClearArray(); //   TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemFont->set_bitVector(NEW_LINE | ITALIC_OFF); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemFont->set_bitVector(NEW_LINE | ITALIC_ON | BOLD_ON); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemFont->set_bitVector(NEW_LINE | BOLD_OFF | UNDERLINE_ON); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemParam.Unbind(); lineParam.Unbind(); itemFont.Unbind(); items.Unbind(); //    ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); paragraphParam->set_width(60.0); paragraphParam->set_hFormat(2); //    TextParamPtr textParam = static_cast<TextParamPtr>(kompas->GetParamStruct(ko_TextParam)); textParam->SetParagraphParam(paragraphParam); textParam->SetTextLineArr(lines); //  Document2D->ksTextEx(textParam, 1); lines->ksDeleteArray(); lines.Unbind(); paragraphParam.Unbind(); textParam.Unbind(); //   kompas->set_Visible(true); kompas.Unbind(); 


在此示例中,我们不绕过数组,而是一次调用所需的方法。 他找到NEW_LINE标志并正确解释它们。 请注意:带有此标志的每一行都在单独的ksTextLineParam接口中发布。 如果将它们放在一个ksTextLineParam中 ,则COMPAS将忽略NEW_LINE标志。 下图显示了该程序的结果。



结论

在本课程中,我们研究了显示多行文本的另一种方法。 它比我们之前检查的要复杂一些,但是不需要手动遍历字符串数组。 使用哪个取决于您。

在下一课中,我们将返回复合线的主题,并查看使用段落创建复合线的文档化方法。

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

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

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


All Articles