Il file Init.py

"""FreeCAD init script of XXX module"""# ***************************************************************************# * Copyright (c) 2015 John Doe john@doe.com * # * *# * This file is part of the FreeCAD CAx development system. *# * *# * This program is free software; you can redistribute it and/or modify *# * it under the terms of the GNU Lesser General Public License (LGPL) *# * as published by the Free Software Foundation; either version 2 of *# * the License, or (at your option) any later version. *# * for detail see the LICENCE text file. *# * *# * FreeCAD is distributed in the hope that it will be useful, *# * but WITHOUT ANY WARRANTY; without even the implied warranty of *# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *# * GNU Lesser General Public License for more details. *# * *# * You should have received a copy of the GNU Library General Public *# * License along with FreeCAD; if not, write to the Free Software *# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *# * USA *# * *# ***************************************************************************/FreeCAD.addImportType("My own format (*.own)","importOwn")FreeCAD.addExportType("My own format (*.own)","importOwn")print("I am executing some stuff here when FreeCAD starts!")

The FreeCAD.addImportType() and addEXportType() functions allow you to give the name and extension of a file type, and a python module responsible for its import. In the example above, an importOwn.py module will handle .own files. See Code snippets for more examples.

Ambienti di lavoro in Python

classMyWorkbench(Workbench):MenuText="My Workbench"ToolTip="A description of my workbench"Icon="""paste here the contents of a 16x16 xpm icon"""defInitialize(self):"""This function is executed when FreeCAD starts"""importMyModuleA,MyModuleB# import here all the needed files that create your FreeCAD commandsself.list=["MyCommand1, MyCommand2"]# A list of command names created in the line aboveself.appendToolbar("My Commands",self.list)# creates a new toolbar with your commandsself.appendMenu("My New Menu",self.list)# creates a new menuself.appendMenu(["An existing Menu","My submenu"],self.list)# appends a submenu to an existing menudefActivated(self):"""This function is executed when the workbench is activated"""returndefDeactivated(self):"""This function is executed when the workbench is deactivated"""returndefContextMenu(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 menudefGetClassName(self):# this function is mandatory if this is a full python workbenchreturn"Gui::PythonWorkbench"Gui.addWorkbench(MyWorkbench())

Preferences

Your can add a Preferences page for your Python workbench.
The Preferences pages look for a preference icon with a specific name in the Qt Resource system.
If your icon isn't in the resource system or doesn't have the correct name, your icon won't appear on the Preferences page.

in the main *.py directory, run pyside-rcc -o myResources.py myqrc.qrc

in InitGui.py, add import myResource(.py)

update your repository(git) with myResources.py and myqrc.qrc

You'll need to redo the steps if you add/change icons.

@kbwbe has created a nice script to compile resources for the A2Plus workbench. See below.

Adding your preference page(s):

You need to compile the Qt designer plugin that allows you to add preference settings with Qt Designer

Create a blank widget in Qt Designer (no buttons or anything)

Design your preference page, any setting that must be saved (preferences) must be one of the Gui::Pref* widgets that were added by the plugin)

In any of those, make sure you fill the PrefName (the name of your preference value) and PrefPath (ex: Mod/MyWorkbenchName), which will save your value under BaseApp/Preferences/Mod/MyWorkbebchName

Save the ui file in your workbench, make sure it's handled by cmake

In your workbench, for ex. inside the InitGui file, inside the Initialize method (but any other place works too), add: FreeCADGui.addPreferencePage("/path/to/myUiFile.ui","MyGroup"), "MyGroup" being one of the preferences groups on the left. FreeCAD will automatically look for a "preferences-mygroup.svg" file in its known locations (which you can extend with FreeCADGui.addIconPath())

Make sure the addPreferencePage() method is called only once, otherwise your pref page will be added several times

Definizione dei comandi Python

classMy_Command_Class():"""My new command"""defGetResources(self):return{'Pixmap':'My_Command_Icon',# the name of a svg file available in the resources'Accel':"Shift+S",# a default shortcut (optional)'MenuText':"My New Command"'ToolTip':"What my new command does"}defActivated(self):"""Do something here"""returndefIsActive(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."""returnTrueFreeCADGui.addCommand('My_Command',My_Command_Class())

"Compiling" your resource file

compileA2pResources.py from the A2Plus workbench:

#!/usr/bin/env python# -*- coding: utf-8 -*-#***************************************************************************#* *#* Copyright (c) 2019 kbwbe *#* *#* Portions of code based on hamish's assembly 2 *#* *#* This program is free software; you can redistribute it and/or modify *#* it under the terms of the GNU Lesser General Public License (LGPL) *#* as published by the Free Software Foundation; either version 2 of *#* the License, or (at your option) any later version. *#* for detail see the LICENCE text file. *#* *#* This program is distributed in the hope that it will be useful, *#* but WITHOUT ANY WARRANTY; without even the implied warranty of *#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *#* GNU Library General Public License for more details. *#* *#* You should have received a copy of the GNU Library General Public *#* License along with this program; if not, write to the Free Software *#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *#* USA *#* *#***************************************************************************# This script compiles the A2plus icons for py2 and py3# For Linux only# Start this file in A2plus main directory# Make sure pyside-rcc is installedimportos,globqrc_filename='temp.qrc'ifos.path.exists(qrc_filename):os.remove(qrc_filename)qrc='''<RCC>\t<qresource prefix="/">'''forfninglob.glob('./icons/*.svg'):qrc=qrc+'\n\t\t<file>%s</file>'%fnqrc=qrc+'''\n\t</qresource></RCC>'''print(qrc)f=open(qrc_filename,'w')f.write(qrc)f.close()os.system('pyside-rcc -o a2p_Resources2.py {}'.format(qrc_filename))os.system('pyside-rcc -py3 -o a2p_Resources3.py {}'.format(qrc_filename))os.remove(qrc_filename)