بسم الله الرحمن الرحيم
أقدم لكم هذا السكربت المتواضع الذي سنتعلم من خلاله بعض أساسيات الـ MAXScript
أقدم لكم هذا السكربت المتواضع الذي سنتعلم من خلاله بعض أساسيات الـ MAXScript
وظيفة هذا السكربت الخفيف كما رأيتم في الفيديو هو ربط جسمين من نوع Poly بالشكل:
* Pivot الجسم الأول مع نقطة محددة من الجسم الأب.
و الآن إلى التفاصيل:
الملاحظة الهامة جدا جدا: أنا مبتدأ ماكس و لست من محترفيه بأي مقياس و كذلك الأمر بالنسبة للـ MAXScript لكن للفائدة العامة أردت أن أشارككم بما تعلمته من خلال التجارب و الوقوع في الخطأ لعلنا بمشيئة الرحمن نتعلم ما ينفعنا.
ما هو الـ MAXScript ؟
حسب أوتوديسك:
MAXScript is the built-in scripting language of Autodesk® 3ds Max® and Autodesk® 3ds Max® Design
هو لغة سكربت مدمجة مع الماكس و الماكس ديزاين. - لن أدخل في التفاصيل لأننا في مثال صغير فقط
سنبدأ إنشاء هذا السكربت خطوة خطة مع شرح على الخفيف في البداية الصورة تشرح نفسها* Pivot الجسم الأول مع نقطة محددة من الجسم الأب.
و الآن إلى التفاصيل:
الملاحظة الهامة جدا جدا: أنا مبتدأ ماكس و لست من محترفيه بأي مقياس و كذلك الأمر بالنسبة للـ MAXScript لكن للفائدة العامة أردت أن أشارككم بما تعلمته من خلال التجارب و الوقوع في الخطأ لعلنا بمشيئة الرحمن نتعلم ما ينفعنا.
ما هو الـ MAXScript ؟
حسب أوتوديسك:
MAXScript is the built-in scripting language of Autodesk® 3ds Max® and Autodesk® 3ds Max® Design
هو لغة سكربت مدمجة مع الماكس و الماكس ديزاين. - لن أدخل في التفاصيل لأننا في مثال صغير فقط
و بما أننا نقوم نعمل سكربت جديد فنحتاج الخيار New Script فيظهر لنا هذا المحرر البسيط
و هنا بيت القصيد هنا سنكتب كل الشيفرات البرمجية إذا صح التعبير و سنبدأها بالتعليمة الأولى و نرى نتيجتها و هي
NewRolloutFloater
يقوم هذا الأمر بعنل نافذة مرئية للسكربت الخاص بك حيث ستضع عليه أدوات التحكم المطلوبة من أزرار و ما شابه من أدوات
ملاحظة ليس من الضروري أن يكون للسكربت واجهة مرئية حيث يمكنك كتابة الأوامر التي تريد تنفيذها و عمل run script فحسب ليقوم ماكس بتنفيذها, لكن في مثالنا هذا سنعتمد طريقة الـ GUI إذا صح التعبير Graphical User Interface أي واجهة المستخدم الصورية و هو تعبير خاطئ هنا لأن تعبير GUI يستخدم في لغات البرمجة و ليس في السكربتات حيث يستخدم تعبير CUI و بصرحة لا أعرف إن كان هذا صحيحا أم لا و السطور السابقة هي مجرد كلام أكاديمي نصف ثقافي غير مرتبط نوويا مع الشحنة الكهرومغناطيسية لذرة الكربون المرتبطة بنواة هيدروجين معلب مع دجاج ساديا !!
الشكل العام للأمر هو
ملاحظة ليس من الضروري أن يكون للسكربت واجهة مرئية حيث يمكنك كتابة الأوامر التي تريد تنفيذها و عمل run script فحسب ليقوم ماكس بتنفيذها, لكن في مثالنا هذا سنعتمد طريقة الـ GUI إذا صح التعبير Graphical User Interface أي واجهة المستخدم الصورية و هو تعبير خاطئ هنا لأن تعبير GUI يستخدم في لغات البرمجة و ليس في السكربتات حيث يستخدم تعبير CUI و بصرحة لا أعرف إن كان هذا صحيحا أم لا و السطور السابقة هي مجرد كلام أكاديمي نصف ثقافي غير مرتبط نوويا مع الشحنة الكهرومغناطيسية لذرة الكربون المرتبطة بنواة هيدروجين معلب مع دجاج ساديا !!
الشكل العام للأمر هو
newRolloutFloater <title_string> <width_integer> <height_integer> [<top_integer> <left_integer>]
حيث:
string = محارف نصية
integer = رقم
المثل التالي سيقوم بإنشاء نافذة كما في التالي:
نكتب السطر التالي في محرر السكربت الذي فتحناه سابقا
نكتب السطر التالي في محرر السكربت الذي فتحناه سابقا
MainFloater = NewRolloutFloater "Link To Vertex" 250 450
ثم نختار tools --> Evalutae All
النتيجة هي
سيتم إنشاء نافذة جديدة بالأبعاد التي اخترناها و بالعنوان الذي كتبناه
الآن سنضيف أول عنصر و هو من نوع Rollout يقوم هذا الأمر بإضافة الكائن من نوع Rollout إلى النافذة المنشأة سابقا
الشكل العام للسكربت
الآن سنضيف أول عنصر و هو من نوع Rollout يقوم هذا الأمر بإضافة الكائن من نوع Rollout إلى النافذة المنشأة سابقا
الشكل العام للسكربت
MainFloater = NewRolloutFloater "Link To Vertex" 250 450
Rollout new_roll "new rollout"
(
)
addRollout new_roll MainFloater
Rollout new_roll "new rollout"
(
)
addRollout new_roll MainFloater
و هذه هي النتيجة:
لاحظو أن اسم النافذة بالنسبة للسكربت هو MainFloater و اسم الرول بالنسبة للسكربت هو new_roll
و الأمر addRollout يضيف العنصر الذي كتبناه و هو new_roll ضمن السكربت إلى النافذة التي اسمها MainFloater
حيث الأمر هو: addRollout new_roll MainFloater
الآن سننشأ العناصر الرئيسية للسكربت كالتالي:
و الأمر addRollout يضيف العنصر الذي كتبناه و هو new_roll ضمن السكربت إلى النافذة التي اسمها MainFloater
حيث الأمر هو: addRollout new_roll MainFloater
الآن سننشأ العناصر الرئيسية للسكربت كالتالي:
MainFloater = NewRolloutFloater "Link To Vertex" 180 450
Rollout Vert_Linker "Vertex Linker" (
group "Pick Vert" (
Button GetVert_Button "Get Selected Vert" enabledff
Label vertnumL "Vertex No is: "
)
group "Pick Child" (
PickButton GetChild_PB "Get Child" enabledff
Label getChildL "Current Child is:"
Label getChildn ""
)
group "Pick Parent" (
PickButton GetPrent_PB "Get Parent"
Label getParentL "Current Parent is:"
Label getParentn ""
)
group "Link ME Plz!" (
Button LinkME_Button "Link ME!" enabledff
Label gettest ""
)
-----------------------------------------------------------------------------
)
addRollout Vert_Linker MainFloater
Rollout Vert_info "About Scripet" (
Label info "MaxForums.net"
)
addRollout Vert_info MainFloater
Rollout Vert_Linker "Vertex Linker" (
group "Pick Vert" (
Button GetVert_Button "Get Selected Vert" enabledff
Label vertnumL "Vertex No is: "
)
group "Pick Child" (
PickButton GetChild_PB "Get Child" enabledff
Label getChildL "Current Child is:"
Label getChildn ""
)
group "Pick Parent" (
PickButton GetPrent_PB "Get Parent"
Label getParentL "Current Parent is:"
Label getParentn ""
)
group "Link ME Plz!" (
Button LinkME_Button "Link ME!" enabledff
Label gettest ""
)
-----------------------------------------------------------------------------
)
addRollout Vert_Linker MainFloater
Rollout Vert_info "About Scripet" (
Label info "MaxForums.net"
)
addRollout Vert_info MainFloater
تعتبر الشحطة المزدوجة (--) فاصل ملاحظات يتجاهلها السكربت يمكنك كتابة ما ترغب فيه على يمينها من ملاحظات قد تفيدك في قراءة السكربت
النتيجة هي نافذة مليئة بالأزرار و العناصر الغير فعالة و التي ليس لها وظيفة بعد
بعض الشرح للسطور
group: اي مجموعة حيث يمكنك تجميع مجموعة من الأزرار و اليبلات و ما شابه من عناصر التحكم ضمن مجموعة
Button الزر القياسي
Label ليبل و هو عنصر يظهر نصوص.
Button GetVert_Button "Get Selected Vert" enabledffgroup: اي مجموعة حيث يمكنك تجميع مجموعة من الأزرار و اليبلات و ما شابه من عناصر التحكم ضمن مجموعة
Button الزر القياسي
Label ليبل و هو عنصر يظهر نصوص.
معنى هذا السطر أنه سيتم إنشاء عنصر زر باسم GetVert_Button و بعنوان ظاهر هو Get Selected Vert و بخاصية enabled غير مفعلة.
Label vertnumL "Vertex No is: "معنى هذا السطر أنه سيتم إنشاء عنصر ليبل باسم vertnumL يحتوي النص الظاهر Vertex No is:
الآن إلى بعض التطبيق يعني هون بلش الجد نوعا ما !!!!
الفكرة هي كالتالي كما أشرت في بداة الشرح أن العمل سيطبق على جسمين من نوع poly أرجو أن لا تنسو ذلك
الشكل العام لنافذة السكربت مؤلف من أزرار مفعلة و اخرى غير مفعلى لغرض مخصص و بعض الليبلات التي تشير إلى وضع العملية الحالية:
أول زر فعال هو Get Parent و تحته عدد 2 ليبل الأول ظاهر عبارة عن عنوان فقط و الثاني سيتم إضافة قيمة النص له عند حدث معين (أهم شي بعالم البرمجة و السكربتات هو الحدث).
وظيفة الزر هي اختيار العنصر الأب الذي سنختار منه لاحقا نقطة vertex أساسية للارتباط ما نريده هو عند اتمام اختيار العنصر الأب عن طريق هذا الزر أن يطلق مجموعة من الأحداث هي:
تغيير الليبل الذي يقع تحته ليشير إلى اسم العنصر المحددو أيضا تحديد العنصر ليتم فتح العنصر لاحقا على مستوى الـ vertex كما سنرى و من ثم تفعيل الزر المسمى Get Child الغير مفعل حاليا.
الزر Get Child كما نرى هو في حالة غير مفعل سيتم تفعيلة كما أشرنا سابقا وظيفة هذا الزر هي اختيار العنصر الإبن الذي سنربطه بالعنصر الأب عند اتمام وظيفة هذا الزر سيطلق الأحداث التالية
ستغير الليبل الذي تحته ليشير الى اسم العنصر الإبن المختار - سيتم تفعيل الزر Get Vertex الذي سنستخدمه بعد أن ندخل إلى مستوى vertex الفرعي من العنصر الأب و اختيار الـ vertex التي نريدها أن تكون أساس الارتباط.
أول امر سنعمله هو التالي:
الآن إلى بعض التطبيق يعني هون بلش الجد نوعا ما !!!!
الفكرة هي كالتالي كما أشرت في بداة الشرح أن العمل سيطبق على جسمين من نوع poly أرجو أن لا تنسو ذلك
الشكل العام لنافذة السكربت مؤلف من أزرار مفعلة و اخرى غير مفعلى لغرض مخصص و بعض الليبلات التي تشير إلى وضع العملية الحالية:
أول زر فعال هو Get Parent و تحته عدد 2 ليبل الأول ظاهر عبارة عن عنوان فقط و الثاني سيتم إضافة قيمة النص له عند حدث معين (أهم شي بعالم البرمجة و السكربتات هو الحدث).
وظيفة الزر هي اختيار العنصر الأب الذي سنختار منه لاحقا نقطة vertex أساسية للارتباط ما نريده هو عند اتمام اختيار العنصر الأب عن طريق هذا الزر أن يطلق مجموعة من الأحداث هي:
تغيير الليبل الذي يقع تحته ليشير إلى اسم العنصر المحددو أيضا تحديد العنصر ليتم فتح العنصر لاحقا على مستوى الـ vertex كما سنرى و من ثم تفعيل الزر المسمى Get Child الغير مفعل حاليا.
الزر Get Child كما نرى هو في حالة غير مفعل سيتم تفعيلة كما أشرنا سابقا وظيفة هذا الزر هي اختيار العنصر الإبن الذي سنربطه بالعنصر الأب عند اتمام وظيفة هذا الزر سيطلق الأحداث التالية
ستغير الليبل الذي تحته ليشير الى اسم العنصر الإبن المختار - سيتم تفعيل الزر Get Vertex الذي سنستخدمه بعد أن ندخل إلى مستوى vertex الفرعي من العنصر الأب و اختيار الـ vertex التي نريدها أن تكون أساس الارتباط.
أول امر سنعمله هو التالي:
on GetPrent_PB picked obj do (
global Parent_Obj = obj
ParentPicked = true
getParentn.text = Parent_Obj.name as string
if ParentPicked == true do GetVert_Button.enabled = on
if ParentPicked == true do GetChild_PB.enabled = on
if ParentPicked == true do select Parent_Obj
)
global Parent_Obj = obj
ParentPicked = true
getParentn.text = Parent_Obj.name as string
if ParentPicked == true do GetVert_Button.enabled = on
if ParentPicked == true do GetChild_PB.enabled = on
if ParentPicked == true do select Parent_Obj
)
ما معنى هذا الكلام؟
الحدث الأول هو النقر على الزر نفسه on GetPrent_PB picked obj do بعدها ستتم الأحداث التالية
سيتم الإعلان عن متغير عام من نوع global اسمه Parent_Obj و سييعبر هذا المتغير عن العنصر الأب المختار
الحدث هو global Parent_Obj = obj
اعلان فرعي مساعد ParentPicked = true يعلمنا أن عملية الختيار تمت و سنستعمله لإجراء الأحداث التالية.
تغيير قيمة النص لليبل كما ذكرنا سابقا إلى اسم العنصر المختار getParentn.text = Parent_Obj.name as string
أحداث تفعيل الأزرار بشكل شرطي
الحدث الأول هو النقر على الزر نفسه on GetPrent_PB picked obj do بعدها ستتم الأحداث التالية
سيتم الإعلان عن متغير عام من نوع global اسمه Parent_Obj و سييعبر هذا المتغير عن العنصر الأب المختار
الحدث هو global Parent_Obj = obj
اعلان فرعي مساعد ParentPicked = true يعلمنا أن عملية الختيار تمت و سنستعمله لإجراء الأحداث التالية.
تغيير قيمة النص لليبل كما ذكرنا سابقا إلى اسم العنصر المختار getParentn.text = Parent_Obj.name as string
أحداث تفعيل الأزرار بشكل شرطي
if ParentPicked == true do GetVert_Button.enabled = on
if ParentPicked == true do GetChild_PB.enabled = on
if ParentPicked == true do GetChild_PB.enabled = on
يمكن تحديد كلمة if و الضغط على مفتاح F1 للحصول على كافة المعلومات حولها و كيفية بناء الشرط.
حدث تحديد العنصر if ParentPicked == true do select Parent_Obj
وهكذا أكون قد أتممت شرح طريقة كتابة هذا السكربت بشكل مبسط جدا أرجو من الله أن تعم الفائدة
و السلام عليكم و رحمة الله و بركاته.
حدث تحديد العنصر if ParentPicked == true do select Parent_Obj
وهكذا أكون قد أتممت شرح طريقة كتابة هذا السكربت بشكل مبسط جدا أرجو من الله أن تعم الفائدة
و السلام عليكم و رحمة الله و بركاته.
ملاحظة الموضوع عرضة للتعديل لأنني أنهيت الموضوع و انا نصف نائم !!!!
العمل ب ماكس 2011
تعليق