Dans la 
leçon 12, nous avons présenté les lignes composées et examiné une manière non documentée de les créer. Dans la 
leçon 13 , des paragraphes ont été présentés. Aujourd'hui, nous allons voir comment les utiliser pour créer des chaînes composées. Pour commencer, prenons des lignes qui incluent des écarts et des fractions, et familiarisons-nous avec des composants de lignes composées comme un exposant, une sous-chaîne et des caractères spéciaux.

Le contenu de la série de leçons «Travailler avec l'API KOMPAS-3D»
- Les bases
- Conception de dessin
- Connexion correcte à KOMPAS
- Inscription principale
- Primitives graphiques
- Enregistrement d'un document dans différents formats
- Connaître les paramètres
- Méthodes d'écriture plus sophistiquées dans le cartouche
- Lecture des cellules de légende
- Caractères spéciaux dont une chaîne
- Étiquettes de texte simples
- Chaînes composées
- Paragraphes
- Texte multiligne
- Lignes composées basées sur des paragraphes
Écarts supérieurs et inférieurs
Ce qui suit est un fragment d'un programme qui illustre la sortie d'une ligne avec des écarts supérieurs et inférieurs à l'aide de paragraphes. Pour cela, les drapeaux 
END_DEVIAT , 
LOWER_DEVIAT et 
UPPER_DEVIAT , mentionnés dans la 
leçon 12, sont utilisés .
Extrait de code de programme//     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(UPPER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(LOWER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_DEVIAT); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 
 Comparé à l'exemple de la construction d'écarts par rapport à la 
leçon 12, le programme actuel présente deux avantages importants:
- Il utilise les capacités documentées du système COMPASS.
- Pas besoin de recalculer la position des rangées. KOMPAS détermine lui-même tous les décalages nécessaires.
Notez l'utilisation de l'indicateur 
END_DEVIAT . Il termine la génération de l'écart et annule les 
indicateurs LOWER_DEVIAT et 
UPPER_DEVIAT . Si nous ne l'avions pas utilisé, la ligne «Texte après écarts» serait affichée comme l'écart le plus faible.
Les drapeaux 
LOWER_DEVIAT et 
UPPER_DEVIAT s'annulent. Lorsqu'elle est utilisée simultanément, la chaîne est sortie comme elle serait affichée sans spécifier ces drapeaux.
Étant donné que l'indicateur 
NEW_LINE n'est pas utilisé dans notre exemple, toutes les lignes peuvent être affichées avec un seul appel à la méthode 
ksTextLine . Pour ce faire, ils sont préformés sous la forme de l'interface 
ksTextLineParam .
Le résultat du programme est illustré dans la figure ci-dessous.

Fraction
Voici un exemple de programme qui illustre la sortie d'une chaîne qui comprend une fraction.
Exemple de programme //     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 
 La construction d'une fraction diffère peu de la construction des écarts. La seule différence est les drapeaux utilisés. L'indicateur 
END_FRACTION annule les 
indicateurs NUMERATOR et 
DENOMINATOR et agit de la même manière que l'indicateur 
END_DEVIAT en ce qui concerne les écarts.
La figure ci-dessous montre le résultat de ce programme.

Cette ligne semble plus nette par rapport au même texte de la 
leçon 12 .
Contrôle de la taille des fractions
La fraction affichée peut avoir une taille différente, qui est contrôlée à l'aide de l'interface 
ksTextItemParam . Si sa propriété 
type est 
FRACTION_TYPE , cette interface, entre autres, définit la taille de la fraction. La taille elle-même est spécifiée dans la propriété 
iSNumb . Ses valeurs valides sont indiquées dans le tableau ci-dessous.

Si la propriété 
iSNumb spécifie une valeur non valide, alors KOMPAS utilise la hauteur par défaut.
Voici un exemple d'utilisation de l'indicateur 
FRACTION_TYPE .
Exemple d'utilisation d'indicateur //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); itemParam->set_type(FRACTION_TYPE); itemParam->set_iSNumb(3); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 
 Cet exemple diffère du précédent uniquement en définissant le type 
FRACTION_TYPE dans la propriété 
type de l'interface 
ksTextItemParam lors de la sortie du numérateur. Cependant, cela suffit pour redimensionner la fraction. La figure ci-dessous montre le résultat de ce programme (comparez-le avec le résultat de l' 
exemple précédent ).

Remarque: la taille de la fraction est définie lorsque le numérateur est affiché. Comme mes expériences le montrent, la taille de fraction spécifiée lorsque le dénominateur est affiché est ignorée.
Exposant et sous-chaîne
La construction d'une sous-chaîne et d'une sous-chaîne est contrôlée par les indicateurs répertoriés dans le tableau ci-dessous.

Voici un exemple de programme qui illustre la sortie d'une chaîne avec une sous-chaîne et une sous-chaîne.
Exemple de programme //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 
 La figure ci-dessous montre le résultat de ce programme.
 Vous
Vous ne pouvez pas créer une sous-chaîne et une sous-chaîne à l'aide de la méthode 
ksDocument2D :: ksText .
Contrôle de la taille de la ligne principale
La ligne principale peut avoir une taille différente, qui est modifiée à l'aide de l'interface 
ksTextItemParam . Pour cela, la constante 
SUM_TYPE est spécifiée dans sa 
propriété type et la taille requise de la ligne principale dans la propriété 
iSNumb . Les valeurs valides sont indiquées dans le tableau ci-dessous:

Si la propriété 
iSNumb contient une valeur non valide, KOMPAS utilise la valeur par défaut.
Voici un extrait d'un programme démontrant l'utilisation de la constante 
SUM_TYPE .
Extrait de programme //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); itemParam->set_type(SUM_TYPE); itemParam->set_iSNumb(2); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); itemParam->set_type(0); itemParam->set_iSNumb(0); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 
 La 
constante SUM_TYPE est entrée dans la propriété 
type de l'interface 
ksTextItemParam lorsque la ligne principale est 
affichée . Avant la sortie du 
complément , l'interface 
ksTextItemParam est 
restaurée à son état initial. C'est la seule différence entre cet exemple et le précédent.
La figure ci-dessous montre le résultat du programme (comparez-le avec le résultat de l'exemple précédent).

La 
constante SUM_TYPE vous permet de redimensionner la chaîne principale, mais pas les sous-chaînes et les sous-chaînes. La modification de leurs tailles dans KOMPAS n'est pas fournie.
Caractères spéciaux dont une sous-chaîne
Un paragraphe peut gérer des caractères spéciaux qui incluent une chaîne (ils ont été abordés dans la 
leçon 10 du cycle). Ce qui suit est un fragment d'un programme démontrant leur utilisation dans un paragraphe.
Extrait de programme //  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 | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(169); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //     itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(96); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //   itemFont->set_bitVector(NEW_LINE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(0); itemParam->set_iSNumb(0); 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(); 
 L'exemple semble très compliqué, mais si vous le regardez attentivement, vous pouvez voir qu'il consiste à répéter des morceaux. Dans celui-ci, à l'aide de caractères spéciaux, du texte barré et souligné est affiché. Après chacun de ces blocs, une ligne vide avec l'indicateur 
SPECIAL_SYMBOL_END s'affiche . Sa tâche est d'annuler l'action du personnage spécial. S'il n'est pas affiché, le paragraphe risque de ne pas être construit correctement. L'action du caractère spécial s'étend à l'ensemble 
du bloc 
ksTextLineParam , à toute sa longueur quel que soit son contenu réel (cette thèse est illustrée dans la figure ci-dessous).

La ligne d'annulation doit faire partie du bloc 
ksTextLineParam . Sinon, le paragraphe risque de ne pas être construit correctement. Le bloc 
ksTextLineParam peut contenir plusieurs caractères de contrôle. Chacun d'eux doit avoir sa propre ligne d'annulation.
L'indicateur 
SPECIAL_SYMBOL_END est utilisé uniquement pour les caractères spéciaux qui ont une sous-chaîne. Pour les caractères spéciaux ordinaires, il n'est pas nécessaire.
La figure ci-dessous montre le résultat de notre exemple.
 Conclusion
ConclusionDans cette leçon, nous avons appris à utiliser des paragraphes pour créer des lignes composées, y compris les écarts et les fractions, et examiné les moyens documentés de créer des lignes composées à partir d'un paragraphe. Ce n'est pas la seule et loin de la façon la plus simple de les créer. Une autre manière, beaucoup plus simple, nous considérerons dans la prochaine leçon.
Pour continuer, suivez l'actualité du blog.
 Sergey Norseev, Ph.D., auteur du livre "Application Development for COMPAS in Delphi".