implement executing of tasks inside worker thread cleanups, reimplement Isolate/New/OpenGerber as OOP style Shell commands disable edit during shell execution, show some progress add ability for breakpoints in other threads and only if available add X11 safe flag, not sure what happen on windows
176 lines
8.8 KiB
Python
176 lines
8.8 KiB
Python
import sys
|
|
import unittest
|
|
from PyQt4 import QtGui
|
|
from FlatCAMApp import App
|
|
from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMCNCjob, FlatCAMExcellon
|
|
from ObjectUI import GerberObjectUI, GeometryObjectUI
|
|
from time import sleep
|
|
import os
|
|
import tempfile
|
|
|
|
class TclShellTest(unittest.TestCase):
|
|
|
|
gerber_files = 'tests/gerber_files'
|
|
copper_bottom_filename = 'detector_copper_bottom.gbr'
|
|
copper_top_filename = 'detector_copper_top.gbr'
|
|
cutout_filename = 'detector_contour.gbr'
|
|
excellon_filename = 'detector_drill.txt'
|
|
excellon_name = "excellon"
|
|
gerber_top_name = "top"
|
|
gerber_bottom_name = "bottom"
|
|
gerber_cutout_name = "cutout"
|
|
engraver_diameter = 0.3
|
|
cutout_diameter = 3
|
|
drill_diameter = 0.8
|
|
|
|
def setUp(self):
|
|
self.app = QtGui.QApplication(sys.argv)
|
|
|
|
# Create App, keep app defaults (do not load
|
|
# user-defined defaults).
|
|
self.fc = App(user_defaults=False)
|
|
|
|
self.fc.shell.show()
|
|
pass
|
|
|
|
def tearDown(self):
|
|
self.app.closeAllWindows()
|
|
|
|
del self.fc
|
|
del self.app
|
|
pass
|
|
|
|
def test_set_get_units(self):
|
|
|
|
self.fc.exec_command_test('set_sys units MM')
|
|
self.fc.exec_command_test('new')
|
|
|
|
self.fc.exec_command_test('set_sys units IN')
|
|
self.fc.exec_command_test('new')
|
|
units=self.fc.exec_command_test('get_sys units')
|
|
self.assertEquals(units, "IN")
|
|
|
|
self.fc.exec_command_test('set_sys units MM')
|
|
self.fc.exec_command_test('new')
|
|
units=self.fc.exec_command_test('get_sys units')
|
|
self.assertEquals(units, "MM")
|
|
|
|
|
|
def test_gerber_flow(self):
|
|
|
|
# open gerber files top, bottom and cutout
|
|
|
|
self.fc.exec_command_test('set_sys units MM')
|
|
self.fc.exec_command_test('new')
|
|
|
|
self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
|
|
gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
|
|
self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
|
|
"Expected FlatCAMGerber, instead, %s is %s" %
|
|
(self.gerber_top_name, type(gerber_top_obj)))
|
|
|
|
self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name))
|
|
gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
|
|
self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
|
|
"Expected FlatCAMGerber, instead, %s is %s" %
|
|
(self.gerber_bottom_name, type(gerber_bottom_obj)))
|
|
|
|
self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name))
|
|
gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
|
|
self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
|
|
"Expected FlatCAMGerber, instead, %s is %s" %
|
|
(self.gerber_cutout_name, type(gerber_cutout_obj)))
|
|
|
|
# exteriors delete and join geometries for top layer
|
|
self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter))
|
|
self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso'))
|
|
obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
|
|
self.assertTrue(isinstance(obj, FlatCAMGeometry),
|
|
"Expected FlatCAMGeometry, instead, %s is %s" %
|
|
(self.gerber_cutout_name + '_iso_exterior', type(obj)))
|
|
|
|
# mirror bottom gerbers
|
|
self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
|
|
self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
|
|
|
|
# exteriors delete and join geometries for bottom layer
|
|
self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
|
|
self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
|
|
obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
|
|
self.assertTrue(isinstance(obj, FlatCAMGeometry),
|
|
"Expected FlatCAMGeometry, instead, %s is %s" %
|
|
(self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
|
|
|
|
# at this stage we should have 5 objects
|
|
names = self.fc.collection.get_names()
|
|
self.assertEqual(len(names), 5,
|
|
"Expected 5 objects, found %d" % len(names))
|
|
|
|
# isolate traces
|
|
self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
|
|
self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
|
|
|
|
# join isolated geometries for top and bottom
|
|
self.fc.exec_command_test('join_geometries %s %s %s' % (self.gerber_top_name + '_join_iso', self.gerber_top_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
|
|
self.fc.exec_command_test('join_geometries %s %s %s' % (self.gerber_bottom_name + '_join_iso', self.gerber_bottom_name + '_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
|
|
|
|
# at this stage we should have 9 objects
|
|
names = self.fc.collection.get_names()
|
|
self.assertEqual(len(names), 9,
|
|
"Expected 9 objects, found %d" % len(names))
|
|
|
|
# clean unused isolations
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
|
|
|
|
# at this stage we should have 5 objects again
|
|
names = self.fc.collection.get_names()
|
|
self.assertEqual(len(names), 5,
|
|
"Expected 5 objects, found %d" % len(names))
|
|
|
|
# geocutout bottom test (it cuts to same object)
|
|
self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
|
|
self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
|
|
self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
|
|
obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
|
|
self.assertTrue(isinstance(obj, FlatCAMGeometry),
|
|
"Expected FlatCAMGeometry, instead, %s is %s" %
|
|
(self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
|
|
self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
|
|
|
|
# at this stage we should have 6 objects
|
|
names = self.fc.collection.get_names()
|
|
self.assertEqual(len(names), 6,
|
|
"Expected 6 objects, found %d" % len(names))
|
|
|
|
# TODO: tests for tcl
|
|
|
|
def test_open_gerber(self):
|
|
|
|
self.fc.exec_command_test('set_sys units MM')
|
|
self.fc.exec_command_test('new')
|
|
|
|
self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
|
|
gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
|
|
self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
|
|
"Expected FlatCAMGerber, instead, %s is %s" %
|
|
(self.gerber_top_name, type(gerber_top_obj)))
|
|
|
|
def test_excellon_flow(self):
|
|
|
|
self.fc.exec_command_test('set_sys units MM')
|
|
self.fc.exec_command_test('new')
|
|
self.fc.exec_command_test('open_excellon %s/%s -outname %s' % (self.gerber_files, self.excellon_filename, self.excellon_name))
|
|
excellon_obj = self.fc.collection.get_by_name(self.excellon_name)
|
|
self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon),
|
|
"Expected FlatCAMExcellon, instead, %s is %s" %
|
|
(self.excellon_name, type(excellon_obj)))
|
|
|
|
# mirror bottom excellon
|
|
self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name))
|
|
|
|
# TODO: tests for tcl |