Bekerja dengan API KOMPAS-3D β†’ Pelajaran 15 β†’ Baris gabungan berdasarkan paragraf

Dalam pelajaran 12, kami memperkenalkan garis majemuk dan melihat cara yang tidak berdokumen untuk membuatnya. Dalam pelajaran 13 , paragraf disajikan. Hari ini kita akan melihat bagaimana menggunakannya untuk membuat string majemuk. Pertama, mari kita ambil garis yang termasuk penyimpangan dan pecahan, dan berkenalan dengan komponen garis majemuk seperti superskrip, substring, dan karakter khusus.



Isi seri pelajaran β€œBekerja dengan API KOMPAS-3D”


  1. Dasar-dasarnya
  2. Desain gambar
  3. Koneksi yang benar ke KOMPAS
  4. Prasasti utama
  5. Primitif grafis
  6. Menyimpan dokumen dalam berbagai format
  7. Mengenal pengaturan
  8. Metode penulisan yang lebih canggih di blok judul
  9. Membaca sel teks
  10. Karakter khusus termasuk string
  11. Label teks sederhana
  12. Senar majemuk
  13. Paragraf
  14. Teks multiline
  15. Baris Senyawa Berbasis Paragraf

Penyimpangan atas dan bawah


Berikut ini adalah fragmen dari program yang menunjukkan output dari sebuah garis dengan penyimpangan atas dan bawah menggunakan paragraf. Untuk mencapai ini, bendera END_DEVIAT , LOWER_DEVIAT, dan UPPER_DEVIAT , yang disebutkan dalam pelajaran 12, digunakan .

Cuplikan kode program
//     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(); 


Dibandingkan dengan contoh penyimpangan dari pelajaran 12, program saat ini memiliki dua keuntungan penting:

  1. Ia menggunakan kemampuan yang didokumentasikan dari sistem COMPASS.
  2. Tidak perlu menghitung ulang posisi baris. KOMPAS sendiri menentukan semua offset yang diperlukan.

Perhatikan penggunaan bendera END_DEVIAT . Ini menyelesaikan generasi penyimpangan dan membatalkan bendera LOWER_DEVIAT dan UPPER_DEVIAT . Jika kita belum menggunakannya, baris "Teks setelah penyimpangan" akan ditampilkan sebagai penyimpangan yang lebih rendah.

Bendera LOWER_DEVIAT dan UPPER_DEVIAT saling membatalkan. Ketika digunakan secara bersamaan, string adalah output karena akan ditampilkan tanpa menentukan flag-flag ini.

Karena flag NEW_LINE tidak digunakan dalam contoh kami, semua baris dapat ditampilkan dengan satu panggilan ke metode ksTextLine . Untuk melakukan ini, mereka dibentuk dalam bentuk antarmuka ksTextLineParam .

Hasil program ditunjukkan pada gambar di bawah ini.



Pecahan


Berikut ini adalah contoh dari program yang menunjukkan output dari string yang menyertakan sebagian kecil.

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


Konstruksi sebagian kecil berbeda dari konstruksi penyimpangan. Satu-satunya perbedaan adalah bendera yang digunakan. Bendera END_FRACTION membatalkan bendera NUMERATOR dan DENOMINATOR dan bertindak sama dengan bendera END_DEVIAT untuk penyimpangan.
Gambar di bawah ini menunjukkan hasil dari program ini.



Baris ini terlihat lebih rapi dibandingkan dengan teks yang sama dalam pelajaran 12 .

Kontrol ukuran fraksi


Fraksi yang ditampilkan dapat memiliki ukuran yang berbeda, yang dikendalikan menggunakan antarmuka ksTextItemParam . Jika properti tipenya FRACTION_TYPE , maka antarmuka ini, antara lain, mengatur ukuran fraksi. Ukurannya sendiri ditentukan dalam properti iSNumb . Nilai yang valid ditunjukkan pada tabel di bawah ini.



Jika properti iSNumb menentukan nilai yang tidak valid, maka KOMPAS menggunakan ketinggian default.

Berikut ini adalah contoh penggunaan bendera FRACTION_TYPE .

Contoh Penggunaan Flag
 //   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(); 


Contoh ini berbeda dari yang sebelumnya hanya dengan menetapkan tipe FRACTION_TYPE di properti tipe dari antarmuka ksTextItemParam saat mengeluarkan pembilang. Namun, ini cukup untuk mengubah ukuran fraksi. Gambar di bawah ini menunjukkan hasil dari program ini (bandingkan dengan hasil dari contoh sebelumnya ).



Catatan: ukuran fraksi diatur ketika pembilang ditampilkan. Seperti yang diperlihatkan percobaan saya, ukuran fraksi yang ditentukan saat penyebut ditampilkan diabaikan.

Superscript dan Substring



Konstruksi substring dan substring dikendalikan oleh bendera yang tercantum dalam tabel di bawah ini.



Berikut ini adalah contoh program yang menunjukkan output dari string dengan substring dan substring.

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


Gambar di bawah ini menunjukkan hasil dari program ini.



Anda tidak dapat membuat substring dan substring menggunakan metode ksDocument2D :: ksText .

Kontrol ukuran baris utama


Baris utama dapat memiliki ukuran yang berbeda, yang dapat diubah menggunakan antarmuka ksTextItemParam . Untuk ini, konstanta SUM_TYPE ditentukan dalam properti tipenya , dan ukuran yang diperlukan dari baris utama di properti iSNumb . Nilai yang valid ditunjukkan pada tabel di bawah ini:



Jika properti iSNumb berisi nilai yang tidak valid, maka KOMPAS menggunakan nilai default.

Berikut ini adalah cuplikan dari program yang menunjukkan penggunaan konstanta SUM_TYPE .

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



Konstanta SUM_TYPE dimasukkan dalam properti jenis antarmuka ksTextItemParam ketika garis utama ditampilkan . Sebelum output dari add- in, antarmuka ksTextItemParam dikembalikan ke keadaan awal. Ini adalah satu-satunya perbedaan antara contoh ini dan yang sebelumnya.

Gambar di bawah ini menunjukkan hasil program (bandingkan dengan hasil dari contoh sebelumnya).



Konstanta SUM_TYPE memungkinkan Anda untuk mengubah ukuran string utama, tetapi bukan substring dan substring. Mengubah ukuran mereka di KOMPAS tidak disediakan.

Karakter khusus termasuk substring


Paragraf dapat menangani karakter khusus yang menyertakan string (mereka dibahas dalam pelajaran 10 siklus). Berikut ini adalah bagian dari program yang menunjukkan penggunaannya dalam paragraf.

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


Contohnya terlihat sangat rumit, tetapi jika Anda perhatikan dengan seksama, Anda dapat melihat bahwa itu terdiri dari potongan berulang. Di dalamnya, dengan bantuan karakter khusus, dicoret dan digarisbawahi teks ditampilkan. Setelah setiap blok demikian, baris kosong dengan bendera SPECIAL_SYMBOL_END ditampilkan . Tugasnya adalah untuk membatalkan aksi karakter khusus. Jika tidak ditampilkan, maka paragraf mungkin tidak dibangun dengan benar. Tindakan karakter khusus meluas ke seluruh blok ksTextLineParam , ke seluruh panjangnya terlepas dari isi sebenarnya (tesis ini diilustrasikan pada gambar di bawah).



Baris pembatalan harus menjadi bagian dari blok ksTextLineParam . Kalau tidak, paragraf mungkin tidak dibangun dengan benar. Blok ksTextLineParam dapat berisi beberapa karakter kontrol. Masing-masing dari mereka harus memiliki garis pembatalan sendiri.

Bendera SPECIAL_SYMBOL_END hanya digunakan untuk karakter khusus yang memiliki substring. Untuk karakter khusus biasa, itu tidak diperlukan.

Gambar di bawah ini menunjukkan hasil dari contoh kita.



Kesimpulan

Dalam pelajaran ini, kami belajar bagaimana menggunakan paragraf untuk membuat garis majemuk, termasuk penyimpangan dan fraksi, dan memeriksa cara-cara yang terdokumentasi untuk membuat garis majemuk berdasarkan pada paragraf. Ini bukan satu-satunya dan jauh dari cara termudah untuk membuatnya. Cara lain yang lebih sederhana, akan kita bahas dalam pelajaran selanjutnya.

Untuk dilanjutkan, ikuti berita blog.

Sergey Norseev, Ph.D., penulis buku "Pengembangan Aplikasi untuk COMPAS di Delphi."

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


All Articles