Automatisch UniProKit-Library generieren

Hi,

nach meinen kürzlichen Versuchen, mittels OpenSCAD die Uniprokit-Bauteile parametrisch via Script zu generieren, hab ich mir jetzt auch mal FreeCAD vorgeknöpft.

Mit dem nachfolgenden Python-Script (in FreeCAD als Macro einbinden) kann man vollautomatisch die Winkel in allen beliebigen (d.h., durch 20 teilbaren) Längen erzeugen.

Dabei werden die Bauteile dann noch jeweils einzeln exportiert, und zwar als .stl, .stp und .iges-Dateiformat. Diverse weitere Formate wie .svg, .wrl, .dxf und viele mehr, wären ebenfalls möglich.

Hier das Script:

# Macro Begin: /mydir/upklib/base_struk/upk_winkel.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++
import FreeCAD
from FreeCAD import Base
import Part,PartGui 
import ImportGui
import Mesh

doc=FreeCAD.newDocument()

# sizes = [20, 40, 60, 80, 120, 160, 240, 320, 640]
sizes = [20, 40, 60, 80]
#
for i in sizes:

#*********************************************************
# - Erzeugung eines Winkel-Objektes mit allen Bohrungen
	# - Speicherung als .stl- und stp-Datei
	#*********************************************************
	partlen = i
	partsize = partlen / 20

	# Rohwinkel
	myrawblock = Part.makeBox(20,partsize*20,20)
	mycutblock = Part.makeBox(17,partsize*20,17,Base.Vector(3,0,3))
	myangle = myrawblock.cut(mycutblock)
	angleobj = doc.addObject("Part::Feature","upk_angle"+str(i))
	angleobj.Shape = myangle

	# Bohrloecher
	for n in range(partsize):
		# Erzeuge Bohrloch1
		mycuthole = Part.makeCylinder(2.5,20, Base.Vector(10,((n+1)*20)-10,-8))
		myangle = myangle.cut(mycuthole)
		angleobj.Shape = myangle
		# Erzeuge Bohrloch2
		mycuthole = Part.makeCylinder(2.5,20, Base.Vector(0,0,0))
		mycuthole.rotate(Base.Vector(0,0,0),Base.Vector(0,1,0),90)
		mycuthole.translate(Base.Vector(-10,((n+1)*20)-10,10))
		myangle = myangle.cut(mycuthole)
		angleobj.Shape = myangle

	# Bewege neuerzeugtes Winkelobjekt etwas zur Seite
	pl = FreeCAD.Placement()
	pl.move(FreeCAD.Vector(partsize*30,0,0))
	angleobj.Placement = pl

	# Export .stl
	__objs__=[]
	__objs__.append(FreeCAD.getDocument("Unnamed").getObject("upk_angle"+str(i)))
	Mesh.export(__objs__,"/mydir/upklib/base_struk/upk_angle"+str(i)+".stl")
	del __objs__

	# Export .stp
	__objs__=[]
	__objs__.append(FreeCAD.getDocument("Unnamed").getObject("upk_angle"+str(i)))
	ImportGui.export(__objs__,"/mydir/upklib/base_struk/upk_angle"+str(i)+".stp")
	del __objs__

	# Export .iges
	__objs__=[]
	__objs__.append(FreeCAD.getDocument("Unnamed").getObject("upk_angle"+str(i)))
	Part.export(__objs__,"/mydir/upklib/base_struk/upk_angle"+str(i)+".iges")
	del __objs__


Gui.activeDocument().activeView().viewAxometric()
Gui.SendMsgToActiveView("ViewFit")
doc.recompute()

# Macro End: /mydir/upklib/base_struk/upk_winkel.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++




Der Spass hat mich jetzt drei Tage gekostet um mich im FreeCAD-Scripting etwas zurechtzufinden, aber ich denke mal, das wars wert, weil sich damit einige gute Möglichkeiten ergeben. Die große Herausforderung (und damit der nächste Schritt) besteht nun darin, zu jedem einzelnen Bauteil noch die passende Fertigungszeichnung mit drei 2D- und einer 3D-Ansicht zu generieren und das Ganze zu bemaßen und beschriften.

Gruss, Oliver

Automatisierung!!! :slight_smile: Genau das mache ich mit meine Frontend Softwareentwicklung!

Das hat sich wahrlich gelohnt, Kollege!! Das ist ein Durchbruch! Ohne Automatisierung ist das Prozedere nur langwierig. Das ist jetzt Schnee von gestern. Und lässt sich noch auf andere Teile erweitern. Weiter so.

Hi.

Nach längerer Frickelei hab ichs jetzt geschafft rauzukriegen, wie man mit FreeCad brauchbare 2D-Zeichnungen hinkriegen kann.

Hier der Link zur Darstellung in Originalgröße (A4): http://wiki.opensourceecology.de/images/f/fc/Mountplate1b.png
bzw. als .pdf: http://wiki.opensourceecology.de/images/9/95/Mountplate1b.pdf

Wichtigste Erkenntnis dabei:

Auch wenn das drawing-Modul noch nicht für Bemaßungen funktioniert bzw. letzteres in der offiziellen Version implementiert hat, so gibt es noch einen anderen Weg, nämlich über das Draft Modul. Hier kann man ganz regulär Bemassungen im 3D-Space erzeugen und diese sinnvollerweise coplanar zu einer der Hauptebenen (zB. XY-Ebene) anlegen und anschliessend alles in das 2D-Sheet projizieren.

Einziger Nachteil dabei: Manches, d.h., insbesondere die genaue Positionierung von Dimensionen muss ev. noch von Hand angepasst werden, aber das muss man zB. für die Position der einzelnen Ansichten auf dem 2D-Sheet ohnehin tun.

Bonus: Die obige Zeichnung wurde komplett und ausschliesslich per Script erstellt, d.h. inclusive

  • Erzeugung der Bauteile im 3D-Space
  • Erzeugung der Bemaßung im 3D-Space
  • Projektion der Ansichten auf die 2D-Ebene (allerdings mit manuell ermittelten Positionierungsangaben)

Weiterer Bonus: Ich habe die Darstellung des Drawing-Templates (den Zeichnungsrahmen mit Schriftfeld) angepasst, oder besser komplett überarbeitet, was ziemlich aufwendig war. D.h., prinzipiell kann man ein beliebiges .svg verwenden, welches z.B. mit Incscape erstellt oder verändert wurde, allerdings gab es dabei verschiedene Probleme mit Darstellungsfehlern, so dass ich im Endeffekt das ganze .svg-Template nochmal überarbeitet bzw. von Hand codiert habe, damit ist es auch schlanker und stabiler. (Der Unterschied ist so ähnlich wie wenn ich z.B. HTML-Code durch ein Editor-Tool automatisch generieren lasse (aufgebläht, unübersichtlich, fehlerträchtig) oder eben von Hand codiere.)

Dabei habe ich die Inhalte der einzelnen Schriftfelder in dem .svg-Template diesmal noch hartverdrahtet. Der nächste Schritt bestünde nun darin, jene Felder, die sich je nach Bauteil ständig ändern, leer zu lassen und nur Dinge wie „Legal Owner: OSE Germany“ und die Logos im Template zu belassen. Die veränderlichen Einträge müssten dann jeweils durch das FreeCad-Script im 2D-Sheet eingesetzt werden. Ich stelle mir das so vor, dass man etwa ganz oben im Script ein paar „globale“ String-Variablen definiert, wo man zB. die Bauteilbezeichung und BauteilNr. einträgt, und die dann bei der Generierung des 2D-Sheets automatisch in das Schriftfeld eingesetzt werden.

Gruss, Oliver

Wow, das sind prima Neuigkeiten! Alles automatisch bis auf den Text und die Positionierung - Donnerwetter!

SVG ist XMl, man könnte also einen Parser anwerfen, dann TEMPLATE Variablen (die man händisch einmalig eintragen müsste) mit dem Inhalt deiner globalen Variablen ersetzen. Ginge auch ohne Parser, dann müssten wir:

  • svg-Datei öffnen.
  • Die Variablen mittels reglären Ausdruck ersetzen.
  • Speichern.

Alles in Python.

Danke für deine Offensiven. Fehlt nur noch, dass wir endlich ein paar Durchbrüche in unseren Energieforschungen hinbekommen.

Hi Jan,

Ist so kompliziert gar nicht nötig, zum einen ist die .svg-Datei klein und nach meiner Überarbeitung übersichtlich genug, um ggflls. was mit nem normalen Editor zu ändern.

Aber zweitens wars auch gar nicht so gedacht, was ich meinte war eher: Die jetzige .svg-Datei wird an den Stellen, wo veränderliche Werte stehen geblankt, aber an den Feldern wo Dinge wie Logo usw. stehen, so belassen. Ab da kann diese Datei dann als „Blanko-Template mit OSEG-Kopf“ verwendet werden, d.h., bei entsprechender Pfadeinstellung verwendet Free4Cad dieses Template automatisch, sobald eine Zeichnungs-page generiert wird.

Dabei legt FreeCad eine zunächst identische Kopie im /tmp Verzeichniss an, in welcher nun die Zeichnungen, Maße usw. von FreeCad eingefügt werden, also z.B. via Script (oder manuell).

Sowohl vom Script aus, als auch nauell über den Button „Annotations“, kann man mit FreeCad aber auch freien Text an einer beliebigen Position einfügen.

Und das würde ich verwenden, um die vorher im Script-Kopf übersichtlich eingetragenen (bzw. in einer Variablen abgelegten) veränderlichen Werte wie Maßstab, Datum, Bauteil-Nr. usw. an vordefinierten Positionen zu setzen, also eben so, dass jeweils das richtige Ding an genau der passenden Stelle im Schriftfeld eingesetzt wird. Sowas könnte man zB. als kleines eigenständiges Script bzw. Macro gestalten, welches einbindbar ist.

Also weiter nix Dolles, bei der ganzen Sache war der Hauptknackpunkt, dass ich vorher das .svg-Template mittels Incscape (.svg-Editor) interaktiv gestaltet (bzw. beschriftet) hatte, aber diese Version von FreeCad als Template nicht richtig geladen oder angezeigt werden konnte, und jetzt mit dem überarbeiteten .svg-Template aber schon, so dass wir nun auch ein Template nach unseren Wünschen und mit OSE-Logo verwenden können (anstatt, wie vorher nur das Standard-template mit dem FreeCad-Logo).

Danke für deine Offensiven. Fehlt nur noch, dass wir endlich ein paar Durchbrüche in unseren Energieforschungen hinbekommen.

Ja. Was immer noch aussteht ist ein Test mit verschiedenen Luftkathoden, die ich hier liegen habe. Auf dem Makerfaire-Bild

kannst Du links unten einen Messaufbau sehen mit drei Zellen, wobei ich für den Rahmenbau das UniProKit verwendet habe. So oder so ähnlich könnte das aussehen und man bekommt auch schon einen kleinen Eindruck davon, wie ein späterer Zell-Stack grob aussehen könnte. :wink:

Und ich mache mir bereits Gedanken wie der nächste Zell-Prototyp aussehen könnte. Aber um den zu entwickeln brauch ich CAD-Darstellungen, darum war für mich jetzt erstmal wichtig, einen Einstieg in FreeCAD und Blender zu finden. Und was aktuell für mich noch vorranig Priorität hat, das ist die Entwicklung der Slider-Elemente und das Linear-Triebs, wofür ich ebenfalls CAD brauche.

Gruss, Oliver