Drawing Module/cn

绘图模块允许将你的 3D 工作放到图纸上. 也就是，将你的模型视图放入一个 2D 窗口，并将绘图嵌入窗口中. 比如，一张有边界、标题和图标的图纸，最终可将图纸打印出来. 绘图模块目前正在设计当中，现在或多或少只是个技术概览.

GUI 工具


图片中呈现出了绘图模块的主要概念. 该文档中包含了一个形状对象（Schenkel），将其解压可以得到一幅制图. 因此，我们创建了一个“页面”. 通过模板来示例这个页面，在这个例子中，模板为“横版A3”版面. 这个模板是一个包含了一般页面框架、图标或者遵循了显示标准的 SVG（可伸缩向量图形）文件. 在这个页面中我们可以插入一个或多个视图. 每个视图在页面中都具有一个位置（X、Y 属性）、一个比例因素（比例属性）和其他的属性. 每次页面、视图、或者引用的对象发生改变，页面将会重新生成，其显示将会更新.

脚本编程
由于终端用户（GUI）可实现的操作有限，所以脚本 API 将更加有趣. 下面我们将通过例子来了解如何使用绘图模块的脚本 API 功能.

简单示例
首先，你需要零件和绘图模块： import FreeCAD, Part, Drawing 创建一个小的样本零件 Part.show(Part.makeBox(100,100,100).cut(Part.makeCylinder(80,100)).cut(Part.makeBox(90,40,100)).cut(Part.makeBox(20,85,100)))

方向投影. G0 表示轮廓鲜明的边，G1 表示切线连续. Shape = App.ActiveDocument.Shape.Shape [visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape) print "visible edges:", len(visibleG0.Edges) print "hidden edges:", len(hiddenG0.Edges) 所有的都被投影到 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 不同的投影向量 [visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape,App.Vector(1,1,1)) 投影成可伸缩向量的图形 resultSVG = Drawing.projectToSVG(Shape,App.Vector(1,1,1)) print resultSVG

参数化方法
创建主体 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 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 App.activeDocument.addObject("Part::Cut","Shape") App.activeDocument.Shape.Base = App.activeDocument.Box App.activeDocument.Shape.Tool = App.activeDocument.Fusion1 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
 * 1) Create three boxes and a cylinder
 * 1) Fuse two boxes and the cylinder
 * 1) Cut the fused shapes from the first box
 * 1) Hide all the intermediate shapes

插入一个页面对象并指定一个模板 App.activeDocument.addObject('Drawing::FeaturePage','Page') App.activeDocument.Page.Template = App.getResourceDir+'Mod/Drawing/Templates/A3_Landscape.svg'

创建“Shape”对象的一个视图，定义其位置、比例并将其指定到一个页面 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)

创建同一对象的第二个视图，但是要将该视图旋转90度. 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)

创建同一对象的第三个视图，但是要在等距方向创建. 并将隐藏线激活显示. 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) 改动一些地方并更新. 更新过程改变了视图和页面. App.activeDocument.View.X = 30.0 App.activeDocument.View.Y = 30.0 App.activeDocument.View.Scale = 1.5 App.activeDocument.recompute

访问其他细节
得到单个视图的 SVG 部分 ViewSVG = App.activeDocument.View.ViewResult print ViewSVG 得到整个最终页面（这是文档中临时文件夹中的一个只读文件） print "Resulting SVG document: ",App.activeDocument.Page.PageResult file = open(App.activeDocument.Page.PageResult,"r") print "Result page is ",len(file.readlines)," lines long"

注意：释放文件！ del file 向视图中插入你自己的内容： App.activeDocument.addObject('Drawing::FeatureView','ViewSelf') App.activeDocument.ViewSelf.ViewResult = """       """ App.activeDocument.Page.addObject(App.activeDocument.ViewSelf) App.activeDocument.recompute del Shape,ViewSVG, resultSVG 会出现以下结果：



模板
FreeCAD自带一些预设的模板，想得到更多模板可以前往 Drawing templates 页面.