Freecad的Pyhton脚本

Python是一种开源的,多平台的编程语言,其使用简单易于学习,并且可以干各种各样的事情,从简单的shell脚本编程到非常复杂的程序。其最广泛的用途之一是作为脚本语言,因为它很容易嵌入到其他应用程序中。这正是它在FreeCAD中的使用方式。从python控制台或自定义脚本,您可以控制FreeCAD,使其执行非常复杂的操作。

例如,从python脚本中,您可以:

创建新对象

修改现有对象

修改这些对象的3D表示

修改FreeCAD界面

在FreeCAD中使用python还有几种不同的方法:

1)在FreeCAD python解释器中执行,您可以在“命令行”界面中发出简单命令;

2)使用宏,这是一种将自定义工具快速添加到FreeCAD界面的便捷方式;

3)利用外部脚本,可用于编写更复杂的功能,例如完整的工作台。

编写python代码

在FreeCAD中编写python代码有两种简单的方法:

1)从python控制台(可从View - > Panels - > Python控制台菜单获得);

2)从宏编辑器(工具 - >宏);

在控制台中,您可以逐个编写python命令,这些命令在按下return时执行。

宏可以包含由多行组成的更复杂的脚本,只有在执行宏时才会执行。

在本教程中,您将能够使用这两种方法,方法是在python控制台中逐个复制/粘贴每一行,然后在每行后按Return键,或者在新的Macro窗口中复制/粘贴整个代码。

探索FreeCAD

让我们从创建一个新的空文档开始:

doc = FreeCAD.newDocument()

如果您在FreeCAD python控制台中键入此内容,您会注意到只要您输入“FreeCAD.”,就会弹出一个窗口,允许您快速自动完成剩余的命令。更好的是,自动完成列表中的每个条目都有一个工具提示,说明它的作用。这使得探索可用功能变得非常容易。在选择“newDocument”之前,请先查看其他可用选项。

现在我们的新文档将被创建。这类似于按工具栏上的“新建文档”按钮。事实上,FreeCAD中的大多数按钮只执行一行或两行python代码。更好的是,您可以在Edit-> Preferences-> General-> Macro中设置一个选项,以“在python控制台中显示脚本命令”。这将在控制台中打印按下按钮时执行的所有python代码。学习如何在python中重现动作非常有用。

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

doc.

以大写字母开头的名称是属性,它们包含值;

而以小写字母开头的名称是函数(也称为方法),它们“做某事”。

以下划线开头的名称通常用于模块的内部工作,您不应该关心它们。

让我们使用其中一种方法将新对象添加到我们的文档中:

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

什么都没发生。为什么?因为FreeCAD是为大场景而制作的。有一天,它将与数百个复杂的对象一起工作,所有这些对象都是彼此依赖的。在某个地方进行小的改动可能会产生很大的影响,您可能需要重新计算整个文档,这可能需要很长时间...因此,几乎没有命令会自动更新场景。你必须手动完成:

doc.recompute()

看,现在我的Box出现了!在FreeCAD中添加对象的许多按钮实际上做了两件事:添加对象,然后重新计算。如果您打开上面的“show script commands in python console”选项,现在尝试使用GUI按钮添加一个球体,您将看到两行python代码一个接一个地执行。

你会问“Part :: Box”怎么样?我怎么知道可以添加其他类型的对象?一切都在这里:

doc.supportedTypes()

现在让我们探讨一下我们方框的内容:

box.

你会立即看到一些非常有趣的东西,比如:

box.Height

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

box.Height=5

如果您使用鼠标选择框,您会在属性面板中看到“数据”选项卡中的“高度”属性。出现在那里的FreeCAD对象的所有属性(以及“视图”选项卡中的更多关于后面的内容)也可以通过python直接访问它们的名称,就像我们使用“Height”属性一样。尝试更改该框的其他尺寸。

向量和定位

向量是任何3D应用程序中非常基本的概念。它是3个数字(x,y和z)的列表,描述了3D空间中的点或位置。使用向量可以完成很多事情,例如加法,减法,投影等等。在FreeCAD中,矢量的工作方式如下:

myvec = FreeCAD.Vector(2,0,0)myvecmyvec.xmyvec.yothervec = FreeCAD.Vector(0,3,0)sumvec = myvec.add(othervec)

FreeCAD对象的另一个常见功能是它们的定位。每个对象都有一个Placement属性,它包含对象的位置(Base)和方向(Rotation)。它很容易操作,例如移动我们的对象:

box.Placementbox.Placement.Basebox.Placement.Base= sumvec otherpla = FreeCAD.Placement()box.Placement= otherpla

现在,在我们进一步研究之前,你必须先了解一些重要的概念。

App和Gui

FreeCAD从一开始就作为命令行应用程序工作,没有用户界面。结果,几乎所有东西都在“几何”组件和“可视”组件之间分开。在命令行模式下工作时,几何体部分存在,但所有可视部分都被禁用。因此,FreeCAD中的几乎任何对象都由两部分组成,一个Object和一个ViewObject。

为了说明这个概念,请参阅我们的立方体对象,立方体的几何属性,例如它的尺寸,位置等......都存储在对象中,同时它的视觉属性,如颜色,线条粗细等等。 。存储在viewobject中。这对应于属性窗口中的“数据”和“视图”选项卡。访问对象的视图对象,如下所示:

vo= box.ViewObject

现在您还可以更改“视图”选项卡的属性:

vo.Transparency =80vo.hide()vo.show()

当您启动FreeCAD时,python控制台已经加载了2个基本模块:FreeCAD和FreeCADGui(也可以通过它们的快捷方式App和Gui访问)。它们包含用于处理文档及其对象的各种通用功能。为了说明我们的概念,请参阅FreeCAD和FreeCADGui都包含ActiveDocument属性,该属性是当前打开的文档。FreeCAD.ActiveDocument和FreeCADGui.ActiveDocument不是同一个对象。它们是FreeCAD文档的两个组件,它们包含不同的属性和方法。例如,FreeCADGui.ActiveDocument包含当前打开的3D视图的ActiveView。

模块

现在,你一定想知道,除了“Part :: Box”之外,我能做什么?FreeCAD基础应用程序或多或少是一个空容器。没有它的模块,它只能创建新的空文档。FreeCAD的真正强大在于其忠可靠的模块。它们都不仅为界面添加了新的工作台,还增加了新的python命令和新的对象类型。因此,几个不同甚至完全不兼容的对象类型可以共存于同一文档中。FreeCAD中最重要的模块,我们将在本教程中看到,包括Part,Mesh,Sketcher或Draft。

Sketcher和Draft都使用“ Part”模块来创建和处理它们的几何体,这些几何体是BRep,而Mesh是完全独立的,并处理它自己的对象。更多关于以下内容。

您可以检查当前文档的所有可用基础对象类型,如下所示:

doc.supportedTypes()

不同的FreeCAD模块虽然将其对象类型添加到FreeCAD,但不会自动加载到python控制台中。这是为了避免启动速度非常慢。模块仅在您需要时加载。因此,例如,要探索Part模块中的内容:

importPartPart.

我们将在下面详细讨论Part模块。

到目前为止,您对FreeCAD的不同模块有了更多了解:核心模块(FreeCAD,FreeCADGui)和工作台模块(Part,Mesh,Sketcher)。其他重要的模块是3d场景模块(pivy)和接口模块(pyside),我们将在下面讨论它们。

现在是时候深入探讨重要的工作台模块了。

Mesh

Mesh网格是一种非常简单的3D对象,例如由Sketchup,Blender或3D studio Max使用。它们由3个元素组成:点(也称为顶点),线(也称为边)和面。在许多应用程序中,包括FreeCAD,面只能有3个顶点。但是,当然没有什么能阻止你拥有一个由几个共面三角形组成的更大的平面。

网格很简单,这可能是一件坏事,但对于许多应用程序(例如上面提到的那些),它变成了一个优势,因为它们非常简单,您可以在一个文档中轻松拥有数百万个。但是,在FreeCAD中,它们的使用较少,并且大部分都是从其他应用程序导入网格格式(.stl,.obj)的对象。在FreeCAD的初期,它被广泛用作主要的测试模块。

网格对象和FreeCAD对象是不同的东西。您可以将FreeCAD对象视为Mesh对象的容器(我们将在下面看到,也可以看到Part对象)。因此,为了向FreeCAD添加网格对象,我们必须首先创建一个FreeCAD对象和一个Mesh对象,然后将Mesh对象添加到FreeCAD对象:

import Meshmymesh = Mesh.createSphere()mymesh.mymesh.Facetsmymesh.Pointsmeshobj = doc.addObject("Mesh::Feature","MyMesh")meshobj.Mesh= mymeshdoc.recompute()

这是一个标准示例,它使用createSphere()方法自动创建球体,但您可以通过定义顶点和面来从头开始创建自定义网格。

阅读更多关于网格脚本的信息......

Part

Part模块是整个FreeCAD最强大的模块。它允许创建和操作BRep对象。与网格不同,这种对象可以具有各种各样的组件。Brep意味着边界表示。也就是说它们由它们的表面定义,这些表面包围并定义内部体积。这些表面可以是各种各样的东西,例如平面或非常复杂的NURBS曲面。他们还带有体量的概念。

Part模块基于强大的OpenCasCade库,允许在这些对象上轻松执行各种复杂操作,例如布尔操作,圆角,放样等...

Part模块的工作方式与Mesh模块相同:创建FreeCAD对象,Part对象,然后将Part对象添加到FreeCAD对象:

import Partmyshape = Part.makeSphere(10)myshape.myshape.Volumemyshape.Areashapeobj = doc.addObject("Part::Feature","MyShape")shapeobj.Shape= myshapedoc.recompute()

Part模块(如Mesh模块)还有一个快捷方式,可以自动创建FreeCAD对象并为其添加形状,因此您可以跳过上面的3个最后一行:

Part.show(MyShape)

通过探索myshape的内容,您会注意到许多有趣的可用子组件,如Faces,Edges,Vertexes,Solids或Shells,以及各种几何操作,如cut(减法),common(交叉)或fuse(union)。该拓扑数据脚本页解释了所有的细节。

阅读更多关于部分脚本的信息......

Draft

FreeCAD具有更多模块,例如Sketcher或Draft,它们也可以创建Part对象,但可以为其添加参数,甚至可以采用全新的方式来处理它们中的Part几何体。我们上面的方框示例是参数对象的完美示例。定义框的所有方法是指定几个参数,例如高度,宽度和长度。基于这些,对象将自动计算其零件形状。FreeCAD允许您在python中创建此类对象。

所述模块草案增加了一些二维参数的对象类型(这是所有部分的对象)例如线和圆,并且还提供,不仅在草案制对象的工作的一些通用功能,但任何部分对象。要探索可用的内容,只需执行以下操作:

import DraftDraft.rec = Draft.makeRectangle(5,2)mvec = FreeCAD.Vector(4,4,0)Draft.move(rec,mvec)Draft.move(box,mvec)

接口

FreeCAD用户界面由Qt构建,Qt是一个功能强大的图形界面系统,负责绘制和处理3D视图周围的所有控件,菜单,工具栏,按钮。Qt提供了一个名为PySide的模块,它允许python访问和修改Qt接口,例如FreeCAD。让我们尝试摆弄Qt界面并生成一个简单的对话框:

fromPySideimportQtGuiQtGui.QMessageBox.information(None,"Apollo program","Houston, we have a problem")

看到出现的对话框在其工具栏中有FreeCAD图标,这意味着Qt知道该订单是从FreeCAD应用程序内部发出的。因此,我们可以轻松地直接操作FreeCAD界面的任何部分。

Qt是一个非常强大的界面系统,它允许你做很复杂的事情,但也有一些非常容易使用的工具,比如Qt Designer,你可以用图形方式设计对话框,然后将它们添加到FreeCAD界面几行蟒蛇。

在这里阅读更多关于PySide的信息......

现在您已经对基础知识有了很好的理解,我们将在哪里保留我们的python脚本,以及如何从FreeCAD轻松启动它们?有一个简单的机制,称为宏。宏只是一个python脚本,然后可以添加到工具栏并通过简单的鼠标单击启动。FreeCAD为您提供了一个简单的文本编辑器(宏 - >宏 - >创建),您可以在其中编写或粘贴脚本。完成后,工具 - >自定义 - >宏允许您为其定义一个按钮,可以将其添加到工具栏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341