While Python-Beginner (z.B. Spiralen )

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
User avatar
hammax
Veteran
Posts: 1994
Joined: Thu Jan 19, 2017 5:03 pm
Location: Ammersee DE

While Python-Beginner (z.B. Spiralen )

Post by hammax »

...es gibt ja in der PartWB unter "parametrische Geometrie-Primitive" die Helix (die eigentlich keine "Spirale" sondern eine Schraublinie ist),
und die archimedische Spirale. Selbige werden oft als Sweeppfade für allerlei benutzt.
https://forum.freecadweb.org/viewtopic. ... 20#p105200
Aus diesem wmayer-Skript habe ich mir die Vorgehensweise abgeschaut, wie man die Dinger in Python programmiert
und daraus einen Punkteimport nebst BSpline erzeugt. Das waren schon mal ganz nützliche und überschaubare Einsteigerübungen für
etwas Python-Autodidaktik. Da es noch andere Spiralentypen gibt, konnte die Übung fortgesetzt werden.
http://mathematische-basteleien.de/spirale.htm
Da wäre noch die Euler-Spirale aka. Klothoide bzw. Cornu-Spiral
https://forum.freecadweb.org/viewtopic. ... 95#p175965
Und natürlich die in der Natur so oft verwendete Logarithmische Spirale ( auch angenähert durch die Fibonacci-Spirale).
Nachstehend das Skript für eine 3D-Log-Spirale und ein daraus gesweeptes Schneckenhaus.
(ist wohl Eulen nach Athen getragen, aber man steht als Anfänger nicht solitär in der CAD-Gegend rum...)

Code: Select all

# Logarithmische Spirale 3D
# http://matplotlib.org/examples/pylab_examples/fill_spiral.html
# https://forum.freecadweb.org/viewtopic.php?t=12796&start=20#p105200

import Draft
import math
from math import pi
from math import e      # Eulerzahl 2.71828
import Points

start = 0
ende = 47     # 2 Umdrehungen 
dpi = 5       # pi_Schrittweiten-Faktor r=a*phi
kon = 0.02    # eine sehr kleine Konstante
cona = 1      # irgend eine Konstante
dri = 1       # Delta_R-Schrittweite
dzi = 1       # Delta_Z-Schrittweite

pts=[App.Vector((start+cona*e**(kon*pi*i))*math.cos(math.radians(pi*dpi*i)),
                (start+cona*e**(kon*pi*i))*math.sin(math.radians(pi*dpi*i)),
                cona*e**(kon*pi*i)*dzi) for i in range(ende)] #i*dzi
#.......................................for i in ... ist in Py ein "Generatortyp"

# Points-Feature erstellen
p=Points.Points()
p.addPoints(pts)
Points.show(p)

# Punkte verbinden
Draft.makeBSpline(pts)
LogSnail_4.PNG
LogSnail_4.PNG (63.63 KiB) Viewed 3520 times
Last edited by hammax on Thu Jun 08, 2017 3:55 pm, edited 1 time in total.
User avatar
hammax
Veteran
Posts: 1994
Joined: Thu Jan 19, 2017 5:03 pm
Location: Ammersee DE

Re: Spiralen while Python-Beginner

Post by hammax »

...ich wohne in einer Gewässerniederung. Draußen wimmelt's von Stechmücken - um dieser Form von bekennendem Masochismus
zu entgehen, hocke ich doch lieber vor dem PC, statt Holz für den nächsten Winter zu machen.
Noch ein paar Spielchen mit der Klothoide/Euler-Spirale. Wenn man Straßen- oder Bahntrassen konzipiert muss man ja
genauso "ruckfrei" wie in der Kurve auch Anstiege oder Gefälle einbauen. Diese Klothoide braucht demzufolge noch eine
Behandlung in z-Richtung. Dazu eignet sich auch die cos-Funktion, zumal diese Beschleunigung nur normal zur Trasse erfolgt.
Die Klothoide benötigt maximal den ersten Quadranten der Kurve, da der Rest wieder (umgekehrt) das selbe als Auslauf ist.
(Es sei denn man baut Achterbahnen o.dgl.). Inzwischen funzt wieder die Code-Formatierung.

Code: Select all

# 3D Euler-Spirale/Klothoide urspr. javascript
# https://en.wikipedia.org/wiki/Euler_spiral

import Draft
import math
import Points

dpts = [0, 0, 0]
ptsa = [(0, 0, 0)]

scale = 10      # Skalierung
Nb = 250        # je groesser Nb um so mehr Windungen; 250 => 1Wdg
ds = 0.01
s = 0
hs = 0.2        # + =z_erst_steigend;  - =z_erst_fallend;  hs=0 => eben
prev = [0, 0, 0]
curr = [0, 0, 0]
N = 0
# Grafik-Nullpunkt R=>unendl. horizontale Tangente
while N <= Nb:       
                
        dpts[0] = math.cos(s * s) * ds   
        dpts[1] = math.sin(s * s) * ds   
        dpts[2] = (1 - math.cos(s * s)) * hs # fuer Trassen-Rampen
        s = s + ds
        curr[0] = prev[0] + dpts[0]
        curr[1] = prev[1] + dpts[1]
        curr[2] = dpts[2]

        ptsa.append((curr[0]*scale, curr[1]*scale, curr[2]*scale))
        
        prev[0] = curr[0] 
        prev[1] = curr[1] 
        prev[2] = curr[2] 
        N = N + 1
      
# Points-Feature erstellen
p=Points.Points()
p.addPoints(ptsa)
Points.show(p)

# Punkte verbinden
Draft.makeBSpline(ptsa)
EulerSpirale_2.PNG
EulerSpirale_2.PNG (18.49 KiB) Viewed 3486 times
User avatar
hammax
Veteran
Posts: 1994
Joined: Thu Jan 19, 2017 5:03 pm
Location: Ammersee DE

Re: While Python-Beginner (z.B. Spiralen )

Post by hammax »

...ein seltsamer Befund. Beim "Python-Lernen" stöbert man überall herum.
Unter Anderem auch in der FC.17-Hilfe beim Menüpunkt "Automatic python modules documentation".
In dem sich öffnenden Fenster findet man ganz unten auch die unter User/AppData/Roaming... installierten .py-Module.

Beim Anklicken meines Euler.py wird der gesamte Punktesalat numerisch angezeigt - obwohl das Modul vorher gar nicht ausgeführt wurde...
Kehrt man zurück zur Programmoberfläche ist offensichtlich eine Datei angelegt und Euler.py gestartet worden.
Es war vorher bestimmt keine Datei eröffnet worden und zusätzlich wurde noch ohne mein Zutun eine kompilierte Euler.pyc-Datei
angelegt. Darf/kann FC.17 das? Original-Code siehe oben.
Da mich die FC.17eigene Python-Konsole bislang nicht so sehr befruchtet, verwende ich als Editor "Visual Studio Code"
mit Python-Anhang. Das macht zwar keine Syntaxprüfung, formatiert aber und färbt ein. Leider hat es keinerlei
Ahnung von den FreeCAD-Syntaxbestandteilen. Ob man die wohl einbinden kann??? über PIP???

Noch komfortabler gibt sich Spyder3 aus WinPython, bemeckert aber auch jeden FreeCAD-Ausdruck.
Ich nehme zunächst mal nicht an, dass man den beiden "FreeCAD" beibringen kann.
https://www.youtube.com/watch?v=OAOfhFE ... rAZxoHcN4o
BTW, PyCharm ist offensichtlich sehr osteuropäisch orientiert, weshalb ich lieber die Finger davon lasse.
Bei Anaconda habe ich noch gar nicht nachgesehen.
Edit für fch : https://www.continuum.io/anaconda-overview
Last edited by hammax on Fri Jun 09, 2017 10:11 am, edited 5 times in total.
freecad-heini-1
Veteran
Posts: 7791
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: While Python-Beginner (z.B. Spiralen )

Post by freecad-heini-1 »

hammax wrote: Thu Jun 08, 2017 4:23 pmBei Anaconda habe ich noch gar nicht nachgesehen.
Den Film habe ich mal unzensiert in Thailand in einem Nachtbus von Bangkok nach Hua Hin gesehen.
Die Klimaanlage war auf 18°C eingestellt, dann noch dieses blurünstige Biest ...
User avatar
hammax
Veteran
Posts: 1994
Joined: Thu Jan 19, 2017 5:03 pm
Location: Ammersee DE

Re: While Python-Beginner (z.B. Spiralen )

Post by hammax »

...hier noch eine weitere Darstellungsvariante der Klothoide in Matplotlib.
Noch eine Fingerübung in Python und verwandten Moduln. Warum habe ich mich nur mit C# versucht?
Python ist ja "viel schöner" und schneller zu handhaben - ohne all dem M$-lastigen VS-Kram.
Rumpfprogramm für einen Klothoidenrechner in FC:

Code: Select all

# Euler-Spirale / Klothoide / Curnu-Spiral

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

Nb = 250        # je groesser Nb um so mehr Windungen; 250 => 1Wdg
scale = 10      # Skalierung
ds = 0.01
s = 0
hs = 0             # hs=0 => eben;  + =z_erst_steigend;  - =z_erst_fallend
N = 0
x = [0]  ; y = [0]  ; z = [0]
prev0 = prev1 = prev2 = 0

while N <= Nb:       
        dpts0 = np.cos(s * s) * ds   
        dpts1 = np.sin(s * s) * ds   
        dpts2 = (1 - np.cos(s * s)) * hs # fuer Trassen-Rampen
        s = s + ds
        curr0 = prev0 + dpts0 ; curr1 = prev1 + dpts1 ;  curr2 = dpts2
        x .append(curr0*scale)
        y .append(curr1*scale)  
        z .append(curr2*scale)        
        prev0 = curr0 ;  prev1 = curr1 ;  prev2= curr2
        N = N + 1
# Ende Euler-Spirale

mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')

ind = np.linspace (0, Nb)
ax.plot(x, y, z, label='Klothoide')
ax.legend()

plt.show()
Eul_Spirale.png
Eul_Spirale.png (49.05 KiB) Viewed 3363 times
wmayer
Founder
Posts: 20319
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: While Python-Beginner (z.B. Spiralen )

Post by wmayer »

Wie genau funktioniert es, die Grafik anzuzeigen? Mit dem letzten Aufruf von plt.show() passiert bei mir rein gar nichts. Wenn ich fig.show() aufrufe, erscheint die Fehlermeldung:
C:\Projects\FreeCADLibs_11.5_x64_VC12\bin\lib\site-packages\matplotlib\figure.py:387: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
"matplotlib is currently using a non-GUI backend, "
Den einzigen Weg, den ich bisher gefunden habe, ist den Plot in eine Bilddatei zu schreiben via:

fig.savefig("C:/Temp/plot.png")
User avatar
hammax
Veteran
Posts: 1994
Joined: Thu Jan 19, 2017 5:03 pm
Location: Ammersee DE

Re: While Python-Beginner (z.B. Spiralen )

Post by hammax »

...ich habe WinPython die 3.6.1 (also aktuellste Version mit allen(?) Paketen) drauf.
Ausgeführt wurde es mit der dort verfügbaren Shell.
Wenn man dieses Klothoidenprogramm einsetzen wollte, müssten wohl noch Radialstrahlen, Tangenten/aktuelle_Winkel
und die an ausgewählten Punkten gespiegelte Funktion bestimmbar sein.
Siehe Autobahnkreuze....
chrisb
Veteran
Posts: 54293
Joined: Tue Mar 17, 2015 9:14 am

Re: While Python-Beginner (z.B. Spiralen )

Post by chrisb »

Ich habe den zuletzt von hammax veröffentlichten Code genommen und einfach in der Console ausgeführt. Da hat sich dann das Matplot Fenster geöffnet und die Klothoide gezeigt. Ich war positiv überrascht, weil ich diesen Teil von FreeCAD nicht kannte.
Kann man die so erzeugten Gebilde auch in der Modellierung benutzen, z.B. im Sketcher oder in Draft?

OS: Mac OS X
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.16.6706 (Git)
Build type: Release
Branch: tag: 0.16.6706
Hash: f86a4e411ff7848dea98d7242f43b7774bee8fa0
Python version: 2.7.11
Qt version: 4.8.7
Coin version: 3.1.3
OCC version: 6.8.0.oce-0.17
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
freecad-heini-1
Veteran
Posts: 7791
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: While Python-Beginner (z.B. Spiralen )

Post by freecad-heini-1 »

Hehe, sehr schön, klappt bei mir auch. Zu gerne würde ich einen Sweep entlang ziehen.
Wie bekommt man diese Kurve nach Freecad?
wmayer
Founder
Posts: 20319
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: While Python-Beginner (z.B. Spiralen )

Post by wmayer »

Man kann das Back-end auf Qt4 setzen, was dann diese drei Zeilen verlangt:

Code: Select all

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
Danach funktioniert auch bei mir der Plot.
Post Reply