Dateifreigabe
In loser Folge (bei schönem Wetter bin ich im Garten) werde ich diesen Beitrag immer wieder ergänzen, so dass ein Handbuch entsteht (Eure Frage geben die Richtung vor). Ich weiss es gibt bessere System für so eine Doku, aber wir sind nun einmal hier und können einfach interagieren
Für diejenigen, die über diesen Beitrag zu Thema gekommen sind, bitte auch «fischertechnik Designer» und Python: Konfiguration - Probleme und Lösungen... beachten
- Einführung
Los geht es: (ftD gestartet, Modell geladen, Python-Manager gestartet)
ich kommentiere gewisse Zeilen, viele Befehle sprechen aber für sichAusgabe:Code: Alles auswählen
#Module enthalten Python-Erweiterungen für verschiedene Bereiche import ftd #Modul "ftd" in den Python-Interpreter laden # dieses Modul implementiert alle Funktionen für den ftD #import math #"math" implementiert Funktionen wie "sin()", "cos()", etc. # aber noch brauchen wir diese Funktionen nicht, darum ist die Zeile mit "#" auskommentiert print ftd.Version() #"print" erkläre ich nicht ;-) #"Version()" ist eine Methode der Python-Erweiterung für den ftD lngPartCount = ftd.GetPartCount() #eine andere Methode, die das Ergebnis einer Variable zuweist print "Anzahl Bausteine:", lngPartCount
bis hier mal zum Anfang... weiter geht es dann mit diesem Code als Ausganglage:Code: Alles auswählen
Version 1.9.0 Anzahl Bausteine: 6907
schauen wir uns mal die 3. Zeile an:Code: Alles auswählen
import ftd lngPartCount = ftd.GetPartCount() prt = ftd.GetPartAtIndex(lngPartCount-1) #Ja, ich weiss es ging dann anders weiter ;-)
- prt1: eine Variable; diese bekommt einen Wert zugewiesen vom Ausdruck nach dem "="
- ftd.: Verwende eine Funktion aus dem Modul "ftd"
- GetPartAtIndex (jeder Grossbuchstabe leitet ein neues Wort ein)
- Get: Bitte gebe mir...
- Part: ...den "Baustein" (oder Light, Definition, etc.)...
- At: ...von der...
- Index: ...Position (die Zählung startet bei 0)
- (lngPartCount-1)
- "(" ... ")": umschliesst Parameter, die der vorgestellten Funktion übergeben werden
- lngPartCount-1: ist die Nummer (Index) des letzten hinzugefügten Bauteils
- lngPartCount: Anzahl der Bausteine im Modell (bei 5 Bausteine: gibt "GetPartCount()" "5" zurück
- -1: der Index beginnt aber bei 0, also hat das letzte Bauteil den Index "GetPartCount() - 1" = "4"
Bei Bedarf werde ich dieses und die folgenden Abschnitte je nach Euren Reaktionen ergänzen, - Systematische Dokumentation
die Python Erweiterung für ftD enthält eine Modul und verschiedene KlassenCode: Alles auswählen
Modul ftd Klasse Part Bauteil Klasse Object3D Position von … im Raum Klasse Point3D <später mehr> Klasse Color Farbe von … Klasse Camera <später mehr> Klasse Definition <später mehr> Klasse Grid <später mehr> Klasse Light <später mehr>
- Einleitung
- Bedeutung der, in den folgenden Abschnitten verwendeten Variablennamen:
- _PartNumber: The number of the part in the library e.g. "31010"
- _PartName: The represented name of the part in the current scene e.g. „F31010_1“
- _Index: die Nummer eines Objektes, wobei das erste Element die Nummer 0 (Null) hat
- Bedeutung der in den folgenden Tabellen verwendeten Farben
- grün: aus der Dokumentation von Michael
- blau: von mir selber "erforscht"
- Bedeutung der, in den folgenden Abschnitten verwendeten Variablennamen:
- Modul: ftd
- Klasse: Part (ein Bauteil)
- Klasse: Object3D (die Position von … im Raum
- Klasse: Point3D
- Klasse: Color (die Farbe von …)
- Klasse: Camera
- Klasse: Definition
- Klasse: Grid
- Klasse: Light
- Einleitung
- Entwicklung des Seriengenerators und andere Grundlagen
- im folgenden die Python Grundlagen zu "if ... elif ... else (wenn ... sonst-wenn ... sonst)" (Theorie: Python If ... Else)
Code: Alles auswählen
import ftd #wenn Du diese Zeile nicht verstehst, muss du weiter oben anfangen ;-) prt = ftd.GetSelectedPart() #alles klar, oder? ;-) if (prt): #wenn das Objekt "prt" existiert, dann... print "das von Dir gewählte Bauelement wird verwendet" elif (ftd.GetPartCount() == 0): #bei Bedingungen: beachte die "(", ")" und den ":" print "kein Bauteil vorhanden, also 'Add.en' wir eines" prtName = ftd.AddPart("31004") #Add.. ==> Name des neuen Elements ftd.SelectPart(prtName) #das neue Bauteil (über seinen Namen) auswählen prt = ftd.GetSelectedPart() else: print "kein Bauteil ausgewählt, aber es sind Bausteine vorhanden, also nehmen wir das letzte das hinzugefügt wurde" prtCount = ftd.GetPartCount() prt = ftd.GetPartAtIndex(prtCount-1) print "Name:", prt.Name, "Bauphase:", prt.Phase
- Benutzereingabe (Auswahl des neuen Bausteins) [folgendes ist nur ein Ausschnitt aus obigen Skript, gekennzeichnet mit "::"]
Code: Alles auswählen
:: elif (ftd.GetPartCount() == 0): print "kein Bauteil vorhanden, also 'Add.en' wir eines, ... ...aber welches?" eingabe = ftd.InputDlg("Seriengenerator", "welches Bauteil möchtest Du verwenden", "31004") #ok, alles klar, Danke für die Eingabe prtName = ftd.AddPart(eingabe) #jetzt kommt das Bauteil aus einer Variable ftd.SelectPart(prtName) prt = ftd.GetSelectedPart() else: ::
- Einschub: Verschieben und Drehen (der "Koordinaten-Manager (Alt+Q) in Python)
{der Koordinaten-Manager passt hier nicht wirklich rein, zeigt aber sehr schön wie die Schnittstelle funktioniert}... und lernen gleich eine ganz wichtige Klasse kennen "Object3D", Uhhhh... die sphärische Trigonometrie, habe ich in der Schule vor bald 50 Jahren auch verpasst, aber da müssen wir durchCode: Alles auswählen
import ftd prt=ftd.GetSelectedPart() if (prt): prt.Object3D.RotateRed(45) #Winkel in Grad !!! wird später noch wichtig sein!!! prt.Object3D.RotateGreen(20) prt.Object3D.RotateBlue(30) prt.Object3D.MoveRed(15) #Verschiebung in Millimeter #ja klar, geht auch mit 'Green' und 'Blue'
- Was braucht es für eine Serie?
Eine Wiederholung die uns 99 Bauteile erzeugt (Theorie: Python For Loops)
Ausgangslage: ein Baustein 31003 (Baustein 30 grau)Da siehst Du ein Problem (Zapfen) für das ich bis jetzt keine Lösung habe. Es hat auch gar nichts mit Python zu tun, das Problem liegt am ftD selber. Es betriff Bauteile, die aus zwei einzelnen Teilen bestehen.Code: Alles auswählen
import ftd prt = ftd.GetSelectedPart() #prt ist das von Dir ausgewählte Bauteil if (prt): #hast du wirklich eines ausgewählt? print "Name: ", prt.Name # JA orgNumber = prt.Name[1:6] # aus dem Namen (FC0050_1), lesen wir uns "FC0050" print "Nummer: ", orgNumber for i in range(9): # von 0 bis 9 (oder 99) prtName = ftd.AddPart(orgNumber) # füge das vorher selectierte Bauteil erneut hinzu print i, "Name: ", prtName ftd.SelectPart(prtName) # Bauteil über den Namen auswählen (Anklicken) prt = ftd.GetSelectedPart() # prt ist unser neues Objekt(Baustein) prt.Object3D.MoveRed(15*(i+1)) # verschiebe prt in roter Richtung (kleines Ein-Mal-Eins) else: #hast du wirklich eines ausgewählt? ftd.MessageDlg("Kein Bauteil ausgewählt") # NEIN ftd.MessageDlg("ENDE, nächste Staffel folgt...") #Guet Nacht, Zämme
Ein Ketteglied (z.B. 36248) (besteht aus nur einem Teil, ist darum vom obigen Problem nicht betroffen.
.... Ohhhh, ganz übel, das ist noch nicht eine Kette!!!, hmmm was ist die Lösung - 2 Bausteine die uns als Referenz dienen, der 2. wird dann 99 mal wiederholt. Diese erstellen wir uns vorerst mit der Maus
2 * 36248 (Rasterkettenglied rot) - ... die Distanz der beiden (Referenz-)Bausteine im 3D-Raum
Code: Alles auswählen
folgt
- im folgenden die Python Grundlagen zu "if ... elif ... else (wenn ... sonst-wenn ... sonst)" (Theorie: Python If ... Else)
[/list]
Liebe Leserinnen und liebe Leser: Bitte schreibt, ob das so lesbar und verständlich ist, Danke
Für die oben gezeigten Beschreibung von "ftd" und "Part" folgt bald ein Link damit Ihr die komplette Beschreibung als pdf oder Excel herunterladen könnt
und ganz WICHTIG: ich hasse Typfehler (sehe diese immer nur bei andern), also bitte Korrekturvorschläge per PN an mich
Des weitern bin ich bemüht, alle neuen Erkenntnisse, die wie ZUSAMMEN erarbeiten, laufend in der Beschreibung ein zu pflegen