Arbeiten Sie mit der KOMPAS-3D-API → Lektion 15 → Zusammengesetzte Linien basierend auf Absatz

In Lektion 12 haben wir die zusammengesetzten Linien vorgestellt und einen undokumentierten Weg untersucht, um sie zu erstellen. In Lektion 13 wurden Absätze vorgestellt. Heute werden wir uns ansehen, wie man sie verwendet, um zusammengesetzte Zeichenfolgen zu erstellen. Nehmen wir zunächst Zeilen, die Abweichungen und Brüche enthalten, und machen Sie sich mit Komponenten zusammengesetzter Zeilen wie hochgestellten Zeichenfolgen, Teilzeichenfolgen und Sonderzeichen vertraut.



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
  11. Einfache Textbeschriftungen
  12. Zusammengesetzte Zeichenfolgen
  13. Absätze
  14. Mehrzeiliger Text
  15. Absatzbasierte zusammengesetzte Linien

Obere und untere Abweichungen


Das Folgende ist ein Fragment eines Programms, das die Ausgabe einer Zeile mit oberen und unteren Abweichungen anhand von Absätzen demonstriert. Zu diesem Zweck werden die in Lektion 12 erwähnten Flags END_DEVIAT , LOWER_DEVIAT und UPPER_DEVIAT verwendet .

Programmcode-Snippet
//     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(); 


Gegenüber dem Beispiel der Gebäudeabweichung von Lektion 12 hat das aktuelle Programm zwei wichtige Vorteile:

  1. Es nutzt die dokumentierten Funktionen des COMPASS-Systems.
  2. Die Position der Zeilen muss nicht neu berechnet werden. KOMPAS selbst ermittelt alle notwendigen Offsets.

Beachten Sie die Verwendung des Flags END_DEVIAT . Es vervollständigt die Abweichungserzeugung und löscht die Flags LOWER_DEVIAT und UPPER_DEVIAT . Wenn wir es nicht verwendet hätten, würde die Zeile „Text nach Abweichungen“ als geringere Abweichung angezeigt.

Die Flags LOWER_DEVIAT und UPPER_DEVIAT heben sich gegenseitig auf. Bei gleichzeitiger Verwendung wird die Zeichenfolge so ausgegeben, wie sie ohne Angabe dieser Flags angezeigt würde.

Da in unserem Beispiel das Flag NEW_LINE nicht verwendet wird, können alle Zeilen mit einem Aufruf der Methode ksTextLine angezeigt werden. Dazu werden sie in Form der ksTextLineParam- Schnittstelle vorgeformt.

Das Ergebnis des Programms ist in der folgenden Abbildung dargestellt.



Bruchteil


Das folgende Beispiel zeigt ein Programm, das die Ausgabe einer Zeichenfolge demonstriert, die einen Bruch enthält.

Programmbeispiel
 //     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(); 


Gebäudefraktionen unterscheiden sich nicht wesentlich von Gebäudeabweichungen. Der einzige Unterschied sind die verwendeten Flags. Das Flag END_FRACTION löscht die Flags NUMERATOR und DENOMINATOR und verhält sich für Abweichungen genauso wie das Flag END_DEVIAT .
Die folgende Abbildung zeigt das Ergebnis dieses Programms.



Diese Zeile sieht im Vergleich zum gleichen Text in Lektion 12 ordentlicher aus.

Kontrolle der Fraktionsgröße


Der angezeigte Bruch kann eine andere Größe haben, die über die Schnittstelle ksTextItemParam gesteuert wird. Wenn die type- Eigenschaft FRACTION_TYPE lautet, legt diese Schnittstelle unter anderem die Größe des Bruchs fest. Die Größe selbst wird in der Eigenschaft iSNumb angegeben. Die gültigen Werte sind in der folgenden Tabelle aufgeführt.



Wenn die iSNumb- Eigenschaft einen ungültigen Wert angibt, verwendet KOMPAS die Standardhöhe.

Das Folgende ist ein Beispiel für die Verwendung des FRACTION_TYPE- Flags.

Beispiel für die Verwendung von Flags
 //   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(); 


Dieses Beispiel unterscheidet sich vom vorherigen nur dadurch, dass der Typ FRACTION_TYPE in der type- Eigenschaft der ksTextItemParam- Schnittstelle bei der Ausgabe des Zählers festgelegt wird. Dies reicht jedoch aus, um die Größe der Fraktion zu ändern. Die folgende Abbildung zeigt das Ergebnis dieses Programms (vergleichen Sie es mit dem Ergebnis des vorherigen Beispiels ).



Hinweis: Die Bruchgröße wird festgelegt, wenn der Zähler angezeigt wird. Wie meine Experimente zeigen, wird die bei der Anzeige des Nenners angegebene Bruchgröße ignoriert.

Hochgestellt und Teilzeichenfolge



Der Aufbau eines Teilstrings und eines Teilstrings wird durch die in der folgenden Tabelle aufgeführten Flags gesteuert.



Das folgende Beispielprogramm demonstriert die Ausgabe eines Strings mit einem Teilstring und einem Teilstring.

Programmbeispiel
 //   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(); 


Die folgende Abbildung zeigt das Ergebnis dieses Programms.



Sie können keine Teilzeichenfolge und Teilzeichenfolge mit der Methode ksDocument2D :: ksText erstellen .

Steuerung der Hauptzeilengröße


Die Hauptzeile kann eine andere Größe haben, die über die Schnittstelle ksTextItemParam geändert werden kann. Dazu wird die Konstante SUM_TYPE in ihrer Eigenschaft type und die erforderliche Größe der Hauptzeile in der Eigenschaft iSNumb angegeben . Gültige Werte sind in der folgenden Tabelle aufgeführt:



Wenn die iSNumb- Eigenschaft einen ungültigen Wert enthält , verwendet KOMPAS den Standardwert.

Das Folgende ist ein Ausschnitt aus einem Programm, das die Verwendung der Konstante SUM_TYPE demonstriert.

Programm-Snippet
 //   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(); 



Die Konstante SUM_TYPE wird in die type- Eigenschaft der Schnittstelle ksTextItemParam eingegeben , wenn die Hauptzeile angezeigt wird . Vor der Ausgabe des Add-Ins wird die ksTextItemParam- Schnittstelle auf ihren Ausgangszustand zurückgesetzt. Dies ist der einzige Unterschied zwischen diesem und dem vorherigen Beispiel.

Die folgende Abbildung zeigt das Ergebnis des Programms (vergleichen Sie es mit dem Ergebnis des vorherigen Beispiels).



Mit der Konstante SUM_TYPE können Sie die Größe der Hauptzeichenfolge ändern, nicht jedoch Teilzeichenfolgen und Teilzeichenfolgen. Das Ändern der Größe in KOMPAS ist nicht vorgesehen.

Sonderzeichen einschließlich Teilzeichenfolge


Ein Absatz kann Sonderzeichen verarbeiten, die eine Zeichenfolge enthalten (diese wurden in Lektion 10 des Zyklus erläutert). Das Folgende ist ein Fragment eines Programms, das ihre Verwendung in einem Absatz demonstriert.

Programm-Snippet
 //  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(); 


Das Beispiel sieht sehr kompliziert aus, aber wenn Sie es sich genau ansehen, können Sie sehen, dass es aus sich wiederholenden Teilen besteht. Darin werden mit Hilfe von Sonderzeichen durchgestrichene und unterstrichene Texte angezeigt. Nach jedem solchen Block wird eine leere Zeile mit dem Flag SPECIAL_SYMBOL_END angezeigt . Seine Aufgabe ist es, die Aktion des Sonderzeichens abzubrechen. Wenn es nicht angezeigt wird, ist der Absatz möglicherweise nicht richtig aufgebaut. Die Aktion des Sonderzeichens erstreckt sich auf den gesamten ksTextLineParam- Block, auf seine gesamte Länge, unabhängig von seinem tatsächlichen Inhalt (diese These ist in der folgenden Abbildung dargestellt).



Die Abbruchzeile muss Teil des Blocks ksTextLineParam sein . Andernfalls ist der Absatz möglicherweise nicht korrekt aufgebaut. Der Block ksTextLineParam kann mehrere Steuerzeichen enthalten. Jeder von ihnen sollte eine eigene Abbruchzeile haben.

Das Flag SPECIAL_SYMBOL_END wird nur für Sonderzeichen mit einer Teilzeichenfolge verwendet. Für gewöhnliche Sonderzeichen wird es nicht benötigt.

Die folgende Abbildung zeigt das Ergebnis unseres Beispiels.



Fazit

In dieser Lektion haben wir gelernt, wie man mit Absätzen zusammengesetzte Linien erstellt, einschließlich Abweichungen und Brüche, und dokumentierte Möglichkeiten untersucht, um zusammengesetzte Linien basierend auf einem Absatz zu erstellen. Dies ist nicht der einzige und bei weitem nicht einfachste Weg, sie zu erstellen. Eine andere, viel einfachere Möglichkeit werden wir 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/de449706/


All Articles