STL

**STL** هو صيغة ملفات أصلية لبرامج التصميم بمساعدة الحاسوب (CAD) الخاصة بالطباعة المجسمة ستيريوليثغرافي التي ابتكرتها شركة (3 دي سيستمز). ويذكر تشاك هال، مخترع الطباعة المجسمة ومؤسس شركة (3 دي سيستمز)، أن امتداد الملف هو اختصار لكلمة (stereolithography)، على الرغم من أنه يُشار إليه أيضاً باسم "لغة المثلثات القياسية"  أو "لغة الفسيفساء القياسية" .

يصف ملف STL سطحاً مثالثة خاماً وغير منظم عبر المتجه متجه وحدة ورؤوس المثلثات (المرتبة وفق قاعدة اليد اليمنى ) باستخدام نظام نظام إحداثيات ديكارتية ثلاثي الأبعاد. وكانت المواصفات الأصلية تفرض أن تكون جميع إحداثيات STL أرقاماً موجبة، إلا أن هذا القيد لم يعد مفروضاً، وأصبح من الشائع العثور على إحداثيات سالبة في ملفات STL اليوم. ولا تحتوي ملفات STL على معلومات حول المقياس (scale)، وتعتبر الوحدات فيها عشوائية. وتصف ملفات STL هندسة السطح فقط لجسم ثلاثي الأبعاد دون أي تمثيل للون أو الملمس أو سمات نموذج (CAD) الشائعة الأخرى. ويحدد تنسيق STL كلاً من تمثيلات أسكي وملف ثنائي. وتُعد الملفات الثنائية أكثر شيوعاً نظراً لكونها أكثر صغراً في الحجم.

يُستخدم STL على نطاق واسع في النماذج الأولية السريعة، وطباعة ثلاثية الأبعاد، وتصنيع بمساعدة الحاسوب، كما تدعمه العديد من الحزم البرمجية الأخرى.

## نبذة تاريخية
ابتكرت مجموعة ألبرت الإستشارية تنسيق STL لصالح شركة 3 دي سيستمز في عام 1987. وقد طُوّر هذا التنسيق لأولى الطابعات ثلاثية الأبعاد التجارية التابعة لشركة (3 دي سيستمز). ومنذ إصداره الأولي، ظل التنسيق دون تغيير نسبيّاً لمدة 22 عاماً.

وفي عام 2009، قُدّم مقترح لتحديث التنسيق أُطلق عليه اسم (STL 2.0)، والذي تطور لاحقاً ليصبح .

## الصياغة
### أسكي
يبدأ ملف STL بتنسيق ASCII بالسطر التالي:

`'''solid''' <var>name</var>`

حيث يمثل (اسم) name سلسلة نصية اختيارية (وعلى الرغم من ذلك، إذا حُذف الاسم name، فيجب أن تظل هناك مسافة بعد كلمة solid لضمان التوافق مع بعض البرامج). يتجاهل البرنامج بقية السطر، ويُستخدم أحياناً لتخزين البيانات الوصفية (مثل اسم الملف، المؤلف، تاريخ التعديل، إلخ). ويستمر الملف بعدد من المثلثات، يُمثَّل كل منها على النحو التالي:

 **facet normal** ni nj nk
   **outer loop**
       **vertex** v1x v1y v1z
       **vertex** v2x v2y v2z
       **vertex** v3x v3y v3z
    **endloop**
 **endfacet**

حيث يمثل كل من n أو v حسابات الفاصلة المتحركة بتنسيق إشارة-العلامة-e-الإشارة-أسيًا، على سبيل المثال: `2.648000e-002`. وينتهي الملف بـ:

 **endsolid** name

يوحي هيكل التنسيق بوجود احتمالات أخرى (مثل الأوجه التي تحتوي على أكثر من حلقة loop واحدة، أو الحلقات التي تضم أكثر من ثلاثة رؤوس)، على الرغم من أن وصف تنسيق الملف يشير فقط إلى فسيفساء (رياضيات) المثلثية.

ويمكن استخدام  (المسافات، وعلامات الجدولة، والأسطر الجديدة) في أي مكان في الملف باستثناء داخل الأرقام أو الكلمات. وتعد المسافات بين `facet`و `normal` وبين `outer` و`loop` إلزامية.

### الثنائية
نظرًا لأن ملفات STL بتنسيق أسكي قد تكون كبيرة الحجم، يوجد إصدار ثنائي (ملف ثنائي) من STL. يحتوي ملف STL الثنائي على ترويسة بطول 80 حرفًا تتجاهل عمومًا، ولكن يجب ألا يبدأ أبدًا بالتمثيل النصي لكلمة `solid` بتنسيق أسكي، لأن ذلك قد يؤدي ببعض البرامج إلى الخلط بينه وبين ملف *ASCII STL*. ويلي الرأس عدد صحيح غير موقع (عدد صحيح (علوم حاسوب)) بطول 4 بايت وبترتيب البايتات الأصغر أولا يشير إلى عدد الأوجه المثلثية في الملف. وتتبع ذلك البيانات التي تصف كل مثلث على حدة، وينتهي الملف ببساطة بعد المثلث الأخير.

يوصف كل مثلث عبر 12 رقماً من أرقام الفاصلة العائمة بعرض 32 بت: 3 للمتجه العمودي (normal) ثم 3 لكل من إحداثيات X/Y/Z لكل رأس – تماماً كما هو الحال في إصدار أسكي من STL. ويلي ذلك عدد صحيح غير موقع بطول 2 بايت ("short") يمثل "عدد بايتات السمات" (attribute byte count) – وفي التنسيق القياسي، يجب أن يكون هذا الرقم صفراً لأن معظم البرامج لا تفهم أي شيء آخر.

تُمثَّل أرقام الفاصلة العائمة كأرقام فاصلة عائمة وفق معيار أي إي إي إي 754 ويُفترض أن تكون بترتيب البايتات الأصغر أولاً (ترتيب البايتات)، على الرغم من أن هذا لم يُذكر صراحة في الوثائق.

 UINT8[80]    – Header                 - 80 bytes
 UINT32       – Number of triangles    - 04 bytes
 foreach triangle                      - 50 bytes
     REAL32[3] – Normal vector         - 12 bytes
     REAL32[3] – Vertex 1              - 12 bytes
     REAL32[3] – Vertex 2              - 12 bytes
     REAL32[3] – Vertex 3              - 12 bytes
     UINT16    – Attribute byte count  - 02 bytes
 end

يوجد على الأقل نوعان من الاختلافات غير القياسية في تنسيق STL الثنائي لإضافة معلومات الألوان:

تستخدم الحزم البرمجية الكاميرا التصويرية (VisCAM) والعرض الصلب (SolidView) بايتات "عدد بايتات السمات" (attribute byte count) الاثنين في نهاية كل مثلث لتخزين لون النموذج اللوني أحمر أخضر أزرق بعرض 15 بت:
** البتات 0–4 هي مستوى كثافة اللون الأزرق (0–31).
** البتات 5–9 هي مستوى كثافة اللون الأخضر (0–31).
** البتات 10–14 هي مستوى كثافة اللون الأحمر (0–31).
** البت 15 يكون 1 إذا كان اللون صالحاً، أو 0 إذا كان اللون غير صالح (كما هو الحال في ملفات STL العادية).

يستخدم برنامج (Materialise Magics) الرأس (header) المكون من 80 بايتاً في بداية الملف لتمثيل اللون العام للجزء بأكمله. وفي حال استخدام اللون، يجب أن يتضمن الرأس في مكان ما سلسلة أسكي النصية COLOR= تليها أربعة بايتات تمثل الأحمر والأخضر والأزرق وتجميع ألفا (الشفافية) في نطاق 0–255. وهذا هو لون الجسم بأكمله، ما لم يتم تجاوزه عند كل وجه. كما يتعرف برنامج (Magics) أيضاً على وصف المادة؛ وهي خاصية أكثر تفصيلاً للسطح. فمباشرة بعد تحديد COLOR=RGBA، يجب أن توجد سلسلة ASCII أخرى هي ،المواد= تليها ثلاثة ألوان (3×4 بايت): الأول هو لون انعكاس عشوائي (الانعكاس المنتشر)، والثاني هو لون  (اللمعان المرآوي)، والثالث هو الضوء المحيط (ambient light). وتُفضل إعدادات المادة على إعدادات اللون. أما لون كل وجه فيُمثَّل في بايتي "عدد بايتات السمات" كما يلي:
** البتات 0–4 هي مستوى كثافة اللون الأحمر (0–31).
** البتات 5–9 هي مستوى كثافة اللون الأخضر (0–31).
** البتات 10–14 هي مستوى كثافة اللون الأزرق (0–31).
** البت 15 يكون 0 إذا كان لهذا الوجه لونه الفريد الخاص، أو 1 إذا كان سيتم استخدام لون الجسم العام.

ينعكس ترتيب الألوان الأحمر/الأخضر/الأزرق داخل هذين البايتين في هذين النهجين؛ لذا، ورغم أنه كان من السهل جعل هذه التنسيقات متوافقة، فإن عكس ترتيب الألوان يعني أنها ليست كذلك – والأسوأ من ذلك أن قارئ ملفات STL العام لا يمكنه التمييز بينهما تلقائياً. كما لا توجد طريقة لجعل الأوجه شفافة بشكل انتقائي لعدم وجود قيمة "ألفا" لكل وجه، رُغم أن هذا ليس مهماً في سياق آلات النمذجة السريعة الحالية.

### المتجه العمودي للوجه
يجب أن يكون ناظم سطح المتجه العمودي للوجه في كل من إصداري أسكي والثنائي من STL عبارة عن متجه وحدة يتجه نحو الخارج من الجسم الصلب. وفي معظم البرمجيات، يمكن ضبط هذا المتجه على القيمة (0,0,0)، حيث يقوم البرنامج تلقائياً بحساب المتجه العمودي بناءً على ترتيب رؤوس المثلث باستخدام قاعدة اليد اليمنى، أي تُدرج الرؤوس بترتيب عكس عقارب الساعة عند النظر إليها من الخارج.

وتقوم بعض أدوات تحميل ملفات STL بالتحقق من مطابقة المتجه العمودي الموجود في الملف مع المتجه الذي تحسبه باستخدام قاعدة اليد اليمنى، وتنبّه المستخدم في حال عدم التطابق. بينما قد تتجاهل برمجيات أخرى المتجه العمودي للوجه تماماً وتعتمد فقط على قاعدة اليد اليمنى. وبالرغم من ندرة تحديد متجه عمودي لا يمكن حسابه باستخدام قاعدة اليد اليمنى، إلا أنه ولضمان قابلية النقل الكاملة للملف، يجب أن يوفر الملف كلاً من المتجه العمودي للوجه وترتيب الرؤوس بشكل مناسب. ويُعد برنامج سوليد ووركس استثناءً ملحوظاً، حيث يستخدم المتجه العمودي لإضافة تأثيرات التظليل.

## انظر أيضا
* طباعة ثلاثية الأبعاد
* سوليد ووركس
* 3 دي سيستمز
* ستيريوليثغرافي

## المراجع