test_tcl_shell.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. self.fc.exec_command_test('set_sys units MM')
  54. self.fc.exec_command_test('new')
  55. self.fc.exec_command_test('set_sys units IN')
  56. self.fc.exec_command_test('new')
  57. units=self.fc.exec_command_test('get_sys units')
  58. self.assertEquals(units, "IN")
  59. self.fc.exec_command_test('set_sys units MM')
  60. self.fc.exec_command_test('new')
  61. units=self.fc.exec_command_test('get_sys units')
  62. self.assertEquals(units, "MM")
  63. def test_gerber_flow(self):
  64. # open gerber files top, bottom and cutout
  65. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  66. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  67. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  68. "Expected FlatCAMGerber, instead, %s is %s" %
  69. (self.gerber_top_name, type(gerber_top_obj)))
  70. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name))
  71. gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
  72. self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
  73. "Expected FlatCAMGerber, instead, %s is %s" %
  74. (self.gerber_bottom_name, type(gerber_bottom_obj)))
  75. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name))
  76. gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
  77. self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
  78. "Expected FlatCAMGerber, instead, %s is %s" %
  79. (self.gerber_cutout_name, type(gerber_cutout_obj)))
  80. # exteriors delete and join geometries for top layer
  81. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter))
  82. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
  83. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso'))
  84. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
  85. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  86. "Expected FlatCAMGeometry, instead, %s is %s" %
  87. (self.gerber_cutout_name + '_iso_exterior', type(obj)))
  88. # mirror bottom gerbers
  89. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
  90. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
  91. # exteriors delete and join geometries for bottom layer
  92. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
  93. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  94. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  95. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  96. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  97. "Expected FlatCAMGeometry, instead, %s is %s" %
  98. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  99. # at this stage we should have 5 objects
  100. names = self.fc.collection.get_names()
  101. self.assertEqual(len(names), 5,
  102. "Expected 5 objects, found %d" % len(names))
  103. # isolate traces
  104. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
  105. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
  106. # join isolated geometries for top and bottom
  107. 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'))
  108. 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'))
  109. # at this stage we should have 9 objects
  110. names = self.fc.collection.get_names()
  111. self.assertEqual(len(names), 9,
  112. "Expected 9 objects, found %d" % len(names))
  113. # clean unused isolations
  114. self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
  115. self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
  116. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
  117. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
  118. # at this stage we should have 5 objects again
  119. names = self.fc.collection.get_names()
  120. self.assertEqual(len(names), 5,
  121. "Expected 5 objects, found %d" % len(names))
  122. # geocutout bottom test (it cuts to same object)
  123. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
  124. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  125. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  126. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  127. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  128. "Expected FlatCAMGeometry, instead, %s is %s" %
  129. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  130. self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
  131. # at this stage we should have 6 objects
  132. names = self.fc.collection.get_names()
  133. self.assertEqual(len(names), 6,
  134. "Expected 6 objects, found %d" % len(names))
  135. # TODO: tests for tcl
  136. def test_open_gerber(self):
  137. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  138. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  139. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  140. "Expected FlatCAMGerber, instead, %s is %s" %
  141. (self.gerber_top_name, type(gerber_top_obj)))
  142. def test_excellon_flow(self):
  143. self.fc.exec_command_test('open_excellon %s/%s -outname %s' % (self.gerber_files, self.excellon_filename, self.excellon_name))
  144. excellon_obj = self.fc.collection.get_by_name(self.excellon_name)
  145. self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon),
  146. "Expected FlatCAMExcellon, instead, %s is %s" %
  147. (self.excellon_name, type(excellon_obj)))
  148. # mirror bottom excellon
  149. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name))
  150. # TODO: tests for tcl