Der Arbeitsablauf für die grafische Benutzerschnittstelle für den Arbeitsbereich Drawing ist begrenzt, daher ist die Skript-API interessanter.
Zuallererst braucht man das Part- und das Drawing-Modul:
import FreeCAD, Part, Drawing
Man erstellt ein kleines Beispiel-Teil
Part.show(Part.makeBox(100,100,100).cut(Part.makeCylinder(80,100)).cut(Part.makeBox(90,40,100)).cut(Part.makeBox(20,85,100)))
Direkte Projektion. Das G0 bedeutet harte Kante, der G1 ist dauernde Tangente.
Shape = App.ActiveDocument.Shape.Shape
[visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape)
print "visible edges:", len(visibleG0.Edges)
print "hidden edges:", len(hiddenG0.Edges)
Alles wird auf der Z-Ebene projiziert:
print "Bnd Box shape: X=",Shape.BoundBox.XLength," Y=",Shape.BoundBox.YLength," Z=",Shape.BoundBox.ZLength
print "Bnd Box project: X=",visibleG0.BoundBox.XLength," Y=",visibleG0.BoundBox.YLength," Z=",visibleG0.BoundBox.ZLength
Anderer Projektions-Vektor
[visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape,App.Vector(1,1,1))
Projekt zu SVG
resultSVG = Drawing.projectToSVG(Shape,App.Vector(1,1,1))
print resultSVG
Den Körper erstellen
import FreeCAD
import Part
import Drawing
# Create three boxes and a cylinder
App.ActiveDocument.addObject("Part::Box","Box")
App.ActiveDocument.Box.Length=100.00
App.ActiveDocument.Box.Width=100.00
App.ActiveDocument.Box.Height=100.00
App.ActiveDocument.addObject("Part::Box","Box1")
App.ActiveDocument.Box1.Length=90.00
App.ActiveDocument.Box1.Width=40.00
App.ActiveDocument.Box1.Height=100.00
App.ActiveDocument.addObject("Part::Box","Box2")
App.ActiveDocument.Box2.Length=20.00
App.ActiveDocument.Box2.Width=85.00
App.ActiveDocument.Box2.Height=100.00
App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
App.ActiveDocument.Cylinder.Radius=80.00
App.ActiveDocument.Cylinder.Height=100.00
App.ActiveDocument.Cylinder.Angle=360.00
# Fuse two boxes and the cylinder
App.ActiveDocument.addObject("Part::Fuse","Fusion")
App.ActiveDocument.Fusion.Base = App.ActiveDocument.Cylinder
App.ActiveDocument.Fusion.Tool = App.ActiveDocument.Box1
App.ActiveDocument.addObject("Part::Fuse","Fusion1")
App.ActiveDocument.Fusion1.Base = App.ActiveDocument.Box2
App.ActiveDocument.Fusion1.Tool = App.ActiveDocument.Fusion
# Cut the fused shapes from the first box
App.ActiveDocument.addObject("Part::Cut","Shape")
App.ActiveDocument.Shape.Base = App.ActiveDocument.Box
App.ActiveDocument.Shape.Tool = App.ActiveDocument.Fusion1
# Hide all the intermediate shapes
Gui.ActiveDocument.Box.Visibility=False
Gui.ActiveDocument.Box1.Visibility=False
Gui.ActiveDocument.Box2.Visibility=False
Gui.ActiveDocument.Cylinder.Visibility=False
Gui.ActiveDocument.Fusion.Visibility=False
Gui.ActiveDocument.Fusion1.Visibility=False
Ein Seitenobjekt einfügen und eine Schablone zuweisen
App.ActiveDocument.addObject('Drawing::FeaturePage','Page')
App.ActiveDocument.Page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Landscape.svg'
Eine Sicht auf das "Shape"-Objekt erstellen, die Position und Größe festlegen und es einer Seite zuweisen
App.ActiveDocument.addObject('Drawing::FeatureViewPart','View')
App.ActiveDocument.View.Source = App.ActiveDocument.Shape
App.ActiveDocument.View.Direction = (0.0,0.0,1.0)
App.ActiveDocument.View.X = 10.0
App.ActiveDocument.View.Y = 10.0
App.ActiveDocument.Page.addObject(App.ActiveDocument.View)
Eine zweite Ansicht auf demselben Objekt erstellen, aber dieses Mal wird die Ansicht um 90° gedreht.
App.ActiveDocument.addObject('Drawing::FeatureViewPart','ViewRot')
App.ActiveDocument.ViewRot.Source = App.ActiveDocument.Shape
App.ActiveDocument.ViewRot.Direction = (0.0,0.0,1.0)
App.ActiveDocument.ViewRot.X = 290.0
App.ActiveDocument.ViewRot.Y = 30.0
App.ActiveDocument.ViewRot.Scale = 1.0
App.ActiveDocument.ViewRot.Rotation = 90.0
App.ActiveDocument.Page.addObject(App.ActiveDocument.ViewRot)
Eine dritte Sicht auf das gleiche Objekt erstellen, aber mit einer isometrischen Ansichts-Richtung. Die verborgenen Linien sind auch aktiviert.
App.ActiveDocument.addObject('Drawing::FeatureViewPart','ViewIso')
App.ActiveDocument.ViewIso.Source = App.ActiveDocument.Shape
App.ActiveDocument.ViewIso.Direction = (1.0,1.0,1.0)
App.ActiveDocument.ViewIso.X = 335.0
App.ActiveDocument.ViewIso.Y = 140.0
App.ActiveDocument.ViewIso.ShowHiddenLines = True
App.ActiveDocument.Page.addObject(App.ActiveDocument.ViewIso)
Etwas ändern und aktualisieren. Der Aktualisierungsprozess ändert die Ansicht und die Seite.
App.ActiveDocument.View.X = 30.0
App.ActiveDocument.View.Y = 30.0
App.ActiveDocument.View.Scale = 1.5
App.ActiveDocument.recompute()
Das SVG-Fragment einer einzelnen Ansicht holen
ViewSVG = App.ActiveDocument.View.ViewResult
print ViewSVG
Die gesamte Ergebnisseite abrufen (es handelt sich um eine Datei im temporären Verzeichnis des Dokuments, nur Leserechte).
print "Resulting SVG document: ",App.ActiveDocument.Page.PageResult
file = open(App.ActiveDocument.Page.PageResult,"r")
print "Result page is ",len(file.readlines())," lines long"
Wichtig: Die Datei freigeben!
del file
Eine Ansicht mit eigenem Inhalt einfügen:
App.ActiveDocument.addObject('Drawing::FeatureView','ViewSelf')
App.ActiveDocument.ViewSelf.ViewResult = """<g id="ViewSelf"
stroke="rgb(0, 0, 0)"
stroke-width="0.35"
stroke-linecap="butt"
stroke-linejoin="miter"
transform="translate(30,30)"
fill="#00cc00"
>
<ellipse cx="40" cy="40" rx="30" ry="15"/>
</g>"""
App.ActiveDocument.Page.addObject(App.ActiveDocument.ViewSelf)
App.ActiveDocument.recompute()
del ViewSVG
Das führt zu folgendem Ergebnis:
See also: Drawing Dimensioning Addon
Die Zeichnungsmaße und Toleranzen befinden sich noch in der Entwicklung, aber mit etwas Aufwand können bereits einige grundlegende Funktionen benutzt werden.
Zuerst muss das Python-Modul gdtsvg von hier heruntergeladen werden (ACHTUNG: Dies kann jederzeit nicht mehr funktionieren!):
https://github.com/jcc242/FreeCAD
Um einen Feature-Kontrollrahmen zu erhalten, versucht man Folgendes:
import gdtsvg as g # Import the module, I like to give it an easy handle
ourFrame = g.ControlFrame("0","0", g.Perpendicularity(), ".5", g.Diameter(), g.ModifyingSymbols("M"), "A",
g.ModifyingSymbols("F"), "B", g.ModifyingSymbols("L"), "C", g.ModifyingSymbols("I"))
Hier findet man eine gute Übersicht über den Inhalt eines Feature Control Frame: http://www.cadblog.net/adding-geometric-tolerances.htm
Die an den Steuerungsrahmen zu übergebenden Parameter sind:
Die Funktion ControlFrame gibt einen Typ zurück, der Folgendes enthält: (SVG-Zeichenfolge, Gesamtbreite des Steuerungsrahmens, Gesamthöhe des Steuerungsrahmens)
Um eine Bemassung zu erhalten, probiert man Folgendes aus:
import gdtsvg
ourDimension = linearDimension(point1, point2, textpoint, dimensiontext, linestyle=getStyle("visible"),
arrowstyle=getStyle("filled"), textstyle=getStyle("text")
Eingaben für lineare Bemaßungen sind:
Mit diesen beiden kann man wie oben beschrieben vorgehen, um sie auf der Zeichnungsseite anzuzeigen. Dieses Modul ist sehr fehlerhaft und kann jederzeit ausfallen. Fehlermeldungen sind vorerst auf der GitHub-Seite willkommen, oder man wendet sich an jcc242 in den Foren, wenn man einen Fehler an anderer Stelle melden möchte.