خلفية المهمة
على سبيل المثال ، نشأت مشكلة للعميل:
- التخلص من عناصر نموذج المبنى في 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.

كرر الإجراء عدة مرات وقلل النتائج إلى ملف نصي.
في البداية ، فوجئت للغاية بالأرقام الموجودة في الجدول ، وخاصة بوجود قيم إيجابية وسلبية.
بعد أن جربت قيم المكونات 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);