Arbeiten Sie mit der KOMPAS-3D-API → Lektion 10 → Sonderzeichen einschließlich einer Zeichenfolge

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“


  1. Die Grundlagen
  2. Zeichnungsentwurf
  3. Richtige Verbindung zu KOMPAS
  4. Hauptinschrift
  5. Grafische Grundelemente
  6. Speichern eines Dokuments in verschiedenen Formaten
  7. Einstellungen kennenlernen
  8. Anspruchsvollere Schreibmethoden im Schriftfeld
  9. Beschriftungszellen lesen
  10. Sonderzeichen einschließlich einer Zeichenfolge


Sonderzeichen einschließlich einer Zeichenfolge



Die Tabelle der Sonderzeichen befindet sich in Anhang V der Haupthilfe von KOMPAS

Sonderzeichen 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, //  BOOL state //   ); 

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.



Fazit

Im 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".

Source: https://habr.com/ru/post/de414701/


All Articles