很好用的FreeCAD

  • Post author:
  • Post category:其他


我是在做地下管道三维建模的时候发现FreeCAD这款软件的。地下管道由于形状基本固定,大多数横截面都是圆形或者矩形,而且在原始数据采集的时候已经得到了管道中心线的三维位置和横截面大小,所以采用人工建模的方式不可取,更多的选择自动化三维建模。已经有不少自动化三维管道建模软件,但是要开发类似软件,很可能要求你对opengl等编程技术较为熟悉,开发的门槛相对较高。

我发现FreeCAD的二次开发非常的轻量化,API接口非常的简单灵活,支持传统的宏。FreeCAD本身是开源免费,全面支持python二次开发,而且宏这个经典技术支持你快速学习FreeCAD的每个功能和对应的接口。

举个例子,证明FreeCAD是简单好用有效的。

假如已经知道了一个长方体的8个顶点三维坐标,如何根据这些坐标生成一个长方体模型,并且导出为obj文件。

如果你对opengl之类的三维编程都很熟悉的话,这就是小菜一碟。

但是如果你没有三维编程的经验,那么使用FreeCAD就是一个很好的选择。

在FreeCAD的Macro菜单打开一个代码窗口,然后输入下面的代码:

import Part,PartGui
#获取当前打开的三维视图窗口
doc=App.activeDocument()
#定义8个顶点坐标
v1 = FreeCAD.Vector(16.618813566446693 , 125.22511113528816 , 0)
v2 = FreeCAD.Vector(17.74618643355331 , 126.87708886471185 , 0)
v3 = FreeCAD.Vector(17.74618643355331 , 126.87708886471185 , -1)
v4 = FreeCAD.Vector(16.618813566446693 , 125.22511113528816 , -1)
v5 = FreeCAD.Vector(17.847535837023013 , 124.38658400239477 , 0)
v6 = FreeCAD.Vector(18.97490870412963 , 126.03856173181846 , 0)
v7 = FreeCAD.Vector(18.97490870412963 , 126.03856173181846 , -1)
v8 = FreeCAD.Vector(17.847535837023013 , 124.38658400239477 , -1)
#创建长方体的第一个面
wire1=Part.makePolygon([v1,v2,v3,v4,v1])
face1 = Part.Face(wire1)
wire2=Part.makePolygon([v1,v2,v6,v5,v1])
face2 = Part.Face(wire2)
wire3=Part.makePolygon([v5,v6,v7,v8,v5])
face3 = Part.Face(wire3)
wire4=Part.makePolygon([v2,v3,v7,v6,v2])
face4 = Part.Face(wire4)
wire5=Part.makePolygon([v3,v4,v8,v7,v3])
face5 = Part.Face(wire5)
#创建长方体的第六个面
wire6=Part.makePolygon([v1,v4,v8,v5,v1])
face6 = Part.Face(wire6)
#六个面组成一个长方体
box=Part.makeShell([face1,face2,face3,face4,face5,face6])
solid=Part.makeSolid(box)
box = doc.addObject("Part::Box","mybox")
box.Shape=solid

然后执行这段代码,三维视图窗口中就会生成对应的长方体。

FreeCAD的菜单【File】/【Export】支持导出多种格式,当然包括obj格式了。

当然,三维世界里面各种形状的模型很多,长方体太简单了。但是只要有“点构成线,线构成面,面构成体”的基本思路,任何形状都不在话下;同时任何一个表面都可以看成是三角形的面组成的。所以,只要你能将模型分解成三角形的面,得到三角形的3个顶点,就是可以得到obj格式的三维模型的。

假如要创建一个三棱柱,已知6个顶点,可以使用下面的代码:

import Part,PartGui
#获取当前打开的三维视图窗口
doc=App.activeDocument()
#三棱柱的6个顶点
v1 = FreeCAD.Vector(18.83345034945586 , 123.52035588232494 , -0)
v2 = FreeCAD.Vector(20.650902699311487 , 124.35514145719087 , 0)
v3 = FreeCAD.Vector(20.768361311317285 , 124.02643845431146 , 0)
v4 = FreeCAD.Vector(18.83345034945586 , 123.52035588232494 , -0.173863699983499)
v5 = FreeCAD.Vector(20.650902699311487 , 124.35514145719087 , -0.173863699983499)
v6 = FreeCAD.Vector(20.768361311317285 , 124.02643845431146 , -0.173863699983499)
#三棱柱一共有5个面
wire1=Part.makePolygon([v1,v2,v3,v1])
face1 = Part.Face(wire1)
wire2=Part.makePolygon([v3,v1,v4,v6,v3])
face2 = Part.Face(wire2)
wire3=Part.makePolygon([v6,v3,v2,v5,v6])
face3=Part.Face(wire3)
wire4=Part.makePolygon([v5,v2,v1,v4,v5])
face4=Part.Face(wire4)
wire5=Part.makePolygon([v4,v5,v6,v4])
face5=Part.Face(wire5)
fan=Part.makeShell([face1,face2,face3,face4,face5])
solid=Part.makeSolid(fan)
box = doc.addObject("Part::Box","myfan")
box.Shape=solid

然后执行这段代码,三维视图窗口中就会生成对应的三棱柱。

最后提供一个三维管道建模的思路。

假如有了包含管道三维坐标的shape文件,可以先写程序生成一个记事本文件,文件内容包括每个顶点的三维坐标。这个程序可以使用任何你擅长的语言来实现。

然后在FreeCAD中写python代码读取记事本,然后生成三维模型,最后导出obj。



版权声明:本文为pp9105原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。