zoukankan      html  css  js  c++  java
  • FreeCAD二次开发-创建Python工作台,添加菜单栏和工具条,FreeCAD命令

    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日

  • 相关阅读:
    MySQL字段数据全部查出【只保留中文、英文、数字、空格的词表】
    MySQL查看当前运行的事务和执行的账户
    【转】【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
    【转】mysqldump的锁表的问题
    mysql 通过echo的方式写入数据库 中文乱码解决方案
    Python3.5爬取豆瓣电视剧数据并且同步到mysql中
    Python3.5爬取cbooo.cn数据并且同步到mysql中
    【转&参考】MySQL利用frm和ibd文件进行数据恢复
    [算法]从一道题引出variable-precision SWAR算法
    [转]nginx负载均衡的五种算法
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/12563018.html
Copyright © 2011-2022 走看看