freeCAD手册(7)

Python 脚本

一个温和的介绍

Python是一种非常流行的开源编程语言,通常用作脚本语言,嵌入在应用程序中,FreeCAD就是这种情况。它还具有一系列功能,使FreeCAD用户特别感兴趣:它非常容易学习,特别是对于那些从未编程过的人,它还嵌入到许多其他应用程序中,这使它成为一种非常有价值的学习工具,因为您可以在许多其他应用程序中使用它,如Blender、Inkscape或GRASS。

FreeCAD广泛使用Python。使用它,您可以访问和控制FreeCAD的几乎所有功能。例如,您可以创建新对象,修改其几何形状,分析其内容,甚至创建新的界面控件、工具和面板。FreeCAD的一些工作台和大多数插件工作台都是用Python完全编程的。FreeCAD有一个高级的Python控制台,可以从菜单“视图”->“面板”->“Python控制台”中访问。它通常用于执行尚无工具栏按钮的操作,或检查形状是否存在问题,或执行重复任务。

freeCAD手册(7)_第1张图片

但是,python控制台还有另一个非常重要的用途:每次按下工具栏按钮,或在FreeCAD中执行其他操作时,控制台中都会打印并执行一些python代码。通过保持python控制台打开,您可以在工作时看到python代码展开,并且几乎在不知不觉中,您将学习一些python语言。

FreeCAD还有一个宏系统,允许您记录稍后要重放的操作。该系统还使用Python控制台,只需记录在其中完成的所有操作即可。

在本章中,我们将非常全面地介绍Python语言。如果你对

了解更多信息,FreeCAD文档wiki有一个与Python编程相关的广泛部分。

写 Python 代码

在FreeCAD中编写Python代码有两种简单的方法:从Python控制台(菜单“视图”->“面板”->“Python控制台”)或从宏编辑器(菜单“工具”->“宏”->“新建”)。在控制台中,您逐个编写python命令,当您按回车键时,这些命令将被执行,而宏可以包含由几行组成的更复杂的脚本,该脚本仅在宏从同一宏窗口启动时执行。

在本章中,您将能够使用这两种方法,但强烈建议使用Python控制台,因为它会立即通知您在键入时可能出现的任何错误。

如果这是你第一次做Python编码,请考虑在进一步学习之前阅读这篇Python编程的简短介绍,它将使Python的基本概念更加清晰。

操作 FreeCAD 对象

让我们先创建一个新的空文档

doc = FreeCAD .newDocument()  

如果你在FreeCAD的Python控制台中键入这个命令,你会注意到,一旦你键入“FreeCAD.”(FreeCAD这个词后面是一个点),一个窗口就会弹出,允许快速自动完成你行的其余部分。更好的是,自动完成列表中的每个条目都有一个工具提示,解释它的功能。这使得探索可用的功能变得非常容易。在选择“newDocument”之前,先看看其他可用的选项。

freeCAD手册(7)_第2张图片

按下Enter键后,我们的新文档将被创建。这类似于按下工具栏上的“新建文档”按钮。在Python中,点用于表示包含在其他内容中的内容(newDocument是FreeCAD模块中的一个函数)。因此,弹出的窗口会显示“FreeCAD”中包含的所有内容。如果在newDocument后添加一个点,而不是括号,它会显示newDocument函数中包含的所有内容。调用Python函数时,括号是必需的,例如这个函数。我们将在下面更好地说明。

现在让我们回到我们的文档。让我们看看我们能做些什么

doc.

探索可用的选项。通常以大写字母开头的名称是属性,它们包含一个值,而以小写字母开头的名称是函数(也称为方法),它们“做某事”。以下划线开头的名称通常用于模块的内部工作,你不应该关心它们。让我们使用其中一个方法将新对象添加到我们的文档中

box = doc .addObject("Part ::Box","myBox") 

我们的长方体被添加到树状图中,但在3D视图中还没有任何反应,因为当使用Python工作时,文档永远不会自动重新计算。无论何时需要,我们都必须手动执行。

doc .recompute() 

现在我们的盒子出现在3D视图中。在FreeCAD中添加对象的许多工具栏按钮实际上做两件事:添加对象和重新计算。如果你打开上面“在python控制台中显示脚本命令”选项,现在尝试在零件工作台中使用适当的按钮添加一个球体,你会看到两行python代码一个接一个地执行。

您可以获得所有可能对象类型的列表,如 Part::Box

doc .supportedTypes() 

现在,让我们来探索一下我们的盒子里的东西

box.

你会立刻看到一些非常有趣的事情,比如

box .Height 

这将打印出我们盒子的当前高度。现在让我们试着改变它

box .Height = 5 

如果你用鼠标选择你的框,你会在属性面板的数据选项卡下看到我们的高度属性显示了新的值。 FreeCAD 对象在数据和视图选项卡中显示的所有属性都可以通过 python 按名称直接访问,就像我们使用高度属性一样。数据属性可以直接从对象本身访问,例如

box .Length 

视图属性存储在ViewObject中。每个FreeCAd对象都有一个ViewObject,它存储对象的视图属性。当运行FreeCAD而没有其图形界面时(例如,当使用-c命令行选项从终端启动它,或从另一个Python脚本使用它时),ViewObject不可用,因为根本没有视觉效果。

例如,要访问我们框的线条颜色

box .ViewObject.LineColor 

向量和展示位置

向量是任何3D应用程序中一个非常基本的概念。它是一个由3个数字(x,y和z)组成的列表,描述了3D空间中的一个点或位置。向量可以做很多事情,比如加法、减法、投影等等。在FreeCAD中,向量是这样工作的

myvec = FreeCAD .Vector(2,0,0)
print(myvec)
prnimarkdownt(myvec .x)
print(myvec .y)
othervec = FreeCAD .Vector(0,3,0)
sumvec = myvec .add(othervec)

FreeCAD对象的另一个共同特征是它们的放置。正如我们在前几章中看到的,每个对象都有一个Placement属性,其中包含对象的位置(Base)和方向(Rotation)。它很容易从Python中操纵,例如移动我们的对象

print(box .Placement)
print(box .Placement.Base)
box .Placement.Base = sumvec
otherpla = FreeCAD .Placement()
otherpla .Base = FreeCAD .Vector(5,5,0)
box .Placement = otherpla
Read more
  Python: https://www.python.org/
  Working with Macros: http://www.freecadweb.org/wiki/index.php?title=Macros   Introduction to Python scripting: http://www.freecadweb.org/wiki/index.php?
title=Introduction  to  Python
  Using Python in FreeCAD: http://www.freecadweb.org/wiki/index.php? title=Python_scripting_tutorial
·  The Python scripting wiki hub: http://www.freecadweb.org/wiki/index.php? title=Power_users_hub

创建和操作几何体

在前面的章节中,我们学习了FreeCAD的不同工作台,每个工作台都实现了自己的工具和几何类型。在Python代码中工作时,同样的概念也适用。

我们还看到,FreeCAD 工作台的大部分都依赖于一个非常基础的工作台:零件工作台。事实上,其他工作台,如 Draft 或 Arch,也正是我们将在本章中做的事情:它们使用 Python 代码来创建和操作零件几何图形。

因此,使用零件几何体时,我们需要做的第一件事就是使用Python等效方法切换到零件工作台:导入零件模块

import Part  

花点时间探索 Part 模块的内容,通过键入 Part. 并浏览其中提供的方法。 Part 模块提供了几个便利的功能,如 makeBox、makeCircle 等,这些功能可以立即为您构建对象。例如,试试这个

Part.makeBox(3,5,7)

在输入上述行后按Enter键时,3D视图中不会出现任何内容,但类似这样的内容将打印在Python控制台上

  

这是一个重要的概念。我们在这里创建的是一个零件形状。它不是一个FreeCAD文档对象(尚不是)。在FreeCAD中,对象和它们的几何形状是独立的。将FreeCAD文档对象想象成一个容器,它将承载一个形状。参数化对象也将具有长度和宽度等属性,并且当其中一个属性发生变化时,将动态重新计算它们的形状。我们在这里所做的是手动计算形状。

现在,我们可以在当前文档中轻松创建一个“通用”文档对象(确保至少有一个新文档处于打开状态),并为其设置一个方框形状,就像我们刚才做的那样

boxShape = Part.makeBox(3,5,7)
myObj = FreeCAD .ActiveDocument.addObject("Part ::Feature","MyNewBox")
myObj.Shape = boxShape
FreeCAD .ActiveDocument.recompute()

 请注意我们如何处理 myObj.Shape ,看到它完成的方式与我们在上一章中完全一样,当时我们更改了对象的其他属性,例如 box .Height = 5 。事实上,Shape 也是一个属性,就像 Height 一样。只有它需要一个 Part Shape,而不是一个数字。在下一章中,我们将更深入地研究这些参数化对象的构造方式。

现在,让我们更详细地探索我们的零件形状。在关于使用零件工作台进行传统建模的章节末尾,我们展示了一张表格,解释了零件形状是如何构造的,以及它们的不同组成部分(顶点、边、面等)。这里存在完全相同的组成部分,可以从Python中检索。所有零件形状始终具有以下属性:顶点、边、线、面、壳和实体。它们都是列表,可以包含任意数量的元素或为空

print(boxShape .Vertexes)
print(boxShape .Edges)
print(boxShape .Wires)
print(boxShape .Faces)
print(boxShape .Shells)
print(boxShape .Solids)

例如,让我们计算一下上面这个盒子的每个面的面积

for f in boxShape .Faces:
print(f.Area)

或者,对于每条边,它的起点和终点

for e in boxShape .Edges:
print("New edge")
print("Start point :")
print(e .Vertexes[0] .Point)
print("End point :")
print(e .Vertexes[1] .Point)

正如你所看到的,如果我们的boxShape有一个“Vertexes”属性,那么boxShape的每个边缘也有一个“Vertexes”属性。正如我们所料,boxShape将有8个顶点,而边缘只有2个,它们都是8个顶点列表的一部分。

我们总是可以检查形状的类型

print(boxShape .ShapeType)
print(boxShape .Faces[0] .ShapeType)
print (boxShape .Vertexes[2] .ShapeType)

因此,继续绘制零件形状的整个图表:一切都从顶点开始。有一个或两个顶点,你形成一个边缘(完整的圆只有一个顶点)。有一个或多个边缘,你形成一个线。有一个或多个封闭的线,你形成一个面(额外的线成为面中的“孔”)。有一个或多个面,你形成一个壳。当一个壳完全闭合(水密)时,你可以从它形成一个固体。最后,你可以将任何数量的任何类型的形状连接在一起,然后称为化合物。

我们现在可以尝试从头开始创建复杂的形状,逐个构建它们的所有组件。例如,让我们尝试创建一个这样的体积

freeCAD手册(7)_第3张图片

我们将从创建这样的平面形状开始

freeCAD手册(7)_第4张图片

首先,让我们创建四个基点

V1 = FreeCAD .Vector(0,10,0)
V2 = FreeCAD .Vector(30,10,0)
V3 = FreeCAD .Vector(30,-10,0)
V4 = FreeCAD .Vector(0,-10,0)

然后我们可以创建两个线性段

L1 = Part.Line(V1,V2)
L2 = Part.Line(V4,V3)

请注意,我们不需要创建“顶点”,我们可以立即从FreeCAD矢量创建“零件线”。这是因为我们还没有创建“边”。 “零件线”(以及“零件圆”、“零件弧”、“零件椭圆”或“零件样条”)不会创建“边”,而是创建“边”的基础几何图形。 “边”总是由这样的基础几何图形创建的,它存储在“曲线”属性中。所以如果你有一个“边”,

	print(Edge .Curve) 

它会向你展示这是什么类型的边缘,即它是否基于直线、弧线等。但让我们回到我们的练习,并构建弧线段。为此,我们需要第三个点,因此我们可以使用方便的Part.Arc,它需要3个点

freeCAD手册(7)_第5张图片

VC1 = FreeCAD .Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
VC2 = FreeCAD .Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)

现在我们有2条线(L1和L2)和2个圆弧(C1和C2)。我们需要将它们转化为边缘:

E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)

另外,基础几何体也有一个toShape()函数,功能完全相同

E1 = L1 .toShape()
E2 = L2 .toShape()
...

一旦我们有一系列边,我们现在可以通过给它一个边列表来形成一个线。我们不需要考虑顺序。OpenCasCade,FreeCAD的几何“引擎”,对无序几何具有非凡的容忍度。它会整理出要做什么

	W = Part.Wire([E1,E2,E3,E4]) 

我们可以检查我们的线是否被正确理解,并且它是否正确闭合

	print( W .isClosed() ) 

这将打印“True”或“False”。为了制作一个面,我们需要闭合的线,所以在创建面之前检查它总是一个好主意。现在我们可以创建一个面,给它一个单独的线(或者如果我们有孔,则给它一个线列表)。

	F = Part.Face(W)  

然后我们把它挤出来

	P = F .extrude(FreeCAD .Vector(0,0,10))

注意,P已经是一个固体

	print(P .ShapeType)

因为当挤出单个面时,我们总是得到一个实体。例如,如果我们挤出的是线而不是面,情况就不一样了

S = W .extrude(FreeCAD .Vector(0,0,10))
print(s .ShapeType)

当然,这会给我们一个空心外壳,缺少顶面和底面。

现在我们有了最终的形状,我们迫不及待地想在屏幕上看到它!所以让我们创建一个通用对象,并将其属性设置为我们的新实体

myObj2 = FreeCAD .ActiveDocument.addObject("Part ::Feature","My_Strange_Solid") myObj2 .Shape = P

另外,Part模块还提供了一个快捷方式,可以更快地完成上述操作(但您无法选择对象的名称)

	Part.show(P) 

以上所有内容,以及更多内容,都在 Part Scripting 页面上进行了详细解释,并附有示例。

Read more:
·  The Part Workbench: http://www.freecadweb.org/wiki/index.php?title=Part_Workbench
·  Part scripting: http://www.freecadweb.org/wiki/index.php?
title=Topological_data_scripting

创建参数化对象

在上一章中,我们看到了如何通过将其附加到一个“哑”(非参数化)文档对象来创建零件几何图形,以及如何在屏幕上显示它。当我们想要更改该对象的形状时,这很繁琐。我们需要创建一个新的形状,然后将其再次附加到我们的对象。

然而,我们在本手册的前几章中也看到了参数化对象的强大之处。我们只需要更改一个属性,形状就会动态重新计算。

在内部,参数化对象与我们刚才做的没有什么不同:每次另一个属性发生变化时,它们都会一遍又一遍地重新计算其Shape属性的内容。

FreeCAD提供了一个非常方便的系统,可以在Python中完全构建这样的参数化对象。它们由一个简单的Python类组成,该类定义了对象所需的所有属性,以及当其中一个属性发生变化时会发生什么。这种参数化对象的结构就这么简单

class myParametricObject :

def __init__(self,obj) :
obj.Proxy = self
obj.addProperty("App::PropertyFloat","MyLength")
...

def execute(self,obj) :
print ("Recalculating the shape . . .")
print ("The value of MyLength is:")
print (obj.MyLength)
...

所有Python类通常都有一个init方法。当该类被实例化时,该方法内部的内容会被执行(这意味着,在编程俚语中,Python对象是从该类创建的。将类视为创建其活动副本的“模板”)。 在这里的init函数中,我们做了两件重要的事情:1)将类本身存储到FreeCAD文档对象的“Proxy”属性中,也就是说,FreeCAD文档对象将在其内部携带此代码,2)创建对象所需的所有属性。有许多类型的属性可用,您可以通过键入此代码获得完整列表

	FreeCAD .ActiveDocument.addObject("Part ::FeaturePython","dummy") .supportedProperties()  

然后,第二个重要部分是执行方法。当对象被标记为重新计算时,该方法中的任何代码都将被执行,这将在属性发生更改时发生。这就是全部。在执行中,你需要做所有需要做的事情,即计算一个新的形状,并用类似 obj.Shape = myNewShape 的方式将其归因于对象本身。这就是为什么执行方法需要一个“obj”参数,它将是 FreeCAD 文档对象本身,这样我们就可以在我们的 Python 代码中对其进行操作。

最后一件重要的事情是:当你在FreeCAD文档中创建这样的参数化对象时,当你保存文件时,上面的Python代码不会存储在文件中。这是出于安全原因,如果FreeCAD文件包含代码,则有可能有人分发包含恶意代码的FreeCAD文件,这些恶意代码可能会损害其他人的计算机。因此,如果你分发一个包含用上述代码创建的对象的文件,则该代码也必须存在于将打开该文件的计算机上。最简单的方法通常是将上述代码保存在宏中,并将宏与FreeCAD文件一起分发,或者在FreeCAD宏存储库上共享您的宏,任何人都可以下载它。

下面,我们将做一个小的练习,构建一个简单的参数化矩形面参数化对象。更复杂的例子可以在参数化对象示例和FreeCAD源代码本身中找到。

我们将给对象赋予两个属性:长度和宽度,我们将用它们来构造一个矩形。然后,由于我们的对象已经有一个预先构建的Placement属性(所有几何对象默认都有一个,不需要我们自己添加),我们将把矩形位移到Placement中设置的位置/旋转,这样用户就可以通过编辑Placement属性将矩形移动到任何地方。

class ParametricRectangle:

def __init__(self,obj) :
obj.Proxy = self
obj.addProperty("App::PropertyFloat","Length")
obj.addProperty("App::PropertyFloat","Width")

def execute(self,obj) :
# we need to import the FreeCAD module here too, because we might be running out o f the Console
# (in a macro, for example) where the FreeCAD module has not been imported automat ically
import Part,FreeCAD

# first we need to make sure the values of Length and Width are not 0 # otherwise the Part.Line will complain that both points are equal
if (obj.Length == 0) or (obj.Width == 0) :
# if yes, exit this method without doing anything
return

# we create 4 points for the 4 corners
v1 = FreeCAD .Vector(0,0,0)
v2 = FreeCAD .Vector(obj.Length,0,0)
v3 = FreeCAD .Vector(obj.Length,obj.Width,0)
v4 = FreeCAD .Vector(0,obj.Width,0)

# we create 4 edges
e1 = Part.Line(v1,v2) .toShape()
e2 = Part.Line(v2,v3) .toShape()
e3 = Part.Line(v3,v4) .toShape()
e4 = Part.Line(v4,v1) .toShape()

# we create a wire
w = Part.Wire([e1,e2,e3,e4])

# we create a face
f = Part.Face(w)

# All shapes have a Placement too . We give our shape the value of the placement # set by the user . This will move/rotate the face automatically .
f.Placement = obj.Placement

# all done, we can attribute our shape to the object!
obj.Shape = f

我们最好将上述代码保存在某个地方,以便以后重用和修改,而不是将其粘贴到Python控制台中。例如,在一个新的宏中(菜单“工具”->“宏”->“创建”)。将其命名为“ParamRectangle”。但是,FreeCAD宏以.FCMacro扩展名保存,使用import时Python无法识别。因此,在使用上述代码之前,我们需要将ParamRectangle.FCMacro文件重命名为ParamRectangle.py。这可以通过文件资源管理器简单完成,方法是导航到菜单“工具”->“宏”中指示的宏文件夹。

完成此操作后,我们现在可以在Python控制台中执行此操作

import ParamRectangle 

通过探索ParamRectangle的内容,我们可以验证它包含我们的ParametricRectangle类。

要使用我们的ParametricRectangle类创建新的参数化对象,我们将使用以下代码。请注意,我们使用Part::FeaturePython而不是我们在前几章中使用的Part::Feature(Python版本允许我们定义自己的参数化行为)

myObj = FreeCAD .ActiveDocument.addObject("Part ::FeaturePython","Rectangle") ParamRectangle .ParametricRectangle(myObj)
myObj.ViewObject.Proxy = 0 # this is mandatory unless we code the ViewProvider too FreeCAD .ActiveDocument.recompute()

屏幕上目前不会显示任何内容,因为长度和宽度属性为 0,这将触发执行中的“无操作”条件。我们只需要更改长度和宽度的值,我们的对象就会神奇地出现并动态重新计算。

当然,每次我们想创建一个新的参数矩形时,都必须输入这四行Python代码,这很乏味。解决这个问题的一个非常简单的方法是在ParamRectangle.py文件的结尾处,在ParametricRectange类结尾之后,将这四行代码放在上面(我们可以在宏编辑器中完成)。

现在,当我们输入 import ParamRectangle 时,会自动创建一个新的参数矩形。更好的是,我们可以添加一个工具栏按钮来实现这一功能

  1. 打开菜单工具 -> 自定义
  2. 在“宏”选项卡下,选择我们的ParamRectangle.py宏,根据需要填写详细信息,然后按“添加”

freeCAD手册(7)_第6张图片

在工具栏选项卡下,在您选择的工作台(或全局)中创建一个新的自定义工具栏,选择您的宏并将其添加到工具栏中

freeCAD手册(7)_第7张图片

就是这样,我们现在有一个新的工具栏按钮,单击它将创建一个参数化矩形。记住,如果你想将用这个新工具创建的文件分发给其他人,他们的计算机上也必须安装ParamRectangle.py宏。

Read more
·  The FreeCAD macros repository: http://www.freecadweb.org/wiki/index.php? title=Macros_recipes
·  Parametric object example: http://www.freecadweb.org/wiki/index.php? title=Scripted_objects
·  More examples in the FreeCAD code:
https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/TemplatePyMod/FeaturePyt hon.py

创建界面工具

在最后两章中,我们看到了如何创建零件几何图形和创建参数化对象。要完全控制FreeCAD,还需要最后一项功能:创建与用户交互的工具。

在许多情况下,像我们在上一章中用矩形那样,用零值构造一个对象,然后要求用户在属性面板中填写高度和宽度值,这并不是非常用户友好的。这种方法适用于非常少量的对象,但如果你有很多矩形要制作,就会变得非常乏味。更好的方法是在创建矩形时能够给出高度和宽度。

Python提供了一个基本工具,可以让用户在屏幕上输入文本

text = raw_input("Height of the rectangle?")
print("The entered height is ",text)

然而,这需要一个正在运行的Python控制台,当从宏运行我们的代码时,我们并不总是确定Python控制台是否会在用户的机器上打开。

图形用户界面(GUI),即FreeCAD在屏幕上显示的所有部分(菜单、工具栏、3D视图等),都是为了与用户交互。FreeCAD的界面是用Qt构建的,Qt是一种非常常见的开源GUI工具包,提供大量工具,如对话框、按钮、标签、文本输入框或下拉菜单(所有这些通常称为“控件”)。

Qt工具非常易于从Python中使用,这要归功于一个名为Pyside的Python模块(还有其他几个Python模块可以从Python与Qt通信)。该模块允许您创建小部件并与之交互,读取用户对它们所做的操作(在文本框中填写了什么),或者在按下按钮等情况下执行操作。

Qt还提供了另一个有趣的工具,叫做Qt Designer,它现在被嵌入到一个更大的应用程序Qt Creator中。它允许以图形方式设计对话框和界面面板,而不必手动编码。在本章中,我们将使用Qt Creator来设计一个面板小部件,我们将在FreeCAD的任务面板中使用它。因此,如果你在Windows或Mac上,你需要从官方页面下载并安装Qt Creator(在Linux上,它通常可以从你的软件管理器应用程序中获得)。

在以下练习中,我们将首先使用Qt Creator创建一个面板,要求输入长度、宽度和高度值,然后我们将围绕它创建一个Python类,该类将读取用户从面板中输入的值,并创建一个具有给定尺寸的框。然后,FreeCAD将使用此Python类来显示和控制任务面板

freeCAD手册(7)_第8张图片

让我们从创建小部件开始。启动Qt Creator,然后菜单文件->新建文件或项目->文件和类->Qt->Qt Designer Form->无按钮对话框。单击下一步,给它一个文件名以供保存,单击下一步,将所有项目字段保留为默认值(“”),然后创建。FreeCAD的任务系统会自动添加确定/取消按钮,这就是为什么我们在这里选择一个无按钮对话框。

freeCAD手册(7)_第9张图片

在左侧面板的列表中找到标签,并将其拖动到我们小部件的画布上。双击最近放置的标签,并将其文本更改为长度。

  1. 右键单击小部件画布,然后选择布局->网格布局。这将把小部件布局成网格。
  2. 将我们的控件放入一个网格中,该网格目前只有一个单元格,由我们的第一个标签占据。我们现在可以在第一个标签的左侧、右侧、顶部或底部添加下一个项目,网格将自动调整以适应新的项目。
  3. 扩展自动进行。
  4. 在第一个标签下方添加两个标签,并将其文本更改为“宽度”和“高度”

freeCAD手册(7)_第10张图片

现在将3个双精度数字显示框小部件放置在我们的长度、宽度和高度标签旁边。对于每个小部件,在显示所选小部件所有可用设置的左下面板中,找到后缀并将其后缀设置为mm。FreeCAD有一个更高级的小部件,可以处理不同的单位,但默认情况下在Qt Creator中不可用(但可以编译),所以现在我们将使用标准双精度数字显示框,并添加“mm”后缀,以确保用户知道它们以什么单位工作。

freeCAD手册(7)_第11张图片

现在我们的控件已经完成了,我们只需要确保最后一件事。由于FreeCAD

需要访问该控件并读取长度、宽度和高度值,我们需要为这些控件提供适当的名称,以便我们可以在 FreeCAD 中轻松检索它们。单击每个双精度数字显示框,在右上角的窗口中,双击它们的对象名称,并将其更改为易于记忆的名称,例如:BoxLength、BoxWidth 和 BoxHeight

freeCAD手册(7)_第12张图片

  1. 保存文件后,现在可以关闭Qt Creator,其余工作将在Python中完成。
  2. 打开FreeCAD,从菜单“宏”->“宏”->“创建”创建一个新的宏
  3. 粘贴以下代码。确保更改文件路径以匹配您在QtCreator中创建的.ui文件的保存位置
import FreeCAD,FreeCADGui,Part

# CHANGE THE LINE BELOW
path_to_ui = "C:\Users\yorik\Documents\dialog .ui"

class BoxTaskPanel :
def __init__(self) :
# this will create a Qt widget from our ui file
self.form = FreeCADGui.PySideUic .loadUi(path_to_ui)

def accept(self) :
length = self.form .BoxLength.value()
width = self.form .BoxWidth.value()
height = self.form .BoxHeight.value()
if (length == 0) or (width == 0) or (height == 0) :
print("Error ! None of the values can be 0 !")
# we bail out without doing anything
return
box = Part.makeBox(length,width,height)
Part.show(box)
FreeCADGui.Control.closeDialog()

panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)

在上面的代码中,我们使用了FreeCADGui模块中的便利函数(PySideUic.loadUi)。该函数加载一个.ui文件,从中创建一个Qt窗口小部件,并映射名称,因此我们可以很容易地按名称访问子窗口小部件(例如:self.form.BoxLength)。

“接受”功能也是Qt提供的便利。当对话框中有“确定”按钮时(使用FreeCAD任务面板时默认情况下是这样),按下“确定”按钮时,任何名为“接受”的功能都会自动执行。同样,您还可以添加一个“拒绝”功能,当按下“取消”按钮时,该功能将被执行。在我们的例子中,我们省略了该功能,因此按下“取消”将执行默认行为(什么都不做并关闭对话框)。

如果我们实现任何接受或拒绝函数,它们的默认行为(什么都不做并关闭)将不再发生。因此,我们需要自己关闭任务面板。这是通过以下方法完成的

	FreeCADGui.Control.closeDialog()  

一旦我们有了BoxTaskPanel,它有1)一个名为“self.form”的小部件,2)如果需要,接受和拒绝功能,我们就可以用它打开任务面板,这是用最后两行完成的

panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)

请注意,由PySideUic.loadUi创建的小部件并非专用于FreeCAD,它是一个标准的Qt小部件,可以与其他Qt工具一起使用。例如,我们可以使用它显示一个单独的对话框。在FreeCAD的Python控制台中尝试一下(当然,使用正确的.ui文件路径)

from PySide import QtGui
w = FreeCADGui.PySideUic .loadUi("C:\Users\yorik\Documents\dialog .ui")
w .show()

当然,我们没有在对话框中添加任何“确定”或“取消”按钮,因为它是在FreeCAD任务面板中使用的,该面板已经提供了这样的按钮。因此,除了按下窗口关闭按钮外,无法关闭对话框。但是函数show()创建了一个非模态对话框,这意味着它不会阻止界面的其余部分。因此,当我们的对话框仍处于打开状态时,我们可以读取字段的值

	w .BoxHeight.value() 

这对于测试非常有用。最后,不要忘记在FreeCAD Wiki的Python脚本部分有更多关于使用Qt控件的文档,其中包括一个对话框创建教程,一个涵盖该主题的特殊三部分PySide教程。

Read more
·  Qt Creator: https://en.wikipedia.org/wiki/Qt_Creator
·  Installing Qt Creator: https://www.qt.io/ide/
·  Python scripting documentation: http://www.freecadweb.org/wiki/index.php? title=Power_users_hub
·  Dialog creation tutorial: http://www.freecadweb.org/wiki/index.php?title=Dialog_creation ·  PySide tutorials: http://www.freecadweb.org/wiki/index.php?title=PySide
·  PySide documentation: http://srinikom.github.io/pyside-docs/index.html

社区

如果没有关于社区的章节,那么关于自由和开源软件的手册就是不完整的。作为绝大多数自由和开源软件项目,FreeCAD是由一个社区创建和维护的。自由和开源软件社区是开放的空间,而不是经常出现在商业软件背后的不透明、未知、非个人化和不可访问的公司,在这里,作为用户的你受到欢迎,你可以很快得到答案,甚至可以在软件本身的发展中发表意见。你也非常欢迎帮助,每个人都有任务。

社区是一个不断增长的、由各种人组成的折衷群体,他们因对 FreeCAD 的热情而团结在一起。所有关于 FreeCAD 的工作都是在业余时间自愿完成的(尽管有时公司或个人会聚集在一起,向开发人员支付几个小时的编程时间来实现一个特定的功能)。有些人 是专业程序员,有些人 是长期使用 FreeCAD 的用户(其中一些是真正的 FreeCAD 专家,他们几乎无所不知,其中许多人也最终对 FreeCAD 编程有了很多了解),许多人是 FreeCAD 的新用户。加入社区没有什么特别的要求。只要使用 FreeCAD 就可以了!

社区会面和讨论的主要场所是FreeCAD论坛。参与讨论所需做的就是在论坛上注册一个帐户(您的第一篇文章需要经过版主批准,然后才能发布更多文章,以防止垃圾邮件)。论坛是您刚接触FreeCAD时提问的好地方。如果您提出了一个好问题(一定要阅读论坛规则,因为它们包含有用的信息,可以将您的问题变成一个好问题),您通常会在同一小时内收到多个回复。如果您认为有人可能已经问过您的问题,请务必搜索,您的答案可能已经存在。

论坛也是一个展示您使用 FreeCAD 所取得成就的好地方,当您更有经验时,可以帮助新手,并在有关开发的更多技术讨论中关注并提供您的意见。论坛上讨论了所有 FreeCAD 开发,任何人都可以自由阅读或参与。

在FreeCAD论坛之外,也有FreeCAD社区,例如在Facebook或Google+上。

如果你像我们一样对FreeCAD充满热情,你可能想帮助这个项目。这可以通过许多不同的方式完成,并且每个人都有任务,例如程序员和非程序员

  1. 帮助传播信息:许多人会从使用像FreeCAD这样的免费开源3D建模工具中获得巨大的好处,但他们并不知道它的存在。发布你用FreeCAD做的工作,在社交网络上谈论它,等等……可以帮助这些人发现FreeCAD。
  2. 帮助新来者:论坛上绝大多数的讨论都是新用户提出的问题。你也许知道好的答案来回答他们。
  3. 帮助报告错误:FreeCAD的稳定性在很大程度上来自对错误的修复。由于FreeCAD开发人员无法测试所有可能的使用情况,因此用户在检测到问题时报告问题非常重要。如果您认为您发现了错误,请务必阅读指南,然后在错误跟踪器上编写报告。
  4. 帮助编写文档:FreeCAD文档维基也是由社区成员编写的。其中一些部分仍然不完整,或者其中的信息不正确或过时。您可能可以帮助修复这个问题。为了能够在维基上工作,您需要熟悉维基编辑,并请求在论坛上编辑FreeCAD维基的权限。
  5. 帮助翻译FreeCAD:FreeCAD的翻译是由社区成员在crowdin上在线完成的。如果你没有看到你的语言,请要求管理员添加。
  6. 帮助翻译维基文档:维基的每一页都是可翻译的,只需要很少的维基语法知识。帮助翻译也是学习FreeCAD的好方法。
  7. 编写脚本和宏:FreeCAD的宏列表不断增长。如果您编写了一些有趣的功能,请考虑在那里分享。
  8. 编程:为此,您需要知道如何用Python或C++编程,并对FreeCAD本身有很好的了解。

FreeCAD的源代码位于FreeCAD项目的Github帐户上。任何人都可以下载、使用和修改代码。您可以发布您的修改(在Github或任何其他Git托管服务上)。如果您做出了有趣的修改,并且希望将其包含在FreeCAD源代码中,您必须请求社区将其包含在内。这可以使用Github的pull请求机制来完成,但最好的方法是在论坛上讨论您打算先做什么,然后在代码准备就绪时在论坛的pull请求部分发布正式请求。这可以避免您在其他人已经在做的事情上工作,并确保其他人同意您的做法,因此不会因为您没有预见到的某些原因而拒绝您的工作。

希望我们能够通过本手册让您很好地体验 FreeCAD,您已经是我们最新的社区成员。欢迎

Read more
·  The FreeCAD forum: http://forum.freecadweb.org
·  The source code of FreeCAD: https://github.com/FreeCAD/FreeCAD
·  The Facebook FreeCAD community: https://www.facebook.com/FreeCAD   The Google+ FreeCAD community:
https://plus.google.com/u/0/communities/103183769032333474646
·  The FreeCAD documentation wiki: http://www.freecadweb.org/wiki
·  Translating FreeCAD on crowd in: https://crowdin.com/project/freecad
·  The FreeCAD bug tracker: http://www.freecadweb.org/tracker

你可能感兴趣的:(python,freeCAD,freeCAD手册)