test_tcl_shell.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. from tests.tclCommands import *
  33. @classmethod
  34. def setUpClass(self):
  35. self.setup=True
  36. self.app = QtGui.QApplication(sys.argv)
  37. # Create App, keep app defaults (do not load
  38. # user-defined defaults).
  39. self.fc = App(user_defaults=False)
  40. self.fc.ui.shell_dock.show()
  41. def setUp(self):
  42. self.fc.exec_command_test('set_sys units MM')
  43. self.fc.exec_command_test('new')
  44. @classmethod
  45. def tearDownClass(self):
  46. self.fc.tcl=None
  47. self.app.closeAllWindows()
  48. del self.fc
  49. del self.app
  50. pass
  51. def test_set_get_units(self):
  52. self.fc.exec_command_test('set_sys units MM')
  53. self.fc.exec_command_test('new')
  54. self.fc.exec_command_test('set_sys units IN')
  55. self.fc.exec_command_test('new')
  56. units=self.fc.exec_command_test('get_sys units')
  57. self.assertEquals(units, "IN")
  58. self.fc.exec_command_test('set_sys units MM')
  59. self.fc.exec_command_test('new')
  60. units=self.fc.exec_command_test('get_sys units')
  61. self.assertEquals(units, "MM")
  62. def test_gerber_flow(self):
  63. # open gerber files top, bottom and cutout
  64. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  65. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  66. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  67. "Expected FlatCAMGerber, instead, %s is %s" %
  68. (self.gerber_top_name, type(gerber_top_obj)))
  69. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name))
  70. gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
  71. self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
  72. "Expected FlatCAMGerber, instead, %s is %s" %
  73. (self.gerber_bottom_name, type(gerber_bottom_obj)))
  74. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name))
  75. gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
  76. self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
  77. "Expected FlatCAMGerber, instead, %s is %s" %
  78. (self.gerber_cutout_name, type(gerber_cutout_obj)))
  79. # exteriors delete and join geometries for top layer
  80. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter))
  81. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
  82. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso'))
  83. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
  84. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  85. "Expected FlatCAMGeometry, instead, %s is %s" %
  86. (self.gerber_cutout_name + '_iso_exterior', type(obj)))
  87. # mirror bottom gerbers
  88. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
  89. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
  90. # exteriors delete and join geometries for bottom layer
  91. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
  92. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  93. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  94. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  95. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  96. "Expected FlatCAMGeometry, instead, %s is %s" %
  97. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  98. # at this stage we should have 5 objects
  99. names = self.fc.collection.get_names()
  100. self.assertEqual(len(names), 5,
  101. "Expected 5 objects, found %d" % len(names))
  102. # isolate traces
  103. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
  104. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
  105. # join isolated geometries for top and bottom
  106. 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'))
  107. 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'))
  108. # at this stage we should have 9 objects
  109. names = self.fc.collection.get_names()
  110. self.assertEqual(len(names), 9,
  111. "Expected 9 objects, found %d" % len(names))
  112. # clean unused isolations
  113. self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
  114. self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
  115. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
  116. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
  117. # at this stage we should have 5 objects again
  118. names = self.fc.collection.get_names()
  119. self.assertEqual(len(names), 5,
  120. "Expected 5 objects, found %d" % len(names))
  121. # geocutout bottom test (it cuts to same object)
  122. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
  123. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  124. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  125. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  126. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  127. "Expected FlatCAMGeometry, instead, %s is %s" %
  128. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  129. self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
  130. # at this stage we should have 6 objects
  131. names = self.fc.collection.get_names()
  132. self.assertEqual(len(names), 6,
  133. "Expected 6 objects, found %d" % len(names))
  134. # TODO: tests for tcl
  135. def test_open_gerber(self):
  136. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  137. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  138. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  139. "Expected FlatCAMGerber, instead, %s is %s" %
  140. (self.gerber_top_name, type(gerber_top_obj)))
  141. def test_excellon_flow(self):
  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