باختصار
- يشير ComponentInstance إلى كائن ComponentDefinition وإلى التحويل الذي يحدد موضع النسخة في النموذج.
- تنشئ make_unique تعريفًا جديدًا لنسخة مكوّن لا تشاركه نسخ أخرى.
- توفّر DefinitionList وسائل للعثور على تعريفات المكوّنات في النموذج وإضافتها وتحميلها وتنظيف التعريفات غير المستخدمة.
- بدءًا من 2021.0، يمكن تحميل نماذج SketchUp الأحدث، لكن ينبغي عدم حفظ التغييرات فوق الملف الأصلي لاحتمال إسقاط بعض المعلومات.
تشرح وثائق SketchUp Ruby API كيفية تمثيل نسخ المكوّنات في النموذج، وكيفية إدارة التعريفات المرتبطة بها. يمثّل ComponentInstance نسخة مكوّن موضوعة في النموذج، بينما يمثّل ComponentDefinition تعريف المكوّن الذي تستند إليه هذه النسخة. ويُحدَّد موضع النسخة في النموذج أيضًا بمعلومات التحويل. يساعد فهم هذا التمييز على الفصل بين إجراء تغييرات مشتركة على العناصر المعاد استخدامها وتعديل نسخة واحدة فقط.
يستند هذا الدليل إلى طرق موثّقة في مراجع SketchUp Ruby API الخاصة بـ ComponentInstance وDefinitionList وModel. وتختلف ملاحظات الإصدارات الخاصة بهذه الطرق؛ لذا تُذكر حدود الإصدار ذات الصلة كلما حُدّدت في الوثائق.
1. افهم العلاقة بين النسخة وتعريف المكوّن
تعامل مع نسخة المكوّن في النموذج على أنها منفصلة عن تعريفها. يشير ComponentInstance إلى كائن ComponentDefinition، ويحمل معلومات موضعه عبر التحويل. يتيح هذا التركيب استخدام التعريف نفسه من قِبل عدة نسخ موضوعة في النموذج. لذلك، من المهم التحقق من التعريف المرتبط بالنسخة قبل تعديلها.
في Ruby API، يعيد Sketchup.active_model النموذج النشط. وتتيح طريقة definitions في كائن Model الوصول إلى مجموعة DefinitionList التي تضم كائنات ComponentDefinition في النموذج. أما طريقة definition في النسخة، فتعيد مباشرةً التعريف المرتبط بها. وبذلك يمكن التعامل مع استعراض التعريفات على مستوى النموذج والعثور على تعريف نسخة محددة كعمليتين منفصلتين.
إذا كنت لا تريد أن تتغير النسخ الأخرى التي تستخدم التعريف نفسه، ففكّر في استخدام الطريقة make_unique قبل تعديل النسخة وحدها. وفقًا للوثائق، تنشئ هذه الطريقة تعريفًا جديدًا للنسخة لا تستخدمه النسخ الأخرى. وقد يكون هذا مفيدًا عند الرغبة في تغيير قطعة واحدة فقط من عناصر الأثاث أو الأبواب أو التجهيزات المستخدمة عدة مرات.
2. افحص النسخة واعزلها باستخدام Ruby API
يبحث المثال التالي عن أول كائن ComponentInstance ضمن سياق التحرير في النموذج النشط. إذا عثر على نسخة، يطبع اسم التعريف المرتبط بها، ثم يستدعي make_unique لإنشاء تعريف مستقل لها. لا يفحص الكود قائمة التعريفات في النموذج بأكملها؛ بل يحصل على اسم التعريف عبر طريقة definition الخاصة بالنسخة المحددة.
model = Sketchup.active_model
instance = model.active_entities.grep(Sketchup::ComponentInstance).first
if instance
puts instance.definition.name
instance.make_unique
endتحقّق من المكوّن المحدد أو الموجود ضمن سياق التحرير النشط قبل تشغيل هذا المثال في نموذجك. يأخذ الكود أول كائن ComponentInstance، ولا يختار مكوّنًا محددًا بالاسم. لذلك، إذا كان هناك أكثر من مكوّن، فمن المهم التحقق من الناتج والنسخة المستهدفة. كما أن استدعاء make_unique لا يكتفي بعرض معلومات، بل ينشئ تعريفًا مستقلًا في النموذج.
تغيير التعريف المرتبط يختلف عن تغيير موضع النسخة. تعيّن الطريقة definition= تعريفًا آخر، وتشير الوثائق إلى أنها تحافظ على التحويل الحالي للنسخة. ويمكن استخدام transformation وtransformation= لقراءة التحويل أو ضبطه. أما transform! فتطبّق Geom::Transformation، بينما تضبط move! التحويل بطريقة مشابهة من دون تسجيل العملية في سجل التراجع. راعِ هذا الفرق عند تصميم تدفّق التحرير والتراجع في الإضافة.
3. تعامل بحذر مع الهندسة ومجموعات التعريفات
تحوّل الطريقة explode نسخة المكوّن إلى عناصر رسم منفصلة. وقد تعيد مصفوفة من العناصر عند النجاح أو false عند الإخفاق. إذا كان الحفاظ على بنية المكوّن مهمًا، فقيّم نتيجة العملية في النموذج قبل استخدام هذه الطريقة. وتدرج الوثائق أيضًا عمليات هندسية مثل intersect وouter_shell وsplit وsubtract وtrim وunion؛ وبعضها مخصص للعمل على أجسام صلبة manifold. لذلك، لا تفترض أن نتائجها ستكون واحدة على كل مكوّن.
تحسب trim الفرق بين جسمين صلبين manifold بطريقة غير تدميرية؛ أما subtract فهي طريقة أخرى مدرجة لإجراء عملية الفرق. وتشير وثائق API أيضًا إلى أن intersect غير متاحة في SketchUp Make. وقد وُسِمت الطريقة manifold? في ComponentInstance بأنها مهملة؛ ووفقًا للوثائق، يُفضّل استخدام ComponentDefinition#manifold? للتحقق من حالة manifold للتعريف. وتوضح هذه الملاحظات ضرورة مراجعة وصف الطريقة ونوع الكائن قبل تنفيذ العمليات الهندسية.
تتضمن DefinitionList طرقًا للعثور على التعريفات بحسب الفهرس أو الاسم أو GUID، وإضافة تعريف جديد، وتحميل مكوّن من ملف، وتنظيف التعريفات غير المستخدمة. تزيل purge_unused التعريفات غير المستخدمة. تجنّب حذف عناصر من المجموعة نفسها أثناء المرور عليها باستخدام each؛ إذ تحذّر الوثائق من احتمال تخطي بعض التعريفات بسبب تغيّر عدد العناصر والفهارس. وإذا كان الحذف ضروريًا، توصي الوثائق أولًا بنسخ المجموعة إلى مصفوفة، ثم متابعة العمل على النسخة.
4. تحقّق من التوافق مع الإصدارات وسلامة الملفات
تُستخدم الطريقة load في DefinitionList لتحميل ملف مكوّن SketchUp. ووفقًا للوثائق، يتوفر الخيار allow_newer بدءًا من SketchUp 2021.0، ويسمح بتحميل نماذج محفوظة بإصدار أحدث. لكن قد تُسقط بعض المعلومات أثناء التحميل؛ وتحذّر وثائق API من حفظ الملف المحمّل من نموذج أحدث فوق الملف الأصلي. لذا فإن الاحتفاظ بالنموذج المصدر جزء من سير العمل.
توجد أيضًا ملاحظة بشأن سلوك إعادة تحميل مكوّن من مسار الملف نفسه. قبل SketchUp 2023.0، إذا كان النموذج يتضمن مكوّنًا آخر مرتبطًا بالمسار نفسه، فقد يعيد استدعاء التحميل المكوّن الموجود بدلًا من جلب المحتوى الجديد. إذا بدا أن الملف لم يتحدّث، فتحقّق من إصدار SketchUp المستخدم ومسار الملف، وراعِ حدود الإصدارات المذكورة في الوثائق المصدرية عند ضمان توافق كود الإضافة.
التأثير في سير عمل العمارة والتصميم الداخلي والتصور
بالنسبة إلى فرق العمارة والتصميم الداخلي التي تستخدم عناصر أثاث وأبواب وتجهيزات متكررة، يساعد التمييز بين النسخة والتعريف على فهم نطاق التغييرات في النموذج. فإذا كان المطلوب إجراء تغييرات مشتركة عبر التعريف المشترك، تكون علاقة المكوّنات مفيدة؛ أما إذا كان المطلوب تعديل نسخة واحدة فقط، فتوفر API الطريقة make_unique لهذا الغرض. وقد يساعد هذا التمييز الفرق العاملة على النموذج في تتبع العناصر التي تتغير معًا.
ومن النقاط المهمة أيضًا لفرق التصور ومطوّري الإضافات التأكد من اختيار النسخة والتعريف الصحيحين. ولا تذكر المصادر متطلبات محددة للأجهزة أو قياسات للأداء أو شروطًا للترخيص. والمسائل العملية التي ينبغي متابعتها هي دعم إصدار SketchUp المستخدم للطريقة المعنية، والحفاظ على الملف المصدر عند تحميل ملفات أحدث.
أخطاء شائعة
تعديل تعريف مشترك لنسخة من دون مراعاة احتمال تغيّر النسخ الأخرى.
افتراض أن الكود اختار كائنًا محددًا، مع أنه يعثر على أول كائن ComponentInstance.
الخلط بين تعيين تعريف وبين تغيير تحويل الموضع.
استخدام طرق هندسية تشترط أن تكون الأجسام manifold كما لو كانت تعمل على كل مكوّن.
حذف عناصر من DefinitionList أثناء المرور عليها.
تجاهل التحذير من حفظ التغييرات فوق الملف المصدر بعد تحميل نموذج أحدث.
المصادر
3 مصادرلا نعيد نشر نصوص المصادر؛ الاقتباسات القصيرة مشار إليها، وما تبقى ملخص وتعليق من إعدادنا.
بالنسبة إلى مكاتب العمارة والتصور في تركيا، تتمثل الفائدة العملية لهذا النهج في التمييز بين التغييرات المشتركة على العناصر المتكررة والتعديلات المنفردة. وعند تسليم النموذج بين أعضاء الفريق، يساعد التحقق من التعريف الذي يستخدمه المكوّن على تجنب التغييرات الجماعية غير المتوقعة.
لا توفر طرق API الواردة في هذا الدليل معلومات عن متطلبات الأجهزة أو تكلفة الترخيص؛ لذا ينبغي التحقق من شروط المنتج والإصدار على نحو منفصل في هذه الجوانب. وينبغي أن تكون الأولوية للمكاتب هي التحقق من توافق API مع إصدار SketchUp المستخدم، والاحتفاظ بنسخة من الملف المصدر عند تحميل ملفات أحدث. وأسهل نقطة يمكن إغفالها هي التحقق من نطاق التغيير قبل تعديل التعريف المشترك.
الأسئلة الشائعة
ما الفرق بين ComponentInstance وComponentDefinition في SketchUp؟
ComponentInstance هي نسخة مكوّن موضوعة في النموذج وتشير إلى كائن ComponentDefinition. ويُحدَّد موضع النسخة بمعلومات التحويل.
كيف يمكن عزل نسخة واحدة من مكوّن باستخدام SketchUp Ruby API؟
يمكن استخدام الطريقة make_unique على ComponentInstance. وتوضح الوثائق أن هذه الطريقة تنشئ للنسخة تعريفًا جديدًا لا تشاركه نسخ أخرى.
ما الذي ينبغي مراعاته عند تحميل ملف SketchUp أحدث باستخدام Ruby API؟
يتوفر الخيار allow_newer في الطريقة load بدءًا من 2021.0. ونظرًا إلى احتمال إسقاط بعض المعلومات من الملف الأحدث، يُنصح بعدم حفظ التغييرات فوق الملف المصدر.



