Środowisko pracy Kreślenie
Moduł Rysunku (Drawing) pozwala na przeniesienie twojej pracy 3D na papier. To znaczy na umieszczenie rzutów twoich modeli 3D w oknie 2D i wstawienie tego okna do rysunku, np. arkusza z ramką, tytułem i twoim logo oraz ostatecznie na wydrukowanie tego arkusza. Moduł Drawing aktualnie jest w czasie konstrukcji i jest mniej lub bardziej przeglądem technologii!
Narzędzia interfejsu użytkownika
Na ilustracji możesz zobaczyć główne koncepcje modułu Rysunku.In the picture you see the main concepts of the Drawing module. Dokument zawiera obiekt kształtu (Schenkel), który musimy wypakować na rysunek. Wtedy "Page" (strona) jest tworzona. Strona dostaje instancję przez szablon, w tym przypadku przez szablon "A3_Landscape". Szablon jest dokumentem SVG, który przechowuje ramkę strony, logo czy twoje standardy wyświetlania.
Na tej stronie możemy wstawić jeden lub więcej rzutów. Każdy rzut posiada pozycję na stronie (Properties X,Y), współczynnik skali (Property scale) i dodatkowe właściwości. Za każdym razem kiedy strona lub rzut lub obiekt referencyjny się zmieniająją strona jest regenerowana i wyświetlanie jest uaktualniane.
Skryptowanie
Aktualnie funkcjonalność graficznego interfejsu użytkownika jest bardzo ograniczona, więc API skryptowania jest bardziej interesujące. Poniże znajdują się przykłady jak używać API skryptowania w module rysunku.
Prosty przykład
Po pierwsze potrzebujesz modułu Części (Part) i Rysunku (Drawing):
import FreeCAD, Part, Drawing
Stworzenie małej przykładowej części
Part.show(Part.makeBox(100,100,100).cut(Part.makeCylinder(80,100)).cut(Part.makeBox(90,40,100)).cut(Part.makeBox(20,85,100)))
Projekcja bezpośrednia. G0 oznacza ostrą krawędź, G1 ciągłą styczną.
Shape = App.ActiveDocument.Shape.Shape [visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape) print "visible edges:", len(visibleG0.Edges) print "hidden edges:", len(hiddenG0.Edges)
Wszystko jest rzutowane na płaszczyznę Z:
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
Różny wektor projekcji
[visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape,Base.Vector(1,1,1))
Projekt SVG
resultSVG = Drawing.projectToSVG(Shape,App.Vector(1,1,1)) print resultSVG
Metoda parametryczna
Create the body
# 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
Insert a Page object and assign a template
App.activeDocument().addObject('Drawing::FeaturePage','Page') App.activeDocument().Page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Landscape.svg'
Create a view on the "Shape" object, define the position and scale and assign it to a Page
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)
Create a second view on the same object but this time the view will be rotated by 90 degrees.
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)
Create a third view on the same object but with an isometric view direction. The hidden lines are activated too.
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)
Change something and update. The update process changes the view and the page.
App.activeDocument().View.X = 30.0 App.activeDocument().View.Y = 30.0 App.activeDocument().View.Scale = 1.5 App.activeDocument().recompute()
Accessing the bits and pieces
Get the SVG fragment of a single view
ViewSVG = App.activeDocument().View.ViewResult print ViewSVG
Get the whole result page (it's a file in the document's temporary directory, only read permission)
print "Resulting SVG document: ",App.activeDocument().Page.PageResult file = open(App.activeDocument().Page.PageResult,"r") print "Result page is ",len(file.readlines())," lines long"
Important: free the file!
del file
Insert a view with your own content:
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 Shape,ViewSVG, resultSVG
That leads to the following result:
Templates
FreeCAD comes bundled with a set of default templates, but you can find more on the Drawing templates page.