ในบทก่อนหน้านี้เราสามารถทำการสร้างวัตถุขึ้นมาได้แล้ว แต่พอสร้างออกมาเสร็จแล้วก็จบเลยไม่ได้ไปทำอะไรกับวัตถุนั้นต่อ
โดยทั่วไปเมื่อสร้างวัตถุใดๆขึ้นมาเสร็จแล้ววัตถุนั้นจะอยู่ในสภาพที่ "ถูกเลือก" อยู่ นั่นคือจะเห็นว่าขอบของวัตถุเป็นสีเขียว
เช่น ลองพิมพ์คำสั่งสร้างลูกบาศก์
mc.polyCube()
เราก็จะได้ลูกบาศก์ที่มีขอบเป็นสีเขียว
ถ้ามีการสร้างวัตถุขึ้นมาใหม่ก้อนเดิมจะสูญเสียสภาพถูกเลือก ก้อนสุดท้ายที่สร้างจะอยู่ในสถานะถูกเลือก
แต่ในบางครั้งก็จำเป็นต้องกลับมาจับวัตถุที่สร้างขึ้นมาก่อนหน้า กรณีนั้นต้องกลับมากดเลือกวัตถุเดิมใหม่
การเลือกวัตถุนั้นถ้าควบคุมในหน้าจอก็แค่ใช้เมาส์คลิกง่ายๆ แต่หากจะสั่งเลือกวัตถุด้วยการพิมพ์โค้ดก็สามารถทำได้โดยใช้ฟังก์ชัน select() ซึ่งเป็นคำสั่งสำหรับทำให้วัตถุอยู่ในสถานะถูกเลือก
วิธีการใช้ select() ให้พิมพ์ mc.select('ชื่อวัตถุ')
จะเห็นว่าคำสั่งนี้ต้องระบุ "ชื่อ" ของวัตถุที่เราต้องการเลือก ดังนั้นหากไม่รู้ชื่อก็จะไม่สามารถเลือกได้
ชื่อของวัตถุสามารถดูได้จากเอาต์ไลเนอร์ซึ่งสามารถเปิดดูได้โดยกดที่แถบทางซ้าย ดังรูป
พอกดเข้าไปจะเห็นรายชื่อวัตถุต่างๆที่สร้างมาแล้วทั้งหมด นอกจากนี้ยังมีอย่างอื่นอยู่ด้วยซึ่งเป็นสิ่งที่มีอยู่แล้วตั้งแต่เริ่มโปรแกรม ขณะนี้ยังไม่ต้องไปสนใจก็ได้
พอคลิกที่ชื่อวัตถุก็จะถูกเลือกไปด้วยทำให้เรารู้ว่าชื่อไหนคือวัตถุไหน
โดยทั่วไปแล้วถ้าเวลาที่เราสร้างวัตถุเราไม่ได้กำหนดชื่อให้ โปรแกรมก็จะทำการตั้งชื่อให้เองอัตโนมัติ ซึ่งก็มีหลักตายตัวอยู่ เช่นทรงสี่เหลี่ยมก็จะชื่อ pCube1, pCube2 ไล่ไปเรื่อยๆตามลำดับที่สร้าง
ดังนั้นในกรณีนี้หากเราพิมพ์
mc.select('pCube1')
ก็จะพบว่า pCube1 อยู่ในสถานะถูกเลือก
อย่างไรก็ตามหากไม่ชอบชื่อที่ถูกตั้งให้โดยอัตโนมัติเราสามารถทำการกำหนดชื่อเองได้ตั้งแต่ตอนที่สร้างวัตถุขึ้นมา
เช่น ถ้าเรารู้อยู่แล้วว่าวัตถุที่เราสร้างมาคืออะไร และเรามีความจำเป็นต้องนำมันกลับมาใช้ทำอะไรต่อเรื่อยๆ การตั้งชื่อวัตถุที่สร้างให้มันสัมพันธ์กันก็เป็นสิ่งที่ควรทำ เพราะชื่อที่ระบบตั้งให้นั้นอาจจะจำยาก
การตั้งชื่อให้วัตถุสามารถทำได้โดยตอนที่ใช้ฟังก์ชันสำหรับสร้างวัตถุนั้นให้เพิ่มแฟล็กไปอีกตัว นั่นก็คือแฟล็ก n (name) โดยพิมพ์ n='ชื่อที่ต้องการ'
เช่น ถ้าเราสร้างทรงกลมขึ้นมาอันนึงตั้งใจจะให้มันเป็นไข่มังกรขนาด ๑๕ ซม. เราก็พิมพ์
mc.polySphere(r=7.5,n='khaimangkon')
ถ้าจะสร้างน้ำตาลก้อนขนาด ๑ ซม. ก็พิมพ์
mc.polyCube(w=1,h=1,d=1,n='namtankon')
เป็นต้น
ค่าของแฟล็ก n นี้จำเป็นต้องเป็นตัวแปรชนิดสายอักขระ ชื่อจะตั้งเป็นอะไรก็ได้ แต่ต้องประกอบด้วยตัวอักษรภาษาอังกฤษกับตัวเลขและเครื่องหมาย _ เท่านั้น ใช้ตัวอักษรภาษาไทยไม่ได้ ดังนั้นหากอยากตั้งชื่อเป็นภาษาไทยก็ต้องทับศัพท์เอาเท่านั้น
หลักการเขียนทับศัพท์แบบมาตรฐาน
https://en.wikipedia.org/wiki/Royal_Thai_General_System_of_Transcription เมื่อตั้งชื่อไว้แล้วก็สามารถอ้างอิงถึงไข่มังกรของเราได้ด้วยฟังก์ชัน select() ได้ โดยพิมพ์ mc.select('khaimangkon')
หรือหากต้องการเลือกวัตถุทั้ง ๒ ชิ้นพร้อมกันก็ใส่ชื่อของวัตถุลงไป ๒ อันโดยคั่นด้วย , เช่น
mc.select('khaimangkon','namtankon')
และหากต้องการเลือกหลายชิ้นก็ให้ไล่ใส่ชื่อที่ต้องการลงไปให้หมด จะกี่ชิ้นก็ได้
กรณีเลือกวัตถุสองชิ้นขึ้นไปจะพบว่าวัตถุที่เลือกทีหลังเท่านั้นที่เป็นสีเขียว ส่วนอันที่เลือกก่อนหน้านั้นเป็นสีขาว ความจริงแล้วลำดับการเลือกนั้นจะมีผลในบางเรื่อง ซึ่งจะเจอในบทต่อๆไปแต่ในกรณีส่วนใหญ่จะเลือกอันไหนก่อนก็ไม่ต่างกันมาก
การเลือกวัตถุนั้นมีความสำคัญ เพราะมีฟังก์ชันจำนวนมากมายที่ทำงานกับวัตถุที่ถูกเลือกอยู่เท่านั้น เช่น move() ซึ่งจะทำการย้ายวัตถุที่ถูกเลือก เช่นถ้าพิมพ์ (ก่อนพิมพ์ลบวัตถุที่สร้างก่อนหน้านี้ทั้งหมดก่อน)
mc.polySphere(r=7.5,n='khaimangkon')
mc.polyCube(w=1,h=1,d=1,n='namtankon')
mc.select('khaimangkon')
mc.move(-10,8,10)
โปรแกรมจะย้ายไข่มังกร แทนที่จะย้ายก้อนน้ำตาล แต่ถ้าหากตัดบรรทัด mc.select('khaimangkon') ทิ้งไปวัตถุที่ถูกย้ายก็คือก้อนน้ำตาล ซึ่งเป็นวัตถุที่ถูกสร้างขึ้นมาล่าสุด
อย่างไรก็ตามฟังก์ชัน move สามารถระบุตัววัตถุที่ต้องการเคลื่อนย้ายลงไปได้ โดยไม่จำเป็นต้องเป็นวัตถุที่เลือกอยู่ ทำได้โดยการใส่ชื่อของวัตถุที่ต้องการย้ายลงไปด้านหลังพิกัดที่ต้องการ เช่น
mc.move(10,8,10,'khaimangkon')
คราวนี้จะพบว่าได้ผลเหมือนกับการพิมพ์ mc.select('khaimangkon') ก่อนแล้วค่อยตามด้วย mc.move(10,8,10) แต่ที่ต่างก็คือวัตถุที่ถูกเลือกอยู่คือก้อนน้ำตาล
ชื่อวัตถุซึ่งถูกใส่ลงไปด้านหลังค่าตำแหน่งพิกัดนั้นคืออาร์กิวเมนต์ตัวที่ ๔ ของฟังก์ชัน move() โดยอาร์กิวเมนต์ตัวนี้เป็นชนิดสายอักขระ ซึ่งต่างจาก ๓ ตัวแรกที่เป็นชนิดจำนวนจริง
อย่างไรก็ตามไม่จำเป็นว่าชื่อจะต้องอยู่ ในตำแหน่งที่ ๔ ในกรณีที่ไม่จำเป็นต้องใส่ตำแหน่งพิกัดครบทั้ง ๓ ก็ใส่พิกัดแค่เท่าที่จำเป็นแล้วก็ต่อด้วยชื่อวัตถุ เช่น
mc.move(10,8,'khaimangkon',yz=1)
จะเป็นการย้ายไข่มังกรไปในแนวพิกัด y และ z โดยแนว x ไม่มีการเปลี่ยนแปลง
ที่ต้องเน้นก็คือชื่อของวัตถุจะต้องอยู่ในตำแหน่งหลังจากค่าตำแหน่งพิกัดเสมอ ไม่ว่าจะมีกี่ตัวก็ตาม และหากจะใส่แฟล็กลงไปอีกก็จะต้องใส่ไว้ข้างหลัง เช่น
mc.move(10,10,10,'khaimangkon',r=1)
และก็เช่นเดียวกับฟังก์ชัน select() ฟังก์ชัน move() ก็สามารถใส่ชื่อของวัตถุได้ทีละมากกว่าหนึ่ง เช่น
mc.move(10,10,10,'khaimangkon','namtankon',r=1)
แบบนี้จะเป็นการย้ายทั้งไข่มังกรและน้ำตาลก้อน
แต่ต้องระวังว่าถ้าไม่ใส่แฟล็ก r=1 แล้ว วัตถุทั้งหมดที่ถูกเลือกจะไปอยู่ตำแหน่งเดียวกันหมด ซึ่งอาจจะซ้อนทับกันได้
ฟังก์ชัน delete() เองก็สามารถใส่อาร์กิวเมนต์เป็นชื่อของวัตถุที่ต้องการลบเช่นกัน ในขณะที่หากไม่ใส่อะไรลงไปก็จะเป็นการลบวัตถุที่ถูกเลือกอยู่
เช่นพิมพ์
mc.delete(10,10,10,'khaimangkon','namtankon')
ทั้งไข่มังกรและน้ำตาลก้อนก็จะถูกลบไม่ว่าจะเลือกอะไรอยู่ก็ตาม
กรณีที่ต้องการเปลี่ยนชื่อสามารถทำได้โดยง่ายด้วยฟังก์ชัน rename() โดยใส่ชื่อเก่าแล้วตามด้วยชื่อใหม่ เช่น
mc.polyCube(w=1,h=1,d=1,n='lukbat1')
mc.rename('lukbat1','lukbatleklekluknueng')
ก็จะได้ทรงสี่เหลี่ยมลูกบาศก์ที่ชื่อว่า 'lukbatleklekluknueng'
ฟังก์ชัน select() นั้นนอกจากจะแค่ใส่อาร์กิวเมนต์เป็นชื่อของวัตถุที่ต้องการเลือกแล้ว ยังสามารถใส่แฟล็กเพิ่มเติมลงไปได้หลายตัว ขอยกที่สำคัญมาดังนี้
add (add) ถ้า add=1 จะเพิ่มวัตถุที่ระบุให้อยู่ในสถานะถูกเลือก เทียบเท่ากับการกด shift ค้างแล้วคลิกวัตถุที่ยังไม่ได้ถูกเลือกอยู่
cl (clear) ถ้า cl=1 จะเคลียร์สถานะถูกเลือกออกจากวัตถุทั้งหมด เทียบเท่ากับการคลิกลงบนที่ว่างในหน้าจอควบคุม
d (deselect) ถ้า d=1 จะเอาวัตถุที่ระบุออกจากสถานะถูกเลือก เทียบเท่ากับการกด shift ค้างแล้วคลิกวัตถุที่ทำถูกเลือกอยู่
แฟล็กทั้ง ๓ นี้มีค่าเป็นตัวแปรชนิดจริงเท็จ โดยทั่วไปถ้าไม่ใส่จะเท่ากับใส่ให้มีค่าเป็น 0 คือเป็นเท็จ ถ้าจะให้เป็นจริงก็ใส่ =1
กรณีที่ไม่ใส่แฟล็กอะไรลงไปเลย โดยทั่วไปแล้วจะเป็นการเคลียร์สถานะการถูกเลือกออกทั้งหมดแล้วเลือกเฉพาะวัตถุที่ระบุ
ตัวอย่าง ลองเริ่มจากพิมพ์
mc.polySphere(r=1,n='lukkaeo_lek')
mc.move(0,0,10)
mc.polySphere(r=2,n='lukkaeo_klang')
mc.move(0,0,6)
mc.polySphere(r=3,n='lukkaeo_yai')
เมื่อรันแล้วจะได้ทรงกลม ๓ ลูก โดยที่ lukkaeo_yai ถูกเลือกอยู่
จากนั้นลองพิมพ์
mc.select('lukkaeo_lek')
lukkaeo_lek ก็จะถูกเลือก ส่วน lukkaeo_yai จะหลุดออกจากสถานะถูกเลือก
จากนั้นถ้าพิมพ์
mc.select('lukkaeo_klang','lukkaeo_yai',add=1)
lukkaeo_klang และ lukkaeo_yai จะถูกเลือกเพิ่มเข้ามา โดยที่ lukkaeo_lek ก็ยังถูกเลือกอยู่
จากนั้นพิมพ์
mc.select('lukkaeo_yai',d=1)
lukkaeo_yai ก็จะหลุดออกจากสถานะถูกเลือก
แล้วถ้าพิมพ์
mc.select(cl=1)
วัตถุทั้งหมดก็จะหลุดออกจากสถานะถูกเลือก
ทิ้งท้ายว่า ทั้งการตั้งชื่อให้วัตถุตอนที่เริ่มสร้าง และการแก้ชื่อด้วยฟังก์ชัน rename() หากชื่อใหม่ที่ต้องการตั้งขึ้นนั้นมีอยู่ก่อนแล้วมันก็จะทำการเปลี่ยนชื่อ ให้ใหม่โดยอัตโนมัติ โดยทั่วไปจะเป็นการเพิ่มเลข 1 ต่อท้ายชื่อ แต่ถ้ามีเลข 1 อยู่แล้วก็จะต่อท้ายด้วย 2 แล้วก็จะถูกไล่ไปเรื่อยๆ เช่น
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')
จะได้ทรงสี่เหลี่ยมที่ชื่อ taohu, taohu1, taohu2, taohu3
หากพิมพ์ต่อว่า
mc.rename('taohu','taohu3')
taohu ก็จะเปลี่ยนชื่อเป็น taohu4 แทนที่จะเป็น taohu3 ซึ่งมีอยู่แล้ว
จะเห็นว่าการตั้งชื่อให้กับวัตถุตลอดทุกครั้งนั้นมีข้อเสียตรงที่ว่าต้องมาคอย ระวังว่าวัตถุชื่อนั้นมีอยู่ก่อนแล้วหรือเปล่า ถ้าหากมีอยู่แล้วเราก็จะได้ชื่อที่ต่างจากที่ต้องการ ในขณะที่ชื่อที่ต้องการกลับไปชี้ถึงวัตถุอีกชิ้นซึ่งถูกสร้างมาก่อนนั้นแทน ทำให้โปรแกรมอาจไม่สามารถทำงานตามแบบที่ต้องการได้
เพื่อที่จะหลีกเลี่ยงปัญหานี้มีวิธีการอยู่อีกอย่างหนึ่งในการระบุถึงตัววัตถุ คือแทนที่จะตั้งชื่อวัตถุนั้นโดยตรงก็ให้สร้างตัวแปรที่เก็บชื่อของวัตถุนั้นขึ้นมาแทน
อย่างไรก็ตามวิธีนั้นอาจต้องใช้ความเข้าใจเกี่ยวกับเรื่องของ "ค่าคืนกลับ" ซึ่งจะกล่าวถึงใน
บทที่ ๙ สำหรับตอนนี้แค่รู้ว่าสามารถตั้งชื่อให้วัตถุได้และสามารถอ้างอิงชื่อของ วัตถุเพื่อกดเลือกหรือออกคำสั่งได้ก็พอ
อ้างอิง