summaryrefslogtreecommitdiff
path: root/plugin/mesh_plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/mesh_plugin.py')
-rw-r--r--plugin/mesh_plugin.py51
1 files changed, 47 insertions, 4 deletions
diff --git a/plugin/mesh_plugin.py b/plugin/mesh_plugin.py
index 1b302b4..2208297 100644
--- a/plugin/mesh_plugin.py
+++ b/plugin/mesh_plugin.py
@@ -1,17 +1,60 @@
-import os.path
+from os import path
+import subprocess
+import sys
+
+import wx
import pcbnew
-from .mesh_dialog import show_dialog
+def check_requirements(*packages):
+ missing = []
+ for pkg in packages:
+ try:
+ __import__(pkg)
+ except ImportError:
+ missing.append(pkg)
+
+ if missing:
+ if 'win' not in sys.platform:
+ wx.MessageDialog(None, "Error: Missing python dependencies {}.".format(', '.join(missing)),
+ "Missing Dependencies").ShowModal()
+ return False
+
+ else:
+ msg = 'The following python dependencies are missing:\n\n' + '\n'.join(missing) +\
+ '\n\nShould we go ahead and install these missing dependencies into the plugin directory?'
+ dialog = wx.MessageDialog(None, msg, caption='Error: Missing dependencies', style=wx.YES_NO | wx.NO_DEFAULT)
+ dialog.SetYesNoLabels("Install missing dependencies", "Cancel")
+ if dialog.ShowModal() == wx.ID_YES:
+ for dep in packages:
+ proc = subprocess.Popen(
+ "pip install --target deps {} --no-use-pep517 --only-binary :all: --platform win_amd64"\
+ .format(dep).split(),
+ cwd=path.dirname(__file__),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ (stdout, stderr) = proc.communicate()
+ if proc.returncode != 0:
+ wx.MessageDialog(None, "Error installing dependencies:\n\n{}\n{}".format(stdout, stderr),
+ "Installation Error").ShowModal()
+ return False
+
+ sys.path.append(path.abspath(path.join(path.dirname(__file__), 'deps')))
+
+ else:
+ return True
class MeshPlugin(pcbnew.ActionPlugin):
def defaults(self):
self.name = 'Mesh generator'
self.category = 'Modify PCB'
self.description = 'Creates security mesh traces on a PCB'
- self.icon_file_name = os.path.join(os.path.dirname(__file__), 'mesh_plugin_icon.png')
+ self.icon_file_name = path.join(path.dirname(__file__), 'mesh_plugin_icon.png')
self.show_toolbar_button = True
def Run(self):
- import pcbnew
+ if not check_requirements('pyclipper'):
+ return
+
+ from .mesh_dialog import show_dialog
show_dialog(pcbnew.GetBoard())