Bereits in der
4. Lektion unseres Zyklus haben wir Sonderzeichen kennengelernt. Dort wurde ihre einfachste Verwendung gezeigt. Wenn die
ksTextItemParam- Schnittstelle sowohl ein Sonderzeichen als auch eine Zeichenfolge angibt, befindet sich die Zeichenfolge unmittelbar nach dem Sonderzeichen. Es gibt jedoch Sonderzeichen, die gegen diese Regel verstoßen. Wir werden heute darüber sprechen.

Der Inhalt der Unterrichtsreihe „Arbeiten mit der KOMPAS-3D-API“
- Die Grundlagen
- Zeichnungsentwurf
- Richtige Verbindung zu KOMPAS
- Hauptinschrift
- Grafische Grundelemente
- Speichern eines Dokuments in verschiedenen Formaten
- Einstellungen kennenlernen
- Anspruchsvollere Schreibmethoden im Schriftfeld
- Beschriftungszellen lesen
- Sonderzeichen einschließlich einer Zeichenfolge
Sonderzeichen einschließlich einer Zeichenfolge
Die Tabelle der Sonderzeichen befindet sich in Anhang V der Haupthilfe von KOMPASSonderzeichen mit den Nummern
78-80 ,
83 ,
93-99 ,
171 und
172 enthalten die Zeichenfolge. In diesem Fall befindet sich die Zeichenfolge
s der Schnittstelle
ksTextItemParam nicht nach dem Sonderzeichen, sondern darin. Beispielsweise zeigt ein Sonderzeichen mit der Nummer
80 den Text im Rahmen an. Das Folgende ist ein Beispiel für ein Programm, das die Arbeit mit einem solchen Sonderzeichen demonstriert.
// 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();
In diesem Beispiel wird der Einfachheit halber der Code weggelassen, der für die Erstellung und Ausführung des Dokuments verantwortlich ist (dieses Thema wurde in früheren Lektionen des Zyklus behandelt). Die folgende Abbildung zeigt das von diesem Programm gebildete Hauptetikett.

Der Einfachheit halber füllen wir nur eine Zelle aus. Das Sonderzeichen mit der Nummer
98 definiert das Vorzeichen der Quadratwurzel. Beachten Sie, dass der Wert der s-Eigenschaft der
ksTextItemParam- Schnittstelle vollständig unter dem
Stammzeichen liegt . Andere Sonderzeichen, einschließlich der Zeichenfolge, funktionieren genauso.
Sonderzeichen und ksTextLineParam
Die Aktion von Sonderzeichen ist nicht auf die Schnittstelle
ksTextItemParam beschränkt. Betrachten Sie das folgende Beispiel.
// 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();
In diesem Beispiel wird eine Zeile mit drei Komponenten in das Schriftfeld eingegeben. Die ersten beiden enthalten ein Sonderzeichen und eine Zeichenfolge. Die dritte Komponente enthält nur eine Zeichenfolge ohne Sonderzeichen. Schauen wir uns das Ergebnis des Programms an (die folgende Abbildung zeigt nur die generierte Zeile ohne die Hauptbeschriftung).

Bitte beachten Sie, dass die Zeile
„Seite 2“ und die Zeile
„Seite 3“ im zweiten Sonderzeichen enthalten waren, das außerhalb des Sonderzeichens angezeigt werden sollte. Darüber hinaus waren beide Zeilen im ersten Sonderzeichen enthalten (wir haben dies auch nicht geplant). Dieses Beispiel zeigt zwei wichtige Punkte:
- Sonderzeichen können andere Sonderzeichen enthalten;
- Die Aktion des Sonderzeichens erstreckt sich auf alle Komponenten, aus denen die ksTextLineParam- Schnittstelle besteht.
Es stellt sich eine vernünftige Frage: Gibt es eine Möglichkeit, die Wirkung des Sonderzeichens einzuschränken? Ja, das gibt es. Um dies zu verstehen, müssen Sie sich zunächst mit der
ksTextItemFont- Schnittstelle vertraut
machen .
Schriftoptionen für Textkomponenten ( ksTextItemFont )
Gemäß der Dokumentation beschreibt die Schnittstelle
ksTextItemFont die Schriftparameter der Textkomponente. Tatsächlich gehen seine Fähigkeiten jedoch über die einfache Beschreibung der verwendeten Schriftart hinaus. Über diese Schnittstelle können Sie zusammengesetzte Linien erstellen (darüber - in den nächsten Lektionen des Zyklus).
Sie können es auf verschiedene Arten bekommen. Verwenden Sie zunächst die
GetParamStruct- Methode der
KompasObject- Schnittstelle: Dazu sollte die Konstante
ko_TextItemFont als einziger Parameter an diese Methode übergeben werden. Zweitens mit der
GetItemFont- Methode der
ksTextItemParam- Schnittstelle. Diese Methode hat keine Eingabeparameter und gibt die
ksTextItemFont- Schnittstelle zurück, die bereits der Textkomponente zugeordnet ist.
Berücksichtigen Sie die Eigenschaften der Schnittstelle
ksTextItemFont .
Bitvektor - Ein Bitvektor, der die Eigenschaften des Textes definiert (diese werden in den nächsten Lektionen des Zyklus ausführlich erläutert).
Farbe - Farbe der Zeichen im RGB-Format.
fontName - eine Zeichenfolge mit dem Schriftnamen.
Höhe - Schrifthöhe in Millimetern.
ksu ist der
Textdehnungsfaktor .
Es
gibt nur drei Methoden für die
ksTextItemFont- Schnittstelle.
Init () setzt alle Schnittstelleneigenschaften zurück. Es hat keine Eingabeparameter. Wenn erfolgreich, wird
TRUE zurückgegeben und im Fehlerfall
FALSE .
GetBitVectorValue gibt den Wert eines einzelnen Flags aus dem
Bitvektorsatz zurück . Als einzigen Parameter wird ein Flag verwendet, dessen Wert wir bestimmen möchten. Wenn es gesetzt ist, gibt die Methode
TRUE zurück , wenn es zurückgesetzt wird,
FALSE .
SetBitVectorValue ändert den Wert eines einzelnen Flags. Das Folgende ist ein Prototyp dieser Methode:
BOOL SetBitVectorValue ( long bitVector,
Wenn der
Statusparameterwert TRUE ist , wird das
BitVector- Flag gespannt, andernfalls wird es zurückgesetzt.
Bei Erfolg gibt die
SetBitVectorValue- Methode
TRUE und im Fehlerfall
FALSE zurück .
Mit den
Methoden GetBitVectorValue und
SetBitVectorValue können Sie mit der Eigenschaft
bitvector arbeiten, ohne direkt darauf zuzugreifen.
Sonderzeichenbeschränkung
Zwei Flags steuern Sonderzeichen. Sie sind in der folgenden Tabelle aufgeführt.

Das Flag
SPECIAL_SYMBOL haben wir bereits bei der Beschreibung der Schnittstelle
ksTextItemParam berücksichtigt . Es wird benötigt, um anzuzeigen, dass ein Sonderzeichen angezeigt wird. Das gleiche Flag wird in der
bitVector- Eigenschaft der
ksTextItemFont- Schnittstelle
dupliziert (wie meine Experimente zeigen, ist diese Duplizierung optional).
Das zweite Flag (
SPECIAL_SYMBOL_END ) ist nur für Sonderzeichen sinnvoll, die eine Zeichenfolge enthalten. Es bricht die Aktion des Sonderzeichens ab. Nach diesem Flag angezeigte Zeilen sind nicht im Sonderzeichen enthalten.
Die kombinierte Aktion beider Flags hebt die Aktion des Sonderzeichens auf. In diesem Fall wird das Sonderzeichen nicht im Dokument angezeigt.
Beispiel
Unten finden Sie den Quellcode des geänderten Programms. Mit den oben beschriebenen Flags wird die korrekte Ausgabe von Komponenten implementiert.
// 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();
Der einzige Unterschied zwischen diesem und dem vorherigen Beispiel besteht darin, dass nach jedem Sonderzeichen eine Komponente angezeigt wird, für die das
SPECIAL_SYMBOL_END- Flag in der Schnittstelle
ksTextItemFont gesetzt ist . Ihr einziger Zweck ist es, die Aktion des Sonderzeichens abzubrechen. Im ersten Fall enthält es keine Daten (außer natürlich das Flag). Und im zweiten Fall enthält es die Zeichenfolge
„Seite 3“ .
Sie können das Flag
SPECIAL_SYMBOL_END nicht mit der Ausgabe des zweiten Sonderzeichens kombinieren. Da in diesem Fall dieses Flag die Aktion beider Sonderzeichen abbricht. Die Zeile
"Seite 2" wird ohne Durchstreichen angezeigt.
Die folgende Abbildung zeigt die vom Programm im Schriftfeld angezeigte Zeile.

Wie Sie sehen können, gilt die Aktion von Sonderzeichen jetzt nur für "Ihre" Komponente.
Verschachtelte spezielle Symbole
Das erste Beispiel unserer heutigen Lektion zeigt deutlich, dass Sonderzeichen ineinander eingebettet werden können. Das Flag
SPECIAL_SYMBOL_END bricht die Aktion eines (letzten) Sonderzeichens ab. Auf diese Weise können Sie komplexe Linien mit eingebetteten Sonderzeichen erstellen.
Unten finden Sie den Quellcode des geänderten Beispiels, in dem der Teilstring
„Seite 2“ auch im Ausdruck unter dem Quadratwurzelzeichen enthalten ist.
// 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();
Bitte beachten Sie, dass wir nach dem Ersetzen der Zeichenfolge
"Seite 2" die Komponente mit dem Flag
SPECIAL_SYMBOL_END doppelt ausgeben (das erste Mal - als Teil einer leeren Komponente, das zweite Mal - zusammen mit der Zeichenfolge
"Seite 3" ). Dies ist erforderlich, um die Aktion von Sonderzeichen abzubrechen. Das erste Mal löschen wir das Sonderzeichen
169 (durchgestrichen), das zweite Mal -
98 (Quadratwurzel). Wenn wir nur eine Komponente mit dem Flag
SPECIAL_SYMBOL_END anzeigen würden , würde dies nur das Sonderzeichen
169 , aber nicht
98 aufheben. In diesem Fall würde die Zeile
„Seite 3“ nicht durchgestrichen, sondern in den Ausdruck unter dem Wurzelzeichen aufgenommen.
Die folgende Abbildung zeigt das Ergebnis dieses Programms.
FazitIm Rahmen dieser Lektion haben wir Sonderzeichen kennengelernt, die eine Zeichenfolge enthalten. Wie Sie gesehen haben, unterscheiden sie sich erheblich von einfachen Sonderzeichen (z. B. Buchstaben des griechischen Alphabets). Obwohl wir sie am Beispiel der Hauptinschrift gezeigt haben, sollte dies Sie nicht verwirren. Diese Zeichen können in anderen Textausgabemethoden verwendet werden. Wir werden eine dieser Methoden in der nächsten Lektion betrachten.
Um fortzufahren, folgen Sie den Nachrichten des Blogs.
Sergey Norseev, Ph.D., Autor des Buches "Anwendungsentwicklung für COMPAS in Delphi".