FreeCAD的源代码

From FreeCAD Documentation
Revision as of 12:06, 21 March 2019 by Mario52 (talk | contribs)

FreeCAD的源代码通过Git管理,是公开的,是开放的,是可获得的,声明于LGPL许可协议之下。任何人都可以复制、下载、阅读、分析、分发和改动。如果你改了代码,还想看到它被吸收进官方代码里,我们要给你提个醒,你的改动需要被FreeCAD开发者认可。所以,聪明的做法是,先到论坛上去发帖,跟大家讨论一下,说说你的初衷和想法。免得到头来,出乎你的意料,你的改动被拒绝。

如果你有兴趣,深入探索FreeCAD源代码,下面就是一些提醒,一点信息,帮助你走上正轨。

  • FreeCAD代码主要采用C++编程,但是重度依赖Python。FreeCAD的功能里,非常大的部分都提供相应的Python包装。FreeCAD的核心哲学之一,就是对任何C++开发的新属性,都要给出Python接口。为此,FreeCAD通篇都重度使用CPython(Python自己提供的C界面工具),特别是PyCXX。FreeCAD代码里也提供了很多模版和定制工具,便于你包装相应的Python封装。FreeCAD一些更高层的部分,完全是用Python写的代码。
  • FreeCAD的源代码完全跨平台,我们一直很小心,保证让大家在最广泛的平台上和配置上都能使用此应用,避免让用户感觉不爽。因此,如果一个所需组件的新版本不能跨平台,不能广泛而容易地在所有平台上使用,那会是我们的错,我们将尽可能地避免这样的情况放生。同时,保证向后兼容性(用旧版本的FreeCAD也能打开新版本所创建的文件)也有重要的优先级。
  • FreeCAD的几乎所有功能都分成了两部分,称为AppGui。在源代码文件结构中,处处体见着这种分割。App包含所有的功能性东西,它们需要在纯控制台模式(无用户图形界面)运行。既然FreeCAD可以编译后,在没有用户图形界面的情况下运行,App里的代码就得独立于任何GUI相关库。Gui包含那些App功能的外围的代码,在GUI模式运行。
  • FreeCAD的大多数功能都通过模块来实现。不含模块的FreeCAD只是一个容器,是一个只能打开和保存文件的窗口。所有的几何工具和工作台都实现在模块里。模块有的是C++写的,有的是Python,或者融合两个世界的菁华,用C++和Python制成混合动力的模块。其中实体性和关键性的功能通过C++编程,而终端工具用Python打造,从而更便于FreeCAD的用户扩展和适配。每个模块用于GUI模式时,通常会在FreeCAD接口中,定义并创建一个工作台,一般用同样的名字。但是并不强制要求模块包含一个工作台。
  • FreeCAD的模块常常依赖于其他模块。大多数使用实体几何的模块依赖于Part模块。它是FreeCAD最基础的模块,用OpenCasCade实现了大部分接口。虽然其它模块也可以直接调用OpenCasCade的功能,它们通常不那么做,而是调用Part提供的更高层次的函数。
  • 模块总是从Python初始化。即使它们完全是C++写的,它们总是至少包含一小段Python/CPython的结构。
  • FreeCAD使用其他开源库,堪称求贤若渴。Python和Qt,用在核心和几乎所有模块中。除了它们,还有两个重度使用的库,也几乎到处可见。它们是OpenCasCade TechnologyCoin3D。FreeCAD创建和管理所有的实体几何,采用了OpenCasCade;而管理3D视图,采用了coin3D。OpenCasCade主要用在App世界,而coin3D更多用于Gui世界。要用FreeCAD做任何几何相关的工作,都需要基本理解OpenCascade,这是基础。特别的模块当然采用特别的库。除了要求这些库在所有平台上都容易获得,通常没有什么其他限制。所以可以想见,一个全副武装的FreeCAD,它的依赖库列表,那将是相当庞大的阵容。
  • FreeCAD的文档对象,就是FreeCAD文档中包含的所有对象。在GUI界面,它们出现在Tree View中;在Python控制台,它们可以通过FreeCAD.ActiveDocument.Objects()调用。对几何数据,文档对象可以有,也可以没有;在3D视图中,文档对象可以显示,也可以什么也不显示。文档对象总是被划分为App和Gui两部分。在控制台模式时,就不加载Gui那部分;标准的几何对象,比如Part或Part Design里的那些,有其对应的App中定义的几何体,基于OpenCasCade。而其对应的Gui(通常也被称为"View Provider"),负责创建那个几何体的coin3D外观,用来插入coin3D的主场景图,实现3D观看。
  • 源代码的基本文件夹结构如下:
    • App:包含FreeCAD的控制台模式应用。它定义了基本结构,它也为文档对象定义基础类。这些类被各个模块继承,用于创建各自的类。
    • Base:包含FreeCAD里到处都用得到的核心功能性东西:3D向量,单位,矩阵,位置,等等。
    • Gui:包含FreeCAD在GUI模式下的应用。它定义3D视图,也包含很多工具和函数,被工作台调用,用来与接口和3D视图互动。它为视图提供者定义基础类。
    • Doc:包含一个文件,从这个wiki生成的Qt帮助文件,是一个大全。
    • Mod:包含所有的模块。它们本身又进一步分割为App和Gui(除了python模块,它们并不总是清晰地遵从那条约定)。

相关的东西

  • 源代码管理
  • 发烧友中心里面又很多文档,它们关于模块,关于OpenCasCade,关于Coin3D,主要是写给Python程序员。虽然如此,因为功能性都是相通的,这些页面对C++程序员也有助益。