Όλοι οι χρόνοι είναι UTC + 2 ώρες




Δημιουργία νέου θέματος Αυτό το θέμα είναι κλειδωμένο, δεν μπορείτε να επεξεργαστείτε δημοσιεύσεις ή να δημοσιεύσετε άλλες απαντήσεις  [ 1 Δημοσίευση ] 
Συγγραφέας Μήνυμα
 Θέμα δημοσίευσης: Turbo Εισαγωγή Στο Blender Scripting
ΔημοσίευσηΔημοσιεύτηκε: Τρί Νοέμ 13, 2012 10:34 pm 
Εικόνα
Πληροφορίες:
  • Τα μαθήματα αυτά φτιάχτηκαν με λογική ακολουθία οπότε επίτειδες μπήκαν οι γνώσεις με αυτή την σειρά.
  • Επειδή ο προγραμματισμός είναι 50% θεωρία και 50% πράξη τότε πρέπει να πειραματιστείτε μόνοι σας. Ότι εικόνα βλέπετε προσπαθήσετε να κάνετε ακριβώς το ίδιο κι εσείς, ότι κώδικα βλέπετε κάνετε τον copy paste να δείτε ότι δουλεύει και μετά προσπαθήσετε να τον γράψετε μόνοι σας.
  • Μη φοβάστε να τα διαλύσετε όλα στο Blender, εάν γίνει κάτι τέτοιο τότε κλείσιμο και ξανα-άνοιγμα.
  • Σύντομα για κάθε ένα θέμα θα προστεθούν συνδέσμοι προς το documentation στο Blender.org όπου θα βοηθήσει στην επικύρωση των γνώσεων.
  • Εάν κάτι δεν είναι κατανοητό τότε πείτε το εδώ να το συζητήσουμε.
  • Εάν κάτι δεν σας αρέσει και έχετε να το πείτε με καλύτερο τρόπο τότε τότε φτιάξτε μια αναδιατύπωση και γράψτε εδώ την διόρθωση ή να μου στείλετε σε P.M.
  • Επειδή όσον αφορά το scripting αφορά προγραμματιστική λογική και εμπειρία, δεν είναι καλή ιδέα να μάθετε προγραμματισμό μέσα από αυτά τα μαθήματα. Μπορείτε να διαβάσετε προγραμματισμό Python από κάπου αλλόυ κι εδώ να μάθετε για το Blender Python API.




ΕΙΣΑΓΩΓΗ

CONSOLE WINDOW : Σε αυτό το παράθυρο του Blender μπορούμε να γράφουμε τις εντολές Python απευθείας και ο διερμηνέας (Interpreter) να τις καταλαβαίνει.

Εικόνα

Tα αποτελέσματα εκτέλεσης των εντολών είναι άμεσα, όχι μόνο όσον αφορά το Blender αλλά παντού, καθώς η Python είναι μια πλήρης γλώσσα προγραμματισμού και λειτουργεί σε όλο το εύρος του λειτουργικού συστήματος.

Μερικές καλές συμβουλές:
  • Μπορούμε να δοκιμάζουμε διάφορα πράγματα στην κονσόλα, ή να βλέπουμε πως συντάσσονται μερικές εντολές. Μόλις θελήσουμε, μπορούμε να αντιγράψουμε όλα τα περιεχόμενα της κονσόλας και να τα μεταφέρουμε σε κάποιο επεξεργαστή κειμένου. (Console > Copy to Clipboard as script)
  • Πατώντας Control+Space έχουμε αυτόματη ολοκλήρωση των εντολών, όπου είναι πολύ χρήσιμο για εξερεύνηση του API.
  • Εάν θέλουμε κάποια πληροφόριση σχετικά με οτιδήποτε τότε γράφουμε help() και μέσα το πράγμα που μας ενδιαφέρει ώστε να εμφανιστεί το documentation.

π.χ. Εάν θέλω πληροφορίες σχετικά με το δημοφιλές bpy module του Blender

python code

help(bpy)


INFORMATION WINDOW : 
Εάν βρίσκομαστε στο Default screen layout (αυτό το standard με το που ξεκινούμε το Blender) τότε αν κατεβάσουμε λίγο κάτω το διαχωριστικό του Information Window θα καταφέρουμε να δούμε τα περιεχόμενα του. Αλλιώς εάν πάμε στο Scripting screen layout τότε έχουμε απευθείας το σωστό μέγεθος.

Εικόνα

Κάθε φορά που εκτελείται μια εντολή από τον χρήστη, εκτελείται ένας operator. Πολλές φορές καταγράφεται ως log στο Information Window. Αυτό μας δίνει χρήσιμες πληροφορίες για το πως μπορούμε να συντάξουμε κάποιες εντολές ή να βλέπουμε τα αποτελέσματα εκτέλεσης των script μας.

Εικόνα

Οι καταχωρήσεις είναι σαν αντικείμενα:
  • με δεξί κλικ επιλέγουμε
  • με A τα επιλέγουμε όλα
  • με Del ή Χ διαγράφουμε τα επιλεγμένα
  • με Control+C αντιγράφουμε

Παράδειγμα φτιάχνω ένα Plane, του βάζω Multires Μodifier, διαιρώ 4 φορές, έπειτα βάζω ένα Wave Μodifier. Θα έχω το εξής log:
Κώδικας:
bpy.ops.mesh.primitive_plane_add(view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.ops.object.modifier_add(type='MULTIRES')
bpy.ops.object.multires_subdivide(modifier="Multires")
bpy.ops.object.multires_subdivide(modifier="Multires")
bpy.ops.object.multires_subdivide(modifier="Multires")
bpy.ops.object.multires_subdivide(modifier="Multires")
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Multires")
bpy.ops.object.modifier_add(type='WAVE')
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Wave")


Εάν τώρα πάω στο Console Window και επικολλήσω όλες αυτές τις εντολές, τότε θα έχω ακριβώς το ίδιο αποτέλεσμα, σαν να το είχα γράψει μόνος μου.

Εικόνα

Οπότε είναι σωστό μερικές φορές αντί να μαντέψουμε ή να ψάχνουμε στο Internet για πληροφορίες να χρησιμοποιήσουμε αυτή την απλή τεχνική ώστε να βλέπουμε πως καλούνται μερικές από τις διαθέσιμες λειτουργίες του Blender.

Σημείωση: Μερικοί Operators καταγράφονται στο Info Window άλλοι όχι, αυτό εξαρτάται ανάλογα με το πως θέλει ο προγραμματιστής να συμπεριφέρεται ένας Operator (όλα είναι δυνατά), π.χ. το Play Animation είναι Operator αλλά δεν καταγράφεται στο Info Window.

TOOLTIPS : 
Όταν πηγαίνουμε τον δείκτη του ποντικιού πάνω από κάποιο στοιχείο του User Interface τότε εμφανίζεται ένα μικρό παραθυράκι με διάφορες πληροφορίες όπως περιγραφή, πλήκτρο συντόμευσης και ίσως άλλα, όμως συγκεκριμένα μας ενδιαφέρει σχετικά με την διαδρομή RNA.

Εικόνα

Για παράδειγμα εάν γράψουμε την εντολή bpy.ops.render.render() στο παράθυρο της κονσόλας μετά από λίγο θα έχουμε κάποια ανταπόκριση FINISHED.

Εικόνα

Όντως, εάν πάμε στο παράθυρο UV/Image Editor του Blender και δούμε την εικόνα Render Result, τότε είναι κατανοητό ότι ενεργοποιήσαμε την λειτουργία του Render με απλή Python, όχι με κουμπί ή Shortcut.

TEXT EDITOR ΤΟΥ BLENDER : 
Στο παράθυρο του Text Editor είναι το μέρος όπου μπορούμε να γράφουμε script και να τα τρέχουμε.

Εικόνα

  1. Γράφουμε μια εντολή
  2. Πατάμε το κουμπί Run Script (εάν δεν είναι ορατό σέρνουμε την μπάρα με Middle Click - αλλιώς Shortcut με Alt+P)
  3. Εμφανίζεται πληροφορία Information Window ότι εκτελέστηκε ένας Operator
  4. Το output της Python κατευθύνεται στην γραμμή εντολών (ή το τερματικό) του λειτουργικού συστήματος. Εάν θέλουμε να εμφανιστεί η γραμμή εντολών (τερματικό) τότε σε λειτουργικό σύστημα Windows πάμε στο Information Window: Window > Toggle System Console, διαφορετικά σε Linux/Mac πρέπει να ξεκινήσουμε το πρόγραμμα με εντολή από το τερματικό (όχι εκτέλεση από το εικονίδιο).

ΕΚΤΕΛΕΣΗ SCRIPT ΑΠΟ ΕΞΩΤΕΡΙΚΟ ΑΡΧΕΙΟ : 
Πολλές φορές όταν έχουμε γιγάντια script και μπόλικη δουλειά να κάνουμε, εάν θεωρήσουμε ότι είναι πιο βολικό να χρησιμοποιούμε κάποιο IDE ή code editor και όχι το Text Editor του Blender, τότε μπορούμε με ένα έξυπνο τρικ να πούμε στο Blender να φορτώσει στο φτερό κώδικα από αρχείο που βρίσκεται στο σκληρό δίσκο και αυτομάτως αυτό θα εκτελεστεί.

Ας πούμε ότι έχουμε αυτό το script με όνομα helloscript.py:

python code

print("Hello")


Τότε στο Blender θα πάμε και θα γράψουμε αυτές τις εντολές:

python code

# Το πλήρες μονοπάτι που βρίσκεται το script
filename = "D:/Programming/helloscript.py"

# Θα ανοίξουμε το αρχείο με δικαίωμα ανάγνωσης και θα τραβήξουμε το περιεχόμενο σε μορφή κειμένου
content = open(filename).read()

# Η εντολή exec εκτελεί κώδικα από string (κείμενο)
exec(content)


ΤΙ ΕΙΝΑΙ ΤΑ PROPERTIES

ΣΧΕΤΙΚΑ ΜΕ ΤΟ RNA : Το RNA είναι η αναπαράσταση της δομής των ενός αρχείου .blend με datablocks. Στην δομή αυτή υπάρχουν δεδομένα ως μεταβλητές-ιδιότητες (δηλαδή Properties). Εάν πάμε στο παράθυρο Outliner και αλλάξουμε το Type of information to display σε Datablocks τότε θα δούμε το εξής.

Εικόνα

Παράδειγμα, εάν θέλουμε να δούμε ποιό είναι το όνομα της κάμερας τότε, βλέπουμε στην κατηγορία με τις κάμερες (Cameras) ότι έχουμε μια κάμερα (Camera) όπου είναι το λεγόμενο datablock. Σε αυτό το datablock της κάμερας υπάρχει μια δομή δεδομένων με διάφορες ιδιότητες. Μια από αυτές είναι το όνομα της Camera.name, είναι με άλλα λόγια σαν να λέμε ότι η δομή δεδομένων Camera έχει μια ιδιότητα name όπου αυτή η ιδιότητα έχει ένα Χ τύπο δεδομένων.

Εικόνα

Εναλλακτικά είναι ακριβώς το ίδιο με το να επιλέξουμε την κάμερα και να πάμε στο μενού Object Data ώστε να δούμε αυτό το πεδίο με το όνομα του αντικειμένου.

Εικόνα

Το να ψαχουλεύουμε την δομή RNA είναι χρήσιμο για εξερεύνηση καθώς μας δίνει και μια οπτική ιδέα όσον αφορά την αναπαράσταση των δεδομένων.

ΣΧΕΤΙΚΑ ΜΕ ΤΑ RNA PROPERTIES : 
Όταν λέμε για Properties υπάρχουν δύο είδη από αυτά:
  • Τα RNA Properties
  • Τα ID Properties

Τα RNA Properties επεκτείνουν την δομή δεδομένων του Blender. Οι αλλαγές που γίνονται σε ένα datablock είναι καθολικές για όλα τα υπόλοιπα datablocks του ιδίου τύπου. Δηλαδή εάν κάνουμε μια τροποίηση στο datablock Object τότε οποιοδήποτε άλλο datablock που υπάρχει ως Object (υπάρχον ή μελλοντικό) θα φέρει αυτές τις αλλαγές.

ΠΑΡΑΔΕΙΓΜΑ RNA PROPERTY

Εκτελούμε την εντολή στην κονσόλα.

python code

bpy.types.Object.myRnaInt = bpy.props.IntProperty(
name = "RNA integer",
min = -100, max = 100,
default = 33)


Εικόνα

Εάν στο παράθυρο Outliner ψάξουμε στο RNA για ένα οποιοδήποτε αντικείμενο στη σκηνή, τότε θα δούμε με έκπληξη ότι το Property που δημιουργήσαμε υπάρχει εκεί. Ας πούμε δηλαδή ότι ακολουθήσουμε την διαδρομή Objects.Camera.RNA.Object.Properties.myRnaInt.

Εικόνα

Σημείωση: Επειδή επεκτείναμε το Object τότε μόνο ως Object θα μας εμφανιστεί αυτό το Property. Εάν ας πούμε ξεκινούσαμε την αναζήτηση από τα Cameras ή τα Meshes (κ.α.) τότε δεν θα βρίσκαμε τίποτα. Αυτό έχει σχέση με την ιεραρχία των τύπων δεδομένων, λόγω του ότι τα Meshes και οι Cameras (και πολλά άλλα) βασίζονται στο Object.

ΑΝΑΖΗΤΗΣΗ ΤΥΠΟΥ RNA PROPERTY

Αυτό σημαίνει ότι τώρα πλέον όλα τα datablocks τύπου Object θα έχουν διαθέσιμο αυτό το Property. Για παράδειγμα μπορούμε να δούμε τον τύπο δεδομένων του Property εάν γράψουμε αυτή την εντολή στην κονσόλα.

python code

bpy.types.Object.myRnaInt


Εικόνα

ΑΝΑΓΝΩΣΗ ΤΙΜΗΣ RNA PROPERTY

Εάν ψάξουμε αυτό το RNA Property για να διαβάσουμε την τιμή του, τότε θα γίνει μόνο μέσω κάποιου Object ή ενός αντικειμένου που προέρχεται από το Object. Όπως είναι το datablock της κάμερας:

python code

bpy.data.objects['Camera'].myRnaInt


Εικόνα

ΤΡΟΠΟΠΟΙΗΣΗ ΤΙΜΗΣ RNA PROPERTY

Για να αλλάξουμε την τιμή του Property τότε θα πρέπει μόνο μέσω ενός Object να δώσουμε την εντολή ανάθεσης (με το ίσον)

python code

bpy.data.objects['Camera'].myRnaInt = 100


Εικόνα

ΠΑΝΕΛ ΜΕ CUSTOM PROPERTIES

Μπορούμε να πάμε στο παράθυρο του Object Panel και στο Custom Properties βλέπουμε ότι έχει δημιουργηθεί αυτόματα ένα πεδίο με το όνομα και την τιμή αυτού του Property. Αυτό είναι είναι χρήσιμο ώστε να βλέπουμε με μια ματιά μερικές φορές όσον αφορά τα properties ενός αντικειμένου.

Εικόνα

ΟΙ DEFAULT ΤΙΜΕΣ ΤΩΝ RNA PROPERTIES

Σε ένα άλλο παράδειγμα εάν τώρα πάμε να δούμε τι τιμή έχει ο κύβος, τότε καταλαβαίνουμε ότι ενώ όλα τα αντικείμενα χρησιμοποιούν τον ίδιο τύπο δεδομένων myRnaInt το καθένα έχει την δική του τιμή, ανάλογα με το τι θα του δώσουμε, ο κύβος έχει κρατήσει την αρχική τιμή του.

Εικόνα

ΣΧΕΤΙΚΑ ΜΕ ΤΑ ID PROPERTIES : 
Τα ID Properties από την άλλη επεκτείνουν μόνο ένα συγκεκριμένο datablock, εκείνο στο οποίο δηλώνονται. Γι' αυτό το λόγο μπορούμε να δηλώνουμε τα Properties αυτά στο φτερό με εντολή ανάθεσης, δίχως κάποια ιδιαίτερη διαδικασία.

Κώδικας:
cube = bpy.data.objects["Cube"]
cube["taste"] = "Yum yum"
bpy.data.objects["Cube"]["taste"]
# Μας επιστρέφει 'Yum yum'


Το ID Property βλέπουμε επίσης πως εμφανίστηκε και στην δομή RNA ως string (κείμενο) και θα υπάρχει αποκλειστικά μόνο στο datablock του Cube.

Εικόνα

Επίσης βλέπουμε και στο Object Panel στην περιοχή Custom Properties ότι εμφανίζεται κι εκεί αυτή η ιδιότητα.

Εικόνα

ΔΙΑΡΚΕΙΑ ΖΩΗΣ ΤΩΝ PROPERTIES : Εάν αποθηκεύσουμε ένα αρχείο .blend με τα Properties που δημιουργήσαμε και κλείσουμε το πρόγραμμα, τότε τι θα γίνει;

  • Θα διατηρηθούν μόνο τα ID Properties που δηλώθηκαν σε κάθε datablock.
  • Ο τύπος δεδομένων RNA που δηλώσαμε με τόσο κόπο και ιδρώτα (λέμε τώρα) θα χαθεί εντελώς.
  • Εάν σε μερικά αντικείμενα πειράξαμε τα default values από τα RNA Properties, τότε αυτά θα μετατραπούνε σε ID Properties και θα σωθούν.
  • Όσα αντικείμενα με RNA Properties δεν πειράχθηκαν και έμειναν με τα default values τότε θα χαθούν οι τιμές τούς

Οπότε η λύση είναι όταν θα ξανατρέξουμε το script όπου θα δηλωθεί ο τύπος δεδομένων RNA τότε το Blender θα καταλάβει να μετατρέψει τα συνονόματα ID Properties σε RNA Properties ώστε όλα να λειτουργούν σωστά.


ΤΙ ΕΙΝΑΙ Ο OPERATOR
ΤΙ ΕΙΝΑΙ Ο OPERATOR : O Operator αντιπροσωπεύει ένα κομμάτι λειτουργίας στο Blender, όταν πατάμε ένα κουμπί στο Menu ή κάποιο Shortcut τότε αυτό σημαίνει πως ένας Operator θα τρέξει κώδικα. Θυμάστε προηγουμένως που κάναμε Render την εικόνα με μια απλή εντολή; Επίσης για παράδειγμα όταν αλλάζουμε το μέγεθος ενός αντικειμένου ή σβήνουμε κάποιο ή όταν πηγαίνουμε σε Edit Mode ή κάνουμε Unwrap τα UVs ενός Mesh, όλα αυτά ωφείλονται στην εκτέλεση των Operators.

ΠΩΣ ΦΤΙΑΧΝΟΥΜΕ OPERATOR : 
Παράδειγμα: Τοποθετούμε το εξής script στον Text Editor και πατάμε το κουμπί Run Script για να το τρέξουμε.

python code

import bpy

class SayMyNameOperator(bpy.types.Operator):
bl_idname = "object.say_my_name"
bl_label = "Say My Name"

def execute(self, context):
print(context.active_object.name)
return {'FINISHED'}

def register():
bpy.utils.register_class(SayMyNameOperator)

if __name__ == "__main__":
register()


Ο οperator που φτιάχνουμε είναι μια κλάση Python (class) όπου κληρονομεί χαρακτηριστικά από την κλάση Operator, το Blender γνωρίζει τι ακριβώς κάνει η κλάση Operator οπότε αυτό που κάνουμε εμείς είναι να την επεκτείνουμε σύμφωνα με τα δικά μας γούστα.

Οι μεταβλητές της κλάσης Operator είναι προσβάσιμες και από την δική μας κλάση. Δύο από αυτές είναι:
  • Το bl_idname είναι το προγραμματιστικό όνομα του οperator (όπου πρέπει να είναι μοναδικό προς αποφυγή conflicts). Το ότι βάζουμε ως τιμή object. στην αρχή είναι επειδή θέλουμε ο operator να υπάρχει στην κατηγορία Operators του object (δηλαδή στο bpy.ops.object). Αυτό είναι καθαρά θέμα οργανωτικής άποψης, γενικά δεν υπάρχει περιορισμός σε αυτό το κομμάτι αλλά καλό είναι όταν φτιάχνουμε script να κρατάμε λίγη τάξη.
  • Το bl_label είναι το περιγραφικό όνομα που θα αναγνωρίζει ο χρήστης στα μενού.

Μετά βλέπουμε τη συνάρτηση execute, αυτή θα καλείται όταν ο χρήστης ενεργοποιήσει τον Operator, επίσης δίνεται μια παράμετρος context ώστε να να κρατείται η πληροφορία σχετικά με το περιεχόμενο κατά τον οποίο είναι εκτελέσιμος ο Operator (αυτό μας οδηγεί στην ανάγνωση διάφορων τιμών που θα είναι χρήσιμες π.χ. εάν η κατάσταση βρίσκεται σε edit mode, ποιό είναι ενεργό αντικείμενο κ.α.). Όταν θα χρειαστεί να ειδοποιήσουμε το Blender σχετικά με την εκτέλεση του Operator τότε μπορούμε να του στείλουμε ένα σήμα με την εντολή return, σε αυτή την περίπτωση θέλουμε να ολοκληρώσουμε επιτυχώς την εκτέλεση του Operator οπότε στέλνουμε την τιμή 'FINISHED'.

Η register είναι μια απλή συνάρτηση όπου εκεί καταχωρούμε το όνομα της κλάσης του operator ώστε να τον θυμάται το Blender και να τον έχει διαθέσιμο αργότερα για εμάς. Για να χρησιμοποιήσουμε ένα Operator θα πρέπει να καταχωρηθεί στην δομή του Blender ώστε έτσι να είναι διαθέσιμος προς χρήση. Ο τρόπος για να το κάνουμε αυτό είναι η εξής εντολή:
Κώδικας:
bpy.utils.register_module(_όνομα_κλάσης_του_operator_)


Στο τέλος, μπορούμε να εγγυηθούμε ότι ο κώδικας του script θα εκτελεστεί μόνο μια φορά κατά την κλήση της συνάρτησης __main__. Αυτή η τεχνική είναι πολύ δημοφιλής στην Python, έτσι που κάνει το πρόγραμμα μας περισσότερο ασφαλές και προβλεπόμενο.

ΚΛΗΣΗ ΤΟΥ OPERATOR : 
Eάν πάμε στο παράθυρο 3D Viewport και πατήσουμε το Space Bar τότε στο παράθυρο που θα ανοίξει πληκτρολογούμε το όνομα του Operator και μόλις το επιλέξουμε και εκτελεστεί τότε θα δούμε το αποτέλεσμα στο παράθυρο του τερματικού του λειτουργικού συστήματος.

Εικόνα

Εναλλακτικά, εάν πάμε στην κονσόλα του Blender και γράψουμε το εξής, θα δούμε ότι ο Operator μας πάλι είναι διαθέσιμος κι εκεί.

Εικόνα

ΠΕΡΙΛΗΨΗ : 
Όπως προηγουμένως φτιάξαμε δικά μας Properties, έτσι και με την ίδια φιλοσοφία φτιάξαμε δικά μας Operators. Εάν δούμε καλύτερα θα καταλάβουμε ότι το Blender έχει φορτωμένους ένα σωρό οperators σε πολλές διαφορετικές κατηγορίες. Αυτό είναι μεγάλο πλεονέκτημα της Python ότι δυναμικά μπορούμε να τροποποιούμε τους τύπους δεδομένων.


ΣΧΕΤΙΚΑ ΜΕ ΤΑ MENU
ΠΩΣ ΦΤΙΑΧΝΕΙΣ ΕΝΑ MENU : 
Το να ενεργοποιείς ένα Operator με την βοήθεια του ειδικού παράθυρου που ανοίγει με Space Bar είναι καλό, επίσης και από την κονσόλα είναι μια χαρά, οπότε δεν θα χρειαστείς να μάθεις κάτι σχετικά με τα Menu.

Πολλές φορές όμως, το να δημιουργήσεις ένα δικό σου μενού είναι πολύ πιο χρήσιμο και πρακτικό από την κονσόλα, ειδικά εάν έχεις διάφορες τιμές που θέλεις να τροποποιείς ή το να μοιράζεις στο script σε άλλους χρήστες.

Ας φτιάξουμε το πρώτο μενού:

python code

import bpy

class SayMyNameOperator(bpy.types.Operator):
bl_idname = "object.say_my_name"
bl_label = "Say My Name"

def execute(self, context):
print(context.active_object.name)
return {'FINISHED'}


class SayMyNamePanel(bpy.types.Panel):
bl_label = "Say My Name Panel"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"

def draw(self, context):
self.layout.operator("object.say_my_name")


def register():
bpy.utils.register_class(SayMyNameOperator)
bpy.utils.register_class(SayMyNamePanel)

if __name__ == "__main__":
register()


Εικόνα

Η κλάση SayMyNameOperator είναι γνωστή από πριν, τώρα όμως θα επικεντρωθούμε στην κλάση SayMyNamePanel. Αυτή η κλάση κληρονομεί χαρακτηριστικά από την κλάση Panel του Blender. Είναι σχεδόν το ίδιο σκεπτικό με τα Operators, κι εκεί πάλι έχουμε διάφορες μεταβλητές που ανήκουν στην κλάση Panel, μερικές από αυτές:

  • bl_label για περιγραφή
  • bl_space_type το παράθυρο το οποίο θέλουμε να βρίσκεται το μενού, σε αυτή τη περίπτωση θέλουμε 3D Viewport.
  • bl_region_type η τοποθεσία που μας ενδιαφέρει στο έκαστο παράθυρο, σε αυτή την περίπτωση είναι το δεξί πλαϊνό φύλλο στα Properties.

Δηλώνουμε μια συνάρτηση draw , εκεί μπορούμε να δημιουργούμε όλα τα στοιχεία των μενού, σε αυτή την περίπτωση θα αναθέσουμε τον operator σε ένα κουμπί και αυτό γίνεται σύμφωνα με την ταυτότητα του bl_idname που δώσαμε στον Operator μας.

Σημείωση:
Το Blender καταλαβαίνει από μόνο του ότι τα Operators πρέπει να τοποθετούνται σε κουμπιά.

Στην συνάρτηση register δηλώνουμε και το όνομα της κλάσης του Panel που δημιουργήσαμε αυτή την φορά ακριβώς με τον ίδιο τρόπο.

ΠΩΣ ΕΛΕΓΧΕΙΣ PROPERTIES ΑΠΟ MENU : 
Παράδειγμα, ας πούμε ότι θέλουμε να εμφανίσουμε ένα πεδίο κειμένου όπου να έχει το Property του ονόματος του αντικειμένου, τότε θα αλλάξουμε το script έτσι.

python code

import bpy

class SayMyNameOperator(bpy.types.Operator):
bl_idname = "object.say_my_name"
bl_label = "Say My Name"

def execute(self, context):
print(context.active_object.name)
return {'FINISHED'}


class SayMyNamePanel(bpy.types.Panel):
bl_label = "Say My Name Panel"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"

def draw(self, context):
self.layout.prop(context.object, "name")
self.layout.operator("object.say_my_name")


def register():
bpy.utils.register_class(SayMyNameOperator)
bpy.utils.register_class(SayMyNamePanel)


if __name__ == "__main__":
register()


Αυτό που προσθέσαμε ήταν στην συνάρτηση draw, βάλαμε την εντολή prop πριν το κουμπί, όπου στην ουσία θέλουμε από το ενεργό αντικείμενο (context.object) να πάρουμε την ιδιότητα του ονόματος (name) του αντικειμένου.

ΤΑ ΔΙΚΑ ΜΑΣ RNA PROPERTIES : 
Πριν σε άλλο παράδειγμα, είπα πως μπορούμε να κάνουμε επέκταση της δομής RNA για ένα datablock. Γιατί να μην μπορούμε να προσθέσουμε αυτό το δικό μας Property στο μενού... Κι όμως αυτό γίνεται.

Σε αυτό το παράδειγμα, θα προσθέσουμε μια δική μας ιδιότητα στο αντικείμενο ώστε να καθορίσουμε πόσες φορές να επαναλαμβάνεται το μήνυμα.

python code

import bpy
import bpy.props


bpy.types.Object.greetCount = bpy.props.IntProperty(
name = "How many times to greet",
min = 1, max = 100,
default = 1)


class SayMyNameOperator(bpy.types.Operator):
bl_idname = "object.say_my_name"
bl_label = "Say My Name"

def execute(self, context):
obj = context.active_object

for i in range(obj.greetCount):
print(str(i) + " " + obj.name)

return {'FINISHED'}


class SayMyNamePanel(bpy.types.Panel):
bl_label = "Say My Name Panel"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"

def draw(self, context):
self.layout.prop(context.object, "name")
self.layout.prop(context.object, "greetCount")
self.layout.operator("object.say_my_name")


def register():
bpy.utils.register_class(SayMyNameOperator)
bpy.utils.register_class(SayMyNamePanel)


if __name__ == "__main__":
register()


Βάσει των προηγούμενων παραδειγμάων, το μόνο που προστέθηκε είναι η επέκταση RNA του Object datablock ώστε να υποστηρίζει την νέα μεταβλητή greetCount, έπειτα προστέθηκε και η εμφάνιση του στο Panel ακριβώς με τον ίδιο τρόπο.

Εικόνα




 ! allos έγραψε:
Σχολιασμός στο Turbo Εισαγωγή Στο Blender Scripting

_________________
Blender3D Technical Artist


 Προφίλ Personal album  
 
Τελευταίες δημοσιεύσεις:  Ταξινόμηση ανά  
Δημιουργία νέου θέματος Αυτό το θέμα είναι κλειδωμένο, δεν μπορείτε να επεξεργαστείτε δημοσιεύσεις ή να δημοσιεύσετε άλλες απαντήσεις  [ 1 Δημοσίευση ] 

Όλοι οι χρόνοι είναι UTC + 2 ώρες


Μέλη σε σύνδεση

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης


Δεν μπορείτε να δημοσιεύετε νέα θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να απαντάτε σε θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επεξεργάζεστε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να διαγράφετε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επισυνάπτετε αρχεία σε αυτή τη Δ. Συζήτηση

Αναζήτηση για:
Blendergr ©2011 | Developer-Founder Kornarakis Nikos | Co-founder Kampitakis Miron
Follow blendergr on Twitter