基于Python的FreeCAD二次开发

参考文献:python手册

启动freecad。

在开始python编程前,需要设置界面:

Edit → Preferences → General → Output window 勾选:

Redirect internal Python output to report view.

Redirect internal Python errors to report view.

在这里插入图片描述
然后菜单: View → Panels 勾选 Report view.
在这里插入图片描述
写python代码
有2种方式写python 代码:

View → Panels → Python console

Macro → Macros…

下面是第一种方式
在这里插入图片描述
开始试一试代码

doc = FreeCAD.newDocument()

回车,其效果就是新建文档,菜单:file->New, 或者工具条 的新建,或者按键 Ctrl + N

在这里插入图片描述

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

什么都没发生。 为什么? 因为FreeCAD是为大局而生的。 有一天,它将处理数百个复杂的对象,它们彼此依赖。 在某处进行小的更改可能会产生很大的影响,可能需要很长时间。 因此,几乎没有命令会自动更新场景。 必须手动执行。话虽这么说,在这里还是可以看到:
在这里插入图片描述

doc.recompute()

这样,在图形界面可以看到了。

在这里插入图片描述
显示高度

box.Height

在这里插入图片描述

box.Height=5
在这里插入图片描述
更改高度为5

可以看到图形变了。

矢量和位置
体验下矢量和他的运算

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

在这里插入图片描述
然后看看位置:

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

在这里插入图片描述
在这里插入图片描述
App and Gui
FreeCAD的设计使其可以在没有用户界面的情况下用作命令行应用程序。 因此,FreeCAD中的几乎每个对象都由两部分组成:一个对象(其“几何”组件)和一个ViewObject(其“可视”组件)。 在命令行模式下工作时,存在几何图形部分,但可视部分被禁用。

为了说明这个概念,让我们看一下我们的多维数据集对象。 多维数据集的几何属性(例如其尺寸,位置等)存储在对象中。 而其视觉属性(例如其颜色,线条粗细等)存储在ViewObject中。 这对应于“属性”编辑器中的“数据 Data”和“视图View”选项卡。 对象的视图对象的访问方式如下:

vo = box.ViewObject

现在可以改变View 的属性:

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

vo.Transparency = 0
在这里插入图片描述
vo.Transparency = 80
在这里插入图片描述
模块 Module
FreeCAD的真正强大在于模块。 FreeCAD基本应用程序只是一个空容器。 没有它的模块,它只能执行创建新的空文档的工作。 每个模块不仅向界面添加了新的工作台,而且还增加了新的Python命令和新的对象类型。几种不同甚至完全不兼容的对象类型可以共存于同一文档中。 这里介绍FreeCAD中最重要的模块:零件,网格,草绘器和工程图。

“草绘器”和“草稿”都使用“零件”模块来创建和处理其几何图形。 而网格是完全独立的,并处理自己的对象。 下文提供了更多信息。

可以像这样检查当前文档的所有可用基础对象类型:

doc.supportedTypes()

在这里插入图片描述
模块并不自动导入python 控制台,需要的时候,你要自己导入,这样避免启动太慢。比如导入Part

import Part

在这里插入图片描述
导入后,可以

Part. 就有很多功能提示。这里P是大写。

网格 Mesh
网格是一种非常简单的3D对象,例如Sketchup,Blender和3D Studio Max都使用网格。它们由3个元素组成:点(也称为顶点),线(也称为边缘)和面。在许多应用程序中(包括FreeCAD),面只能有3个顶点。当然,可以由多个共面三角形组成的更大的面。

网格很简单,正因为简单,在一个文档中很容易拥有数百万个网格。在FreeCAD中,用得不多,大多数情况下都是从其他应用程序以网格格式(.stl,.obj)导入对象。

网格对象和FreeCAD对象是不同的东西。可以将FreeCAD对象看作是Mesh对象的容器(对于Part对象也是如此)。为了将网格对象添加到FreeCAD中,必须首先创建一个FreeCAD对象和一个Mesh对象,然后将Mesh对象添加到FreeCAD对象中:

import Mesh
mymesh = Mesh.createSphere()
mymesh.Facets
mymesh.Points
 
meshobj = doc.addObject("Mesh::Feature", "MyMesh")
meshobj.Mesh = mymesh
doc.recompute()

这段代码的解说是:导入Mesh,建立一个Mesh(mymesh) ,查看面和点, doc 中添加mesh 对象,赋值mymesh, 显示计算。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
零件 Part
零件模块是整个FreeCAD中最主要的模块。 它允许您创建和操作BRep对象。 BRep代表“边界表示”。与网格不同,BRep对象可以具有从平面到非常复杂的NURBS曲面的多种组件。

零件模块基于强大的OpenCasCade库,该库允许对这些对象执行各种复杂的操作,例如布尔操作,圆角,放样等。

“零件”模块的工作方式与“网格”模块相同:创建一个FreeCAD对象,一个“零件”对象,然后将“零件”对象添加到FreeCAD对象中:

import Part
myshape = Part.makeSphere(10)
myshape.Volume
myshape.Area
 
shapeobj = doc.addObject("Part::Feature", "MyShape")
shapeobj.Shape = myshape
doc.recompute()

在这里插入图片描述
其实后面代码也可简化为:

Part.show(myshape)

网格也一样。

草图 Draft
FreeCAD有更多的模块,例如Sketcher和Draft,它们也可以创建零件对象。 这些模块为创建的对象添加了附加参数,甚至实现了一种全新的方式来处理其中的零件几何图形。 上面的box例子是参数对象的一个示例。 定义box所需要做的只是指定参数高度,宽度和长度。 基于这些,对象将自动计算其零件形状。

Draft 模块添加了诸如线和圆之类的2D参数化对象类型(全部为零件对象),并且还提供了一些通用功能,这些功能适用于Draft 对象,而且适用于任何Part对象。 执行以下操作练练手:

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

在这里插入图片描述
界面 Interface
FreeCAD用户界面由功能强大的图形界面系统Qt组成,它负责绘制和处理3D视图周围的所有控件,菜单,工具栏和按钮。 Qt提供了一个PySide模块,该模块允许Python访问和修改Qt接口,例如FreeCAD。 下面用Qt界面产生一个简单的对话框:

from PySide import QtGui
QtGui.QMessageBox.information(None, "Apollo program", "hello, we have a problem")

在这里插入图片描述
注意,出现的对话框的工具栏中有FreeCAD图标,这意味着Qt知道Order是从FreeCAD应用程序内部发出的。 可以操纵FreeCAD界面的任何部分。

Qt是一个非常强大的界面系统,可执行非常复杂的事情。 它还具有一些易于使用的工具,例如Qt Designer,可以使用该工具以图形方式设计对话框,然后使用几行Python代码将其添加到FreeCAD界面中。

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

现在,可以进行更深入的FreeCAD脚本编写了。

学完了,开始看https://wiki.freecadweb.org/Power_users_hub 这个像是目录或链接分支说明。

接口个性化,就是改变toolbar 和快捷键:https://wiki.freecadweb.org/Interface_Customization

Tools->Customize

Macros (宏)

https://wiki.freecadweb.org/Macros

所有操作都可以用python 命令完成,一系列操作可以记录为python 文件,以后用一个宏再做同样的工作。

https://wiki.freecadweb.org/Macros_recipes

自动安装宏:

addon manager: Tools → Addon manager

手动安装:

menu:Macro → Macros

create 按钮,给个名字,复制python 代码,save 保存, 然后再打开 选择你的宏,Excute

新加宏到工具条,tool->ccustomize, 选择 Macro

https://wiki.freecadweb.org/Customize_Toolbars

安装workbenches

https://wiki.freecadweb.org/Installing_more_workbenches

Talk:Developer hub

https://wiki.freecadweb.org/Developer_hub

Module developer’s guide to FreeCAD source code by Qingfeng Xia http://www.iesensor.com • 2015-09-18 version 0.1 for FreeCAD version 0.16-dev • 2016-09-18 version 0.2 for FreeCAD version 0.17-dev License of this book This ebook is licensed the same as FreeCAD document license CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/Contents 1 FreeCAD overview and architecture 7 1.1 Introduction to FreeCAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2 Key features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 Software architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.1 Key software libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.2 Mixed python and c++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.3 GPL code will not be included into installer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 How 3D model are renderred . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4.1 Selection of 3D visualization libarary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4.2 Discussion of 3D rendering library selection on FreeCAD Forum . . . . . . . . . . . . . . . . . . . . . 8 1.5 Roadmap of FreeCAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.1 Keep updated with main components: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.2 C++11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.3 Pyside 2 project for Qt 5.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2 Organisation of FreeCAD source code 11 2.1 Build system for FreeCAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.1 Analysis of src/cMake/SMesh.cMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 List of files and folders in FreeCAD source folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3 List of modules in FreeCAD Mod folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4 Learning path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5 Learning OpenInventor/Coin3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5.1 OpenInventor in FreeCAD’s ViewProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5.2 Important classes in OpenInventor/Coin3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.5.3 Window System integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.5.4 Pivy: Coin3D ’s Python wrapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3 Base, App and Main module 19 3.1 List of header files in Base folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.1 Frequently included headers files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.1.2 Correct way of using Sequencer in try-catch block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.1.3 String enconding utf8 and conversion into wchar_t QString . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2 Type, BaseClass, PyObjectBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2.1 Type system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2.2 src/Base/BaseClass.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.2.3 src/Base/PyObjectBase.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.4 src/Base/Persistence.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.5 GeoFeature: Base class of all geometric document objects . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3 Unit scheme for physial quantity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.1 src/Base/Unit.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.2 src/Base/Quantity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.4 List of header files in App folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.5 Property framewrok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.5.1 Naming of property and PropertyEditor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.5.2 src/App/PropertyStandard.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.3 PropertyEnumeration, see src/App/Enumeration.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.4 Geometry related property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.5 File related property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 1
### 关于 FreeCAD 使用 C# 进行二次开发 遗憾的是,在提供的参考资料中并没有直接提及有关 FreeCAD 和 C# 二次开发的内容。然而,可以基于现有资源提供一些建议。 #### 可能的原因 通常情况下,FreeCAD 的主要编程接口是 Python 而不是 C#[^1]。这可能是由于 FreeCAD 原生支持 Python 并将其作为脚本语言来扩展功能。因此,大多数关于 FreeCAD 二次开发的教程都集中在 Python 上而不是 C#。 #### 替代方案 对于希望使用 C# 开发 CAD 应用程序的人来说,其他 CAD 系统可能提供了更友好的环境和支持。例如,AutoCAD 支持通过 .NET API (包括 C#) 来实现二次开发[^2]。这些平台拥有成熟的文档和技术社区的支持,能够更好地满足开发者的需求。 #### 技术栈建议 如果确实需要在 FreeCAD 中集成 C# 功能,则可以通过以下方式尝试: - **Python-CSharp 桥接工具**:利用 IronPython 或者 PyDotNet 实现 Python 和 C# 之间的互操作性。 - **外部调用服务**:创建独立运行的服务端应用程序(如 WebAPI),该应用由 C# 编写并处理特定任务;而 FreeCAD 则负责发送请求给此服务获取数据或执行命令。 ```csharp // 示例代码展示如何设置简单的 ASP.NET Core Web API 控制器 using Microsoft.AspNetCore.Mvc; namespace CadService.Controllers { [ApiController] public class DrawController : ControllerBase { // GET api/draw/line [HttpGet("[controller]/line")] public IActionResult Line() { var result = "Draw a line"; return Ok(result); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值