Drawing Module/cn

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

GUI 工具

下面是一组用于创建、配置与工程图纸导出的工具。


Drawing extraction.png

图片中呈现出了绘图模块的主要概念。该文档中包含了一个形状对象(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

参数化方法

创建主体

# 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

插入一个页面对象并指定一个模板

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 = """<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

会出现以下结果:

DrawingScriptResult.jpg

模板

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


Online version: "http://www.freecadweb.org/wiki/index.php?title=Drawing_Module/cn&oldid=211344"

Navigation menu