test_tcl_shell.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import sys
  2. import unittest
  3. from PyQt4 import QtGui
  4. from FlatCAMApp import App
  5. from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMCNCjob, FlatCAMExcellon
  6. from ObjectUI import GerberObjectUI, GeometryObjectUI
  7. from time import sleep
  8. import os
  9. import tempfile
  10. class TclShellCommandTest(unittest.TestCase):
  11. gerber_files = 'tests/gerber_files'
  12. copper_bottom_filename = 'detector_copper_bottom.gbr'
  13. copper_top_filename = 'detector_copper_top.gbr'
  14. cutout_filename = 'detector_contour.gbr'
  15. excellon_filename = 'detector_drill.txt'
  16. excellon_name = "excellon"
  17. gerber_top_name = "top"
  18. gerber_bottom_name = "bottom"
  19. gerber_cutout_name = "cutout"
  20. engraver_diameter = 0.3
  21. cutout_diameter = 3
  22. drill_diameter = 0.8
  23. def setUp(self):
  24. self.app = QtGui.QApplication(sys.argv)
  25. # Create App, keep app defaults (do not load
  26. # user-defined defaults).
  27. self.fc = App(user_defaults=False)
  28. def tearDown(self):
  29. del self.fc
  30. del self.app
  31. def test_set_get_units(self):
  32. self.fc.exec_command_test('set_sys units IN')
  33. self.fc.exec_command_test('new')
  34. units=self.fc.exec_command_test('get_sys units')
  35. self.assertEquals(units, "IN")
  36. self.fc.exec_command_test('set_sys units MM')
  37. self.fc.exec_command_test('new')
  38. units=self.fc.exec_command_test('get_sys units')
  39. self.assertEquals(units, "MM")
  40. def test_gerber_flow(self):
  41. # open gerber files top, bottom and cutout
  42. self.fc.exec_command_test('set_sys units MM')
  43. self.fc.exec_command_test('new')
  44. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_top_filename, self.gerber_top_name))
  45. gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name)
  46. self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber),
  47. "Expected FlatCAMGerber, instead, %s is %s" %
  48. (self.gerber_top_name, type(gerber_top_obj)))
  49. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name))
  50. gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name)
  51. self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber),
  52. "Expected FlatCAMGerber, instead, %s is %s" %
  53. (self.gerber_bottom_name, type(gerber_bottom_obj)))
  54. self.fc.exec_command_test('open_gerber %s/%s -outname %s' % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name))
  55. gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name)
  56. self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber),
  57. "Expected FlatCAMGerber, instead, %s is %s" %
  58. (self.gerber_cutout_name, type(gerber_cutout_obj)))
  59. # exteriors delete and join geometries for top layer
  60. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter))
  61. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior'))
  62. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso'))
  63. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior')
  64. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  65. "Expected FlatCAMGeometry, instead, %s is %s" %
  66. (self.gerber_cutout_name + '_iso_exterior', type(obj)))
  67. # mirror bottom gerbers
  68. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name))
  69. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name))
  70. # exteriors delete and join geometries for bottom layer
  71. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso'))
  72. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  73. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  74. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  75. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  76. "Expected FlatCAMGeometry, instead, %s is %s" %
  77. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  78. # at this stage we should have 5 objects
  79. names = self.fc.collection.get_names()
  80. self.assertEqual(len(names), 5,
  81. "Expected 5 objects, found %d" % len(names))
  82. # isolate traces
  83. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter))
  84. self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter))
  85. # join isolated geometries for top and bottom
  86. 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'))
  87. 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'))
  88. # at this stage we should have 9 objects
  89. names = self.fc.collection.get_names()
  90. self.assertEqual(len(names), 9,
  91. "Expected 9 objects, found %d" % len(names))
  92. # clean unused isolations
  93. self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso'))
  94. self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso'))
  95. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior'))
  96. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior'))
  97. # at this stage we should have 5 objects again
  98. names = self.fc.collection.get_names()
  99. self.assertEqual(len(names), 5,
  100. "Expected 5 objects, found %d" % len(names))
  101. # geocutout bottom test (it cuts to same object)
  102. self.fc.exec_command_test('isolate %s -dia %f -outname %s' % (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso'))
  103. self.fc.exec_command_test('exteriors %s -outname %s' % (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior'))
  104. self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso'))
  105. obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior')
  106. self.assertTrue(isinstance(obj, FlatCAMGeometry),
  107. "Expected FlatCAMGeometry, instead, %s is %s" %
  108. (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj)))
  109. self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter))
  110. # at this stage we should have 6 objects
  111. names = self.fc.collection.get_names()
  112. self.assertEqual(len(names), 6,
  113. "Expected 6 objects, found %d" % len(names))
  114. # TODO: tests for tcl
  115. def test_excellon_flow(self):
  116. self.fc.exec_command_test('set_sys units MM')
  117. self.fc.exec_command_test('open_excellon %s/%s -outname %s' % (self.gerber_files, self.excellon_filename, self.excellon_name))
  118. excellon_obj = self.fc.collection.get_by_name(self.excellon_name)
  119. self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon),
  120. "Expected FlatCAMExcellon, instead, %s is %s" %
  121. (self.excellon_name, type(excellon_obj)))
  122. # mirror bottom excellon
  123. self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name))
  124. # TODO: tests for tcl