FreeCAD作为一款基于OpenCasCAD内核的开源CAD软件,可以在GitHub上下载源代码。阅读源代码,有助于我们学习CAD软件架构,了解底层几何算法。
由博主Caesar卢尚宇自学整理(纯粹出于对三维CAD软件开发的热爱)
内容出自FreeCAD官方社区https://wiki.freecadweb.org/Workbench_creation
可以把FreeCAD理解成一个QT界面的容器,每次FreeCAD启动时都去Mod文件夹里读取所有工作台。
我们在Mod里添加自己的工作台文件夹,里面放三个文件。
Init.py这个是FreeCAD启动的时候执行的,不与界面交互的,后台执行。(一般做界面工具开发,这个文件为空就行了)
InitGui.py这个是FreeCAD启动的时候执行的,与界面交互的代码。
LSY.py这个是我们存放命令功能的文件。
InitGui.py
class MyWorkbench ( Workbench ): MenuText = "My Workbench1" ToolTip = "A description of my workbench" Icon = """paste here the contents of a 16x16 xpm icon""" def Initialize(self): """This function is executed when FreeCAD starts""" import LSY # import here all the needed files that create your FreeCAD commands self.list = [\'MySecondCommand\', \'MySecondCommand1\'] # A list of command names created in the line above self.appendToolbar(\'My Commands\',self.list) # creates a new toolbar with your commands self.appendMenu(\'My New Menu\',self.list) # creates a new menu self.appendMenu(["An existing Menu", "My submenu"], self.list) # appends a submenu to an existing menu def Activated(self): """This function is executed when the workbench is activated""" return def Deactivated(self): """This function is executed when the workbench is deactivated""" return def ContextMenu(self, recipient): """This is executed whenever the user right-clicks on screen""" # "recipient" will be either "view" or "tree" self.appendContextMenu("My commands", self.list) # add commands to the context menu def GetClassName(self): # this function is mandatory if this is a full python workbench return "Gui::PythonWorkbench" Gui.addWorkbench(MyWorkbench()) Caesar卢尚宇 2020年3月24日
LSY.py
import FreeCAD import FreeCADGui from PySide import QtGui, QtCore class MySecondCommand: def GetResources(self): return {\'Pixmap\': \'freecad\', \'MenuText\': \'show Message1\', \'ToolTip\': \'Print show Message1\'} def Activated(self): #点击按钮执行的动作 """Do something here""" reply = QtGui.QMessageBox.information(None,"","Houston, we have a problem") return def IsActive(self): """Here you can define if the command must be active or not (greyed) if certain conditions are met or not. This function is optional.""" return True FreeCADGui.addCommand(\'MySecondCommand\', MySecondCommand()) class MySecondCommand1: def GetResources(self): return {\'Pixmap\': \'freecad\', \'MenuText\': \'show Message2\', \'ToolTip\': \'Print show Message2\'} def Activated(self): #点击按钮执行的动作 """Do something here""" reply = QtGui.QMessageBox.question(None, "", "This is your chance to answer, what do you think?",QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: # this is where the code relevant to a \'Yes\' answer goes pass if reply == QtGui.QMessageBox.No: # this is where the code relevant to a \'No\' answer goes pass return def IsActive(self): """Here you can define if the command must be active or not (greyed) if certain conditions are met or not. This function is optional.""" return True FreeCADGui.addCommand(\'MySecondCommand1\', MySecondCommand1()) Caesar卢尚宇 2020年3月24日
这两个文件里的代码,也是从社区里找到的。但是!原封不动的复制下来去做,会出错。一定要修改它的代码。我试了两个小时,在找到一些有问题的地方。(使用的话,直接复制我上面的代码就行了,我修改过了)
第一处:
第二处:
第三处:
演示:
附加参考资料https://www.jianshu.com/p/8a0a2b0e4aea
Caesar卢尚宇
2020年3月24日