Raketenmodellbau.org Portal > Forum > Rund um den Raketenmodellbau > Allgemein > FreeCAD und von Karman Spitzen
Du kannst keine neue Antwort schreiben


Autor Thema 
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641893 , FreeCAD und von Karman Spitzen [Alter Beitrag11. Januar 2018 um 01:13]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Hallo zusammen,
nachdem ich ein wenig Zeit habe, habe ich mich mal ein wenig in FreeCAD eingearbeitet. Dabei habe ich festgestellt, dass man damit auch prima Spitzen konstruieren kann. Nur die Freiflächen einer von Karman Spitze ist nicht ganz so einfach.
Um den Prozess zu vereinfachen, habe ich ein kleines C Programm geschrieben, welches ein Python-Skript erzeugt, das wiederum im FreeCAD verarbeitet werden kann. Es erzeugt eine klassische Spitze.
Das Programm ist sicherlich nicht optimiert, aber funktioniert. Es ist unter LINUX geschrieben, da aber keinerlei speziellen OS-Aufrufe verwendet werden müsste es auch auf allen anderen Plattformen funktionieren.
Die Anleitung:
Nach dem Kompilieren (unter Suse Linux: cc -o karman.exe -lm karman.c) wird das Programm wie folgt aufgerufen:
./karman.exe ]]]]
outfile: Filename des zu schreibenden python-Skripts. Default ist /dev/stdout (also Bildschirm)
länge: Länge der Spitze in mm, gemessen von der Spitze bis zur Base (ohne Schulter). Default ist 500 mm
radius: Aussendurchmesser der Basis in mm. Default ist 51 mm oder 4" mit 2mm Wandstärke
dicke: Wandstärke in mm. Default ist 2
stepping: Alle wie viel mm ein rendering-punkt gesetzt werden soll (siehe unten), Default ist 2
Es können entweder alle Parameter weggelassen werden oder jeweils von rechts stehende. Also z.B.
./karman.exe dummy.py 250 <- erzeugt eine Spitze mit 250 mm länge in der Datei dummy.py
./karman.exe dummy.py 500 35 <- erzeugt eine Spitze mit 500 mm läng eund 35 mm Durchmesser in der Datei dummy.py
Hinweis: Die Anzahl der Renderpunkte bestimmt auch die Geschwindigkeit. Weiterhin scheint es bei FreeCAD 1.6 eine maximale Anzahl von Elementen zu geben, die in einem "Sweep" erlaubt sind. 300 gingen noch gut, 350 funktionierte schon nicht mehr. Das heisst, je nach Länge muss der Step erhöht werden um noch zu passen.

Die erzeugte Datei (z.B. dummy.py) wird dann in FreeCad eingelesen.
am besten ein leeres FreeCAD verwenden (oder eines, in der die Datei "NoseCone" NICHT geöffnet ist und die Phyton-Console öffnen.
In der Konsole dann das Kommand
execfile("dummy.py") <---- wenn die Datei so heisst
eingeben und warten. Das Ergebnis ist dann ein CUT-Element als fertige hohle Spitze...

Cheers
Mathias
Sourcecode (Kommentare im Code in Englisch, war einfacher für mich...)
-------------------------
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

/* The following definitions are the basic for the Karman (Haak) parameters
LENGTH is the length from tip to beginning of shoulder
RADIUS is the inner radius of the thick end
THICK is the wall thickness
STEP is an indicator of the accuracy of the CAD process. It defines the distance in
millimeter between the individual render rings
Be warned, FreeCAD seems not to be able to have too many render points in a sweep, definitly less
than 300!

*/
#define DEF_LENGTH 500.0
#define DEF_RADIUS 49.0
#define DEF_THICK 2.0
#define DEF_STEP 2.0
/*
-----
How does the program work
After reading the initial parameters, that are
- Filename for the output filename
- optional LENGTH, RADIUS, THICK, STEP
it basically will create the appropriate commands to create a document called "NoseCone"
in FreeCAD and fill this document with two set of circles, positioned STEP mm away in the Z-axis.
The first set of circles, called Circle<x> (x means the positional number, distance to the xy-plane),
is then formed into a solid "Sweep".
The second set, which has exactly "THICK" mm smaller diameter circles, called "SubCircle<x>" is also
formed into a sweep. The second sweep then is substracted from the first sweep, forming a resulting
hollow nose cone with a wall thickness of THICK and an inner radius of RADIUS.
All the FreeCAD-Commands for doing this will be written into the file "Filename".
All that is then left to do is to use the FreeCAD python console and type
execfile(<PATH TO FILE>wink to create the nose cone

The formula for calculating the circles can be found here:
https://en.wikipedia.org/wiki/Nose_cone_design#Von_K%C3%A1rm%C3%A1n

*/

int main(int argc, char *argvhttps://en.wikipedia.org/wiki/Nose_cone_design#Von_K%C3%A1rm%C3%A1n

*/

int main(int argc, char *argv;
int counter;

/* first, set the default values */

Length = DEF_LENGTH;
Radius= DEF_RADIUS;
Thick = DEF_THICK;
Step = DEF_STEP;
strcpy(filename,"/dev/stdout");
counter=0;

switch (argc)
{
case 6: Step = atof(argv);
case 5: Thick = atof(argv);
case 4: Radius = atof(argv);
case 3: Length = atof(argv);
case 2: strcpy(filename,argv);
case 1: break;
}

outfile = fopen(argv,"w");
if (!outfile)
{
puts("Error opening file to write");
exit(EXIT_FAILURE);
}
/*
now create the commands for setting up the document NoseCone
*/
fprintf(outfile,"App.newDocument(\"NoseCone\")\n");
fprintf(outfile,"App.setActiveDocument(\"NoseCone\")\n");
fprintf(outfile,"App.ActiveDocument=App.getDocument(\"NoseCone\")\n");
fprintf(outfile,"Gui.ActiveDocument=Gui.getDocument(\"NoseCone\")\n");

/*
This loop will create the individual circles that will form the outer hull
*/
for(x=0.0;x<Length; x+=Step)
{
phy=acos(1-(2*x)/Length);
/* the X-position is set by the stepping,
the y position is calculated as seen in the formulars. Since this in the outer hull, we add
the value "Thick" to the calculated radius
*/
y = (Radius/sqrt(3.1415))*sqrt(phy - (sin(2*phy)/2))+Thick;
/*
special case. Since FreeCad cannot handle a circle with the radius of 0, we change it
into the radius of 0.1
*/
if (y == 0)
y = 0.1;
/*
Now, just print out the commands for creating the circles
*/
fprintf(outfile,"Gui.activateWorkbench(\"SketcherWorkbench\")\n");
fprintf(outfile,"App.activeDocument().addObject('Sketcher::SketchObject','Circle%i')\n",counter);
fprintf(outfile,"App.activeDocument().Circle%i.Placement=App.Placement(App.Vector(0,0,%f),App.Rotation(0,0,0,1))\n",counter,x);
fprintf(outfile,"Gui.activeDocument().setEdit('Circle%i')\n",counter);
fprintf(outfile,"App.ActiveDocument.Circle%i.addGeometry(Part.Circle(App.Vector(0,0,0),App.Vector(0,0,1),%f),False)\n",counter,y);
counter++;
}
/*
now print the command for creating the sweep path, essentialy a line in Z direction with the Length of Length
The sweep will then be created along this line
*/
fprintf(outfile,"App.activeDocument().addObject('Sketcher::SketchObject','Path')\n");
fprintf(outfile,"App.activeDocument().Path.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(-0.707107,0.000000,0.000000,-0.707107))\n");
fprintf(outfile,"Gui.activeDocument().setEdit('Path')\n");
fprintf(outfile,"App.ActiveDocument.Path.addGeometry(Part.Line(App.Vector(0.000000,-0.000000,0),App.Vector(0,%f)),False)\n",Length);
fprintf(outfile,"App.ActiveDocument.recompute\n");

/* next, create the sweep, a solid representation of the nose cone from the previously defined circles and path
*/
fprintf(outfile,"Gui.getDocument('NoseCone').resetEdit()\n");
fprintf(outfile,"App.getDocument('NoseCone').recompute()\n");
fprintf(outfile,"Gui.activateWorkbench(\"PartWorkbench\")\n");
fprintf(outfile,"Gui.SendMsgToActiveView(\"ViewFit\")\n");
fprintf(outfile,"from FreeCAD import Base\n");
fprintf(outfile,"import Part\n");
fprintf(outfile,"App.getDocument('NoseCone').addObject('Part::Sweep','Sweep')\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Sections=\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Spine=(App.ActiveDocument.Path,)\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Solid=True\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Frenet=False\n");
fprintf(outfile,"App.ActiveDocument.recompute()\n");
fprintf(outfile,"Gui.getDocument('NoseCone').getObject(\"Path\").Visibility=False\n");
/*
it is annoying that FreeCad does not set the objects that will form the sweep to INVISIBLE automaticly.
That means we have to do that with the correct commands...
*/
counter=0;
for(x=0.0;x<Length; x+=Step)
{
fprintf(outfile,"Gui.getDocument('NoseCone').getObject(\"Circle%i\").Visibility=False\n",counter);
counter++;
}
/*
Now comes the second part, the sweep that will remove the inner flesh from the nose cone.
Essentially its the same algorythm as before but of course with the radius to be the inner radius of the cone
*/
fprintf(outfile,"App.setActiveDocument(\"NoseCone\")\n");
fprintf(outfile,"App.ActiveDocument=App.getDocument(\"NoseCone\")\n");
fprintf(outfile,"Gui.ActiveDocument=Gui.getDocument(\"NoseCone\")\n");

counter=0;
for(x=Thick;x<Length; x+=Step)
{
phy=acos(1-(2*x)/Length);
y = (Radius/sqrt(3.1415))*sqrt(phy - (sin(2*phy)/2));
if (y == 0)
y = 0.1;
fprintf(outfile,"Gui.activateWorkbench(\"SketcherWorkbench\")\n");
fprintf(outfile,"App.activeDocument().addObject('Sketcher::SketchObject','SubCircle%i')\n",counter);
fprintf(outfile,"App.activeDocument().SubCircle%i.Placement=App.Placement(App.Vector(0,0,%f),App.Rotation(0,0,0,1))\n",counter,x);
fprintf(outfile,"Gui.activeDocument().setEdit('SubCircle%i')\n",counter);
fprintf(outfile,"App.ActiveDocument.SubCircle%i.addGeometry(Part.Circle(App.Vector(0,0,0),App.Vector(0,0,1),%f),False)\n",counter,y);
counter++;
}
fprintf(outfile,"App.activeDocument().addObject('Sketcher::SketchObject','SubPath')\n");
fprintf(outfile,"App.activeDocument().SubPath.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(-0.707107,0.000000,0.000000,-0.707107))\n");
fprintf(outfile,"Gui.activeDocument().setEdit('SubPath')\n");
fprintf(outfile,"App.ActiveDocument.SubPath.addGeometry(Part.Line(App.Vector(0.000000,-0.000000,0),App.Vector(0,%f)),False)\n",Length);
fprintf(outfile,"App.ActiveDocument.recompute\n");

fprintf(outfile,"Gui.getDocument('NoseCone').resetEdit()\n");
fprintf(outfile,"App.getDocument('NoseCone').recompute()\n");
fprintf(outfile,"Gui.activateWorkbench(\"PartWorkbench\")\n");
fprintf(outfile,"Gui.SendMsgToActiveView(\"ViewFit\")\n");
fprintf(outfile,"from FreeCAD import Base\n");
fprintf(outfile,"import Part\n");
fprintf(outfile,"App.getDocument('NoseCone').addObject('Part::Sweep','SubSweep')\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Sections=\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Spine=(App.ActiveDocument.SubPath,)\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Solid=True\n");
fprintf(outfile,"App.getDocument('NoseCone').ActiveObject.Frenet=False\n");
fprintf(outfile,"App.ActiveDocument.recompute()\n");
fprintf(outfile,"Gui.getDocument('NoseCone').getObject(\"SubPath\").Visibility=False\n");
counter=0;
for(x=Thick;x<Length; x+=Step)
{
fprintf(outfile,"Gui.getDocument('NoseCone').getObject(\"SubCircle%i\").Visibility=False\n",counter);
counter++;
}
fprintf(outfile,"App.activeDocument().addObject(\"Part::Cut\",\"Cut\")\n");
fprintf(outfile,"App.activeDocument().Cut.Base = App.activeDocument().Sweep\n");
fprintf(outfile,"App.activeDocument().Cut.Tool = App.activeDocument().SubSweep\n");
fprintf(outfile,"Gui.activeDocument().Sweep.Visibility=False\n");
fprintf(outfile,"Gui.activeDocument().SubSweep.Visibility=False\n");
fprintf(outfile,"Gui.ActiveDocument.Cut.ShapeColor=Gui.ActiveDocument.Sweep.ShapeColor\n");
fprintf(outfile,"Gui.ActiveDocument.Cut.DisplayMode=Gui.ActiveDocument.Sweep.DisplayMode\n");
fprintf(outfile,"App.ActiveDocument.recompute()\n");
printf("We just created two sweeps with %i circles each\n",counter);
}

-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641894 [Alter Beitrag11. Januar 2018 um 01:14]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Das Ergebnis:

-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
Oliver Arend

Administrator


Administrator

Oliver Arend

Registriert seit: Aug 2000

Wohnort: Bremen

Verein: RMV / TRA #8311 L1 / Solaris

Beiträge: 7689

Status: Offline

Beitrag 7641895 [Alter Beitrag11. Januar 2018 um 09:09]

[Melden] Profil von Oliver Arend anzeigen    Oliver Arend eine private Nachricht schicken   Oliver Arend besitzt keine Homepage    Mehr Beiträge von Oliver Arend finden

Oha ;-) Aber schön zu sehen dass FreeCAD eingesetzt wird, das hat m. E. ein relativ gutes CAM-Modul für 2,5D und 3D.

Verstehe ich das richtig dass Du einen Sweep/Loft, also eine Fläche mit Mehrfachschnitten, erzeugst? Warum nicht einfach die Kontur der Spitze und dann einen Rotationskörper? Leider kann FreeCAD keine "normalen" Splines, zumindest bräuchte man damit oder auch mit B-Splines sicher deutlich weniger Kontrollpunkte.

Oliver

Wo das Volk die Regierung fürchtet, herrscht Tyrannei. Wo die Regierung das Volk fürchtet, herrscht Freiheit. -- Thomas Jefferson
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641898 [Alter Beitrag11. Januar 2018 um 09:36]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Das ist einfach zu erklären, ich weiss nicht, wie man eine Karman hüll-linie zeichnet, zumindest nicht so, dass das rendering nicht eckig aussieht.
So blieb eigentlich nur der Sweep.
Und ja, bsplines wären besser. Vielleicht in irgend einer späteren Version...

Ich lasse mich übrigens gerne vom Besseren überzeugen &#9786;Ich arbeite nur ab und zu mit CAD systemen, bin also sicherlich kein Experte

Mathias

Geändert von Prefect123 am 11. Januar 2018 um 09:38


-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
Oliver Arend

Administrator


Administrator

Oliver Arend

Registriert seit: Aug 2000

Wohnort: Bremen

Verein: RMV / TRA #8311 L1 / Solaris

Beiträge: 7689

Status: Offline

Beitrag 7641901 [Alter Beitrag11. Januar 2018 um 14:02]

[Melden] Profil von Oliver Arend anzeigen    Oliver Arend eine private Nachricht schicken   Oliver Arend besitzt keine Homepage    Mehr Beiträge von Oliver Arend finden

Das ist normal, dass die Kanten von Rotationskörpern leicht eckig dargestellt werden. Intern sind sie aber ideal rund. Das erkennst Du daran, dass die Flächen selbst keine Kanten o. ä. aufweisen.



Oliver

Wo das Volk die Regierung fürchtet, herrscht Tyrannei. Wo die Regierung das Volk fürchtet, herrscht Freiheit. -- Thomas Jefferson
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641908 [Alter Beitrag11. Januar 2018 um 22:45]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Wie hast Du die Hüllkurve erzeugt?
Polygon? Zusammengesetzt aus Linien und Ellipse?

das von Karman Profil kann ich nur als Polygonzug abbilden und die Strecke zwischen zwei Eckpunkten wird damit als Linie erzeugt. Je nach Auflösung erhält man also eine mehr oder weniger grobe "Treppe".

Beim Sweepen wird die Hülle jedoch als Kurvenstück (oder ähnliches) und nicht als Linie interpoliert. Daher ist da keine Treppe zu finden.

Das Rendern selbst ist eine andere Sache, da hatte ich mich vielleicht falsch ausgedrückt, sorry.
Mathias

-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
Oliver Arend

Administrator


Administrator

Oliver Arend

Registriert seit: Aug 2000

Wohnort: Bremen

Verein: RMV / TRA #8311 L1 / Solaris

Beiträge: 7689

Status: Offline

Beitrag 7641912 [Alter Beitrag11. Januar 2018 um 23:17]

[Melden] Profil von Oliver Arend anzeigen    Oliver Arend eine private Nachricht schicken   Oliver Arend besitzt keine Homepage    Mehr Beiträge von Oliver Arend finden

Ich habe die Kurve als B-Spline angelegt (das im Bild soll im Übrigen keine Von-Karman-/Haack-Spitze sein). Das gibt mit Sicherheit nicht die exakte Kurve wieder, aber für unsere Zwecke sollte es nah genug sein. Leider legt man dafür in FreeCAD Kontrollpunkte an, durch die die Kurve nachher nicht durchläuft, deshalb wird es wohl etwas schwierig, die Kurve dadurch gut anzunähern.

Oliver

Wo das Volk die Regierung fürchtet, herrscht Tyrannei. Wo die Regierung das Volk fürchtet, herrscht Freiheit. -- Thomas Jefferson
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641913 [Alter Beitrag11. Januar 2018 um 23:25]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Ah, ok.
Dummerweise gehen bsplines bei meiner Implementation nicht, wie überhaupt die Workbenches draft und arch. Es fehlt ein pivy modul für python2 und freecad weigert sich python3 zu verwenden.
Bplines sollten zwar seit Februar 2017 auch im Sketcher verwendbar sein, aber bei mir finde ich das nicht (Version 0.16, opensuse).
Und selber compilieren habe ich nun wirklich keine lust zu...

Mathias

-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
Oliver Arend

Administrator


Administrator

Oliver Arend

Registriert seit: Aug 2000

Wohnort: Bremen

Verein: RMV / TRA #8311 L1 / Solaris

Beiträge: 7689

Status: Offline

Beitrag 7641914 [Alter Beitrag12. Januar 2018 um 00:23]

[Melden] Profil von Oliver Arend anzeigen    Oliver Arend eine private Nachricht schicken   Oliver Arend besitzt keine Homepage    Mehr Beiträge von Oliver Arend finden

FreeCAD 0.16 kann man in der Pfeife rauchen, ab 0.17 ist es ganz brauchbar. Bei mir läuft es unter Linux Mint 17.1, Windows 7 und Windows 10 ziemlich gut.

Ich würde außerdem nur im Part Design arbeiten (nicht zu verwechseln mit Part), von da aus gelangt man ja direkt in den Sketcher. Draft brauchst Du m. W. nur für richtige Zeichnungen, habe ich noch nicht mit gearbeitet.

Oliver

Geändert von Oliver Arend am 12. Januar 2018 um 00:24


Wo das Volk die Regierung fürchtet, herrscht Tyrannei. Wo die Regierung das Volk fürchtet, herrscht Freiheit. -- Thomas Jefferson
Prefect123

Raketenbauer

Prefect123

Registriert seit: Jul 2014

Wohnort: Darmstadt

Verein: AG-M, TRA 10915

Beiträge: 169

Status: Offline

Beitrag 7641916 [Alter Beitrag12. Januar 2018 um 01:21]

[Melden] Profil von Prefect123 anzeigen    Prefect123 eine private Nachricht schicken   Besuche Prefect123's Homepage    Mehr Beiträge von Prefect123 finden

Nope,
bekomme .17 nicht zum Laufen, zumindest nicht mit Python3 und das ist bei mir notwendig um Pivy zu nutzen :-(

-----
TRA L3 TAP-Member
Viele Leute sterben mit 25, werden aber erst mit 75 beerdigt. (B. Franklin).
--- Ich bleibe lieber 15 ----
Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für:
“Und was solltest Du eigentlich machen?”.
[Zurück zum Anfang]
Du kannst keine neue Antwort schreiben