test_tcl_shell.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import sys
  2. import unittest
  3. from PyQt4 import QtGui
  4. from PyQt4.QtCore import QThread
  5. from FlatCAMApp import App
  6. from os import listdir
  7. from os.path import isfile
  8. from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMCNCjob, FlatCAMExcellon
  9. from ObjectUI import GerberObjectUI, GeometryObjectUI
  10. from time import sleep
  11. import os
  12. import tempfile
  13. class TclShellTest(unittest.TestCase):
  14. svg_files = 'tests/svg'
  15. svg_filename = 'Arduino Nano3_pcb.svg'
  16. gerber_files = 'tests/gerber_files'
  17. copper_bottom_filename = 'detector_copper_bottom.gbr'
  18. copper_top_filename = 'detector_copper_top.gbr'
  19. cutout_filename = 'detector_contour.gbr'
  20. excellon_filename = 'detector_drill.txt'
  21. gerber_name = "gerber"
  22. geometry_name = "geometry"
  23. excellon_name = "excellon"
  24. gerber_top_name = "top"
  25. gerber_bottom_name = "bottom"
  26. gerber_cutout_name = "cutout"
  27. engraver_diameter = 0.3
  28. cutout_diameter = 3
  29. drill_diameter = 0.8
  30. # load test methods to split huge test file into smaller pieces
  31. # reason for this is reuse one test window only,
  32. # CANNOT DO THIS HERE!!!
  33. #from tests.test_tclCommands import *
  34. @classmethod
  35. def setUpClass(cls):
  36. cls.setup = True
  37. cls.app = QtGui.QApplication(sys.argv)
  38. # Create App, keep app defaults (do not load
  39. # user-defined defaults).
  40. cls.fc = App(user_defaults=False)
  41. cls.fc.ui.shell_dock.show()
  42. def setUp(self):
  43. self.fc.exec_command_test('set_sys units MM')
  44. self.fc.exec_command_test('new')
  45. @classmethod
  46. def tearDownClass(cls):
  47. cls.fc.tcl = None
  48. cls.app.closeAllWindows()
  49. del cls.fc
  50. del cls.app
  51. pass
  52. def test_set_get_units(self):
  53. """
  54. Tests setting and getting units via the ``set_sys`` command,
  55. and persistance after ``new`` command.
  56. :return: None
  57. """
  58. # MM
  59. self.fc.exec_command_test('set_sys units MM')
  60. self.fc.exec_command_test('new')
  61. # IN
  62. self.fc.exec_command_test('set_sys units IN')
  63. self.fc.exec_command_test('new')
  64. #----------------------------------------
  65. # Units must be IN
  66. #----------------------------------------
  67. units = self.fc.exec_command_test('get_sys units')
  68. self.assertEqual(units, "IN")
  69. # MM
  70. self.fc.exec_command_test('set_sys units MM')
  71. self.fc.exec_command_test('new')
  72. #----------------------------------------
  73. # Units must be MM
  74. #----------------------------------------
  75. units = self.fc.exec_command_test('get_sys units')
  76. self.assertEqual(units, "MM")
  77. def test_gerber_flow(self):
  78. """
  79. Typical workflow from Gerber to GCode.
  80. :return: None
  81. """
  82. gbr_cmd = 'open_gerber {path}/{filename} -outname {outname}'
  83. #-----------------------------------------
  84. # Open top layer and check for object type
  85. #-----------------------------------------
  86. cmd = gbr_cmd.format(
  87. path=self.gerber_files,
  88. filename=self.copper_top_filename,
  89. outname=self.gerber_top_name)
  90. self.fc.exec_command_test(cmd)
  91. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  92. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  93. "Expected FlatCAMGerber, instead, %s is %s" %
  94. (self.gerber_top_name, type(gerber_top_obj)))
  95. #--------------------------------------------
  96. # Open bottom layer and check for object type
  97. #--------------------------------------------
  98. cmd = gbr_cmd.format(
  99. path=self.gerber_files,
  100. filename=self.copper_bottom_filename,
  101. outname=self.gerber_bottom_name)
  102. self.fc.exec_command_test(cmd)
  103. gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
  104. self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
  105. "Expected FlatCAMGerber, instead, %s is %s" %
  106. (self.gerber_bottom_name, type(gerber_bottom_obj)))
  107. #--------------------------------------------
  108. # Open cutout layer and check for object type
  109. #--------------------------------------------
  110. cmd = gbr_cmd.format(
  111. path=self.gerber_files,
  112. filename=self.cutout_filename,
  113. outname=self.gerber_cutout_name
  114. )
  115. self.fc.exec_command_test(cmd)
  116. gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
  117. self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
  118. "Expected FlatCAMGerber, instead, %s is %s" %
  119. (self.gerber_cutout_name, type(gerber_cutout_obj)))
  120. # exteriors delete and join geometries for top layer
  121. cmd = 'isolate {objname} -dia {dia}'.format(
  122. objname=self.gerber_cutout_name,
  123. dia=self.engraver_diameter)
  124. self.fc.exec_command_test(cmd)
  125. cmd = 'exteriors {objname} -outname {outname}'.format(
  126. objname=self.gerber_cutout_name + '_iso',
  127. outname=self.gerber_cutout_name + '_iso_exterior')
  128. self.fc.exec_command_test(cmd)
  129. cmd = 'delete {objname}'.format(
  130. objname=self.gerber_cutout_name + '_iso')
  131. self.fc.exec_command_test(cmd)
  132. # TODO: Check deleteb object is gone.
  133. #--------------------------------------------
  134. # Exteriors of cutout layer, check type
  135. #--------------------------------------------
  136. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
  137. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  138. "Expected FlatCAMGeometry, instead, %s is %s" %
  139. (self.gerber_cutout_name + '_iso_exterior', type(obj)))
  140. # mirror bottom gerbers
  141. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
  142. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
  143. # exteriors delete and join geometries for bottom layer
  144. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
  145. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  146. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  147. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  148. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  149. "Expected FlatCAMGeometry, instead, %s is %s" %
  150. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  151. # at this stage we should have 5 objects
  152. names = self.fc.collection.get_names()
  153. self.assertEqual(len(names), 5,
  154. "Expected 5 objects, found %d" % len(names))
  155. # isolate traces
  156. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
  157. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
  158. # join isolated geometries for top and bottom
  159. 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'))
  160. 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'))
  161. # at this stage we should have 9 objects
  162. names = self.fc.collection.get_names()
  163. self.assertEqual(len(names), 9,
  164. "Expected 9 objects, found %d" % len(names))
  165. # clean unused isolations
  166. self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
  167. self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
  168. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
  169. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
  170. # at this stage we should have 5 objects again
  171. names = self.fc.collection.get_names()
  172. self.assertEqual(len(names), 5,
  173. "Expected 5 objects, found %d" % len(names))
  174. # geocutout bottom test (it cuts to same object)
  175. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
  176. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  177. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  178. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  179. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  180. "Expected FlatCAMGeometry, instead, %s is %s" %
  181. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  182. self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
  183. # at this stage we should have 6 objects
  184. names = self.fc.collection.get_names()
  185. self.assertEqual(len(names), 6,
  186. "Expected 6 objects, found %d" % len(names))
  187. # TODO: tests for tcl
  188. def test_open_gerber(self):
  189. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  190. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  191. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  192. "Expected FlatCAMGerber, instead, %s is %s" %
  193. (self.gerber_top_name, type(gerber_top_obj)))
  194. def test_excellon_flow(self):
  195. self.fc.exec_command_test('open_excellon %s/%s -outname %s' % (self.gerber_files, self.excellon_filename, self.excellon_name))
  196. excellon_obj = self.fc.collection.get_by_name(self.excellon_name)
  197. self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon),
  198. "Expected FlatCAMExcellon, instead, %s is %s" %
  199. (self.excellon_name, type(excellon_obj)))
  200. # mirror bottom excellon
  201. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name))
  202. # TODO: tests for tcl