test_tcl_shell.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. @classmethod
  31. def setUpClass(self):
  32. self.setup=True
  33. self.app = QtGui.QApplication(sys.argv)
  34. # Create App, keep app defaults (do not load
  35. # user-defined defaults).
  36. self.fc = App(user_defaults=False)
  37. self.fc.ui.shell_dock.show()
  38. @classmethod
  39. def tearDownClass(self):
  40. self.fc.tcl=None
  41. self.app.closeAllWindows()
  42. del self.fc
  43. del self.app
  44. pass
  45. def test_set_get_units(self):
  46. self.fc.exec_command_test('set_sys units MM')
  47. self.fc.exec_command_test('new')
  48. self.fc.exec_command_test('set_sys units IN')
  49. self.fc.exec_command_test('new')
  50. units=self.fc.exec_command_test('get_sys units')
  51. self.assertEquals(units, "IN")
  52. self.fc.exec_command_test('set_sys units MM')
  53. self.fc.exec_command_test('new')
  54. units=self.fc.exec_command_test('get_sys units')
  55. self.assertEquals(units, "MM")
  56. def test_gerber_flow(self):
  57. # open gerber files top, bottom and cutout
  58. self.fc.exec_command_test('set_sys units MM')
  59. self.fc.exec_command_test('new')
  60. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  61. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  62. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  63. "Expected FlatCAMGerber, instead, %s is %s" %
  64. (self.gerber_top_name, type(gerber_top_obj)))
  65. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name))
  66. gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
  67. self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
  68. "Expected FlatCAMGerber, instead, %s is %s" %
  69. (self.gerber_bottom_name, type(gerber_bottom_obj)))
  70. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name))
  71. gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
  72. self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
  73. "Expected FlatCAMGerber, instead, %s is %s" %
  74. (self.gerber_cutout_name, type(gerber_cutout_obj)))
  75. # exteriors delete and join geometries for top layer
  76. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter))
  77. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
  78. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso'))
  79. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
  80. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  81. "Expected FlatCAMGeometry, instead, %s is %s" %
  82. (self.gerber_cutout_name + '_iso_exterior', type(obj)))
  83. # mirror bottom gerbers
  84. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
  85. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
  86. # exteriors delete and join geometries for bottom layer
  87. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
  88. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  89. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  90. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  91. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  92. "Expected FlatCAMGeometry, instead, %s is %s" %
  93. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  94. # at this stage we should have 5 objects
  95. names = self.fc.collection.get_names()
  96. self.assertEqual(len(names), 5,
  97. "Expected 5 objects, found %d" % len(names))
  98. # isolate traces
  99. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
  100. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
  101. # join isolated geometries for top and bottom
  102. 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'))
  103. 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'))
  104. # at this stage we should have 9 objects
  105. names = self.fc.collection.get_names()
  106. self.assertEqual(len(names), 9,
  107. "Expected 9 objects, found %d" % len(names))
  108. # clean unused isolations
  109. self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
  110. self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
  111. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
  112. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
  113. # at this stage we should have 5 objects again
  114. names = self.fc.collection.get_names()
  115. self.assertEqual(len(names), 5,
  116. "Expected 5 objects, found %d" % len(names))
  117. # geocutout bottom test (it cuts to same object)
  118. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
  119. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  120. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  121. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  122. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  123. "Expected FlatCAMGeometry, instead, %s is %s" %
  124. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  125. self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
  126. # at this stage we should have 6 objects
  127. names = self.fc.collection.get_names()
  128. self.assertEqual(len(names), 6,
  129. "Expected 6 objects, found %d" % len(names))
  130. # TODO: tests for tcl
  131. def test_open_gerber(self):
  132. self.fc.exec_command_test('set_sys units MM')
  133. self.fc.exec_command_test('new')
  134. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  135. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  136. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  137. "Expected FlatCAMGerber, instead, %s is %s" %
  138. (self.gerber_top_name, type(gerber_top_obj)))
  139. def test_excellon_flow(self):
  140. self.fc.exec_command_test('set_sys units MM')
  141. self.fc.exec_command_test('new')
  142. self.fc.exec_command_test('open_excellon %s/%s -outname %s' % (self.gerber_files, self.excellon_filename, self.excellon_name))
  143. excellon_obj = self.fc.collection.get_by_name(self.excellon_name)
  144. self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon),
  145. "Expected FlatCAMExcellon, instead, %s is %s" %
  146. (self.excellon_name, type(excellon_obj)))
  147. # mirror bottom excellon
  148. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name))
  149. # TODO: tests for tcl
  150. def test_import_svg(self):
  151. """
  152. Test all SVG files inside svg directory.
  153. Problematic SVG files shold be put there as test reference.
  154. :return:
  155. """
  156. self.fc.exec_command_test('set_sys units MM')
  157. self.fc.exec_command_test('new')
  158. file_list = listdir(self.svg_files)
  159. for svg_file in file_list:
  160. # import without outname
  161. self.fc.exec_command_test('import_svg "%s/%s"' % (self.svg_files, svg_file))
  162. obj = self.fc.collection.get_by_name(svg_file)
  163. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  164. "Expected FlatCAMGeometry, instead, %s is %s" %
  165. (svg_file, type(obj)))
  166. # import with outname
  167. outname='%s-%s' % (self.geometry_name, svg_file)
  168. self.fc.exec_command_test('import_svg "%s/%s" -outname "%s"' % (self.svg_files, svg_file, outname))
  169. obj = self.fc.collection.get_by_name(outname)
  170. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  171. "Expected FlatCAMGeometry, instead, %s is %s" %
  172. (outname, type(obj)))
  173. names = self.fc.collection.get_names()
  174. self.assertEqual(len(names), len(file_list)*2,
  175. "Expected %d objects, found %d" % (len(file_list)*2, len(file_list)))
  176. def test_import_svg_as_geometry(self):
  177. self.fc.exec_command_test('set_sys units MM')
  178. self.fc.exec_command_test('new')
  179. self.fc.exec_command_test('import_svg "%s/%s" -type geometry -outname "%s"' % (self.svg_files, self.svg_filename, self.geometry_name))
  180. obj = self.fc.collection.get_by_name(self.geometry_name)
  181. self.assertTrue(isinstance(obj, FlatCAMGeometry) and not isinstance(obj, FlatCAMGerber),
  182. "Expected FlatCAMGeometry, instead, %s is %s" %
  183. (self.geometry_name, type(obj)))
  184. def test_import_svg_as_gerber(self):
  185. self.fc.exec_command_test('set_sys units MM')
  186. self.fc.exec_command_test('new')
  187. self.fc.exec_command_test('import_svg "%s/%s" -type gerber -outname "%s"' % (self.svg_files, self.svg_filename, self.gerber_name))
  188. obj = self.fc.collection.get_by_name(self.gerber_name)
  189. self.assertTrue(isinstance(obj, FlatCAMGerber),
  190. "Expected FlatCAMGerber, instead, %s is %s" %
  191. (self.gerber_name, type(obj)))
  192. self.fc.exec_command_test('isolate "%s"' % self.gerber_name)
  193. obj = self.fc.collection.get_by_name(self.gerber_name+'_iso')
  194. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  195. "Expected FlatCAMGeometry, instead, %s is %s" %
  196. (self.gerber_name+'_iso', type(obj)))