Skript Objekte
Ein Skriptobjekt funktioniert wie andere Zeichenobjekte, aber die Geometrie wird von einem Python-Skript erstellt.
Bearbeitungsoperationen können auf Skriptobjekten basieren, genauso wie statische Zeichenobjekte. Sie können auch verschoben, gedreht und kopiert werden. Alle Änderungen, die das Skript vornimmt, werden automatisch von den zugehörigen Bearbeitungsoperationen übernommen.
Skripte können nützlich sein, um parametrische Formen zu erzeugen (z. B. ein Zahnrad oder einen Kasten mit Registerkarten), Kopien von anderen Zeichenobjekten zu erstellen oder diese zu bearbeiten. Skriptobjekte können auch verwendet werden, um allgemeine Funktionen wie z. B. eine Animation bereitzustellen.
Zeichnungsskripte erstellen normalerweise primitive Formen und fügen sie der Entities-Sammlungseigenschaft hinzu:
this.Entities.Add(...)
Das folgende Beispiel zeichnet eine N-seitige Form mit einem bestimmten Radius.
# variable that define the shape...
n = 7
radius = 10
# create a polyline object...
poly = Polyline()
poly.Closed = True
for i in range(0,n):
th = i*2*Math.PI/n
poly.Add( radius * Math.Cos(th), radius * Math.Sin(th), 0)
# add the polyline to the list of drawing objects...
this.Entities.Add(poly)
# multiple drawing objects can be added...
this.Entities.Add(Circle(0,0,radius))
Das Ergebnis ist...
Skriptobjekte werden in der Regel ausgeführt, wenn sie zur Aktualisierung der Geometrie benötigt werden. Sie können jedoch zur Ausführung gezwungen werden, indem Sie sie im Zeichenbaum auswählen und F5 drücken.
Verwenden Sie Bearbeiten - Auflösen, um Skriptobjekte in ihre statischen Zeichnungsobjekte zu verwandeln, die mit früheren CamBam Versionen verwendet oder mit CamBam CAD-Operationen weiter bearbeitet werden können.
Wenn ein Skriptobjekt mit dem Befehl Zeichnen - Skriptobjekt oder durch Anklicken des Skript-Symbols eingefügt wird, wird ein Standard-Skript eingefügt,
a default script is inserted. Der Inhalt dieses Skripts kann in der Systemkonfigurationseigenschaft Standard-Skript-Objekt festgelegt werden.
Eigenschaften
|
Der auszuführende Skripttext. Der Text kann durch Klicken auf die Schaltfläche [...] rechts neben der Eigenschaft oder durch Doppelklicken auf ein vom Skript erstelltes Zeichenobjekt bearbeitet werden. |
|
Wenn Ja, wird das Skript bei Bedarf automatisch ausgeführt, z.B. wenn die Zeichnung geladen wird oder wenn das Skript geändert wird. Wenn Nein muss das Skript manuell gestertet werden, durch Auswahl des Objekts und drücken der F5 Taste. Dies kann für nicht-zeichnende Skripte wie Animationen nützlich sein, die nur bei Bedarf ausgeführt werden müssen. |
|
Die Eigenschaft Entities enthält eine Liste von Zeichenobjekten, die vom Skript erzeugt werden. |
|
Ein allgemeines, mehrzeiliges Textfeld, das zum Speichern von Notizen oder Parameterdaten verwendet werden kann. |
|
Eine 4 x 4 Zahlenmatrix, die für allgemeine Transformationen der Zeichenobjekte verwendet wird. Die Transformationsmatrix kann für Rotationen, Verschiebungen und Skalierungen um alle 3 Achsen verwendet werden. |
Kopieren von Zeichnungsobjekten
Das Erstellen von Kopien anderer Zeichnungsobjekte ist eine einfache, aber leistungsstarke Technik, die eine einfache Verwaltung von Zeichnungen ermöglicht. Objekte können kopiert werden, indem man nach ihrer ID sucht, Objekte aus einer bestimmten Ebene hinzufügt oder sie aus externen Zeichnungen zufügt.
m folgenden Beispiel werden 4 Kopien eines Quellobjekts erstellt, wobei jede Kopie um 18 mm entlang der X-Achse versetzt ist.
Dies entspricht in etwa der Funktion Menü -> Transformieren -> Reihenkopie mit dem Vorteil, dass alle Änderungen am Quellobjekt automatisch in die Kopien übernommen werden, wenn das Skript das nächste Mal ausgeführt wird durch Drücken von F5.
# find drawing object with ID=7
ent = doc.FindPrimitive(7)
for i in range(1,5):
clone = ent.Clone()
clone.Transform.Translate(i*18,0,0)
this.Entities.Add(clone)
Verwenden von Ebenen
Die feste Kodierung von Quellobjekt-IDs in Skripten kann fehleranfällig sein. Wenn sich die Quellobjekt-IDs ändern, schlagen alle verweisenden Skripte fehl.
Eine Alternative ist das Kopieren von Objekten aus einer Quell-Ebene, der durch seinen Namen angegeben wird.
for ent in doc.Layers["Border"].Entities:
this.Entities.Add(ent.Clone())
Kopieren aus externen Dateien
cbfile = CADFile()
filename = "samples\\skull-big-foam.cb"
cbfile.Open(FileUtils.GetFullPath(CamBamConfig.Defaults.SystemPath,filename))
for ent in cbfile.Layers["Default"].Entities:
this.Entities.Add(ent.Clone())
Einbeziehung von Skripten
Das Skriptobjekt enthält Skripte aus der Skript-Eigenschaft der übergeordneten Ebene sowie aus der Skript-Eigenschaft auf der obersten Ebene des Teilbildes. Dadurch können Funktionen, Klassen oder Variablen einmal in der Zeichnung definiert werden und dann in einer beliebigen Anzahl von Zeichnungsobjekten referenziert werden.
CamBam fügt vor der Ausführung jedes Skripts einen intern generierten Header-Block ein, um häufig verwendete Namensräume zu importieren. Dies hilft, die Benutzerskripte kurz zu halten. Der interne Header enthält den folgenden Code.
import clr
clr.AddReference('System')
from System import *
clr.AddReference('System.Drawing')
from System.Drawing import *
from CamBam import *
from CamBam.CAD import *
from CamBam.CAM import *
from CamBam.UI import CamBamUI
from CamBam.Geom import *
Wenn das Skript ausgeführt wird, werden die Skriptkomponenten aneinander angehängt, so dass das tatsächlich ausgeführte Skript gegeben ist, durch:
Header + Drawing.Script + Layer.Script + ScriptEntity.Script
Importieren externer Skripte und Module
Skripte können auch aus externen Quellen importiert werden, indem man die Python-Standardanweisung import verwendet. Dies bietet eine Möglichkeit, eine gemeinsame Bibliothek von Zeichnungsobjekten und anderen Funktionen zu verwalten, die die in mehreren Zeichnungen gemeinsam genutzt werden können. Alle Änderungen an Modulen werden automatisch übernommen übernommen, wenn Skripte, die auf sie verweisen, ausgeführt werden.
In diesem Beispiel wird das Modul Pulleys.py aus dem Ordner für gemeinsame Skripte importiert.
# import the module
import Pulleys
# declare a timing pulley object with pitch=5mm and 18 teeth
HTD5_18 = Pulleys.HTDPulley(5.0,18)
# add the pulley outline to the script object's drawing entities
this.Entities.Add(HTD5_18.getFrontView())
Die Zeile import Pulleys
weist Python an, nach einem Modul namens 'Pulleys' zu suchen.
Python sucht in einem Suchpfad, der den Ordner der aktuellen Zeichnung und den Skriptordner des CamBam-Systems enthält.
Es gibt ein Skript im CamBam system\script-Ordner namens Pulleys.py, so dass dieses Modul gefunden und importiert wird. CamBam bietet auch die folgenden Module: Pulleys.py, StepperMotors.py and Bearings.py. Das C-BEAM-Belt-Drive.cb Beispiel nutzt diese Module, um Zeichnungsobjekte zu erzeugen.
Module werden in ihrem eigenen Namensraum importiert. Allen Namen, die vom Modul verwendet werden, muss der Modulname vorangestellt werden, z. B. 'Pulleys.HTDPully'. Es ist auch möglich, Modulnamen in den Namensraum des aktuellen Skripts zu importieren, indem man eine Zeile wie diese verwendet:
import Pulleys
# import just the HTDPulley name
from Pulleys import HTDPulley
# or import all names from the Pulleys module
from Pulleys import *
Dann können Namen wie "HTDPulley" ohne das Präfix "Pulleys" verwendet werden.
Skriptmodule sind so ziemlich wie jedes andere Skript, außer dass sie "in sich geschlossen" sein müssen. Der oben beschriebene, intern generierte Header-Block wird nicht automatisch hinzugefügt, so dass alle erforderlichen Module und Namensräume in das Modul importiert werden müssen.
Der Modulsuchpfad kann innerhalb des Skripts definiert werden, um den Import von Standard-Python-Modulen zu ermöglichen.
# append the module search path
import sys
sys.path.append("C:/Python27/Lib")
# import the Python CSV handling module
import csv
reader = csv.reader(open("C:/devt/test.csv", 'rb'))
for row in reader:
print str(row)
Animationen
Skripte können verwendet werden, um Zeichnungsobjekte zu animieren, indem Transformationen wie Rotationen und Verschiebungen angewendet werden und dann jedes Bild innerhalb einer Schleife aktualisiert wird. Es ist möglich, die Zeichnung während der Animation zu drehen, zu skalieren und zu schwenken.
Animations-Skripte sollten mit Ausführen bei Aktualisierung auf Nein gesetzt werden, sonst werden sie ausgeführt sobald die Datei geladen wird.
Das Skript sollte auch die Animating-Eigenschaft der aktuellen Ansicht setzen, wenn die Animation beginnt, und sie am Ende des Skripts wieder löschen. Dadurch kann die Ansicht einige Optimierungen vornehmen und verhindern, dass nicht ausgewählte Objekte während der Animation eingeblendet werden.
Das Skript sollte auch den ursprünglichen Transformationszustand der animierten Objekte beibehalten und die die Transformationen am Ende des Skripts wiederherstellen, sonst wird die Zeichnung in einem Zustand mit den Quellobjekten zurückgelassen wie sie beim letzten Animationsframe transformiert wurde.
Im folgenden Beispiel wird ein Objekt mit ID=1 entlang der X-Achse gedreht und verschoben.
# find drawing object with ID=1
ent = doc.FindPrimitive(1)
# save the current transformation
tsave = ent.Transform
# start animating
view.Animating = 1
cycles = 4
for f in range(0,cycles*360):
# apply transformations to the source object
trans_translate = Matrix4x4F.Translation(f*0.1,0,0)
trans_rotate = Matrix4x4F.RotationZ(-f/180.0*Math.PI)
ent.Transform = tsave * trans_rotate * trans_translate
# update the display
view.RefreshView()
app.Sleep(5)
# restore the original transformation
ent.Transform = tsave
view.Animating = 0