Autor | Thema |
---|---|
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641893
, FreeCAD und von Karman Spitzen
[11. Januar 2018 um 01:13]
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> 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 Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641894
[11. Januar 2018 um 01:14]
Das Ergebnis:
----- TRA L3 TAP-Member Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |
Oliver Arend
Administrator
Registriert seit: Aug 2000 Wohnort: Great Falls, VA, USA Verein: RMV/Solaris/AGM/TRA L1/TCV/MDRA/NOVAAR Beiträge: 8351 Status: Offline |
Beitrag 7641895
[11. Januar 2018 um 09:09]
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 |
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641898
[11. Januar 2018 um 09:36]
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 ☺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 Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |
Oliver Arend
Administrator
Registriert seit: Aug 2000 Wohnort: Great Falls, VA, USA Verein: RMV/Solaris/AGM/TRA L1/TCV/MDRA/NOVAAR Beiträge: 8351 Status: Offline |
Beitrag 7641901
[11. Januar 2018 um 14:02]
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 |
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641908
[11. Januar 2018 um 22:45]
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 Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |
Oliver Arend
Administrator
Registriert seit: Aug 2000 Wohnort: Great Falls, VA, USA Verein: RMV/Solaris/AGM/TRA L1/TCV/MDRA/NOVAAR Beiträge: 8351 Status: Offline |
Beitrag 7641912
[11. Januar 2018 um 23:17]
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 |
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641913
[11. Januar 2018 um 23:25]
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 Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |
Oliver Arend
Administrator
Registriert seit: Aug 2000 Wohnort: Great Falls, VA, USA Verein: RMV/Solaris/AGM/TRA L1/TCV/MDRA/NOVAAR Beiträge: 8351 Status: Offline |
Beitrag 7641914
[12. Januar 2018 um 00:23]
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 |
Prefect123
Epoxy-Meister Registriert seit: Jul 2014 Wohnort: Bangor Verein: AG-M, TRA 10915, NSWRA, Tripoli NSW Beiträge: 269 Status: Offline |
Beitrag 7641916
[12. Januar 2018 um 01:21]
Nope,
bekomme .17 nicht zum Laufen, zumindest nicht mit Python3 und das ist bei mir notwendig um Pivy zu nutzen :-( ----- TRA L3 TAP-Member Erste Regel der Fehlersuche: Verschwende keine Zeit, hole einen groesseren Hammer. Bei Facebook fehlt unter dem Eingabefeld “Was machst du gerade?” noch ein weiteres für: “Und was solltest Du eigentlich machen?”. |