حفظ لون العنصر في قاعدة بيانات Navisworks

خلفية المهمة


على سبيل المثال ، نشأت مشكلة للعميل:


  • التخلص من عناصر نموذج المبنى في 1C.
  • في 1C ، استخدم هذه الأجزاء من النموذج في العقود - حسنًا ، دعنا نقول ، أشر إلى أن هذه العناصر وهذه العناصر قد تم إنشاؤها بالفعل ، فهذه العناصر تم التخطيط لها فقط ، إلخ.
  • في Navisworks ، يمكنك رؤية ذلك بطريقة أو بأخرى في رسم - على سبيل المثال ، من خلال عرض عناصر النموذج بألوان مختلفة. للقيام بذلك ، قاموا بعمل مكون إضافي لـ Navisworks يمكنه نسخ البيانات من جداول الكميات (جداول الإقلاع) إلى 1C ، وكذلك استعادتها من 1C ووضعها في جداول الإقلاع.
    وفي 1C ، كان من المفترض أن عناصر النموذج (الغرف) المستخدمة في العقد يجب أن تغير الألوان.

الآن فقط اتضح أنه بعد تغيير هذه البيانات الجدولية في 1C - Navisworks لا يفهم أنها قد تغيرت ، وسيكون من الضروري تحديثها. لذلك ، أنا ، مبرمج ، بحاجة إلى إخباره بذلك.


لذلك ، مهمة للمبرمج


بعد التبادل مع 1C ، تغيرت البيانات في جدول TK_Item - على وجه الخصوص ، حقل اللون. من الضروري إحضار الألوان في الرسم المعروض وفقًا للألوان الموضحة في الجدول.


نحن نبحث عن كيفية القيام بذلك. نحفر الوصف. نجد الوظيفة -


public void OverridePermanentColor(IEnumerable<ModelItem> items, Color color) 

حسنًا ، كيفية العثور على عناصر النموذج التي تتوافق مع عنصر TK_Item المحدد هي قصة أخرى ، وسأخبرك مرة أخرى إذا كانت مثيرة للاهتمام. ولكن من يحتاج إليها - وسيحددها. ولكن مع اللون ، تبين أن كل شيء كان أكثر إثارة للاهتمام.
أولاً ، اللون المحدد في معلمات الوظيفة ليس System.Drawing.Color ، ولكن حتى Autodesk.Navisworks.Api.Color ، مع البلاك جاك و ... حسنًا ، أنت تفهم. حسنًا ، فليكن ، ولكن لديه مثل هذا المنشئ:


 public static unsafe Color FromByteRGB(byte red, byte green, byte blue) 

لذلك ، دون مشاكل ، سنجعل اللون مثل واجهة برمجة تطبيقات Autodesk مطلوبة.
(في الواقع ، أول شيء يجب أن أحاوله هو العثور على العناصر التي تتوافق مع العنصر المحدد ، واختيار اللون - وتعيينه على هذا اللون.)


ولكن. في الجدول ، لدينا في الحقل لون قيمة واحدة من النوع Int64. وكيفية مقارنته بكائن من النوع Color غير واضح.


علاوة على ذلك ، لا في الوثائق ولا في المنتدى ولا في الأمثلة التي أجدها مكتوبة في قاعدة البيانات.


حسنًا ، سنحفر بشكل تجريبي.


نحن نأخذ Navisworks ، ونفتح القياس الكمي ، ونغير لون عنصر ما. قل ، على أحمر صادق ونظيف.


صورة


بعد ذلك ، نأخذ المكون الإضافي لدينا ، ونضخهم البيانات من جدول TK_Item ، وننظر ، ماذا يوجد في الجدول؟


(لحسن الحظ ، قدم المكون الإضافي لأغراض التصحيح مثل هذا الخيار - تنزيل البيانات والعرض في النموذج.)


اتضح أن هناك -65536.


صورة


كرر الإجراء عدة مرات وقلل النتائج إلى ملف نصي.


اسماللونقيمة اللون في الجدولالتمثيل الثنائي للون في الجدول
نوع الجدار 1.1 أعلاه علامة 0000أحمر-655361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000
الجدار نوع 1.2 أعلاه علامة 0000أخضر-167119361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 1111 1111 0000 0000
نوع الجدار 2.1 أعلاه علامة 0000أزرق-167769611111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 1111 1111
نوع الجدار 0.1 تحت علامة 0000أحمر = 16-157286401111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0000 0000 0000 0000 0000
الجدار نوع 0.2 أدناه علامة 0000أحمر = 17-156631041111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0001 0000 0000 0000 0000
العلاقات على ارتفاع. 0000أحمر = 193 أخضر = 32 أزرق = 7412 656 7140000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0001 0010 0000 0100 1010

في البداية ، فوجئت للغاية بالأرقام الموجودة في الجدول ، وخاصة بوجود قيم إيجابية وسلبية.


بعد أن جربت قيم المكونات R و G و B ، أدركت أن هذه المكونات الثلاثة معروضة مع البايتات الثلاثة الأخيرة من الرقم.


لكن الأمر غريب إذن - لماذا تمتلئ وحدات البايت العالية بوحدات ، وليس بالأصفار؟
ومع ذلك ، إذا افترضنا أنها مملوءة دائمًا بوحدات ، فإن وجود الأرقام السالبة يحصل على تفسير. ما عليك سوى ملء البايت العالي ، الذي يحدد علامة الرقم.
ولكن ليست هناك دائما أرقام سلبية!


وتذكر فقط كيف تعمل الدالتان >> و << ، لقد أدركت أنه بإمكانهما ملء الأرقام عالية الغباء بالأرقام ، بما في ذلك بت الإشارة. ونظرًا لعدم الحاجة إلى البتات الأكثر أهمية ، لا يهم ما هو موجود.


ثم السؤال هو - لماذا يحتاجون إلى الكثير من الأهمية للون؟ بالفعل 64 بت؟ نظرت إلى بنية الجداول التي يتم تخزين هذه البيانات فيها - إنها تستخدم فقط Int64 لجميع الأعداد الصحيحة. حقا ، لماذا تافه؟


يؤدي


يتم الحصول على قيمة اللون المسجل في الجدول على النحو التالي:


 Int64 dbColor = Rb<<16 + Gb<<8 + Bb; 

التحويل العكسي - لون الجدول إلى اللون المستخدم لعناصر النموذج - نقوم بهذا:


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

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


All Articles