آموزش MaxScript

s_mostafa_h

Well-Known Member
با سلام
من داخل فروم گشتم ، چیزی در باره آموزش مکس اسکریپت ندیدم ، از این رو با توجه اهمیت آن به تدریج این مبحث را که از CGaCADEMY ترجمه کردم در اینجا قرار می دهم . امیدوارم که بکار آید .
----------------------------------------------------------------------------------
آرایه :
آرایه مجموعه ای است از چند عنصر . خود عناصر می تواند یک آرایه باشد . عناصر آرایه داخل #() قرار می گیرند .
کد:
theArray = #("Ali" , 2.03 , pi ,$Teapot01,#(1,8) )

همانطوریکه می بینید ، عناصر آرایه از نام ali عدد 2.03 و عدد پی و شی قوری و یک آرایه دیگر تشکیل شده است . پس این آرایه که نام آنرا theArray نامیدیم ، دارای 5 عنصر می باشد که مثلا عنصر سوم آن عدد پی یا 3.14 است .
کد:
theArray[3]
خروجی به صورت ذیل است :
3.14

یا عنصر دوم آرایه از عنصر پنجم آرایه بالا برابر 8 می باشد . زیرا عنصر پنجم این آرایه #(1,8) می باشد .
کد:
theArray[5][2]
8

عناصر آرایه می تواند حاصل جمع چند تا عدد باشد و یا توان یک عدد .
کد:
Myarray=#("myname", 2 , 2+2^5)
خروجی این مقدار برابر :
کد:
#("myname", 2, 34)
در برنامه نویسی با اسکریپت و در جمع و ضرب و ... اعداد ، همیشه ضرب و تقسیم بر جمع و تفریق مقدم است . در نتیجه ابتدا عدد 2 به توان 5 رسیده و سپس با عدد 2 جمع می شود و حاصل عدد 34 بدست می آید .
رشته ها مانند اسامی در داخل یک آرایه باید داخل کوتیشن " " قرار بگیرد .
مکس اسکریپت در نام گذاری آرایه ها نسبت به حروف بزرگ و کوچک حساس نیست مثلا :
theArray = ThearraY
-چند نکته :
در آرایه نویسی چند تابع وجود دارد به نامهای append = اضافه کردن عنصر به انتهای آرایه
FindItem برای پیدا کردن محتوای عنصر آرایه و بالاخره deleteItem برای حذف عنصر آرایه بکار می رود .
مثال :
کد:
myArray=#("Ali",5,pi,#("Hassan",5.5),9.9,false)
#("Ali", 5, 3.14159, #("Hassan", 5.5), 9.9, false)
append myArray 20
#("Ali", 5, 3.14159, #("Hassan", 5.5), 9.9, false, 20)
findItem myArray 9.9
5
deleteItem myArray 5
#("Ali", 5, 3.14159, #("Hassan", 5.5), false, 20)
------------------------------------------------------------------------------
با زدن دکمه F11 به محیط مکس اسکریپت وارد می شویم
ادامه دارد ..... :)
 

پیوست ها

  • 1.JPG
    1.JPG
    51.8 کیلوبایت · بازدیدها: 26
  • 2.JPG
    2.JPG
    44.1 کیلوبایت · بازدیدها: 25

s_mostafa_h

Well-Known Member
خواهش می کنم
و اما ادامه مطلب :
--------------------------------
مانند بیشتر برنامه های شی گرا ، مکس اسکریپت دارای ساختار های تکرار است که در این مورد باید به حلقه ها در زبان مکس اسکریپت اشاره بکنیم :
یکی از حلقه های تکرار در این زبان for ..... in ..... do می باشد :
For indexname in ArrayName do print indexname
ArrayName = نام آرایه ،،،، indexname = نام ایندکس که در اینجا از اول حرف index استفاده شده است .

کد:
[LEFT]myarray=#(5,9,"ali",120,125.14)
[COLOR="blue"] #(5, 9, "ali", 120, 125.14) [/COLOR]
for i in myarray do print i
[COLOR="blue"]5
9
"ali"
120
125.14[/COLOR]
[COLOR="Blue"]OK[/COLOR][/LEFT]
می توانیم متغیری تعریف کنیم و به آن مقدار اولیه داده و سر انجام این مقدار را بعد از بکار گیری حلقه در انتها محاسبه کنیم :
مثال :
کد:
[LEFT]myArray=#(1,254,985,3)
[COLOR="blue"] (1, 254, 985, 3)#[/COLOR]
mysum=5
[COLOR="blue"]5[/COLOR]
for i in myArray do mysum=mysum+i
[COLOR="blue"]OK[/COLOR]
mysum
[COLOR="blue"]1248[/COLOR][/LEFT]
می توانیم در جریان تعریف حلقه شرط برای آن تعریف نماییم :
مثال :
کد:
[LEFT]for i in myarray where i>100 do print i
[COLOR="blue"]254
985[/COLOR]
[COLOR="Blue"]OK[/COLOR][/LEFT]

همانطوریکه در این جا ملاحظه کردید ، بعد از in از شرط حلقه Where i>100 استفاده کردیم . بنابراین می توانیم در جریان حلقه ، از گزینه های شرطی هم استفاده کرد .
نکته 1 :
دراکثر زبان ها برنامه نویسی علایمی وجود دارد که جهت توضیح کد نوشته شده بکار می رود . این علایم نمادی است که به کمپایلر یا مترجم می گوید که این خط از کد را ندیده بگیرد . در مکس اسکریپت از علامت -- برای comment یا توضیحات استفاده می شود :
مثال :
کد:
[LEFT]1+2+3  -- this is a example for showing the comment in this language
[COLOR="Blue"]6[/COLOR][/LEFT]
نکته 2 :
می توانیم کد برای برنامه را در یک خط بنویسیم ، مشروط بر آنکه بعد از ان از ; یا سمی کالمن یا semicolumn استفاده نماییم :
مثال :

کد:
[LEFT]1+2 ; 25+36 ; 22+3
[COLOR="Blue"]3
61
25[/COLOR][/LEFT]
نکته 3 :
برای اجرای هر کد درانتها از کلید enter استفاده نمایید .

توجه : نوشته آبی رنگ در کد برنامه بیانگر این است که کامپایلر برنامه را درست ترجمه کرده است ( پاسخ کد بعد از هر بار enter زدن

ادامه دارد .....:)
 
آخرین ویرایش:

pythoN

Active Member
کارات فوق العادس و یه کار جدید .
چون کسی اینکارو انجام نمیده .
حتما ادامه بده
 

s_mostafa_h

Well-Known Member
امیدوارم که بدرد بخورد . بگذریم .....
------
بجای do print میتوانیم از collect استفاده کنیم در نتیجه ، خروجی به صورت یک آرایه در یک سطر یا ردیف نوشته می شود . برای طول حلقه می توانیم یک متغییر بدان نسبت دهیم . در نتیجه کافی است نام متغییر در برنامه ذکر گردد و کد اجرا می شود .
مثال :
کد:
[LEFT]myArray=#(1,254,985,3)
[COLOR="Blue"]#(1, 254, 985, 3)[/COLOR]
for I in myarray where i>100 [COLOR="darkred"]collect [/COLOR]i
[COLOR="blue"]#(254, 985)[/COLOR]
filteredArray=for I in myarray where i>100 collect i
[COLOR="blue"]#(254, 985)[/COLOR]
filteredArray
[COLOR="blue"]#(254, 985)[/COLOR][/LEFT]

هدف تعریف متغییر برای طول کد بالا ، ساده کردن کار است و در برنامه بجای استفاده از کل کد که ممکن است مجددا قابل استفاده باشد ، کافی است نام همان متغییر را بکار ببریم .
در اینجا قدری در باره متغییر ها صحبت می کنیم :
تعریف متغییر در زبان مکس اسکریپت :
بقیه مطالب در ساعت 30/9 شب بعد از خبر سراسری ، فعلا باید بریم نون بخریم ....:lol:
 

s_mostafa_h

Well-Known Member
در اینجا قدری در باره متغییر ها صحبت می کنیم :
تعریف متغییر در زبان مکس اسکریپت :
قبل ازاین که این مبحث را شروع کنیم ، لازم است راجع طریقه کد نویسی نکاتی را متذکر شویم .
فرض کنیم مقدار ذیل را در کد بنویسیم و حاصل آنرا بدست آوریم :
b+c
-- No ""+"" function for undefined
همانطوریکه ملاحظه می شود ، برای کمپایلر b و c ناشناحته است ، در نتیجه نمی تواند آنها را با عملگر + جمع بزند . برای این کار باید b و c به اصطلاح initialize یا در ابتدا مقدار دهی شوند ، در غیر این صورت b و c تعریف نشده باقی می مانند .
توضیح : عملگر ها یا operator ها نماد هایی هستند که اعمال خاصی را انجام می دهند . مانند ضرب ، تقسیم ، جمع و منها و عملگرهای منطقی و ... .
بدیهی است که عملگر ها بر روی یک یا دو مقدار عمل می کنند . این مقادیر را عملوند یا Operand می نامند . در مثال بالا b و c عملوند های عملگر + می باشند .

کد:
[LEFT]12+252+9*25+54
[COLOR="Blue"]543[/COLOR][/LEFT]
این کد را به صورت های مختلف می نویسیم :
کد:
[LEFT]12+252+
9*25+54
[COLOR="blue"]543[/COLOR][/LEFT]
برای اینکه یک عملیات از کد را مانند فوق در چند خط بنویسیم یا باید انتهای کد به عملگر ختم شود و یا از BackSlash یا \ استفاده می کنیم .

کد:
[LEFT]12+252\
+9*25+54
[COLOR="blue"]543[/COLOR][/LEFT]
تذکر : هیچگاه در ابتدای سطر از عملگر نباید استفاده کرد مگر به روش بالا .

همانطوریکه گفتیم ، کلمات مثل Ali ، a ، hassan و غیره در ابتدا باید تعریف شوند ، در غیر اینصئرت چنانچه بخواهیم به عنوان یک رشته کراکتر به کمپایلر بشناسانیم ، باید آنها را داخل کوتیشن یا " " قرار دهیم :
"Ali"+"Hassan"
"AliHassan"
یا
"a"+"b"
"ab"
اگر به تنهایی بنویسیم :
A
undefined
خروجی یک عبارت تعریف نشده است undefined .
در مکس اسکریپت متغییر چنین تعریف می شود :
کد:
[LEFT][SIZE="6"][COLOR="Purple"]variable_name = variable_value[/COLOR][/SIZE]
[COLOR="DarkRed"]مقدار متغییر = نام متغییر[/COLOR][/LEFT]
نامگذاری متغییر از قانون نام گذاری متغییر ها ، فولدر ها و ... تبعیت می کند . و مانند زبان C++ , CS ، نام ابتدای متغییر نمی تواند با عدد شروع شود ، اما میتوان از زیر خط یا underscore در ابتدای نام متغییر استفاده کرد :
کد:
[LEFT]2p=21
[COLOR="Red"]-- Compile error: Bad number or time syntax 
--  In line: 2p=[/COLOR]

myvariable=12
[COLOR="Blue"]12[/COLOR][/LEFT]
دراینجا 2p نمی تواند به عنوان نام متغییر باشد چون ابتدای نام با عدد شروع شده است .
مقدار متغییر بستگی به نوع کار ما می تواند یک عبارت منطقی ، رشته و ... باشد .
کد:
[LEFT]mytest="I want to test this text in MaxScript "
"[COLOR="blue"]I want to test this text in MaxScript "[/COLOR][/LEFT]
نکته مهم :
همانطوریکه می بینید مقدار mytest برابر I want to test this text in MaxScript است . تا زمانیکه این مقدار را در طول کد نویسی تغییر ندادیم ، این مقدار همان است که در ابتدا initialize کردیم یا به آن مقدار اولیه دادیم .
کد:
[LEFT]mytest="I want to test this text in MaxScript "
[COLOR="blue"]"I want to test this text in MaxScript "[/COLOR]
anothertest="I test this senteces for second"
[COLOR="blue"]"I test this senteces for second"[/COLOR]
mytest
[COLOR="blue"]"I want to test this text in MaxScript "[/COLOR][/LEFT]
تا فردا ....:D
 

s_mostafa_h

Well-Known Member
با سلام مجدد ...
و اما ادامه مطلب ...
می توانیم متغییر ها را که از یک جنس اند با هم ترکیب کنیم :

کد:
[LEFT]one="MaxScript "; Two = " is fun !"
[COLOR="Blue"]"MaxScript "
" is fun !"[/COLOR]
one + two
"[COLOR="blue"]MaxScript  is fun [/COLOR]!"[/LEFT]
نکته :
مکس اسکریپت می تواند اغلب توابع ریاضی مانند sin , cos , tan , cotan , log و ... را محاسبه نماید .

کد:
[LEFT]tan 25
[COLOR="blue"]0.466308[/COLOR]
log 23
[COLOR="blue"]3.13549[/COLOR][/LEFT]
اما بین این توابع دو تابع پرکاربرد در مکس وجود دارد به نام random و incrementing .
تابع random به طور تصادفی بین دو مقدار از مقادیر متغییر را نتخاب می کند :
کد:
[LEFT]random 5 56
[COLOR="blue"]28[/COLOR][/LEFT]
می توانیم اعداد را به یک متغییر نسبت دهیم :

کد:
[LEFT]x=5;y=100
[COLOR="blue"]5
100[/COLOR]
random x y
[COLOR="blue"]82[/COLOR][/LEFT]
در این جا یادآوری کنیم که خاصیت مهم تابع random در این است که هر بار مکس اسکریپت اجرا می گردد ، مقدار random هم به طور تصادفی تغییر می کند ( بعد از اجرای مجدد نرم افزار ) .

توابع افزایشی و کاهشی
ماندد زبان C ++ یا CS ، در این جا هم می توان از خاصیت افزایشی و کاهشی در محاسبات استفاده نمود :
بجای اینکه بنویسیم
x=x+1
می نویسیم
X+=1
برای سایر عملگر ها هم می نویسیم :
y * = 5 یا y=y*5 دراین جا مقدار y که مقدار دهی اولیه شده بود ، مجددا با عدد 5 ضرب شده و در نهایت مقادر حاصل در داخل مقدار y قرار داده می شود :

کد:
[LEFT][COLOR="Red"]-- i wanto to initialize the value of y[/COLOR]
y=5;
[COLOR="Blue"]5[/COLOR]
y+=8
[COLOR="blue"]13[/COLOR][/LEFT]

ایجاد شی در نما با مکس اسکریپت :

در اینجا می توان بدون استفاده از ابزار گرافیکی ، تنها با نوشتن کد های ساده ، به تولید اشیاد بپردازیم :
مثلا برای ایجاد یک box کافی است بنویسیم :
:)که با زدن Enter کد ذیل تولید می شود :
$Box:Box01 @ [0.000000,0.000000,0.000000]
در واقع وقتی می نویسیم
box()
در واقع هیچ پارامتری را مبنی بر مکان دقیق شی و اندازه شی ارسال نکرده ایم در نتیجه سیستم به خودکار مقدار پیش فرض را برای تولید شی درست در مرکز مختصات که همانا 0 , 0 , 0 باشد ، ایجاد می کند .
ضمنا می توانیم برای تولید شی یک متغییر هم بدان نسبت دهیم :

کد:
[LEFT]mybox=box()
$Box:Box01 @[COLOR="blue"] [0.000000,0.000000,0.000000[/COLOR]][/LEFT]
 

s_mostafa_h

Well-Known Member
در واقع وقتی می نویسیم
کد:
[LEFT] box()[/LEFT]

در واقع هیچ پارامتری را مبنی بر مکان دقیق شی و اندازه شی ارسال نکرده ایم ، یعنی داخل پرانتز هیچ آگومانی را انتقال ندادیم ، در نتیجه سیستم به خودکار مقدار پیش فرض را برای تولید شی درست در مرکز مختصات که همانا 0 , 0 , 0 باشد ، ایجاد می کند .
ضمنا می توانیم برای تولید شی یک متغییر هم بدان نسبت دهیم :

کد:
[LEFT]mybox=box()
[COLOR="Blue"]$Box:Box01 @ [0.000000,0.000000,0.000000][/LEFT]
[/COLOR]
mybox متغیر تولید شیء box است .

حال توضیحی در باره شی تولید شده :
$ در ابتدای شی Box ، در واقع یک مسیری برای تولید یک شی و شبیه مسیر فایل در ویندوز است مانند c:\3dsmax\examples\file.max ، منتها این مسیر نام یک نوع سلسله مراتبی می باشد که به تولید شی ء ختم میشود . در واقع می خواهیم بگوییم که ما داریم یک شی ای را از نوع box ایجاد می کنیم .
Box01 نام شی تولید شده می باشد . مقادیر داخل کروشه هم مختصات سه بعدی شی را در نمای perspective مشخص می کند .
نکته : بسته یه نوع شی ای که داریم تولید می کنیم ، با تعریف متغیر برای آن شی ، به راحتی می توانیم به خواص شی دسترسی داشته و آنرا تغییر بدهیم . در واقع استفاده از متغییر برای مدیریت بر خواص شی می باشد .
خوب دراینجا می خواهیم نام شی را تغییر بدهیم . بدیهی است با داشتن نام متغییر برای شی به راحتی این کار امکان پذیر می باشد :
نکته بسیار مهم : برای دسترسی به خواص یا property شی باید از " . " یا نقطه استفاده کنیم . چون نام شی یک رشته است بنابراین باید نام شی هم در داخل کوتیشن قرار بگیرد .
کد:
[LEFT]mybox.name="horse"
[COLOR="blue"]"horse"[/COLOR]
mybox
[COLOR="blue"]$Box:horse @ [0.000000,0.000000,0.000000][/LEFT]
[/COLOR]
می دانیم بعضی از اشیا داری طول (length )، عرض (width )، ارتفاع ( height ) هستند ، مانند خود همین box . همچنین دارای موقعیت مکانی ( position ) و چرخش و رنگ و ... می باشند . برای هر یک مثالی در این باره می زنیم :
برای تغییر موقیعیت مکانی از کلمه از خاصیت pos استفاده می شود .
کد:
[LEFT]mybox.pos=[1,2,3]
[COLOR="blue"][1,2,3][/COLOR]
mybox
[COLOR="blue"]$Box:horse @ [1.000000,2.000000,3.000000][/LEFT]
[/COLOR]
برای تغییر رنگ از خاصیت wirecolor استفاده می شود .
ضمنا توجه داشته که محدوده رنگ RGB بین صفر تا 255 می باشد .
کد:
[LEFT]mybox.wirecolor=yellow
[COLOR="blue"](color 255 255 0)[/COLOR]
mybox.wirecolor= (color 244 231 12)
[COLOR="blue"](color 244 231 12[/LEFT]
[/COLOR]
Box داری طول ، عرض و ارتفاع می باشد . برای تغییر آنها از خاصیت Scale استفاده می شود .
کد:
[LEFT]mybox.scale=[30 , 25 , 120 ]
[COLOR="blue"][30,25,120][/COLOR]
mybox.scale=[30 , 25 , 10 ]
[COLOR="blue"][30,25,10][/COLOR]
mybox.scale=[1 , 1 , 23 ]
[COLOR="blue"][1,1,23][/LEFT]
[/COLOR]
 

s_mostafa_h

Well-Known Member
و اما ادامه ماجرا ........

Box داری طول ، عرض و ارتفاع می باشد . برای تغییر آنها از خاصیت Scale استفاده می شود .
mybox.scale=[30 , 25 , 120 ]
[30,25,120]
mybox.scale=[30 , 25 , 10 ]
[30,25,10]
mybox.scale=[1 , 1 , 23 ]
[1,1,23]
اگر به نمای پرسپکتیو بروید ، از نظر ظاهری شکل جسم تغییر کرده ولی تغییری را در مقدار height و width , length در پنل مودیفای ایجاد نمی کند . در صورتیکه می توان با خاصیت height مستقیما این پارامتر را در پنل مودیفای با این کد تغییر داد :
mybox.height = 40
دلیل این امر اینست که پارامتر های height و ... مربوط به ایجاد شی یا create ان می باشد در صورتیکه خاصیت Scale مربوط به تولید یک شی یا create آن نمی باشد . به این خاطر مقادیر height , width و length را تغییر نمی دهد . در عین حال چنانچه بخواهیم مقادیر پارامتر های مزبور را نگه داشته باشیم ، باید از خاصیت scale برای تغییر اندازه شی استفاده کنیم .
با این حال هر دو متد از نظر ظاهری یر شی یکسان بوده و اندازه شی را تغییر می دهند .

نشان دادن کلاس ها و پارامترها و خواص شی با استفاده از توابع

تابعی وجود دارد به نام showclass که پارامترهای شی را نشان میدهد :
کد:
[LEFT]showclass "box"
[COLOR="blue"]Box : GeometryClass {10,0}
OK[/COLOR][/LEFT]
اگرا می خواهیم به تمام پارامترهای شی دسترسی داشته باشیم از کرکتر عمومی * استفاده می کنیم :
کد:
[LEFT]showclass "box.*"
[COLOR="blue"]Box : GeometryClass {10,0}
  .height : float
  .length : float
  .lengthsegs : integer
  .width : float
  .widthsegs : integer
  .mapcoords : boolean
  .heightsegs : integer
OK[/COLOR][/LEFT]
و اگر بخواهیم پارامتر های گیزمو را هم نشان دهد به صورت ذیل عمل می کنیم :
کد:
[LEFT]showclass "box*.*"
[COLOR="Blue"]Box : GeometryClass {10,0}
  .height : float
  .length : float
  .lengthsegs : integer
  .width : float
  .widthsegs : integer
  .mapcoords : boolean
  .heightsegs : integer
BoxGizmo : helper {3bc31904,67d74ec9}
  .height : float
  .length : float
  .width : float
  .seed : integer
OK[/COLOR][/LEFT]
از تابع showproperties برای نشان دادن خواص اشیا بکار می رود :
کد:
[LEFT]showproperties mybox
 [COLOR="blue"] .height : float
  .length : float
  .lengthsegs : integer
  .width : float
  .widthsegs : integer
  .mapcoords : boolean
  .heightsegs : integer
  .realWorldMapSize : boolean
false[/COLOR][/LEFT]
حرکت دادن و موقعیت شی :
برای حرکت دادن شی از خاصیت move استفاده می شود .
توجه به ان نکته بسیار مهم است که از خاصیت move استفاده می کنید معنی اش این نیست که شی را در یک موقعیت مکانی انتقال دادید بلکه معنی آن اینس که شی را به اندازه چند واحد از نقطه قبلی تغییر مکان دادید یا آنرا به اصطلا هل دادید . این با خاصی مکانی pos کاملا فرق دارد . مثال می زنیم :
وقتی که شما برای سه بار تایپ می کنید :
کد:
[LEFT]mybox.pos=[20,2,2]
[COLOR="blue"][20,2,2][/COLOR]
mybox.pos=[20,2,2]
[COLOR="blue"][20,2,2][/COLOR]
mybox.pos=[20,2,2]
[COLOR="blue"][20,2,2][/COLOR][/LEFT]
در این حالت موقعیت مکانی شی تنها در مرحله اول ( اگر نقطه اولی با موقعیت مکانی اولیه تفاوت داشت مثلا موقعیت مکانی اولیه 0 و 0 و 0 بود ) تغییر می کند و در بقیه مراحل چون مختصات نقطه تغییر نکرد ، شی در همان نطقه اول که مقدار آن 20,2,2 بود باقی می ماند .
ولی در مورد move چنین نخواهد بود . شی در هر مرحله نسبت به مرحله قبلی به اندازه مقدار داده شده تغییر مکان می دهد . مثلا 20 واحد در جهت مختصات x و مجددا 20 واحد در جهت x و ...
این طبیعی است چون شی را تغییر مکان دادیم و نگفتیم موقعیت مکانی شی دارای این مختصات است .
کد:
[LEFT]move mybox [20,2,2]
[COLOR="blue"]OK[/COLOR]
move mybox [20,2,2]
[COLOR="blue"]OK[/COLOR]
move mybox [20,2,2]
[COLOR="blue"]OK[/COLOR][/LEFT]
همین قضیه برای scale هم مانند pos صدق می کند .

برای چرخش از خاصیت rotation استفاده می کنیم . دراین حالت ابتدا یک متغییر برای چرخش زاویه تنعریف می کنیم :
تعریف آن بدین صورت است :

eulerangles x y z= نام متغییر برای چرخش
و دراینجا :
کد:
[LEFT]myrotation = eulerangles 20 2 3
(eulerAngles 20 2 3)
rotate mybox myrotation
[COLOR="blue"]OK[/COLOR][/LEFT]
در ایجا هم مانند move با هر بار اجرای دستور بالا شی مجددا به میزان 3 2 20 در جهت محور های داده شده x y z می چرخد .

برای تغییر سایر پارامتر های box مانند تغییر سگمنت های آن می توانیم بنویسیم :
mybox.lengthsegs = 10
mybox.widthsegs = 10
mybox.heightsegs = 10
mybox.mapCoords = true​

اضافه کردن مودیفایر :
با دستور addmodifier به نام متغییر شی می توانیم به راحتی یک مودیفایر به آن اضافه کنیم :
کد:
[LEFT]addModifier mybox (twist angle:50 twist axis:0)
[COLOR="blue"]OK[/COLOR][/LEFT]
برای محور x مقدار 0 و برای محور y مقدار 1 و برای محور z مقدار 2 در نظر گرفته می شود .
یک مثال برای انیمشن کردن box :

برای انیمیشن کردن box به روش ذیل عمل می کنیم :

کد:
[LEFT]animate on
(
at time 0 (mybox.pos = [-100, 0, 0]; mybox.scale = [1, 1, 0.25])

at time 100 (mybox.pos = [100, 0, 0]; mybox.scale = [1, 1, 3])
)
[COLOR="blue"][1,1,3][/COLOR][/LEFT]

همانطوریکه می بینید در زمان صفر و 100 موقیعیت مکانی متفاوتی برای شی تعریف شده است . همچنین از نظر اندازه .
انیمیشن را یک بار اجرا کنید . میبینید که شی هم حرکت کرده و هم تغییر اندازه می دهد .
مروری دیگر بر حلقه ها :
در اینجا می خواهیم کپی کردن box را درون یک حلقه بررسی کنیم .
دراینجا مقدار ایندکس مقدار دهی اولیه شده و آنرا تا عدد 5 ارتقا داده سپس آن را درون یک بلاک قرار دادیم . بدیهی است این حلقه 5 بار وضعیت داخل بلاک را بررسی می کند و در هر بار یک کپی از box قبلی گرفته و آنرا در موقیت بعدی قرار می دهد .
کد:
[LEFT]for i=1 to 5 do
(
box_copy=copy mybox
box_copy.pos=[i*50,0,0]
)
[COLOR="Blue"]OK[/COLOR][/LEFT]
توجه داشته موقعیت قرار داده شده box های کپی شده به صورت ذیل است :

کد:
[LEFT]I=1 --> [50,0,0]
I=2 --> [100,0,0]
…[/LEFT]
انیمیشن را مجددا اجرا کنید .

ادامه دارد ...:D
 

s_mostafa_h

Well-Known Member
عملگر های منطقی :
شامل : == یا مساوی ، =! برابر نیست ، > کوچکتر ، >= کوچکتر یا مساوی و < بزرگتر و در نهایت =< بزگتر یا مساوی . توجه در هر حال مقدار خروجی true یا false است .
توجه داشته عملگر = یک عملگر انتصاب و عملگر == یک عملگر منطق یا Bolean است .
کد:
a=2
[COLOR="Blue"]2[/COLOR]
a>3
[COLOR="blue"]false[/COLOR]
درابتدا a مقدار دهی شده و در نهایت این مقدار با عدد 3 مقایسه شده است .

مثال دیگر :
کد:
if a>4 do "yes"
[COLOR="blue"]"yes"[/COLOR]
if a>4 then "yes" else "no"
[COLOR="blue"]"yes"[/COLOR]
تذکر : چنانچه بخواهیم از جمله else استفاده کنیم باید از then بعد از if استفاده نماییم در غیر اینصورت با خطا جمله شرطی مواجهه می شویم .

عملگر های and و or و not :
ترکیب چند جمله با and زمانی درست است که همه عبارت درست باشد .
ترکیب چند جمله با or زمانی درست نیست که همه عبارت نادرست باشد .
Not در واقع تمام عبارت درست را نادرست و و عبارات نادرست را درست نشان می دهد .
کد:
n=true
[COLOR="blue"]true[/COLOR]
not n
[COLOR="blue"]false[/COLOR]
ترکیب با and :
کد:
s=10
[COLOR="blue"]10[/COLOR]
if (s>= 5 and s<=10) then "print u are right " else " goodbye"
[COLOR="blue"]"print u are right "[/COLOR]

ادامه دارد ..... :)

if (s>5 and s<10) then "print u are right " else " goodbye"
[COLOR="blue"]" goodbye"[/COLOR]
جمله شرطی اول درست است به این دلیل که قسمت اول هر دو عبارت با ترکیب and درست است .
اما در عبارت دوم چون s<10 یک عبارت نادرست است ، در نتیجه قسمت اول عبارت که با and ترکیب شده است نادرست و در نتیجه قسمت دوم چاپ می شود .

ترکیب با or :
if (s>5 or s<10) then "print u are right " else " goodbye"
"print u are right "
if (s<5 or s>10) then "print u are right " else " goodbye"
" goodbye"

جمله شرطی اول درست است به این دلیل که حداقل یکی از دو عبارت قسمت اول درست است درنتیجه قسمت اول چاپ می شود .
اما در عبارت دوم چون s>10 و s<5 هر دو یک عبارت نادرست هستند ، در نتیجه قسمت اول عبارت که با or ترکیب شده است نادرست و در نتیجه قسمت دوم چاپ می شود .
استفاده از not :
کد:
if not(s<5 or s>10) then "print u are right " else " goodbye"
[COLOR="blue"]"print u are right "[/COLOR]
عبارت دوم چون s>10 و s<5 هر دو یک عبارت نادرست هستند ، در نتیجه قسمت اول عبارت که با or ترکیب شده است نادرست و نقیض آن ( not)درست و در نتیجه قسمت اول چاپ می شود .
---------------------------------
شناسایی اشیا ء یا objects
اشیا داخل صحنه با عبارت objects شناسایی می شوند :
فرض کنیم انواع اشیاء در داخل صحنه داشته باشیم از جمله box , torus , star , … و غیره . با تعریف یک متغییر از objects می توانیم به تمام اشیاء داخل صحنه دسترسی داشته باشیم :
myobject=objects
کد:
[COLOR="blue"]$objects
print myobject
$Box:Box01 @ [-2.848055,44.645119,0.000000]
$Sphere:Sphere01 @ [56.919224,6.659113,0.000000]
$Omni_Light:Omni01 @ [-58.615765,87.341423,-4.035535]
$Omni_Light:Omni02 @ [85.713806,38.082672,-58.857872]
$Omni_Light:Omni03 @ [5.573021,-26.796534,44.695435]
$Star:Star01 @ [-37.091457,-63.684269,0.000000]
$NGon:NGon01 @ [-33.312782,8.197544,0.000000]
$Point_Helper:Point01 @ [78.336555,-30.129704,0.000000]
$Dummy:Dummy01 @ [33.275238,162.508301,0.000000]
$Cone:Cone01 @ [-40.788826,-31.512627,3.447527]
OK[/COLOR]
همانطوریکه که می بینید ، تمام اشیاء داخل صحنه لیست شده اند . با این دستور هم می توانیم به اشیاء داخل صحنه دسترسی داشته باشیم :
کد:
[COLOR="Indigo"]For myobject in objects do print myobject[/COLOR]
برای دسترسی به geometry ها باید دستور geometry را صادر کنیم :

کد:
[COLOR="Blue"]for W in geometry do print W
$Box:Box01 @ [-2.848055,44.645119,0.000000]
$Sphere:Sphere01 @ [56.919224,6.659113,0.000000]
$Cone:Cone01 @ [-40.788826,-31.512627,3.447527]
OK[/COLOR]
ابتدا متغییری به نام W برای geometry تعریف و سپس دستور لیست کردن صادر شده است . همین طور هست برای helpers ها و ... .
کد:
for W in helpers do print W
[COLOR="blue"]$Point_Helper:Point01 @ [78.336555,-30.129704,0.000000]
$Dummy:Dummy01 @ [33.275238,162.508301,0.000000]
OK[/COLOR]
هرتغییر در صحنه ، مستقیما در لیست کردن اشیا در مکس اسکریپت تاثیر می گذارد . به عنوان مثال چناچه چند شی را انتخاب کرده باشیم و بخواهیم این اشیا انتخاب شده را به ما نشان دهد می توانیم بنویسیم :
کد:
s= selection
[COLOR="blue"]$selection[/COLOR]
for rec in s do print rec
[COLOR="blue"]$Box:Box01 @ [-2.848055,44.645119,0.000000]
$Sphere:Sphere01 @ [56.919224,6.659113,0.000000]
OK[/COLOR]
ابتدا متغییری برای selection به نام s تعریف و ...
کد:
for s in selection do print s
[COLOR="blue"]$Box:Box01 @ [-2.848055,44.645119,0.000000]
$Sphere:Sphere01 @ [56.919224,6.659113,0.000000]
OK[/COLOR]

چنانچه بخواهیم تعدا اشیای انتخابی نشان دهیم از خاصیت count استفاده می شود :
selection.count
2

چنانچه بخواهیم تعدادی از اشیاء داخل صحنه را انتخاب کنیم می توانیم بنویسیم :
select $box01

OK
دراینجا فقط box با نام box01 را انتخاب می کند .
select $box01
OK

select $box02​
-- No ""select"" function for undefined​

select $box*
OK
select geometry
OK
خط سوم می گوید که چنین شی ای را نداریم و خط بعدی تمام box های داخل صحنه و در نهایت آخرین خط تمام geometry های داخل صحنه را انتخاب می کند .
 

shirani

مدیر انجمن <A href="http://forum.majidonline.com/f
من چون میخوام تو این مبحث مشترک بشم این پست می دم (Sorry )
 

s_mostafa_h

Well-Known Member
با سلام
ضمن تشکر ، از اینکه قصد دارید دراین مبحث و در آموزش آن همکاری داشته باشید . از آن جا که برای این کار از قبل برنامه ریزی کرده ام ، فقط یک خواهش دارم که چنانچه بخواهید همکاری را در این بخش ادامه دهید بر اساس رویه و مباحث ذیل به ترتیب این بخش ها که در ذیل خواهد آمد ، این مبحث را با همکاری شما و هر دوست دیگری که بخواهد در این بخش همکاری نماید به پیش ببریم . بخش مکس اسکریپت به خصوص مباحث اولیه آن بسیار با اهمیت است . حال بخش های آن :
...
رفرنس : CG Acadmy

کد:
filtering object sets
working with general Node properties
Filtering By Mesh Properties
Mass-Changing Properties
Randomizing Properties , Renaming Nodes
Attack of The Instanced Clone
Working With Modifier
Working With Animation Key
Working With Material
Saving Objects
Vector : The Basic
3 Dimensional Vector
Unit Vector
Trigonometry and Vector Operations
Barycentric Coordinate
Ray Intersection
The Matrix: Expalined
Vectors and Matrix 3 Values
Sub-Object Transformation
Camera and ...
A basic Rendering Pipeline
Implementing Textures
Phong and Blinn Highlights
RayTrace ....
این بخش آموزشی باید با حوصله نوشته شود و شاید جهت تکمیل این بخش حداقل 2 ماه و پشت سرهم زمان نیاز باشد .
به امید موفقیت :)
 

hamed-ddd

Well-Known Member
سلام آقا مصطفی
من یه مشکلی پیدا کردم
من میخوام یه ابجکت اطلاعات psition در یک محور خاص رو از یه ابجکت دیگه با یه فرمول بگیره
مثلا ابجکت a مقدار ارتفاع در محور z از ابجکت b بگیره با این شرایط
L به توان 2 منهای Z به توان 2
در اینجا L یک عدد ثابت
و Zارتفاع ابجکت B
همون قضیه فیثاغورث)
 
آخرین ویرایش:
سلام
آقا خیلی آموزشتون باحال و تک بود ... ولی چرا ادامه نمی دید؟
یه مشکلی هم داشتم ؛ نمی دونم چرا من بعضی وقتها یه دستور ور تایپ می کنم هیچ تاثیری در جسم نداره و وقتی که همون دستور رو از نوشته های شما کپی می کنم و در اونجا وارد می کنم جواب می ده و اگه باز خودم اون دستور رو وارد کنم جواب می ده و کار می کنه ... می دونید دلیلش چیه ؟ ( مطمئنم دستور رو درست وارد می کنم )
 

max_s63

New Member
آموزش فوق العاده ای بود ، امیدوارم که ادامه داشته باشه.
میشه مرجعی برای Max Script معرفی کنید.

در ضمن واقعا حیفه اگه این پست رها بشه. لطفا ادامه بدید.
:)
 

s_mostafa_h

Well-Known Member
بعد از یک مدت طولانی ، که مشغول برنامه نویسی بودم ، امروز که ماه رمضان است به سراغ این سایت آمدم و مخصوصا و مستقیما به سمت این مقاله آموزشی رفتم . راستش در ماه رمضان وقتی آدم افطار می کند که دیگه خواب و خستگی به سراغش میآد . امیدوارم هرچه زودتر این مبحث را ادامه بدم .
ضمنا مرجع من در حال حاضر سری های آموزشی CG Academy و Help خود مکس می باشد .
 

s_mostafa_h

Well-Known Member
و اما ادامه مطالب :
اگر اشیاء مختلفی در صحنه داشته هر یک از دستورات ذیل می تواند برای انتخاب کردن اشیاء بکار گیرد :
کد:
q=$*s*
[COLOR="Blue"]$$objects/.../*s*[/COLOR]
for i in q do print i
[COLOR="blue"]$Sphere:Sphere01 @ [-41.176785,-3.804593,0.000000]
$Sphere:Sphere02 @ [-4.569233,-31.979614,0.000000]
$Sphere:Sphere03 @ [58.161797,-36.230827,0.000000]
$Sphere:Sphere04 @ [30.343870,8.758134,0.000000]
$Star:Star01 @ [11.442715,-75.388756,0.000000][/COLOR]OK

همانطوریکه گفتیم ، علامت دلار یا $ به معنی اینه که در باره شی ء داریم .صحبت می کنیم . ابتدا متغیری به نام q تعریف می کنیم که این متغیر ، تمام اشایی را یک از حروف بعد از اولین کرکتر تا آخرین کرکتر حرف s است را شامل می می شود .دستور بعدی هم با تعریف متغییری در داخل مجموعه q ، آنها را لیست می کند .
بدیهی است همین اشیاء را می توان با آرایه آنها نشان داد . کافی است که متغییر q را به عنوان آرایه تعریف کنیم :
کد:
q=$*s* as array
[COLOR="blue"]#($Sphere:Sphere01 @ [-41.176785,-3.804593,0.000000], $Sphere:Sphere02 @ [-4.569233,-31.979614,0.000000], $Sphere:Sphere03 @ [58.161797,-36.230827,0.000000], $Sphere:Sphere04 @ [30.343870,8.758134,0.000000], $Star:Star01 @ [11.442715,-75.388756,0.000000])[/COLOR]

استفاده از ستاره یا * به معنی اینه هر چه قدر کرکتر می تواند باشد و محدودیتی از نظر تعداد کرکتر وجود ندارد .
حال اگر به تعداد دویست Box در صحنه داشته باشیم و بخواهیم تنها Box هایی را که آخر شان عدد 1 و این عدد هم کمتر از 100 باشد چیکار باید کرد .
روش مناسب استفاده از علامت ؟ است . هر علامت ؟ تنها جایگزین یک کرکتر قرار می گیرد :
کد:
print $Box?1
[COLOR="blue"]$Box:Box01 @ [-27.901833,67.984032,0.000000]
$Box:Box11 @ [-233.993286,67.984032,0.000000]
$Box:Box21 @ [-501.594116,67.984032,0.000000]
$Box:Box31 @ [-792.496826,67.984032,0.000000]
$Box:Box41 @ [-1083.399414,67.984032,0.000000]
$Box:Box51 @ [-1374.301514,67.984032,0.000000]
$Box:Box61 @ [-1665.203613,67.984032,0.000000]
$Box:Box71 @ [-1956.105713,67.984032,0.000000]
$Box:Box81 @ [-2247.008545,67.984032,0.000000]
$Box:Box91 @ [-2537.911865,67.984032,0.000000][/COLOR]
کد:
print $Box??1
[COLOR="blue"]$Box:Box101 @ [-2828.815186,67.984032,0.000000]
$Box:Box111 @ [-3119.718506,67.984032,0.000000]
$Box:Box121 @ [-3410.621826,67.984032,0.000000]
$Box:Box131 @ [-3701.525146,67.984032,0.000000]
$Box:Box141 @ [-3992.428467,67.984032,0.000000]
$Box:Box151 @ [-4283.331543,67.984032,0.000000]
$Box:Box161 @ [-4574.234863,67.984032,0.000000]
$Box:Box171 @ [-4865.138184,67.984032,0.000000]
$Box:Box181 @ [-5156.041504,67.984032,0.000000]
OK[/COLOR]
 

s_mostafa_h

Well-Known Member
:wink:اگر اشیایی را در صحنه داشته باشیم و بخواهیم نام اشیای انتخابی در صحنه را لیست کنیم می نویسیم :
کد:
for i in selection do print i.name
[COLOR="Blue"]"Sphere04"
"Box04"
"Cone05"
OK[/COLOR]

می خواهیم بدانیم که آیا تعداد اشیای انتخاب شده در صحنه آیا بیشتر از 5 می باشد :
کد:
selection.count>5
[COLOR="blue"]false[/COLOR]

یاد آوری :
در مکس 8 که من با آن کار می کنم ، می توانیم ، یکی از نما ها را به MaxScript Listener تبدیل نمایم ، کافی است بر بروی خود یکی از نماها ( نام نوشته مثلا Top ) راست کلیک کرده و از طریق View سپس extended سپس MaxScript Listener آن نما را به script نویسی اختصاص دهیم
اگر بخواهیم اشیای خاصی را در صحنه انتخاب نماییم ، از دستور :
کد:
select #($Box01,$Box09)
OK
select #($نام شی ء)

دستور deselect :
برای اینکه اشیای انتخابی را از حالت انتخاب خارج کنیم از دستور deselect مانند دستورات select استفاده می کنیم :
کد:
select $Box*
[COLOR="Blue"]OK[/COLOR]
deselect $Box01
[COLOR="blue"]OK[/COLOR]

در این دستور ابتدا تمام Box ها را انتخاب و سپس با استفاده از دستور deselect شیء Box01 را از حالت انتخاب خارج کردیم .
دستور selectMore :
از این دستور برای اضافه کردن اشیا به جمع اشیا انتخاب شده قبلی استفاده می شود :
کد:
select $sph*
[COLOR="Blue"]OK[/COLOR]
selectMore $Cone*
[COLOR="blue"]OK[/COLOR]
دراین دستور ابتدا کلیه اشیایی را که حروف اولشان sph است ، انتخاب و سپس با استفاده از دستور selectmore اشیا مخروط را به جمع اشیای انتخاب شده قبلی اضافه می کنیم .
دستور Join :
روش دیگر برای الحاق اشیای انتخاب شده به یکدیگر ، تعریف متغییر به عنوان آرایه است :
کد:
one=$box* as array

[COLOR="blue"]#($Box:Box01 @ [60.223747,139.973602,0.000000], $Box:Box02 @ [60.223747,100.448822,0.000000], $Box:Box03 @ [60.223747,60.924046,0.000000], $Box:Box04 @ [60.223747,21.399269,0.000000], $Box:Box05 @ [60.223747,-18.125507,0.000000], $Box:Box06 @ [60.223747,-57.650284,0.000000])[/COLOR]
two=$cone* as array

[COLOR="blue"]#($Cone:Cone01 @ [-32.782532,128.158630,0.000000], $Cone:Cone02 @ [-32.782532,93.933044,0.000000], $Cone:Cone03 @ [-32.782532,59.707458,0.000000], $Cone:Cone04 @ [-32.782532,25.481873,0.000000], $Cone:Cone05 @ [-32.782532,-8.743713,0.000000])[/COLOR]
join one two

[COLOR="blue"][COLOR="blue"]#($Box:Box01 @ [60.223747,139.973602,0.000000], $Box:Box02 @ [60.223747,100.448822,0.000000], $Box:Box03 @ [60.223747,60.924046,0.000000], $Box:Box04 @ [60.223747,21.399269,0.000000], $Box:Box05 @ [60.223747,-18.125507,0.000000], $Box:Box06 @ [60.223747,-57.650284,0.000000], $Cone:Cone01 @ [-32.782532,128.158630,0.000000], $Cone:Cone02 @ [-32.782532,93.933044,0.000000], $Cone:Cone03 @ [-32.782532,59.707458,0.000000], $Cone:Cone04 @ [-32.782532,25.481873,0.000000], $Cone:Cone05 @ [-32.782532,-8.743713,0.000000])[/COLOR][/COLOR]
select one
[COLOR="blue"]OK[/COLOR]
دستور اول و دوم ، متغییر های one و two را به عنوان آرایه از Box ها و مخروط ها در نظر گرفته و دستور سوم این آرایه ها با استفاده از دستور join به هم الحاق کرده و در نهایت با استفاده از دستور select یکی از متغییر های آرایه را فراخوانی کرده تا تمام اشیایی را که به عنوان آرایه به هم Join شدند را انتخاب کند .

روش دیگر هم استفاده از دستور مستقیم ذیل است که نتیجه مانند بالاست :

کد:
select (join($box* as array) ($cone* as array))
[COLOR="blue"]OK[/COLOR]
ادامه دارد
:lol:
 

s_mostafa_h

Well-Known Member
مخفی کردن اشیاء :
دستور hide برای مخفی کردن اشیاء بکار می رود :

کد:
select $box*
[COLOR="Blue"]OK[/COLOR]
hide $
[COLOR="blue"]OK[/COLOR]
دستور اول کلیه جعبه ها را انتخاب و دستور بعدی همه این جعبه ها را مخفی می کند . توجه داشته که دراینجا تنها از $ بعد از دستور hide استفاده کردیم . در واقع علامت دلار تنها در این دستور ، به اشیاء انتخاب شده جاری اشاره دارد .

دستور ذیل تمام اشیاء داخل صحنه را مخفی می کند :

کد:
hide objects
[COLOR="blue"]OK[/COLOR]
Unhide کردن اشیاء :
برای آشکار کردن اشیا از حالت مخفی کافی است دستور Unhide را جلوی شی مورد نظر تایپ نماییم . دستور ذیل را در نظر بگیرید :
کد:
hide objects
[COLOR="blue"]OK[/COLOR]
unhide $box*
[COLOR="blue"]OK[/COLOR]
select $sphere*
[COLOR="blue"]OK[/COLOR]
unhide $
[COLOR="blue"]OK[/COLOR]
دستور دوم کلیه جعبه ها را آشکار کرده ، دستور سوم کلیه کره های مخفی را انتخاب و دستور چهارم هم این اشیاء انتخاب شده جاری را آشکار کرده است .

:nokte: برای اینکه کلیه اشیاء را انتخاب ، یا مخفی یا آشکار کنیم از دستور ذیل استفاده می کنیم :

کد:
*$ نام دستور 
یا
objects نام دستور
مثال :
کد:
hide $*
[COLOR="blue"]OK[/COLOR]
unhide $*
[COLOR="blue"]OK[/COLOR]
دستور ذیل را در نظر بگیرید :
کد:
select $sphere*
[COLOR="blue"]OK[/COLOR]
hide $*
[COLOR="blue"]OK[/COLOR]
unhide $
[COLOR="blue"]OK[/COLOR]
همانطوریکه می بینید ، برای آشکار کردن اشیای انتخاب شده در دستور بالا ، کافی است دلار را وارد نماییم .
روش انتخاب دیگر :
دستور Collect :
از این دستور بیشتر بخاطر مصرف کمتر حافظه در کامپیوتر استفاده می شود . دستور ذیل را در نظر بگیرید :

کد:
select helpers
[COLOR="Blue"]OK[/COLOR]
thepoints=for i in helpers where classof i==point collect i
[COLOR="blue"]#($Point_Helper:Point01 @ [-39.122143,-18.362011,0.000000], $Point_Helper:Point02 @ [-22.570667,-18.362011,0.000000], $Point_Helper:Point03 @ [-6.019192,-18.362011,0.000000], $Point_Helper:Point04 @ [10.532284,-18.362011,0.000000], $Point_Helper:Point05 @ [27.083759,-18.362011,0.000000], $Point_Helper:Point06 @ [43.635235,-18.362011,0.000000], $Point_Helper:Point07 @ [60.186710,-18.362011,0.000000])[/COLOR]
select thepoints
[COLOR="blue"]OK[/COLOR]
ابتدا کلیه helpers ها انتخاب ، سپس متغییری که نقطه ها را جمع کند ، تعریف سپس نقطه ها انتخاب شده اند . کلمه classof هم مجموعه سلسله مراتب اشیاء می باشد . چون مجموعه اشیایی مثلا جعبه ها ، نقطه ها و ... ، خواص و ساخت آنها در داخل یک کلاس یا یک ماژول قرار دارد .
دستور بالا را می توانستیم مستقیما به صورت :
کد:
Select(for i in helpers where classof i==point collect i)
که نتیجه ، مانند بالاست .
مثال دیگر :
چند تا قوری در صحنه داریم . می دانیم ، قوری دارای دو پارامتر تغییر اندازه به نام Radius و segments است . می خواهیم ، قوری هایی که دارای شعاع کمتر از 10 هستند را در صحنه انتخاب کنیم . همیشه بهتر است عادت کنیم که از متغییر برای تعریف یک رشته عبارت استفاده کنیم . پس ما هم این کار را انتخاب می کنیم . یاد آور می شویم قوری جزو geometry است :
کد:
myvar=for t in geometry where classof t==Teapot and t.radius<10 collect t

[COLOR="Blue"]#($Teapot:Teapot03 @ [-61.493885,33.781960,0.000000], $Teapot:Teapot05 @ [-47.880371,83.441673,0.000000])[/COLOR]

select myvar
[COLOR="blue"]OK[/COLOR]
myvar.count
[COLOR="blue"]2[/COLOR]

فعلا Bye :lol:
 
بالا