2019-07-16 17:51:09 +00:00
|
|
|
# ##########################################################
|
2019-03-10 13:22:16 +00:00
|
|
|
# FlatCAM: 2D Post-processing for Manufacturing #
|
|
|
|
# http://flatcam.org #
|
|
|
|
# File Author: Matthieu Berthomé #
|
|
|
|
# Date: 5/26/2017 #
|
|
|
|
# MIT Licence #
|
2019-07-16 17:51:09 +00:00
|
|
|
# ##########################################################
|
2019-03-10 13:22:16 +00:00
|
|
|
|
2019-01-03 19:25:08 +00:00
|
|
|
from importlib.machinery import SourceFileLoader
|
|
|
|
import os
|
|
|
|
from abc import ABCMeta, abstractmethod
|
2019-10-19 13:29:36 +00:00
|
|
|
import math
|
2019-01-03 19:25:08 +00:00
|
|
|
|
2019-12-06 21:00:43 +00:00
|
|
|
# module-root dictionary of preprocessors
|
2019-01-03 19:25:08 +00:00
|
|
|
|
2020-04-27 07:03:22 +00:00
|
|
|
import logging
|
|
|
|
|
|
|
|
log = logging.getLogger('base')
|
2019-12-06 21:00:43 +00:00
|
|
|
preprocessors = {}
|
2019-01-03 19:25:08 +00:00
|
|
|
|
|
|
|
|
2020-05-18 13:11:02 +00:00
|
|
|
class ABCPreProcRegister(ABCMeta):
|
2019-12-06 21:00:43 +00:00
|
|
|
# handles preprocessors registration on instantiation
|
2019-01-03 19:25:08 +00:00
|
|
|
def __new__(cls, clsname, bases, attrs):
|
2020-05-18 13:11:02 +00:00
|
|
|
newclass = super(ABCPreProcRegister, cls).__new__(cls, clsname, bases, attrs)
|
2019-01-03 19:25:08 +00:00
|
|
|
if object not in bases:
|
2019-12-06 21:00:43 +00:00
|
|
|
if newclass.__name__ in preprocessors:
|
2020-04-27 07:03:22 +00:00
|
|
|
log.warning('Preprocessor %s has been overriden' % newclass.__name__)
|
2019-12-06 21:00:43 +00:00
|
|
|
preprocessors[newclass.__name__] = newclass() # here is your register function
|
2019-01-03 19:25:08 +00:00
|
|
|
return newclass
|
|
|
|
|
2019-02-21 21:48:13 +00:00
|
|
|
|
2020-05-18 13:11:02 +00:00
|
|
|
class PreProc(object, metaclass=ABCPreProcRegister):
|
2019-01-03 19:25:08 +00:00
|
|
|
@abstractmethod
|
|
|
|
def start_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def lift_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def down_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def toolchange_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def up_to_zero_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def rapid_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def linear_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def end_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def feedrate_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def spindle_code(self, p):
|
2019-01-03 19:25:08 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def spindle_stop_code(self, p):
|
2019-01-03 19:25:08 +00:00
|
|
|
pass
|
|
|
|
|
2019-02-21 21:48:13 +00:00
|
|
|
|
2020-05-18 13:11:02 +00:00
|
|
|
class AppPreProcTools(object, metaclass=ABCPreProcRegister):
|
2019-02-21 21:48:13 +00:00
|
|
|
@abstractmethod
|
|
|
|
def start_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def lift_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def down_z_start_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def lift_z_dispense_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def down_z_stop_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def toolchange_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def rapid_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def linear_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def end_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def feedrate_xy_code(self, p):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-02-28 16:02:29 +00:00
|
|
|
def z_feedrate_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def feedrate_z_dispense_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def spindle_fwd_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def spindle_rev_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def spindle_off_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def dwell_fwd_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2019-07-16 17:51:09 +00:00
|
|
|
def dwell_rev_code(self, p):
|
2019-02-21 21:48:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
2019-12-06 21:00:43 +00:00
|
|
|
def load_preprocessors(app):
|
|
|
|
preprocessors_path_search = [os.path.join(app.data_path, 'preprocessors', '*.py'),
|
|
|
|
os.path.join('preprocessors', '*.py')]
|
2019-01-03 19:25:08 +00:00
|
|
|
import glob
|
2019-12-06 21:00:43 +00:00
|
|
|
for path_search in preprocessors_path_search:
|
2019-01-03 19:25:08 +00:00
|
|
|
for file in glob.glob(path_search):
|
|
|
|
try:
|
|
|
|
SourceFileLoader('FlatCAMPostProcessor', file).load_module()
|
|
|
|
except Exception as e:
|
|
|
|
app.log.error(str(e))
|
2019-12-06 21:00:43 +00:00
|
|
|
return preprocessors
|