باختصار
- تمثل Category وFamily وFamilySymbol وFamilyInstance مستويات مختلفة من التصنيف في Revit.
- يمكن إنشاء غرفة باستخدام API في طابق وموقع محددين.
- تعتمد حدود الغرفة على وجود منطقة مغلقة وعلى حالة Room Bounding للعناصر المحيطة.
- يتناول التدريب التمهيدي من Autodesk University أدوات RevitPythonShell وRevit Lookup وpyRevit.
ما الذي ستتعلمه في هذا الدليل؟
أُعدّ هذا الدليل لمن يرغبون في فهم مفهومي الفئة والغرفة في Revit API، وتقييم الأمثلة الواردة في وثائق المطوّرين من Autodesk ضمن سياقها الصحيح. سنبدأ بتوضيح كيفية تصنيف عنصر Revit بحسب الفئة والعائلة والنوع والنسخة الموضوعة في المشروع. ثم نشرح طريقتين لإنشاء غرفة باستخدام API، والشروط التي ينبغي التحقق منها عند قراءة حدود الغرفة.
الهدف ليس تقديم إضافة جاهزة للعمل مباشرة في كل مشروع. توضح أمثلة الشيفرة الكائنات وشروط المشروع التي تعمل معها API. الأمثلة الواردة في المصادر مكتوبة بلغة C#، لذا لا يصح لصقها في أداة Python كما لو كانت شيفرة Python.
المتطلبات والنطاق
يستخدم التدريب التمهيدي في Autodesk University برامج Revit وRevitPythonShell وأدوات Revit Lookup وpyRevit. ويُذكر أن التدريب يتطلب معرفة أساسية ببرنامج Revit ومبادئ Python. لكن هذا لا يعني أن أمثلة API المستخدمة في الشرح أدناه مكتوبة بلغة Python؛ فمقاطع الشيفرة في وثائق Autodesk الخاصة بالغرف والفئات مكتوبة بلغة C#.
إحدى وثائق المطوّرين المشار إليها تخص Revit 2018، والأخرى صفحة توثيق Revit 2024. ولا توضح المصادر مدى توافق هذه الأمثلة مع إصدارات Revit المختلفة. لذلك تحقّق من وثائق API الخاصة بالإصدار المستهدف قبل استخدام أي مثال في مشروع فعلي. ولا توضح المصادر المتاحة متطلبات الحساب أو الإصدارات الحالية للأدوات أو شروط ترخيصها.
1. ميّز بين الفئة وبنية العائلة
الفئة تصنيف يحدد النوع العام للعنصر وكيفية التعامل معه في Revit. الجدران والأبواب والغرف أمثلة على فئات مختلفة. وترتبط الفئات بمهام مثل إعداد الجداول وتحرير المعلمات والتحكم في الظهور أو العرض الرسومي.
أما بنية العائلة فتقدم مستوى أكثر تفصيلاً. تمثل Family العائلة بأكملها، ويمثل FamilySymbol نوعاً محدداً ضمنها، بينما تمثل FamilyInstance نسخة واحدة موضوعة في المشروع. فعلى سبيل المثال، قد تضم عائلة الباب أنواعاً مختلفة، ويُعد كل باب موضوع في المشروع نسخة مستقلة. من المهم مراعاة هذا التمييز في API لتجنب الخلط بين الفئة العامة للعنصر ونوعه المحدد.
يوضح مثال الفئات من Autodesk كيفية الوصول إلى مجموعة الفئات في المستند المفتوح واختيار فئة مضمّنة. كما تحذر الوثائق من أن أسماء الفئات قد تختلف باختلاف لغة واجهة Revit. ولتجنب التأثر باختلاف اللغة، فكّر في استخدام تعريفات الفئات المضمّنة مثل BuiltInCategory بدلاً من الاعتماد على نص الاسم.
2. اختر طريقة إنشاء الغرفة
تشرح وثائق API سيناريوهين مختلفين لإنشاء غرفة. في الأول، تُنشأ الغرفة باستخدام طابق ومعلومات عن الموقع. ويعبّر المثال عن الموقع بقيمة من النوع UV، ثم يتحقق من صلاحية نتيجة الإنشاء. والفكرة الأساسية هي أن استدعاء إنشاء الغرفة يعتمد على معلومات الطابق والموقع، إلى جانب كائن الغرفة نفسه.
في السيناريو الثاني، تُنشأ الغرفة أولاً في جدول الغرف مع ربطها بمرحلة من مراحل المشروع، ثم تُضاف إلى دائرة مخطط. والشرط المهم هنا أن يكون العنصر المراد إضافته موجوداً في جدول الغرف فقط، وألا يكون قد وُضع في أي عرض للمخطط بعد. ويُعثر على دائرة المخطط من خلال طوبولوجيا مخطط الطابق المعني. وعند نجاح عملية الوضع، تُنشأ في العرض الذي توجد فيه دائرة المخطط غرفة نموذج تحمل الاسم والرقم نفسيهما.
قبل تطبيق هذين النهجين، حدّد النتيجة المطلوبة: هل تريد إنشاء غرفة عند نقطة معينة، أم وضع غرفة موجودة في الجدول ضمن دائرة المخطط؟ في المسار الثاني، قد يؤدي تجاهل شرط وجود الغرفة في الجدول إلى عدم عمل الإجراء بالمدخلات المتوقعة.
3. افحص حدود الغرفة وتحديثاتها
تعتمد حدود الغرفة على عناصر النموذج التي تكوّن منطقة مغلقة. وتورد وثائق Autodesk الجدران وخطوط النموذج والأعمدة والأسقف ضمن أمثلة العناصر المرتبطة بالحدود. وتُستخدم الطريقة SpatialElement.GetBoundarySegments() لقراءة مقاطع الحدود. وقد تتضمن البيانات الناتجة منطقة واحدة أو أكثر، ومقاطع كل منطقة ضمن قوائم متداخلة.
قد لا تتوفر بيانات الحدود في جميع الحالات. فإذا لم تكن الغرفة ضمن منطقة مغلقة، أو كانت موجودة في جدول الغرف فقط، فقد تُرجع الطريقة null. لذلك، عند عدم الحصول على نتيجة، تحقّق ليس من استدعاء API فحسب، بل أيضاً من أن النموذج يشكّل غرفة مغلقة ومن أن الغرفة موجودة في عرض المخطط.
يؤثر إعداد Room Bounding في إدراج عناصر مثل الجدران والأعمدة والأسقف ضمن حدود الغرفة. كما يمكن لخطوط فصل الغرف أن تُنشئ حدوداً. وعند إضافة عنصر مثل جدار باستخدام API، قد يتغير حد الغرفة، لذا لا تعتبر بيانات الحدود التي جُمعت قبل التغيير صالحة بعده. يوضح مثال Autodesk تنفيذ إنشاء العنصر ضمن transaction، ثم إعادة قراءة الحدود بعد اكتمال العملية.
يمكن أيضاً تغيير موقع الغرفة بإزالتها أولاً من موضعها الحالي. وتوضح الوثائق أنه يمكن إخراج الغرفة من موقعها باستخدام الطريقة Room.Unplace()، مع بقائها متاحة في المشروع. وهذا يتطلب فهم الفرق بين حذف الكائن من المشروع وتغيير موضعه.
4. التأثير في سير عمل العمارة والتصوّر
يمكن لفهم حدود الغرف وعلاقات الفئات أن يساعد فرق العمارة والتصميم الداخلي التي تعمل ببيانات الغرف، أو تصنّف عناصر النموذج، أو تدرس أتمتة المهام المتكررة. ولأن حدود الغرف تعتمد على العناصر المحيطة في النموذج وإعداداتها، ينبغي التحقق من صحة هذه العلاقات في النموذج قبل بدء الأتمتة.
لا تشرح هذه المصادر إعدادات التصيير أو التصوّر مباشرة. ومع ذلك، فإن اتساق النموذج مهم في عمليات BIM التي تتعامل مع بيانات الغرف والفئات. قبل بدء التطبيق، افحص إصدار Revit المستخدم، وحالة وضع الغرفة، وإعدادات Room Bounding ذات الصلة، ومرحلة المشروع. ويُعدّ نموذج تجريبي صغير مناسباً للطلاب كنقطة انطلاق لملاحظة تأثير تغيير الجدار أو أي عنصر محيط آخر في بيانات الحدود.
أخطاء شائعة
افتراض أن أسماء الفئات متطابقة في جميع لغات Revit. توصي Autodesk باستخدام تعريفات الفئات المضمّنة لتجنب اختلافات اللغة.
توقع الحصول على مقاطع الحدود مع أن الغرفة ليست ضمن منطقة مغلقة. بحسب الوثائق، قد تُرجع الطريقة null في هذه الحالة.
وضع الغرفة المراد إضافتها إلى دائرة المخطط مسبقاً في عرض للمخطط. يجب أن يكون العنصر موجوداً في جدول الغرف فقط.
إغفال حالة Room Bounding للعناصر المحيطة. يتعلق هذا الإعداد بمشاركة العنصر في حدود الغرفة من عدمها.
مواصلة استخدام بيانات الحدود القديمة بعد إنشاء عنصر جديد في النموذج. أعد جلب بيانات الحدود بعد اكتمال التغيير.
التعامل مع أمثلة C# على أنها شيفرة Python. رغم أن المصادر تذكر أدوات Python، فإن أمثلة API الخاصة بالغرف والفئات مكتوبة بلغة C#.
الخطوات التالية
ابدأ بمراجعة شرح Autodesk للفئات، ولاحظ الفرق بين الفئة والعائلة والنوع والنسخة في مشروع موجود. بعد ذلك، قارن بين سيناريوهات إنشاء الغرف في مستند تجريبي: الإنشاء باستخدام معلومات الموقع، والوضع من الجدول في دائرة المخطط. وسجّل العرض الذي توجد فيه الغرفة في كل خطوة.
أخيراً، أعد فحص بيانات الحدود بعد تغيير العناصر المحيطة بمنطقة غرفة مغلقة. يساعد هذا التمرين على فهم أن القيمة التي تُرجعها API لا ينبغي النظر إليها بمعزل عن حالة النموذج. وعند الانتقال إلى أتمتة أوسع، خذ أيضاً في الاعتبار موضوعات مرشحات العناصر وtransactions وواجهة المستخدم التي تناولها التدريب التمهيدي من Autodesk University.
المصدر والترخيص
أُعدّ هذا الدليل بصياغتنا الخاصة بالاستناد إلى موضوعات الغرف في وثائق مطوّري Autodesk Revit API (K1)، وتصنيفات الفئات والعائلات (K2)، والتدريب التمهيدي على Revit API من Autodesk University (K4). وقد وُصفت المصادر بأنها مرخّصة بحرية؛ وبما أن النصوص المتاحة لا تحدد اسم ترخيص بعينه، فلم تُنسب إليها هنا فئة ترخيص محددة.
المصادر
3 مصادرلا نعيد نشر نصوص المصادر؛ الاقتباسات القصيرة مشار إليها، وما تبقى ملخص وتعليق من إعدادنا.
توفر الفئات وحدود الغرف نقطة انطلاق مفيدة للمكاتب التي تسعى إلى ربط بيانات نموذج Revit بالأتمتة. وأبرز فائدة عملية هي تعلّم تقييم نتيجة استدعاء API بالنظر إلى الشيفرة وحالة الغرفة في الجدول أو المخطط والعناصر المحيطة بها معاً.
بالنسبة إلى المكاتب والطلاب في تركيا، ينبغي اختبار هذا النهج في مشروع تجريبي صغير قبل نقله إلى نموذج فعلي. ولأن المصادر لا تذكر توافق الأدوات الحالية أو تكلفة الترخيص أو متطلبات الأجهزة، يجب التحقق من هذه الأمور بشكل مستقل قبل اتخاذ قرار الاستثمار. كما لا يمكن استخلاص أي ادعاء بشأن أداء التصيير من هذه الوثائق.
الأسئلة الشائعة
كيف تُقرأ حدود الغرف باستخدام Revit API؟
تذكر وثائق Autodesk أنه يمكن جلب مقاطع الحدود باستخدام الطريقة SpatialElement.GetBoundarySegments(). وقد تُرجع الطريقة null إذا لم تكن الغرفة ضمن منطقة مغلقة أو كانت موجودة في الجدول فقط.
كيف تُضاف غرفة من الجدول إلى المخطط باستخدام Revit API؟
توضح الوثائق أن الغرفة تُنشأ أولاً في جدول الغرف مع ربطها بمرحلة من مراحل المشروع، ثم توضع في المخطط باستخدام PlanCircuit. ويجب أن يكون العنصر موجوداً في الجدول فقط، وألا يكون قد وُضع في أي عرض للمخططط.
هل تتغير أسماء فئات Revit باختلاف اللغة؟
توضح Autodesk أن قيمة Category.Name قد تختلف بحسب لغة Revit. وتوصي باستخدام BuiltInCategory لتجنب اختلافات اللغة.



