Bekerja dengan API KOMPAS-3D β†’ Pelajaran 10 β†’ Karakter khusus termasuk string

Kami sudah berkenalan dengan karakter khusus dalam pelajaran ke - 4 dari siklus kami. Penggunaan mereka yang paling sederhana ditunjukkan di sana. Ia juga mengatakan bahwa jika antarmuka ksTextItemParam menentukan karakter khusus dan string, maka string tersebut terletak tepat setelah karakter khusus. Namun, ada karakter khusus yang melanggar aturan ini. Kami akan membicarakannya hari ini.




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


Karakter khusus termasuk string



Tabel tanda-tanda khusus ada di Lampiran V dari bantuan utama KOMPAS

Karakter khusus dengan angka 78-80 , 83 , 93-99 , 171 dan 172 termasuk string. Dalam hal ini, string s dari antarmuka ksTextItemParam tidak terletak setelah karakter khusus, tetapi di dalamnya. Misalnya, karakter khusus dengan angka 80 menampilkan teks dalam bingkai. Berikut ini adalah contoh dari program yang menunjukkan bekerja dengan karakter khusus.

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

Untuk kesederhanaan, contoh ini menghilangkan kode yang bertanggung jawab untuk pembuatan dan pelaksanaan dokumen (topik ini dibahas dalam pelajaran siklus sebelumnya). Gambar di bawah ini menunjukkan label utama yang dibentuk oleh program ini.



Untuk kesederhanaan, kami hanya mengisi satu sel. Karakter khusus dengan nomor 98 mendefinisikan tanda akar kuadrat. Perhatikan bahwa nilai properti s dari antarmuka ksTextItemParam sepenuhnya berada di bawah tanda root. Karakter khusus lainnya, termasuk string, bekerja dengan cara yang persis sama.

Karakter khusus dan ksTextLineParam


Tindakan karakter khusus tidak terbatas pada antarmuka ksTextItemParam . Perhatikan contoh di bawah ini.

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

Dalam contoh ini, baris yang terdiri dari tiga komponen dimasukkan dalam blok judul. Dua yang pertama berisi karakter khusus dan string. Komponen ketiga hanya berisi string, tanpa karakter khusus. Mari kita lihat hasil program (gambar di bawah ini hanya menunjukkan baris yang dihasilkan tanpa tulisan utama).



Harap dicatat bahwa baris "Halaman 2" dan baris "Halaman 3" termasuk dalam karakter khusus kedua, yang kami rencanakan untuk ditampilkan di luar karakter khusus. Selain itu, kedua baris ini termasuk dalam karakter khusus pertama (kami tidak merencanakan ini juga). Contoh ini menunjukkan dua poin penting:

  • karakter khusus dapat mencakup karakter khusus lainnya;
  • aksi karakter khusus meluas ke semua komponen yang membentuk antarmuka ksTextLineParam .

Muncul pertanyaan yang masuk akal - adakah cara untuk membatasi tindakan karakter khusus? Ya ada. Tetapi untuk memahaminya, Anda harus terlebih dahulu berkenalan dengan antarmuka ksTextItemFont .

Opsi Font Komponen Teks ( ksTextItemFont )


Menurut dokumentasi, antarmuka ksTextItemFont menjelaskan parameter font komponen teks. Namun pada kenyataannya, kemampuannya melebihi deskripsi sederhana dari font yang digunakan. Antarmuka ini memungkinkan Anda untuk membuat garis komposit (tentang mereka - dalam pelajaran siklus berikutnya).

Anda bisa mendapatkannya dengan beberapa cara. Pertama, menggunakan metode GetParamStruct dari antarmuka KompasObject : untuk ini, ko_TextItemFont konstan harus diteruskan ke metode ini sebagai satu-satunya parameter. Kedua, menggunakan metode GetItemFont dari antarmuka ksTextItemParam . Metode ini tidak memiliki parameter input dan mengembalikan antarmuka ksTextItemFont yang sudah dikaitkan dengan komponen teks.

Pertimbangkan properti dari antarmuka ksTextItemFont .
bitvector - vektor bit yang mendefinisikan karakteristik teks (mereka akan dibahas secara rinci dalam pelajaran siklus berikutnya).
warna - warna karakter dalam format RGB.
fontName - string dengan nama font.
tinggi - tinggi font dalam milimeter.
ksu adalah faktor peregangan teks.
Hanya ada tiga metode untuk antarmuka ksTextItemFont .
Init () me-reset semua properti antarmuka. Tidak memiliki parameter input. Jika berhasil, mengembalikan TRUE , dan dalam hal kesalahan - SALAH .
GetBitVectorValue mengembalikan nilai setiap flag dari set bitvector . Dibutuhkan bendera sebagai satu-satunya parameter, nilai yang ingin kita tentukan. Jika disetel, metode mengembalikan TRUE ; jika diatur ulang, SALAH .
SetBitVectorValue mengubah nilai satu flag. Berikut ini adalah prototipe dari metode ini:

 BOOL SetBitVectorValue ( long bitVector, //  BOOL state //   ); 

Jika nilai parameter status BENAR , maka bendera bitVector dikokang, jika tidak diatur ulang.
Jika berhasil, metode SetBitVectorValue mengembalikan TRUE , dan jika terjadi kesalahan, FALSE .
Metode GetBitVectorValue dan SetBitVectorValue memungkinkan Anda untuk bekerja dengan properti bitvector tanpa mengaksesnya secara langsung.

Keterbatasan karakter khusus


Dua bendera dirancang untuk mengontrol karakter khusus. Mereka tercantum dalam tabel di bawah ini.



Bendera SPECIAL_SYMBOL sudah kami pertimbangkan ketika kami mendeskripsikan antarmuka ksTextItemParam . Diperlukan untuk menunjukkan - karakter khusus ditampilkan. Bendera yang sama digandakan dalam properti bitVector dari antarmuka ksTextItemFont (seperti yang diperlihatkan percobaan saya, duplikasi ini opsional).

Bendera kedua ( SPECIAL_SYMBOL_END ) hanya masuk akal untuk karakter khusus yang menyertakan string. Itu membatalkan aksi karakter khusus. Garis yang ditampilkan setelah bendera ini tidak termasuk dalam karakter khusus.

Aksi gabungan kedua bendera membatalkan aksi karakter khusus. Dalam hal ini, karakter khusus tidak akan ditampilkan dalam dokumen.

Contoh


Di bawah ini adalah kode sumber dari program yang dimodifikasi. Dengan menggunakan flag yang dijelaskan di atas, flag ini mengimplementasikan output komponen yang benar.

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

Satu-satunya perbedaan antara contoh ini dan yang sebelumnya adalah bahwa setelah setiap karakter khusus komponen ditampilkan yang bendera SPECIAL_SYMBOL_END diatur di antarmuka ksTextItemFont . Satu-satunya tujuan adalah untuk membatalkan aksi karakter khusus. Dalam kasus pertama, itu tidak mengandung data apa pun (kecuali untuk bendera, tentu saja). Dan dalam kasus kedua, ini berisi string "Halaman 3" .

Anda tidak dapat menggabungkan flag SPECIAL_SYMBOL_END dengan output dari karakter spesial kedua. Karena dalam kasus ini bendera ini akan membatalkan aksi kedua karakter khusus. Baris "Halaman 2" akan ditampilkan tanpa dicoret.

Gambar di bawah ini menunjukkan garis yang ditampilkan oleh program di blok judul.



Seperti yang Anda lihat, aksi karakter khusus hanya berlaku untuk komponen "Anda".

Simbol Khusus Bersarang


Contoh pertama dari pelajaran hari ini menunjukkan dengan jelas - karakter khusus dapat saling melekat. Bendera SPECIAL_SYMBOL_END membatalkan tindakan satu (terakhir) karakter khusus. Ini memungkinkan Anda untuk membangun garis yang rumit dengan karakter khusus yang tertanam.

Di bawah ini adalah kode sumber dari contoh yang dimodifikasi, di mana substring "Halaman 2" juga termasuk dalam ekspresi di bawah tanda root kuadrat.

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

Harap perhatikan bahwa setelah penggantian string "Halaman 2", kami membuat output ganda komponen dengan bendera SPECIAL_SYMBOL_END (pertama kali - sebagai bagian dari komponen kosong, yang kedua - bersama dengan string "Halaman 3" ). Ini diperlukan untuk membatalkan aksi karakter khusus. Pertama kali kami membatalkan karakter khusus 169 (dicoret), yang kedua - 98 (akar kuadrat). Jika kami hanya menampilkan satu komponen dengan bendera SPECIAL_SYMBOL_END , ini hanya akan membatalkan karakter khusus 169 , tetapi tidak 98 . Dalam hal ini, baris "Halaman 3" tidak akan dicoret, tetapi akan dimasukkan dalam ekspresi di bawah tanda root.
Gambar di bawah ini menunjukkan hasil dari program ini.



Kesimpulan

Sebagai bagian dari pelajaran ini, kami bertemu dengan karakter khusus yang menyertakan string. Seperti yang Anda lihat, mereka sangat berbeda dari karakter khusus yang sederhana (misalnya, huruf alfabet Yunani). Meskipun kami menunjukkannya pada contoh tulisan utama, ini seharusnya tidak membingungkan Anda. Karakter-karakter ini dapat digunakan dalam metode output teks lainnya. Kami akan mempertimbangkan salah satu metode ini dalam pelajaran berikutnya.

Untuk dilanjutkan, ikuti berita blog.

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

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


All Articles