Nous avons déjà fait la connaissance de caractères spéciaux dans la
4e leçon de notre cycle. Leur utilisation la plus simple y a été montrée. Il a également indiqué que si l'interface
ksTextItemParam spécifie à la fois un caractère spécial et une chaîne, la chaîne se trouve immédiatement après le caractère spécial. Cependant, il existe des caractères spéciaux qui violent cette règle. Nous en parlerons aujourd'hui.

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
Caractères spéciaux dont une chaîne
Le tableau des signes spéciaux se trouve à l'annexe V de l'aide principale de KOMPASLes caractères spéciaux avec les nombres
78-80 ,
83 ,
93-99 ,
171 et
172 incluent la chaîne. Dans ce cas, la chaîne
s de l'interface
ksTextItemParam n'est pas située après le caractère spécial, mais à l'intérieur. Par exemple, un caractère spécial avec le nombre
80 affiche le texte dans le cadre. Voici un exemple de programme qui montre comment travailler avec un tel caractère spécial.
// 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();
Par souci de simplicité, cet exemple omet le code responsable de la création et de l'exécution du document (ce sujet a été discuté dans les leçons précédentes du cycle). La figure ci-dessous montre l'étiquette principale formée par ce programme.

Par souci de simplicité, nous remplissons une seule cellule. Le caractère spécial avec le numéro
98 définit le signe de la racine carrée. Notez que la valeur de la propriété s de l'interface
ksTextItemParam est complètement sous le signe racine. Les autres caractères spéciaux, y compris la chaîne, fonctionnent exactement de la même manière.
Caractères spéciaux et ksTextLineParam
L'action des caractères spéciaux n'est pas limitée à l'interface
ksTextItemParam . Considérez l'exemple ci-dessous.
// 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();
Dans cet exemple, une ligne composée de trois composants est entrée dans le cartouche. Les deux premiers contiennent un caractère spécial et une chaîne. Le troisième composant ne contient qu'une chaîne, sans caractère spécial. Regardons le résultat du programme (la figure ci-dessous montre seulement la ligne générée sans l'inscription principale).

Veuillez noter que la ligne
«Page 2» et la ligne
«Page 3» ont été incluses dans le deuxième caractère spécial, que nous avions prévu d'afficher en dehors du caractère spécial. De plus, ces deux lignes ont été incluses dans le premier caractère spécial (nous ne l'avions pas prévu non plus). Cet exemple montre deux points importants:
- les caractères spéciaux peuvent inclure d'autres caractères spéciaux;
- l'action du caractère spécial s'étend à tous les composants qui composent l'interface ksTextLineParam .
Une question raisonnable se pose: existe-t-il un moyen de limiter l'action du caractère spécial? Oui. Mais pour le comprendre, vous devez d'abord vous familiariser avec l'interface
ksTextItemFont .
Options de police des composants de texte ( ksTextItemFont )
Selon la documentation, l'interface
ksTextItemFont décrit les paramètres de police du composant texte. Mais en fait, ses capacités dépassent la simple description de la police utilisée. Cette interface vous permet de créer des lignes composites (à leur sujet - dans les prochaines leçons du cycle).
Vous pouvez l'obtenir de plusieurs manières. Tout d'abord, en utilisant la méthode
GetParamStruct de l'interface
KompasObject : pour cela, la constante
ko_TextItemFont doit être passée à cette méthode comme seul paramètre. Deuxièmement, en utilisant la méthode
GetItemFont de l'interface
ksTextItemParam . Cette méthode n'a pas de paramètres d'entrée et renvoie l'interface
ksTextItemFont déjà associée au composant texte.
Considérez les propriétés de l'interface
ksTextItemFont .
bitvector - un vecteur de bits qui définit les caractéristiques du texte (elles seront discutées en détail dans les prochaines leçons du cycle).
color - couleur des caractères au format RVB.
fontName - une chaîne avec le nom de la police.
hauteur -
hauteur de police en millimètres.
ksu est le facteur d'étirement du texte.
Il
n'y a que trois méthodes pour l'interface
ksTextItemFont .
Init () réinitialise toutes les propriétés d'interface. Il n'a pas de paramètres d'entrée. En cas de succès, retourne
TRUE et en cas d'erreur -
FALSE .
GetBitVectorValue renvoie la valeur d'un indicateur individuel de l'ensemble de
bitvector . Il prend un indicateur comme seul paramètre dont nous voulons déterminer la valeur. S'il est défini, la méthode renvoie
VRAI ; si elle est réinitialisée,
FAUX .
SetBitVectorValue modifie la valeur d'un seul indicateur. Voici un prototype de cette méthode:
BOOL SetBitVectorValue ( long bitVector,
Si la valeur du paramètre d'
état est
TRUE , le drapeau
bitVector est armé, sinon il est réinitialisé.
En cas de succès, la méthode
SetBitVectorValue renvoie
TRUE et, en cas d'erreur,
FALSE .
Les
méthodes GetBitVectorValue et
SetBitVectorValue vous permettent de travailler avec la propriété
bitvector sans y accéder directement.
Limitation des caractères spéciaux
Deux drapeaux sont conçus pour contrôler les caractères spéciaux. Ils sont répertoriés dans le tableau ci-dessous.

Le drapeau
SPECIAL_SYMBOL que nous avons déjà considéré lorsque nous avons décrit l'interface
ksTextItemParam . Il est nécessaire pour indiquer - un caractère spécial est affiché. Le même indicateur est dupliqué dans la propriété
bitVector de l'interface
ksTextItemFont (comme mes expériences le montrent, cette duplication est facultative).
Le deuxième indicateur (
SPECIAL_SYMBOL_END ) n'a de sens que pour les caractères spéciaux qui incluent une chaîne. Il annule l'action du caractère spécial. Les lignes affichées après ce drapeau ne sont pas incluses dans le caractère spécial.
L'action combinée des deux drapeaux annule l'action du caractère spécial. Dans ce cas, le caractère spécial ne sera pas affiché dans le document.
Exemple
Voici le code source du programme modifié. En utilisant les drapeaux décrits ci-dessus, il implémente la sortie correcte des composants.
// 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();
La seule différence entre cet exemple et le précédent est qu'après chaque caractère spécial, un composant s'affiche pour lequel l'indicateur
SPECIAL_SYMBOL_END est défini dans l'interface
ksTextItemFont . Son seul but est d'annuler l'action du personnage spécial. Dans le premier cas, il ne contient aucune donnée (sauf le drapeau, bien sûr). Et dans le second cas, il contient la chaîne
«Page 3» .
Vous ne pouvez pas combiner l'indicateur
SPECIAL_SYMBOL_END avec la sortie du deuxième caractère spécial. Dans ce cas, ce drapeau annule l'action des deux caractères spéciaux. La ligne
"Page 2" sera affichée sans barré.
La figure ci-dessous montre la ligne affichée par le programme dans le cartouche.

Comme vous pouvez le voir, l'action des caractères spéciaux ne s'applique désormais qu'à "votre" composant.
Symboles spéciaux imbriqués
Le premier exemple de la leçon d'aujourd'hui montre clairement - des caractères spéciaux peuvent être intégrés les uns aux autres. Le drapeau
SPECIAL_SYMBOL_END annule l'action d'un (dernier) caractère spécial. Cela vous permet de créer des lignes complexes avec des caractères spéciaux intégrés.
Ci-dessous se trouve le code source de l'exemple modifié, dans lequel la sous-chaîne
«Page 2» est également incluse dans l'expression sous le signe racine carrée.
// 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();
Veuillez noter qu'après la substitution de la chaîne
«Page 2», nous double-
éditons le composant avec l'indicateur
SPECIAL_SYMBOL_END (la première fois - dans le cadre d'un composant vide, la seconde - avec la chaîne
«Page 3» ). Cela est nécessaire pour annuler l'action des caractères spéciaux. La première fois, nous annulons le caractère spécial
169 (barré), la deuxième fois -
98 (racine carrée). Si nous
affichions un seul composant avec l'indicateur
SPECIAL_SYMBOL_END , cela annulerait uniquement le caractère spécial
169 , mais pas
98 . Dans ce cas, la ligne
«Page 3» ne serait pas barrée, mais serait incluse dans l'expression sous le signe racine.
La figure ci-dessous montre le résultat de ce programme.
ConclusionDans le cadre de cette leçon, nous avons rencontré des caractères spéciaux qui incluent une chaîne. Comme vous l'avez vu, ils diffèrent considérablement des simples caractères spéciaux (par exemple, les lettres de l'alphabet grec). Bien que nous les ayons montrés sur l'exemple de l'inscription principale, cela ne devrait pas vous dérouter. Ces caractères peuvent être utilisés dans d'autres méthodes de sortie de texte. Nous considérerons l'une de ces méthodes 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".