Kami melanjutkan serangkaian artikel tentang bekerja dengan CAD API COMPASS-3D. Karakter kontrol telah terlihat beberapa kali dalam pelajaran siklus sebelumnya. Kemudian setiap kali dikatakan bahwa jalur output tidak boleh mengandungnya, karena COMPAS memprosesnya dengan cara yang khusus. Sekarang saatnya mengenal mereka lebih baik.
Setelah menguasai pekerjaan bersama mereka, Anda akan memahami bahwa membuat string majemuk yang kompleks adalah tugas yang sepele, dalam banyak kasus tidak memerlukan penulisan sejumlah besar kode.
Dalam pelajaran, kita akan melihat bagaimana menggunakan karakter khusus dan karakter font dengan karakter kontrol, berbicara tentang cara membuat pecahan dan penyimpangan dengan bantuan mereka, dan juga mempertimbangkan penggunaannya bersama dengan paragraf.

Isi seri pelajaran “Bekerja dengan API COMPASS-3D”
- Dasar-dasarnya
- Desain gambar
- Koneksi yang benar ke KOMPAS
- Prasasti utama
- Primitif grafis
- Menyimpan dokumen dalam berbagai format
- Mengenal pengaturan
- Metode penulisan yang lebih canggih di blok judul
- Membaca sel teks
- Karakter khusus termasuk string
- Label teks sederhana
- Senar majemuk
- Paragraf
- Teks multiline
- Baris Senyawa Berbasis Paragraf
- Kontrol karakter
Ulasan sepintas
Karakter kontrol adalah: @, $, &,;, ~, ^, dan #. Sayangnya, KOMPAS SDK hanya memiliki sedikit informasi tentang cara menggunakannya. Untuk informasi lebih lanjut, lihat bantuan KOMPAS, di bagian
“9. Pengaturan KOMPAS-3D / Penyimpanan pengaturan sistem / Layanan file / File menu pengguna / Sintaks file .
"
Semua karakter kontrol dapat dibagi secara kondisional menjadi dua kelompok: utama dan tambahan. Simbol bantu hanya digunakan bersama dengan yang utama dan, dengan sendirinya, tidak menggambarkan komponen apa pun. Tabel di bawah ini memberikan deskripsi singkat tentang karakter kontrol.

Mari kita pertimbangkan secara lebih detail.
Masukkan karakter khusus
Kami telah mempertimbangkan karakter khusus (lihat pelajaran
4 dan
10 ). Kemudian, untuk menyisipkan satu karakter khusus, instance terpisah dari antarmuka
ksTextItemParam digunakan . Menggunakan karakter kontrol, Anda dapat memasukkan sebanyak mungkin karakter khusus ke dalam string sesuai keinginan tanpa
menggunakan kembali antarmuka
ksTextItemParam .
Sintaks untuk memasukkan karakter khusus adalah:
AA @ YXXXX ~ BBdimana
AA - string yang terletak di depan karakter khusus,
Y - modifier untuk representasi kode karakter khusus,
XXXX - kode karakter khusus yang dimasukkan.
BB - garis yang terletak setelah karakter khusus.
Kode untuk karakter khusus yang dimasukkan ditentukan antara
@ dan
~ . Selain itu, tergantung pada nilai modifier
Y , dapat ditentukan dalam notasi desimal atau heksadesimal. Nilai pengubah
Y yang valid ditunjukkan pada tabel di bawah ini.
Catatan: seperti yang ditunjukkan percobaan saya, COMPASS biasanya memproses tidak adanya
~ karakter. Dalam hal ini, karakter khusus dimasukkan sesuai kebutuhan. Namun, saya sangat merekomendasikan untuk tidak mengandalkan perilaku ini dan selalu menyelesaikan operasi penyisipan dengan
~ karakter.
Berikut ini adalah contoh program yang menunjukkan keluaran karakter khusus.
BSTR str = SysAllocString(OLESTR(" @+51~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" @*33~ ")); document2D->ksText(100.0,90.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Dalam contoh ini, karakter yang sama (α alpha) ditampilkan dua kali. Pertama kali kodenya ditentukan dalam desimal, kedua kalinya dalam heksadesimal. Gambar di bawah ini menunjukkan hasil program.

Karakter kontrol memungkinkan Anda menampilkan beberapa karakter khusus pada baris yang sama. Jadi, dalam contoh berikut, tiga huruf pertama dari alfabet Yunani ditampilkan dalam satu panggilan ke metode
ksText .
BSTR str = SysAllocString(OLESTR("@+51~ @+52~ @+53~")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Pengubah + adalah pengubah standar. Oleh karena itu, baris di atas dapat ditulis seperti ini:
“@ 51 ~ @ 52 ~ @ 53 ~”Dalam hal ini, hasil dari program akan tetap sama.
Jika
@ adalah karakter yang tidak valid, garis antara
@ dan
~ ditampilkan apa adanya. Karakter
@ dan
~ dihilangkan. Misalnya, dengan baris:
“Sebelum @ T51 ~ Setelah”Dokumen akan menampilkan:
Sebelum T51 SetelahCatatan: perilaku KOMPAS ini tidak berdokumen dan dapat bervariasi dalam berbagai versi program.
Catatan: karakter kontrol tidak cocok untuk memasukkan karakter khusus yang berisi string. Faktanya adalah bahwa untuk membatasi aksi mereka, Anda perlu menggunakan flag SPECIAL_SYMBOL_END (untuk detail lebih lanjut lihat
10 pelajaran dari siklus), tetapi karakter kontrol tidak mengizinkan penggunaan flag.
Masukkan karakter font
Selain karakter khusus, Anda dapat memasukkan karakter biasa dengan kode mereka. Karakter kontrol
^ dan
~ digunakan untuk ini. Sintaksnya diberikan di bawah ini.
AA ^ ( FNAME ) YXXXX ~ BBdimana
AA - string yang terletak sebelum karakter yang dimasukkan,
FNAME - nama font tempat karakter diambil,
Y - pengubah untuk representasi kode karakter (mirip dengan @),
XXXX - kode numerik dari karakter yang dimasukkan,
BB - garis yang terletak setelah karakter yang dimasukkan.
Sesuai tujuannya, karakter kontrol
^ mirip dengan
@ . Mereka bahkan memiliki sintaksis yang serupa. Tetapi ada dua perbedaan penting di antara mereka:
- ^ memasukkan bukan karakter khusus, tetapi karakter font dengan kodenya;
- untuk karakter yang akan dimasukkan, Anda dapat mengatur font di bidang FNAME (@ tidak mengizinkan ini).
Kode simbol dapat dilihat menggunakan aplikasi charmap (Tabel Simbol), yang merupakan bagian dari sistem operasi Windows.
Jika tidak ada font yang ditentukan, font default digunakan. Berikut ini adalah contoh menggunakan karakter
^ .
BSTR str = SysAllocString(OLESTR(" ^(Arial)*B1~ ^*39~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Dalam contoh ini, dua karakter dimasukkan ke string yang dihasilkan, untuk yang pertama kita pilih font
Arial , untuk yang kedua kita meninggalkan font default. Gambar di bawah ini menunjukkan baris yang merupakan output ke dokumen.

Harap dicatat: font hanya diatur untuk karakter yang ditampilkan. Seperti yang ditunjukkan percobaan saya, KOMPAS biasanya memproses tidak adanya terminator
~ . Namun, saya tidak menganjurkan mengandalkan perilaku ini dan selalu menetapkan finalizer.
Jika karakter yang tidak valid (atau kode yang tidak valid) ditentukan setelah
^ , maka
^ dan
~ dihilangkan, dan garis di antara mereka ditampilkan seperti menggunakan font default. Misalnya dengan garis
"Sebelum ^ Q (Arial) * B1 ~ Setelah"Dokumen akan menampilkan:
“Sebelum Q (Arial) * B1 Setelah”Jika nama font yang salah ditunjukkan di bidang
FNAME , maka KOMPAS akan memilih font dan menampilkan karakter di dalamnya.
Jika tidak ada tanda kurung tutup di baris, maka baris tersebut tidak akan sepenuhnya ditampilkan. Misalnya, dengan baris:
“Sebelum ^ Q (Arial * B1 ~ Setelah”Dokumen hanya akan ditampilkan
"Sampai"Catatan: perilaku di atas dengan sintaks karakter kontrol yang salah berlaku untuk KOMPAS-3D V17 dan tidak didokumentasikan. Di versi lain, mungkin berbeda.
Cara tambahan untuk memasukkan karakter
Karakter
@ dan
^ masing-masing memiliki analog -
& dan
# . Mereka memiliki sintaks yang serupa:
AA & XX ~ BB
AA # ( FNAME ) XX ~ BBdimana
AA - string yang ditampilkan sebelum karakter yang dimasukkan,
XX - kode karakter yang dimasukkan (untuk & - karakter khusus, untuk karakter # - font),
BB - string yang ditampilkan setelah karakter yang dimasukkan,
FNAME - nama font.
Hanya ada dua perbedaan antara karakter
@ dan
^ dan rekan-rekannya:
- Karakter & dan # tidak memiliki pengubah Y. Kode karakter selalu ditentukan dalam notasi desimal.
- Kode untuk karakter yang akan dimasukkan ditentukan oleh maksimal dua digit.
Berikut ini adalah kode sumber untuk program yang menunjukkan cara menggunakan karakter
& dan
# .
BSTR str = SysAllocString(OLESTR(" &51~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" #(Arial)37~ #37~ ")); document2D->ksText(100.0,90.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Teks multiline
Menggunakan karakter kontrol, teks multi-baris dapat ditampilkan. Untuk melakukan ini, di tempat transfer ke baris baru, Anda harus memasukkan urutan:
@ / . Catatan: karakter
@ digunakan tanpa terminator
~ . Berikut ini adalah kode sumber untuk program yang menampilkan teks multiline menggunakan karakter kontrol.
BSTR str = SysAllocString(OLESTR(" @/ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Harap dicatat: berkat penggunaan karakter kontrol, kami menampilkan teks dua baris dengan hanya satu panggilan ke metode
ksText . Gambar di bawah ini menunjukkan hasil dari program ini.

Masukkan karakter kontrol
Kami menemukan cara memasukkan karakter khusus sewenang-wenang dan karakter Unicode. Tetapi bagaimana jika Anda ingin memasukkan karakter kontrol itu sendiri? Di sini Anda bisa menggunakan dua cara. Cara pertama adalah menggunakan karakter
^ dan menempelkannya seperti karakter font biasa. Tetapi ada cara yang lebih mudah.
Simbol
; bersifat bantu dan dapat dimasukkan langsung ke dalam teks. Untuk menyisipkan karakter kontrol lainnya, Anda harus menggandakannya. Yaitu, sepasang karakter
@@ memasukkan satu karakter
@ ke dalam teks. Hal yang sama berlaku untuk karakter kontrol lainnya.
Berikut ini adalah contoh program yang menunjukkan penyisipan karakter kontrol dalam string.
BSTR str = SysAllocString(OLESTR(" : @@ $$ && ; ~~ ^^ ##")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Penyimpangan atas dan bawah
Sintaks berikut digunakan untuk menyisipkan penyimpangan:
AA $ XX ; YY $ BBdimana
AA - teks yang ditampilkan sebelum penyimpangan;
XX - penyimpangan atas;
YY adalah penyimpangan yang lebih rendah;
BB - teks ditampilkan setelah penyimpangan.
Harap dicatat: seluruh konstruksi dibatasi hingga
$ karakter, dan “
; »Berfungsi sebagai pemisah antara penyimpangan atas dan bawah.
Jika tidak ada pembatas "antara karakter
$ ; ", Lalu seluruh garis di antara mereka ditafsirkan sebagai penyimpangan atas. Jika komponen
XX tidak ada, yaitu, setelah
$ pertama langsung pergi “
; ", Kemudian seluruh baris berikutnya ke
$ terdekat ditafsirkan sebagai penyimpangan yang lebih rendah.
Catatan: teks deviasi atas tidak boleh dimulai dengan huruf
b ,
d ,
s ,
m dan
l (huruf kecil
L ). Alasannya akan dijelaskan nanti.
Berikut ini adalah contoh program yang menampilkan keluaran dengan penyimpangan
BSTR str = SysAllocString(OLESTR(" $;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini:

Harap perhatikan bahwa KOMPAS hanya memproses satu karakter "
; ". Karakter kedua adalah "
; "Dapat diartikan sebagai finalizer dari seluruh struktur. Misalnya, dengan baris "
11 $ 22; 33; 44 $ " layar akan menampilkan:
Catatan: perilaku KOMPAS ini tidak didokumentasikan, jadi Anda tidak dapat mengandalkannya.
Pecahan
Sintaks fraksi mirip dengan sintaks penyimpangan dan memiliki dua opsi yang setara:
AA $ bXX ; YY $ BB
AA $ dXX ; YY $ BBdimana
AA - output teks ke fraksi;
XX adalah pembilangnya;
YY adalah penyebutnya;
BB - teks ditampilkan setelah fraksi.
Harap dicatat: satu-satunya perbedaan antara output dari fraksi dan output dari penyimpangan adalah kehadiran huruf
d atau
b segera setelah tanda
$ pertama. Kalau tidak, sintaksisnya identik.
Jika tidak ada "
; " antara karakter
$ d (
$ b ) dan
$ ", Lalu seluruh garis di antara mereka akan ditafsirkan sebagai pembilang. Jika komponen
XX tidak ada, yaitu, setelah
$ d (
$ b ) segera datang "
; ", Kemudian seluruh baris berikutnya ke
$ terdekat ditafsirkan sebagai penyebut.
Catatan: teks pembilang tidak boleh dimulai dengan huruf
s ,
m atau
l (huruf kecil
L ). Alasannya akan dijelaskan nanti.
Berikut ini adalah contoh dari program yang menunjukkan output fraksi menggunakan karakter kontrol.
BSTR str = SysAllocString(OLESTR(" $d;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Harap perhatikan bahwa KOMPAS memroses "ekstra" karakter "
; »Serta dalam kasus penyimpangan. Perilaku ini tidak berdokumen dan tidak dapat diandalkan.
Kontrol variasi dan ukuran fraksi
Pada awal pembangunan penyimpangan atau fraksi, salah satu huruf dapat ditemukan:
s ,
m atau
l (huruf kecil
L ). Mereka menentukan ukuran penyimpangan dan elemen fraksi (pembilang dan penyebut). Tujuannya dijelaskan dalam tabel di bawah ini.

Jika tidak ada huruf-huruf ini yang ditentukan, maka
l digunakan untuk fraksi, dan
m digunakan untuk penyimpangan. Berikut ini adalah contoh program yang menunjukkan penggunaan surat-surat ini.
BSTR str = SysAllocString(OLESTR(" $d;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $dl;$ ")); document2D->ksText(100.0,85.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $dm;$ ")); document2D->ksText(100.0,70.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $ds;$ ")); document2D->ksText(100.0,60.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Meskipun huruf
s ,
m, dan
l digunakan untuk fraksi dalam contoh ini, penggunaannya untuk penyimpangan tidak berbeda.
Perhatikan bahwa jika antara awal pecahan atau penyimpangan (
$ ,
$ d atau
$ b ) dan huruf
s ,
m atau
l setidaknya ada satu karakter "asing" (misalnya spasi), maka COMPAS tidak akan "melihat" huruf-huruf, dan fraksi atau Deviasi akan menjadi ukuran standar.
Karakter kontrol bersarang
Saat mengeluarkan pecahan dan penyimpangan, garis-garis yang dimasukkan dalam komposisinya diproses secara rekursif. Ini berarti bahwa ketika membentuk pembilang dan penyebut, karakter kontrol juga dapat digunakan. Pendekatan ini ditunjukkan dalam contoh berikut.
BSTR str = SysAllocString(OLESTR("@54~$s2$ + $d@+51~;@+52~$ - ^(Symbol)*70~")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
Gambar di bawah ini menunjukkan hasil dari program ini.

Untuk memasukkan huruf alfabet Yunani, kami menggunakan karakter kontrol @ dan ^ (untuk huruf pi). Tingkat dalam istilah pertama diturunkan menggunakan penyimpangan. Substring
$ s2 $ menampilkannya. Huruf
s menunjukkan ukuran kecil dari penyimpangan, tetapi karena tidak adanya pemisah "
; »Hanya deviasi atas yang ditampilkan.
Untuk membentuk pecahan, kombinasi
$ d; $ digunakan . Selain itu, pembilang dan penyebut mencakup karakter kontrol yang menyediakan output dari huruf-huruf alfabet Yunani.
Yang terakhir dikurangkan (π pi) ditampilkan sebagai simbol dari font Simbol menggunakan karakter kontrol
^ dan
~ .
Sayangnya, kemungkinan "rekursi" semacam itu sangat terbatas. Kami tidak dapat menginvestasikan fraksi dan penyimpangan satu sama lain. Masalahnya adalah keduanya dibuat menggunakan karakter
$ control. Karena itu, COMPASS tidak dapat dengan benar mem-parsing
$ mana milik elemen mana.
Kontrol karakter dalam paragraf
Anda dapat memintas sebagian pembatasan dengan karakter kontrol bersarang menggunakan paragraf. Menggunakan karakter kontrol dan paragraf bersama-sama memungkinkan Anda untuk membangun struktur yang lebih kompleks. Contoh di bawah ini menunjukkan konstruksi fraksi 4 tingkat.
Kode program untuk membangun fraksi 4 tingkat // DynamicArrayPtr dynamicArray; dynamicArray = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); dynamicArray->ksClearArray(); TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // BSTR str = SysAllocString(OLESTR(" ")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("1 + $d@+51~;2$")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("1 + $d@+56~;2$")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont.Unbind(); textItemParam.Unbind(); // ksTextLineParam TextLineParamPtr textLineParam; textLineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); textLineParam->Init(); textLineParam->SetTextItemArr(dynamicArray); dynamicArray.Unbind(); // ParagraphParamPtr paragraphParam; paragraphParam=static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); document2D->ksParagraph(paragraphParam); document2D->ksTextLine(textLineParam); document2D->ksEndObj(); // textLineParam.Unbind(); paragraphParam.Unbind();
Dalam contoh ini, karakter kontrol digunakan untuk membangun fraksi dalam pembilang dan penyebut dari fraksi utama, serta untuk memasukkan huruf alfabet Yunani. Gambar di bawah ini menunjukkan hasil dari program ini.

Kesimpulan
Dalam pelajaran ini, kami bertemu dengan karakter kontrol dan belajar bagaimana menggunakannya untuk menampilkan karakter khusus dan karakter font. Seperti yang Anda lihat, mereka menyediakan sintaks sederhana untuk membuat string yang menyertakan karakter khusus, fraksi, dan penyimpangan. Sayangnya, mereka tidak cocok untuk menyisipkan karakter khusus yang berisi string. Tetapi karakter khusus seperti itu sangat jarang. Ini adalah salah satu batasan karakter kontrol. Juga, mereka tidak dapat digunakan untuk membuat substring dan substring, dan ada batasan ketika bekerja dengan karakter khusus yang menyertakan string. Tetapi ini tidak mengurangi pahala mereka. Ini menyimpulkan diskusi kami tentang karakter kontrol.
Untuk dilanjutkan, ikuti berita blog.
Sergey Norseev, Ph.D., penulis buku "Pengembangan Aplikasi untuk COMPAS di Delphi."