Latar belakang tugas
Misalnya, muncul masalah bagi pelanggan:
- Buang elemen-elemen model bangunan dalam 1C.
- Dalam 1C, gunakan bagian-bagian dari model ini dalam kontrak - yah, katakanlah, menunjukkan bahwa elemen ini dan itu telah dibangun, ini dan itu hanya direncanakan, dll.
- Di Navisworks, Anda bisa melihat ini dalam sebuah gambar - misalnya, dengan menampilkan elemen model dalam berbagai warna. Untuk melakukan ini, mereka membuat plug-in untuk Navisworks yang dapat menyalin data dari tabel Kuantifikasi (tabel Takeoff) ke 1C, serta membawanya kembali dari 1C dan memasukkannya ke dalam tabel Takeoff.
Dan di 1C, seharusnya elemen model (kamar) yang digunakan dalam kontrak harus berubah warna.
Hanya sekarang ternyata setelah mengubah data tabular ini dalam 1C - Navisworks tidak mengerti bahwa mereka telah berubah, dan akan perlu untuk memperbaruinya. Karena itu, saya, sang programmer, perlu memberitahunya hal ini.
Jadi, tugas untuk programmer
Setelah pertukaran dengan 1C, data dalam tabel TK_Item berubah - khususnya, bidang Warna. Penting untuk membawa warna dalam gambar yang ditampilkan sesuai dengan yang ditunjukkan dalam tabel.
Kami mencari cara untuk melakukannya. Kami menggali deskripsi. Kami menemukan fungsinya -
public void OverridePermanentColor(IEnumerable<ModelItem> items, Color color)
Nah, bagaimana menemukan elemen model yang sesuai dengan elemen TK_Item yang dipilih adalah cerita lain, saya akan memberi tahu Anda lain kali jika itu menarik. Tapi siapa yang butuh itu - dan dia akan mencari tahu. Namun dengan warna, semuanya ternyata lebih menarik.
Pertama, Warna yang ditentukan dalam parameter fungsi bukan System.Drawing.Color, tetapi bahkan Autodesk.Navisworks.Api.Color, dengan blackjack dan ... yah, Anda mengerti. Yah, biarlah, tetapi dia memiliki konstruktor seperti itu:
public static unsafe Color FromByteRGB(byte red, byte green, byte blue)
Karenanya, tanpa masalah, kami akan membuat Warna seperti yang dibutuhkan Autodesk API.
(Sebenarnya, hal pertama yang harus saya coba adalah menemukan elemen yang sesuai dengan Item yang dipilih, pilih warna - dan mengaturnya ke warna ini.)
Tapi Dalam tabel, kita memiliki warna bidang satu nilai tipe Int64. Dan bagaimana membandingkannya dengan objek bertipe Warna tidak jelas.
Terlebih lagi, baik dalam dokumentasi, maupun dalam forum, maupun dalam contoh-contoh saya dapat menemukan bagaimana itu ditulis dalam database.
OKE, kami akan menggali secara eksperimental.
Kami mengambil Navisworks, membuka Kuantifikasi, mengubah warna elemen. Katakan, pada Red, jujur, bersih.

Setelah itu, kami mengambil plugin kami, memompanya data dari tabel TK_Item, dan lihat, apa yang ada di tabel?
(Untungnya, plug-in untuk keperluan debugging memberikan opsi seperti itu - unduh data dan tampilkan di formulir.)
Ternyata ada -65536.

Ulangi prosedur ini beberapa kali dan kurangi hasilnya menjadi file teks.
Pada awalnya, saya sangat terkejut dengan angka-angka dalam tabel, dan terutama dengan adanya nilai-nilai positif dan negatif.
Setelah bereksperimen dengan nilai-nilai komponen R, G, B, saya menyadari bahwa ketiga komponen ini ditampilkan dengan tiga byte terakhir dari angka tersebut.
Namun anehnya - mengapa byte tinggi diisi dengan unit, bukan nol?
Namun, jika kita berasumsi bahwa mereka selalu diisi dengan unit, maka keberadaan angka negatif mendapat penjelasan. Cukup isi byte tinggi, yang menentukan tanda angka.
Tetapi tidak selalu ada angka negatif!
Dan hanya mengingat bagaimana fungsi >> dan << bekerja, saya menyadari bahwa mereka dapat dengan bodoh mengisi bit tinggi dengan angka, termasuk bit tanda. Dan karena bit paling signifikan tidak diperlukan, tidak masalah apa yang ada.
Lalu pertanyaannya adalah - untuk apa mereka sangat membutuhkan warna? Sudah 64 bit? Saya melihat struktur tabel di mana data ini disimpan - hanya menggunakan Int64 untuk semua bilangan bulat. Sungguh, mengapa sepele?
Ringkasan
Nilai warna yang dicatat dalam tabel diperoleh sebagai berikut:
Int64 dbColor = Rb<<16 + Gb<<8 + Bb;
Transformasi terbalik - warna tabel ke warna yang digunakan untuk elemen model - kami melakukan ini:
byte R = (byte)(dbColorValue >> 16 % 256); byte G = (byte)(dbColorValue >> 8 % 256); byte B = (byte) (dbColorValue % 256); var color = Autodesk.Navisworks.Api.Color.FromByteRGB(R, G, B);