Koordinaten einlesen, beeinflussen und übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Willibald
User
Beiträge: 3
Registriert: Dienstag 6. Januar 2015, 12:24

Hallo Zusammen,

ich bin neu hier im Forum.
Hausaufgaben liegen Dekaden zurück, aber Lust auf Neues ist noch vorhanden.

Bin vor 2 Wochen auf Python gestoßen und habe so gut wie keine Programmiererfahrung.
Bitte also um Nachsicht.

Knabbere jetzt seit Tagen an einem Problem und komm nicht weiter.
Bevor ich also aufgebe, wende ich mich an Euch ;-)

Mir geht es dabei nicht um eine fertige Lösung, sondern um Hinweise, wie ich mein Ziel erreichen kann. Das Ganze ist nicht zeitkritisch. Der Lernerfolg steht im Vordergrund.

Nun aber genug der Vorrede und zur Beschreibung der Herausforderung:


Ich möchte in FreeCAD (freies 3D-Programm) einen BSpline erzeugen.

Das Script dafür sieht vereinfacht wie folgt aus:

Code: Alles auswählen

P1 = (0,1,0)   # Px = (x,y,z)
P2 = (2,1,3)
P3 = (4,2,1)
Draft.makeBSpline ([P1,P2,P3])
Tippt man die obenstehenden 4 Zeile in der Python-Konsole in FreeCAD ein, bekommt man einen schönen Spline.

Da Splines aber nicht nur über 3 Punkte verfügen, möchte ich die Koordinaten einlesen und den Spline automatisch erzeugen lassen. Dazu kommt, dass ich die einzelnen Koordinatenwerte beeinflussen möchte.

x und y werden je nach Wunsch (Eingabe eines Wertes) mit dem gleichen Wert multipliziert und z wird ein Wert (Eingabe eines Wertes) zugewiesen.

Bedeutet für P2 z.B.: x*150 und y*150 und z=20 , also P2 = (300,150,20)

Die so erzeugten Splines ergeben am Ende das Profilegerüst einer Finne.

Die Punkt habe ich z.Z. in einer Datei: datafile.dat:

1,0.00060,0
0.95,0.00707,0
0.9,0.01259,0
0.85,0.01713,0
0.8,0.02099,0
0.75,0.02400,0
0.7,0.02635,0
0.65,0.02797,0
0.6,0.02917,0
0.55,0.02981,0


Da das jetzt viel Text war, schreibe ich mein Begehren noch einmal in Kurzform:

Einlesen von Stützpunkten (x,y,z)
Beeinflussen der Stützpunkte (x und y durch Multiplikation ; z mit Addition)
Einfügen der Punkte in den „Aufruf“ Darft.makeBSpline ([P1, P2, Px,....])

Das Einlesen habe ich wie folgt gelöst:

Code: Alles auswählen

mydata = [line.rstrip() for line in open('datafile.dat','r')]
print (mydata) #Stellt die gesamte Liste dar
i=0
for line in mydata:
    x = mydata [(i)]
    i = i+1
    print (x)
y = mydata[1]
print (y)
Dadurch habe ich die Koordinaten dann in einer Liste (glaube ich).

Aber wie kann ich die x, y und z-Werte der Einzelpunkt beeinflussen und Sie dann in das Draft.makeBSpline bringen.

Ich bin für jeden Input dankbar.

Gruß
Willibald
Zuletzt geändert von Anonymous am Dienstag 6. Januar 2015, 14:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Willibald: Wenn ich die ``for``-Schleife so sehe mit dem `line` das nicht benutzt wird und einem `i` das manuell hochgezählt und als Index verwendet wird, würde ich erst einmal ein Grundlagentutorial empfehlen. In der Python-Dokumentation befindet sich eines und für absolute Programmieranfänger wird oft Learn Python The Hard Way empfohlen (nicht vom Namen irritieren lassen).

Du musst wissen was für Werte Du an welchen Namen bindest und welchen Typ die haben, und was man damit deshalb anstellen kann und was nicht. Die Elemente von `mydata` sind Zeichenketten welche die einzelnen Zeilen aus der Datei darstellen. Die an Namen wie `x` und `y` zu binden macht wenig Sinn, denn *ein* Element ist weder *eine* Koordinate, noch kann man mit Zeichenketten die Rechenoperationen durchführen die Du vorhast.

Dateien die man öffnet, sollte man auch explizit wieder schliessen. Dafür bietet sich die ``with``-Anweisung an.

Die Vorsilbe `my` macht so gut wie nie irgendeinen Sinn bei Namen. Gewöhn Dir so einen Unsinn am besten gar nicht erst an. `data` ist auch ein wenig generisch — `lines` würde den Wert besser beschreiben.
Willibald
User
Beiträge: 3
Registriert: Dienstag 6. Januar 2015, 12:24

Hallo BlackJack,

vielen Dank für die offene und ehrliche Antwort.
Na dann werde ich weiter Tutorials schauen und die PyCharm-Lernaufgaben nochmals durchlaufen.

Oder das Programme schreiben den Spezialisten überlassen ;-)

LG
Willibald
Willibald
User
Beiträge: 3
Registriert: Dienstag 6. Januar 2015, 12:24

Hallo Zusammen, hallo BlackJack,

eine kleinen Schritt habe ich gemacht. Außer in "Learn Python The Hard Way" zu stöbern ;-)

Anbei das Ergebnis des Nachmittags.

Code: Alles auswählen

#import FreeCAD,Draft # in CAD einschalten

Liste = [1,2,0]

xy_scalefactor = 2.124
z_delta = 3.57

ListeSkaliert = [x * xy_scalefactor for x in Liste]

ListeSkaliert [-1] = z_delta
print (ListeSkaliert)

Tupleliste = tuple (ListeSkaliert) # CAD benötigt Tupel

p1 = (1,5,10)
p2 = (7,20,100)

#Draft.makeBSpline ([p1,p2,Tupleliste], closed=True) # in CAD einschalten
Das liefert für einen Punkt schon mal "ein" Ergebnis. Im CAD läuft's und macht einen Super-Spline.

Jetzt werde ich mal weiter stöbern und lesen, wie man am schlausten die ganze Liste (Zeilen) der Punkte abarbeitet und für das CAD verwertbar macht. Idee war schon mal in einer Schleife Variablen zu generieren und die entsprechenden XYZ-Werte zuzuweisen.
Aber das ist wohl auch nicht richtig - hab ich gelesen.

Das Jahr ist noch jung.

Gruß
Willibald
Antworten