test_tcl_shell.py 10 KB

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