From 3b3c87e953dda07005ea0eb5c710ad86656353a8 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 6 Mar 2023 16:40:49 +0200 Subject: [PATCH] - fixed some possible issues due of changes in version 2.0 of Shapely - removed the import * statement from most of the app --- Bookmark.py | 6 +- CHANGELOG.md | 5 + FlatCAM.py | 1 + appDatabase.py | 3 +- appEditors/AppExcEditor.py | 6 +- appEditors/AppGeoEditor.py | 6 +- appEditors/AppGerberEditor.py | 119 +- appEditors/AppTextEditor.py | 2 +- appEditors/appGCodeEditor.py | 5 +- appEditors/exc_plugins/ExcCopyPlugin.py | 10 +- appEditors/exc_plugins/ExcDrillArrayPlugin.py | 11 +- appEditors/exc_plugins/ExcDrillPlugin.py | 8 +- appEditors/exc_plugins/ExcResizePlugin.py | 8 +- appEditors/exc_plugins/ExcSlotArrayPlugin.py | 8 +- appEditors/exc_plugins/ExcSlotPlugin.py | 8 +- appEditors/geo_plugins/GeoBufferPlugin.py | 10 +- appEditors/geo_plugins/GeoCirclePlugin.py | 11 +- appEditors/geo_plugins/GeoCopyPlugin.py | 8 +- appEditors/geo_plugins/GeoPaintPlugin.py | 14 +- appEditors/geo_plugins/GeoPathPlugin.py | 8 +- appEditors/geo_plugins/GeoRectanglePlugin.py | 11 +- .../geo_plugins/GeoSimplificationPlugin.py | 37 +- appEditors/geo_plugins/GeoTextPlugin.py | 12 +- .../geo_plugins/GeoTransformationPlugin.py | 11 +- appEditors/grb_plugins/GrbBufferPlugin.py | 11 +- appEditors/grb_plugins/GrbCommon.py | 9 +- appEditors/grb_plugins/GrbCopyPlugin.py | 9 +- appEditors/grb_plugins/GrbPadArrayPlugin.py | 10 +- appEditors/grb_plugins/GrbPadPlugin.py | 9 +- .../grb_plugins/GrbSimplificationPlugin.py | 10 +- appEditors/grb_plugins/GrbTrackPlugin.py | 9 +- .../grb_plugins/GrbTransformationPlugin.py | 11 +- appEditors/grb_plugins/GrberRegionPlugin.py | 8 +- appGUI/preferences/PreferencesSectionUI.py | 1 + appGUI/preferences/PreferencesUIManager.py | 6 +- .../cncjob/CNCJobAdvOptPrefGroupUI.py | 1 + .../cncjob/CNCJobEditorPrefGroupUI.py | 1 + .../cncjob/CNCJobGenPrefGroupUI.py | 1 + .../cncjob/CNCJobOptPrefGroupUI.py | 1 + appGUI/preferences/cncjob/CNCJobPPGroupUI.py | 2 + .../preferences/cncjob/CNCJobPreferencesUI.py | 1 + .../excellon/ExcellonAdvOptPrefGroupUI.py | 2 + .../excellon/ExcellonExpPrefGroupUI.py | 2 + .../excellon/ExcellonGenPrefGroupUI.py | 2 + .../excellon/ExcellonOptPrefGroupUI.py | 2 + .../excellon/ExcellonPreferencesUI.py | 1 + .../general/GeneralAPPSetGroupUI.py | 1 + .../general/GeneralAppPrefGroupUI.py | 1 + .../general/GeneralAppSettingsGroupUI.py | 7 +- .../general/GeneralGUIPrefGroupUI.py | 1 + .../general/GeneralPreferencesUI.py | 1 + .../geometry/GeometryAdvOptPrefGroupUI.py | 1 + .../geometry/GeometryEditorPrefGroupUI.py | 1 + .../geometry/GeometryExpPrefGroupUI.py | 1 + .../geometry/GeometryGenPrefGroupUI.py | 1 + .../geometry/GeometryOptPrefGroupUI.py | 1 + .../geometry/GeometryPreferencesUI.py | 1 + .../gerber/GerberAdvOptPrefGroupUI.py | 1 + .../gerber/GerberEditorPrefGroupUI.py | 1 + .../gerber/GerberExpPrefGroupUI.py | 1 + .../gerber/GerberGenPrefGroupUI.py | 1 + .../gerber/GerberOptPrefGroupUI.py | 1 + .../preferences/gerber/GerberPreferencesUI.py | 1 + .../tools/Plugins2PreferencesUI.py | 1 + .../tools/PluginsEngravingPreferencesUI.py | 1 + .../preferences/tools/PluginsPreferencesUI.py | 1 + .../tools/Tools2CThievingPrefGroupUI.py | 1 + .../tools/Tools2ExtractPrefGroupUI.py | 1 + .../tools/Tools2FiducialsPrefGroupUI.py | 1 + .../tools/Tools2InvertPrefGroupUI.py | 1 + .../tools/Tools2OptimalPrefGroupUI.py | 1 + .../tools/Tools2PunchGerberPrefGroupUI.py | 1 + .../tools/Tools2QRCodePrefGroupUI.py | 1 + .../tools/Tools2RulesCheckPrefGroupUI.py | 1 + .../tools/Tools2sidedPrefGroupUI.py | 1 + .../tools/ToolsCalculatorsPrefGroupUI.py | 1 + .../tools/ToolsCutoutPrefGroupUI.py | 1 + .../tools/ToolsDrillPrefGroupUI.py | 1 + .../preferences/tools/ToolsFilmPrefGroupUI.py | 1 + .../preferences/tools/ToolsISOPrefGroupUI.py | 1 + .../tools/ToolsLevelPrefGroupUI.py | 1 + .../tools/ToolsMarkersPrefGroupUI.py | 1 + .../preferences/tools/ToolsMillPrefGroupUI.py | 1 + .../preferences/tools/ToolsNCCPrefGroupUI.py | 1 + .../tools/ToolsPaintPrefGroupUI.py | 1 + .../tools/ToolsPanelizePrefGroupUI.py | 1 + .../tools/ToolsSolderpastePrefGroupUI.py | 1 + .../preferences/tools/ToolsSubPrefGroupUI.py | 1 + .../tools/ToolsTransformPrefGroupUI.py | 1 + .../utilities/AutoCompletePrefGroupUI.py | 1 + .../preferences/utilities/FAExcPrefGroupUI.py | 1 + .../preferences/utilities/FAGcoPrefGroupUI.py | 1 + .../preferences/utilities/FAGrbPrefGroupUI.py | 1 + .../utilities/UtilPreferencesUI.py | 1 + appHandlers/AppIO.py | 5 +- appMain.py | 159 +- appObjects/AppObject.py | 4 +- appObjects/AppObjectTemplate.py | 15 +- appObjects/CNCJobObject.py | 15 +- appObjects/DocumentObject.py | 4 + appObjects/ExcellonObject.py | 10 +- appObjects/GeometryObject.py | 19 +- appObjects/GerberObject.py | 10 +- appObjects/ScriptObject.py | 6 +- appParsers/ParseDXF.py | 11 +- appParsers/ParseExcellon.py | 4 +- appParsers/ParseFont.py | 1 + appParsers/ParseGerber.py | 23 +- appParsers/ParseHPGL2.py | 1 - appPlugins/ToolAlignObjects.py | 14 +- appPlugins/ToolCalculators.py | 14 +- appPlugins/ToolCopperThieving.py | 21 +- appPlugins/ToolCutOut.py | 24 +- appPlugins/ToolDblSided.py | 16 +- appPlugins/ToolDistance.py | 18 +- appPlugins/ToolDrilling.py | 21 +- appPlugins/ToolEtchCompensation.py | 18 +- appPlugins/ToolExtract.py | 14 +- appPlugins/ToolFiducials.py | 21 +- appPlugins/ToolFilm.py | 17 +- appPlugins/ToolFollow.py | 20 +- appPlugins/ToolImage.py | 16 +- appPlugins/ToolInvertGerber.py | 15 +- appPlugins/ToolIsolation.py | 35 +- appPlugins/ToolLevelling.py | 25 +- appPlugins/ToolMarkers.py | 16 +- appPlugins/ToolMilling.py | 21 +- appPlugins/ToolMove.py | 16 +- appPlugins/ToolNCC.py | 55 +- appPlugins/ToolObjectDistance.py | 15 +- appPlugins/ToolOptimal.py | 19 +- appPlugins/ToolPDF.py | 23 +- appPlugins/ToolPaint.py | 47 +- appPlugins/ToolPanelize.py | 19 +- appPlugins/ToolPcbWizard.py | 17 +- appPlugins/ToolPunchGerber.py | 52 +- appPlugins/ToolQRCode.py | 32 +- appPlugins/ToolReport.py | 21 +- appPlugins/ToolRulesCheck.py | 29 +- appPlugins/ToolShell.py | 6 +- appPlugins/ToolSolderPaste.py | 36 +- appPlugins/ToolSub.py | 28 +- appPlugins/ToolTransform.py | 16 +- appPool.py | 1 + appPreProcessor.py | 1 - appTool.py | 26 +- appWorkerStack.py | 1 + camlib.py | 40 +- preprocessors/Berta_CNC.py | 3 +- preprocessors/Check_points.py | 3 +- preprocessors/Default_no_M6.py | 3 +- preprocessors/GRBL_11.py | 3 +- preprocessors/GRBL_11_no_M6.py | 3 +- preprocessors/GRBL_laser.py | 3 +- preprocessors/GRBL_laser_z.py | 2 +- preprocessors/ISEL_CNC.py | 3 +- preprocessors/ISEL_ICP_CNC.py | 3 +- preprocessors/Line_xyz.py | 3 +- preprocessors/Marlin.py | 3 +- preprocessors/Marlin_laser_FAN_pin.py | 2 +- preprocessors/Marlin_laser_Spindle_pin.py | 2 +- preprocessors/Marlin_laser_z.py | 2 +- preprocessors/NCCAD9.py | 3 +- preprocessors/Paste_1.py | 4 +- preprocessors/Paste_GRBL.py | 6 +- preprocessors/Paste_Marlin.py | 2 +- preprocessors/Repetier.py | 3 +- preprocessors/Roland_MDX_20.py | 2 +- preprocessors/Roland_MDX_540.py | 2 +- preprocessors/Toolchange_Manual.py | 3 +- preprocessors/Toolchange_Probe_MACH3.py | 3 +- preprocessors/default.py | 3 +- preprocessors/default_laser.py | 3 +- preprocessors/grbl_laser_eleks_drd.py | 3 +- preprocessors/hpgl.py | 2 +- requirements.txt | 1 + tests/__init__.py | 0 tests/canvas/performance.py | 95 - tests/canvas/prof.sh | 6 - tests/excellon_files/case1.drl | 125 - tests/frameless_window.py | 148 - tests/gerber_files/STM32F4-spindle.cmp | 6358 ----------------- tests/gerber_files/detector_contour.gbr | 26 - tests/gerber_files/detector_copper_bottom.gbr | 2146 ------ tests/gerber_files/detector_copper_top.gbr | 71 - tests/gerber_files/detector_drill.txt | 46 - tests/gerber_files/simple1.gbr | 54 - tests/gerber_parsing_profiling/gerber1.gbr | 3045 -------- .../gerber_parsing_line_profile_1.py | 13 - .../gerber_parsing_profile_1.py | 17 - tests/new_window_test.py | 70 - tests/other/destructor_test.py | 34 - tests/other/profile_gerber_parser.py | 8 - tests/other/test_excellon_1.py | 49 - tests/other/test_fcrts.py | 37 - tests/other/test_plotg.py | 48 - tests/other/test_rt.py | 24 - tests/svg/7segment_9,9.svg | 34 - tests/svg/Arduino Nano3_pcb.svg | 468 -- tests/svg/drawing.svg | 126 - tests/svg/usb_connector.svg | 77 - tests/svg/use.svg | 101 - tests/test_excellon.py | 331 - tests/test_excellon_flow.py | 163 - tests/test_gerber_buffer.py | 35 - tests/test_gerber_flow.py | 190 - tests/test_paint.py | 213 - tests/test_pathconnect.py | 89 - tests/test_polygon_paint.py | 220 - tests/test_svg_flow.py | 127 - tests/test_tclCommands/__init__.py | 18 - .../test_TclCommandAddPolygon.py | 18 - .../test_TclCommandAddPolyline.py | 18 - .../test_tclCommands/test_TclCommandCncjob.py | 17 - .../test_TclCommandDrillcncjob.py | 18 - .../test_TclCommandExportGcode.py | 33 - .../test_TclCommandExteriors.py | 24 - .../test_TclCommandImportSvg.py | 60 - .../test_TclCommandInteriors.py | 24 - .../test_TclCommandIsolate.py | 21 - tests/test_tclCommands/test_TclCommandNew.py | 48 - .../test_TclCommandNewGeometry.py | 14 - .../test_TclCommandOpenExcellon.py | 15 - .../test_TclCommandOpenGerber.py | 25 - .../test_TclCommandPaintPolygon.py | 25 - tests/test_tcl_shell.py | 272 - tests/test_voronoi.py | 26 - tests/titlebar_custom.py | 197 - .../toollift_minimization_line_profile1.py | 8 - .../toollift_minimization_profile1.py | 11 - 230 files changed, 1253 insertions(+), 15935 deletions(-) delete mode 100644 tests/__init__.py delete mode 100644 tests/canvas/performance.py delete mode 100755 tests/canvas/prof.sh delete mode 100644 tests/excellon_files/case1.drl delete mode 100644 tests/frameless_window.py delete mode 100644 tests/gerber_files/STM32F4-spindle.cmp delete mode 100644 tests/gerber_files/detector_contour.gbr delete mode 100644 tests/gerber_files/detector_copper_bottom.gbr delete mode 100644 tests/gerber_files/detector_copper_top.gbr delete mode 100644 tests/gerber_files/detector_drill.txt delete mode 100644 tests/gerber_files/simple1.gbr delete mode 100755 tests/gerber_parsing_profiling/gerber1.gbr delete mode 100644 tests/gerber_parsing_profiling/gerber_parsing_line_profile_1.py delete mode 100644 tests/gerber_parsing_profiling/gerber_parsing_profile_1.py delete mode 100644 tests/new_window_test.py delete mode 100644 tests/other/destructor_test.py delete mode 100644 tests/other/profile_gerber_parser.py delete mode 100644 tests/other/test_excellon_1.py delete mode 100644 tests/other/test_fcrts.py delete mode 100644 tests/other/test_plotg.py delete mode 100644 tests/other/test_rt.py delete mode 100644 tests/svg/7segment_9,9.svg delete mode 100644 tests/svg/Arduino Nano3_pcb.svg delete mode 100644 tests/svg/drawing.svg delete mode 100644 tests/svg/usb_connector.svg delete mode 100644 tests/svg/use.svg delete mode 100644 tests/test_excellon.py delete mode 100644 tests/test_excellon_flow.py delete mode 100644 tests/test_gerber_buffer.py delete mode 100644 tests/test_gerber_flow.py delete mode 100644 tests/test_paint.py delete mode 100644 tests/test_pathconnect.py delete mode 100644 tests/test_polygon_paint.py delete mode 100644 tests/test_svg_flow.py delete mode 100644 tests/test_tclCommands/__init__.py delete mode 100644 tests/test_tclCommands/test_TclCommandAddPolygon.py delete mode 100644 tests/test_tclCommands/test_TclCommandAddPolyline.py delete mode 100644 tests/test_tclCommands/test_TclCommandCncjob.py delete mode 100644 tests/test_tclCommands/test_TclCommandDrillcncjob.py delete mode 100644 tests/test_tclCommands/test_TclCommandExportGcode.py delete mode 100644 tests/test_tclCommands/test_TclCommandExteriors.py delete mode 100644 tests/test_tclCommands/test_TclCommandImportSvg.py delete mode 100644 tests/test_tclCommands/test_TclCommandInteriors.py delete mode 100644 tests/test_tclCommands/test_TclCommandIsolate.py delete mode 100644 tests/test_tclCommands/test_TclCommandNew.py delete mode 100644 tests/test_tclCommands/test_TclCommandNewGeometry.py delete mode 100644 tests/test_tclCommands/test_TclCommandOpenExcellon.py delete mode 100644 tests/test_tclCommands/test_TclCommandOpenGerber.py delete mode 100644 tests/test_tclCommands/test_TclCommandPaintPolygon.py delete mode 100644 tests/test_tcl_shell.py delete mode 100644 tests/test_voronoi.py delete mode 100644 tests/titlebar_custom.py delete mode 100644 tests/toolpath_optimization_profiling/toollift_minimization_line_profile1.py delete mode 100644 tests/toolpath_optimization_profiling/toollift_minimization_profile1.py diff --git a/Bookmark.py b/Bookmark.py index 7826c844..8c3bbf49 100644 --- a/Bookmark.py +++ b/Bookmark.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui, QtCore, QtWidgets from appGUI.GUIElements import FCTable, FCEntry, FCButton, FCFileSaveDialog, GLay, FCLabel @@ -5,7 +6,8 @@ import sys import webbrowser from copy import deepcopy -from datetime import datetime +from datetime import datetime as dt + import gettext import appTranslation as fcTranslate import builtins @@ -284,7 +286,7 @@ class BookmarkManager(QtWidgets.QWidget): self.app.defaults.report_usage("on_export_bookmarks") self.app.log.debug("on_export_bookmarks()") - date = str(datetime.today()).rpartition('.')[0] + date = str(dt.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') date = date.replace(' ', '_') diff --git a/CHANGELOG.md b/CHANGELOG.md index dc622ade..7050396f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ CHANGELOG for FlatCAM Evo beta ================================================= +6.03.2023 + +- fixed some possible issues due of changes in version 2.0 of Shapely +- removed the import * statement from most of the app + 01.03.2023 - in Tool Milling made sure that deleting the only tool will not crash the application diff --git a/FlatCAM.py b/FlatCAM.py index b4652c4b..61f7498a 100644 --- a/FlatCAM.py +++ b/FlatCAM.py @@ -1,3 +1,4 @@ + import sys import os import traceback diff --git a/appDatabase.py b/appDatabase.py index 57bebbcd..7d5d47f1 100644 --- a/appDatabase.py +++ b/appDatabase.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui, QtCore, QtWidgets from appGUI.GUIElements import FCEntry, FCButton, FCDoubleSpinner, FCComboBox, FCCheckBox, FCSpinner, \ FCTree, RadioSet, FCFileSaveDialog, FCLabel, FCComboBox2, GLay @@ -3091,7 +3092,7 @@ class ToolsDB2(QtWidgets.QWidget): # multidepth_item.set_value(data['multidepth']) # widget.setCellWidget(row, 8, multidepth_item) # -# # to make the checkbox centered but it can no longer have it's value accessed - needs a fix using findchild() +# # to make the checkbox centered, but it can no longer have its value accessed - needs a fix using findchild() # # multidepth_item = QtWidgets.QWidget() # # cb = FCCheckBox() # # cb.set_value(data['multidepth']) diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index 576ed827..c6fe2191 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -7,7 +7,9 @@ from camlib import distance, arc, AppRTreeStorage -from appEditors.exc_plugins.ExcDrillPlugin import * +from PyQt6 import QtCore, QtWidgets, QtGui +from PyQt6.QtCore import Qt +from appEditors.exc_plugins.ExcDrillPlugin import ExcDrillEditorTool from appEditors.exc_plugins.ExcSlotPlugin import ExcSlotEditorTool from appEditors.exc_plugins.ExcDrillArrayPlugin import ExcDrillArrayEditorTool from appEditors.exc_plugins.ExcSlotArrayPlugin import ExcSlotArrayEditorTool @@ -3102,7 +3104,7 @@ class AppExcEditor(QtCore.QObject): return f - def connect_exc_toolbar_signals(self): + def connect_exc_toolbar_signals(self) -> None: self.tools_exc.update({ "drill_select": {"button": self.app.ui.select_drill_btn, "constructor": SelectEditorExc}, "drill_add": {"button": self.app.ui.add_drill_btn, "constructor": DrillAdd}, diff --git a/appEditors/AppGeoEditor.py b/appEditors/AppGeoEditor.py index 11cfa5d9..19db79e4 100644 --- a/appEditors/AppGeoEditor.py +++ b/appEditors/AppGeoEditor.py @@ -11,11 +11,14 @@ # Date: 3/10/2019 # # ########################################################## +from PyQt6 import QtGui, QtCore, QtWidgets +from PyQt6.QtCore import Qt # import inspect import math from camlib import distance, arc, three_point_circle, Geometry, AppRTreeStorage, flatten_shapely_geometry -from appGUI.GUIElements import * +from appGUI.GUIElements import FCLabel, GLay, FCDoubleSpinner, FCTree, FCButton, FCFrame, FCCheckBox, FCEntry, \ + FCTextEdit from appGUI.VisPyVisuals import ShapeCollection from appEditors.geo_plugins.GeoBufferPlugin import BufferSelectionTool @@ -44,6 +47,7 @@ from rtree import index as rtindex from copy import deepcopy # from vispy.io import read_png + import gettext import appTranslation as fcTranslate import builtins diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 60e0eeef..1612cd3f 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -5,7 +5,7 @@ # MIT Licence # # ########################################################## -from appEditors.grb_plugins.GrbCommon import * +from appEditors.grb_plugins.GrbCommon import DrawToolUtilityShape, DrawToolShape, DrawTool, ShapeToolEditorGrb from camlib import distance, arc, three_point_circle, flatten_shapely_geometry from appGUI.GUIElements import * @@ -24,8 +24,18 @@ from appEditors.grb_plugins.GrberRegionPlugin import GrbRegionEditorTool # import inspect # from vispy.io import read_png +from vispy.geometry.rect import Rect # import pngcanvas import traceback +import numpy as np +from numpy.linalg import norm as numpy_norm +import math +from copy import deepcopy + +from shapely.geometry import Point, Polygon, MultiPolygon, LineString, LinearRing, box +from shapely.ops import unary_union +from shapely.affinity import translate, scale, skew, rotate + import gettext import appTranslation as fcTranslate import builtins @@ -610,11 +620,11 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): new_geo_el = {} if 'solid' in geo_el: - new_geo_el['solid'] = affinity.translate( + new_geo_el['solid'] = translate( geo_el['solid'], xoff=(dx - self.last_dx), yoff=(dy - self.last_dy) ) if 'follow' in geo_el: - new_geo_el['follow'] = affinity.translate( + new_geo_el['follow'] = translate( geo_el['follow'], xoff=(dx - self.last_dx), yoff=(dy - self.last_dy) ) geo_el_list.append(new_geo_el) @@ -790,8 +800,8 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): y = self.origin[1] + radius * math.sin(-angle_radians + angle) geo = self.util_shape((x, y)) - geo_sol = affinity.rotate(geo['solid'], angle=(math.pi - angle_radians + angle), use_radians=True) - geo_fol = affinity.rotate(geo['follow'], angle=(math.pi - angle_radians + angle), use_radians=True) + geo_sol = rotate(geo['solid'], angle=(math.pi - angle_radians + angle), use_radians=True) + geo_fol = rotate(geo['follow'], angle=(math.pi - angle_radians + angle), use_radians=True) geo_el = { 'solid': geo_sol, 'follow': geo_fol @@ -804,8 +814,8 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): y = self.origin[1] + radius * math.sin(angle_radians + angle) geo = self.util_shape((x, y)) - geo_sol = affinity.rotate(geo['solid'], angle=(angle_radians + angle - math.pi), use_radians=True) - geo_fol = affinity.rotate(geo['follow'], angle=(angle_radians + angle - math.pi), use_radians=True) + geo_sol = rotate(geo['solid'], angle=(angle_radians + angle - math.pi), use_radians=True) + geo_fol = rotate(geo['follow'], angle=(angle_radians + angle - math.pi), use_radians=True) geo_el = { 'solid': geo_sol, 'follow': geo_fol @@ -1089,7 +1099,7 @@ class PoligonizeEditorGrb(ShapeToolEditorGrb): else: modifier_to_use = Qt.KeyboardModifier.ShiftModifier # if modifier key is pressed then we add to the selected list the current shape but if it's already - # in the selected list, we removed it. Therefore first click selects, second deselects. + # in the selected list, we removed it. Therefore, first click selects, second deselects. if key_modifier == modifier_to_use: self.draw_app.select_tool(self.draw_app.active_tool.name) else: @@ -2163,7 +2173,7 @@ class DiscSemiEditorGrb(ShapeToolEditorGrb): except KeyError: size_ap = 0.0 # self.draw_app.app.inform.emit( - # '[ERROR_NOTCL] %s' % _("You need to preselect a aperture in the Aperture Table that has a size.")) + # '[ERROR_NOTCL] %s' % _("You need to preselect an aperture in the Aperture Table that has a size.")) # try: # QtGui.QGuiApplication.restoreOverrideCursor() # except Exception: @@ -2839,11 +2849,11 @@ class MoveEditorGrb(ShapeToolEditorGrb): geometric_data = select_shape.geo new_geo_el = {} if 'solid' in geometric_data: - new_geo_el['solid'] = affinity.translate(geometric_data['solid'], xoff=dx, yoff=dy) + new_geo_el['solid'] = translate(geometric_data['solid'], xoff=dx, yoff=dy) if 'follow' in geometric_data: - new_geo_el['follow'] = affinity.translate(geometric_data['follow'], xoff=dx, yoff=dy) + new_geo_el['follow'] = translate(geometric_data['follow'], xoff=dx, yoff=dy) if 'clear' in geometric_data: - new_geo_el['clear'] = affinity.translate(geometric_data['clear'], xoff=dx, yoff=dy) + new_geo_el['clear'] = translate(geometric_data['clear'], xoff=dx, yoff=dy) self.geometry.append(DrawToolShape(new_geo_el)) self.current_storage.remove(select_shape) @@ -2892,15 +2902,15 @@ class MoveEditorGrb(ShapeToolEditorGrb): for geom in self.draw_app.get_selected(): new_geo_el = {} if 'solid' in geom.geo: - new_geo_el['solid'] = affinity.translate(geom.geo['solid'], xoff=dx, yoff=dy) + new_geo_el['solid'] = translate(geom.geo['solid'], xoff=dx, yoff=dy) if 'follow' in geom.geo: - new_geo_el['follow'] = affinity.translate(geom.geo['follow'], xoff=dx, yoff=dy) + new_geo_el['follow'] = translate(geom.geo['follow'], xoff=dx, yoff=dy) if 'clear' in geom.geo: - new_geo_el['clear'] = affinity.translate(geom.geo['clear'], xoff=dx, yoff=dy) + new_geo_el['clear'] = translate(geom.geo['clear'], xoff=dx, yoff=dy) geo_list.append(deepcopy(new_geo_el)) return DrawToolUtilityShape(geo_list) else: - ss_el = {'solid': affinity.translate(self.selection_shape, xoff=dx, yoff=dy)} + ss_el = {'solid': translate(self.selection_shape, xoff=dx, yoff=dy)} return DrawToolUtilityShape(ss_el) @@ -2922,11 +2932,11 @@ class CopyEditorGrb(MoveEditorGrb): geometric_data = select_shape.geo new_geo_el = {} if 'solid' in geometric_data: - new_geo_el['solid'] = affinity.translate(geometric_data['solid'], xoff=dx, yoff=dy) + new_geo_el['solid'] = translate(geometric_data['solid'], xoff=dx, yoff=dy) if 'follow' in geometric_data: - new_geo_el['follow'] = affinity.translate(geometric_data['follow'], xoff=dx, yoff=dy) + new_geo_el['follow'] = translate(geometric_data['follow'], xoff=dx, yoff=dy) if 'clear' in geometric_data: - new_geo_el['clear'] = affinity.translate(geometric_data['clear'], xoff=dx, yoff=dy) + new_geo_el['clear'] = translate(geometric_data['clear'], xoff=dx, yoff=dy) self.geometry.append(DrawToolShape(new_geo_el)) sel_shapes_to_be_deleted.append(select_shape) @@ -3121,11 +3131,11 @@ class EraserEditorGrb(ShapeToolEditorGrb): for geom in self.draw_app.get_selected(): new_geo_el = {} if 'solid' in geom.geo: - new_geo_el['solid'] = affinity.translate(geom.geo['solid'], xoff=dx, yoff=dy) + new_geo_el['solid'] = translate(geom.geo['solid'], xoff=dx, yoff=dy) if 'follow' in geom.geo: - new_geo_el['follow'] = affinity.translate(geom.geo['follow'], xoff=dx, yoff=dy) + new_geo_el['follow'] = translate(geom.geo['follow'], xoff=dx, yoff=dy) if 'clear' in geom.geo: - new_geo_el['clear'] = affinity.translate(geom.geo['clear'], xoff=dx, yoff=dy) + new_geo_el['clear'] = translate(geom.geo['clear'], xoff=dx, yoff=dy) geo_list.append(deepcopy(new_geo_el)) return DrawToolUtilityShape(geo_list) @@ -4558,14 +4568,11 @@ class AppGerberEditor(QtCore.QObject): geometric_data = geo_el.geo new_geo_el = {} if 'solid' in geometric_data: - new_geo_el['solid'] = deepcopy(affinity.scale(geometric_data['solid'], - xfact=factor, yfact=factor)) + new_geo_el['solid'] = deepcopy(scale(geometric_data['solid'], xfact=factor, yfact=factor)) if 'follow' in geometric_data: - new_geo_el['follow'] = deepcopy(affinity.scale(geometric_data['follow'], - xfact=factor, yfact=factor)) + new_geo_el['follow'] = deepcopy(scale(geometric_data['follow'], xfact=factor, yfact=factor)) if 'clear' in geometric_data: - new_geo_el['clear'] = deepcopy(affinity.scale(geometric_data['clear'], - xfact=factor, yfact=factor)) + new_geo_el['clear'] = deepcopy(scale(geometric_data['clear'], xfact=factor, yfact=factor)) geometry.append(new_geo_el) self.add_gerber_shape(geometry, self.storage_dict[val_edited]) @@ -5848,7 +5855,7 @@ class AppGerberEditor(QtCore.QObject): if self.app.selection_type is not None: self.draw_selection_area_handler(self.pos, pos, self.app.selection_type) self.app.selection_type = None - if isinstance(self.active_tool, (SimplifyEditorGrb)): + if isinstance(self.active_tool, SimplifyEditorGrb): self.active_tool.simp_tool.calculate_coords_vertex() elif isinstance(self.active_tool, (SelectEditorGrb, SimplifyEditorGrb)): @@ -6416,15 +6423,15 @@ class AppGerberEditor(QtCore.QObject): geometric_data = geom_el.geo scaled_geom_el = {} if 'solid' in geometric_data: - scaled_geom_el['solid'] = affinity.scale( + scaled_geom_el['solid'] = scale( geometric_data['solid'], scale_factor, scale_factor, origin='center' ) if 'follow' in geometric_data: - scaled_geom_el['follow'] = affinity.scale( + scaled_geom_el['follow'] = scale( geometric_data['follow'], scale_factor, scale_factor, origin='center' ) if 'clear' in geometric_data: - scaled_geom_el['clear'] = affinity.scale( + scaled_geom_el['clear'] = scale( geometric_data['clear'], scale_factor, scale_factor, origin='center' ) @@ -7625,11 +7632,11 @@ class TransformEditorTool(AppTool): for sel_el_shape in elem_list: sel_el = sel_el_shape.geo if 'solid' in sel_el: - sel_el['solid'] = affinity.rotate(sel_el['solid'], angle=-val, origin=(px, py)) + sel_el['solid'] = rotate(sel_el['solid'], angle=-val, origin=(px, py)) if 'follow' in sel_el: - sel_el['follow'] = affinity.rotate(sel_el['follow'], angle=-val, origin=(px, py)) + sel_el['follow'] = rotate(sel_el['follow'], angle=-val, origin=(px, py)) if 'clear' in sel_el: - sel_el['clear'] = affinity.rotate(sel_el['clear'], angle=-val, origin=(px, py)) + sel_el['clear'] = rotate(sel_el['clear'], angle=-val, origin=(px, py)) self.draw_app.plot_all() self.app.inform.emit('[success] %s' % _("Done.")) @@ -7660,19 +7667,19 @@ class TransformEditorTool(AppTool): sel_el = sel_el_shape.geo if axis == 'X': if 'solid' in sel_el: - sel_el['solid'] = affinity.scale(sel_el['solid'], xfact=1, yfact=-1, origin=(px, py)) + sel_el['solid'] = scale(sel_el['solid'], xfact=1, yfact=-1, origin=(px, py)) if 'follow' in sel_el: - sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=1, yfact=-1, origin=(px, py)) + sel_el['follow'] = scale(sel_el['follow'], xfact=1, yfact=-1, origin=(px, py)) if 'clear' in sel_el: - sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=1, yfact=-1, origin=(px, py)) + sel_el['clear'] = scale(sel_el['clear'], xfact=1, yfact=-1, origin=(px, py)) self.app.inform.emit('[success] %s...' % _('Flip on Y axis done')) elif axis == 'Y': if 'solid' in sel_el: - sel_el['solid'] = affinity.scale(sel_el['solid'], xfact=-1, yfact=1, origin=(px, py)) + sel_el['solid'] = scale(sel_el['solid'], xfact=-1, yfact=1, origin=(px, py)) if 'follow' in sel_el: - sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=-1, yfact=1, origin=(px, py)) + sel_el['follow'] = scale(sel_el['follow'], xfact=-1, yfact=1, origin=(px, py)) if 'clear' in sel_el: - sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=-1, yfact=1, origin=(px, py)) + sel_el['clear'] = scale(sel_el['clear'], xfact=-1, yfact=1, origin=(px, py)) self.app.inform.emit('[success] %s...' % _('Flip on X axis done')) self.draw_app.plot_all() except Exception as e: @@ -7703,11 +7710,11 @@ class TransformEditorTool(AppTool): sel_el = sel_el_shape.geo if 'solid' in sel_el: - sel_el['solid'] = affinity.skew(sel_el['solid'], xval, yval, origin=(px, py)) + sel_el['solid'] = skew(sel_el['solid'], xval, yval, origin=(px, py)) if 'follow' in sel_el: - sel_el['follow'] = affinity.skew(sel_el['follow'], xval, yval, origin=(px, py)) + sel_el['follow'] = skew(sel_el['follow'], xval, yval, origin=(px, py)) if 'clear' in sel_el: - sel_el['clear'] = affinity.skew(sel_el['clear'], xval, yval, origin=(px, py)) + sel_el['clear'] = skew(sel_el['clear'], xval, yval, origin=(px, py)) self.draw_app.plot_all() @@ -7742,11 +7749,11 @@ class TransformEditorTool(AppTool): for sel_el_shape in elem_list: sel_el = sel_el_shape.geo if 'solid' in sel_el: - sel_el['solid'] = affinity.scale(sel_el['solid'], xfactor, yfactor, origin=(px, py)) + sel_el['solid'] = scale(sel_el['solid'], xfactor, yfactor, origin=(px, py)) if 'follow' in sel_el: - sel_el['follow'] = affinity.scale(sel_el['follow'], xfactor, yfactor, origin=(px, py)) + sel_el['follow'] = scale(sel_el['follow'], xfactor, yfactor, origin=(px, py)) if 'clear' in sel_el: - sel_el['clear'] = affinity.scale(sel_el['clear'], xfactor, yfactor, origin=(px, py)) + sel_el['clear'] = scale(sel_el['clear'], xfactor, yfactor, origin=(px, py)) self.draw_app.plot_all() if str(axis) == 'X': @@ -7779,18 +7786,18 @@ class TransformEditorTool(AppTool): sel_el = sel_el_shape.geo if axis == 'X': if 'solid' in sel_el: - sel_el['solid'] = affinity.translate(sel_el['solid'], num, 0) + sel_el['solid'] = translate(sel_el['solid'], num, 0) if 'follow' in sel_el: - sel_el['follow'] = affinity.translate(sel_el['follow'], num, 0) + sel_el['follow'] = translate(sel_el['follow'], num, 0) if 'clear' in sel_el: - sel_el['clear'] = affinity.translate(sel_el['clear'], num, 0) + sel_el['clear'] = translate(sel_el['clear'], num, 0) elif axis == 'Y': if 'solid' in sel_el: - sel_el['solid'] = affinity.translate(sel_el['solid'], 0, num) + sel_el['solid'] = translate(sel_el['solid'], 0, num) if 'follow' in sel_el: - sel_el['follow'] = affinity.translate(sel_el['follow'], 0, num) + sel_el['follow'] = translate(sel_el['follow'], 0, num) if 'clear' in sel_el: - sel_el['clear'] = affinity.translate(sel_el['clear'], 0, num) + sel_el['clear'] = translate(sel_el['clear'], 0, num) self.draw_app.plot_all() if str(axis) == 'X': @@ -7816,11 +7823,11 @@ class TransformEditorTool(AppTool): if factor: if 'solid' in sel_el: - sel_el['solid'] = affinity.scale(sel_el['solid'], value, value, origin='center') + sel_el['solid'] = scale(sel_el['solid'], value, value, origin='center') if 'follow' in sel_el: - sel_el['follow'] = affinity.scale(sel_el['solid'], value, value, origin='center') + sel_el['follow'] = scale(sel_el['solid'], value, value, origin='center') if 'clear' in sel_el: - sel_el['clear'] = affinity.scale(sel_el['solid'], value, value, origin='center') + sel_el['clear'] = scale(sel_el['solid'], value, value, origin='center') else: if 'solid' in sel_el: sel_el['solid'] = sel_el['solid'].buffer( diff --git a/appEditors/AppTextEditor.py b/appEditors/AppTextEditor.py index ec3d1084..fad03f61 100644 --- a/appEditors/AppTextEditor.py +++ b/appEditors/AppTextEditor.py @@ -5,9 +5,9 @@ # MIT Licence # # ########################################################## +from PyQt6 import QtPrintSupport, QtWidgets, QtCore, QtGui from appGUI.GUIElements import FCFileSaveDialog, FCEntry, FCTextAreaExtended, FCTextAreaLineNumber, FCButton, \ FCCheckBox, FCMessageBox -from PyQt6 import QtPrintSupport, QtWidgets, QtCore, QtGui from reportlab.platypus import SimpleDocTemplate, Paragraph from reportlab.lib.styles import getSampleStyleSheet diff --git a/appEditors/appGCodeEditor.py b/appEditors/appGCodeEditor.py index f55a08ba..2923d298 100644 --- a/appEditors/appGCodeEditor.py +++ b/appEditors/appGCodeEditor.py @@ -5,11 +5,12 @@ # MIT Licence # # ########################################################## +from PyQt6 import QtWidgets, QtCore, QtGui +from PyQt6.QtCore import Qt + from appEditors.AppTextEditor import AppTextEditor from appObjects.CNCJobObject import CNCJobObject from appGUI.GUIElements import FCTextArea, FCEntry, FCButton, FCTable, GLay, FCLabel -from PyQt6 import QtWidgets, QtCore, QtGui -from PyQt6.QtCore import Qt # from io import StringIO diff --git a/appEditors/exc_plugins/ExcCopyPlugin.py b/appEditors/exc_plugins/ExcCopyPlugin.py index f2610c71..9a5cacde 100644 --- a/appEditors/exc_plugins/ExcCopyPlugin.py +++ b/appEditors/exc_plugins/ExcCopyPlugin.py @@ -1,5 +1,13 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui + +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, NumericalEvalEntry, GLay, FCFrame, FCSpinner, \ + RadioSet, FCDoubleSpinner + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/exc_plugins/ExcDrillArrayPlugin.py b/appEditors/exc_plugins/ExcDrillArrayPlugin.py index fea30e04..cc1466ed 100644 --- a/appEditors/exc_plugins/ExcDrillArrayPlugin.py +++ b/appEditors/exc_plugins/ExcDrillArrayPlugin.py @@ -1,5 +1,12 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, FCFrame, NumericalEvalEntry, FCSpinner, \ + FCDoubleSpinner, RadioSet + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -304,7 +311,7 @@ class ExcDrillArrayEditorUI: self.radius_entry = FCDoubleSpinner(policy=False) self.radius_entry.set_precision(self.decimals) self.radius_entry.setSingleStep(1.0) - self.radius_entry.setRange(-10000.0000,10000.000) + self.radius_entry.setRange(-10000.0000, 10000.000) self.circ_grid.addWidget(self.radius_lbl, 4, 0) self.circ_grid.addWidget(self.radius_entry, 4, 1) diff --git a/appEditors/exc_plugins/ExcDrillPlugin.py b/appEditors/exc_plugins/ExcDrillPlugin.py index 660e80b6..f933111f 100644 --- a/appEditors/exc_plugins/ExcDrillPlugin.py +++ b/appEditors/exc_plugins/ExcDrillPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import FCLabel, FCButton, GLay, FCFrame, VerticalScrollArea, NumericalEvalEntry, \ + FCDoubleSpinner +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/exc_plugins/ExcResizePlugin.py b/appEditors/exc_plugins/ExcResizePlugin.py index e4d117d7..1322d54a 100644 --- a/appEditors/exc_plugins/ExcResizePlugin.py +++ b/appEditors/exc_plugins/ExcResizePlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, FCFrame, NumericalEvalEntry, \ + FCDoubleSpinner +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/exc_plugins/ExcSlotArrayPlugin.py b/appEditors/exc_plugins/ExcSlotArrayPlugin.py index 19fb582d..d1c57bbc 100644 --- a/appEditors/exc_plugins/ExcSlotArrayPlugin.py +++ b/appEditors/exc_plugins/ExcSlotArrayPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, FCFrame, NumericalEvalEntry, \ + FCDoubleSpinner, RadioSet, FCSpinner +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/exc_plugins/ExcSlotPlugin.py b/appEditors/exc_plugins/ExcSlotPlugin.py index 65d8ba03..4c0546d5 100644 --- a/appEditors/exc_plugins/ExcSlotPlugin.py +++ b/appEditors/exc_plugins/ExcSlotPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, FCFrame, FCDoubleSpinner,\ + NumericalEvalEntry, RadioSet +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoBufferPlugin.py b/appEditors/geo_plugins/GeoBufferPlugin.py index 72e1b847..caa2bc8b 100644 --- a/appEditors/geo_plugins/GeoBufferPlugin.py +++ b/appEditors/geo_plugins/GeoBufferPlugin.py @@ -1,5 +1,13 @@ -from appTool import * +from PyQt6 import QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner, FCComboBox + +from shapely.geometry import Polygon + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoCirclePlugin.py b/appEditors/geo_plugins/GeoCirclePlugin.py index f3be68e8..f162147c 100644 --- a/appEditors/geo_plugins/GeoCirclePlugin.py +++ b/appEditors/geo_plugins/GeoCirclePlugin.py @@ -1,5 +1,14 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner + +from shapely.geometry import Point +from shapely.affinity import scale, rotate + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoCopyPlugin.py b/appEditors/geo_plugins/GeoCopyPlugin.py index 9d1e2f0d..e9595e26 100644 --- a/appEditors/geo_plugins/GeoCopyPlugin.py +++ b/appEditors/geo_plugins/GeoCopyPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, GLay, FCLabel, FCButton, FCFrame, NumericalEvalEntry, RadioSet, \ + FCSpinner, FCDoubleSpinner +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoPaintPlugin.py b/appEditors/geo_plugins/GeoPaintPlugin.py index 3993d2ec..9c1fd6d7 100644 --- a/appEditors/geo_plugins/GeoPaintPlugin.py +++ b/appEditors/geo_plugins/GeoPaintPlugin.py @@ -1,7 +1,17 @@ -from appTool import * +from PyQt6 import QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCFrame, FCButton, GLay, FCDoubleSpinner, FCComboBox, \ + FCCheckBox from camlib import Geometry +from shapely.geometry import Polygon +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -145,7 +155,7 @@ class PaintOptionsTool(AppToolEditor): Creates a list of non-iterable linear geometry objects. Results are placed in self.flat_geometry - :param geometry: Shapely type or list or list of list of such. + :param geometry: Shapely type, list or list of lists of such. :param reset: Clears the contents of self.flat_geometry. """ diff --git a/appEditors/geo_plugins/GeoPathPlugin.py b/appEditors/geo_plugins/GeoPathPlugin.py index 622e969c..ac6391a4 100644 --- a/appEditors/geo_plugins/GeoPathPlugin.py +++ b/appEditors/geo_plugins/GeoPathPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, GLay, FCButton, NumericalEvalEntry + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoRectanglePlugin.py b/appEditors/geo_plugins/GeoRectanglePlugin.py index 7e92876e..87bbba08 100644 --- a/appEditors/geo_plugins/GeoRectanglePlugin.py +++ b/appEditors/geo_plugins/GeoRectanglePlugin.py @@ -1,5 +1,14 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, FCFrame, FCDoubleSpinner, RadioSetCross, \ + RadioSet, NumericalEvalEntry + +from shapely.geometry import box, base + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoSimplificationPlugin.py b/appEditors/geo_plugins/GeoSimplificationPlugin.py index 38c064f6..40757d29 100644 --- a/appEditors/geo_plugins/GeoSimplificationPlugin.py +++ b/appEditors/geo_plugins/GeoSimplificationPlugin.py @@ -1,5 +1,12 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets, QtCore +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, GLay, FCLabel, FCButton, FCFrame, FCTextEdit, FCEntry, \ + FCDoubleSpinner + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -11,7 +18,7 @@ class SimplificationTool(AppToolEditor): Do a shape simplification for the selected geometry. """ - update_ui = pyqtSignal(object, int) + update_ui = QtCore.pyqtSignal(object, int) def __init__(self, app, draw_app): AppToolEditor.__init__(self, app) @@ -93,33 +100,33 @@ class SimplificationTool(AppToolEditor): selected_shapes_geos = [] tol = self.ui.geo_tol_entry.get_value() - def task_job(self): - with self.app.proc_container.new('%s...' % _("Simplify")): - selected_shapes = self.draw_app.get_selected() - self.draw_app.interdict_selection = True + def task_job(self_class): + with self_class.app.proc_container.new('%s...' % _("Simplify")): + selected_shapes = self_class.draw_app.get_selected() + self_class.draw_app.interdict_selection = True for obj_shape in selected_shapes: selected_shapes_geos.append(obj_shape.geo.simplify(tolerance=tol)) if not selected_shapes: - self.app.inform.emit('%s' % _("Failed.")) + self_class.app.inform.emit('%s' % _("Failed.")) return for shape in selected_shapes: - self.draw_app.delete_shape(shape=shape) + self_class.draw_app.delete_shape(shape=shape) for geo in selected_shapes_geos: - self.draw_app.add_shape(geo, build_ui=False) + self_class.draw_app.add_shape(geo, build_ui=False) - self.draw_app.selected = [] + self_class.draw_app.selected = [] last_sel_geo = selected_shapes_geos[-1] - self.calculate_coords_vertex(last_sel_geo) + self_class.calculate_coords_vertex(last_sel_geo) - self.app.inform.emit('%s' % _("Done.")) + self_class.app.inform.emit('%s' % _("Done.")) - self.draw_app.plot_all() - self.draw_app.interdict_selection = False - self.draw_app.build_ui_sig.emit() + self_class.draw_app.plot_all() + self_class.draw_app.interdict_selection = False + self_class.draw_app.build_ui_sig.emit() self.app.worker_task.emit({'fcn': task_job, 'params': [self]}) diff --git a/appEditors/geo_plugins/GeoTextPlugin.py b/appEditors/geo_plugins/GeoTextPlugin.py index ee1648b9..b2391666 100644 --- a/appEditors/geo_plugins/GeoTextPlugin.py +++ b/appEditors/geo_plugins/GeoTextPlugin.py @@ -1,6 +1,14 @@ -from appTool import * -from appParsers.ParseFont import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCTextAreaRich, FCComboBox +from appParsers.ParseFont import ParseFont + +import sys + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/geo_plugins/GeoTransformationPlugin.py b/appEditors/geo_plugins/GeoTransformationPlugin.py index 63d3723c..012c1ecc 100644 --- a/appEditors/geo_plugins/GeoTransformationPlugin.py +++ b/appEditors/geo_plugins/GeoTransformationPlugin.py @@ -1,5 +1,14 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor, AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner, \ + FCInputDoubleSpinner, FCComboBox, NumericalEvalTupleEntry, FCCheckBox, OptionalInputSection + +import numpy as np + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrbBufferPlugin.py b/appEditors/grb_plugins/GrbBufferPlugin.py index 64026d24..862d26d5 100644 --- a/appEditors/grb_plugins/GrbBufferPlugin.py +++ b/appEditors/grb_plugins/GrbBufferPlugin.py @@ -1,6 +1,15 @@ -from appTool import * +from PyQt6 import QtWidgets +from appTool import AppToolEditor from appEditors.grb_plugins.GrbCommon import DrawToolShape +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner, FCComboBox + +from copy import deepcopy +import traceback + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrbCommon.py b/appEditors/grb_plugins/GrbCommon.py index a90b867e..9b433ba3 100644 --- a/appEditors/grb_plugins/GrbCommon.py +++ b/appEditors/grb_plugins/GrbCommon.py @@ -4,16 +4,9 @@ # ########################################################################################### from PyQt6.QtCore import Qt -from shapely.geometry import LineString, LinearRing, MultiLineString, Point, Polygon, MultiPolygon, box -from shapely.ops import unary_union -import shapely.affinity as affinity +from shapely.geometry import MultiLineString, Polygon -import math import numpy as np -from numpy.linalg import norm as numpy_norm - -from vispy.geometry import Rect -from copy import deepcopy import logging diff --git a/appEditors/grb_plugins/GrbCopyPlugin.py b/appEditors/grb_plugins/GrbCopyPlugin.py index 9d1e2f0d..79a2cc78 100644 --- a/appEditors/grb_plugins/GrbCopyPlugin.py +++ b/appEditors/grb_plugins/GrbCopyPlugin.py @@ -1,5 +1,12 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, NumericalEvalEntry, RadioSet, \ + FCSpinner, FCDoubleSpinner + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrbPadArrayPlugin.py b/appEditors/grb_plugins/GrbPadArrayPlugin.py index f8516e6b..5d050f9d 100644 --- a/appEditors/grb_plugins/GrbPadArrayPlugin.py +++ b/appEditors/grb_plugins/GrbPadArrayPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, NumericalEvalEntry, \ + FCDoubleSpinner, FCSpinner, RadioSet +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -304,7 +310,7 @@ class GrbPadArrayEditorUI: self.radius_entry = FCDoubleSpinner(policy=False) self.radius_entry.set_precision(self.decimals) self.radius_entry.setSingleStep(1.0) - self.radius_entry.setRange(-10000.0000,10000.000) + self.radius_entry.setRange(-10000.0000, 10000.000) self.circ_grid.addWidget(self.radius_lbl, 4, 0) self.circ_grid.addWidget(self.radius_entry, 4, 1) diff --git a/appEditors/grb_plugins/GrbPadPlugin.py b/appEditors/grb_plugins/GrbPadPlugin.py index b11d1998..72e3e0c5 100644 --- a/appEditors/grb_plugins/GrbPadPlugin.py +++ b/appEditors/grb_plugins/GrbPadPlugin.py @@ -1,5 +1,12 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner, \ + NumericalEvalEntry + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrbSimplificationPlugin.py b/appEditors/grb_plugins/GrbSimplificationPlugin.py index 4cbc152c..941e8734 100644 --- a/appEditors/grb_plugins/GrbSimplificationPlugin.py +++ b/appEditors/grb_plugins/GrbSimplificationPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui, QtCore +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCTextEdit, FCEntry, \ + FCDoubleSpinner +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -11,7 +17,7 @@ class SimplificationTool(AppToolEditor): Do a shape simplification for the selected geometry. """ - update_ui = pyqtSignal(object, int) + update_ui = QtCore.pyqtSignal(object, int) def __init__(self, app, draw_app): AppToolEditor.__init__(self, app) diff --git a/appEditors/grb_plugins/GrbTrackPlugin.py b/appEditors/grb_plugins/GrbTrackPlugin.py index 253354e2..0b507c2d 100644 --- a/appEditors/grb_plugins/GrbTrackPlugin.py +++ b/appEditors/grb_plugins/GrbTrackPlugin.py @@ -1,5 +1,12 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, NumericalEvalEntry, \ + FCDoubleSpinner + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrbTransformationPlugin.py b/appEditors/grb_plugins/GrbTransformationPlugin.py index 63d3723c..012c1ecc 100644 --- a/appEditors/grb_plugins/GrbTransformationPlugin.py +++ b/appEditors/grb_plugins/GrbTransformationPlugin.py @@ -1,5 +1,14 @@ -from appTool import * +from PyQt6 import QtGui, QtWidgets +from appTool import AppToolEditor, AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCDoubleSpinner, \ + FCInputDoubleSpinner, FCComboBox, NumericalEvalTupleEntry, FCCheckBox, OptionalInputSection + +import numpy as np + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appEditors/grb_plugins/GrberRegionPlugin.py b/appEditors/grb_plugins/GrberRegionPlugin.py index ac31d690..5f71fdc6 100644 --- a/appEditors/grb_plugins/GrberRegionPlugin.py +++ b/appEditors/grb_plugins/GrberRegionPlugin.py @@ -1,5 +1,11 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppToolEditor +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCDoubleSpinner, FCFrame, GLay, NumericalEvalEntry + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appGUI/preferences/PreferencesSectionUI.py b/appGUI/preferences/PreferencesSectionUI.py index 8c341b02..b6d8eb79 100644 --- a/appGUI/preferences/PreferencesSectionUI.py +++ b/appGUI/preferences/PreferencesSectionUI.py @@ -1,3 +1,4 @@ + from typing import Dict from PyQt6 import QtWidgets diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index 4f545226..c2d67100 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -1,8 +1,10 @@ -import os + from PyQt6 import QtGui, QtCore, QtWidgets from PyQt6.QtCore import QSettings -from defaults import AppDefaults +import os + +from defaults import AppDefaults from appGUI.GUIElements import FCMessageBox import gettext diff --git a/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py b/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py index 5b7c675d..29982de2 100644 --- a/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py @@ -2,6 +2,7 @@ from PyQt6 import QtGui from appGUI.GUIElements import FCSpinner, FCColorEntry, FCLabel, GLay, FCFrame from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/cncjob/CNCJobEditorPrefGroupUI.py b/appGUI/preferences/cncjob/CNCJobEditorPrefGroupUI.py index 648d8c02..e439b7e2 100644 --- a/appGUI/preferences/cncjob/CNCJobEditorPrefGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobEditorPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/cncjob/CNCJobGenPrefGroupUI.py b/appGUI/preferences/cncjob/CNCJobGenPrefGroupUI.py index 0ce6c68b..075018c1 100644 --- a/appGUI/preferences/cncjob/CNCJobGenPrefGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobGenPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from appGUI.GUIElements import FCCheckBox, RadioSet, FCSpinner, FCDoubleSpinner, FCSliderWithSpinner, FCColorEntry, \ diff --git a/appGUI/preferences/cncjob/CNCJobOptPrefGroupUI.py b/appGUI/preferences/cncjob/CNCJobOptPrefGroupUI.py index ae52d885..b38f160e 100644 --- a/appGUI/preferences/cncjob/CNCJobOptPrefGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobOptPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/cncjob/CNCJobPPGroupUI.py b/appGUI/preferences/cncjob/CNCJobPPGroupUI.py index dfa1858d..cd6852ab 100644 --- a/appGUI/preferences/cncjob/CNCJobPPGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobPPGroupUI.py @@ -1,7 +1,9 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCLabel, GLay, FCFrame from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/cncjob/CNCJobPreferencesUI.py b/appGUI/preferences/cncjob/CNCJobPreferencesUI.py index 162e04b1..bfb82e3d 100644 --- a/appGUI/preferences/cncjob/CNCJobPreferencesUI.py +++ b/appGUI/preferences/cncjob/CNCJobPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.cncjob.CNCJobAdvOptPrefGroupUI import CNCJobAdvOptPrefGroupUI diff --git a/appGUI/preferences/excellon/ExcellonAdvOptPrefGroupUI.py b/appGUI/preferences/excellon/ExcellonAdvOptPrefGroupUI.py index 81710146..55fa1ee3 100644 --- a/appGUI/preferences/excellon/ExcellonAdvOptPrefGroupUI.py +++ b/appGUI/preferences/excellon/ExcellonAdvOptPrefGroupUI.py @@ -1,7 +1,9 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCCheckBox, FCLabel, GLay, FCFrame from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/excellon/ExcellonExpPrefGroupUI.py b/appGUI/preferences/excellon/ExcellonExpPrefGroupUI.py index 7a1b7423..d9d2df1c 100644 --- a/appGUI/preferences/excellon/ExcellonExpPrefGroupUI.py +++ b/appGUI/preferences/excellon/ExcellonExpPrefGroupUI.py @@ -1,7 +1,9 @@ + from PyQt6 import QtWidgets, QtCore from appGUI.GUIElements import RadioSet, FCSpinner, FCLabel, GLay, FCFrame from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/excellon/ExcellonGenPrefGroupUI.py b/appGUI/preferences/excellon/ExcellonGenPrefGroupUI.py index 4b46681c..07ead8d1 100644 --- a/appGUI/preferences/excellon/ExcellonGenPrefGroupUI.py +++ b/appGUI/preferences/excellon/ExcellonGenPrefGroupUI.py @@ -1,3 +1,4 @@ + import platform from PyQt6 import QtWidgets, QtCore, QtGui @@ -5,6 +6,7 @@ from PyQt6 import QtWidgets, QtCore, QtGui from appGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCSliderWithSpinner, FCColorEntry, FCLabel, \ GLay, FCFrame, FCButton from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py b/appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py index c62b2296..563f5c7a 100644 --- a/appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py +++ b/appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py @@ -1,7 +1,9 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCLabel, GLay, FCFrame from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/excellon/ExcellonPreferencesUI.py b/appGUI/preferences/excellon/ExcellonPreferencesUI.py index 6d1018d4..790a38d9 100644 --- a/appGUI/preferences/excellon/ExcellonPreferencesUI.py +++ b/appGUI/preferences/excellon/ExcellonPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.excellon.ExcellonEditorPrefGroupUI import ExcellonEditorPrefGroupUI diff --git a/appGUI/preferences/general/GeneralAPPSetGroupUI.py b/appGUI/preferences/general/GeneralAPPSetGroupUI.py index a6b0c158..4752e50c 100644 --- a/appGUI/preferences/general/GeneralAPPSetGroupUI.py +++ b/appGUI/preferences/general/GeneralAPPSetGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtCore, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/general/GeneralAppPrefGroupUI.py b/appGUI/preferences/general/GeneralAppPrefGroupUI.py index 16453bf7..b76400ff 100644 --- a/appGUI/preferences/general/GeneralAppPrefGroupUI.py +++ b/appGUI/preferences/general/GeneralAppPrefGroupUI.py @@ -1,3 +1,4 @@ + import sys from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/general/GeneralAppSettingsGroupUI.py b/appGUI/preferences/general/GeneralAppSettingsGroupUI.py index 60bbc5fa..785204c2 100644 --- a/appGUI/preferences/general/GeneralAppSettingsGroupUI.py +++ b/appGUI/preferences/general/GeneralAppSettingsGroupUI.py @@ -1,11 +1,16 @@ + from PyQt6 import QtCore +from PyQt6.QtCore import QSettings + from appGUI.GUIElements import OptionalInputSection -from appGUI.preferences.OptionUI import * +from appGUI.preferences.OptionUI import OptionUI, HeadingOptionUI, SeparatorOptionUI, DoubleSpinnerOptionUI, \ + SpinnerOptionUI, CheckboxOptionUI, ComboboxOptionUI, RadioSetOptionUI, ColorOptionUI from appGUI.preferences.OptionsGroupUI import OptionsGroupUI2 import gettext import appTranslation as fcTranslate import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext diff --git a/appGUI/preferences/general/GeneralGUIPrefGroupUI.py b/appGUI/preferences/general/GeneralGUIPrefGroupUI.py index 82c3ead3..af532e2b 100644 --- a/appGUI/preferences/general/GeneralGUIPrefGroupUI.py +++ b/appGUI/preferences/general/GeneralGUIPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtCore, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/general/GeneralPreferencesUI.py b/appGUI/preferences/general/GeneralPreferencesUI.py index 67ebbaf2..47c18fd5 100644 --- a/appGUI/preferences/general/GeneralPreferencesUI.py +++ b/appGUI/preferences/general/GeneralPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.general.GeneralAppPrefGroupUI import GeneralAppPrefGroupUI diff --git a/appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py b/appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py index 509d5e43..14c8d90f 100644 --- a/appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py +++ b/appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py b/appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py index 4a6e8faa..515ecaad 100644 --- a/appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py +++ b/appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCSpinner, RadioSet, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/geometry/GeometryExpPrefGroupUI.py b/appGUI/preferences/geometry/GeometryExpPrefGroupUI.py index 92933bc3..417c24eb 100644 --- a/appGUI/preferences/geometry/GeometryExpPrefGroupUI.py +++ b/appGUI/preferences/geometry/GeometryExpPrefGroupUI.py @@ -3,6 +3,7 @@ from PyQt6 import QtWidgets, QtCore from appGUI.GUIElements import FCLabel, FCComboBox, GLay, FCFrame, FCCheckBox from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + import gettext import appTranslation as fcTranslate import builtins diff --git a/appGUI/preferences/geometry/GeometryGenPrefGroupUI.py b/appGUI/preferences/geometry/GeometryGenPrefGroupUI.py index b9f6a4ac..f5cd6a54 100644 --- a/appGUI/preferences/geometry/GeometryGenPrefGroupUI.py +++ b/appGUI/preferences/geometry/GeometryGenPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from appGUI.GUIElements import FCCheckBox, FCSpinner, FCColorEntry, RadioSet, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/geometry/GeometryOptPrefGroupUI.py b/appGUI/preferences/geometry/GeometryOptPrefGroupUI.py index 151038b9..00ea2bea 100644 --- a/appGUI/preferences/geometry/GeometryOptPrefGroupUI.py +++ b/appGUI/preferences/geometry/GeometryOptPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from PyQt6.QtCore import Qt diff --git a/appGUI/preferences/geometry/GeometryPreferencesUI.py b/appGUI/preferences/geometry/GeometryPreferencesUI.py index a3347584..7ce75efd 100644 --- a/appGUI/preferences/geometry/GeometryPreferencesUI.py +++ b/appGUI/preferences/geometry/GeometryPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.geometry.GeometryEditorPrefGroupUI import GeometryEditorPrefGroupUI diff --git a/appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py b/appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py index 09c0d1b4..01172152 100644 --- a/appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCCheckBox, RadioSet, FCDoubleSpinner, FCLabel, OptionalInputSection, GLay, \ diff --git a/appGUI/preferences/gerber/GerberEditorPrefGroupUI.py b/appGUI/preferences/gerber/GerberEditorPrefGroupUI.py index 2c1cd70b..af5f8ec6 100644 --- a/appGUI/preferences/gerber/GerberEditorPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberEditorPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCSpinner, FCDoubleSpinner, FCComboBox, FCLabel, RadioSet, NumericalEvalTupleEntry, \ diff --git a/appGUI/preferences/gerber/GerberExpPrefGroupUI.py b/appGUI/preferences/gerber/GerberExpPrefGroupUI.py index a9a4408f..3c9b8f2b 100644 --- a/appGUI/preferences/gerber/GerberExpPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberExpPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtCore from appGUI.GUIElements import RadioSet, FCSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/gerber/GerberGenPrefGroupUI.py b/appGUI/preferences/gerber/GerberGenPrefGroupUI.py index f2eed361..7148c439 100644 --- a/appGUI/preferences/gerber/GerberGenPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberGenPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtCore, QtGui, QtWidgets from appGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCButton, FCSliderWithSpinner, FCLabel, \ diff --git a/appGUI/preferences/gerber/GerberOptPrefGroupUI.py b/appGUI/preferences/gerber/GerberOptPrefGroupUI.py index 748b43bc..48967fae 100644 --- a/appGUI/preferences/gerber/GerberOptPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberOptPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCCheckBox, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/gerber/GerberPreferencesUI.py b/appGUI/preferences/gerber/GerberPreferencesUI.py index eaf47e0c..92d6d5ab 100644 --- a/appGUI/preferences/gerber/GerberPreferencesUI.py +++ b/appGUI/preferences/gerber/GerberPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.gerber.GerberEditorPrefGroupUI import GerberEditorPrefGroupUI diff --git a/appGUI/preferences/tools/Plugins2PreferencesUI.py b/appGUI/preferences/tools/Plugins2PreferencesUI.py index dad3c937..f7fd6e40 100644 --- a/appGUI/preferences/tools/Plugins2PreferencesUI.py +++ b/appGUI/preferences/tools/Plugins2PreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.tools.Tools2InvertPrefGroupUI import Tools2InvertPrefGroupUI diff --git a/appGUI/preferences/tools/PluginsEngravingPreferencesUI.py b/appGUI/preferences/tools/PluginsEngravingPreferencesUI.py index 42e5224a..da6d6158 100644 --- a/appGUI/preferences/tools/PluginsEngravingPreferencesUI.py +++ b/appGUI/preferences/tools/PluginsEngravingPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.tools.Tools2sidedPrefGroupUI import Tools2sidedPrefGroupUI diff --git a/appGUI/preferences/tools/PluginsPreferencesUI.py b/appGUI/preferences/tools/PluginsPreferencesUI.py index 8143cfe6..56d0d88c 100644 --- a/appGUI/preferences/tools/PluginsPreferencesUI.py +++ b/appGUI/preferences/tools/PluginsPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.preferences.tools.ToolsSubPrefGroupUI import ToolsSubPrefGroupUI diff --git a/appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py b/appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py index c274284d..58a275f0 100644 --- a/appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCSpinner, FCDoubleSpinner, RadioSet, FCLabel, FCCheckBox, GLay, FCFrame, \ diff --git a/appGUI/preferences/tools/Tools2ExtractPrefGroupUI.py b/appGUI/preferences/tools/Tools2ExtractPrefGroupUI.py index 35964f27..35e6eb25 100644 --- a/appGUI/preferences/tools/Tools2ExtractPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2ExtractPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCCheckBox, RadioSet, FCDoubleSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2FiducialsPrefGroupUI.py b/appGUI/preferences/tools/Tools2FiducialsPrefGroupUI.py index c211cbd4..9830d074 100644 --- a/appGUI/preferences/tools/Tools2FiducialsPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2FiducialsPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, RadioSet, FCLabel, GLay, FCComboBox2, FCFrame diff --git a/appGUI/preferences/tools/Tools2InvertPrefGroupUI.py b/appGUI/preferences/tools/Tools2InvertPrefGroupUI.py index 19d2ce24..21f0ab5f 100644 --- a/appGUI/preferences/tools/Tools2InvertPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2InvertPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, RadioSet, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2OptimalPrefGroupUI.py b/appGUI/preferences/tools/Tools2OptimalPrefGroupUI.py index f242de2b..a1f8b168 100644 --- a/appGUI/preferences/tools/Tools2OptimalPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2OptimalPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2PunchGerberPrefGroupUI.py b/appGUI/preferences/tools/Tools2PunchGerberPrefGroupUI.py index 147495bb..0e383846 100644 --- a/appGUI/preferences/tools/Tools2PunchGerberPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2PunchGerberPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCCheckBox, RadioSet, FCDoubleSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2QRCodePrefGroupUI.py b/appGUI/preferences/tools/Tools2QRCodePrefGroupUI.py index ca65c84d..dc39003e 100644 --- a/appGUI/preferences/tools/Tools2QRCodePrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2QRCodePrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from appGUI.GUIElements import FCSpinner, RadioSet, FCTextArea, FCLabel, FCColorEntry, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2RulesCheckPrefGroupUI.py b/appGUI/preferences/tools/Tools2RulesCheckPrefGroupUI.py index 0316ac20..0dd1fe8f 100644 --- a/appGUI/preferences/tools/Tools2RulesCheckPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2RulesCheckPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCCheckBox, FCDoubleSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/Tools2sidedPrefGroupUI.py b/appGUI/preferences/tools/Tools2sidedPrefGroupUI.py index 19970bc8..04c8e6e3 100644 --- a/appGUI/preferences/tools/Tools2sidedPrefGroupUI.py +++ b/appGUI/preferences/tools/Tools2sidedPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, RadioSet, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/ToolsCalculatorsPrefGroupUI.py b/appGUI/preferences/tools/ToolsCalculatorsPrefGroupUI.py index 6ee6cde1..532963aa 100644 --- a/appGUI/preferences/tools/ToolsCalculatorsPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsCalculatorsPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/ToolsCutoutPrefGroupUI.py b/appGUI/preferences/tools/ToolsCutoutPrefGroupUI.py index 7fd06432..994185af 100644 --- a/appGUI/preferences/tools/ToolsCutoutPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsCutoutPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCCheckBox, RadioSet, FCComboBox, FCLabel, OptionalInputSection, \ diff --git a/appGUI/preferences/tools/ToolsDrillPrefGroupUI.py b/appGUI/preferences/tools/ToolsDrillPrefGroupUI.py index 8d5e40d5..b48e6d5c 100644 --- a/appGUI/preferences/tools/ToolsDrillPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsDrillPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtCore from PyQt6.QtCore import Qt diff --git a/appGUI/preferences/tools/ToolsFilmPrefGroupUI.py b/appGUI/preferences/tools/ToolsFilmPrefGroupUI.py index ef75ae59..971de233 100644 --- a/appGUI/preferences/tools/ToolsFilmPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsFilmPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtGui from appGUI.GUIElements import RadioSet, FCDoubleSpinner, FCCheckBox, FCComboBox, FCColorEntry, FCLabel, FCSpinner, \ diff --git a/appGUI/preferences/tools/ToolsISOPrefGroupUI.py b/appGUI/preferences/tools/ToolsISOPrefGroupUI.py index 0a041e38..56539e47 100644 --- a/appGUI/preferences/tools/ToolsISOPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsISOPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import RadioSet, FCDoubleSpinner, FCComboBox2, FCCheckBox, FCSpinner, NumericalEvalTupleEntry, \ diff --git a/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py b/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py index e6d4f2ce..5002e6c7 100644 --- a/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCSpinner, RadioSet, FCLabel, FCComboBox, GLay, FCFrame diff --git a/appGUI/preferences/tools/ToolsMarkersPrefGroupUI.py b/appGUI/preferences/tools/ToolsMarkersPrefGroupUI.py index e8e7f181..c8616da7 100644 --- a/appGUI/preferences/tools/ToolsMarkersPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsMarkersPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCLabel, RadioSet, GLay, FCFrame diff --git a/appGUI/preferences/tools/ToolsMillPrefGroupUI.py b/appGUI/preferences/tools/ToolsMillPrefGroupUI.py index 00793fb0..4e3609e5 100644 --- a/appGUI/preferences/tools/ToolsMillPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsMillPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtCore from PyQt6.QtCore import Qt diff --git a/appGUI/preferences/tools/ToolsNCCPrefGroupUI.py b/appGUI/preferences/tools/ToolsNCCPrefGroupUI.py index c547ebb5..7017c4c8 100644 --- a/appGUI/preferences/tools/ToolsNCCPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsNCCPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import RadioSet, FCDoubleSpinner, FCCheckBox, NumericalEvalTupleEntry, FCComboBox2, FCLabel, \ diff --git a/appGUI/preferences/tools/ToolsPaintPrefGroupUI.py b/appGUI/preferences/tools/ToolsPaintPrefGroupUI.py index 789de600..977debd8 100644 --- a/appGUI/preferences/tools/ToolsPaintPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsPaintPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import RadioSet, FCDoubleSpinner, FCComboBox2, FCCheckBox, NumericalEvalTupleEntry, FCLabel, \ diff --git a/appGUI/preferences/tools/ToolsPanelizePrefGroupUI.py b/appGUI/preferences/tools/ToolsPanelizePrefGroupUI.py index 82532ca4..d4d9f8f8 100644 --- a/appGUI/preferences/tools/ToolsPanelizePrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsPanelizePrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets from appGUI.GUIElements import FCDoubleSpinner, FCSpinner, RadioSet, FCCheckBox, FCLabel, GLay, FCFrame diff --git a/appGUI/preferences/tools/ToolsSolderpastePrefGroupUI.py b/appGUI/preferences/tools/ToolsSolderpastePrefGroupUI.py index f17a1618..d440b84d 100644 --- a/appGUI/preferences/tools/ToolsSolderpastePrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsSolderpastePrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtCore from appGUI.GUIElements import FCDoubleSpinner, FCSpinner, FCComboBox, NumericalEvalTupleEntry, FCLabel, GLay, \ diff --git a/appGUI/preferences/tools/ToolsSubPrefGroupUI.py b/appGUI/preferences/tools/ToolsSubPrefGroupUI.py index 6ae2249e..a14ccdb3 100644 --- a/appGUI/preferences/tools/ToolsSubPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsSubPrefGroupUI.py @@ -1,3 +1,4 @@ + from appGUI.GUIElements import FCCheckBox, FCLabel, FCFrame, GLay from appGUI.preferences.OptionsGroupUI import OptionsGroupUI diff --git a/appGUI/preferences/tools/ToolsTransformPrefGroupUI.py b/appGUI/preferences/tools/ToolsTransformPrefGroupUI.py index ff0a8204..69d12267 100644 --- a/appGUI/preferences/tools/ToolsTransformPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsTransformPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtGui from appGUI.GUIElements import FCDoubleSpinner, FCCheckBox, NumericalEvalTupleEntry, FCComboBox, FCLabel, \ diff --git a/appGUI/preferences/utilities/AutoCompletePrefGroupUI.py b/appGUI/preferences/utilities/AutoCompletePrefGroupUI.py index 93139239..70fbd118 100644 --- a/appGUI/preferences/utilities/AutoCompletePrefGroupUI.py +++ b/appGUI/preferences/utilities/AutoCompletePrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/utilities/FAExcPrefGroupUI.py b/appGUI/preferences/utilities/FAExcPrefGroupUI.py index 68a6a5f7..674ca6a3 100644 --- a/appGUI/preferences/utilities/FAExcPrefGroupUI.py +++ b/appGUI/preferences/utilities/FAExcPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/utilities/FAGcoPrefGroupUI.py b/appGUI/preferences/utilities/FAGcoPrefGroupUI.py index 9df84f31..eaa99a60 100644 --- a/appGUI/preferences/utilities/FAGcoPrefGroupUI.py +++ b/appGUI/preferences/utilities/FAGcoPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/utilities/FAGrbPrefGroupUI.py b/appGUI/preferences/utilities/FAGrbPrefGroupUI.py index dcec8eca..459bbdae 100644 --- a/appGUI/preferences/utilities/FAGrbPrefGroupUI.py +++ b/appGUI/preferences/utilities/FAGrbPrefGroupUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import QSettings diff --git a/appGUI/preferences/utilities/UtilPreferencesUI.py b/appGUI/preferences/utilities/UtilPreferencesUI.py index e47d3034..2b52c1b6 100644 --- a/appGUI/preferences/utilities/UtilPreferencesUI.py +++ b/appGUI/preferences/utilities/UtilPreferencesUI.py @@ -1,3 +1,4 @@ + from PyQt6 import QtWidgets import sys diff --git a/appHandlers/AppIO.py b/appHandlers/AppIO.py index 2f05a00a..c786b227 100644 --- a/appHandlers/AppIO.py +++ b/appHandlers/AppIO.py @@ -1,4 +1,7 @@ +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtCore import Qt, QSettings + from appEditors.AppExcEditor import AppExcEditor from appEditors.AppGeoEditor import AppGeoEditor from appEditors.AppGerberEditor import AppGerberEditor @@ -7,7 +10,7 @@ from appGUI.GUIElements import FCFileSaveDialog, FCMessageBox from camlib import to_dict, dict2obj, ET, ParseError from appParsers.ParseHPGL2 import HPGL2 -from appObjects.ObjectCollection import * +from appObjects.ObjectCollection import GerberObject, ExcellonObject, GeometryObject, ScriptObject, CNCJobObject from reportlab.graphics import renderPDF from reportlab.pdfgen import canvas diff --git a/appMain.py b/appMain.py index 93482057..08ab60bd 100644 --- a/appMain.py +++ b/appMain.py @@ -6,19 +6,36 @@ # MIT Licence # # Modified by Marius Stanciu (2019) # # ########################################################### + +from PyQt6 import QtGui, QtWidgets +from PyQt6.QtCore import QSettings, pyqtSlot +from PyQt6.QtCore import Qt, pyqtSignal +from PyQt6.QtGui import QAction, QTextCursor + import os.path +import sys + import urllib.request import urllib.parse import urllib.error +from datetime import datetime as dt +from copy import deepcopy, copy +import numpy as np + import getopt import random import simplejson as json import shutil -from datetime import datetime import traceback +import logging +import time +import webbrowser +import platform +import re +import subprocess -from shapely.geometry import Point, MultiPolygon, MultiLineString +from shapely.geometry import Point, MultiPolygon, MultiLineString, Polygon, LinearRing, LineString from shapely.ops import unary_union from io import StringIO @@ -38,9 +55,18 @@ import qdarktheme.themes.light.stylesheet as qlightsheet # ################################### Imports part of FlatCAM ############################################# # #################################################################################################################### -# Various +# App appGUI +from appGUI.PlotCanvas import PlotCanvas +from appGUI.PlotCanvasLegacy import PlotCanvasLegacy +from appGUI.PlotCanvas3d import PlotCanvas3d +from appGUI.MainGUI import MainGUI +from appGUI.VisPyVisuals import ShapeCollection +from appGUI.GUIElements import FCMessageBox, FCInputSpinner, FCButton, DialogBoxRadio, Dialog_box, FCTree, \ + FCInputDoubleSpinner, FCFileSaveDialog, message_dialog, AppSystemTray, FCInputDialogSlider, \ + GLay, FCLabel, DialogBoxChoice, VerticalScrollArea from appGUI.themes import dark_style_sheet, light_style_sheet +# Various from appCommon.Common import color_variant from appCommon.Common import ExclusionAreas from appCommon.Common import AppLogging @@ -58,7 +84,8 @@ from defaults import AppOptions # App Objects from appGUI.preferences.OptionsGroupUI import OptionsGroupUI from appGUI.preferences.PreferencesUIManager import PreferencesUIManager -from appObjects.ObjectCollection import * +from appObjects.ObjectCollection import ObjectCollection, GerberObject, ExcellonObject, GeometryObject, \ + CNCJobObject, ScriptObject, DocumentObject from appObjects.AppObjectTemplate import FlatCAMObj from appObjects.AppObject import AppObject @@ -67,14 +94,6 @@ from appParsers.ParseExcellon import Excellon from appParsers.ParseGerber import Gerber from camlib import to_dict, Geometry, CNCjob -# App appGUI -from appGUI.PlotCanvas import * -from appGUI.PlotCanvasLegacy import * -from appGUI.PlotCanvas3d import * -from appGUI.MainGUI import * -from appGUI.GUIElements import FCFileSaveDialog, message_dialog, AppSystemTray, FCInputDialogSlider, \ - GLay, FCLabel, DialogBoxChoice - # App Pre-processors from appPreProcessor import load_preprocessors @@ -92,6 +111,8 @@ from appWorkerStack import WorkerStack # App Plugins from appPlugins import * +from numpy import Inf + # App Translation import gettext import appTranslation as fcTranslate @@ -158,7 +179,7 @@ class App(QtCore.QObject): engine = '3D' # current date now - date = str(datetime.today()).rpartition('.')[0] + date = str(dt.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') date = date.replace(' ', '_') @@ -258,8 +279,8 @@ class App(QtCore.QObject): """ Starts the application. - :return: app - :rtype: App + :return: the application + :rtype: QtCore.QObject """ super().__init__() @@ -1357,7 +1378,7 @@ class App(QtCore.QObject): sys.exit(2) # accept some type file as command line parameter: FlatCAM project, FlatCAM preferences or scripts - # the path/file_name must be enclosed in quotes if it contain spaces + # the path/file_name must be enclosed in quotes, if it contains spaces if App.args: self.args_at_startup.emit(App.args) @@ -1573,13 +1594,13 @@ class App(QtCore.QObject): """ This installs the FlatCAM tools (plugin-like) which reside in their own classes. Instantiation of the Tools classes. - The order that the tools are installed is important as they can depend on each other install position. + The order that the tools are installed is important as they can depend on each other installing position. :return: None """ if init_tcl: - # shell tool has to be initialized always first because other tools print messages in the Shell Dock + # Tcl Shell tool has to be initialized always first because other tools print messages in the Shell Dock self.shell = FCShell(app=self, version=self.version) self.log.debug("TCL was re-instantiated. TCL variables are reset.") @@ -2259,7 +2280,7 @@ class App(QtCore.QObject): def object2editor(self): """ - Send the current Geometry, Gerber, Excellon object or CNCJob (if any) into the it's editor. + Send the current Geometry, Gerber, Excellon object or CNCJob (if any) its editor. :return: None """ @@ -2286,7 +2307,7 @@ class App(QtCore.QObject): self.inform.emit('[ERROR_NOTCL] %s' % _("The Editor could not start.")) return - # store the Geometry Editor Toolbar visibility before entering in the Editor + # store the Geometry Editor Toolbar visibility before entering the Editor self.geo_editor.toolbar_old_state = True if self.ui.geo_edit_toolbar.isVisible() else False # we set the notebook to hidden @@ -2329,7 +2350,7 @@ class App(QtCore.QObject): self.inform.emit('[ERROR_NOTCL] %s' % _("The Editor could not start.")) return - # store the Excellon Editor Toolbar visibility before entering in the Editor + # store the Excellon Editor Toolbar visibility before entering the Editor self.exc_editor.toolbar_old_state = True if self.ui.exc_edit_toolbar.isVisible() else False if self.ui.splitter.sizes()[0] == 0: @@ -2345,7 +2366,7 @@ class App(QtCore.QObject): self.inform.emit('[ERROR_NOTCL] %s' % _("The Editor could not start.")) return - # store the Gerber Editor Toolbar visibility before entering in the Editor + # store the Gerber Editor Toolbar visibility before entering the Editor self.grb_editor.toolbar_old_state = True if self.ui.grb_edit_toolbar.isVisible() else False if self.ui.splitter.sizes()[0] == 0: @@ -2410,9 +2431,9 @@ class App(QtCore.QObject): def editor2object(self, cleanup=None, force_cancel=None): """ - Transfers the Geometry or Excellon from it's editor to the current object. + Transfers the Geometry or Excellon from its editor to the current object. - :param cleanup: if True then we closed the app when the editor was open so we close first the editor + :param cleanup: if True then we closed the app when the editor was open, so we close first the editor :param force_cancel: if True always add Cancel button :return: None """ @@ -2430,7 +2451,7 @@ class App(QtCore.QObject): except Exception: pass - # This is the object that exit from the Editor. It may be the edited object but it can be a new object + # This is the object that exit from the Editor. It may be the edited object, but it can be a new object # created by the Editor edited_obj = self.collection.get_active() @@ -2480,7 +2501,7 @@ class App(QtCore.QObject): # Remove anything else in the appGUI self.ui.plugin_scroll_area.takeWidget() - # update the geo object options so it is including the bounding box values + # update the geo object options, so it is including the bounding box values try: xmin, ymin, xmax, ymax = edited_obj.bounds(flatten=True) edited_obj.obj_options['xmin'] = xmin @@ -2753,8 +2774,8 @@ class App(QtCore.QObject): :type msg: str :param new_line: if True then after printing the message add a new line char :type new_line: bool - :return: None - :rtype: None + :return: + :rtype: """ self.shell_message(msg=msg, new_line=new_line) @@ -2766,13 +2787,13 @@ class App(QtCore.QObject): :type content_to_save: str :param txt_content: text that is not HTML :type txt_content: str - :return: None - :rtype: None + :return: + :rtype: """ self.defaults.report_usage("save_to_file") self.log.debug("save_to_file()") - date = str(datetime.today()).rpartition('.')[0] + date = str(dt.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') date = date.replace(' ', '_') @@ -2834,7 +2855,7 @@ class App(QtCore.QObject): def register_recent(self, kind, filename): """ - Will register the files opened into record dictionaries. The FlatCAM projects has it's own + Will register the files opened into record dictionaries. The FlatCAM projects has its own dictionary. :param kind: type of file that was opened @@ -3687,8 +3708,8 @@ class App(QtCore.QObject): """ Called when the user click on the menu entry Help -> Bookmarks -> Backup Site - :return: None - :rtype: None + :return: + :rtype: """ msgbox = FCMessageBox(parent=self.ui) title = _("Alternative website") @@ -3913,7 +3934,7 @@ class App(QtCore.QObject): data = None if sys.platform != 'win32': - # this won't work in Linux or MacOS + # this won't work in Linux or macOS return # test if the app was frozen and choose the path for the configuration file @@ -4117,7 +4138,7 @@ class App(QtCore.QObject): Called for converting a Geometry object from single-geo to multi-geo. Single-geo Geometry objects store their geometry data into self.solid_geometry. Multi-geo Geometry objects store their geometry data into the self.tools dictionary, each key (a tool actually) - having as a value another dictionary. This value dictionary has one of it's keys 'solid_geometry' which holds + having as a value another dictionary. This value dictionary has one of its keys 'solid_geometry' which holds the solid-geometry of that tool. :return: None @@ -4153,7 +4174,7 @@ class App(QtCore.QObject): Called for converting a Geometry object from multi-geo to single-geo. Single-geo Geometry objects store their geometry data into self.solid_geometry. Multi-geo Geometry objects store their geometry data into the self.tools dictionary, each key (a tool actually) - having as a value another dictionary. This value dictionary has one of it's keys 'solid_geometry' which holds + having as a value another dictionary. This value dictionary has one of its keys 'solid_geometry' which holds the solid-geometry of that tool. :return: None @@ -4191,8 +4212,8 @@ class App(QtCore.QObject): Called whenever a key changed in the self.options dictionary. It will set the required GUI element in the Edit -> Preferences tab window. - :param field: the key of the self.options dictionary that was changed. - :return: None + :param field: the key of the self.options dictionary that was changed. + :return: None """ self.preferencesUiManager.defaults_write_form_field(field=field) @@ -4213,7 +4234,7 @@ class App(QtCore.QObject): new_units, factor = self.on_toggle_units() except TypeError: # hen the self.on_toggle_units() return only one value (maybe None) it means something went wrong, - # it will end up in this exception and and we should return + # it will end up in this exception, and we should return return if self.ui.plot_tab_area.currentWidget().objectName() == "preferences_tab": @@ -4230,7 +4251,7 @@ class App(QtCore.QObject): def scale_preferences(self, sfactor, new_units): self.preferencesUiManager.defaults_read_form() - # update the defaults from form, some may assume that the conversion is enough and it's not + # update the defaults from form, some may assume that the conversion is enough, and it's not self.on_defaults2options() # Keys in self.options for which to scale their values @@ -4404,7 +4425,7 @@ class App(QtCore.QObject): """ Callback for the Units radio-button change in the Preferences tab. Changes the application's default units adn for the project too. - If changing the project's units, the change propagates to all of + If changing the project's units, the change propagates to all the objects in the project. :return: The new application units. String: "IN" or "MM" with caps lock @@ -4477,14 +4498,14 @@ class App(QtCore.QObject): self.plot_all() self.set_screen_units(new_units) - # flag for the app that we changed the object properties and it should save the project + # flag for the app that we changed the object properties, and it should save the project self.should_we_save = True self.inform.emit('[success] %s: %s' % (_("Converted units to"), new_units)) else: factor = 1 - # store the grid values so they are not changed in the next step + # store the grid values, so they are not changed in the next step val_x = float(self.options['global_gridx']) val_y = float(self.options['global_gridy']) @@ -4667,7 +4688,7 @@ class App(QtCore.QObject): else: self.on_delete() - # It's meant to delete selected objects. It work also activated by a shortcut key 'Delete' same as above so in + # It's meant to delete selected objects. It may work also activated by a shortcut key 'Delete' same as above so in # some screens you have to be careful where you hover with your mouse. # Hovering over Selected tab, if the selected tab is a Geometry it will delete tools in tool table. But even if # there is a Selected tab in focus with a Geometry inside, if you hover over canvas it will delete an object. @@ -5156,8 +5177,8 @@ class App(QtCore.QObject): cursor = QtGui.QCursor() if self.use_3d_engine: - # I don't know where those differences come from but they are constant for the current - # execution of the application and they are multiples of a value around 0.0263mm. + # I don't know where those differences come from, but they are constant for the current + # execution of the application, and they are multiples of a value around 0.0263mm. # In a random way sometimes they are more sometimes they are less # if units == 'MM': # cal_factor = 0.0263 @@ -5272,8 +5293,8 @@ class App(QtCore.QObject): cursor = QtGui.QCursor() if self.use_3d_engine: - # I don't know where those differences come from but they are constant for the current - # execution of the application and they are multiples of a value around 0.0263mm. + # I don't know where those differences come from, but they are constant for the current + # execution of the application, and they are multiples of a value around 0.0263mm. # In a random way sometimes they are more sometimes they are less # if units == 'MM': # cal_factor = 0.0263 @@ -5339,7 +5360,7 @@ class App(QtCore.QObject): def on_numeric_move(self, val=None): """ - Move to a specific location (absolute or relative against current position)' + Move to a specific location (absolute or relative against current position) :param val: custom offset value, (x, y) :type val: tuple @@ -5372,7 +5393,7 @@ class App(QtCore.QObject): maxy = max(maxy, maxy_) return minx, miny, maxx, maxy except TypeError: - # it's a App object, return its bounds + # it's an App object, return its bounds if obj: return obj.bounds() @@ -6806,9 +6827,9 @@ class App(QtCore.QObject): """ Callback for the mouse motion event over the plot. - :param event: Contains information about the event. - :param origin_click - :return: None + :param event: Contains information about the event. + :param origin_click: + :return: None """ if self.use_3d_engine: @@ -6918,7 +6939,7 @@ class App(QtCore.QObject): obj.isHovering = False self.delete_hover_shape() except Exception: - # the Exception here will happen if we try to select on screen and we have an + # the Exception here will happen if we try to select on screen, and we have a # newly (and empty) just created Geometry or Excellon object that do not have the # xmin, xmax, ymin, ymax options. # In this case poly_obj creation (see above) will fail @@ -7028,7 +7049,7 @@ class App(QtCore.QObject): self.select_objects(key='multisel') else: # If there is no active command (self.command_active is None) then we check if - # we clicked on a object by checking the bounding limits against mouse click position + # we clicked on an object by checking the bounding limits against mouse click position self.select_objects() self.delete_hover_shape() @@ -7179,7 +7200,7 @@ class App(QtCore.QObject): self.collection.set_active(obj.obj_options['name']) obj.selection_shape_drawn = True except Exception as e: - # the Exception here will happen if we try to select on screen and we have an newly (and empty) + # the Exception here will happen if we try to select on screen, and we have a newly (and empty) # just created Geometry or Excellon object that do not have the xmin, xmax, ymin, ymax options. # In this case poly_obj creation (see above) will fail self.log.error("App.selection_area_handler() --> %s" % str(e)) @@ -7221,7 +7242,7 @@ class App(QtCore.QObject): if self.objects_under_the_click_list: curr_sel_obj = self.collection.get_active() - # case when there is only an object under the click and we toggle it + # case when there is only an object under the click, and we toggle it if len(self.objects_under_the_click_list) == 1: try: if curr_sel_obj is None: @@ -7265,7 +7286,7 @@ class App(QtCore.QObject): self.collection.get_by_name(self.objects_under_the_click_list[0]).selection_shape_drawn = True name_sel_obj = self.collection.get_active().obj_options['name'] - # In case that there is a selected object but it is not in the overlapped object list + # In case that there is a selected object, but it is not in the overlapped object list # make that object inactive and activate the first element in the overlapped object list if name_sel_obj not in self.objects_under_the_click_list: self.collection.set_inactive(name_sel_obj) @@ -7324,8 +7345,8 @@ class App(QtCore.QObject): :param curr_sel_obj: Application object that have geometry: Geometry, Gerber, Excellon, CNCJob :type curr_sel_obj: - :return: None - :rtype: None + :return: + :rtype: """ if curr_sel_obj: if curr_sel_obj.kind == 'gerber': @@ -7803,7 +7824,7 @@ class App(QtCore.QObject): line = 0 if dia_box.ok: - # make sure to move first the cursor at the end so after finding the line the line will be positioned + # make sure to move first the cursor at the end so after finding the line, the line will be positioned # at the top of the window self.ui.plot_tab_area.currentWidget().code_editor.moveCursor(QTextCursor.MoveOperation.End) # get the document() of the AppTextEditor @@ -7883,7 +7904,7 @@ class App(QtCore.QObject): def setup_recent_items(self): """ - Setup a dictionary with the recent files accessed, organized by type + Set up a dictionary with the recent files accessed, organized by type :return: """ @@ -7956,7 +7977,7 @@ class App(QtCore.QObject): fp.close() # Closure needed to create callbacks in a loop. - # Otherwise late binding occurs. + # Otherwise, late binding occurs. def make_callback(func, fname): def opener(): func(fname) @@ -8286,7 +8307,7 @@ class App(QtCore.QObject): def on_plotcanvas_add(plotcanvas_obj, container): """ - :param plotcanvas_obj: the class that setup the canvas + :param plotcanvas_obj: the class that set up the canvas :type plotcanvas_obj: class :param container: a layout where to add the native widget of the plotcanvas_obj class :type container: @@ -8686,8 +8707,8 @@ class App(QtCore.QObject): :type fill_color: str :param outline_color: the outline color that will be set for the selected objects :type outline_color: str - :return: None - :rtype: None + :return: + :rtype: """ # make sure to set the color in the Gerber colors storage self.options["gerber_color_list"] @@ -8794,8 +8815,8 @@ class App(QtCore.QObject): :param msg: Message to display. :param show: Opens the shell. :param error: Shows the message as an error. - :param warning: Shows the message as an warning. - :param success: Shows the message as an success. + :param warning: Shows the message as a warning. + :param success: Shows the message as a success. :param selected: Indicate that something was selected on canvas :return: None """ diff --git a/appObjects/AppObject.py b/appObjects/AppObject.py index 10d43655..ae542164 100644 --- a/appObjects/AppObject.py +++ b/appObjects/AppObject.py @@ -7,7 +7,8 @@ # Modified by Marius Stanciu (2020) # # ########################################################### -from appObjects.ObjectCollection import * +from PyQt6 import QtCore + from appObjects.CNCJobObject import CNCJobObject from appObjects.DocumentObject import DocumentObject from appObjects.ExcellonObject import ExcellonObject @@ -17,6 +18,7 @@ from appObjects.ScriptObject import ScriptObject import time import traceback +from copy import deepcopy # FlatCAM Translation import gettext diff --git a/appObjects/AppObjectTemplate.py b/appObjects/AppObjectTemplate.py index efc98e1f..73db2086 100644 --- a/appObjects/AppObjectTemplate.py +++ b/appObjects/AppObjectTemplate.py @@ -10,10 +10,9 @@ # File modified by: Marius Stanciu # # ########################################################## -# import inspect - -from appGUI.ObjectUI import * +from PyQt6 import QtCore, QtGui +from appGUI.ObjectUI import ObjectUI from appCommon.Common import LoudDict from appGUI.PlotCanvasLegacy import ShapeCollectionLegacy from appGUI.VisPyVisuals import ShapeCollection @@ -21,9 +20,10 @@ from appGUI.VisPyVisuals import ShapeCollection from shapely.ops import unary_union from shapely.geometry import Polygon, MultiPolygon, Point, LineString -from copy import deepcopy +from copy import deepcopy, copy import sys import math +import inspect import gettext import appTranslation as fcTranslate @@ -211,12 +211,12 @@ class FlatCAMObj(QtCore.QObject): @property def visible(self): - ''' + """ This property is used by Editors to turn off plotting for the original object that is edited, such that when deleting certain elements there is no background plot in place to confuse things. :return: :rtype: - ''' + """ return self.shapes.visible @visible.setter @@ -227,6 +227,7 @@ class FlatCAMObj(QtCore.QObject): current_visibility = self.shapes.visible self.shapes.visible = current_visibility # maybe this is slower in VisPy? use enabled property? + def task(visibility): if visibility is True: if value is False: @@ -666,7 +667,7 @@ class FlatCAMObj(QtCore.QObject): if isinstance(geo, list) and geo[0] is not None: if isinstance(geo, MultiPolygon): env_obj = geo.convex_hull - elif (isinstance(geo, MultiPolygon) and len(geo) == 1) or \ + elif (isinstance(geo, MultiPolygon) and len(geo.geoms) == 1) or \ (isinstance(geo, list) and len(geo) == 1) and isinstance(geo[0], Polygon): env_obj = unary_union(geo) env_obj = env_obj.convex_hull diff --git a/appObjects/CNCJobObject.py b/appObjects/CNCJobObject.py index e3af96cc..83250a15 100644 --- a/appObjects/CNCJobObject.py +++ b/appObjects/CNCJobObject.py @@ -10,17 +10,22 @@ # File modified by: Marius Stanciu # # ########################################################## -from io import StringIO -from datetime import datetime +from PyQt6 import QtCore, QtWidgets from appEditors.AppTextEditor import AppTextEditor -from appObjects.AppObjectTemplate import * - +from appObjects.AppObjectTemplate import FlatCAMObj, ObjectDeleted +from appGUI.GUIElements import FCFileSaveDialog, FCCheckBox +from appGUI.ObjectUI import CNCObjectUI from camlib import CNCjob import os import sys import math +import re + +from io import StringIO +from datetime import datetime as dt +from copy import deepcopy import gettext import appTranslation as fcTranslate @@ -855,7 +860,7 @@ class CNCJobObject(FlatCAMObj, CNCjob): """ self.app.log.debug("FlatCAMCNCJob.gcode_header()") - time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + time_str = "{:%A, %d %B %Y at %H:%M}".format(dt.now()) marlin = False hpgl = False probe_pp = False diff --git a/appObjects/DocumentObject.py b/appObjects/DocumentObject.py index 28a88afb..3092ab0f 100644 --- a/appObjects/DocumentObject.py +++ b/appObjects/DocumentObject.py @@ -9,8 +9,12 @@ # ########################################################## # File modified by: Marius Stanciu # # ########################################################## + +from PyQt6.QtCore import Qt + from appEditors.AppTextEditor import AppTextEditor from appObjects.AppObjectTemplate import * +from appGUI.ObjectUI import DocumentObjectUI import gettext import appTranslation as fcTranslate diff --git a/appObjects/ExcellonObject.py b/appObjects/ExcellonObject.py index 39b52230..bcba1428 100644 --- a/appObjects/ExcellonObject.py +++ b/appObjects/ExcellonObject.py @@ -10,14 +10,18 @@ # File modified by: Marius Stanciu # # ########################################################## - -from shapely.geometry import LineString +from PyQt6 import QtWidgets, QtCore, QtGui from appParsers.ParseExcellon import Excellon -from appObjects.AppObjectTemplate import * +from appObjects.AppObjectTemplate import FlatCAMObj, ObjectDeleted +from appGUI.GUIElements import FCCheckBox +from appGUI.ObjectUI import ExcellonObjectUI import itertools import numpy as np +from copy import deepcopy + +from shapely.geometry import LineString import gettext import appTranslation as fcTranslate diff --git a/appObjects/GeometryObject.py b/appObjects/GeometryObject.py index 4915fa4d..04a72390 100644 --- a/appObjects/GeometryObject.py +++ b/appObjects/GeometryObject.py @@ -10,17 +10,22 @@ # File modified by: Marius Stanciu # # ########################################################## -from shapely.geometry import MultiLineString, LinearRing -import shapely.affinity as affinity +from PyQt6 import QtWidgets, QtCore +from appObjects.AppObjectTemplate import FlatCAMObj, ObjectDeleted +from appGUI.GUIElements import FCCheckBox +from appGUI.ObjectUI import GeometryObjectUI + +from shapely.geometry import MultiLineString, LinearRing, Polygon, MultiPolygon, LineString +from shapely.affinity import scale, translate +from shapely.ops import unary_union from camlib import Geometry, flatten_shapely_geometry -from appObjects.AppObjectTemplate import * - +import re import ezdxf import numpy as np -from copy import deepcopy import traceback +from copy import deepcopy from collections import defaultdict from functools import reduce @@ -1193,7 +1198,7 @@ class GeometryObject(FlatCAMObj, Geometry): self.app.proc_container.update_view_text(' %d%%' % disp_number) self.old_disp_number = disp_number - return affinity.scale(geom, xfactor, yfactor, origin=(px, py)) + return scale(geom, xfactor, yfactor, origin=(px, py)) except AttributeError: return geom @@ -1269,7 +1274,7 @@ class GeometryObject(FlatCAMObj, Geometry): self.app.proc_container.update_view_text(' %d%%' % disp_number) self.old_disp_number = disp_number - return affinity.translate(geom, xoff=dx, yoff=dy) + return translate(geom, xoff=dx, yoff=dy) except AttributeError: return geom diff --git a/appObjects/GerberObject.py b/appObjects/GerberObject.py index ed02bf1a..4e5c038c 100644 --- a/appObjects/GerberObject.py +++ b/appObjects/GerberObject.py @@ -10,12 +10,16 @@ # File modified by: Marius Stanciu # # ########################################################## +from PyQt6 import QtWidgets, QtCore +from appGUI.GUIElements import FCCheckBox +from appGUI.ObjectUI import GerberObjectUI +from appParsers.ParseGerber import Gerber +from appObjects.AppObjectTemplate import FlatCAMObj, ObjectDeleted, ValidationError -from shapely.geometry import MultiLineString, LinearRing from camlib import flatten_shapely_geometry -from appParsers.ParseGerber import Gerber -from appObjects.AppObjectTemplate import * +from shapely.geometry import MultiLineString, LinearRing, MultiPolygon, Polygon, LineString, Point +from shapely.ops import unary_union import numpy as np from copy import deepcopy diff --git a/appObjects/ScriptObject.py b/appObjects/ScriptObject.py index a7eb5d75..f1446abd 100644 --- a/appObjects/ScriptObject.py +++ b/appObjects/ScriptObject.py @@ -10,9 +10,11 @@ # File modified by: Marius Stanciu # # ########################################################## +from PyQt6 import QtCore + from appEditors.AppTextEditor import AppTextEditor -from appObjects.AppObjectTemplate import * -from appGUI.ObjectUI import * +from appObjects.AppObjectTemplate import FlatCAMObj +from appGUI.ObjectUI import ScriptObjectUI import gettext import appTranslation as fcTranslate diff --git a/appParsers/ParseDXF.py b/appParsers/ParseDXF.py index fb6e7639..9fe62ca8 100644 --- a/appParsers/ParseDXF.py +++ b/appParsers/ParseDXF.py @@ -5,15 +5,14 @@ # MIT Licence # # ########################################################## -from shapely.geometry import LineString, Point -from shapely.affinity import rotate -# from ezdxf.math import Vector as ezdxf_vector -from ezdxf.math import Vec3 as ezdxf_vector - -from appParsers.ParseFont import * from appParsers.ParseDXF_Spline import spline2Polyline, normalize_2 from appParsers.ParseDXF_Spline import Vector as DxfVector +from shapely.geometry import LineString, Point, Polygon +from shapely.affinity import rotate, translate, scale +# from ezdxf.math import Vector as ezdxf_vector +from ezdxf.math import Vec3 as ezdxf_vector + import math import logging diff --git a/appParsers/ParseExcellon.py b/appParsers/ParseExcellon.py index 3133b088..5e660e19 100644 --- a/appParsers/ParseExcellon.py +++ b/appParsers/ParseExcellon.py @@ -419,10 +419,10 @@ class Excellon(Geometry): self.app.log.debug("ALternative M71/M72 units found, after conversion: %s" % self.units) if self.units == 'MM': self.app.log.warning("Excellon format preset is: %s:%s" % - (str(self.excellon_format_upper_mm), str(self.excellon_format_lower_mm))) + (str(self.excellon_format_upper_mm), str(self.excellon_format_lower_mm))) else: self.app.log.warning("Excellon format preset is: %s:%s" % - (str(self.excellon_format_upper_in), str(self.excellon_format_lower_in))) + (str(self.excellon_format_upper_in), str(self.excellon_format_lower_in))) continue # ### Body #### diff --git a/appParsers/ParseFont.py b/appParsers/ParseFont.py index 719bd96e..c0dcb23b 100644 --- a/appParsers/ParseFont.py +++ b/appParsers/ParseFont.py @@ -22,6 +22,7 @@ import freetype as ft from fontTools import ttLib import logging + import gettext import appTranslation as fcTranslate import builtins diff --git a/appParsers/ParseGerber.py b/appParsers/ParseGerber.py index 74b31dad..490c4107 100644 --- a/appParsers/ParseGerber.py +++ b/appParsers/ParseGerber.py @@ -1,6 +1,10 @@ + from PyQt6 import QtWidgets from camlib import Geometry, arc, arc_angle, ApertureMacro, grace, flatten_shapely_geometry +from appParsers.ParseDXF import getdxfgeo +from appParsers.ParseSVG import svgparselength, getsvggeo, svgparse_viewbox + import numpy as np import traceback from copy import deepcopy @@ -8,13 +12,13 @@ from copy import deepcopy from shapely.ops import unary_union, linemerge import shapely.affinity as affinity from shapely.geometry import box as shply_box -from shapely.geometry import LinearRing, MultiLineString +from shapely.geometry import LinearRing, MultiLineString, LineString, Polygon, MultiPolygon, Point from lxml import etree as ET import ezdxf - -from appParsers.ParseDXF import * -from appParsers.ParseSVG import svgparselength, getsvggeo, svgparse_viewbox +import logging +import re +import sys import gettext import builtins @@ -1422,7 +1426,8 @@ class Gerber(Geometry): j = 0 if quadrant_mode is None: - self.app.log.error("Found arc without preceding quadrant specification G74 or G75. (%d)" % line_num) + self.app.log.error( + "Found arc without preceding quadrant specification G74 or G75. (%d)" % line_num) self.app.log.error(gline) continue @@ -1959,7 +1964,7 @@ class Gerber(Geometry): self.app.log.debug("appParsers.ParseGerber.Gerber.import_svg(). Finished parsing the SVG geometry.") if flip: - geos = [translate(scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos] + geos = [affinity.translate(affinity.scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos] self.app.log.debug("appParsers.ParseGerber.Gerber.import_svg(). SVG geometry was flipped.") # Add to object @@ -2529,7 +2534,7 @@ class Gerber(Geometry): try: if isinstance(self.solid_geometry, (MultiPolygon, MultiLineString)): self.geo_len = len(self.solid_geometry.geoms) - else: + if isinstance(self.solid_geometry, list): self.geo_len = len(self.solid_geometry) except (TypeError, ValueError, RuntimeError): self.geo_len = 1 @@ -2634,8 +2639,8 @@ class Gerber(Geometry): geo_p = shply_box(minx, miny, maxx, maxy) new_geo_el['solid'] = geo_p else: - self.app.log.debug("appParsers.ParseGerber.Gerber.buffer() --> " - "ap type not supported") + self.app.log.debug( + "appParsers.ParseGerber.Gerber.buffer() --> ap type not supported") else: new_geo_el['solid'] = geo_el['follow'].buffer( size/1.9999, diff --git a/appParsers/ParseHPGL2.py b/appParsers/ParseHPGL2.py index d91d9493..81d1d554 100644 --- a/appParsers/ParseHPGL2.py +++ b/appParsers/ParseHPGL2.py @@ -18,7 +18,6 @@ import sys from shapely.ops import unary_union from shapely.geometry import LineString, Point -# import AppTranslation as fcTranslate import gettext import builtins diff --git a/appPlugins/ToolAlignObjects.py b/appPlugins/ToolAlignObjects.py index 8ab7abe5..cfa82c13 100644 --- a/appPlugins/ToolAlignObjects.py +++ b/appPlugins/ToolAlignObjects.py @@ -5,7 +5,19 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtGui, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet + +from shapely.geometry import Point +from shapely.affinity import translate + +import logging +import math + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appPlugins/ToolCalculators.py b/appPlugins/ToolCalculators.py index 0dd99735..5f416404 100644 --- a/appPlugins/ToolCalculators.py +++ b/appPlugins/ToolCalculators.py @@ -5,12 +5,24 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, NumericalEvalEntry, RadioSet, \ + FCDoubleSpinner, FCSpinner + +import logging +import math + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext +log = logging.getLogger('base') + class ToolCalculator(AppTool): diff --git a/appPlugins/ToolCopperThieving.py b/appPlugins/ToolCopperThieving.py index e44d9edd..efa3a4a2 100644 --- a/appPlugins/ToolCopperThieving.py +++ b/appPlugins/ToolCopperThieving.py @@ -5,11 +5,28 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtGui, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet, \ + FCDoubleSpinner, FCComboBox2, FCEntry, FCCheckBox + from appCommon.Common import LoudDict from appCommon.Common import GracefulException as grace -from camlib import flatten_shapely_geometry +from camlib import flatten_shapely_geometry + +import logging +from copy import deepcopy +import numpy as np +from typing import Iterable + import shapely.geometry.base as base +from shapely.geometry import Polygon, MultiPolygon, box, Point, LineString +from shapely.ops import unary_union +from shapely.affinity import translate + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appPlugins/ToolCutOut.py b/appPlugins/ToolCutOut.py index 9956d843..4ebc328c 100644 --- a/appPlugins/ToolCutOut.py +++ b/appPlugins/ToolCutOut.py @@ -5,11 +5,29 @@ # MIT Licence # # ########################################################## -from appTool import * -from camlib import grace, flatten_shapely_geometry -from matplotlib.backend_bases import KeyEvent as mpl_key_event +from PyQt6 import QtWidgets, QtGui, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet, \ + FCDoubleSpinner, FCComboBox2, OptionalInputSection, FCCheckBox +from camlib import flatten_shapely_geometry + +import math +import logging +from copy import deepcopy +import simplejson as json +import sys from numpy import Inf +from shapely.geometry import Polygon, MultiPolygon, box, Point, LineString, MultiLineString, LinearRing +from shapely.ops import unary_union, linemerge +from shapely.affinity import rotate + +from matplotlib.backend_bases import KeyEvent as mpl_key_event + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext diff --git a/appPlugins/ToolDblSided.py b/appPlugins/ToolDblSided.py index e7435166..5d0e8719 100644 --- a/appPlugins/ToolDblSided.py +++ b/appPlugins/ToolDblSided.py @@ -1,5 +1,19 @@ -from appTool import * +from PyQt6 import QtWidgets, QtGui, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet, \ + FCDoubleSpinner, FCComboBox2, NumericalEvalTupleEntry + +import logging +from copy import deepcopy +from numpy import Inf + +from shapely.geometry import Point +from shapely.affinity import scale + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appPlugins/ToolDistance.py b/appPlugins/ToolDistance.py index 35e21632..56c4f898 100644 --- a/appPlugins/ToolDistance.py +++ b/appPlugins/ToolDistance.py @@ -5,11 +5,25 @@ # MIT Licence # # ########################################################## -from appTool import * -from appGUI.VisPyVisuals import * +from PyQt6 import QtWidgets, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCEntry, FCCheckBox +from appGUI.VisPyVisuals import ShapeCollection from camlib import AppRTreeStorage from appEditors.AppGeoEditor import DrawToolShape +import math +import logging +from copy import copy +import numpy as np + +from shapely.geometry import Polygon, Point, LineString, MultiLineString +from shapely.strtree import STRtree + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext diff --git a/appPlugins/ToolDrilling.py b/appPlugins/ToolDrilling.py index 0a0af4bb..d7ef7ccd 100644 --- a/appPlugins/ToolDrilling.py +++ b/appPlugins/ToolDrilling.py @@ -5,10 +5,29 @@ # License: MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCSpinner, NumericalEvalTupleEntry, NumericalEvalEntry, FCTable, \ + OptionalInputSection, OptionalHideInputSection from appParsers.ParseExcellon import Excellon + from matplotlib.backend_bases import KeyEvent as mpl_key_event +import logging +from copy import deepcopy +import numpy as np +import simplejson as json +import sys +import platform +import re + +from shapely.geometry import LineString + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext diff --git a/appPlugins/ToolEtchCompensation.py b/appPlugins/ToolEtchCompensation.py index 5732c862..5def644e 100644 --- a/appPlugins/ToolEtchCompensation.py +++ b/appPlugins/ToolEtchCompensation.py @@ -5,9 +5,22 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCEntry, \ + RadioSet, FCDoubleSpinner, NumericalEvalEntry from camlib import flatten_shapely_geometry +import logging +from copy import deepcopy +import math + +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -209,7 +222,8 @@ class ToolEtchCompensation(AppTool): offset = offset_value / 1000 # in microns if offset == 0: - # no need to do anything for zero value offset isn't it? compensating with zero is the same as the original + # no need to do anything for zero value, offset, isn't it? + # compensating with zero is the same as the original return grb_obj.solid_geometry = flatten_shapely_geometry(grb_obj.solid_geometry) diff --git a/appPlugins/ToolExtract.py b/appPlugins/ToolExtract.py index d5d70dfb..fe4c46d7 100644 --- a/appPlugins/ToolExtract.py +++ b/appPlugins/ToolExtract.py @@ -5,7 +5,19 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + RadioSet, FCDoubleSpinner, FCTable + +import logging +from copy import deepcopy + +from shapely.geometry import Polygon, MultiPolygon, Point, box + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appPlugins/ToolFiducials.py b/appPlugins/ToolFiducials.py index 8f1c2de4..957da7ff 100644 --- a/appPlugins/ToolFiducials.py +++ b/appPlugins/ToolFiducials.py @@ -5,10 +5,23 @@ # MIT Licence # # ########################################################## -from appTool import * -import shapely.geometry +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, EvalEntry, FCTable from appCommon.Common import LoudDict +import logging +from copy import deepcopy +import math + +from shapely.geometry import LineString, Polygon, MultiPolygon, box, Point, base +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -541,7 +554,7 @@ class ToolFiducials(AppTool): geo_buff_list = [] if aperture_found: for geo in geo_list: - assert isinstance(geo, shapely.geometry.base.BaseGeometry) + assert isinstance(geo, base.BaseGeometry) geo_buff_list.append(geo) dict_el = {'follow': geo.centroid, 'solid': geo} @@ -562,7 +575,7 @@ class ToolFiducials(AppTool): } for geo in geo_list: - assert isinstance(geo, shapely.geometry.base.BaseGeometry) + assert isinstance(geo, base.BaseGeometry) geo_buff_list.append(geo) dict_el = {'follow': geo.centroid, 'solid': geo} diff --git a/appPlugins/ToolFilm.py b/appPlugins/ToolFilm.py index 43e9e2c2..f467bb7b 100644 --- a/appPlugins/ToolFilm.py +++ b/appPlugins/ToolFilm.py @@ -5,7 +5,22 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCSpinner, FCFileSaveDialog, OptionalHideInputSection + +import logging +from copy import deepcopy +import math + +from shapely.geometry import LineString, MultiPolygon, Point, Polygon, LinearRing +from shapely.affinity import scale, skew +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins from reportlab.graphics import renderPDF from reportlab.pdfgen import canvas diff --git a/appPlugins/ToolFollow.py b/appPlugins/ToolFollow.py index d33bf6ee..a67f9e8e 100644 --- a/appPlugins/ToolFollow.py +++ b/appPlugins/ToolFollow.py @@ -5,7 +5,21 @@ # License: MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet + +import logging +from copy import deepcopy +import numpy as np + +from shapely.geometry import Polygon +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + from appParsers.ParseGerber import Gerber from matplotlib.backend_bases import KeyEvent as mpl_key_event from camlib import flatten_shapely_geometry @@ -294,8 +308,8 @@ class ToolFollow(AppTool, Gerber): followed_obj.follow_geometry = flatten_shapely_geometry(followed_obj.follow_geometry) follow_geo = [ - g for g in followed_obj.follow_geometry if g and not g.is_empty and g.is_valid and - g.geom_type != 'Point' + g for g in followed_obj.follow_geometry + if g and not g.is_empty and g.is_valid and g.geom_type != 'Point' ] if not follow_geo: diff --git a/appPlugins/ToolImage.py b/appPlugins/ToolImage.py index e889bc27..96756e7e 100644 --- a/appPlugins/ToolImage.py +++ b/appPlugins/ToolImage.py @@ -5,7 +5,21 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCSpinner, FCMessageBox + +from copy import deepcopy +import numpy as np +import os + +from shapely.geometry import LineString, MultiLineString, Polygon, MultiPolygon, shape +from shapely.affinity import scale, translate +import gettext +import appTranslation as fcTranslate +import builtins + from rasterio import open as rasterio_open from rasterio.features import shapes diff --git a/appPlugins/ToolInvertGerber.py b/appPlugins/ToolInvertGerber.py index 63a6c22b..52e4e4d6 100644 --- a/appPlugins/ToolInvertGerber.py +++ b/appPlugins/ToolInvertGerber.py @@ -5,7 +5,20 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, RadioSet, \ + FCDoubleSpinner + +import logging +from copy import deepcopy + +from shapely.geometry import box + +import gettext +import appTranslation as fcTranslate +import builtins + from camlib import flatten_shapely_geometry fcTranslate.apply_language('strings') diff --git a/appPlugins/ToolIsolation.py b/appPlugins/ToolIsolation.py index 0318daba..3290117c 100644 --- a/appPlugins/ToolIsolation.py +++ b/appPlugins/ToolIsolation.py @@ -5,7 +5,28 @@ # License: MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCSpinner, FCInputDialogSpinnerButton, FCTable, \ + OptionalInputSection + +import logging +from copy import deepcopy +from typing import Iterable + +import numpy as np +import simplejson as json +import sys +import math + +from shapely.geometry import LineString, MultiLineString, Polygon, MultiPolygon, Point, LinearRing +from shapely.ops import unary_union, nearest_points + +import gettext +import appTranslation as fcTranslate +import builtins + from appParsers.ParseGerber import Gerber from matplotlib.backend_bases import KeyEvent as mpl_key_event from camlib import grace @@ -2397,7 +2418,7 @@ class ToolIsolation(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for poly in geo_elem: + for poly in geo_elem.geoms: for ring in self.poly2rings(poly): new_geo = ring.difference(sub_union) if new_geo and not new_geo.is_empty: @@ -2408,7 +2429,7 @@ class ToolIsolation(AppTool, Gerber): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.difference(sub_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -2424,7 +2445,7 @@ class ToolIsolation(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(target_geo, MultiLineString): - for line_elem in target_geo: + for line_elem in target_geo.geoms: new_geo = line_elem.difference(sub_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -2451,7 +2472,7 @@ class ToolIsolation(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for poly in geo_elem: + for poly in geo_elem.geoms: for ring in self.poly2rings(poly): new_geo = ring.intersection(intersect_union) if new_geo and not new_geo.is_empty: @@ -2462,7 +2483,7 @@ class ToolIsolation(AppTool, Gerber): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.intersection(intersect_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -2478,7 +2499,7 @@ class ToolIsolation(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(target_geo, MultiLineString): - for line_elem in target_geo: + for line_elem in target_geo.geoms: new_geo = line_elem.intersection(intersect_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) diff --git a/appPlugins/ToolLevelling.py b/appPlugins/ToolLevelling.py index 1fcae386..8950cff9 100644 --- a/appPlugins/ToolLevelling.py +++ b/appPlugins/ToolLevelling.py @@ -5,7 +5,26 @@ # License: MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from PyQt6.QtCore import Qt +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCJog, RadioSet, FCDoubleSpinner, FCSpinner, FCFileSaveDialog, FCDetachableTab, FCTable, \ + FCZeroAxes, FCSliderWithDoubleSpinner, FCEntry, RotatedToolButton + +import logging +from copy import deepcopy +import sys + +from shapely.geometry import Point, MultiPoint, MultiPolygon, box +from shapely.ops import unary_union +from shapely.affinity import translate +from datetime import datetime as dt + +import gettext +import appTranslation as fcTranslate +import builtins + from appObjects.AppObjectTemplate import ObjectDeleted from appGUI.VisPyVisuals import * from appGUI.PlotCanvasLegacy import ShapeCollectionLegacy @@ -1391,7 +1410,7 @@ class ToolLevelling(AppTool, CNCjob): p_gcode = '' header = '' - time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + time_str = "{:%A, %d %B %Y at %H:%M}".format(dt.now()) coords = [] al_method = self.ui.al_method_radio.get_value() @@ -1492,7 +1511,7 @@ class ToolLevelling(AppTool, CNCjob): str(self.app.dec_format(probe_fr, target_obj.fr_decimals)), ) # store in a global numeric variable the value of the detected probe Z - # I offset the global numeric variable by 500 so it does not conflict with something else + # I offset the global numeric variable by 500 so, it does not conflict with something else # temp_var = int(idx + 500) # p_gcode += "#%d = %s\n" % (temp_var, probing_var) diff --git a/appPlugins/ToolMarkers.py b/appPlugins/ToolMarkers.py index da970529..1e858668 100644 --- a/appPlugins/ToolMarkers.py +++ b/appPlugins/ToolMarkers.py @@ -5,7 +5,21 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, NumericalEvalTupleEntry + +import logging +from copy import deepcopy + +from shapely.geometry import LineString, Point, MultiPolygon +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + from appCommon.Common import LoudDict from camlib import flatten_shapely_geometry diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index fb4d6cee..d2c0d90d 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -5,7 +5,26 @@ # License: MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCSpinner, NumericalEvalTupleEntry, FCTable, \ + OptionalInputSection, OptionalHideInputSection + +import logging +from copy import deepcopy +import numpy as np +import simplejson as json +import sys +import math +import traceback + +from shapely.geometry import LineString, box + +import gettext +import appTranslation as fcTranslate +import builtins + from appParsers.ParseExcellon import Excellon from matplotlib.backend_bases import KeyEvent as mpl_key_event from camlib import grace diff --git a/appPlugins/ToolMove.py b/appPlugins/ToolMove.py index 434534d0..f513c59a 100644 --- a/appPlugins/ToolMove.py +++ b/appPlugins/ToolMove.py @@ -5,8 +5,18 @@ # MIT Licence # # ########################################################## -from appTool import * -from appGUI.VisPyVisuals import * +from PyQt6 import QtWidgets, QtCore +from appTool import AppTool +from appGUI.VisPyVisuals import ShapeCollection + +import logging +from copy import copy + +from shapely.geometry import Polygon + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -87,7 +97,7 @@ class ToolMove(AppTool): return else: self.setVisible(True) - # signal that there is a command active and it is 'Move' + # signal that there is a command active, and it is 'Move' self.app.command_active = "Move" sel_obj_list = self.app.collection.get_selected() diff --git a/appPlugins/ToolNCC.py b/appPlugins/ToolNCC.py index 62dac7eb..5941fb1b 100644 --- a/appPlugins/ToolNCC.py +++ b/appPlugins/ToolNCC.py @@ -5,7 +5,26 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCInputDialogSpinnerButton, FCTable, \ + OptionalInputSection + +import logging +from copy import deepcopy +import numpy as np +import simplejson as json +import sys +import traceback + +from shapely.geometry import LineString, Polygon, MultiPolygon, MultiLineString, base, LinearRing +from shapely.ops import unary_union, nearest_points + +import gettext +import appTranslation as fcTranslate +import builtins + from appParsers.ParseGerber import Gerber from camlib import grace, flatten_shapely_geometry from matplotlib.backend_bases import KeyEvent as mpl_key_event @@ -523,7 +542,7 @@ class NonCopperClear(AppTool, Gerber): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns too, but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -543,7 +562,7 @@ class NonCopperClear(AppTool, Gerber): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns too, but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -619,7 +638,7 @@ class NonCopperClear(AppTool, Gerber): def form_to_storage(self): if self.ui.tools_table.rowCount() == 0: - # there is no tool in tool table so we can't save the GUI elements values to storage + # there is no tool in tool table, so we can't save the GUI elements values to storage return self.blockSignals(True) @@ -647,7 +666,7 @@ class NonCopperClear(AppTool, Gerber): def on_apply_param_to_all_clicked(self): if self.ui.tools_table.rowCount() == 0: - # there is no tool in tool table so we can't save the GUI elements values to storage + # there is no tool in tool table, so we can't save the GUI elements values to storage self.app.log.debug("NonCopperClear.on_apply_param_to_all_clicked() --> no tool in Tools Table, aborting.") return @@ -1033,7 +1052,7 @@ class NonCopperClear(AppTool, Gerber): self.app.inform.emit('[ERROR_NOTCL] %s' % msg) return 'fail' - # check if the tools diameters are less then the safe tool diameter + # check if the tools diameters are less than the safe tool diameter suitable_tools = [] for tool in sorted_tools: tool_dia = float(self.ncc_tools[tool]['tooldia']) @@ -1873,7 +1892,7 @@ class NonCopperClear(AppTool, Gerber): try: if isinstance(geo_n, MultiPolygon): env_obj = geo_n.convex_hull - elif (isinstance(geo_n, MultiPolygon) and len(geo_n) == 1) or \ + elif (isinstance(geo_n, MultiPolygon) and len(geo_n.geoms) == 1) or \ (isinstance(geo_n, list) and len(geo_n) == 1) and isinstance(geo_n[0], Polygon): env_obj = unary_union(geo_n) else: @@ -2070,7 +2089,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for poly in geo_elem: + for poly in geo_elem.geoms: for ring in self.poly2rings(poly): new_geo = ring.intersection(bounding_box) if new_geo and not new_geo.is_empty: @@ -2081,7 +2100,7 @@ class NonCopperClear(AppTool, Gerber): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -2097,7 +2116,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(isolated_geo, MultiLineString): - for line_elem in isolated_geo: + for line_elem in isolated_geo.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -2921,7 +2940,7 @@ class NonCopperClear(AppTool, Gerber): try: if isinstance(geo_n, MultiPolygon): env_obj = geo_n.convex_hull - elif (isinstance(geo_n, MultiPolygon) and len(geo_n) == 1) or \ + elif (isinstance(geo_n, MultiPolygon) and len(geo_n.geoms) == 1) or \ (isinstance(geo_n, list) and len(geo_n) == 1) and isinstance(geo_n[0], Polygon): env_obj = unary_union(geo_n) else: @@ -3089,7 +3108,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for a_poly in geo_elem: + for a_poly in geo_elem.geoms: for ring in self.poly2rings(a_poly): new_geo = ring.intersection(bounding_box) if new_geo and not new_geo.is_empty: @@ -3100,7 +3119,7 @@ class NonCopperClear(AppTool, Gerber): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -3116,7 +3135,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(isolated_geo, MultiLineString): - for line_elem in isolated_geo: + for line_elem in isolated_geo.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -3470,7 +3489,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for poly_g in geo_elem: + for poly_g in geo_elem.geoms: for ring in self.poly2rings(poly_g): new_geo = ring.intersection(bounding_box) if new_geo and not new_geo.is_empty: @@ -3481,7 +3500,7 @@ class NonCopperClear(AppTool, Gerber): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -3498,7 +3517,7 @@ class NonCopperClear(AppTool, Gerber): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(isolated_geo, MultiLineString): - for line_elem in isolated_geo: + for line_elem in isolated_geo.geoms: new_geo = line_elem.intersection(bounding_box) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -3653,7 +3672,7 @@ class NonCopperClear(AppTool, Gerber): # a smaller tool rest_geo.append(p) elif isinstance(p, MultiPolygon): - for poly_p in p: + for poly_p in p.geoms: if poly_p is not None: # provide the app with a way to process the GUI events when # in a blocking loop diff --git a/appPlugins/ToolObjectDistance.py b/appPlugins/ToolObjectDistance.py index db3229bb..bd0950af 100644 --- a/appPlugins/ToolObjectDistance.py +++ b/appPlugins/ToolObjectDistance.py @@ -5,7 +5,20 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCEntry, FCComboBox2 + +import logging +from copy import deepcopy +import math + +from shapely.geometry import Point, MultiPolygon +from shapely.ops import nearest_points, unary_union + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appPlugins/ToolOptimal.py b/appPlugins/ToolOptimal.py index 37e60ac7..998114cd 100644 --- a/appPlugins/ToolOptimal.py +++ b/appPlugins/ToolOptimal.py @@ -5,9 +5,22 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCEntry, FCTextArea, FCSpinner, OptionalHideInputSection from camlib import grace +import logging +import numpy as np + +from shapely.geometry import MultiPolygon +from shapely.ops import nearest_points + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -575,7 +588,7 @@ class OptimalUI: self.locations_textb.setStyleSheet(stylesheet) res_grid.addWidget(self.locations_textb, 6, 0, 1, 3) - # Jump button + # "Jump" button self.locate_button = FCButton(_("Jump to selected position")) self.locate_button.setToolTip( _("Select a position in the Locations text box and then\n" @@ -660,7 +673,7 @@ class OptimalUI: self.locations_sec_textb.setStyleSheet(stylesheet) self.distances_box.addWidget(self.locations_sec_textb) - # Jump button + # "Jump" button self.locate_sec_button = FCButton(_("Jump to selected position")) self.locate_sec_button.setToolTip( _("Select a position in the Locations text box and then\n" diff --git a/appPlugins/ToolPDF.py b/appPlugins/ToolPDF.py index b3f90c26..765469f5 100644 --- a/appPlugins/ToolPDF.py +++ b/appPlugins/ToolPDF.py @@ -5,9 +5,24 @@ # MIT Licence # # ########################################################## -from appTool import * -from appParsers.ParsePDF import PdfParser +from PyQt6 import QtWidgets, QtCore +from appTool import AppTool +import logging +from copy import deepcopy +import os +import time +import re +import traceback + +from shapely.geometry import Point, MultiPolygon +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + +from appParsers.ParsePDF import PdfParser from camlib import grace HAS_PIKE_MODULE = True @@ -367,7 +382,7 @@ class ToolPDF(AppTool): def periodic_check(self, check_period): """ - This function starts an QTimer and it will periodically check if parsing was done + This function starts an QTimer, and it will periodically check if parsing was done :param check_period: time at which to check periodically if all plots finished to be plotted :return: @@ -428,7 +443,7 @@ class ToolPDF(AppTool): else: self.app.worker_task.emit({'fcn': self.layer_rendering_as_gerber, 'params': [filename, ap_dict, layer_nr]}) - # delete the object already processed so it will not be processed again for other objects + # delete the object already processed, so it will not be processed again for other objects # that were opened at the same time; like in drag & drop on appGUI for obj_name in obj_to_delete: if obj_name in self.pdf_parsed: diff --git a/appPlugins/ToolPaint.py b/appPlugins/ToolPaint.py index c3f762eb..e2c6a213 100644 --- a/appPlugins/ToolPaint.py +++ b/appPlugins/ToolPaint.py @@ -5,12 +5,33 @@ # MIT Licence # # ########################################################## -from appTool import * -from appParsers.ParseGerber import Gerber -from camlib import Geometry, AppRTreeStorage, grace +from PyQt6 import QtWidgets, QtCore, QtGui +from PyQt6.QtCore import Qt + +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCComboBox2, RadioSet, FCDoubleSpinner, FCInputDoubleSpinner, FCTable from matplotlib.backend_bases import KeyEvent as mpl_key_event +import logging +from copy import deepcopy +import numpy as np +import simplejson as json +import sys +import traceback +from numpy import Inf + +from shapely.geometry import LineString, Polygon, MultiLineString, MultiPolygon, Point, LinearRing, base +from shapely.ops import unary_union, linemerge + +import gettext +import appTranslation as fcTranslate +import builtins + +from appParsers.ParseGerber import Gerber +from camlib import Geometry, AppRTreeStorage, grace + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -482,7 +503,7 @@ class ToolPaint(AppTool, Gerber): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns, too but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -502,7 +523,7 @@ class ToolPaint(AppTool, Gerber): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns too, but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -592,7 +613,7 @@ class ToolPaint(AppTool, Gerber): def form_to_storage(self): if self.ui.tools_table.rowCount() == 0: - # there is no tool in tool table so we can't save the GUI elements values to storage + # there is no tool in tool table, so we can't save the GUI elements values to storage return self.blockSignals(True) @@ -620,7 +641,7 @@ class ToolPaint(AppTool, Gerber): def on_apply_param_to_all_clicked(self): if self.ui.tools_table.rowCount() == 0: - # there is no tool in tool table so we can't save the GUI elements values to storage + # there is no tool in tool table, so we can't save the GUI elements values to storage self.app.log.debug("NonCopperClear.on_apply_param_to_all_clicked() --> no tool in Tools Table, aborting.") return @@ -1900,7 +1921,7 @@ class ToolPaint(AppTool, Gerber): self.app.inform.emit(msg) self.app.proc_container.update_view_text(' %d%%' % 0) - # find the tooluid associated with the current tool_dia so we know what tool to use + # find the tooluid associated with the current tool_dia, so we know what tool to use for k, v in tools_storage.items(): if float('%.*f' % (self.decimals, v['tooldia'])) == float('%.*f' % (self.decimals, tool_dia)): current_uid = int(k) @@ -2088,7 +2109,7 @@ class ToolPaint(AppTool, Gerber): self.app.inform.emit(msg) self.app.proc_container.update_view_text(' %d%%' % 0) - # find the tooluid associated with the current tool_dia so we know what tool to use + # find the tooluid associated with the current tool_dia, so we know what tool to use for k, v in tools_storage.items(): if float('%.*f' % (self.decimals, v['tooldia'])) == float('%.*f' % (self.decimals, tool_dia)): current_uid = int(k) @@ -2421,7 +2442,7 @@ class ToolPaint(AppTool, Gerber): Creates a list of non-iterable linear geometry objects. Results are placed in self.flat_geometry - :param geometry: Shapely type or list or list of list of such. + :param geometry: Shapely type, list or list of lists of such. :param reset: Clears the contents of self.flat_geometry. """ if self.app.abort_flag: @@ -2500,7 +2521,7 @@ class ToolPaint(AppTool, Gerber): Creates a list of non-iterable linear geometry objects. Results are placed in self.flat_geometry - :param geometry: Shapely type or list or list of list of such. + :param geometry: Shapely type, list or list of lists of such. :param reset: Clears the contents of self.flat_geometry. """ if self.app.abort_flag: @@ -2611,7 +2632,7 @@ class ToolPaint(AppTool, Gerber): try: if isinstance(geo, MultiPolygon): env_obj = geo.convex_hull - elif (isinstance(geo, MultiPolygon) and len(geo) == 1) or \ + elif (isinstance(geo, MultiPolygon) and len(geo.geoms) == 1) or \ (isinstance(geo, list) and len(geo) == 1) and isinstance(geo[0], Polygon): env_obj = unary_union(self.bound_obj.solid_geometry) else: @@ -2811,7 +2832,7 @@ class ToolPaint(AppTool, Gerber): def on_paint_tool_from_db_inserted(self, tool): """ - Called from the Tools DB object through a App method when adding a tool from Tools Database + Called from the Tools DB object through an App method when adding a tool from Tools Database :param tool: a dict with the tool data :return: None """ diff --git a/appPlugins/ToolPanelize.py b/appPlugins/ToolPanelize.py index cb365f81..fff9a7c6 100644 --- a/appPlugins/ToolPanelize.py +++ b/appPlugins/ToolPanelize.py @@ -5,9 +5,24 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + RadioSet, FCDoubleSpinner, FCSpinner, OptionalInputSection from camlib import grace +import logging +from copy import deepcopy +import numpy as np + +from shapely.geometry import LineString, MultiLineString, Polygon, MultiPolygon +from shapely.ops import unary_union, linemerge, snap +from shapely.affinity import translate + +import gettext +import appTranslation as fcTranslate +import builtins + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -734,7 +749,7 @@ class Panelize(AppTool): if isinstance(geo, LineString): lines.append(geo) elif isinstance(geo, MultiLineString): - for line in geo: + for line in geo.geoms: lines.append(line) else: other_geo.append(geo) diff --git a/appPlugins/ToolPcbWizard.py b/appPlugins/ToolPcbWizard.py index 524856fc..878b3f52 100644 --- a/appPlugins/ToolPcbWizard.py +++ b/appPlugins/ToolPcbWizard.py @@ -5,13 +5,26 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, GLay, RadioSet, FCSpinner, FCTable +import logging from io import StringIO +import os +import re + +from datetime import datetime as dt + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext +log = logging.getLogger('base') + class PcbWizard(AppTool): @@ -290,7 +303,7 @@ class PcbWizard(AppTool): def on_file_loaded(self, signal, filename): self.build_ui() - time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + time_str = "{:%A, %d %B %Y at %H:%M}".format(dt.now()) if signal == 'inf': self.inf_loaded = True diff --git a/appPlugins/ToolPunchGerber.py b/appPlugins/ToolPunchGerber.py index cef8987b..e4566241 100644 --- a/appPlugins/ToolPunchGerber.py +++ b/appPlugins/ToolPunchGerber.py @@ -5,12 +5,26 @@ # MIT Licence # # ########################################################## -from appTool import * -from appParsers.ParseGerber import Gerber -from camlib import Geometry +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + RadioSet, FCDoubleSpinner, FCTable from matplotlib.backend_bases import KeyEvent as mpl_key_event +import logging +from copy import deepcopy + +from shapely.geometry import Point, MultiPolygon +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins + +from appParsers.ParseGerber import Gerber +from camlib import Geometry + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -642,7 +656,7 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry.append(geo) punched_solid_geometry = unary_union(punched_solid_geometry) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully new_apertures = deepcopy(grb_obj.tools) new_apertures_items = new_apertures.items() @@ -756,7 +770,7 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry.append(geo) punched_solid_geometry = unary_union(punched_solid_geometry) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully new_apertures = deepcopy(self.grb_obj.tools) new_apertures_items = new_apertures.items() @@ -900,7 +914,7 @@ class ToolPunchGerber(AppTool, Gerber): self.app.inform.emit(msg) return 'fail' - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully new_apertures = deepcopy(grb_obj.tools) new_apertures_items = new_apertures.items() @@ -995,7 +1009,7 @@ class ToolPunchGerber(AppTool, Gerber): self.app.inform.emit(msg) return 'fail' - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully new_apertures = deepcopy(self.grb_obj.tools) new_apertures_items = new_apertures.items() @@ -1143,7 +1157,7 @@ class ToolPunchGerber(AppTool, Gerber): if isinstance(elem['follow'], Point): punching_geo.append(elem['follow'].buffer(dia / 2)) - # if dia is None then none of the above applied so we skip the following + # if dia is None then none of the above applied, so we skip the following if dia is None: continue @@ -1154,12 +1168,12 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry = punched_solid_geometry.difference(punching_geo) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully for elem in apid_value['geometry']: # make it work only for Gerber Flashes who are Points in 'follow' if 'solid' in elem and isinstance(elem['follow'], Point): clear_apid_size = dia - for geo in punching_geo: + for geo in punching_geo.geoms: # since there may be drills that do not drill into a pad we test only for geos in a pad if geo.within(elem['solid']): @@ -1283,7 +1297,7 @@ class ToolPunchGerber(AppTool, Gerber): pad_point = self.grb_obj.tools[apid]['geometry'][pad_idx]['follow'] punching_geo.append(pad_point.buffer(dia / 2)) - # if dia is None then none of the above applied so we skip the following + # if dia is None then none of the above applied, so we skip the following if dia is None: continue @@ -1294,12 +1308,12 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry = punched_solid_geometry.difference(punching_geo) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully for elem in apid_value['geometry']: # make it work only for Gerber Flashes who are Points in 'follow' if 'solid' in elem and isinstance(elem['follow'], Point): clear_apid_size = dia - for geo in punching_geo: + for geo in punching_geo.geoms: # since there may be drills that do not drill into a pad we test only for geos in a pad if geo.within(elem['solid']): @@ -1427,7 +1441,7 @@ class ToolPunchGerber(AppTool, Gerber): if isinstance(elem['follow'], Point): punching_geo.append(elem['follow'].buffer(dia / 2)) - # if dia is None then none of the above applied so we skip the following + # if dia is None then none of the above applied, so we skip the following if dia is None: continue @@ -1438,12 +1452,12 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry = punched_solid_geometry.difference(punching_geo) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully for elem in apid_value['geometry']: # make it work only for Gerber Flashes who are Points in 'follow' if 'solid' in elem and isinstance(elem['follow'], Point): clear_apid_size = dia - for geo in punching_geo: + for geo in punching_geo.geoms: # since there may be drills that do not drill into a pad we test only for geos in a pad if geo.within(elem['solid']): @@ -1563,7 +1577,7 @@ class ToolPunchGerber(AppTool, Gerber): pad_point = self.grb_obj.tools[apid]['geometry'][pad_idx]['follow'] punching_geo.append(pad_point.buffer(dia / 2)) - # if dia is None then none of the above applied so we skip the following + # if dia is None then none of the above applied, so we skip the following if dia is None: continue @@ -1574,12 +1588,12 @@ class ToolPunchGerber(AppTool, Gerber): punched_solid_geometry = punched_solid_geometry.difference(punching_geo) - # update the gerber apertures to include the clear geometry so it can be exported successfully + # update the gerber apertures to include the clear geometry, so it can be exported successfully for elem in apid_value['geometry']: # make it work only for Gerber Flashes who are Points in 'follow' if 'solid' in elem and isinstance(elem['follow'], Point): clear_apid_size = dia - for geo in punching_geo: + for geo in punching_geo.geoms: # since there may be drills that do not drill into a pad we test only for geos in a pad if geo.within(elem['solid']): diff --git a/appPlugins/ToolQRCode.py b/appPlugins/ToolQRCode.py index 607c5f6f..6f3b39a2 100644 --- a/appPlugins/ToolQRCode.py +++ b/appPlugins/ToolQRCode.py @@ -5,9 +5,27 @@ # MIT Licence # # ########################################################## -from appTool import * -from appParsers.ParseSVG import * +from PyQt6 import QtWidgets, QtCore, QtGui +from PyQt6.QtCore import Qt + +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCFileSaveDialog, RadioSet, FCTextArea, FCSpinner, FCEntry + +import logging +from copy import deepcopy from io import StringIO, BytesIO +from typing import Iterable +import math + +from shapely.geometry import MultiPolygon, box, Polygon +from shapely.ops import unary_union +from shapely.affinity import translate, scale +import gettext +import appTranslation as fcTranslate +import builtins + +from appParsers.ParseSVG import getsvggeo, getsvgtext, svgparselength, svgparse_viewbox import qrcode import qrcode.image.svg @@ -399,7 +417,7 @@ class QRCode(AppTool): offset_geo = [] # I use the len of self.qrcode_geometry instead of the utility one because the complexity of the polygons is - # better seen in this (bit what if the sel.qrcode_geometry is just one geo element? len will fail ... + # better seen in this (bit what if the sel.qrcode_geometry is just one geo element? len will fail ...) qrcode_geometry_len = len(self.qrcode_geometry.geoms) if isinstance(self.qrcode_geometry, MultiPolygon) else \ len(self.qrcode_geometry) @@ -480,11 +498,11 @@ class QRCode(AppTool): """ Convert shapes from an SVG file into a geometry list. - :param filename: A String Stream file. + :param filename: A String Stream file. :param object_type: parameter passed further along. What kind the object will receive the SVG geometry - :param flip: Flip the vertically. - :type flip: bool - :param units: FlatCAM units + :param flip: Flip this vertically. + :type flip: bool + :param units: FlatCAM units :return: None """ diff --git a/appPlugins/ToolReport.py b/appPlugins/ToolReport.py index debed045..53d16fb2 100644 --- a/appPlugins/ToolReport.py +++ b/appPlugins/ToolReport.py @@ -5,7 +5,19 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCTree +import logging +from copy import deepcopy +import math + +from shapely.geometry import MultiPolygon, Polygon, MultiLineString +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -303,11 +315,12 @@ class ObjectReport(AppTool): for geo_el in obj_prop.tools[tool_k]['solid_geometry']: geo_tools.append(geo_el) + geo_tools_mp = MultiPolygon(geo_tools) try: - for geo_el in geo_tools: + for geo_el in geo_tools_mp.geoms: copper_area += geo_el.area except TypeError: - copper_area += geo_tools.area + copper_area += geo_tools_mp.area copper_area /= 100 except Exception as err: self.app.log.error("Properties.addItems() --> %s" % str(err)) @@ -319,7 +332,7 @@ class ObjectReport(AppTool): if isinstance(geo, list) and geo[0] is not None: if isinstance(geo, MultiPolygon): env_obj = geo.convex_hull - elif (isinstance(geo, MultiPolygon) and len(geo) == 1) or \ + elif (isinstance(geo, MultiPolygon) and len(geo.geoms) == 1) or \ (isinstance(geo, list) and len(geo) == 1) and isinstance(geo[0], Polygon): env_obj = unary_union(geo) env_obj = env_obj.convex_hull diff --git a/appPlugins/ToolRulesCheck.py b/appPlugins/ToolRulesCheck.py index 7ea02991..74200339 100644 --- a/appPlugins/ToolRulesCheck.py +++ b/appPlugins/ToolRulesCheck.py @@ -5,8 +5,21 @@ # MIT Licence # # ########################################################## -from appTool import * -from appPool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCDoubleSpinner, OptionalInputSection +from appObjects import GerberObject + +import logging +from copy import deepcopy + +from shapely.geometry import Polygon, MultiPolygon +from shapely.ops import nearest_points + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -37,7 +50,7 @@ class RulesCheck(AppTool): # final name for the panel object self.outname = "" - # flag to signal the constrain was activated + # flag to signal that the constraint was activated self.constrain_flag = False # Multiprocessing Process Pool @@ -249,7 +262,7 @@ class RulesCheck(AppTool): return rule_title, violations @staticmethod - def check_gerber_clearance(gerber_list, size, rule): + def check_gerber_clearance(gerber_list: list[GerberObject], size, rule): # log.debug("RulesCheck.check_gerber_clearance()") rule_title = rule @@ -262,7 +275,7 @@ class RulesCheck(AppTool): if len(gerber_list) == 2: gerber_1 = gerber_list[0] - # added it so I won't have errors of using before declaring + # added it, so I won't have errors of using before declaring gerber_2 = {} gerber_3 = gerber_list[1] @@ -488,7 +501,7 @@ class RulesCheck(AppTool): 'points': list() }) - # added it so I won't have errors of using before declaring + # added it so, I won't have errors of using before declaring gerber_obj = {} gerber_extra_obj = {} exc_obj = {} @@ -1572,7 +1585,7 @@ class RulesUI: self.silk_grid = GLay(v_spacing=5, h_spacing=3) silk_frame.setLayout(self.silk_grid) - # Silkscreen2silkscreen clearance + # "Silkscreen2silkscreen" clearance self.clearance_silk2silk_cb = FCCheckBox('%s:' % _("Silk to Silk Clearance")) self.clearance_silk2silk_cb.setToolTip( _("This checks if the minimum clearance between silkscreen\n" @@ -1622,7 +1635,7 @@ class RulesUI: self.s2sm = OptionalInputSection( self.clearance_silk2sm_cb, [self.clearance_silk2sm_lbl, self.clearance_silk2sm_entry]) - # Silk2outline clearance + # "Silk2outline" clearance self.clearance_silk2ol_cb = FCCheckBox('%s:' % _("Silk to Outline Clearance")) self.clearance_silk2ol_cb.setToolTip( _("This checks if the minimum clearance between silk\n" diff --git a/appPlugins/ToolShell.py b/appPlugins/ToolShell.py index 2a9df2a8..710c3607 100644 --- a/appPlugins/ToolShell.py +++ b/appPlugins/ToolShell.py @@ -9,8 +9,10 @@ from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6.QtCore import QSettings from PyQt6.QtGui import QTextCursor, QPixmap -from PyQt6.QtWidgets import QVBoxLayout, QWidget, QHBoxLayout, QLabel +from PyQt6.QtWidgets import QVBoxLayout, QWidget, QHBoxLayout + from appGUI.GUIElements import _BrowserTextEdit, _ExpandableTextEdit, FCLabel + import html import sys import traceback @@ -73,7 +75,7 @@ class TermWidget(QWidget): hlay = QHBoxLayout() hlay.addWidget(self._delete_line) - hlay.addWidget(QLabel(" ")) + hlay.addWidget(FCLabel(" ")) hlay.addWidget(self._edit) layout.addLayout(hlay) diff --git a/appPlugins/ToolSolderPaste.py b/appPlugins/ToolSolderPaste.py index b827d5a0..cacbca3b 100644 --- a/appPlugins/ToolSolderPaste.py +++ b/appPlugins/ToolSolderPaste.py @@ -5,7 +5,24 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCFileSaveDialog, \ + FCComboBox2, FCEntry, FCDoubleSpinner, FCSpinner, FCInputSpinner, FCTable + +import traceback +from copy import deepcopy +import re + +from shapely.geometry import LineString, MultiLineString, Polygon, MultiPolygon, Point +from shapely.ops import unary_union + +from datetime import datetime as dt + +import gettext +import appTranslation as fcTranslate +import builtins + from appCommon.Common import LoudDict from camlib import distance @@ -155,7 +172,7 @@ class SolderPaste(AppTool): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns too, but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -326,6 +343,7 @@ class SolderPaste(AppTool): def update_ui(self, row=None): """ Will update the UI form with the data from obj.tools + :param row: the row (tool) from which to extract information's used to populate the form :return: """ @@ -380,7 +398,7 @@ class SolderPaste(AppTool): sel_model = self.ui.tools_table.selectionModel() sel_indexes = sel_model.selectedIndexes() - # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + # it will iterate over all indexes which means all items in all columns too, but I'm interested only on rows sel_rows = set() for idx in sel_indexes: sel_rows.add(idx.row()) @@ -451,7 +469,7 @@ class SolderPaste(AppTool): try: obj_name = obj.obj_options['name'] except AttributeError: - # this happen when the 'delete all' is emitted since in that case the obj is set to None and None has no + # this happens when the 'delete all' is emitted since in that case the obj is set to None and None has no # attribute named 'options' return @@ -480,6 +498,7 @@ class SolderPaste(AppTool): def form_to_storage(self, tooluid=None): """ Will read all the items in the UI form and set the self.tools data accordingly + :param tooluid: the uid of the tool to be updated in the obj.tools :return: """ @@ -505,6 +524,7 @@ class SolderPaste(AppTool): def set_form_from_defaults(self): """ Will read all the parameters of Solder Paste Tool from the app self.defaults and update the UI + :return: """ for key in self.form_fields: @@ -646,7 +666,7 @@ class SolderPaste(AppTool): """ Will delete tool(s) in the Tool Table - :param rows_to_delete: tell which row (tool) to delete + :param rows_to_delete: tell which row (tool) to be deleted :param all_tools: to delete all tools at once :return: """ @@ -784,7 +804,7 @@ class SolderPaste(AppTool): Results are placed in flat_geometry - :param geometry: Shapely type or list or list of list of such. + :param geometry: Shapely type, list or list of lists of such. :param reset: Clears the contents of self.flat_geometry. :param pathonly: Expands polygons into linear elements from the exterior attribute. """ @@ -1090,7 +1110,7 @@ class SolderPaste(AppTool): :return: """ - time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + time_str = "{:%A, %d %B %Y at %H:%M}".format(dt.now()) name = self.ui.cnc_obj_combo.currentText() obj = self.app.collection.get_by_name(name) @@ -1157,7 +1177,7 @@ class SolderPaste(AppTool): :return: """ - time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + time_str = "{:%A, %d %B %Y at %H:%M}".format(dt.now()) name = self.ui.cnc_obj_combo.currentText() obj = self.app.collection.get_by_name(name) diff --git a/appPlugins/ToolSub.py b/appPlugins/ToolSub.py index b71e795a..fdda6e53 100644 --- a/appPlugins/ToolSub.py +++ b/appPlugins/ToolSub.py @@ -5,7 +5,21 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox + +import logging +from copy import deepcopy +import time +import traceback + +from shapely.geometry import LineString, Polygon, MultiPolygon, MultiLineString +from shapely.ops import unary_union + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: @@ -545,7 +559,7 @@ class ToolSub(AppTool): self.sub_union = unary_union(self.sub_geo_obj.solid_geometry) - # start the QTimer to check for promises with 0.5 second period check + # start the QTimer to check for promises with 0.5 seconds period check self.periodic_check(500, reset=True) if self.target_geo_obj.multigeo: @@ -582,7 +596,7 @@ class ToolSub(AppTool): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiPolygon): - for poly in geo_elem: + for poly in geo_elem.geoms: for ring in self.poly2rings(poly): new_geo = ring.difference(self.sub_union) if new_geo and not new_geo.is_empty: @@ -593,7 +607,7 @@ class ToolSub(AppTool): if not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo_elem, MultiLineString): - for line_elem in geo_elem: + for line_elem in geo_elem.geoms: new_geo = line_elem.difference(self.sub_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -609,7 +623,7 @@ class ToolSub(AppTool): if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) elif isinstance(geo, MultiLineString): - for line_elem in geo: + for line_elem in geo.geoms: new_geo = line_elem.difference(self.sub_union) if new_geo and not new_geo.is_empty: new_geometry.append(new_geo) @@ -625,7 +639,7 @@ class ToolSub(AppTool): time.sleep(0.5) while True: - # removal from list is done in a multithreaded way therefore not always the removal can be done + # removal from list is done in a multithreaded way therefore not always the removal can be done, # so we keep trying until it's done if tool not in self.promises: break @@ -682,7 +696,7 @@ class ToolSub(AppTool): def periodic_check(self, check_period, reset=False): """ - This function starts an QTimer and it will periodically check if intersections are done + This function starts an QTimer, and it will periodically check if intersections are done :param check_period: time at which to check periodically :param reset: will reset the timer diff --git a/appPlugins/ToolTransform.py b/appPlugins/ToolTransform.py index e6bdbe9a..aa63eadc 100644 --- a/appPlugins/ToolTransform.py +++ b/appPlugins/ToolTransform.py @@ -5,12 +5,24 @@ # MIT Licence # # ########################################################## -from appTool import * +from PyQt6 import QtWidgets, QtCore, QtGui +from appTool import AppTool +from appGUI.GUIElements import VerticalScrollArea, FCLabel, FCButton, FCFrame, GLay, FCComboBox, FCCheckBox, \ + FCDoubleSpinner, NumericalEvalTupleEntry, OptionalInputSection + +import logging +import numpy as np + +import gettext +import appTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext +log = logging.getLogger('base') + class ToolTransform(AppTool): @@ -552,7 +564,7 @@ class ToolTransform(AppTool): maxy = max(maxy, maxy_) return minx, miny, maxx, maxy except TypeError: - # it's an object, return it's bounds + # it's an object, return its bounds return lst.bounds() return bounds_rec(obj_list) diff --git a/appPool.py b/appPool.py index 6333159c..2b6b8069 100644 --- a/appPool.py +++ b/appPool.py @@ -1,3 +1,4 @@ + from PyQt6 import QtCore from multiprocessing import Pool, cpu_count import dill diff --git a/appPreProcessor.py b/appPreProcessor.py index 955ee910..96ea1921 100644 --- a/appPreProcessor.py +++ b/appPreProcessor.py @@ -9,7 +9,6 @@ from importlib.machinery import SourceFileLoader import os from abc import ABCMeta, abstractmethod -import math # keep this. it is used in preprocessors # module-root dictionary of preprocessors diff --git a/appTool.py b/appTool.py index 290b8a7b..aadd8b59 100644 --- a/appTool.py +++ b/appTool.py @@ -6,34 +6,12 @@ # MIT Licence # # ########################################################## ## -from shapely.geometry import Polygon, LineString, box, MultiPolygon, MultiPoint, MultiLineString, LinearRing, Point, \ - shape, base -from shapely.strtree import STRtree -from shapely.ops import unary_union, nearest_points, linemerge, snap -from shapely.affinity import translate, scale, skew, rotate - -from appGUI.GUIElements import * - -from copy import copy, deepcopy -import math - -import numpy as np -from numpy import Inf - -import simplejson as json -import os -import sys -import re -import time -import platform -from collections.abc import Iterable -import traceback -from datetime import datetime +from PyQt6 import QtGui, QtWidgets, QtCore +from shapely.geometry import Polygon, LineString import gettext import appTranslation as fcTranslate import builtins -import logging fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: diff --git a/appWorkerStack.py b/appWorkerStack.py index 44fc2023..6641b05c 100644 --- a/appWorkerStack.py +++ b/appWorkerStack.py @@ -1,3 +1,4 @@ + from PyQt6 import QtCore from appWorker import Worker diff --git a/camlib.py b/camlib.py index e946a4c4..892b824d 100644 --- a/camlib.py +++ b/camlib.py @@ -6,27 +6,37 @@ # MIT Licence # # ########################################################## ## - from PyQt6 import QtWidgets -from io import StringIO -from numpy.linalg import solve, norm +from appCommon.Common import GracefulException as grace + +# from scipy.spatial import KDTree, Delaunay +# from scipy.spatial import Delaunay + +from appParsers.ParseSVG import svgparselength, svgparse_viewbox, getsvggeo, getsvgtext +from appParsers.ParseDXF import getdxfgeo + +from numpy.linalg import solve import platform -from copy import deepcopy - import traceback from decimal import Decimal +from copy import deepcopy +from collections.abc import Iterable +from copy import copy from rtree import index as rtindex from lxml import etree as ET +from io import StringIO +import ezdxf # See: http://toblerity.org/shapely/manual.html -from shapely.geometry import Polygon, Point, LinearRing, MultiPoint +from shapely.geometry import Polygon, Point, LinearRing, MultiPoint, MultiLineString, MultiPolygon, LineString from shapely.geometry import box as shply_box from shapely.ops import unary_union, substring, linemerge import shapely.affinity as affinity +from shapely.affinity import scale, translate from shapely.wkt import loads as sloads from shapely.wkt import dumps as sdumps from shapely.geometry.base import BaseGeometry @@ -37,26 +47,14 @@ from shapely.geometry.base import BaseGeometry from descartes.patch import PolygonPatch # --------------------------------------- -from collections.abc import Iterable - -import ezdxf - -from appCommon.Common import GracefulException as grace - -# from scipy.spatial import KDTree, Delaunay -# from scipy.spatial import Delaunay - -from appParsers.ParseSVG import * -from appParsers.ParseDXF import * - import logging +import re +import numpy as np import gettext import appTranslation as fcTranslate import builtins -import copy - HAS_ORTOOLS = True if platform.architecture()[0] == '64bit': @@ -2299,7 +2297,7 @@ class Geometry(object): # d = {} # for attr in self.ser_attrs: # d[attr] = getattr(self, attr) - return {attr: copy.copy(getattr(self, attr)) for attr in self.ser_attrs} + return {attr: copy(getattr(self, attr)) for attr in self.ser_attrs} def from_dict(self, d): """ diff --git a/preprocessors/Berta_CNC.py b/preprocessors/Berta_CNC.py index 11e02177..d18f65f2 100644 --- a/preprocessors/Berta_CNC.py +++ b/preprocessors/Berta_CNC.py @@ -10,7 +10,8 @@ # MIT Licence # ############################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Berta_CNC(PreProc): diff --git a/preprocessors/Check_points.py b/preprocessors/Check_points.py index ea5d9dec..041eb7ea 100644 --- a/preprocessors/Check_points.py +++ b/preprocessors/Check_points.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Check_points(PreProc): diff --git a/preprocessors/Default_no_M6.py b/preprocessors/Default_no_M6.py index 61b8c2d5..a7ebd039 100644 --- a/preprocessors/Default_no_M6.py +++ b/preprocessors/Default_no_M6.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Default_no_M6(PreProc): diff --git a/preprocessors/GRBL_11.py b/preprocessors/GRBL_11.py index d7e1f496..fe453c56 100644 --- a/preprocessors/GRBL_11.py +++ b/preprocessors/GRBL_11.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class GRBL_11(PreProc): diff --git a/preprocessors/GRBL_11_no_M6.py b/preprocessors/GRBL_11_no_M6.py index b474c746..9dc192cd 100644 --- a/preprocessors/GRBL_11_no_M6.py +++ b/preprocessors/GRBL_11_no_M6.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class GRBL_11_no_M6(PreProc): diff --git a/preprocessors/GRBL_laser.py b/preprocessors/GRBL_laser.py index b559f510..0b9801da 100644 --- a/preprocessors/GRBL_laser.py +++ b/preprocessors/GRBL_laser.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math # This post processor is configured to output code that # is compatible with almost any version of Grbl. diff --git a/preprocessors/GRBL_laser_z.py b/preprocessors/GRBL_laser_z.py index 608bf43b..adb1b046 100644 --- a/preprocessors/GRBL_laser_z.py +++ b/preprocessors/GRBL_laser_z.py @@ -8,7 +8,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc # This post processor is configured to output code that # is compatible with almost any version of Grbl. diff --git a/preprocessors/ISEL_CNC.py b/preprocessors/ISEL_CNC.py index 5668a222..f54fd6c2 100644 --- a/preprocessors/ISEL_CNC.py +++ b/preprocessors/ISEL_CNC.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class ISEL_CNC(PreProc): diff --git a/preprocessors/ISEL_ICP_CNC.py b/preprocessors/ISEL_ICP_CNC.py index 604b9690..42e2f34e 100644 --- a/preprocessors/ISEL_ICP_CNC.py +++ b/preprocessors/ISEL_ICP_CNC.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class ISEL_ICP_CNC(PreProc): diff --git a/preprocessors/Line_xyz.py b/preprocessors/Line_xyz.py index 28345d2f..1c7d3c5f 100644 --- a/preprocessors/Line_xyz.py +++ b/preprocessors/Line_xyz.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Line_xyz(PreProc): diff --git a/preprocessors/Marlin.py b/preprocessors/Marlin.py index 974aa296..427d9903 100644 --- a/preprocessors/Marlin.py +++ b/preprocessors/Marlin.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Marlin(PreProc): diff --git a/preprocessors/Marlin_laser_FAN_pin.py b/preprocessors/Marlin_laser_FAN_pin.py index 2eb23120..85929da6 100644 --- a/preprocessors/Marlin_laser_FAN_pin.py +++ b/preprocessors/Marlin_laser_FAN_pin.py @@ -6,7 +6,7 @@ # License: MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc class Marlin_laser_FAN_pin(PreProc): diff --git a/preprocessors/Marlin_laser_Spindle_pin.py b/preprocessors/Marlin_laser_Spindle_pin.py index c028266f..180e8200 100644 --- a/preprocessors/Marlin_laser_Spindle_pin.py +++ b/preprocessors/Marlin_laser_Spindle_pin.py @@ -6,7 +6,7 @@ # License: MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc class Marlin_laser_Spindle_pin(PreProc): diff --git a/preprocessors/Marlin_laser_z.py b/preprocessors/Marlin_laser_z.py index 121f6d5f..1a4e9cb3 100644 --- a/preprocessors/Marlin_laser_z.py +++ b/preprocessors/Marlin_laser_z.py @@ -6,7 +6,7 @@ # License: MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc class Marlin_laser_z(PreProc): diff --git a/preprocessors/NCCAD9.py b/preprocessors/NCCAD9.py index 6164cbb7..276e6195 100644 --- a/preprocessors/NCCAD9.py +++ b/preprocessors/NCCAD9.py @@ -10,7 +10,8 @@ # http://www.max-computer.de/x5e/adaption-of-post-processor.html # https://github.com/FreeCAD/FreeCAD/pull/2876/files -from appPreProcessor import * +from appPreProcessor import PreProc +import math class NCCAD9(PreProc): diff --git a/preprocessors/Paste_1.py b/preprocessors/Paste_1.py index c30698f0..47be9563 100644 --- a/preprocessors/Paste_1.py +++ b/preprocessors/Paste_1.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import AppPreProcTools class Paste_1(AppPreProcTools): @@ -133,7 +133,7 @@ class Paste_1(AppPreProcTools): ' F%s' % str(p['frz_dispense']) def down_z_stop_code(self, p): - return 'G01 Z' + self.coordinate_format % (p.coords_decimals, float(p['z_stop'])) + ' F%s' % str(p['frz']) + return 'G01 Z' + self.coordinate_format % (p.coords_decimals, float(p['z_stop'])) + ' F%s' % str(p['frz']) def toolchange_code(self, p): fr_rapids = float(p['fr_rapids']) diff --git a/preprocessors/Paste_GRBL.py b/preprocessors/Paste_GRBL.py index 38e0b8a3..0396df70 100644 --- a/preprocessors/Paste_GRBL.py +++ b/preprocessors/Paste_GRBL.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import AppPreProcTools class Paste_GRBL(AppPreProcTools): @@ -134,7 +134,7 @@ class Paste_GRBL(AppPreProcTools): ' F%s' % str(p['frz_dispense']) def down_z_stop_code(self, p): - return 'G01 Z' + self.coordinate_format % (p.coords_decimals, float(p['z_stop'])) + ' F%s' % str(p['frz']) + return 'G01 Z' + self.coordinate_format % (p.coords_decimals, float(p['z_stop'])) + ' F%s' % str(p['frz']) def toolchange_code(self, p): fr_rapids = float(p['fr_rapids']) @@ -250,4 +250,4 @@ G01 Z{z_toolchange} F{fr_rapids} def dwell_rev_code(self, p): if p.dwelltime: - return 'G4 P' + str(float(p['dwellrev'])) \ No newline at end of file + return 'G4 P' + str(float(p['dwellrev'])) diff --git a/preprocessors/Paste_Marlin.py b/preprocessors/Paste_Marlin.py index ebc56def..3b9464e5 100644 --- a/preprocessors/Paste_Marlin.py +++ b/preprocessors/Paste_Marlin.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import AppPreProcTools class Paste_Marlin(AppPreProcTools): diff --git a/preprocessors/Repetier.py b/preprocessors/Repetier.py index 48fef768..bc7e55bc 100644 --- a/preprocessors/Repetier.py +++ b/preprocessors/Repetier.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Repetier(PreProc): diff --git a/preprocessors/Roland_MDX_20.py b/preprocessors/Roland_MDX_20.py index fbdec386..cc00f025 100644 --- a/preprocessors/Roland_MDX_20.py +++ b/preprocessors/Roland_MDX_20.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc # for Roland Preprocessors it is mandatory for the preprocessor name (python file and class name, both of them must be diff --git a/preprocessors/Roland_MDX_540.py b/preprocessors/Roland_MDX_540.py index beafa6fb..0652fabb 100644 --- a/preprocessors/Roland_MDX_540.py +++ b/preprocessors/Roland_MDX_540.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc # for Roland Preprocessors it is mandatory for the preprocessor name (python file and class name, both of them must be diff --git a/preprocessors/Toolchange_Manual.py b/preprocessors/Toolchange_Manual.py index 936e0b07..23962d3d 100644 --- a/preprocessors/Toolchange_Manual.py +++ b/preprocessors/Toolchange_Manual.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Toolchange_Manual(PreProc): diff --git a/preprocessors/Toolchange_Probe_MACH3.py b/preprocessors/Toolchange_Probe_MACH3.py index 039a2085..92184db9 100644 --- a/preprocessors/Toolchange_Probe_MACH3.py +++ b/preprocessors/Toolchange_Probe_MACH3.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class Toolchange_Probe_MACH3(PreProc): diff --git a/preprocessors/default.py b/preprocessors/default.py index 0c4e7f42..416d3703 100644 --- a/preprocessors/default.py +++ b/preprocessors/default.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class default(PreProc): diff --git a/preprocessors/default_laser.py b/preprocessors/default_laser.py index d0f48104..a89676e7 100644 --- a/preprocessors/default_laser.py +++ b/preprocessors/default_laser.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc +import math class default_laser(PreProc): diff --git a/preprocessors/grbl_laser_eleks_drd.py b/preprocessors/grbl_laser_eleks_drd.py index f065fccc..6e355571 100644 --- a/preprocessors/grbl_laser_eleks_drd.py +++ b/preprocessors/grbl_laser_eleks_drd.py @@ -6,7 +6,8 @@ # MIT Licence # # ########################################################## ## -from appPreProcessor import * +from appPreProcessor import PreProc +import math # This post processor is configured to output code for # lasers without Z Axis # and to convert excellon drillcodes into arcs diff --git a/preprocessors/hpgl.py b/preprocessors/hpgl.py index ad812f00..82d6781c 100644 --- a/preprocessors/hpgl.py +++ b/preprocessors/hpgl.py @@ -6,7 +6,7 @@ # MIT Licence # # ########################################################## -from appPreProcessor import * +from appPreProcessor import PreProc # for Roland Preprocessors it is mandatory for the preprocessor name (python file and class name, both of them must be diff --git a/requirements.txt b/requirements.txt index 4277ddd4..a27d4040 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,6 +34,7 @@ ezdxf reportlab>=3.5 pyserial>=3.4 pikepdf>=2.0 +pyppeteer matplotlib>=3.5.0 pyopengl diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/canvas/performance.py b/tests/canvas/performance.py deleted file mode 100644 index 40047291..00000000 --- a/tests/canvas/performance.py +++ /dev/null @@ -1,95 +0,0 @@ - -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -import numpy as np -import io -from matplotlib.backends.backend_agg import FigureCanvasAgg -from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg -from matplotlib.figure import Figure -import cProfile -import sys - - -def gen_data(): - N = 100000 - x = np.random.rand(N) * 10 - y = np.random.rand(N) * 10 - colors = np.random.rand(N) - area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses - data = x, y, area, colors - return data - - -# @profile -def large_plot(data): - x, y, area, colors = data - - fig = Figure(figsize=(10, 10), dpi=80) - axes = fig.add_axes([0.0, 0.0, 1.0, 1.0], alpha=1.0) - axes.set_frame_on(False) - axes.set_xticks([]) - axes.set_yticks([]) - # axes.set_xlim(0, 10) - # axes.set_ylim(0, 10) - - axes.scatter(x, y, s=area, c=colors, alpha=0.5) - - axes.set_xlim(0, 10) - axes.set_ylim(0, 10) - - canvas = FigureCanvasAgg(fig) - canvas.draw() - # canvas = FigureCanvasQTAgg(fig) - # buf = canvas.tostring_rgb() - buf = fig.canvas.tostring_rgb() - - ncols, nrows = fig.canvas.get_width_height() - img = np.fromstring(buf, dtype=np.uint8).reshape(nrows, ncols, 3) - - return img - - -def small_plot(data): - x, y, area, colors = data - - fig = Figure(figsize=(3, 3), dpi=80) - axes = fig.add_axes([0.0, 0.0, 1.0, 1.0], alpha=1.0) - axes.set_frame_on(False) - axes.set_xticks([]) - axes.set_yticks([]) - # axes.set_xlim(5, 6) - # axes.set_ylim(5, 6) - - axes.scatter(x, y, s=area, c=colors, alpha=0.5) - - axes.set_xlim(4, 7) - axes.set_ylim(4, 7) - - canvas = FigureCanvasAgg(fig) - canvas.draw() - # canvas = FigureCanvasQTAgg(fig) - # buf = canvas.tostring_rgb() - buf = fig.canvas.tostring_rgb() - - ncols, nrows = fig.canvas.get_width_height() - img = np.fromstring(buf, dtype=np.uint8).reshape(nrows, ncols, 3) - - return img - -def doit(): - d = gen_data() - img = large_plot(d) - return img - - -if __name__ == "__main__": - - d = gen_data() - - if sys.argv[1] == 'large': - cProfile.runctx('large_plot(d)', None, locals()) - else: - cProfile.runctx('small_plot(d)', None, locals()) - - diff --git a/tests/canvas/prof.sh b/tests/canvas/prof.sh deleted file mode 100755 index b9075848..00000000 --- a/tests/canvas/prof.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -echo "*** LARGE ***" -python performance.py large | egrep "(\(scatter\))|(\(draw\))|(tostring_rgb)|(fromstring)" -echo "*** SMALL ***" -python performance.py small | egrep "(\(scatter\))|(\(draw\))|(tostring_rgb)|(fromstring)" \ No newline at end of file diff --git a/tests/excellon_files/case1.drl b/tests/excellon_files/case1.drl deleted file mode 100644 index 95b89ca3..00000000 --- a/tests/excellon_files/case1.drl +++ /dev/null @@ -1,125 +0,0 @@ -M48 -INCH -T01C0.0200 -T02C0.0800 -T03C0.0600 -T04C0.0300 -T05C0.0650 -T06C0.0450 -T07C0.0400 -T08C0.1181 -T09C0.0500 -% -T01 -X-018204Y+015551 -X-025842Y+015551 -T02 -X-000118Y+020629 -X-000118Y+016889 -X+012401Y+020629 -X+012401Y+016889 -X-010170Y+002440 -X-010110Y+011470 -X+018503Y+026574 -T03 -X+013060Y+010438 -X+013110Y+000000 -X-049015Y+002165 -X+018378Y+010433 -X+018317Y+000000 -X-049015Y+010039 -X-041141Y-000629 -X-041181Y+012992 -X-056496Y+012992 -X-056496Y-000590 -T04 -X-037560Y+030490 -X-036560Y+030490 -X-035560Y+030490 -X-034560Y+030490 -X-033560Y+030490 -X-032560Y+030490 -X-031560Y+030490 -X-030560Y+030490 -X-029560Y+030490 -X-028560Y+030490 -X-027560Y+030490 -X-026560Y+030490 -X-025560Y+030490 -X-024560Y+030490 -X-024560Y+036490 -X-025560Y+036490 -X-026560Y+036490 -X-027560Y+036490 -X-028560Y+036490 -X-029560Y+036490 -X-030560Y+036490 -X-031560Y+036490 -X-032560Y+036490 -X-033560Y+036490 -X-034560Y+036490 -X-035560Y+036490 -X-036560Y+036490 -X-037560Y+036490 -X-014590Y+030810 -X-013590Y+030810 -X-012590Y+030810 -X-011590Y+030810 -X-011590Y+033810 -X-012590Y+033810 -X-013590Y+033810 -X-014590Y+033810 -X-021260Y+034680 -X-020010Y+034680 -X-008390Y+035840 -X-008390Y+034590 -X-008440Y+031870 -X-008440Y+030620 -T05 -X-022504Y+019291 -X-020354Y+019291 -X-018204Y+019291 -X-030142Y+019291 -X-027992Y+019291 -X-025842Y+019291 -X-012779Y+019291 -X-010629Y+019291 -X-008479Y+019291 -T06 -X-028080Y+028230 -X-030080Y+028230 -X-034616Y+024409 -X-039616Y+024409 -X-045364Y+023346 -X-045364Y+018346 -X-045364Y+030157 -X-045364Y+025157 -X-008604Y+026983 -X-013604Y+026983 -X-016844Y+034107 -X-016844Y+029107 -T07 -X-041655Y+026456 -X-040655Y+026456 -X-039655Y+026456 -X-041640Y+022047 -X-040640Y+022047 -X-039640Y+022047 -X-049760Y+029430 -X-048760Y+029430 -X-047760Y+029430 -X-019220Y+037380 -X-020220Y+037380 -X-021220Y+037380 -T08 -X-024212Y+007751 -X-024212Y+004011 -X-035629Y+007874 -X-035629Y+004133 -T09 -X+007086Y+030708 -X+007086Y+032874 -X-000787Y+031889 -X-000787Y+035826 -X-000787Y+027952 -M30 diff --git a/tests/frameless_window.py b/tests/frameless_window.py deleted file mode 100644 index 47e28b31..00000000 --- a/tests/frameless_window.py +++ /dev/null @@ -1,148 +0,0 @@ -import sys -from PyQt5 import QtGui, QtWidgets -from PyQt5 import QtCore -from PyQt5.QtCore import Qt - - -class TitleBar(QtWidgets.QDialog): - def __init__(self, parent=None): - QtWidgets.QWidget.__init__(self, parent) - self.setWindowFlags(Qt.FramelessWindowHint) - css = """ - QWidget{ - Background: #AA00AA; - color:white; - font:12px bold; - font-weight:bold; - border-radius: 1px; - height: 11px; - } - QDialog{ - Background-image:url('img/titlebar bg.png'); - font-size:12px; - color: black; - - } - QToolButton{ - Background:#AA00AA; - font-size:11px; - } - QToolButton:hover{ - Background: #FF00FF; - font-size:11px; - } - """ - self.setAutoFillBackground(True) - self.setBackgroundRole(QtGui.QPalette.Highlight) - self.setStyleSheet(css) - self.minimize=QtWidgets.QToolButton(self) - self.minimize.setIcon(QtGui.QIcon('img/min.png')) - self.maximize=QtWidgets.QToolButton(self); - self.maximize.setIcon(QtGui.QIcon('img/max.png')) - close=QtWidgets.QToolButton(self) - close.setIcon(QtGui.QIcon('img/close.png')) - self.minimize.setMinimumHeight(10) - close.setMinimumHeight(10) - self.maximize.setMinimumHeight(10) - label=QtWidgets.QLabel(self) - label.setText("Abracadabra") - self.setWindowTitle("Alhambra") - hbox=QtWidgets.QHBoxLayout(self) - hbox.addWidget(label) - hbox.addWidget(self.minimize) - hbox.addWidget(self.maximize) - hbox.addWidget(close) - hbox.insertStretch(1,500) - hbox.setSpacing(0) - self.setSizePolicy(QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Fixed) - self.maxNormal=False - close.clicked.connect(self.close) - self.minimize.clicked.connect(self.showSmall) - self.maximize.clicked.connect(self.showMaxRestore) - - def showSmall(self): - box.showMinimized() - - def showMaxRestore(self): - if(self.maxNormal): - box.showNormal() - self.maxNormal= False - self.maximize.setIcon(QtGui.QIcon('img/max.png')) - print(1) - else: - box.showMaximized() - self.maxNormal= True - print(2) - self.maximize.setIcon(QtGui.QIcon('img/max2.png')) - - def close(self): - box.close() - - def mousePressEvent(self,event): - if event.button() == Qt.LeftButton: - box.moving = True; box.offset = event.pos() - - def mouseMoveEvent(self,event): - if box.moving: box.move(event.globalPos()-box.offset) - - -class Frame(QtWidgets.QFrame): - def __init__(self, parent=None): - QtWidgets.QFrame.__init__(self, parent) - self.m_mouse_down= False - self.setFrameShape(QtWidgets.QFrame.StyledPanel) - css = """ - QFrame{ - Background: #D700D7; - color:white; - font:13px ; - font-weight:bold; - } - """ - self.setStyleSheet(css) - self.setWindowFlags(Qt.FramelessWindowHint) - self.setMouseTracking(True) - self.m_titleBar= TitleBar(self) - self.m_content= QtWidgets.QWidget(self) - vbox=QtWidgets.QVBoxLayout(self) - vbox.addWidget(self.m_titleBar) - vbox.setContentsMargins(0, 0, 0, 0) - vbox.setSpacing(0) - layout=QtWidgets.QVBoxLayout(self) - layout.addWidget(self.m_content) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(0) - vbox.addLayout(layout) - # Allows you to access the content area of the frame - # where widgets and layouts can be added - - def contentWidget(self): - return self.m_content - - def titleBar(self): - return self.m_titleBar - - def mousePressEvent(self,event): - self.m_old_pos = event.pos() - self.m_mouse_down = event.button()== Qt.LeftButton - - def mouseMoveEvent(self,event): - x=event.x() - y=event.y() - - def mouseReleaseEvent(self,event): - m_mouse_down=False - - -if __name__ == '__main__': - app = QtWidgets.QApplication(sys.argv) - box = Frame() - box.move(60,60) - l = QtWidgets.QVBoxLayout(box.contentWidget()) - l.setContentsMargins(0, 0,0 ,0) - edit = QtWidgets.QLabel("""I would've did anything for you to show you how much I adored you -But it's over now, it's too late to save our loveJust promise me you'll think of me -Every time you look up in the sky and see a star 'cuz I'm your star.""") - l.addWidget(edit) - box.show() - app.exec_() \ No newline at end of file diff --git a/tests/gerber_files/STM32F4-spindle.cmp b/tests/gerber_files/STM32F4-spindle.cmp deleted file mode 100644 index bca2de6e..00000000 --- a/tests/gerber_files/STM32F4-spindle.cmp +++ /dev/null @@ -1,6358 +0,0 @@ -G75* -%MOIN*% -%OFA0B0*% -%FSLAX25Y25*% -%IPPOS*% -%LPD*% -%AMOC8* -5,1,8,0,0,1.08239X$1,22.5* -% -%ADD10R,0.30000X0.30000*% -%ADD11R,0.44685X0.17500*% -%ADD12R,0.04724X0.01181*% -%ADD13R,0.01181X0.04724*% -%ADD14R,0.05512X0.04724*% -%ADD15R,0.05118X0.06299*% -%ADD16R,0.06299X0.05118*% -%ADD17R,0.09843X0.01969*% -%ADD18R,0.09843X0.07874*% -%ADD19R,0.05118X0.05906*% -%ADD20R,0.03150X0.05512*% -%ADD21R,0.03150X0.07480*% -%ADD22C,0.06000*% -%ADD23R,0.05906X0.07874*% -%ADD24OC8,0.06400*% -%ADD25R,0.05512X0.05512*% -%ADD26R,0.12598X0.04331*% -%ADD27C,0.07400*% -%ADD28R,0.06299X0.07098*% -%ADD29R,0.03937X0.04331*% -%ADD30R,0.05906X0.05118*% -%ADD31C,0.01200*% -%ADD32C,0.02400*% -%ADD33C,0.01600*% -%ADD34C,0.03181*% -%ADD35C,0.04000*% -D10* -X0102500Y0095000D03* -D11* -X0212657Y0076250D03* -D12* -X0124941Y0080236D03* -X0124941Y0082205D03* -X0124941Y0084173D03* -X0124941Y0086142D03* -X0124941Y0088110D03* -X0124941Y0090079D03* -X0124941Y0092047D03* -X0124941Y0094016D03* -X0124941Y0095984D03* -X0124941Y0097953D03* -X0124941Y0099921D03* -X0124941Y0101890D03* -X0124941Y0103858D03* -X0124941Y0105827D03* -X0124941Y0107795D03* -X0124941Y0109764D03* -X0080059Y0109764D03* -X0080059Y0107795D03* -X0080059Y0105827D03* -X0080059Y0103858D03* -X0080059Y0101890D03* -X0080059Y0099921D03* -X0080059Y0097953D03* -X0080059Y0095984D03* -X0080059Y0094016D03* -X0080059Y0092047D03* -X0080059Y0090079D03* -X0080059Y0088110D03* -X0080059Y0086142D03* -X0080059Y0084173D03* -X0080059Y0082205D03* -X0080059Y0080236D03* -D13* -X0087736Y0072559D03* -X0089705Y0072559D03* -X0091673Y0072559D03* -X0093642Y0072559D03* -X0095610Y0072559D03* -X0097579Y0072559D03* -X0099547Y0072559D03* -X0101516Y0072559D03* -X0103484Y0072559D03* -X0105453Y0072559D03* -X0107421Y0072559D03* -X0109390Y0072559D03* -X0111358Y0072559D03* -X0113327Y0072559D03* -X0115295Y0072559D03* -X0117264Y0072559D03* -X0117264Y0117441D03* -X0115295Y0117441D03* -X0113327Y0117441D03* -X0111358Y0117441D03* -X0109390Y0117441D03* -X0107421Y0117441D03* -X0105453Y0117441D03* -X0103484Y0117441D03* -X0101516Y0117441D03* -X0099547Y0117441D03* -X0097579Y0117441D03* -X0095610Y0117441D03* -X0093642Y0117441D03* -X0091673Y0117441D03* -X0089705Y0117441D03* -X0087736Y0117441D03* -D14* -X0059331Y0113346D03* -X0059331Y0106654D03* -X0050669Y0106654D03* -X0050669Y0113346D03* -D15* -X0051063Y0125000D03* -X0058937Y0125000D03* -X0056063Y0072500D03* -X0063937Y0072500D03* -X0078563Y0060000D03* -X0086437Y0060000D03* -X0121063Y0060000D03* -X0128937Y0060000D03* -X0136063Y0067500D03* -X0143937Y0067500D03* -X0141437Y0115000D03* -X0133563Y0115000D03* -X0133563Y0130000D03* -X0141437Y0130000D03* -D16* -X0082500Y0136063D03* -X0082500Y0143937D03* -X0072500Y0123937D03* -X0072500Y0116063D03* -X0040000Y0113937D03* -X0040000Y0106063D03* -X0027500Y0141063D03* -X0027500Y0148937D03* -X0275000Y0208563D03* -X0275000Y0216437D03* -D17* -X0255157Y0111299D03* -X0255157Y0108150D03* -X0255157Y0105000D03* -X0255157Y0101850D03* -X0255157Y0098701D03* -D18* -X0255157Y0087283D03* -X0276811Y0087283D03* -X0276811Y0122717D03* -X0255157Y0122717D03* -D19* -X0223740Y0107500D03* -X0216260Y0107500D03* -X0216260Y0097500D03* -X0223740Y0097500D03* -X0267510Y0072500D03* -X0274990Y0072500D03* -X0161240Y0122500D03* -X0153760Y0122500D03* -X0082490Y0176250D03* -X0075010Y0176250D03* -X0103760Y0217500D03* -X0111240Y0217500D03* -X0128760Y0217500D03* -X0136240Y0217500D03* -X0153760Y0217500D03* -X0161240Y0217500D03* -X0126240Y0047500D03* -X0118760Y0047500D03* -D20* -X0216598Y0062201D03* -X0228402Y0062201D03* -D21* -X0222500Y0063201D03* -D22* -X0223500Y0069516D02* -X0221500Y0069516D01* -X0221500Y0077886D01* -X0223500Y0077886D01* -X0223500Y0069516D01* -X0223500Y0075515D02* -X0221500Y0075515D01* -D23* -X0244094Y0072500D03* -X0255906Y0072500D03* -X0255906Y0060000D03* -X0244094Y0060000D03* -D24* -X0225000Y0147500D03* -X0215000Y0147500D03* -X0215000Y0157500D03* -X0225000Y0157500D03* -X0225000Y0167500D03* -X0215000Y0167500D03* -X0215000Y0177500D03* -X0225000Y0177500D03* -X0195000Y0207500D03* -X0185000Y0207500D03* -X0185000Y0217500D03* -X0195000Y0217500D03* -X0062500Y0217500D03* -X0052500Y0217500D03* -X0052500Y0207500D03* -X0062500Y0207500D03* -X0042500Y0207500D03* -X0032500Y0207500D03* -X0022500Y0207500D03* -X0022500Y0217500D03* -X0032500Y0217500D03* -X0042500Y0217500D03* -X0082500Y0025000D03* -X0092500Y0025000D03* -X0092500Y0015000D03* -X0082500Y0015000D03* -X0102500Y0015000D03* -X0112500Y0015000D03* -X0112500Y0025000D03* -X0102500Y0025000D03* -X0122500Y0025000D03* -X0122500Y0015000D03* -D25* -X0240000Y0081270D03* -X0240000Y0096230D03* -X0246250Y0140020D03* -X0257500Y0140020D03* -X0257500Y0154980D03* -X0246250Y0154980D03* -D26* -X0234114Y0202126D03* -X0234114Y0217874D03* -X0260886Y0217874D03* -X0260886Y0202126D03* -D27* -X0273800Y0162500D02* -X0281200Y0162500D01* -X0281200Y0152500D02* -X0273800Y0152500D01* -X0273800Y0047500D02* -X0281200Y0047500D01* -X0271200Y0047500D02* -X0263800Y0047500D01* -X0263800Y0037500D02* -X0271200Y0037500D01* -X0273800Y0037500D02* -X0281200Y0037500D01* -X0281200Y0027500D02* -X0273800Y0027500D01* -X0271200Y0027500D02* -X0263800Y0027500D01* -X0263800Y0017500D02* -X0271200Y0017500D01* -X0273800Y0017500D02* -X0281200Y0017500D01* -X0096250Y0177550D02* -X0096250Y0184950D01* -D28* -X0101902Y0205000D03* -X0113098Y0205000D03* -X0126902Y0205000D03* -X0138098Y0205000D03* -X0151902Y0205000D03* -X0163098Y0205000D03* -X0265652Y0060000D03* -X0276848Y0060000D03* -D29* -X0063750Y0058346D03* -X0063750Y0051654D03* -D30* -X0027500Y0071260D03* -X0027500Y0078740D03* -D31* -X0002568Y0002568D02* -X0002568Y0227392D01* -X0014348Y0227392D01* -X0010705Y0223749D01* -X0009814Y0222858D01* -X0009331Y0221693D01* -X0009331Y0091870D01* -X0009814Y0090705D01* -X0014814Y0085705D01* -X0015705Y0084814D01* -X0016870Y0084331D01* -X0024331Y0084331D01* -X0024331Y0083868D01* -X0024036Y0083868D01* -X0023092Y0083477D01* -X0022370Y0082754D01* -X0021979Y0081810D01* -X0021979Y0075670D01* -X0022256Y0075000D01* -X0021979Y0074330D01* -X0021979Y0068190D01* -X0022370Y0067246D01* -X0023092Y0066523D01* -X0024036Y0066132D01* -X0024331Y0066132D01* -X0024331Y0061653D01* -X0024814Y0060489D01* -X0028751Y0056552D01* -X0029642Y0055660D01* -X0030807Y0055178D01* -X0059417Y0055178D01* -X0059491Y0055000D01* -X0059213Y0054330D01* -X0059213Y0048977D01* -X0059604Y0048033D01* -X0060327Y0047311D01* -X0061271Y0046920D01* -X0066229Y0046920D01* -X0067173Y0047311D01* -X0067896Y0048033D01* -X0068083Y0048485D01* -X0083130Y0048485D01* -X0084295Y0048967D01* -X0088232Y0052904D01* -X0089123Y0053796D01* -X0089324Y0054282D01* -X0089507Y0054282D01* -X0090451Y0054673D01* -X0091174Y0055395D01* -X0091565Y0056339D01* -X0091565Y0059347D01* -X0092442Y0060225D01* -X0092442Y0052749D01* -X0090045Y0050353D01* -X0089642Y0050186D01* -X0088751Y0049295D01* -X0084814Y0045358D01* -X0084331Y0044193D01* -X0084331Y0030100D01* -X0082900Y0030100D01* -X0082900Y0025400D01* -X0082100Y0025400D01* -X0082100Y0030100D01* -X0080388Y0030100D01* -X0077400Y0027112D01* -X0077400Y0025400D01* -X0082100Y0025400D01* -X0082100Y0024600D01* -X0077400Y0024600D01* -X0077400Y0022888D01* -X0079815Y0020473D01* -X0076731Y0017389D01* -X0076731Y0012611D01* -X0080111Y0009231D01* -X0084889Y0009231D01* -X0087500Y0011842D01* -X0090111Y0009231D01* -X0094889Y0009231D01* -X0097500Y0011842D01* -X0100111Y0009231D01* -X0104889Y0009231D01* -X0107500Y0011842D01* -X0110111Y0009231D01* -X0114889Y0009231D01* -X0117500Y0011842D01* -X0120111Y0009231D01* -X0124889Y0009231D01* -X0128268Y0012611D01* -X0128268Y0016288D01* -X0131795Y0019814D01* -X0132686Y0020705D01* -X0133168Y0021870D01* -X0133168Y0034193D01* -X0132686Y0035358D01* -X0128749Y0039295D01* -X0127858Y0040186D01* -X0126693Y0040668D01* -X0112671Y0040668D01* -X0110590Y0042749D01* -X0110590Y0045756D01* -X0111532Y0044814D01* -X0112697Y0044331D01* -X0113632Y0044331D01* -X0113632Y0044036D01* -X0114023Y0043092D01* -X0114746Y0042370D01* -X0115690Y0041979D01* -X0121830Y0041979D01* -X0122774Y0042370D01* -X0123132Y0042727D01* -X0123431Y0042647D01* -X0125640Y0042647D01* -X0125640Y0046900D01* -X0126840Y0046900D01* -X0126840Y0042647D01* -X0129049Y0042647D01* -X0129533Y0042777D01* -X0129966Y0043027D01* -X0130320Y0043381D01* -X0130570Y0043814D01* -X0130699Y0044297D01* -X0130699Y0046900D01* -X0126840Y0046900D01* -X0126840Y0048100D01* -X0125640Y0048100D01* -X0125640Y0052353D01* -X0123431Y0052353D01* -X0123132Y0052273D01* -X0122774Y0052630D01* -X0121830Y0053021D01* -X0115690Y0053021D01* -X0114746Y0052630D01* -X0114023Y0051908D01* -X0113841Y0051467D01* -X0112558Y0052749D01* -X0112558Y0058328D01* -X0112609Y0058205D01* -X0113500Y0057314D01* -X0114665Y0056831D01* -X0115935Y0056831D01* -X0115935Y0056339D01* -X0116326Y0055395D01* -X0117049Y0054673D01* -X0117993Y0054282D01* -X0124133Y0054282D01* -X0125077Y0054673D01* -X0125543Y0055139D01* -X0125645Y0055080D01* -X0126128Y0054950D01* -X0128337Y0054950D01* -X0128337Y0059400D01* -X0129537Y0059400D01* -X0129537Y0060600D01* -X0133396Y0060600D01* -X0133396Y0061782D01* -X0139133Y0061782D01* -X0140077Y0062173D01* -X0140543Y0062639D01* -X0140645Y0062580D01* -X0141128Y0062450D01* -X0143337Y0062450D01* -X0143337Y0066900D01* -X0144537Y0066900D01* -X0144537Y0068100D01* -X0148396Y0068100D01* -X0148396Y0070900D01* -X0148307Y0071231D01* -X0163731Y0071231D01* -X0163731Y0049250D01* -X0164305Y0047865D01* -X0165365Y0046805D01* -X0166750Y0046231D01* -X0257540Y0046231D01* -X0258486Y0043949D01* -X0259935Y0042500D01* -X0258486Y0041051D01* -X0257531Y0038747D01* -X0257531Y0036253D01* -X0258486Y0033949D01* -X0260249Y0032186D01* -X0260550Y0032061D01* -X0260152Y0031771D01* -X0259529Y0031148D01* -X0259010Y0030435D01* -X0258610Y0029650D01* -X0258338Y0028811D01* -X0258209Y0028000D01* -X0267000Y0028000D01* -X0267000Y0027000D01* -X0268000Y0027000D01* -X0268000Y0028000D01* -X0277000Y0028000D01* -X0277000Y0027000D01* -X0276791Y0027000D01* -X0268000Y0027000D01* -X0268000Y0021900D01* -X0268000Y0018000D01* -X0277000Y0018000D01* -X0277000Y0027000D01* -X0278000Y0027000D01* -X0278000Y0021900D01* -X0278000Y0018000D01* -X0277000Y0018000D01* -X0277000Y0017000D01* -X0276791Y0017000D01* -X0268000Y0017000D01* -X0268000Y0018000D01* -X0267000Y0018000D01* -X0267000Y0027000D01* -X0258209Y0027000D01* -X0258338Y0026189D01* -X0258610Y0025350D01* -X0259010Y0024565D01* -X0259529Y0023852D01* -X0260152Y0023229D01* -X0260865Y0022710D01* -X0261278Y0022500D01* -X0260865Y0022290D01* -X0260152Y0021771D01* -X0259529Y0021148D01* -X0259010Y0020435D01* -X0258610Y0019650D01* -X0258338Y0018811D01* -X0258209Y0018000D01* -X0267000Y0018000D01* -X0267000Y0017000D01* -X0268000Y0017000D01* -X0268000Y0011900D01* -X0271641Y0011900D01* -X0272500Y0012036D01* -X0273359Y0011900D01* -X0277000Y0011900D01* -X0277000Y0017000D01* -X0278000Y0017000D01* -X0278000Y0011900D01* -X0281641Y0011900D01* -X0282511Y0012038D01* -X0283350Y0012310D01* -X0284135Y0012710D01* -X0284848Y0013229D01* -X0285471Y0013852D01* -X0285990Y0014565D01* -X0286132Y0014845D01* -X0286132Y0002568D01* -X0002568Y0002568D01* -X0002568Y0003596D02* -X0286132Y0003596D01* -X0286132Y0004794D02* -X0002568Y0004794D01* -X0002568Y0005993D02* -X0286132Y0005993D01* -X0286132Y0007191D02* -X0002568Y0007191D01* -X0002568Y0008390D02* -X0286132Y0008390D01* -X0286132Y0009588D02* -X0125246Y0009588D01* -X0126444Y0010787D02* -X0286132Y0010787D01* -X0286132Y0011985D02* -X0282178Y0011985D01* -X0284786Y0013184D02* -X0286132Y0013184D01* -X0286132Y0014382D02* -X0285857Y0014382D01* -X0278000Y0014382D02* -X0277000Y0014382D01* -X0277000Y0013184D02* -X0278000Y0013184D01* -X0278000Y0011985D02* -X0277000Y0011985D01* -X0272822Y0011985D02* -X0272178Y0011985D01* -X0268000Y0011985D02* -X0267000Y0011985D01* -X0267000Y0011900D02* -X0267000Y0017000D01* -X0258209Y0017000D01* -X0258338Y0016189D01* -X0258610Y0015350D01* -X0259010Y0014565D01* -X0259529Y0013852D01* -X0260152Y0013229D01* -X0260865Y0012710D01* -X0261650Y0012310D01* -X0262489Y0012038D01* -X0263359Y0011900D01* -X0267000Y0011900D01* -X0267000Y0013184D02* -X0268000Y0013184D01* -X0268000Y0014382D02* -X0267000Y0014382D01* -X0267000Y0015581D02* -X0268000Y0015581D01* -X0268000Y0016779D02* -X0267000Y0016779D01* -X0267000Y0017978D02* -X0129959Y0017978D01* -X0131157Y0019176D02* -X0258456Y0019176D01* -X0258980Y0020375D02* -X0132356Y0020375D01* -X0133046Y0021573D02* -X0259954Y0021573D01* -X0260781Y0022772D02* -X0133168Y0022772D01* -X0133168Y0023970D02* -X0259443Y0023970D01* -X0258703Y0025169D02* -X0133168Y0025169D01* -X0133168Y0026367D02* -X0258310Y0026367D01* -X0258330Y0028764D02* -X0133168Y0028764D01* -X0133168Y0027566D02* -X0267000Y0027566D01* -X0268000Y0027566D02* -X0277000Y0027566D01* -X0277000Y0026367D02* -X0278000Y0026367D01* -X0278000Y0025169D02* -X0277000Y0025169D01* -X0277000Y0023970D02* -X0278000Y0023970D01* -X0278000Y0022772D02* -X0277000Y0022772D01* -X0277000Y0021573D02* -X0278000Y0021573D01* -X0278000Y0020375D02* -X0277000Y0020375D01* -X0277000Y0019176D02* -X0278000Y0019176D01* -X0277000Y0017978D02* -X0268000Y0017978D01* -X0268000Y0019176D02* -X0267000Y0019176D01* -X0267000Y0020375D02* -X0268000Y0020375D01* -X0268000Y0021573D02* -X0267000Y0021573D01* -X0267000Y0022772D02* -X0268000Y0022772D01* -X0268000Y0023970D02* -X0267000Y0023970D01* -X0267000Y0025169D02* -X0268000Y0025169D01* -X0268000Y0026367D02* -X0267000Y0026367D01* -X0259542Y0031161D02* -X0258224Y0031161D01* -X0258093Y0030847D02* -X0258356Y0031482D01* -X0258491Y0032156D01* -X0258491Y0032500D01* -X0258491Y0032844D01* -X0258356Y0033518D01* -X0258093Y0034153D01* -X0257711Y0034725D01* -X0257225Y0035211D01* -X0256653Y0035593D01* -X0256018Y0035856D01* -X0255344Y0035991D01* -X0255000Y0035991D01* -X0254656Y0035991D01* -X0253982Y0035856D01* -X0253347Y0035593D01* -X0252775Y0035211D01* -X0252289Y0034725D01* -X0251907Y0034153D01* -X0251644Y0033518D01* -X0251509Y0032844D01* -X0251509Y0032500D01* -X0251509Y0032156D01* -X0251644Y0031482D01* -X0251907Y0030847D01* -X0252289Y0030275D01* -X0252775Y0029789D01* -X0253347Y0029407D01* -X0253982Y0029144D01* -X0254656Y0029009D01* -X0255000Y0029009D01* -X0255344Y0029009D01* -X0256018Y0029144D01* -X0256653Y0029407D01* -X0257225Y0029789D01* -X0257711Y0030275D01* -X0258093Y0030847D01* -X0258770Y0029963D02* -X0257399Y0029963D01* -X0255000Y0029963D02* -X0255000Y0029963D01* -X0255000Y0029009D02* -X0255000Y0032500D01* -X0258491Y0032500D01* -X0255000Y0032500D01* -X0255000Y0032500D01* -X0255000Y0032500D01* -X0255000Y0035991D01* -X0255000Y0032500D01* -X0255000Y0032500D01* -X0255000Y0032500D01* -X0251509Y0032500D01* -X0255000Y0032500D01* -X0255000Y0029009D01* -X0255000Y0031161D02* -X0255000Y0031161D01* -X0255000Y0032360D02* -X0255000Y0032360D01* -X0255000Y0033558D02* -X0255000Y0033558D01* -X0255000Y0034757D02* -X0255000Y0034757D01* -X0255000Y0035955D02* -X0255000Y0035955D01* -X0255521Y0035955D02* -X0257655Y0035955D01* -X0257680Y0034757D02* -X0258151Y0034757D01* -X0258340Y0033558D02* -X0258877Y0033558D01* -X0258491Y0032360D02* -X0260075Y0032360D01* -X0257531Y0037154D02* -X0130890Y0037154D01* -X0129692Y0038352D02* -X0257531Y0038352D01* -X0257865Y0039551D02* -X0128493Y0039551D01* -X0126063Y0037500D02* -X0111358Y0037500D01* -X0107421Y0041437D01* -X0107421Y0072559D01* -X0105453Y0072559D02* -X0105453Y0038937D01* -X0109390Y0035000D01* -X0113563Y0035000D01* -X0117500Y0031063D01* -X0117500Y0020000D01* -X0112500Y0015000D01* -X0116444Y0010787D02* -X0118555Y0010787D01* -X0119754Y0009588D02* -X0115246Y0009588D01* -X0109754Y0009588D02* -X0105246Y0009588D01* -X0106444Y0010787D02* -X0108555Y0010787D01* -X0102500Y0015000D02* -X0107500Y0020000D01* -X0107500Y0028563D01* -X0103563Y0032500D01* -X0103484Y0032500D01* -X0099547Y0036437D01* -X0099547Y0072559D01* -X0097579Y0072559D02* -X0097579Y0020079D01* -X0092500Y0015000D01* -X0096444Y0010787D02* -X0098555Y0010787D01* -X0099754Y0009588D02* -X0095246Y0009588D01* -X0089754Y0009588D02* -X0085246Y0009588D01* -X0086444Y0010787D02* -X0088555Y0010787D01* -X0082500Y0015000D02* -X0087500Y0020000D01* -X0087500Y0043563D01* -X0091437Y0047500D01* -X0091673Y0047500D01* -X0095610Y0051437D01* -X0095610Y0072559D01* -X0091673Y0072559D02* -X0091673Y0086142D01* -X0100000Y0086142D01* -X0100000Y0109764D01* -X0080059Y0109764D01* -X0124941Y0109764D01* -X0128750Y0109764D01* -X0128750Y0122500D01* -X0153760Y0122500D01* -X0155000Y0122500D01* -X0155000Y0130000D01* -X0190000Y0130000D01* -X0186708Y0133168D02* -X0187412Y0133873D01* -X0189091Y0134568D01* -X0190909Y0134568D01* -X0192588Y0133873D01* -X0193873Y0132588D01* -X0194331Y0131481D01* -X0194331Y0144208D01* -X0193627Y0144912D01* -X0193168Y0146019D01* -X0193168Y0140807D01* -X0192686Y0139642D01* -X0189999Y0136955D01* -X0189999Y0136955D01* -X0189108Y0136064D01* -X0187943Y0135581D01* -X0136963Y0135581D01* -X0137577Y0135327D01* -X0138043Y0134861D01* -X0138145Y0134920D01* -X0138628Y0135050D01* -X0140837Y0135050D01* -X0140837Y0130600D01* -X0142037Y0130600D01* -X0142037Y0135050D01* -X0144246Y0135050D01* -X0144729Y0134920D01* -X0145163Y0134670D01* -X0145516Y0134316D01* -X0145767Y0133883D01* -X0145896Y0133400D01* -X0145896Y0130600D01* -X0142037Y0130600D01* -X0142037Y0129400D01* -X0145896Y0129400D01* -X0145896Y0126600D01* -X0145767Y0126117D01* -X0145516Y0125684D01* -X0145501Y0125668D01* -X0148632Y0125668D01* -X0148632Y0125964D01* -X0149023Y0126908D01* -X0149746Y0127630D01* -X0150058Y0127759D01* -X0150000Y0127759D01* -X0150000Y0131250D01* -X0150000Y0131250D01* -X0150000Y0134741D01* -X0149656Y0134741D01* -X0148982Y0134606D01* -X0148347Y0134343D01* -X0147775Y0133961D01* -X0147289Y0133475D01* -X0146907Y0132903D01* -X0146644Y0132268D01* -X0146509Y0131594D01* -X0146509Y0131250D01* -X0146509Y0130906D01* -X0146644Y0130232D01* -X0146907Y0129597D01* -X0147289Y0129025D01* -X0147775Y0128539D01* -X0148347Y0128157D01* -X0148982Y0127894D01* -X0149656Y0127759D01* -X0150000Y0127759D01* -X0150000Y0131250D01* -X0150000Y0131250D01* -X0150000Y0131250D01* -X0146509Y0131250D01* -X0150000Y0131250D01* -X0150000Y0134741D01* -X0150344Y0134741D01* -X0151018Y0134606D01* -X0151653Y0134343D01* -X0152225Y0133961D01* -X0152711Y0133475D01* -X0153093Y0132903D01* -X0153190Y0132671D01* -X0153205Y0132686D01* -X0154370Y0133168D01* -X0186708Y0133168D01* -X0188282Y0134233D02* -X0151818Y0134233D01* -X0153005Y0133035D02* -X0154047Y0133035D01* -X0150000Y0133035D02* -X0150000Y0133035D01* -X0150000Y0134233D02* -X0150000Y0134233D01* -X0148182Y0134233D02* -X0145564Y0134233D01* -X0145896Y0133035D02* -X0146995Y0133035D01* -X0146558Y0131836D02* -X0145896Y0131836D01* -X0145896Y0130638D02* -X0146563Y0130638D01* -X0147012Y0129439D02* -X0142037Y0129439D01* -X0142037Y0130638D02* -X0140837Y0130638D01* -X0140837Y0131836D02* -X0142037Y0131836D01* -X0142037Y0133035D02* -X0140837Y0133035D01* -X0140837Y0134233D02* -X0142037Y0134233D01* -X0137324Y0135432D02* -X0194331Y0135432D01* -X0194331Y0136630D02* -X0189674Y0136630D01* -X0190873Y0137829D02* -X0194331Y0137829D01* -X0194331Y0139027D02* -X0192071Y0139027D01* -X0192928Y0140226D02* -X0194331Y0140226D01* -X0194331Y0141424D02* -X0193168Y0141424D01* -X0193168Y0142623D02* -X0194331Y0142623D01* -X0194331Y0143821D02* -X0193168Y0143821D01* -X0193168Y0145020D02* -X0193582Y0145020D01* -X0197500Y0147500D02* -X0197500Y0123937D01* -X0196063Y0122500D01* -X0161240Y0122500D01* -X0160856Y0122500D01* -X0160856Y0109764D01* -X0156919Y0105827D01* -X0124941Y0105827D01* -X0124941Y0107795D02* -X0133563Y0107795D01* -X0133563Y0115000D01* -X0136731Y0109323D02* -X0137577Y0109673D01* -X0138043Y0110139D01* -X0138145Y0110080D01* -X0138628Y0109950D01* -X0140837Y0109950D01* -X0140837Y0114400D01* -X0142037Y0114400D01* -X0142037Y0115600D01* -X0145896Y0115600D01* -X0145896Y0118400D01* -X0145767Y0118883D01* -X0145516Y0119316D01* -X0145501Y0119331D01* -X0148632Y0119331D01* -X0148632Y0119036D01* -X0149023Y0118092D01* -X0149746Y0117370D01* -X0150690Y0116979D01* -X0156830Y0116979D01* -X0157500Y0117256D01* -X0157688Y0117179D01* -X0157688Y0111076D01* -X0155607Y0108995D01* -X0136731Y0108995D01* -X0136731Y0109323D01* -X0136731Y0109065D02* -X0150629Y0109065D01* -X0150906Y0109009D02* -X0151250Y0109009D01* -X0151594Y0109009D01* -X0152268Y0109144D01* -X0152903Y0109407D01* -X0153475Y0109789D01* -X0153961Y0110275D01* -X0154343Y0110847D01* -X0154606Y0111482D01* -X0154741Y0112156D01* -X0154741Y0112500D01* -X0154741Y0112844D01* -X0154606Y0113518D01* -X0154343Y0114153D01* -X0153961Y0114725D01* -X0153475Y0115211D01* -X0152903Y0115593D01* -X0152268Y0115856D01* -X0151594Y0115991D01* -X0151250Y0115991D01* -X0150906Y0115991D01* -X0150232Y0115856D01* -X0149597Y0115593D01* -X0149025Y0115211D01* -X0148539Y0114725D01* -X0148157Y0114153D01* -X0147894Y0113518D01* -X0147759Y0112844D01* -X0147759Y0112500D01* -X0147759Y0112156D01* -X0147894Y0111482D01* -X0148157Y0110847D01* -X0148539Y0110275D01* -X0149025Y0109789D01* -X0149597Y0109407D01* -X0150232Y0109144D01* -X0150906Y0109009D01* -X0151250Y0109009D02* -X0151250Y0112500D01* -X0154741Y0112500D01* -X0151250Y0112500D01* -X0151250Y0112500D01* -X0151250Y0112500D01* -X0151250Y0115991D01* -X0151250Y0112500D01* -X0151250Y0109009D01* -X0151250Y0109065D02* -X0151250Y0109065D01* -X0151871Y0109065D02* -X0155676Y0109065D01* -X0156875Y0110263D02* -X0153949Y0110263D01* -X0154598Y0111462D02* -X0157688Y0111462D01* -X0157688Y0112660D02* -X0154741Y0112660D01* -X0154465Y0113859D02* -X0157688Y0113859D01* -X0157688Y0115057D02* -X0153629Y0115057D01* -X0151250Y0115057D02* -X0151250Y0115057D01* -X0151250Y0113859D02* -X0151250Y0113859D01* -X0151250Y0112660D02* -X0151250Y0112660D01* -X0151250Y0112500D02* -X0151250Y0112500D01* -X0151250Y0112500D01* -X0147759Y0112500D01* -X0151250Y0112500D01* -X0151250Y0111462D02* -X0151250Y0111462D01* -X0151250Y0110263D02* -X0151250Y0110263D01* -X0148551Y0110263D02* -X0145047Y0110263D01* -X0145163Y0110330D02* -X0145516Y0110684D01* -X0145767Y0111117D01* -X0145896Y0111600D01* -X0145896Y0114400D01* -X0142037Y0114400D01* -X0142037Y0109950D01* -X0144246Y0109950D01* -X0144729Y0110080D01* -X0145163Y0110330D01* -X0145859Y0111462D02* -X0147902Y0111462D01* -X0147759Y0112660D02* -X0145896Y0112660D01* -X0145896Y0113859D02* -X0148035Y0113859D01* -X0148871Y0115057D02* -X0142037Y0115057D01* -X0142037Y0113859D02* -X0140837Y0113859D01* -X0140837Y0112660D02* -X0142037Y0112660D01* -X0142037Y0111462D02* -X0140837Y0111462D01* -X0140837Y0110263D02* -X0142037Y0110263D01* -X0145896Y0116256D02* -X0157688Y0116256D01* -X0164025Y0116256D02* -X0249618Y0116256D01* -X0249725Y0116211D02* -X0251181Y0116211D01* -X0251181Y0114183D01* -X0249986Y0114183D01* -X0249503Y0114054D01* -X0249070Y0113804D01* -X0248716Y0113450D01* -X0248466Y0113017D01* -X0248336Y0112534D01* -X0248336Y0111299D01* -X0248336Y0110866D01* -X0248059Y0110589D01* -X0247668Y0109645D01* -X0247668Y0108168D01* -X0236312Y0108168D01* -X0235186Y0109295D01* -X0234295Y0110186D01* -X0233130Y0110668D01* -X0228868Y0110668D01* -X0228868Y0110964D01* -X0228477Y0111908D01* -X0227754Y0112630D01* -X0226810Y0113021D01* -X0220670Y0113021D01* -X0220000Y0112744D01* -X0219330Y0113021D01* -X0213190Y0113021D01* -X0212246Y0112630D01* -X0211523Y0111908D01* -X0211132Y0110964D01* -X0211132Y0110668D01* -X0206870Y0110668D01* -X0205705Y0110186D01* -X0204814Y0109295D01* -X0202546Y0107027D01* -X0162600Y0107027D01* -X0162651Y0107078D01* -X0163542Y0107969D01* -X0164025Y0109134D01* -X0164025Y0116979D01* -X0164310Y0116979D01* -X0165254Y0117370D01* -X0165977Y0118092D01* -X0166368Y0119036D01* -X0166368Y0119331D01* -X0196693Y0119331D01* -X0197858Y0119814D01* -X0198749Y0120705D01* -X0200186Y0122142D01* -X0200668Y0123307D01* -X0200668Y0144208D01* -X0201373Y0144912D01* -X0202068Y0146591D01* -X0202068Y0148409D01* -X0201373Y0150088D01* -X0200088Y0151373D01* -X0198409Y0152068D01* -X0196591Y0152068D01* -X0194912Y0151373D01* -X0193627Y0150088D01* -X0193168Y0148981D01* -X0193168Y0152251D01* -X0194729Y0153811D01* -X0194912Y0153627D01* -X0196591Y0152931D01* -X0198409Y0152931D01* -X0200088Y0153627D01* -X0201373Y0154912D01* -X0202068Y0156591D01* -X0202068Y0158409D01* -X0201373Y0160088D01* -X0200088Y0161373D01* -X0198409Y0162068D01* -X0196591Y0162068D01* -X0194912Y0161373D01* -X0194208Y0160668D01* -X0193307Y0160668D01* -X0193168Y0160611D01* -X0193168Y0202400D01* -X0194600Y0202400D01* -X0194600Y0207100D01* -X0195400Y0207100D01* -X0195400Y0207900D01* -X0200100Y0207900D01* -X0200100Y0209612D01* -X0197685Y0212027D01* -X0200768Y0215111D01* -X0200768Y0219331D01* -X0225246Y0219331D01* -X0225246Y0215198D01* -X0225637Y0214254D01* -X0226360Y0213531D01* -X0227304Y0213140D01* -X0240924Y0213140D01* -X0241868Y0213531D01* -X0242591Y0214254D01* -X0242778Y0214706D01* -X0252222Y0214706D01* -X0252409Y0214254D01* -X0253132Y0213531D01* -X0254076Y0213140D01* -X0267696Y0213140D01* -X0268640Y0213531D01* -X0269282Y0214173D01* -X0269282Y0213367D01* -X0269673Y0212423D01* -X0270139Y0211957D01* -X0270080Y0211855D01* -X0269950Y0211372D01* -X0269950Y0209163D01* -X0274400Y0209163D01* -X0274400Y0207963D01* -X0269950Y0207963D01* -X0269950Y0205754D01* -X0270080Y0205271D01* -X0270330Y0204837D01* -X0270684Y0204484D01* -X0271117Y0204233D01* -X0271600Y0204104D01* -X0274400Y0204104D01* -X0274400Y0207963D01* -X0275600Y0207963D01* -X0275600Y0209163D01* -X0280050Y0209163D01* -X0280050Y0211372D01* -X0279920Y0211855D01* -X0279861Y0211957D01* -X0280327Y0212423D01* -X0280718Y0213367D01* -X0280718Y0219507D01* -X0280327Y0220451D01* -X0279605Y0221174D01* -X0278661Y0221565D01* -X0271339Y0221565D01* -X0270395Y0221174D01* -X0270264Y0221043D01* -X0269550Y0221043D01* -X0269363Y0221494D01* -X0268640Y0222217D01* -X0267696Y0222608D01* -X0254076Y0222608D01* -X0253132Y0222217D01* -X0252409Y0221494D01* -X0252222Y0221043D01* -X0242778Y0221043D01* -X0242591Y0221494D01* -X0241868Y0222217D01* -X0240924Y0222608D01* -X0237283Y0222608D01* -X0237283Y0223130D01* -X0236800Y0224295D01* -X0235909Y0225186D01* -X0234744Y0225668D01* -X0189370Y0225668D01* -X0188205Y0225186D01* -X0187314Y0224295D01* -X0186288Y0223268D01* -X0182611Y0223268D01* -X0179231Y0219889D01* -X0179231Y0216212D01* -X0178205Y0215186D01* -X0177314Y0214295D01* -X0176831Y0213130D01* -X0176831Y0193812D01* -X0173688Y0190668D01* -X0149551Y0190668D01* -X0153696Y0194814D01* -X0154588Y0195705D01* -X0155070Y0196870D01* -X0155070Y0198882D01* -X0155562Y0198882D01* -X0156506Y0199273D01* -X0157229Y0199996D01* -X0157500Y0200651D01* -X0157771Y0199996D01* -X0158494Y0199273D01* -X0159438Y0198882D01* -X0166759Y0198882D01* -X0167703Y0199273D01* -X0168425Y0199996D01* -X0168817Y0200940D01* -X0168817Y0209060D01* -X0168425Y0210004D01* -X0167703Y0210727D01* -X0166759Y0211118D01* -X0166267Y0211118D01* -X0166267Y0213793D01* -X0166368Y0214036D01* -X0166368Y0220964D01* -X0165977Y0221908D01* -X0165254Y0222630D01* -X0164310Y0223021D01* -X0158170Y0223021D01* -X0157226Y0222630D01* -X0156868Y0222273D01* -X0156569Y0222353D01* -X0154360Y0222353D01* -X0154360Y0218100D01* -X0153160Y0218100D01* -X0153160Y0222353D01* -X0150951Y0222353D01* -X0150467Y0222223D01* -X0150034Y0221973D01* -X0149680Y0221619D01* -X0149430Y0221186D01* -X0149301Y0220703D01* -X0149301Y0218100D01* -X0153160Y0218100D01* -X0153160Y0216900D01* -X0154360Y0216900D01* -X0154360Y0212647D01* -X0156569Y0212647D01* -X0156868Y0212727D01* -X0157226Y0212370D01* -X0158170Y0211979D01* -X0159930Y0211979D01* -X0159930Y0211118D01* -X0159438Y0211118D01* -X0158494Y0210727D01* -X0157771Y0210004D01* -X0157500Y0209349D01* -X0157229Y0210004D01* -X0156506Y0210727D01* -X0155562Y0211118D01* -X0148241Y0211118D01* -X0147297Y0210727D01* -X0146574Y0210004D01* -X0146183Y0209060D01* -X0146183Y0200940D01* -X0146574Y0199996D01* -X0147297Y0199273D01* -X0148241Y0198882D01* -X0148733Y0198882D01* -X0148733Y0198812D01* -X0145589Y0195668D01* -X0129551Y0195668D01* -X0129588Y0195705D01* -X0130070Y0196870D01* -X0130070Y0198882D01* -X0130562Y0198882D01* -X0131506Y0199273D01* -X0132229Y0199996D01* -X0132500Y0200651D01* -X0132771Y0199996D01* -X0133494Y0199273D01* -X0134438Y0198882D01* -X0141759Y0198882D01* -X0142703Y0199273D01* -X0143425Y0199996D01* -X0143817Y0200940D01* -X0143817Y0209060D01* -X0143425Y0210004D01* -X0142703Y0210727D01* -X0141759Y0211118D01* -X0141267Y0211118D01* -X0141267Y0213793D01* -X0141368Y0214036D01* -X0141368Y0220964D01* -X0140977Y0221908D01* -X0140254Y0222630D01* -X0139310Y0223021D01* -X0133170Y0223021D01* -X0132226Y0222630D01* -X0131868Y0222273D01* -X0131569Y0222353D01* -X0129360Y0222353D01* -X0129360Y0218100D01* -X0128160Y0218100D01* -X0128160Y0222353D01* -X0125951Y0222353D01* -X0125467Y0222223D01* -X0125034Y0221973D01* -X0124680Y0221619D01* -X0124430Y0221186D01* -X0124301Y0220703D01* -X0124301Y0218100D01* -X0128160Y0218100D01* -X0128160Y0216900D01* -X0129360Y0216900D01* -X0129360Y0212647D01* -X0131569Y0212647D01* -X0131868Y0212727D01* -X0132226Y0212370D01* -X0133170Y0211979D01* -X0134930Y0211979D01* -X0134930Y0211118D01* -X0134438Y0211118D01* -X0133494Y0210727D01* -X0132771Y0210004D01* -X0132500Y0209349D01* -X0132229Y0210004D01* -X0131506Y0210727D01* -X0130562Y0211118D01* -X0123241Y0211118D01* -X0122297Y0210727D01* -X0121574Y0210004D01* -X0121183Y0209060D01* -X0121183Y0200940D01* -X0121296Y0200668D01* -X0118771Y0200668D01* -X0118690Y0200635D01* -X0118817Y0200940D01* -X0118817Y0209060D01* -X0118425Y0210004D01* -X0117703Y0210727D01* -X0116759Y0211118D01* -X0116267Y0211118D01* -X0116267Y0213793D01* -X0116368Y0214036D01* -X0116368Y0220964D01* -X0115977Y0221908D01* -X0115254Y0222630D01* -X0114310Y0223021D01* -X0108170Y0223021D01* -X0107226Y0222630D01* -X0106868Y0222273D01* -X0106569Y0222353D01* -X0104360Y0222353D01* -X0104360Y0218100D01* -X0103160Y0218100D01* -X0103160Y0222353D01* -X0100951Y0222353D01* -X0100467Y0222223D01* -X0100034Y0221973D01* -X0099680Y0221619D01* -X0099430Y0221186D01* -X0099301Y0220703D01* -X0099301Y0218100D01* -X0103160Y0218100D01* -X0103160Y0216900D01* -X0104360Y0216900D01* -X0104360Y0212647D01* -X0106569Y0212647D01* -X0106868Y0212727D01* -X0107226Y0212370D01* -X0108170Y0211979D01* -X0109930Y0211979D01* -X0109930Y0211118D01* -X0109438Y0211118D01* -X0108494Y0210727D01* -X0107771Y0210004D01* -X0107500Y0209349D01* -X0107229Y0210004D01* -X0106506Y0210727D01* -X0105562Y0211118D01* -X0098241Y0211118D01* -X0097297Y0210727D01* -X0096574Y0210004D01* -X0096183Y0209060D01* -X0096183Y0208168D01* -X0085653Y0208168D01* -X0085186Y0209295D01* -X0084295Y0210186D01* -X0079295Y0215186D01* -X0078130Y0215668D01* -X0068268Y0215668D01* -X0068268Y0219889D01* -X0064889Y0223268D01* -X0061212Y0223268D01* -X0057686Y0226795D01* -X0057089Y0227392D01* -X0286132Y0227392D01* -X0286132Y0166433D01* -X0284751Y0167814D01* -X0282447Y0168768D01* -X0272553Y0168768D01* -X0270249Y0167814D01* -X0268704Y0166268D01* -X0261750Y0166268D01* -X0260365Y0165695D01* -X0255365Y0160695D01* -X0254975Y0160305D01* -X0254233Y0160305D01* -X0253289Y0159914D01* -X0252567Y0159191D01* -X0252176Y0158247D01* -X0252176Y0151713D01* -X0252567Y0150769D01* -X0253289Y0150047D01* -X0254233Y0149656D01* -X0260767Y0149656D01* -X0261711Y0150047D01* -X0262433Y0150769D01* -X0262824Y0151713D01* -X0262824Y0157495D01* -X0264061Y0158731D01* -X0268704Y0158731D01* -X0270249Y0157186D01* -X0270550Y0157061D01* -X0270152Y0156771D01* -X0269529Y0156148D01* -X0269010Y0155435D01* -X0268610Y0154650D01* -X0268338Y0153811D01* -X0268209Y0153000D01* -X0277000Y0153000D01* -X0277000Y0152000D01* -X0278000Y0152000D01* -X0278000Y0146900D01* -X0281641Y0146900D01* -X0282511Y0147038D01* -X0283350Y0147310D01* -X0284135Y0147710D01* -X0284848Y0148229D01* -X0285471Y0148852D01* -X0285990Y0149565D01* -X0286132Y0149845D01* -X0286132Y0051433D01* -X0284751Y0052814D01* -X0282447Y0053768D01* -X0272553Y0053768D01* -X0272500Y0053746D01* -X0272447Y0053768D01* -X0269418Y0053768D01* -X0269418Y0053926D01* -X0270256Y0054273D01* -X0270979Y0054996D01* -X0271250Y0055651D01* -X0271521Y0054996D01* -X0272244Y0054273D01* -X0273188Y0053882D01* -X0280509Y0053882D01* -X0281453Y0054273D01* -X0282175Y0054996D01* -X0282567Y0055940D01* -X0282567Y0064060D01* -X0282175Y0065004D01* -X0281453Y0065727D01* -X0280509Y0066118D01* -X0280017Y0066118D01* -X0280017Y0068793D01* -X0280118Y0069036D01* -X0280118Y0075964D01* -X0279727Y0076908D01* -X0279004Y0077630D01* -X0278060Y0078021D01* -X0277876Y0078021D01* -X0278093Y0078347D01* -X0278356Y0078982D01* -X0278491Y0079656D01* -X0278491Y0080000D01* -X0278491Y0080344D01* -X0278404Y0080778D01* -X0282243Y0080778D01* -X0283187Y0081169D01* -X0283910Y0081892D01* -X0284301Y0082836D01* -X0284301Y0091731D01* -X0283910Y0092675D01* -X0283187Y0093398D01* -X0282243Y0093789D01* -X0281318Y0093789D01* -X0281318Y0116211D01* -X0282243Y0116211D01* -X0283187Y0116602D01* -X0283910Y0117325D01* -X0284301Y0118269D01* -X0284301Y0127164D01* -X0283910Y0128108D01* -X0283187Y0128831D01* -X0282243Y0129222D01* -X0271379Y0129222D01* -X0271268Y0129176D01* -X0271268Y0135750D01* -X0270695Y0137135D01* -X0269635Y0138195D01* -X0264635Y0143195D01* -X0263250Y0143768D01* -X0262625Y0143768D01* -X0262433Y0144231D01* -X0261711Y0144953D01* -X0260767Y0145344D01* -X0254233Y0145344D01* -X0253289Y0144953D01* -X0252567Y0144231D01* -X0252375Y0143768D01* -X0251375Y0143768D01* -X0251183Y0144231D01* -X0250461Y0144953D01* -X0249517Y0145344D01* -X0242983Y0145344D01* -X0242039Y0144953D01* -X0241317Y0144231D01* -X0240926Y0143286D01* -X0240926Y0136753D01* -X0241317Y0135809D01* -X0242039Y0135086D01* -X0242983Y0134695D01* -X0249517Y0134695D01* -X0250461Y0135086D01* -X0251183Y0135809D01* -X0251358Y0136231D01* -X0252392Y0136231D01* -X0252567Y0135809D01* -X0253289Y0135086D01* -X0254233Y0134695D01* -X0260767Y0134695D01* -X0261711Y0135086D01* -X0261898Y0135273D01* -X0263731Y0133439D01* -X0263731Y0126318D01* -X0262647Y0126318D01* -X0262647Y0127164D01* -X0262256Y0128108D01* -X0261534Y0128831D01* -X0260590Y0129222D01* -X0249725Y0129222D01* -X0248781Y0128831D01* -X0248059Y0128108D01* -X0247668Y0127164D01* -X0247668Y0118269D01* -X0248059Y0117325D01* -X0248781Y0116602D01* -X0249725Y0116211D01* -X0251181Y0115057D02* -X0164025Y0115057D01* -X0164025Y0113859D02* -X0249164Y0113859D01* -X0248370Y0112660D02* -X0227682Y0112660D01* -X0228661Y0111462D02* -X0248336Y0111462D01* -X0248336Y0111299D02* -X0248769Y0111299D01* -X0248336Y0111299D01* -X0248769Y0111299D02* -X0248769Y0111299D01* -X0247924Y0110263D02* -X0234109Y0110263D01* -X0235416Y0109065D02* -X0247668Y0109065D01* -X0240000Y0111299D02* -X0240000Y0122500D01* -X0243491Y0122500D01* -X0243491Y0122844D01* -X0243356Y0123518D01* -X0243093Y0124153D01* -X0242711Y0124725D01* -X0242225Y0125211D01* -X0241653Y0125593D01* -X0241018Y0125856D01* -X0240344Y0125991D01* -X0240000Y0125991D01* -X0239656Y0125991D01* -X0238982Y0125856D01* -X0238347Y0125593D01* -X0237775Y0125211D01* -X0237289Y0124725D01* -X0236907Y0124153D01* -X0236644Y0123518D01* -X0236509Y0122844D01* -X0236509Y0122500D01* -X0236509Y0122156D01* -X0236644Y0121482D01* -X0236907Y0120847D01* -X0237289Y0120275D01* -X0237775Y0119789D01* -X0238347Y0119407D01* -X0238982Y0119144D01* -X0239656Y0119009D01* -X0240000Y0119009D01* -X0240344Y0119009D01* -X0241018Y0119144D01* -X0241653Y0119407D01* -X0242225Y0119789D01* -X0242711Y0120275D01* -X0243093Y0120847D01* -X0243356Y0121482D01* -X0243491Y0122156D01* -X0243491Y0122500D01* -X0240000Y0122500D01* -X0240000Y0122500D01* -X0240000Y0122500D01* -X0240000Y0125991D01* -X0240000Y0122500D01* -X0240000Y0119009D01* -X0240000Y0122500D01* -X0240000Y0122500D01* -X0240000Y0122500D01* -X0236509Y0122500D01* -X0240000Y0122500D01* -X0240000Y0122248D02* -X0240000Y0122248D01* -X0240000Y0121050D02* -X0240000Y0121050D01* -X0240000Y0119851D02* -X0240000Y0119851D01* -X0242288Y0119851D02* -X0247668Y0119851D01* -X0247668Y0118653D02* -X0166209Y0118653D01* -X0165338Y0117454D02* -X0248005Y0117454D01* -X0247668Y0121050D02* -X0243177Y0121050D01* -X0243491Y0122248D02* -X0247668Y0122248D01* -X0247668Y0123447D02* -X0243371Y0123447D01* -X0242765Y0124645D02* -X0247668Y0124645D01* -X0247668Y0125844D02* -X0241049Y0125844D01* -X0240000Y0125844D02* -X0240000Y0125844D01* -X0238951Y0125844D02* -X0200668Y0125844D01* -X0200668Y0127042D02* -X0247668Y0127042D01* -X0248191Y0128241D02* -X0200668Y0128241D01* -X0200668Y0129439D02* -X0263731Y0129439D01* -X0263731Y0128241D02* -X0262124Y0128241D01* -X0262647Y0127042D02* -X0263731Y0127042D01* -X0263731Y0130638D02* -X0200668Y0130638D01* -X0200668Y0131836D02* -X0223517Y0131836D01* -X0223347Y0131907D02* -X0223982Y0131644D01* -X0224656Y0131509D01* -X0225000Y0131509D01* -X0225344Y0131509D01* -X0226018Y0131644D01* -X0226653Y0131907D01* -X0227225Y0132289D01* -X0227711Y0132775D01* -X0228093Y0133347D01* -X0228356Y0133982D01* -X0228491Y0134656D01* -X0228491Y0135000D01* -X0228491Y0135344D01* -X0228356Y0136018D01* -X0228093Y0136653D01* -X0227711Y0137225D01* -X0227225Y0137711D01* -X0226653Y0138093D01* -X0226018Y0138356D01* -X0225344Y0138491D01* -X0225000Y0138491D01* -X0224656Y0138491D01* -X0223982Y0138356D01* -X0223347Y0138093D01* -X0222775Y0137711D01* -X0222289Y0137225D01* -X0221907Y0136653D01* -X0221644Y0136018D01* -X0221509Y0135344D01* -X0221509Y0135000D01* -X0221509Y0134656D01* -X0221644Y0133982D01* -X0221907Y0133347D01* -X0222289Y0132775D01* -X0222775Y0132289D01* -X0223347Y0131907D01* -X0225000Y0131836D02* -X0225000Y0131836D01* -X0225000Y0131509D02* -X0225000Y0135000D01* -X0228491Y0135000D01* -X0225000Y0135000D01* -X0225000Y0135000D01* -X0225000Y0135000D01* -X0225000Y0138491D01* -X0225000Y0135000D01* -X0225000Y0135000D01* -X0225000Y0135000D01* -X0221509Y0135000D01* -X0225000Y0135000D01* -X0225000Y0131509D01* -X0226483Y0131836D02* -X0263731Y0131836D01* -X0263731Y0133035D02* -X0227885Y0133035D01* -X0228406Y0134233D02* -X0262937Y0134233D01* -X0268802Y0139027D02* -X0274355Y0139027D01* -X0274407Y0139153D02* -X0274144Y0138518D01* -X0274009Y0137844D01* -X0274009Y0137500D01* -X0274009Y0137156D01* -X0274144Y0136482D01* -X0274407Y0135847D01* -X0274789Y0135275D01* -X0275275Y0134789D01* -X0275847Y0134407D01* -X0276482Y0134144D01* -X0277156Y0134009D01* -X0277500Y0134009D01* -X0277844Y0134009D01* -X0278518Y0134144D01* -X0279153Y0134407D01* -X0279725Y0134789D01* -X0280211Y0135275D01* -X0280593Y0135847D01* -X0280856Y0136482D01* -X0280991Y0137156D01* -X0280991Y0137500D01* -X0280991Y0137844D01* -X0280856Y0138518D01* -X0280593Y0139153D01* -X0280211Y0139725D01* -X0279725Y0140211D01* -X0279153Y0140593D01* -X0278518Y0140856D01* -X0277844Y0140991D01* -X0277500Y0140991D01* -X0277156Y0140991D01* -X0276482Y0140856D01* -X0275847Y0140593D01* -X0275275Y0140211D01* -X0274789Y0139725D01* -X0274407Y0139153D01* -X0274009Y0137829D02* -X0270001Y0137829D01* -X0270904Y0136630D02* -X0274114Y0136630D01* -X0274009Y0137500D02* -X0277500Y0137500D01* -X0280991Y0137500D01* -X0277500Y0137500D01* -X0277500Y0137500D01* -X0277500Y0137500D01* -X0277500Y0140991D01* -X0277500Y0137500D01* -X0277500Y0134009D01* -X0277500Y0137500D01* -X0277500Y0137500D01* -X0277500Y0137500D01* -X0274009Y0137500D01* -X0274684Y0135432D02* -X0271268Y0135432D01* -X0271268Y0134233D02* -X0276265Y0134233D01* -X0277500Y0134233D02* -X0277500Y0134233D01* -X0277500Y0135432D02* -X0277500Y0135432D01* -X0277500Y0136630D02* -X0277500Y0136630D01* -X0277500Y0137829D02* -X0277500Y0137829D01* -X0277500Y0139027D02* -X0277500Y0139027D01* -X0277500Y0140226D02* -X0277500Y0140226D01* -X0275297Y0140226D02* -X0267604Y0140226D01* -X0266405Y0141424D02* -X0286132Y0141424D01* -X0286132Y0140226D02* -X0279703Y0140226D01* -X0280645Y0139027D02* -X0286132Y0139027D01* -X0286132Y0137829D02* -X0280991Y0137829D01* -X0280886Y0136630D02* -X0286132Y0136630D01* -X0286132Y0135432D02* -X0280316Y0135432D01* -X0278735Y0134233D02* -X0286132Y0134233D01* -X0286132Y0133035D02* -X0271268Y0133035D01* -X0271268Y0131836D02* -X0286132Y0131836D01* -X0286132Y0130638D02* -X0271268Y0130638D01* -X0271268Y0129439D02* -X0286132Y0129439D01* -X0286132Y0128241D02* -X0283778Y0128241D01* -X0284301Y0127042D02* -X0286132Y0127042D01* -X0286132Y0125844D02* -X0284301Y0125844D01* -X0284301Y0124645D02* -X0286132Y0124645D01* -X0286132Y0123447D02* -X0284301Y0123447D01* -X0284301Y0122248D02* -X0286132Y0122248D01* -X0286132Y0121050D02* -X0284301Y0121050D01* -X0284301Y0119851D02* -X0286132Y0119851D01* -X0286132Y0118653D02* -X0284301Y0118653D01* -X0283963Y0117454D02* -X0286132Y0117454D01* -X0286132Y0116256D02* -X0282351Y0116256D01* -X0281318Y0115057D02* -X0286132Y0115057D01* -X0286132Y0113859D02* -X0281318Y0113859D01* -X0281318Y0112660D02* -X0286132Y0112660D01* -X0286132Y0111462D02* -X0281318Y0111462D01* -X0281318Y0110263D02* -X0286132Y0110263D01* -X0286132Y0109065D02* -X0281318Y0109065D01* -X0281318Y0107866D02* -X0286132Y0107866D01* -X0286132Y0106668D02* -X0281318Y0106668D01* -X0281318Y0105469D02* -X0286132Y0105469D01* -X0286132Y0104270D02* -X0281318Y0104270D01* -X0281318Y0103072D02* -X0286132Y0103072D01* -X0286132Y0101873D02* -X0281318Y0101873D01* -X0281318Y0100675D02* -X0286132Y0100675D01* -X0286132Y0099476D02* -X0281318Y0099476D01* -X0281318Y0098278D02* -X0286132Y0098278D01* -X0286132Y0097079D02* -X0281318Y0097079D01* -X0281318Y0095881D02* -X0286132Y0095881D01* -X0286132Y0094682D02* -X0281318Y0094682D01* -X0282980Y0093484D02* -X0286132Y0093484D01* -X0286132Y0092285D02* -X0284071Y0092285D01* -X0284301Y0091087D02* -X0286132Y0091087D01* -X0286132Y0089888D02* -X0284301Y0089888D01* -X0284301Y0088690D02* -X0286132Y0088690D01* -X0286132Y0087491D02* -X0284301Y0087491D01* -X0284301Y0086293D02* -X0286132Y0086293D01* -X0286132Y0085094D02* -X0284301Y0085094D01* -X0284301Y0083896D02* -X0286132Y0083896D01* -X0286132Y0082697D02* -X0284244Y0082697D01* -X0283517Y0081499D02* -X0286132Y0081499D01* -X0286132Y0080300D02* -X0278491Y0080300D01* -X0278491Y0080000D02* -X0275000Y0080000D01* -X0275000Y0080000D01* -X0275000Y0080000D01* -X0271509Y0080000D01* -X0271509Y0079656D01* -X0271644Y0078982D01* -X0271907Y0078347D01* -X0272124Y0078021D01* -X0271920Y0078021D01* -X0270976Y0077630D01* -X0270618Y0077273D01* -X0270319Y0077353D01* -X0268110Y0077353D01* -X0268110Y0073100D01* -X0266910Y0073100D01* -X0266910Y0077353D01* -X0265182Y0077353D01* -X0265695Y0077865D01* -X0269717Y0081887D01* -X0270435Y0081169D01* -X0271379Y0080778D01* -X0271596Y0080778D01* -X0271509Y0080344D01* -X0271509Y0080000D01* -X0275000Y0080000D01* -X0278491Y0080000D01* -X0278380Y0079102D02* -X0286132Y0079102D01* -X0286132Y0077903D02* -X0278345Y0077903D01* -X0279811Y0076705D02* -X0286132Y0076705D01* -X0286132Y0075506D02* -X0280118Y0075506D01* -X0280118Y0074308D02* -X0286132Y0074308D01* -X0286132Y0073109D02* -X0280118Y0073109D01* -X0280118Y0071911D02* -X0286132Y0071911D01* -X0286132Y0070712D02* -X0280118Y0070712D01* -X0280118Y0069514D02* -X0286132Y0069514D01* -X0286132Y0068315D02* -X0280017Y0068315D01* -X0280017Y0067117D02* -X0286132Y0067117D01* -X0286132Y0065918D02* -X0280991Y0065918D01* -X0282293Y0064720D02* -X0286132Y0064720D01* -X0286132Y0063521D02* -X0282567Y0063521D01* -X0282567Y0062323D02* -X0286132Y0062323D01* -X0286132Y0061124D02* -X0282567Y0061124D01* -X0282567Y0059926D02* -X0286132Y0059926D01* -X0286132Y0058727D02* -X0282567Y0058727D01* -X0282567Y0057529D02* -X0286132Y0057529D01* -X0286132Y0056330D02* -X0282567Y0056330D01* -X0282232Y0055132D02* -X0286132Y0055132D01* -X0286132Y0053933D02* -X0280631Y0053933D01* -X0284830Y0052734D02* -X0286132Y0052734D01* -X0286132Y0051536D02* -X0286029Y0051536D01* -X0276848Y0060000D02* -X0276848Y0072500D01* -X0274990Y0072500D01* -X0273680Y0066979D02* -X0271920Y0066979D01* -X0270976Y0067370D01* -X0270618Y0067727D01* -X0270319Y0067647D01* -X0268110Y0067647D01* -X0268110Y0071900D01* -X0266910Y0071900D01* -X0266910Y0067647D01* -X0264701Y0067647D01* -X0264217Y0067777D01* -X0263784Y0068027D01* -X0263430Y0068381D01* -X0263180Y0068814D01* -X0263051Y0069297D01* -X0263051Y0071900D01* -X0266910Y0071900D01* -X0266910Y0073100D01* -X0263051Y0073100D01* -X0263051Y0075703D01* -X0263180Y0076186D01* -X0263206Y0076231D01* -X0260758Y0076231D01* -X0260758Y0073100D01* -X0256506Y0073100D01* -X0256506Y0071900D01* -X0260758Y0071900D01* -X0260758Y0068313D01* -X0260629Y0067830D01* -X0260379Y0067396D01* -X0260025Y0067043D01* -X0259592Y0066792D01* -X0259108Y0066663D01* -X0256505Y0066663D01* -X0256505Y0071900D01* -X0255306Y0071900D01* -X0255306Y0066663D01* -X0255068Y0066663D01* -X0255068Y0065837D01* -X0255306Y0065837D01* -X0255306Y0060600D01* -X0256505Y0060600D01* -X0256505Y0065837D01* -X0259108Y0065837D01* -X0259592Y0065708D01* -X0260025Y0065457D01* -X0260379Y0065104D01* -X0260395Y0065075D01* -X0261047Y0065727D01* -X0261991Y0066118D01* -X0269312Y0066118D01* -X0270256Y0065727D01* -X0270979Y0065004D01* -X0271250Y0064349D01* -X0271521Y0065004D01* -X0272244Y0065727D01* -X0273188Y0066118D01* -X0273680Y0066118D01* -X0273680Y0066979D01* -X0272706Y0065918D02* -X0269794Y0065918D01* -X0271097Y0064720D02* -X0271403Y0064720D01* -X0271587Y0067117D02* -X0260099Y0067117D01* -X0260758Y0068315D02* -X0263496Y0068315D01* -X0263051Y0069514D02* -X0260758Y0069514D01* -X0260758Y0070712D02* -X0263051Y0070712D01* -X0263051Y0073109D02* -X0260758Y0073109D01* -X0260758Y0074308D02* -X0263051Y0074308D01* -X0263051Y0075506D02* -X0260758Y0075506D01* -X0265733Y0077903D02* -X0271635Y0077903D01* -X0271620Y0079102D02* -X0266931Y0079102D01* -X0268130Y0080300D02* -X0271509Y0080300D01* -X0270105Y0081499D02* -X0269328Y0081499D01* -X0268110Y0076705D02* -X0266910Y0076705D01* -X0266910Y0075506D02* -X0268110Y0075506D01* -X0268110Y0074308D02* -X0266910Y0074308D01* -X0266910Y0073109D02* -X0268110Y0073109D01* -X0266910Y0071911D02* -X0256506Y0071911D01* -X0256505Y0070712D02* -X0255306Y0070712D01* -X0255306Y0069514D02* -X0256505Y0069514D01* -X0256505Y0068315D02* -X0255306Y0068315D01* -X0255306Y0067117D02* -X0256505Y0067117D01* -X0255068Y0065918D02* -X0261509Y0065918D01* -X0256505Y0064720D02* -X0255306Y0064720D01* -X0255306Y0063521D02* -X0256505Y0063521D01* -X0256505Y0062323D02* -X0255306Y0062323D01* -X0255306Y0061124D02* -X0256505Y0061124D01* -X0256505Y0059400D02* -X0256505Y0054163D01* -X0259108Y0054163D01* -X0259592Y0054292D01* -X0260025Y0054543D01* -X0260379Y0054896D01* -X0260395Y0054925D01* -X0261047Y0054273D01* -X0261991Y0053882D01* -X0263081Y0053882D01* -X0263081Y0053768D01* -X0262553Y0053768D01* -X0254770Y0053768D01* -X0254933Y0054163D01* -X0255306Y0054163D01* -X0255306Y0059400D01* -X0256505Y0059400D01* -X0256505Y0058727D02* -X0255306Y0058727D01* -X0255306Y0057529D02* -X0256505Y0057529D01* -X0256505Y0056330D02* -X0255306Y0056330D01* -X0255306Y0055132D02* -X0256505Y0055132D01* -X0254838Y0053933D02* -X0261869Y0053933D01* -X0266250Y0050000D02* -X0266250Y0060000D01* -X0265652Y0060000D01* -X0271035Y0055132D02* -X0271465Y0055132D01* -X0273065Y0053933D02* -X0269435Y0053933D01* -X0257825Y0045543D02* -X0137891Y0045543D01* -X0137711Y0045275D02* -X0138093Y0045847D01* -X0138356Y0046482D01* -X0138491Y0047156D01* -X0138491Y0047500D01* -X0138491Y0047844D01* -X0138356Y0048518D01* -X0138093Y0049153D01* -X0137711Y0049725D01* -X0137225Y0050211D01* -X0136653Y0050593D01* -X0136018Y0050856D01* -X0135344Y0050991D01* -X0135000Y0050991D01* -X0134656Y0050991D01* -X0133982Y0050856D01* -X0133347Y0050593D01* -X0132775Y0050211D01* -X0132289Y0049725D01* -X0131907Y0049153D01* -X0131644Y0048518D01* -X0131509Y0047844D01* -X0131509Y0047500D01* -X0131509Y0047156D01* -X0131644Y0046482D01* -X0131907Y0045847D01* -X0132289Y0045275D01* -X0132775Y0044789D01* -X0133347Y0044407D01* -X0133982Y0044144D01* -X0134656Y0044009D01* -X0135000Y0044009D01* -X0135344Y0044009D01* -X0136018Y0044144D01* -X0136653Y0044407D01* -X0137225Y0044789D01* -X0137711Y0045275D01* -X0136504Y0044345D02* -X0258322Y0044345D01* -X0259289Y0043146D02* -X0130085Y0043146D01* -X0130699Y0044345D02* -X0133496Y0044345D01* -X0135000Y0044345D02* -X0135000Y0044345D01* -X0135000Y0044009D02* -X0135000Y0047500D01* -X0138491Y0047500D01* -X0135000Y0047500D01* -X0135000Y0047500D01* -X0135000Y0047500D01* -X0135000Y0050991D01* -X0135000Y0047500D01* -X0135000Y0047500D01* -X0135000Y0047500D01* -X0131509Y0047500D01* -X0135000Y0047500D01* -X0135000Y0044009D01* -X0135000Y0045543D02* -X0135000Y0045543D01* -X0135000Y0046742D02* -X0135000Y0046742D01* -X0135000Y0047940D02* -X0135000Y0047940D01* -X0135000Y0049139D02* -X0135000Y0049139D01* -X0135000Y0050337D02* -X0135000Y0050337D01* -X0132964Y0050337D02* -X0130699Y0050337D01* -X0130699Y0050703D02* -X0130570Y0051186D01* -X0130320Y0051619D01* -X0129966Y0051973D01* -X0129533Y0052223D01* -X0129049Y0052353D01* -X0126840Y0052353D01* -X0126840Y0048100D01* -X0130699Y0048100D01* -X0130699Y0050703D01* -X0130368Y0051536D02* -X0163731Y0051536D01* -X0163731Y0052734D02* -X0122522Y0052734D01* -X0125640Y0051536D02* -X0126840Y0051536D01* -X0126840Y0050337D02* -X0125640Y0050337D01* -X0125640Y0049139D02* -X0126840Y0049139D01* -X0126840Y0047940D02* -X0131529Y0047940D01* -X0131592Y0046742D02* -X0130699Y0046742D01* -X0130699Y0045543D02* -X0132109Y0045543D01* -X0131901Y0049139D02* -X0130699Y0049139D01* -X0126840Y0046742D02* -X0125640Y0046742D01* -X0125640Y0045543D02* -X0126840Y0045543D01* -X0126840Y0044345D02* -X0125640Y0044345D01* -X0125640Y0043146D02* -X0126840Y0043146D01* -X0126063Y0037500D02* -X0130000Y0033563D01* -X0130000Y0022500D01* -X0122500Y0015000D01* -X0128268Y0015581D02* -X0258535Y0015581D01* -X0258244Y0016779D02* -X0128760Y0016779D01* -X0128268Y0014382D02* -X0259143Y0014382D01* -X0260214Y0013184D02* -X0128268Y0013184D01* -X0127643Y0011985D02* -X0262822Y0011985D01* -X0277000Y0015581D02* -X0278000Y0015581D01* -X0278000Y0016779D02* -X0277000Y0016779D01* -X0252601Y0029963D02* -X0133168Y0029963D01* -X0133168Y0031161D02* -X0251776Y0031161D01* -X0251509Y0032360D02* -X0133168Y0032360D01* -X0133168Y0033558D02* -X0251660Y0033558D01* -X0252320Y0034757D02* -X0132935Y0034757D01* -X0132089Y0035955D02* -X0254479Y0035955D01* -X0258361Y0040749D02* -X0112590Y0040749D01* -X0111391Y0041948D02* -X0259383Y0041948D01* -X0239969Y0053768D02* -X0171268Y0053768D01* -X0171268Y0075750D01* -X0170695Y0077135D01* -X0169635Y0078195D01* -X0168250Y0078768D01* -X0129720Y0078768D01* -X0129872Y0079135D01* -X0129872Y0094784D01* -X0188688Y0094784D01* -X0195267Y0088205D01* -X0195903Y0087568D01* -X0189804Y0087568D01* -X0188860Y0087177D01* -X0188137Y0086455D01* -X0187746Y0085511D01* -X0187746Y0066989D01* -X0188137Y0066045D01* -X0188860Y0065323D01* -X0189804Y0064931D01* -X0213124Y0064931D01* -X0213124Y0062388D01* -X0216411Y0062388D01* -X0216411Y0062013D01* -X0216786Y0062013D01* -X0216786Y0057545D01* -X0218423Y0057545D01* -X0218907Y0057674D01* -X0219016Y0057737D01* -X0219470Y0057283D01* -X0220414Y0056892D01* -X0224586Y0056892D01* -X0225432Y0057243D01* -X0226111Y0056961D01* -X0226267Y0056805D01* -X0227652Y0056231D01* -X0238573Y0056231D01* -X0238573Y0055552D01* -X0238964Y0054608D01* -X0239687Y0053886D01* -X0239969Y0053768D01* -X0239639Y0053933D02* -X0171268Y0053933D01* -X0171268Y0055132D02* -X0204932Y0055132D01* -X0204789Y0055275D02* -X0205275Y0054789D01* -X0205847Y0054407D01* -X0206482Y0054144D01* -X0207156Y0054009D01* -X0207500Y0054009D01* -X0207844Y0054009D01* -X0208518Y0054144D01* -X0209153Y0054407D01* -X0209725Y0054789D01* -X0210211Y0055275D01* -X0210593Y0055847D01* -X0210856Y0056482D01* -X0210991Y0057156D01* -X0210991Y0057500D01* -X0210991Y0057844D01* -X0210856Y0058518D01* -X0210593Y0059153D01* -X0210211Y0059725D01* -X0209725Y0060211D01* -X0209153Y0060593D01* -X0208518Y0060856D01* -X0207844Y0060991D01* -X0207500Y0060991D01* -X0207156Y0060991D01* -X0206482Y0060856D01* -X0205847Y0060593D01* -X0205275Y0060211D01* -X0204789Y0059725D01* -X0204407Y0059153D01* -X0204144Y0058518D01* -X0204009Y0057844D01* -X0204009Y0057500D01* -X0204009Y0057156D01* -X0204144Y0056482D01* -X0204407Y0055847D01* -X0204789Y0055275D01* -X0204206Y0056330D02* -X0171268Y0056330D01* -X0171268Y0057529D02* -X0204009Y0057529D01* -X0204009Y0057500D02* -X0207500Y0057500D01* -X0210991Y0057500D01* -X0207500Y0057500D01* -X0207500Y0057500D01* -X0207500Y0057500D01* -X0207500Y0060991D01* -X0207500Y0057500D01* -X0207500Y0054009D01* -X0207500Y0057500D01* -X0207500Y0057500D01* -X0207500Y0057500D01* -X0204009Y0057500D01* -X0204230Y0058727D02* -X0171268Y0058727D01* -X0171268Y0059926D02* -X0204989Y0059926D01* -X0207500Y0059926D02* -X0207500Y0059926D01* -X0207500Y0058727D02* -X0207500Y0058727D01* -X0207500Y0057529D02* -X0207500Y0057529D01* -X0207500Y0056330D02* -X0207500Y0056330D01* -X0207500Y0055132D02* -X0207500Y0055132D01* -X0210068Y0055132D02* -X0238747Y0055132D01* -X0227414Y0056330D02* -X0210794Y0056330D01* -X0210991Y0057529D02* -X0219225Y0057529D01* -X0216786Y0058727D02* -X0216411Y0058727D01* -X0216411Y0057545D02* -X0216411Y0062013D01* -X0213124Y0062013D01* -X0213124Y0059195D01* -X0213253Y0058712D01* -X0213503Y0058278D01* -X0213857Y0057924D01* -X0214290Y0057674D01* -X0214773Y0057545D01* -X0216411Y0057545D01* -X0216411Y0059926D02* -X0216786Y0059926D01* -X0216786Y0061124D02* -X0216411Y0061124D01* -X0216411Y0062323D02* -X0171268Y0062323D01* -X0171268Y0063521D02* -X0213124Y0063521D01* -X0213124Y0064720D02* -X0171268Y0064720D01* -X0171268Y0065918D02* -X0188264Y0065918D01* -X0187746Y0067117D02* -X0171268Y0067117D01* -X0171268Y0068315D02* -X0187746Y0068315D01* -X0187746Y0069514D02* -X0171268Y0069514D01* -X0171268Y0070712D02* -X0187746Y0070712D01* -X0187746Y0071911D02* -X0171268Y0071911D01* -X0171268Y0073109D02* -X0187746Y0073109D01* -X0187746Y0074308D02* -X0171268Y0074308D01* -X0171268Y0075506D02* -X0187746Y0075506D01* -X0187746Y0076705D02* -X0170873Y0076705D01* -X0169926Y0077903D02* -X0187746Y0077903D01* -X0187746Y0079102D02* -X0129858Y0079102D01* -X0129872Y0080300D02* -X0187746Y0080300D01* -X0187746Y0081499D02* -X0129872Y0081499D01* -X0129872Y0082697D02* -X0187746Y0082697D01* -X0187746Y0083896D02* -X0129872Y0083896D01* -X0129872Y0085094D02* -X0187746Y0085094D01* -X0188070Y0086293D02* -X0129872Y0086293D01* -X0129872Y0087491D02* -X0189618Y0087491D01* -X0192385Y0091087D02* -X0129872Y0091087D01* -X0129872Y0092285D02* -X0191186Y0092285D01* -X0189988Y0093484D02* -X0129872Y0093484D01* -X0129872Y0094682D02* -X0188789Y0094682D01* -X0190000Y0097953D02* -X0197953Y0090000D01* -X0232500Y0090000D01* -X0237500Y0095000D01* -X0237500Y0098701D01* -X0236437Y0101850D02* -X0232500Y0097913D01* -X0232500Y0097500D01* -X0223740Y0097500D01* -X0216260Y0097500D02* -X0208937Y0097500D01* -X0207500Y0099136D01* -X0204746Y0101890D01* -X0124941Y0101890D01* -X0124941Y0103858D02* -X0203858Y0103858D01* -X0207500Y0107500D01* -X0216260Y0107500D01* -X0211339Y0111462D02* -X0164025Y0111462D01* -X0164025Y0112660D02* -X0212318Y0112660D01* -X0205891Y0110263D02* -X0164025Y0110263D01* -X0163996Y0109065D02* -X0204584Y0109065D01* -X0203385Y0107866D02* -X0163439Y0107866D01* -X0149662Y0117454D02* -X0145896Y0117454D01* -X0145828Y0118653D02* -X0148791Y0118653D01* -X0148632Y0125844D02* -X0145609Y0125844D01* -X0145896Y0127042D02* -X0149158Y0127042D01* -X0150000Y0128241D02* -X0150000Y0128241D01* -X0150000Y0129439D02* -X0150000Y0129439D01* -X0150000Y0130638D02* -X0150000Y0130638D01* -X0150000Y0131836D02* -X0150000Y0131836D01* -X0148221Y0128241D02* -X0145896Y0128241D01* -X0133563Y0130000D02* -X0128750Y0130000D01* -X0128750Y0122500D01* -X0117264Y0117441D02* -X0117264Y0133563D01* -X0122451Y0138750D01* -X0187313Y0138750D01* -X0190000Y0141437D01* -X0190000Y0153563D01* -X0193937Y0157500D01* -X0197500Y0157500D01* -X0201657Y0159402D02* -X0209231Y0159402D01* -X0209231Y0159889D02* -X0209231Y0155111D01* -X0211842Y0152500D01* -X0209231Y0149889D01* -X0209231Y0145111D01* -X0212611Y0141731D01* -X0217389Y0141731D01* -X0220000Y0144342D01* -X0222611Y0141731D01* -X0227389Y0141731D01* -X0230768Y0145111D01* -X0230768Y0149889D01* -X0227685Y0152973D01* -X0230100Y0155388D01* -X0230100Y0157100D01* -X0225400Y0157100D01* -X0225400Y0157900D01* -X0230100Y0157900D01* -X0230100Y0159612D01* -X0227212Y0162500D01* -X0230100Y0165388D01* -X0230100Y0167100D01* -X0225400Y0167100D01* -X0225400Y0167900D01* -X0230100Y0167900D01* -X0230100Y0169612D01* -X0227685Y0172027D01* -X0230768Y0175111D01* -X0230768Y0179889D01* -X0227389Y0183268D01* -X0222611Y0183268D01* -X0220000Y0180658D01* -X0217389Y0183268D01* -X0212611Y0183268D01* -X0209231Y0179889D01* -X0209231Y0175111D01* -X0211842Y0172500D01* -X0209231Y0169889D01* -X0209231Y0165111D01* -X0211842Y0162500D01* -X0209231Y0159889D01* -X0209943Y0160601D02* -X0200860Y0160601D01* -X0199059Y0161799D02* -X0211141Y0161799D01* -X0211345Y0162998D02* -X0193168Y0162998D01* -X0193168Y0164196D02* -X0210146Y0164196D01* -X0209231Y0165395D02* -X0193168Y0165395D01* -X0193168Y0166593D02* -X0209231Y0166593D01* -X0209231Y0167792D02* -X0193168Y0167792D01* -X0193168Y0168990D02* -X0209231Y0168990D01* -X0209531Y0170189D02* -X0193168Y0170189D01* -X0193168Y0171387D02* -X0210729Y0171387D01* -X0211756Y0172586D02* -X0193168Y0172586D01* -X0193168Y0173784D02* -X0210558Y0173784D01* -X0209359Y0174983D02* -X0193168Y0174983D01* -X0193168Y0176181D02* -X0209231Y0176181D01* -X0209231Y0177380D02* -X0193168Y0177380D01* -X0193168Y0178578D02* -X0209231Y0178578D01* -X0209231Y0179777D02* -X0193168Y0179777D01* -X0193168Y0180975D02* -X0210317Y0180975D01* -X0211516Y0182174D02* -X0193168Y0182174D01* -X0193168Y0183372D02* -X0286132Y0183372D01* -X0286132Y0182174D02* -X0228484Y0182174D01* -X0229683Y0180975D02* -X0243264Y0180975D01* -X0243662Y0181373D02* -X0242377Y0180088D01* -X0241681Y0178409D01* -X0241681Y0176591D01* -X0242377Y0174912D01* -X0242481Y0174808D01* -X0242481Y0160097D01* -X0242039Y0159914D01* -X0241317Y0159191D01* -X0240926Y0158247D01* -X0240926Y0151713D01* -X0241317Y0150769D01* -X0242039Y0150047D01* -X0242983Y0149656D01* -X0249517Y0149656D01* -X0250461Y0150047D01* -X0251183Y0150769D01* -X0251574Y0151713D01* -X0251574Y0158247D01* -X0251183Y0159191D01* -X0250461Y0159914D01* -X0250018Y0160097D01* -X0250018Y0174808D01* -X0250123Y0174912D01* -X0250818Y0176591D01* -X0250818Y0178409D01* -X0250123Y0180088D01* -X0248838Y0181373D01* -X0247159Y0182068D01* -X0245341Y0182068D01* -X0243662Y0181373D01* -X0242248Y0179777D02* -X0230768Y0179777D01* -X0230768Y0178578D02* -X0241752Y0178578D01* -X0241681Y0177380D02* -X0230768Y0177380D01* -X0230768Y0176181D02* -X0241851Y0176181D01* -X0242348Y0174983D02* -X0230641Y0174983D01* -X0229442Y0173784D02* -X0242481Y0173784D01* -X0242481Y0172586D02* -X0228244Y0172586D01* -X0228325Y0171387D02* -X0242481Y0171387D01* -X0242481Y0170189D02* -X0229524Y0170189D01* -X0230100Y0168990D02* -X0242481Y0168990D01* -X0242481Y0167792D02* -X0225400Y0167792D01* -X0225400Y0167100D02* -X0225400Y0162400D01* -X0225400Y0157900D01* -X0224600Y0157900D01* -X0224600Y0167100D01* -X0225400Y0167100D01* -X0225400Y0166593D02* -X0224600Y0166593D01* -X0224600Y0165395D02* -X0225400Y0165395D01* -X0225400Y0164196D02* -X0224600Y0164196D01* -X0224600Y0162998D02* -X0225400Y0162998D01* -X0225400Y0161799D02* -X0224600Y0161799D01* -X0224600Y0160601D02* -X0225400Y0160601D01* -X0225400Y0159402D02* -X0224600Y0159402D01* -X0224600Y0158203D02* -X0225400Y0158203D01* -X0227913Y0161799D02* -X0234080Y0161799D01* -X0234144Y0161482D02* -X0234407Y0160847D01* -X0234789Y0160275D01* -X0235275Y0159789D01* -X0235847Y0159407D01* -X0236482Y0159144D01* -X0237156Y0159009D01* -X0237500Y0159009D01* -X0237844Y0159009D01* -X0238518Y0159144D01* -X0239153Y0159407D01* -X0239725Y0159789D01* -X0240211Y0160275D01* -X0240593Y0160847D01* -X0240856Y0161482D01* -X0240991Y0162156D01* -X0240991Y0162500D01* -X0240991Y0162844D01* -X0240856Y0163518D01* -X0240593Y0164153D01* -X0240211Y0164725D01* -X0239725Y0165211D01* -X0239153Y0165593D01* -X0238518Y0165856D01* -X0237844Y0165991D01* -X0237500Y0165991D01* -X0237156Y0165991D01* -X0236482Y0165856D01* -X0235847Y0165593D01* -X0235275Y0165211D01* -X0234789Y0164725D01* -X0234407Y0164153D01* -X0234144Y0163518D01* -X0234009Y0162844D01* -X0234009Y0162500D01* -X0234009Y0162156D01* -X0234144Y0161482D01* -X0234571Y0160601D02* -X0229112Y0160601D01* -X0230100Y0159402D02* -X0235858Y0159402D01* -X0237500Y0159402D02* -X0237500Y0159402D01* -X0237500Y0159009D02* -X0237500Y0162500D01* -X0240991Y0162500D01* -X0237500Y0162500D01* -X0237500Y0162500D01* -X0237500Y0162500D01* -X0237500Y0165991D01* -X0237500Y0162500D01* -X0237500Y0162500D01* -X0237500Y0162500D01* -X0234009Y0162500D01* -X0237500Y0162500D01* -X0237500Y0159009D01* -X0237500Y0160601D02* -X0237500Y0160601D01* -X0237500Y0161799D02* -X0237500Y0161799D01* -X0237500Y0162998D02* -X0237500Y0162998D01* -X0237500Y0164196D02* -X0237500Y0164196D01* -X0237500Y0165395D02* -X0237500Y0165395D01* -X0239451Y0165395D02* -X0242481Y0165395D01* -X0242481Y0166593D02* -X0230100Y0166593D01* -X0230100Y0165395D02* -X0235549Y0165395D01* -X0234435Y0164196D02* -X0228909Y0164196D01* -X0227710Y0162998D02* -X0234040Y0162998D01* -X0230100Y0158203D02* -X0240926Y0158203D01* -X0240926Y0157005D02* -X0230100Y0157005D01* -X0230100Y0155806D02* -X0240926Y0155806D01* -X0240926Y0154608D02* -X0229320Y0154608D01* -X0228122Y0153409D02* -X0240926Y0153409D01* -X0240926Y0152211D02* -X0228447Y0152211D01* -X0229645Y0151012D02* -X0241216Y0151012D01* -X0242602Y0149814D02* -X0230768Y0149814D01* -X0230768Y0148615D02* -X0269765Y0148615D01* -X0269529Y0148852D02* -X0270152Y0148229D01* -X0270865Y0147710D01* -X0271650Y0147310D01* -X0272489Y0147038D01* -X0273359Y0146900D01* -X0277000Y0146900D01* -X0277000Y0152000D01* -X0268209Y0152000D01* -X0268338Y0151189D01* -X0268610Y0150350D01* -X0269010Y0149565D01* -X0269529Y0148852D01* -X0268884Y0149814D02* -X0261148Y0149814D01* -X0262534Y0151012D02* -X0268395Y0151012D01* -X0268274Y0153409D02* -X0262824Y0153409D01* -X0262824Y0152211D02* -X0277000Y0152211D01* -X0277000Y0151012D02* -X0278000Y0151012D01* -X0278000Y0149814D02* -X0277000Y0149814D01* -X0277000Y0148615D02* -X0278000Y0148615D01* -X0278000Y0147417D02* -X0277000Y0147417D01* -X0271441Y0147417D02* -X0230768Y0147417D01* -X0230768Y0146218D02* -X0286132Y0146218D01* -X0286132Y0145020D02* -X0261550Y0145020D01* -X0262603Y0143821D02* -X0286132Y0143821D01* -X0286132Y0142623D02* -X0265207Y0142623D01* -X0257500Y0140020D02* -X0257500Y0140000D01* -X0252397Y0143821D02* -X0251353Y0143821D01* -X0250300Y0145020D02* -X0253450Y0145020D01* -X0253852Y0149814D02* -X0249898Y0149814D01* -X0251284Y0151012D02* -X0252466Y0151012D01* -X0252176Y0152211D02* -X0251574Y0152211D01* -X0251574Y0153409D02* -X0252176Y0153409D01* -X0252176Y0154608D02* -X0251574Y0154608D01* -X0251574Y0155806D02* -X0252176Y0155806D01* -X0252176Y0157005D02* -X0251574Y0157005D01* -X0251574Y0158203D02* -X0252176Y0158203D01* -X0252777Y0159402D02* -X0250973Y0159402D01* -X0250018Y0160601D02* -X0255271Y0160601D01* -X0256470Y0161799D02* -X0250018Y0161799D01* -X0250018Y0162998D02* -X0257668Y0162998D01* -X0258867Y0164196D02* -X0250018Y0164196D01* -X0250018Y0165395D02* -X0260065Y0165395D01* -X0263533Y0158203D02* -X0269231Y0158203D01* -X0270473Y0157005D02* -X0262824Y0157005D01* -X0262824Y0155806D02* -X0269280Y0155806D01* -X0268597Y0154608D02* -X0262824Y0154608D01* -X0269028Y0166593D02* -X0250018Y0166593D01* -X0250018Y0167792D02* -X0270227Y0167792D01* -X0284773Y0167792D02* -X0286132Y0167792D01* -X0286132Y0168990D02* -X0250018Y0168990D01* -X0250018Y0170189D02* -X0286132Y0170189D01* -X0286132Y0171387D02* -X0250018Y0171387D01* -X0250018Y0172586D02* -X0286132Y0172586D01* -X0286132Y0173784D02* -X0250018Y0173784D01* -X0250152Y0174983D02* -X0286132Y0174983D01* -X0286132Y0176181D02* -X0250649Y0176181D01* -X0250818Y0177380D02* -X0286132Y0177380D01* -X0286132Y0178578D02* -X0250748Y0178578D01* -X0250252Y0179777D02* -X0286132Y0179777D01* -X0286132Y0180975D02* -X0249236Y0180975D01* -X0253853Y0198190D02* -X0254336Y0198061D01* -X0260403Y0198061D01* -X0260403Y0201643D01* -X0261369Y0201643D01* -X0261369Y0202609D01* -X0269085Y0202609D01* -X0269085Y0204541D01* -X0268956Y0205025D01* -X0268705Y0205458D01* -X0268352Y0205812D01* -X0267918Y0206062D01* -X0267435Y0206191D01* -X0261369Y0206191D01* -X0261369Y0202609D01* -X0260403Y0202609D01* -X0260403Y0206191D01* -X0254336Y0206191D01* -X0253853Y0206062D01* -X0253420Y0205812D01* -X0253066Y0205458D01* -X0252816Y0205025D01* -X0252687Y0204541D01* -X0252687Y0202609D01* -X0260403Y0202609D01* -X0260403Y0201643D01* -X0252687Y0201643D01* -X0252687Y0199710D01* -X0252816Y0199227D01* -X0253066Y0198794D01* -X0253420Y0198440D01* -X0253853Y0198190D01* -X0252974Y0198953D02* -X0242025Y0198953D01* -X0241934Y0198794D02* -X0242184Y0199227D01* -X0242313Y0199710D01* -X0242313Y0201643D01* -X0234597Y0201643D01* -X0234597Y0198061D01* -X0240664Y0198061D01* -X0241147Y0198190D01* -X0241580Y0198440D01* -X0241934Y0198794D01* -X0242313Y0200151D02* -X0252687Y0200151D01* -X0252687Y0201350D02* -X0242313Y0201350D01* -X0242313Y0202609D02* -X0242313Y0204541D01* -X0242184Y0205025D01* -X0241934Y0205458D01* -X0241580Y0205812D01* -X0241147Y0206062D01* -X0240664Y0206191D01* -X0234597Y0206191D01* -X0234597Y0202609D01* -X0233631Y0202609D01* -X0233631Y0201643D01* -X0225915Y0201643D01* -X0225915Y0199710D01* -X0226044Y0199227D01* -X0226295Y0198794D01* -X0226648Y0198440D01* -X0227082Y0198190D01* -X0227565Y0198061D01* -X0233631Y0198061D01* -X0233631Y0201643D01* -X0234597Y0201643D01* -X0234597Y0202609D01* -X0242313Y0202609D01* -X0242313Y0203747D02* -X0252687Y0203747D01* -X0252795Y0204945D02* -X0242205Y0204945D01* -X0240840Y0206144D02* -X0254160Y0206144D01* -X0260403Y0206144D02* -X0261369Y0206144D01* -X0261369Y0204945D02* -X0260403Y0204945D01* -X0260403Y0203747D02* -X0261369Y0203747D01* -X0261369Y0202548D02* -X0286132Y0202548D01* -X0286132Y0201350D02* -X0269085Y0201350D01* -X0269085Y0201643D02* -X0269085Y0199710D01* -X0268956Y0199227D01* -X0268705Y0198794D01* -X0268352Y0198440D01* -X0267918Y0198190D01* -X0267435Y0198061D01* -X0261369Y0198061D01* -X0261369Y0201643D01* -X0269085Y0201643D01* -X0270000Y0202126D02* -X0275000Y0207126D01* -X0275000Y0207500D01* -X0274400Y0207342D02* -X0275600Y0207342D01* -X0275600Y0207963D02* -X0275600Y0204104D01* -X0278400Y0204104D01* -X0278883Y0204233D01* -X0279316Y0204484D01* -X0279670Y0204837D01* -X0279920Y0205271D01* -X0280050Y0205754D01* -X0280050Y0207963D01* -X0275600Y0207963D01* -X0275600Y0208541D02* -X0286132Y0208541D01* -X0286132Y0209739D02* -X0280050Y0209739D01* -X0280050Y0210938D02* -X0286132Y0210938D01* -X0286132Y0212137D02* -X0280041Y0212137D01* -X0280705Y0213335D02* -X0286132Y0213335D01* -X0286132Y0214534D02* -X0280718Y0214534D01* -X0280718Y0215732D02* -X0286132Y0215732D01* -X0286132Y0216931D02* -X0280718Y0216931D01* -X0280718Y0218129D02* -X0286132Y0218129D01* -X0286132Y0219328D02* -X0280718Y0219328D01* -X0280252Y0220526D02* -X0286132Y0220526D01* -X0286132Y0221725D02* -X0269132Y0221725D01* -X0275000Y0217874D02* -X0260886Y0217874D01* -X0234114Y0217874D01* -X0234114Y0222500D01* -X0190000Y0222500D01* -X0185000Y0217500D01* -X0180000Y0212500D01* -X0180000Y0192500D01* -X0175000Y0187500D01* -X0127500Y0187500D01* -X0122500Y0182500D01* -X0122500Y0157500D01* -X0117500Y0152500D01* -X0107421Y0152500D01* -X0103484Y0148563D01* -X0103484Y0117441D01* -X0101516Y0117441D02* -X0101516Y0151063D01* -X0105453Y0155000D01* -X0113750Y0155000D01* -X0118750Y0160000D01* -X0118750Y0187500D01* -X0123750Y0192500D01* -X0146902Y0192500D01* -X0151902Y0197500D01* -X0151902Y0205000D01* -X0146183Y0204945D02* -X0143817Y0204945D01* -X0143817Y0203747D02* -X0146183Y0203747D01* -X0146183Y0202548D02* -X0143817Y0202548D01* -X0143817Y0201350D02* -X0146183Y0201350D01* -X0146510Y0200151D02* -X0143490Y0200151D01* -X0141929Y0198953D02* -X0148071Y0198953D01* -X0147675Y0197754D02* -X0130070Y0197754D01* -X0129940Y0196556D02* -X0146476Y0196556D01* -X0150644Y0191762D02* -X0168696Y0191762D01* -X0168982Y0191644D02* -X0169656Y0191509D01* -X0170000Y0191509D01* -X0170344Y0191509D01* -X0171018Y0191644D01* -X0171653Y0191907D01* -X0172225Y0192289D01* -X0172711Y0192775D01* -X0173093Y0193347D01* -X0173356Y0193982D01* -X0173491Y0194656D01* -X0173491Y0195000D01* -X0173491Y0195344D01* -X0173356Y0196018D01* -X0173093Y0196653D01* -X0172711Y0197225D01* -X0172225Y0197711D01* -X0171653Y0198093D01* -X0171018Y0198356D01* -X0170344Y0198491D01* -X0170000Y0198491D01* -X0169656Y0198491D01* -X0168982Y0198356D01* -X0168347Y0198093D01* -X0167775Y0197711D01* -X0167289Y0197225D01* -X0166907Y0196653D01* -X0166644Y0196018D01* -X0166509Y0195344D01* -X0166509Y0195000D01* -X0166509Y0194656D01* -X0166644Y0193982D01* -X0166907Y0193347D01* -X0167289Y0192775D01* -X0167775Y0192289D01* -X0168347Y0191907D01* -X0168982Y0191644D01* -X0170000Y0191762D02* -X0170000Y0191762D01* -X0170000Y0191509D02* -X0170000Y0195000D01* -X0173491Y0195000D01* -X0170000Y0195000D01* -X0170000Y0195000D01* -X0170000Y0195000D01* -X0170000Y0198491D01* -X0170000Y0195000D01* -X0170000Y0195000D01* -X0170000Y0195000D01* -X0166509Y0195000D01* -X0170000Y0195000D01* -X0170000Y0191509D01* -X0171304Y0191762D02* -X0174781Y0191762D01* -X0175979Y0192960D02* -X0172835Y0192960D01* -X0173392Y0194159D02* -X0176831Y0194159D01* -X0176831Y0195357D02* -X0173488Y0195357D01* -X0173134Y0196556D02* -X0176831Y0196556D01* -X0176831Y0197754D02* -X0172161Y0197754D01* -X0170000Y0197754D02* -X0170000Y0197754D01* -X0170000Y0196556D02* -X0170000Y0196556D01* -X0170000Y0195357D02* -X0170000Y0195357D01* -X0170000Y0194159D02* -X0170000Y0194159D01* -X0170000Y0192960D02* -X0170000Y0192960D01* -X0167165Y0192960D02* -X0151843Y0192960D01* -X0153041Y0194159D02* -X0166608Y0194159D01* -X0166512Y0195357D02* -X0154240Y0195357D01* -X0154940Y0196556D02* -X0166866Y0196556D01* -X0167839Y0197754D02* -X0155070Y0197754D01* -X0155733Y0198953D02* -X0159267Y0198953D01* -X0157707Y0200151D02* -X0157293Y0200151D01* -X0163098Y0205000D02* -X0163098Y0217500D01* -X0161240Y0217500D01* -X0166267Y0213335D02* -X0176916Y0213335D01* -X0176831Y0212137D02* -X0166267Y0212137D01* -X0167193Y0210938D02* -X0176831Y0210938D01* -X0176831Y0209739D02* -X0168535Y0209739D01* -X0168817Y0208541D02* -X0176831Y0208541D01* -X0176831Y0207342D02* -X0168817Y0207342D01* -X0168817Y0206144D02* -X0176831Y0206144D01* -X0176831Y0204945D02* -X0168817Y0204945D01* -X0168817Y0203747D02* -X0176831Y0203747D01* -X0176831Y0202548D02* -X0168817Y0202548D01* -X0168817Y0201350D02* -X0176831Y0201350D01* -X0176831Y0200151D02* -X0168490Y0200151D01* -X0166929Y0198953D02* -X0176831Y0198953D01* -X0183168Y0198953D02* -X0186831Y0198953D01* -X0186831Y0200151D02* -X0183168Y0200151D01* -X0183168Y0201350D02* -X0186831Y0201350D01* -X0186831Y0202400D02* -X0186831Y0161312D01* -X0184455Y0158936D01* -X0184455Y0158936D01* -X0183564Y0158045D01* -X0183081Y0156880D01* -X0183081Y0147562D01* -X0182039Y0146520D01* -X0182068Y0146591D01* -X0182068Y0148409D01* -X0181373Y0150088D01* -X0180088Y0151373D01* -X0178409Y0152068D01* -X0176591Y0152068D01* -X0174912Y0151373D01* -X0174208Y0150668D01* -X0120149Y0150668D01* -X0120186Y0150705D01* -X0125186Y0155705D01* -X0125668Y0156870D01* -X0125668Y0181188D01* -X0128812Y0184331D01* -X0175630Y0184331D01* -X0176795Y0184814D01* -X0177686Y0185705D01* -X0182686Y0190705D01* -X0183168Y0191870D01* -X0183168Y0202400D01* -X0184600Y0202400D01* -X0184600Y0207100D01* -X0185400Y0207100D01* -X0185400Y0202400D01* -X0186831Y0202400D01* -X0185400Y0202548D02* -X0184600Y0202548D01* -X0184600Y0203747D02* -X0185400Y0203747D01* -X0185400Y0204945D02* -X0184600Y0204945D01* -X0184600Y0206144D02* -X0185400Y0206144D01* -X0190000Y0212500D02* -X0190000Y0160000D01* -X0186250Y0156250D01* -X0186250Y0146250D01* -X0182500Y0142500D01* -X0115295Y0142500D01* -X0111358Y0138563D01* -X0111358Y0117441D01* -X0105453Y0117441D02* -X0105453Y0143563D01* -X0109390Y0147500D01* -X0177500Y0147500D01* -X0182068Y0147417D02* -X0182936Y0147417D01* -X0183081Y0148615D02* -X0181983Y0148615D01* -X0181486Y0149814D02* -X0183081Y0149814D01* -X0183081Y0151012D02* -X0180448Y0151012D01* -X0183081Y0152211D02* -X0121692Y0152211D01* -X0122890Y0153409D02* -X0183081Y0153409D01* -X0183081Y0154608D02* -X0124089Y0154608D01* -X0125228Y0155806D02* -X0183081Y0155806D01* -X0183133Y0157005D02* -X0125668Y0157005D01* -X0125668Y0158203D02* -X0183723Y0158203D01* -X0184921Y0159402D02* -X0125668Y0159402D01* -X0125668Y0160601D02* -X0186120Y0160601D01* -X0186831Y0161799D02* -X0125668Y0161799D01* -X0125668Y0162998D02* -X0186831Y0162998D01* -X0186831Y0164196D02* -X0125668Y0164196D01* -X0125668Y0165395D02* -X0186831Y0165395D01* -X0186831Y0166593D02* -X0125668Y0166593D01* -X0125668Y0167792D02* -X0186831Y0167792D01* -X0186831Y0168990D02* -X0125668Y0168990D01* -X0125668Y0170189D02* -X0186831Y0170189D01* -X0186831Y0171387D02* -X0125668Y0171387D01* -X0125668Y0172586D02* -X0149978Y0172586D01* -X0149789Y0172775D02* -X0150275Y0172289D01* -X0150847Y0171907D01* -X0151482Y0171644D01* -X0152156Y0171509D01* -X0152500Y0171509D01* -X0152844Y0171509D01* -X0153518Y0171644D01* -X0154153Y0171907D01* -X0154725Y0172289D01* -X0155211Y0172775D01* -X0155593Y0173347D01* -X0155856Y0173982D01* -X0155991Y0174656D01* -X0155991Y0175000D01* -X0155991Y0175344D01* -X0155856Y0176018D01* -X0155593Y0176653D01* -X0155211Y0177225D01* -X0154725Y0177711D01* -X0154153Y0178093D01* -X0153518Y0178356D01* -X0152844Y0178491D01* -X0152500Y0178491D01* -X0152156Y0178491D01* -X0151482Y0178356D01* -X0150847Y0178093D01* -X0150275Y0177711D01* -X0149789Y0177225D01* -X0149407Y0176653D01* -X0149144Y0176018D01* -X0149009Y0175344D01* -X0149009Y0175000D01* -X0149009Y0174656D01* -X0149144Y0173982D01* -X0149407Y0173347D01* -X0149789Y0172775D01* -X0149225Y0173784D02* -X0125668Y0173784D01* -X0125668Y0174983D02* -X0149009Y0174983D01* -X0149009Y0175000D02* -X0152500Y0175000D01* -X0155991Y0175000D01* -X0152500Y0175000D01* -X0152500Y0175000D01* -X0152500Y0175000D01* -X0152500Y0178491D01* -X0152500Y0175000D01* -X0152500Y0171509D01* -X0152500Y0175000D01* -X0152500Y0175000D01* -X0152500Y0175000D01* -X0149009Y0175000D01* -X0149211Y0176181D02* -X0125668Y0176181D01* -X0125668Y0177380D02* -X0149943Y0177380D01* -X0152500Y0177380D02* -X0152500Y0177380D01* -X0152500Y0176181D02* -X0152500Y0176181D01* -X0152500Y0174983D02* -X0152500Y0174983D01* -X0152500Y0173784D02* -X0152500Y0173784D01* -X0152500Y0172586D02* -X0152500Y0172586D01* -X0155022Y0172586D02* -X0186831Y0172586D01* -X0186831Y0173784D02* -X0155775Y0173784D01* -X0155991Y0174983D02* -X0186831Y0174983D01* -X0186831Y0176181D02* -X0155789Y0176181D01* -X0155057Y0177380D02* -X0186831Y0177380D01* -X0186831Y0178578D02* -X0125668Y0178578D01* -X0125668Y0179777D02* -X0186831Y0179777D01* -X0186831Y0180975D02* -X0125668Y0180975D01* -X0126655Y0182174D02* -X0186831Y0182174D01* -X0186831Y0183372D02* -X0127853Y0183372D01* -X0114402Y0192500D02* -X0119402Y0197500D01* -X0126902Y0197500D01* -X0126902Y0205000D01* -X0121183Y0204945D02* -X0118817Y0204945D01* -X0118817Y0203747D02* -X0121183Y0203747D01* -X0121183Y0202548D02* -X0118817Y0202548D01* -X0118817Y0201350D02* -X0121183Y0201350D01* -X0121183Y0206144D02* -X0118817Y0206144D01* -X0118817Y0207342D02* -X0121183Y0207342D01* -X0121183Y0208541D02* -X0118817Y0208541D01* -X0118535Y0209739D02* -X0121465Y0209739D01* -X0122807Y0210938D02* -X0117193Y0210938D01* -X0116267Y0212137D02* -X0132789Y0212137D01* -X0134004Y0210938D02* -X0130996Y0210938D01* -X0132338Y0209739D02* -X0132662Y0209739D01* -X0128160Y0212647D02* -X0128160Y0216900D01* -X0124301Y0216900D01* -X0124301Y0214297D01* -X0124430Y0213814D01* -X0124680Y0213381D01* -X0125034Y0213027D01* -X0125467Y0212777D01* -X0125951Y0212647D01* -X0128160Y0212647D01* -X0128160Y0213335D02* -X0129360Y0213335D01* -X0129360Y0214534D02* -X0128160Y0214534D01* -X0128160Y0215732D02* -X0129360Y0215732D01* -X0128160Y0216931D02* -X0116368Y0216931D01* -X0116368Y0218129D02* -X0124301Y0218129D01* -X0124301Y0219328D02* -X0116368Y0219328D01* -X0116368Y0220526D02* -X0124301Y0220526D01* -X0124786Y0221725D02* -X0116053Y0221725D01* -X0114547Y0222923D02* -X0132933Y0222923D01* -X0129360Y0221725D02* -X0128160Y0221725D01* -X0128160Y0220526D02* -X0129360Y0220526D01* -X0129360Y0219328D02* -X0128160Y0219328D01* -X0128160Y0218129D02* -X0129360Y0218129D01* -X0124301Y0215732D02* -X0116368Y0215732D01* -X0116368Y0214534D02* -X0124301Y0214534D01* -X0124726Y0213335D02* -X0116267Y0213335D01* -X0113098Y0217500D02* -X0111240Y0217500D01* -X0113098Y0217500D02* -X0113098Y0205000D01* -X0107662Y0209739D02* -X0107338Y0209739D01* -X0105996Y0210938D02* -X0109004Y0210938D01* -X0107789Y0212137D02* -X0082344Y0212137D01* -X0081146Y0213335D02* -X0099726Y0213335D01* -X0099680Y0213381D02* -X0100034Y0213027D01* -X0100467Y0212777D01* -X0100951Y0212647D01* -X0103160Y0212647D01* -X0103160Y0216900D01* -X0099301Y0216900D01* -X0099301Y0214297D01* -X0099430Y0213814D01* -X0099680Y0213381D01* -X0099301Y0214534D02* -X0079947Y0214534D01* -X0077500Y0212500D02* -X0082500Y0207500D01* -X0082500Y0205000D01* -X0101902Y0205000D01* -X0096183Y0201831D02* -X0096183Y0200940D01* -X0096296Y0200668D01* -X0053812Y0200668D01* -X0052081Y0202400D01* -X0052100Y0202400D01* -X0052100Y0207100D01* -X0052900Y0207100D01* -X0052900Y0207900D01* -X0057600Y0207900D01* -X0062100Y0207900D01* -X0062100Y0207100D01* -X0052900Y0207100D01* -X0052900Y0202400D01* -X0054612Y0202400D01* -X0057500Y0205288D01* -X0060388Y0202400D01* -X0062100Y0202400D01* -X0062100Y0207100D01* -X0062900Y0207100D01* -X0062900Y0207900D01* -X0067600Y0207900D01* -X0067600Y0209331D01* -X0076188Y0209331D01* -X0079331Y0206188D01* -X0079331Y0204370D01* -X0079814Y0203205D01* -X0080705Y0202314D01* -X0081870Y0201831D01* -X0096183Y0201831D01* -X0096183Y0201350D02* -X0053131Y0201350D01* -X0052900Y0202548D02* -X0052100Y0202548D01* -X0052100Y0203747D02* -X0052900Y0203747D01* -X0052900Y0204945D02* -X0052100Y0204945D01* -X0052100Y0206144D02* -X0052900Y0206144D01* -X0052900Y0207342D02* -X0062100Y0207342D01* -X0062900Y0207342D02* -X0078177Y0207342D01* -X0079331Y0206144D02* -X0067600Y0206144D01* -X0067600Y0205388D02* -X0067600Y0207100D01* -X0062900Y0207100D01* -X0062900Y0202400D01* -X0064612Y0202400D01* -X0067600Y0205388D01* -X0067158Y0204945D02* -X0079331Y0204945D01* -X0079589Y0203747D02* -X0065959Y0203747D01* -X0064761Y0202548D02* -X0080471Y0202548D01* -X0076978Y0208541D02* -X0067600Y0208541D01* -X0062900Y0206144D02* -X0062100Y0206144D01* -X0062100Y0204945D02* -X0062900Y0204945D01* -X0062900Y0203747D02* -X0062100Y0203747D01* -X0062100Y0202548D02* -X0062900Y0202548D01* -X0060239Y0202548D02* -X0054761Y0202548D01* -X0055959Y0203747D02* -X0059041Y0203747D01* -X0057842Y0204945D02* -X0057158Y0204945D01* -X0057500Y0212500D02* -X0077500Y0212500D01* -X0083543Y0210938D02* -X0097807Y0210938D01* -X0096465Y0209739D02* -X0084741Y0209739D01* -X0085498Y0208541D02* -X0096183Y0208541D01* -X0103160Y0213335D02* -X0104360Y0213335D01* -X0104360Y0214534D02* -X0103160Y0214534D01* -X0103160Y0215732D02* -X0104360Y0215732D01* -X0103160Y0216931D02* -X0068268Y0216931D01* -X0068268Y0218129D02* -X0099301Y0218129D01* -X0099301Y0219328D02* -X0068268Y0219328D01* -X0067632Y0220526D02* -X0099301Y0220526D01* -X0099786Y0221725D02* -X0066433Y0221725D01* -X0065235Y0222923D02* -X0107933Y0222923D01* -X0104360Y0221725D02* -X0103160Y0221725D01* -X0103160Y0220526D02* -X0104360Y0220526D01* -X0104360Y0219328D02* -X0103160Y0219328D01* -X0103160Y0218129D02* -X0104360Y0218129D01* -X0099301Y0215732D02* -X0068268Y0215732D01* -X0062500Y0217500D02* -X0055000Y0225000D01* -X0016437Y0225000D01* -X0012500Y0221063D01* -X0012500Y0092500D01* -X0017500Y0087500D01* -X0027500Y0087500D01* -X0027500Y0078740D01* -X0021979Y0079102D02* -X0002568Y0079102D01* -X0002568Y0080300D02* -X0021979Y0080300D01* -X0021979Y0081499D02* -X0002568Y0081499D01* -X0002568Y0082697D02* -X0022346Y0082697D01* -X0024331Y0083896D02* -X0002568Y0083896D01* -X0002568Y0085094D02* -X0015425Y0085094D01* -X0014226Y0086293D02* -X0002568Y0086293D01* -X0002568Y0087491D02* -X0013028Y0087491D01* -X0011829Y0088690D02* -X0002568Y0088690D01* -X0002568Y0089888D02* -X0010631Y0089888D01* -X0009656Y0091087D02* -X0002568Y0091087D01* -X0002568Y0092285D02* -X0009331Y0092285D01* -X0009331Y0093484D02* -X0002568Y0093484D01* -X0002568Y0094682D02* -X0009331Y0094682D01* -X0009331Y0095881D02* -X0002568Y0095881D01* -X0002568Y0097079D02* -X0009331Y0097079D01* -X0009331Y0098278D02* -X0002568Y0098278D01* -X0002568Y0099476D02* -X0009331Y0099476D01* -X0009331Y0100675D02* -X0002568Y0100675D01* -X0002568Y0101873D02* -X0009331Y0101873D01* -X0009331Y0103072D02* -X0002568Y0103072D01* -X0002568Y0104270D02* -X0009331Y0104270D01* -X0009331Y0105469D02* -X0002568Y0105469D01* -X0002568Y0106668D02* -X0009331Y0106668D01* -X0009331Y0107866D02* -X0002568Y0107866D01* -X0002568Y0109065D02* -X0009331Y0109065D01* -X0009331Y0110263D02* -X0002568Y0110263D01* -X0002568Y0111462D02* -X0009331Y0111462D01* -X0009331Y0112660D02* -X0002568Y0112660D01* -X0002568Y0113859D02* -X0009331Y0113859D01* -X0009331Y0115057D02* -X0002568Y0115057D01* -X0002568Y0116256D02* -X0009331Y0116256D01* -X0009331Y0117454D02* -X0002568Y0117454D01* -X0002568Y0118653D02* -X0009331Y0118653D01* -X0009331Y0119851D02* -X0002568Y0119851D01* -X0002568Y0121050D02* -X0009331Y0121050D01* -X0009331Y0122248D02* -X0002568Y0122248D01* -X0002568Y0123447D02* -X0009331Y0123447D01* -X0009331Y0124645D02* -X0002568Y0124645D01* -X0002568Y0125844D02* -X0009331Y0125844D01* -X0009331Y0127042D02* -X0002568Y0127042D01* -X0002568Y0128241D02* -X0009331Y0128241D01* -X0009331Y0129439D02* -X0002568Y0129439D01* -X0002568Y0130638D02* -X0009331Y0130638D01* -X0009331Y0131836D02* -X0002568Y0131836D01* -X0002568Y0133035D02* -X0009331Y0133035D01* -X0009331Y0134233D02* -X0002568Y0134233D01* -X0002568Y0135432D02* -X0009331Y0135432D01* -X0009331Y0136630D02* -X0002568Y0136630D01* -X0002568Y0137829D02* -X0009331Y0137829D01* -X0009331Y0139027D02* -X0002568Y0139027D01* -X0002568Y0140226D02* -X0009331Y0140226D01* -X0009331Y0141424D02* -X0002568Y0141424D01* -X0002568Y0142623D02* -X0009331Y0142623D01* -X0009331Y0143821D02* -X0002568Y0143821D01* -X0002568Y0145020D02* -X0009331Y0145020D01* -X0009331Y0146218D02* -X0002568Y0146218D01* -X0002568Y0147417D02* -X0009331Y0147417D01* -X0009331Y0148615D02* -X0002568Y0148615D01* -X0002568Y0149814D02* -X0009331Y0149814D01* -X0009331Y0151012D02* -X0002568Y0151012D01* -X0002568Y0152211D02* -X0009331Y0152211D01* -X0009331Y0153409D02* -X0002568Y0153409D01* -X0002568Y0154608D02* -X0009331Y0154608D01* -X0009331Y0155806D02* -X0002568Y0155806D01* -X0002568Y0157005D02* -X0009331Y0157005D01* -X0009331Y0158203D02* -X0002568Y0158203D01* -X0002568Y0159402D02* -X0009331Y0159402D01* -X0009331Y0160601D02* -X0002568Y0160601D01* -X0002568Y0161799D02* -X0009331Y0161799D01* -X0009331Y0162998D02* -X0002568Y0162998D01* -X0002568Y0164196D02* -X0009331Y0164196D01* -X0009331Y0165395D02* -X0002568Y0165395D01* -X0002568Y0166593D02* -X0009331Y0166593D01* -X0009331Y0167792D02* -X0002568Y0167792D01* -X0002568Y0168990D02* -X0009331Y0168990D01* -X0009331Y0170189D02* -X0002568Y0170189D01* -X0002568Y0171387D02* -X0009331Y0171387D01* -X0009331Y0172586D02* -X0002568Y0172586D01* -X0002568Y0173784D02* -X0009331Y0173784D01* -X0009331Y0174983D02* -X0002568Y0174983D01* -X0002568Y0176181D02* -X0009331Y0176181D01* -X0009331Y0177380D02* -X0002568Y0177380D01* -X0002568Y0178578D02* -X0009331Y0178578D01* -X0009331Y0179777D02* -X0002568Y0179777D01* -X0002568Y0180975D02* -X0009331Y0180975D01* -X0009331Y0182174D02* -X0002568Y0182174D01* -X0002568Y0183372D02* -X0009331Y0183372D01* -X0009331Y0184571D02* -X0002568Y0184571D01* -X0002568Y0185769D02* -X0009331Y0185769D01* -X0009331Y0186968D02* -X0002568Y0186968D01* -X0002568Y0188166D02* -X0009331Y0188166D01* -X0009331Y0189365D02* -X0002568Y0189365D01* -X0002568Y0190563D02* -X0009331Y0190563D01* -X0009331Y0191762D02* -X0002568Y0191762D01* -X0002568Y0192960D02* -X0009331Y0192960D01* -X0009331Y0194159D02* -X0002568Y0194159D01* -X0002568Y0195357D02* -X0009331Y0195357D01* -X0009331Y0196556D02* -X0002568Y0196556D01* -X0002568Y0197754D02* -X0009331Y0197754D01* -X0009331Y0198953D02* -X0002568Y0198953D01* -X0002568Y0200151D02* -X0009331Y0200151D01* -X0009331Y0201350D02* -X0002568Y0201350D01* -X0002568Y0202548D02* -X0009331Y0202548D01* -X0009331Y0203747D02* -X0002568Y0203747D01* -X0002568Y0204945D02* -X0009331Y0204945D01* -X0009331Y0206144D02* -X0002568Y0206144D01* -X0002568Y0207342D02* -X0009331Y0207342D01* -X0009331Y0208541D02* -X0002568Y0208541D01* -X0002568Y0209739D02* -X0009331Y0209739D01* -X0009331Y0210938D02* -X0002568Y0210938D01* -X0002568Y0212137D02* -X0009331Y0212137D01* -X0009331Y0213335D02* -X0002568Y0213335D01* -X0002568Y0214534D02* -X0009331Y0214534D01* -X0009331Y0215732D02* -X0002568Y0215732D01* -X0002568Y0216931D02* -X0009331Y0216931D01* -X0009331Y0218129D02* -X0002568Y0218129D01* -X0002568Y0219328D02* -X0009331Y0219328D01* -X0009331Y0220526D02* -X0002568Y0220526D01* -X0002568Y0221725D02* -X0009344Y0221725D01* -X0009879Y0222923D02* -X0002568Y0222923D01* -X0002568Y0224122D02* -X0011078Y0224122D01* -X0012276Y0225320D02* -X0002568Y0225320D01* -X0002568Y0226519D02* -X0013475Y0226519D01* -X0018937Y0222500D02* -X0015000Y0218563D01* -X0015000Y0095000D01* -X0020000Y0090000D01* -X0068563Y0090000D01* -X0070610Y0092047D01* -X0080059Y0092047D01* -X0080059Y0090079D02* -X0072579Y0090079D01* -X0070000Y0087500D01* -X0027500Y0087500D01* -X0030668Y0084331D02* -X0057079Y0084331D01* -X0056525Y0083961D01* -X0056039Y0083475D01* -X0055657Y0082903D01* -X0055394Y0082268D01* -X0055259Y0081594D01* -X0055259Y0081250D01* -X0055259Y0080906D01* -X0055394Y0080232D01* -X0055657Y0079597D01* -X0056039Y0079025D01* -X0056525Y0078539D01* -X0057097Y0078157D01* -X0057732Y0077894D01* -X0058406Y0077759D01* -X0058750Y0077759D01* -X0059094Y0077759D01* -X0059768Y0077894D01* -X0060403Y0078157D01* -X0060975Y0078539D01* -X0061461Y0079025D01* -X0061843Y0079597D01* -X0062106Y0080232D01* -X0062241Y0080906D01* -X0062241Y0081250D01* -X0062241Y0081594D01* -X0062106Y0082268D01* -X0061843Y0082903D01* -X0061461Y0083475D01* -X0060975Y0083961D01* -X0060421Y0084331D01* -X0069919Y0084331D01* -X0063747Y0078218D01* -X0060867Y0078218D01* -X0059923Y0077827D01* -X0059457Y0077361D01* -X0059355Y0077420D01* -X0058872Y0077550D01* -X0056663Y0077550D01* -X0056663Y0073100D01* -X0055463Y0073100D01* -X0055463Y0077550D01* -X0053254Y0077550D01* -X0052771Y0077420D01* -X0052337Y0077170D01* -X0051984Y0076816D01* -X0051733Y0076383D01* -X0051604Y0075900D01* -X0051604Y0073100D01* -X0055463Y0073100D01* -X0055463Y0071900D01* -X0056663Y0071900D01* -X0056663Y0067450D01* -X0058872Y0067450D01* -X0059355Y0067580D01* -X0059457Y0067639D01* -X0059923Y0067173D01* -X0060769Y0066823D01* -X0060769Y0062872D01* -X0060327Y0062689D01* -X0059604Y0061967D01* -X0059417Y0061515D01* -X0032749Y0061515D01* -X0030668Y0063596D01* -X0030668Y0066132D01* -X0030964Y0066132D01* -X0031908Y0066523D01* -X0032630Y0067246D01* -X0033021Y0068190D01* -X0033021Y0074330D01* -X0032744Y0075000D01* -X0033021Y0075670D01* -X0033021Y0081810D01* -X0032630Y0082754D01* -X0031908Y0083477D01* -X0030964Y0083868D01* -X0030668Y0083868D01* -X0030668Y0084331D01* -X0030668Y0083896D02* -X0056459Y0083896D01* -X0055571Y0082697D02* -X0032654Y0082697D01* -X0033021Y0081499D02* -X0055259Y0081499D01* -X0055259Y0081250D02* -X0058750Y0081250D01* -X0062241Y0081250D01* -X0058750Y0081250D01* -X0058750Y0081250D01* -X0058750Y0077759D01* -X0058750Y0081250D01* -X0058750Y0081250D01* -X0058750Y0081250D01* -X0055259Y0081250D01* -X0055380Y0080300D02* -X0033021Y0080300D01* -X0033021Y0079102D02* -X0055987Y0079102D01* -X0057709Y0077903D02* -X0033021Y0077903D01* -X0033021Y0076705D02* -X0051919Y0076705D01* -X0051604Y0075506D02* -X0032953Y0075506D01* -X0033021Y0074308D02* -X0051604Y0074308D01* -X0051604Y0073109D02* -X0033021Y0073109D01* -X0033021Y0071911D02* -X0055463Y0071911D01* -X0055463Y0071900D02* -X0051604Y0071900D01* -X0051604Y0069100D01* -X0051733Y0068617D01* -X0051984Y0068184D01* -X0052337Y0067830D01* -X0052771Y0067580D01* -X0053254Y0067450D01* -X0055463Y0067450D01* -X0055463Y0071900D01* -X0055463Y0070712D02* -X0056663Y0070712D01* -X0056663Y0069514D02* -X0055463Y0069514D01* -X0055463Y0068315D02* -X0056663Y0068315D01* -X0060059Y0067117D02* -X0032501Y0067117D01* -X0033021Y0068315D02* -X0051908Y0068315D01* -X0051604Y0069514D02* -X0033021Y0069514D01* -X0033021Y0070712D02* -X0051604Y0070712D01* -X0055463Y0073109D02* -X0056663Y0073109D01* -X0056663Y0074308D02* -X0055463Y0074308D01* -X0055463Y0075506D02* -X0056663Y0075506D01* -X0056663Y0076705D02* -X0055463Y0076705D01* -X0058750Y0077903D02* -X0058750Y0077903D01* -X0059791Y0077903D02* -X0060107Y0077903D01* -X0058750Y0079102D02* -X0058750Y0079102D01* -X0058750Y0080300D02* -X0058750Y0080300D01* -X0061513Y0079102D02* -X0064639Y0079102D01* -X0065849Y0080300D02* -X0062120Y0080300D01* -X0062241Y0081499D02* -X0067059Y0081499D01* -X0068269Y0082697D02* -X0061929Y0082697D01* -X0062500Y0083750D02* -X0070000Y0083750D01* -X0074360Y0088110D01* -X0080059Y0088110D01* -X0080059Y0086142D02* -X0076250Y0086142D01* -X0065000Y0075000D01* -X0063937Y0072500D01* -X0063937Y0060846D01* -X0063750Y0058346D01* -X0031437Y0058346D01* -X0027500Y0062283D01* -X0027500Y0071260D01* -X0021979Y0070712D02* -X0002568Y0070712D01* -X0002568Y0069514D02* -X0021979Y0069514D01* -X0021979Y0068315D02* -X0002568Y0068315D01* -X0002568Y0067117D02* -X0022499Y0067117D01* -X0024331Y0065918D02* -X0002568Y0065918D01* -X0002568Y0064720D02* -X0024331Y0064720D01* -X0024331Y0063521D02* -X0002568Y0063521D01* -X0002568Y0062323D02* -X0024331Y0062323D01* -X0024551Y0061124D02* -X0002568Y0061124D01* -X0002568Y0059926D02* -X0025377Y0059926D01* -X0026575Y0058727D02* -X0002568Y0058727D01* -X0002568Y0057529D02* -X0027774Y0057529D01* -X0028972Y0056330D02* -X0002568Y0056330D01* -X0002568Y0055132D02* -X0059436Y0055132D01* -X0059213Y0053933D02* -X0002568Y0053933D01* -X0002568Y0052734D02* -X0059213Y0052734D01* -X0059213Y0051536D02* -X0002568Y0051536D01* -X0002568Y0050337D02* -X0059213Y0050337D01* -X0059213Y0049139D02* -X0002568Y0049139D01* -X0002568Y0047940D02* -X0059697Y0047940D01* -X0063750Y0051654D02* -X0082500Y0051654D01* -X0086437Y0055591D01* -X0086437Y0060000D01* -X0087736Y0060000D01* -X0091673Y0063937D01* -X0091673Y0072559D01* -X0089705Y0072559D02* -X0089705Y0065000D01* -X0077500Y0065000D01* -X0077500Y0060000D01* -X0077963Y0059926D02* -X0068287Y0059926D01* -X0068287Y0061023D02* -X0067896Y0061967D01* -X0067173Y0062689D01* -X0067105Y0062717D01* -X0067105Y0066823D01* -X0067951Y0067173D01* -X0068674Y0067895D01* -X0069065Y0068839D01* -X0069065Y0074566D01* -X0073681Y0079139D01* -X0073681Y0076989D01* -X0074073Y0076045D01* -X0074795Y0075323D01* -X0075739Y0074931D01* -X0076181Y0074931D01* -X0076181Y0070739D01* -X0076573Y0069795D01* -X0077295Y0069073D01* -X0078239Y0068681D01* -X0085029Y0068681D01* -X0085691Y0068019D01* -X0086635Y0067628D01* -X0088505Y0067628D01* -X0088505Y0065718D01* -X0083367Y0065718D01* -X0082423Y0065327D01* -X0081957Y0064861D01* -X0081855Y0064920D01* -X0081372Y0065050D01* -X0079163Y0065050D01* -X0079163Y0060600D01* -X0077963Y0060600D01* -X0077963Y0065050D01* -X0075754Y0065050D01* -X0075271Y0064920D01* -X0074837Y0064670D01* -X0074484Y0064316D01* -X0074233Y0063883D01* -X0074104Y0063400D01* -X0074104Y0060600D01* -X0077963Y0060600D01* -X0077963Y0059400D01* -X0079163Y0059400D01* -X0079163Y0054950D01* -X0081316Y0054950D01* -X0081188Y0054822D01* -X0068083Y0054822D01* -X0068009Y0055000D01* -X0068287Y0055670D01* -X0068287Y0061023D01* -X0068245Y0061124D02* -X0074104Y0061124D01* -X0074104Y0062323D02* -X0067540Y0062323D01* -X0067105Y0063521D02* -X0074136Y0063521D01* -X0073518Y0064144D02* -X0074153Y0064407D01* -X0074725Y0064789D01* -X0075211Y0065275D01* -X0075593Y0065847D01* -X0075856Y0066482D01* -X0075991Y0067156D01* -X0075991Y0067500D01* -X0075991Y0067844D01* -X0075856Y0068518D01* -X0075593Y0069153D01* -X0075211Y0069725D01* -X0074725Y0070211D01* -X0074153Y0070593D01* -X0073518Y0070856D01* -X0072844Y0070991D01* -X0072500Y0070991D01* -X0072156Y0070991D01* -X0071482Y0070856D01* -X0070847Y0070593D01* -X0070275Y0070211D01* -X0069789Y0069725D01* -X0069407Y0069153D01* -X0069144Y0068518D01* -X0069009Y0067844D01* -X0069009Y0067500D01* -X0069009Y0067156D01* -X0069144Y0066482D01* -X0069407Y0065847D01* -X0069789Y0065275D01* -X0070275Y0064789D01* -X0070847Y0064407D01* -X0071482Y0064144D01* -X0072156Y0064009D01* -X0072500Y0064009D01* -X0072844Y0064009D01* -X0073518Y0064144D01* -X0072500Y0064009D02* -X0072500Y0067500D01* -X0075991Y0067500D01* -X0072500Y0067500D01* -X0072500Y0067500D01* -X0072500Y0067500D01* -X0072500Y0070991D01* -X0072500Y0067500D01* -X0072500Y0067500D01* -X0072500Y0067500D01* -X0069009Y0067500D01* -X0072500Y0067500D01* -X0072500Y0064009D01* -X0072500Y0064720D02* -X0072500Y0064720D01* -X0072500Y0065918D02* -X0072500Y0065918D01* -X0072500Y0067117D02* -X0072500Y0067117D01* -X0072500Y0068315D02* -X0072500Y0068315D01* -X0072500Y0069514D02* -X0072500Y0069514D01* -X0072500Y0070712D02* -X0072500Y0070712D01* -X0073866Y0070712D02* -X0076193Y0070712D01* -X0076181Y0071911D02* -X0069065Y0071911D01* -X0069065Y0073109D02* -X0076181Y0073109D01* -X0076181Y0074308D02* -X0069065Y0074308D01* -X0070014Y0075506D02* -X0074611Y0075506D01* -X0073799Y0076705D02* -X0071224Y0076705D01* -X0072434Y0077903D02* -X0073681Y0077903D01* -X0073644Y0079102D02* -X0073681Y0079102D01* -X0069479Y0083896D02* -X0061041Y0083896D01* -X0066063Y0092500D02* -X0021437Y0092500D01* -X0017500Y0096437D01* -X0017500Y0151063D01* -X0021437Y0155000D01* -X0027500Y0155000D01* -X0027500Y0148937D01* -X0033218Y0148615D02* -X0088505Y0148615D01* -X0088505Y0147417D02* -X0087312Y0147417D01* -X0087420Y0147229D02* -X0087170Y0147663D01* -X0086816Y0148016D01* -X0086383Y0148267D01* -X0085900Y0148396D01* -X0083100Y0148396D01* -X0083100Y0144537D01* -X0087550Y0144537D01* -X0087550Y0146746D01* -X0087420Y0147229D01* -X0087550Y0146218D02* -X0088505Y0146218D01* -X0088505Y0145020D02* -X0087550Y0145020D01* -X0088505Y0143821D02* -X0083100Y0143821D01* -X0083100Y0143337D02* -X0083100Y0144537D01* -X0081900Y0144537D01* -X0081900Y0143337D01* -X0077450Y0143337D01* -X0077450Y0141128D01* -X0077580Y0140645D01* -X0077639Y0140543D01* -X0077173Y0140077D01* -X0076782Y0139133D01* -X0076782Y0132993D01* -X0077173Y0132049D01* -X0077895Y0131326D01* -X0078839Y0130935D01* -X0079331Y0130935D01* -X0079331Y0126870D01* -X0079814Y0125705D01* -X0080705Y0124814D01* -X0081870Y0124331D01* -X0084568Y0124331D01* -X0084568Y0121318D01* -X0078239Y0121318D01* -X0077521Y0121021D01* -X0077550Y0121128D01* -X0077550Y0123337D01* -X0073100Y0123337D01* -X0073100Y0124537D01* -X0077550Y0124537D01* -X0077550Y0126746D01* -X0077420Y0127229D01* -X0077170Y0127663D01* -X0076816Y0128016D01* -X0076383Y0128267D01* -X0075900Y0128396D01* -X0073100Y0128396D01* -X0073100Y0124537D01* -X0071900Y0124537D01* -X0071900Y0123337D01* -X0067450Y0123337D01* -X0067450Y0121128D01* -X0067580Y0120645D01* -X0067639Y0120543D01* -X0067173Y0120077D01* -X0066782Y0119133D01* -X0066782Y0115012D01* -X0066249Y0115545D01* -X0065358Y0116436D01* -X0064401Y0116832D01* -X0064264Y0117164D01* -X0063542Y0117886D01* -X0063168Y0118041D01* -X0063168Y0119890D01* -X0063674Y0120395D01* -X0064065Y0121339D01* -X0064065Y0128661D01* -X0063674Y0129605D01* -X0062951Y0130327D01* -X0062007Y0130718D01* -X0055867Y0130718D01* -X0054923Y0130327D01* -X0054457Y0129861D01* -X0054355Y0129920D01* -X0053872Y0130050D01* -X0051663Y0130050D01* -X0051663Y0127741D01* -X0050630Y0128168D01* -X0050463Y0128168D01* -X0050463Y0130050D01* -X0048254Y0130050D01* -X0047771Y0129920D01* -X0047337Y0129670D01* -X0046984Y0129316D01* -X0046733Y0128883D01* -X0046604Y0128400D01* -X0046604Y0125600D01* -X0046831Y0125600D01* -X0046831Y0124400D01* -X0046604Y0124400D01* -X0046604Y0121600D01* -X0046733Y0121117D01* -X0046831Y0120947D01* -X0046831Y0117278D01* -X0046747Y0117229D01* -X0046393Y0116875D01* -X0046143Y0116442D01* -X0046013Y0115959D01* -X0046013Y0113928D01* -X0046831Y0113928D01* -X0046831Y0112765D01* -X0046013Y0112765D01* -X0046013Y0110748D01* -X0045736Y0110471D01* -X0045467Y0109822D01* -X0045433Y0109822D01* -X0045327Y0110077D01* -X0044861Y0110543D01* -X0044920Y0110645D01* -X0045050Y0111128D01* -X0045050Y0113337D01* -X0040600Y0113337D01* -X0040600Y0114537D01* -X0045050Y0114537D01* -X0045050Y0116746D01* -X0044920Y0117229D01* -X0044670Y0117663D01* -X0044316Y0118016D01* -X0043883Y0118267D01* -X0043400Y0118396D01* -X0040600Y0118396D01* -X0040600Y0114537D01* -X0039400Y0114537D01* -X0039400Y0113337D01* -X0034950Y0113337D01* -X0034950Y0111128D01* -X0035080Y0110645D01* -X0035139Y0110543D01* -X0034673Y0110077D01* -X0034282Y0109133D01* -X0034282Y0102993D01* -X0034673Y0102049D01* -X0035395Y0101326D01* -X0036339Y0100935D01* -X0043661Y0100935D01* -X0044605Y0101326D01* -X0045327Y0102049D01* -X0045695Y0102936D01* -X0045736Y0102836D01* -X0046458Y0102114D01* -X0047402Y0101723D01* -X0047501Y0101723D01* -X0047501Y0099291D01* -X0047983Y0098126D01* -X0048874Y0097235D01* -X0050039Y0096753D01* -X0067365Y0096753D01* -X0065286Y0095668D01* -X0022749Y0095668D01* -X0020668Y0097749D01* -X0020668Y0149751D01* -X0021782Y0150864D01* -X0021782Y0145867D01* -X0022173Y0144923D01* -X0022639Y0144457D01* -X0022580Y0144355D01* -X0022450Y0143872D01* -X0022450Y0141663D01* -X0026900Y0141663D01* -X0026900Y0140463D01* -X0022450Y0140463D01* -X0022450Y0138254D01* -X0022580Y0137771D01* -X0022830Y0137337D01* -X0023184Y0136984D01* -X0023617Y0136733D01* -X0024100Y0136604D01* -X0026900Y0136604D01* -X0026900Y0140463D01* -X0028100Y0140463D01* -X0028100Y0141663D01* -X0032550Y0141663D01* -X0032550Y0143872D01* -X0032420Y0144355D01* -X0032361Y0144457D01* -X0032827Y0144923D01* -X0033218Y0145867D01* -X0033218Y0151831D01* -X0079208Y0151831D01* -X0079912Y0151127D01* -X0081591Y0150431D01* -X0083409Y0150431D01* -X0085088Y0151127D01* -X0086373Y0152412D01* -X0087068Y0154091D01* -X0087068Y0155909D01* -X0086872Y0156383D01* -X0088505Y0154751D01* -X0088505Y0130611D01* -X0088366Y0130668D01* -X0085668Y0130668D01* -X0085668Y0130935D01* -X0086161Y0130935D01* -X0087105Y0131326D01* -X0087827Y0132049D01* -X0088218Y0132993D01* -X0088218Y0139133D01* -X0087827Y0140077D01* -X0087361Y0140543D01* -X0087420Y0140645D01* -X0087550Y0141128D01* -X0087550Y0143337D01* -X0083100Y0143337D01* -X0081900Y0143821D02* -X0032550Y0143821D01* -X0032550Y0142623D02* -X0077450Y0142623D01* -X0077450Y0141424D02* -X0028100Y0141424D01* -X0028100Y0140463D02* -X0032550Y0140463D01* -X0032550Y0138254D01* -X0032420Y0137771D01* -X0032170Y0137337D01* -X0031816Y0136984D01* -X0031383Y0136733D01* -X0030900Y0136604D01* -X0028100Y0136604D01* -X0028100Y0140463D01* -X0028100Y0140226D02* -X0026900Y0140226D01* -X0026900Y0141424D02* -X0020668Y0141424D01* -X0020668Y0140226D02* -X0022450Y0140226D01* -X0022450Y0139027D02* -X0020668Y0139027D01* -X0020668Y0137829D02* -X0022564Y0137829D01* -X0024002Y0136630D02* -X0020668Y0136630D01* -X0020668Y0135432D02* -X0069684Y0135432D01* -X0069789Y0135275D02* -X0070275Y0134789D01* -X0070847Y0134407D01* -X0071482Y0134144D01* -X0072156Y0134009D01* -X0072500Y0134009D01* -X0072844Y0134009D01* -X0073518Y0134144D01* -X0074153Y0134407D01* -X0074725Y0134789D01* -X0075211Y0135275D01* -X0075593Y0135847D01* -X0075856Y0136482D01* -X0075991Y0137156D01* -X0075991Y0137500D01* -X0075991Y0137844D01* -X0075856Y0138518D01* -X0075593Y0139153D01* -X0075211Y0139725D01* -X0074725Y0140211D01* -X0074153Y0140593D01* -X0073518Y0140856D01* -X0072844Y0140991D01* -X0072500Y0140991D01* -X0072156Y0140991D01* -X0071482Y0140856D01* -X0070847Y0140593D01* -X0070275Y0140211D01* -X0069789Y0139725D01* -X0069407Y0139153D01* -X0069144Y0138518D01* -X0069009Y0137844D01* -X0069009Y0137500D01* -X0069009Y0137156D01* -X0069144Y0136482D01* -X0069407Y0135847D01* -X0069789Y0135275D01* -X0069114Y0136630D02* -X0030998Y0136630D01* -X0032436Y0137829D02* -X0069009Y0137829D01* -X0069009Y0137500D02* -X0072500Y0137500D01* -X0075991Y0137500D01* -X0072500Y0137500D01* -X0072500Y0137500D01* -X0072500Y0137500D01* -X0072500Y0140991D01* -X0072500Y0137500D01* -X0072500Y0134009D01* -X0072500Y0137500D01* -X0072500Y0137500D01* -X0072500Y0137500D01* -X0069009Y0137500D01* -X0069355Y0139027D02* -X0032550Y0139027D01* -X0032550Y0140226D02* -X0070297Y0140226D01* -X0072500Y0140226D02* -X0072500Y0140226D01* -X0072500Y0139027D02* -X0072500Y0139027D01* -X0072500Y0137829D02* -X0072500Y0137829D01* -X0072500Y0136630D02* -X0072500Y0136630D01* -X0072500Y0135432D02* -X0072500Y0135432D01* -X0072500Y0134233D02* -X0072500Y0134233D01* -X0073735Y0134233D02* -X0076782Y0134233D01* -X0076782Y0133035D02* -X0020668Y0133035D01* -X0020668Y0134233D02* -X0071265Y0134233D01* -X0075316Y0135432D02* -X0076782Y0135432D01* -X0076782Y0136630D02* -X0075886Y0136630D01* -X0075991Y0137829D02* -X0076782Y0137829D01* -X0076782Y0139027D02* -X0075645Y0139027D01* -X0074703Y0140226D02* -X0077322Y0140226D01* -X0077450Y0144537D02* -X0081900Y0144537D01* -X0081900Y0148396D01* -X0079100Y0148396D01* -X0078617Y0148267D01* -X0078184Y0148016D01* -X0077830Y0147663D01* -X0077580Y0147229D01* -X0077450Y0146746D01* -X0077450Y0144537D01* -X0077450Y0145020D02* -X0032867Y0145020D01* -X0033218Y0146218D02* -X0077450Y0146218D01* -X0077688Y0147417D02* -X0033218Y0147417D01* -X0033218Y0149814D02* -X0088505Y0149814D01* -X0088505Y0151012D02* -X0084811Y0151012D01* -X0086172Y0152211D02* -X0088505Y0152211D01* -X0088505Y0153409D02* -X0086786Y0153409D01* -X0087068Y0154608D02* -X0088505Y0154608D01* -X0087449Y0155806D02* -X0087068Y0155806D01* -X0091673Y0156063D02* -X0091673Y0117441D01* -X0089705Y0117441D02* -X0089705Y0145000D01* -X0082500Y0145000D01* -X0081900Y0145020D02* -X0083100Y0145020D01* -X0083100Y0146218D02* -X0081900Y0146218D01* -X0081900Y0147417D02* -X0083100Y0147417D01* -X0080189Y0151012D02* -X0033218Y0151012D01* -X0027500Y0155000D02* -X0082500Y0155000D01* -X0086673Y0161063D02* -X0091673Y0156063D01* -X0093642Y0160000D02* -X0093642Y0117441D01* -X0095610Y0117441D02* -X0095610Y0180000D01* -X0096250Y0181250D01* -X0082500Y0181250D01* -X0082500Y0177500D01* -X0082490Y0176250D01* -X0087618Y0176181D02* -X0090032Y0176181D01* -X0089981Y0176303D02* -X0090936Y0173999D01* -X0092442Y0172493D01* -X0092442Y0165681D01* -X0090437Y0167686D01* -X0089272Y0168168D01* -X0043812Y0168168D01* -X0040668Y0171312D01* -X0040668Y0202400D01* -X0042100Y0202400D01* -X0042100Y0207100D01* -X0042900Y0207100D01* -X0042900Y0202400D01* -X0044331Y0202400D01* -X0044331Y0201870D01* -X0044814Y0200705D01* -X0049814Y0195705D01* -X0050705Y0194814D01* -X0051870Y0194331D01* -X0103688Y0194331D01* -X0106831Y0191188D01* -X0106831Y0166312D01* -X0103688Y0163168D01* -X0100885Y0163168D01* -X0099721Y0162686D01* -X0098830Y0161795D01* -X0098779Y0161744D01* -X0098779Y0171812D01* -X0099801Y0172236D01* -X0101564Y0173999D01* -X0102518Y0176303D01* -X0102518Y0186197D01* -X0101564Y0188501D01* -X0099801Y0190264D01* -X0097497Y0191218D01* -X0095003Y0191218D01* -X0092699Y0190264D01* -X0090936Y0188501D01* -X0089981Y0186197D01* -X0089981Y0184418D01* -X0081870Y0184418D01* -X0080705Y0183936D01* -X0079814Y0183045D01* -X0079331Y0181880D01* -X0079331Y0181735D01* -X0078476Y0181380D01* -X0078118Y0181023D01* -X0077819Y0181103D01* -X0075610Y0181103D01* -X0075610Y0176850D01* -X0074410Y0176850D01* -X0074410Y0181103D01* -X0072201Y0181103D01* -X0071717Y0180973D01* -X0071284Y0180723D01* -X0070930Y0180369D01* -X0070680Y0179936D01* -X0070551Y0179453D01* -X0070551Y0176850D01* -X0074410Y0176850D01* -X0074410Y0175650D01* -X0075610Y0175650D01* -X0075610Y0171397D01* -X0077819Y0171397D01* -X0078118Y0171477D01* -X0078476Y0171120D01* -X0079420Y0170729D01* -X0085560Y0170729D01* -X0086504Y0171120D01* -X0087227Y0171842D01* -X0087618Y0172786D01* -X0087618Y0178081D01* -X0089981Y0178081D01* -X0089981Y0176303D01* -X0089981Y0177380D02* -X0087618Y0177380D01* -X0087618Y0174983D02* -X0090528Y0174983D01* -X0091151Y0173784D02* -X0087618Y0173784D01* -X0087535Y0172586D02* -X0092349Y0172586D01* -X0092442Y0171387D02* -X0086771Y0171387D01* -X0090182Y0167792D02* -X0092442Y0167792D01* -X0092442Y0168990D02* -X0042991Y0168990D01* -X0041792Y0170189D02* -X0092442Y0170189D01* -X0092442Y0166593D02* -X0091530Y0166593D01* -X0088642Y0165000D02* -X0093642Y0160000D01* -X0098779Y0161799D02* -X0098834Y0161799D01* -X0098779Y0162998D02* -X0100473Y0162998D01* -X0098779Y0164196D02* -X0104715Y0164196D01* -X0105914Y0165395D02* -X0098779Y0165395D01* -X0098779Y0166593D02* -X0106831Y0166593D01* -X0106831Y0167792D02* -X0098779Y0167792D01* -X0098779Y0168990D02* -X0106831Y0168990D01* -X0106831Y0170189D02* -X0098779Y0170189D01* -X0098779Y0171387D02* -X0106831Y0171387D01* -X0106831Y0172586D02* -X0100151Y0172586D01* -X0101349Y0173784D02* -X0106831Y0173784D01* -X0106831Y0174983D02* -X0101972Y0174983D01* -X0102468Y0176181D02* -X0106831Y0176181D01* -X0106831Y0177380D02* -X0102518Y0177380D01* -X0102518Y0178578D02* -X0106831Y0178578D01* -X0106831Y0179777D02* -X0102518Y0179777D01* -X0102518Y0180975D02* -X0106831Y0180975D01* -X0106831Y0182174D02* -X0102518Y0182174D01* -X0102518Y0183372D02* -X0106831Y0183372D01* -X0106831Y0184571D02* -X0102518Y0184571D01* -X0102518Y0185769D02* -X0106831Y0185769D01* -X0106831Y0186968D02* -X0102199Y0186968D01* -X0101703Y0188166D02* -X0106831Y0188166D01* -X0106831Y0189365D02* -X0100700Y0189365D01* -X0099079Y0190563D02* -X0106831Y0190563D01* -X0106257Y0191762D02* -X0081775Y0191762D01* -X0081653Y0191843D02* -X0081018Y0192106D01* -X0080344Y0192241D01* -X0080000Y0192241D01* -X0079656Y0192241D01* -X0078982Y0192106D01* -X0078347Y0191843D01* -X0077775Y0191461D01* -X0077289Y0190975D01* -X0076907Y0190403D01* -X0076644Y0189768D01* -X0076509Y0189094D01* -X0076509Y0188750D01* -X0076509Y0188406D01* -X0076644Y0187732D01* -X0076907Y0187097D01* -X0077289Y0186525D01* -X0077775Y0186039D01* -X0078347Y0185657D01* -X0078982Y0185394D01* -X0079656Y0185259D01* -X0080000Y0185259D01* -X0080344Y0185259D01* -X0081018Y0185394D01* -X0081653Y0185657D01* -X0082225Y0186039D01* -X0082711Y0186525D01* -X0083093Y0187097D01* -X0083356Y0187732D01* -X0083491Y0188406D01* -X0083491Y0188750D01* -X0083491Y0189094D01* -X0083356Y0189768D01* -X0083093Y0190403D01* -X0082711Y0190975D01* -X0082225Y0191461D01* -X0081653Y0191843D01* -X0080000Y0191762D02* -X0080000Y0191762D01* -X0080000Y0192241D02* -X0080000Y0188750D01* -X0083491Y0188750D01* -X0080000Y0188750D01* -X0080000Y0188750D01* -X0080000Y0188750D01* -X0080000Y0192241D01* -X0080000Y0190563D02* -X0080000Y0190563D01* -X0080000Y0189365D02* -X0080000Y0189365D01* -X0080000Y0188750D02* -X0080000Y0188750D01* -X0080000Y0185259D01* -X0080000Y0188750D01* -X0080000Y0188750D01* -X0076509Y0188750D01* -X0080000Y0188750D01* -X0080000Y0188166D02* -X0080000Y0188166D01* -X0080000Y0186968D02* -X0080000Y0186968D01* -X0080000Y0185769D02* -X0080000Y0185769D01* -X0081822Y0185769D02* -X0089981Y0185769D01* -X0089981Y0184571D02* -X0040668Y0184571D01* -X0040668Y0185769D02* -X0078178Y0185769D01* -X0076993Y0186968D02* -X0040668Y0186968D01* -X0040668Y0188166D02* -X0076557Y0188166D01* -X0076563Y0189365D02* -X0040668Y0189365D01* -X0040668Y0190563D02* -X0077014Y0190563D01* -X0078225Y0191762D02* -X0040668Y0191762D01* -X0040668Y0192960D02* -X0105059Y0192960D01* -X0103860Y0194159D02* -X0040668Y0194159D01* -X0040668Y0195357D02* -X0050162Y0195357D01* -X0048963Y0196556D02* -X0040668Y0196556D01* -X0040668Y0197754D02* -X0047765Y0197754D01* -X0046566Y0198953D02* -X0040668Y0198953D01* -X0040668Y0200151D02* -X0045368Y0200151D01* -X0044547Y0201350D02* -X0040668Y0201350D01* -X0042100Y0202548D02* -X0042900Y0202548D01* -X0042900Y0203747D02* -X0042100Y0203747D01* -X0042100Y0204945D02* -X0042900Y0204945D01* -X0042900Y0206144D02* -X0042100Y0206144D01* -X0047500Y0202500D02* -X0052500Y0197500D01* -X0105000Y0197500D01* -X0110000Y0192500D01* -X0110000Y0165000D01* -X0105000Y0160000D01* -X0101516Y0160000D01* -X0097579Y0156063D01* -X0097579Y0117441D01* -X0099547Y0117441D02* -X0099547Y0153563D01* -X0103484Y0157500D01* -X0109402Y0157500D01* -X0114402Y0162500D01* -X0114402Y0192500D01* -X0130733Y0198953D02* -X0134267Y0198953D01* -X0132707Y0200151D02* -X0132293Y0200151D01* -X0138098Y0205000D02* -X0138098Y0217500D01* -X0136240Y0217500D01* -X0141368Y0216931D02* -X0153160Y0216931D01* -X0153160Y0216900D02* -X0149301Y0216900D01* -X0149301Y0214297D01* -X0149430Y0213814D01* -X0149680Y0213381D01* -X0150034Y0213027D01* -X0150467Y0212777D01* -X0150951Y0212647D01* -X0153160Y0212647D01* -X0153160Y0216900D01* -X0153160Y0215732D02* -X0154360Y0215732D01* -X0154360Y0214534D02* -X0153160Y0214534D01* -X0153160Y0213335D02* -X0154360Y0213335D01* -X0149726Y0213335D02* -X0141267Y0213335D01* -X0141267Y0212137D02* -X0157789Y0212137D01* -X0159004Y0210938D02* -X0155996Y0210938D01* -X0157338Y0209739D02* -X0157662Y0209739D01* -X0149301Y0214534D02* -X0141368Y0214534D01* -X0141368Y0215732D02* -X0149301Y0215732D01* -X0149301Y0218129D02* -X0141368Y0218129D01* -X0141368Y0219328D02* -X0149301Y0219328D01* -X0149301Y0220526D02* -X0141368Y0220526D01* -X0141053Y0221725D02* -X0149786Y0221725D01* -X0153160Y0221725D02* -X0154360Y0221725D01* -X0154360Y0220526D02* -X0153160Y0220526D01* -X0153160Y0219328D02* -X0154360Y0219328D01* -X0154360Y0218129D02* -X0153160Y0218129D01* -X0157933Y0222923D02* -X0139547Y0222923D01* -X0142193Y0210938D02* -X0147807Y0210938D01* -X0146465Y0209739D02* -X0143535Y0209739D01* -X0143817Y0208541D02* -X0146183Y0208541D01* -X0146183Y0207342D02* -X0143817Y0207342D01* -X0143817Y0206144D02* -X0146183Y0206144D01* -X0166368Y0214534D02* -X0177553Y0214534D01* -X0178751Y0215732D02* -X0166368Y0215732D01* -X0166368Y0216931D02* -X0179231Y0216931D01* -X0179231Y0218129D02* -X0166368Y0218129D01* -X0166368Y0219328D02* -X0179231Y0219328D01* -X0179868Y0220526D02* -X0166368Y0220526D01* -X0166053Y0221725D02* -X0181067Y0221725D01* -X0182265Y0222923D02* -X0164547Y0222923D01* -X0187141Y0224122D02* -X0060359Y0224122D01* -X0059161Y0225320D02* -X0188529Y0225320D01* -X0195000Y0217500D02* -X0190000Y0212500D01* -X0195400Y0207342D02* -X0209009Y0207342D01* -X0209009Y0207500D02* -X0209009Y0207156D01* -X0209144Y0206482D01* -X0209407Y0205847D01* -X0209789Y0205275D01* -X0210275Y0204789D01* -X0210847Y0204407D01* -X0211482Y0204144D01* -X0212156Y0204009D01* -X0212500Y0204009D01* -X0212844Y0204009D01* -X0213518Y0204144D01* -X0214153Y0204407D01* -X0214725Y0204789D01* -X0215211Y0205275D01* -X0215593Y0205847D01* -X0215856Y0206482D01* -X0215991Y0207156D01* -X0215991Y0207500D01* -X0215991Y0207844D01* -X0215856Y0208518D01* -X0215593Y0209153D01* -X0215211Y0209725D01* -X0214725Y0210211D01* -X0214153Y0210593D01* -X0213518Y0210856D01* -X0212844Y0210991D01* -X0212500Y0210991D01* -X0212156Y0210991D01* -X0211482Y0210856D01* -X0210847Y0210593D01* -X0210275Y0210211D01* -X0209789Y0209725D01* -X0209407Y0209153D01* -X0209144Y0208518D01* -X0209009Y0207844D01* -X0209009Y0207500D01* -X0212500Y0207500D01* -X0215991Y0207500D01* -X0212500Y0207500D01* -X0212500Y0207500D01* -X0212500Y0207500D01* -X0212500Y0210991D01* -X0212500Y0207500D01* -X0212500Y0204009D01* -X0212500Y0207500D01* -X0212500Y0207500D01* -X0212500Y0207500D01* -X0209009Y0207500D01* -X0209153Y0208541D02* -X0200100Y0208541D01* -X0199973Y0209739D02* -X0209803Y0209739D01* -X0211892Y0210938D02* -X0198774Y0210938D01* -X0197794Y0212137D02* -X0269959Y0212137D01* -X0269950Y0210938D02* -X0213108Y0210938D01* -X0212500Y0210938D02* -X0212500Y0210938D01* -X0212500Y0209739D02* -X0212500Y0209739D01* -X0212500Y0208541D02* -X0212500Y0208541D01* -X0212500Y0207342D02* -X0212500Y0207342D01* -X0212500Y0206144D02* -X0212500Y0206144D01* -X0212500Y0204945D02* -X0212500Y0204945D01* -X0214882Y0204945D02* -X0226023Y0204945D01* -X0226044Y0205025D02* -X0225915Y0204541D01* -X0225915Y0202609D01* -X0233631Y0202609D01* -X0233631Y0206191D01* -X0227565Y0206191D01* -X0227082Y0206062D01* -X0226648Y0205812D01* -X0226295Y0205458D01* -X0226044Y0205025D01* -X0225915Y0203747D02* -X0198459Y0203747D01* -X0197261Y0202548D02* -X0233631Y0202548D01* -X0234597Y0202548D02* -X0260403Y0202548D01* -X0260886Y0202126D02* -X0270000Y0202126D01* -X0269085Y0203747D02* -X0286132Y0203747D01* -X0286132Y0204945D02* -X0279732Y0204945D01* -X0280050Y0206144D02* -X0286132Y0206144D01* -X0286132Y0207342D02* -X0280050Y0207342D01* -X0275600Y0206144D02* -X0274400Y0206144D01* -X0274400Y0204945D02* -X0275600Y0204945D01* -X0274400Y0208541D02* -X0215847Y0208541D01* -X0215991Y0207342D02* -X0269950Y0207342D01* -X0269950Y0206144D02* -X0267612Y0206144D01* -X0268977Y0204945D02* -X0270268Y0204945D01* -X0269950Y0209739D02* -X0215197Y0209739D01* -X0215716Y0206144D02* -X0227388Y0206144D01* -X0225915Y0201350D02* -X0193168Y0201350D01* -X0193168Y0200151D02* -X0225915Y0200151D01* -X0226203Y0198953D02* -X0193168Y0198953D01* -X0193168Y0197754D02* -X0286132Y0197754D01* -X0286132Y0196556D02* -X0193168Y0196556D01* -X0193168Y0195357D02* -X0286132Y0195357D01* -X0286132Y0194159D02* -X0193168Y0194159D01* -X0193168Y0192960D02* -X0286132Y0192960D01* -X0286132Y0191762D02* -X0193168Y0191762D01* -X0193168Y0190563D02* -X0286132Y0190563D01* -X0286132Y0189365D02* -X0193168Y0189365D01* -X0193168Y0188166D02* -X0286132Y0188166D01* -X0286132Y0186968D02* -X0193168Y0186968D01* -X0193168Y0185769D02* -X0286132Y0185769D01* -X0286132Y0184571D02* -X0193168Y0184571D01* -X0186831Y0184571D02* -X0176208Y0184571D01* -X0177750Y0185769D02* -X0186831Y0185769D01* -X0186831Y0186968D02* -X0178949Y0186968D01* -X0180147Y0188166D02* -X0186831Y0188166D01* -X0186831Y0189365D02* -X0181346Y0189365D01* -X0182544Y0190563D02* -X0186831Y0190563D01* -X0186831Y0191762D02* -X0183124Y0191762D01* -X0183168Y0192960D02* -X0186831Y0192960D01* -X0186831Y0194159D02* -X0183168Y0194159D01* -X0183168Y0195357D02* -X0186831Y0195357D01* -X0186831Y0196556D02* -X0183168Y0196556D01* -X0183168Y0197754D02* -X0186831Y0197754D01* -X0194600Y0202548D02* -X0195400Y0202548D01* -X0195400Y0202400D02* -X0197112Y0202400D01* -X0200100Y0205388D01* -X0200100Y0207100D01* -X0195400Y0207100D01* -X0195400Y0202400D01* -X0195400Y0203747D02* -X0194600Y0203747D01* -X0194600Y0204945D02* -X0195400Y0204945D01* -X0195400Y0206144D02* -X0194600Y0206144D01* -X0199658Y0204945D02* -X0210118Y0204945D01* -X0209284Y0206144D02* -X0200100Y0206144D01* -X0198993Y0213335D02* -X0226834Y0213335D01* -X0225522Y0214534D02* -X0200191Y0214534D01* -X0200768Y0215732D02* -X0225246Y0215732D01* -X0225246Y0216931D02* -X0200768Y0216931D01* -X0200768Y0218129D02* -X0225246Y0218129D01* -X0225246Y0219328D02* -X0200768Y0219328D01* -X0233631Y0206144D02* -X0234597Y0206144D01* -X0234597Y0204945D02* -X0233631Y0204945D01* -X0233631Y0203747D02* -X0234597Y0203747D01* -X0234597Y0201350D02* -X0233631Y0201350D01* -X0233631Y0200151D02* -X0234597Y0200151D01* -X0234597Y0198953D02* -X0233631Y0198953D01* -X0241395Y0213335D02* -X0253605Y0213335D01* -X0252293Y0214534D02* -X0242707Y0214534D01* -X0242361Y0221725D02* -X0252639Y0221725D01* -X0237283Y0222923D02* -X0286132Y0222923D01* -X0286132Y0224122D02* -X0236872Y0224122D01* -X0235585Y0225320D02* -X0286132Y0225320D01* -X0286132Y0226519D02* -X0057962Y0226519D01* -X0057686Y0226795D02* -X0057686Y0226795D01* -X0052500Y0217500D02* -X0057500Y0212500D01* -X0052500Y0217500D02* -X0047500Y0222500D01* -X0018937Y0222500D01* -X0022500Y0217500D02* -X0027500Y0212500D01* -X0027500Y0166063D01* -X0032500Y0161063D01* -X0086673Y0161063D01* -X0088642Y0165000D02* -X0042500Y0165000D01* -X0037500Y0170000D01* -X0037500Y0212500D01* -X0032500Y0217500D01* -X0042500Y0217500D02* -X0047500Y0212500D01* -X0047500Y0202500D01* -X0034331Y0202400D02* -X0034331Y0169370D01* -X0034814Y0168205D01* -X0038788Y0164231D01* -X0033812Y0164231D01* -X0030668Y0167375D01* -X0030668Y0202400D01* -X0032100Y0202400D01* -X0032100Y0207100D01* -X0032900Y0207100D01* -X0032900Y0202400D01* -X0034331Y0202400D01* -X0034331Y0201350D02* -X0030668Y0201350D01* -X0030668Y0200151D02* -X0034331Y0200151D01* -X0034331Y0198953D02* -X0030668Y0198953D01* -X0030668Y0197754D02* -X0034331Y0197754D01* -X0034331Y0196556D02* -X0030668Y0196556D01* -X0030668Y0195357D02* -X0034331Y0195357D01* -X0034331Y0194159D02* -X0030668Y0194159D01* -X0030668Y0192960D02* -X0034331Y0192960D01* -X0034331Y0191762D02* -X0030668Y0191762D01* -X0030668Y0190563D02* -X0034331Y0190563D01* -X0034331Y0189365D02* -X0030668Y0189365D01* -X0030668Y0188166D02* -X0034331Y0188166D01* -X0034331Y0186968D02* -X0030668Y0186968D01* -X0030668Y0185769D02* -X0034331Y0185769D01* -X0034331Y0184571D02* -X0030668Y0184571D01* -X0030668Y0183372D02* -X0034331Y0183372D01* -X0034331Y0182174D02* -X0030668Y0182174D01* -X0030668Y0180975D02* -X0034331Y0180975D01* -X0034331Y0179777D02* -X0030668Y0179777D01* -X0030668Y0178578D02* -X0034331Y0178578D01* -X0034331Y0177380D02* -X0030668Y0177380D01* -X0030668Y0176181D02* -X0034331Y0176181D01* -X0034331Y0174983D02* -X0030668Y0174983D01* -X0030668Y0173784D02* -X0034331Y0173784D01* -X0034331Y0172586D02* -X0030668Y0172586D01* -X0030668Y0171387D02* -X0034331Y0171387D01* -X0034331Y0170189D02* -X0030668Y0170189D01* -X0030668Y0168990D02* -X0034489Y0168990D01* -X0035227Y0167792D02* -X0030668Y0167792D01* -X0031451Y0166593D02* -X0036426Y0166593D01* -X0037624Y0165395D02* -X0032649Y0165395D01* -X0028482Y0160601D02* -X0018168Y0160601D01* -X0018168Y0161799D02* -X0027283Y0161799D01* -X0026084Y0162998D02* -X0018168Y0162998D01* -X0018168Y0164196D02* -X0024886Y0164196D01* -X0024814Y0164268D02* -X0029814Y0159268D01* -X0030705Y0158377D01* -X0031208Y0158168D01* -X0028130Y0158168D01* -X0020807Y0158168D01* -X0019642Y0157686D01* -X0018751Y0156795D01* -X0018168Y0156212D01* -X0018168Y0204619D01* -X0020388Y0202400D01* -X0022100Y0202400D01* -X0022100Y0207100D01* -X0022900Y0207100D01* -X0022900Y0202400D01* -X0024331Y0202400D01* -X0024331Y0165433D01* -X0024814Y0164268D01* -X0024347Y0165395D02* -X0018168Y0165395D01* -X0018168Y0166593D02* -X0024331Y0166593D01* -X0024331Y0167792D02* -X0018168Y0167792D01* -X0018168Y0168990D02* -X0024331Y0168990D01* -X0024331Y0170189D02* -X0018168Y0170189D01* -X0018168Y0171387D02* -X0024331Y0171387D01* -X0024331Y0172586D02* -X0018168Y0172586D01* -X0018168Y0173784D02* -X0024331Y0173784D01* -X0024331Y0174983D02* -X0018168Y0174983D01* -X0018168Y0176181D02* -X0024331Y0176181D01* -X0024331Y0177380D02* -X0018168Y0177380D01* -X0018168Y0178578D02* -X0024331Y0178578D01* -X0024331Y0179777D02* -X0018168Y0179777D01* -X0018168Y0180975D02* -X0024331Y0180975D01* -X0024331Y0182174D02* -X0018168Y0182174D01* -X0018168Y0183372D02* -X0024331Y0183372D01* -X0024331Y0184571D02* -X0018168Y0184571D01* -X0018168Y0185769D02* -X0024331Y0185769D01* -X0024331Y0186968D02* -X0018168Y0186968D01* -X0018168Y0188166D02* -X0024331Y0188166D01* -X0024331Y0189365D02* -X0018168Y0189365D01* -X0018168Y0190563D02* -X0024331Y0190563D01* -X0024331Y0191762D02* -X0018168Y0191762D01* -X0018168Y0192960D02* -X0024331Y0192960D01* -X0024331Y0194159D02* -X0018168Y0194159D01* -X0018168Y0195357D02* -X0024331Y0195357D01* -X0024331Y0196556D02* -X0018168Y0196556D01* -X0018168Y0197754D02* -X0024331Y0197754D01* -X0024331Y0198953D02* -X0018168Y0198953D01* -X0018168Y0200151D02* -X0024331Y0200151D01* -X0024331Y0201350D02* -X0018168Y0201350D01* -X0018168Y0202548D02* -X0020239Y0202548D01* -X0019041Y0203747D02* -X0018168Y0203747D01* -X0022100Y0203747D02* -X0022900Y0203747D01* -X0022900Y0204945D02* -X0022100Y0204945D01* -X0022100Y0206144D02* -X0022900Y0206144D01* -X0022900Y0202548D02* -X0022100Y0202548D01* -X0032100Y0202548D02* -X0032900Y0202548D01* -X0032900Y0203747D02* -X0032100Y0203747D01* -X0032100Y0204945D02* -X0032900Y0204945D01* -X0032900Y0206144D02* -X0032100Y0206144D01* -X0040668Y0183372D02* -X0080141Y0183372D01* -X0079453Y0182174D02* -X0040668Y0182174D01* -X0040668Y0180975D02* -X0071725Y0180975D01* -X0070638Y0179777D02* -X0040668Y0179777D01* -X0040668Y0178578D02* -X0070551Y0178578D01* -X0070551Y0177380D02* -X0040668Y0177380D01* -X0040668Y0176181D02* -X0074410Y0176181D01* -X0074410Y0175650D02* -X0070551Y0175650D01* -X0070551Y0173047D01* -X0070680Y0172564D01* -X0070930Y0172131D01* -X0071284Y0171777D01* -X0071717Y0171527D01* -X0072201Y0171397D01* -X0074410Y0171397D01* -X0074410Y0175650D01* -X0074410Y0174983D02* -X0075610Y0174983D01* -X0075610Y0173784D02* -X0074410Y0173784D01* -X0074410Y0172586D02* -X0075610Y0172586D01* -X0078209Y0171387D02* -X0040668Y0171387D01* -X0040668Y0172586D02* -X0070674Y0172586D01* -X0070551Y0173784D02* -X0040668Y0173784D01* -X0040668Y0174983D02* -X0070551Y0174983D01* -X0074410Y0177380D02* -X0075610Y0177380D01* -X0075610Y0178578D02* -X0074410Y0178578D01* -X0074410Y0179777D02* -X0075610Y0179777D01* -X0075610Y0180975D02* -X0074410Y0180975D01* -X0083007Y0186968D02* -X0090301Y0186968D01* -X0090797Y0188166D02* -X0083443Y0188166D01* -X0083437Y0189365D02* -X0091800Y0189365D01* -X0093421Y0190563D02* -X0082986Y0190563D01* -X0120493Y0151012D02* -X0174552Y0151012D01* -X0193168Y0151012D02* -X0194552Y0151012D01* -X0193514Y0149814D02* -X0193168Y0149814D01* -X0193168Y0152211D02* -X0211553Y0152211D01* -X0210933Y0153409D02* -X0199563Y0153409D01* -X0201069Y0154608D02* -X0209734Y0154608D01* -X0209231Y0155806D02* -X0201743Y0155806D01* -X0202068Y0157005D02* -X0209231Y0157005D01* -X0209231Y0158203D02* -X0202068Y0158203D01* -X0195941Y0161799D02* -X0193168Y0161799D01* -X0194327Y0153409D02* -X0195437Y0153409D01* -X0200448Y0151012D02* -X0210355Y0151012D01* -X0209231Y0149814D02* -X0201486Y0149814D01* -X0201983Y0148615D02* -X0209231Y0148615D01* -X0209231Y0147417D02* -X0202068Y0147417D01* -X0201914Y0146218D02* -X0209231Y0146218D01* -X0209322Y0145020D02* -X0201418Y0145020D01* -X0200668Y0143821D02* -X0210521Y0143821D01* -X0211719Y0142623D02* -X0200668Y0142623D01* -X0200668Y0141424D02* -X0240926Y0141424D01* -X0240926Y0140226D02* -X0200668Y0140226D01* -X0200668Y0139027D02* -X0240926Y0139027D01* -X0240926Y0137829D02* -X0227049Y0137829D01* -X0228103Y0136630D02* -X0240976Y0136630D01* -X0241694Y0135432D02* -X0228473Y0135432D01* -X0225000Y0135432D02* -X0225000Y0135432D01* -X0225000Y0136630D02* -X0225000Y0136630D01* -X0225000Y0137829D02* -X0225000Y0137829D01* -X0222951Y0137829D02* -X0200668Y0137829D01* -X0200668Y0136630D02* -X0221897Y0136630D01* -X0221527Y0135432D02* -X0200668Y0135432D01* -X0200668Y0134233D02* -X0221594Y0134233D01* -X0222115Y0133035D02* -X0200668Y0133035D01* -X0194331Y0133035D02* -X0193426Y0133035D01* -X0194184Y0131836D02* -X0194331Y0131836D01* -X0194331Y0134233D02* -X0191718Y0134233D01* -X0200668Y0124645D02* -X0237235Y0124645D01* -X0236629Y0123447D02* -X0200668Y0123447D01* -X0200230Y0122248D02* -X0236509Y0122248D01* -X0236823Y0121050D02* -X0199094Y0121050D01* -X0197895Y0119851D02* -X0237712Y0119851D01* -X0240000Y0123447D02* -X0240000Y0123447D01* -X0240000Y0124645D02* -X0240000Y0124645D01* -X0250806Y0135432D02* -X0252944Y0135432D01* -X0247500Y0140000D02* -X0246250Y0140020D01* -X0240926Y0142623D02* -X0228281Y0142623D01* -X0229479Y0143821D02* -X0241147Y0143821D01* -X0242200Y0145020D02* -X0230678Y0145020D01* -X0221719Y0142623D02* -X0218281Y0142623D01* -X0219479Y0143821D02* -X0220521Y0143821D01* -X0225000Y0134233D02* -X0225000Y0134233D01* -X0225000Y0133035D02* -X0225000Y0133035D01* -X0223740Y0107500D02* -X0232500Y0107500D01* -X0235000Y0105000D01* -X0255157Y0105000D01* -X0255157Y0101850D02* -X0236437Y0101850D01* -X0266910Y0070712D02* -X0268110Y0070712D01* -X0268110Y0069514D02* -X0266910Y0069514D01* -X0266910Y0068315D02* -X0268110Y0068315D01* -X0213124Y0061124D02* -X0171268Y0061124D01* -X0163731Y0061124D02* -X0133396Y0061124D01* -X0133396Y0059400D02* -X0129537Y0059400D01* -X0129537Y0054950D01* -X0131746Y0054950D01* -X0132229Y0055080D01* -X0132663Y0055330D01* -X0133016Y0055684D01* -X0133267Y0056117D01* -X0133396Y0056600D01* -X0133396Y0059400D01* -X0133396Y0058727D02* -X0163731Y0058727D01* -X0163731Y0057529D02* -X0133396Y0057529D01* -X0133324Y0056330D02* -X0163731Y0056330D01* -X0163731Y0055132D02* -X0132319Y0055132D01* -X0129537Y0055132D02* -X0128337Y0055132D01* -X0128337Y0056330D02* -X0129537Y0056330D01* -X0129537Y0057529D02* -X0128337Y0057529D01* -X0128337Y0058727D02* -X0129537Y0058727D01* -X0129537Y0059926D02* -X0163731Y0059926D01* -X0163731Y0062323D02* -X0140227Y0062323D01* -X0143337Y0063521D02* -X0144537Y0063521D01* -X0144537Y0062450D02* -X0146746Y0062450D01* -X0147229Y0062580D01* -X0147663Y0062830D01* -X0148016Y0063184D01* -X0148267Y0063617D01* -X0148396Y0064100D01* -X0148396Y0066900D01* -X0144537Y0066900D01* -X0144537Y0062450D01* -X0144537Y0064720D02* -X0143337Y0064720D01* -X0143337Y0065918D02* -X0144537Y0065918D01* -X0144537Y0067117D02* -X0163731Y0067117D01* -X0163731Y0068315D02* -X0148396Y0068315D01* -X0148396Y0069514D02* -X0163731Y0069514D01* -X0163731Y0070712D02* -X0148396Y0070712D01* -X0148396Y0065918D02* -X0163731Y0065918D01* -X0163731Y0064720D02* -X0148396Y0064720D01* -X0148211Y0063521D02* -X0163731Y0063521D01* -X0163731Y0053933D02* -X0112558Y0053933D01* -X0112558Y0055132D02* -X0116590Y0055132D01* -X0115939Y0056330D02* -X0112558Y0056330D01* -X0112558Y0057529D02* -X0113286Y0057529D01* -X0115295Y0060000D02* -X0121063Y0060000D01* -X0122500Y0060000D01* -X0125536Y0055132D02* -X0125555Y0055132D01* -X0118760Y0047500D02* -X0113327Y0047500D01* -X0109390Y0051437D01* -X0109390Y0072559D01* -X0115295Y0072559D02* -X0115295Y0060000D01* -X0114998Y0052734D02* -X0112573Y0052734D01* -X0113772Y0051536D02* -X0113869Y0051536D01* -X0110802Y0045543D02* -X0110590Y0045543D01* -X0110590Y0044345D02* -X0112664Y0044345D01* -X0114001Y0043146D02* -X0110590Y0043146D01* -X0118712Y0034331D02* -X0124751Y0034331D01* -X0126831Y0032251D01* -X0126831Y0027881D01* -X0124612Y0030100D01* -X0122900Y0030100D01* -X0122900Y0025400D01* -X0122100Y0025400D01* -X0122100Y0030100D01* -X0120668Y0030100D01* -X0120668Y0031693D01* -X0120186Y0032858D01* -X0118712Y0034331D01* -X0119486Y0033558D02* -X0125524Y0033558D01* -X0126722Y0032360D02* -X0120392Y0032360D01* -X0120668Y0031161D02* -X0126831Y0031161D01* -X0126831Y0029963D02* -X0124750Y0029963D01* -X0125948Y0028764D02* -X0126831Y0028764D01* -X0122900Y0028764D02* -X0122100Y0028764D01* -X0122100Y0027566D02* -X0122900Y0027566D01* -X0122900Y0026367D02* -X0122100Y0026367D01* -X0122100Y0029963D02* -X0122900Y0029963D01* -X0113982Y0030100D02* -X0112251Y0031831D01* -X0108759Y0031831D01* -X0108679Y0031865D01* -X0110186Y0030358D01* -X0110321Y0030033D01* -X0110388Y0030100D01* -X0112100Y0030100D01* -X0112100Y0025400D01* -X0112900Y0025400D01* -X0112900Y0030100D01* -X0113982Y0030100D01* -X0112900Y0029963D02* -X0112100Y0029963D01* -X0112100Y0028764D02* -X0112900Y0028764D01* -X0112900Y0027566D02* -X0112100Y0027566D01* -X0112100Y0026367D02* -X0112900Y0026367D01* -X0112921Y0031161D02* -X0109383Y0031161D01* -X0094410Y0031161D02* -X0090668Y0031161D01* -X0090668Y0030100D02* -X0090668Y0042251D01* -X0093065Y0044647D01* -X0093468Y0044814D01* -X0094410Y0045756D01* -X0094410Y0030100D01* -X0092900Y0030100D01* -X0092900Y0025400D01* -X0092100Y0025400D01* -X0092100Y0030100D01* -X0090668Y0030100D01* -X0092100Y0029963D02* -X0092900Y0029963D01* -X0092900Y0028764D02* -X0092100Y0028764D01* -X0092100Y0027566D02* -X0092900Y0027566D01* -X0092900Y0026367D02* -X0092100Y0026367D01* -X0090668Y0032360D02* -X0094410Y0032360D01* -X0094410Y0033558D02* -X0090668Y0033558D01* -X0090668Y0034757D02* -X0094410Y0034757D01* -X0094410Y0035955D02* -X0090668Y0035955D01* -X0090668Y0037154D02* -X0094410Y0037154D01* -X0094410Y0038352D02* -X0090668Y0038352D01* -X0090668Y0039551D02* -X0094410Y0039551D01* -X0094410Y0040749D02* -X0090668Y0040749D01* -X0090668Y0041948D02* -X0094410Y0041948D01* -X0094410Y0043146D02* -X0091564Y0043146D01* -X0092763Y0044345D02* -X0094410Y0044345D01* -X0094410Y0045543D02* -X0094198Y0045543D01* -X0090008Y0050337D02* -X0085665Y0050337D01* -X0084466Y0049139D02* -X0088595Y0049139D01* -X0087397Y0047940D02* -X0067803Y0047940D01* -X0068064Y0055132D02* -X0075181Y0055132D01* -X0075271Y0055080D02* -X0075754Y0054950D01* -X0077963Y0054950D01* -X0077963Y0059400D01* -X0074104Y0059400D01* -X0074104Y0056600D01* -X0074233Y0056117D01* -X0074484Y0055684D01* -X0074837Y0055330D01* -X0075271Y0055080D01* -X0074176Y0056330D02* -X0068287Y0056330D01* -X0068287Y0057529D02* -X0074104Y0057529D01* -X0074104Y0058727D02* -X0068287Y0058727D01* -X0060769Y0063521D02* -X0030743Y0063521D01* -X0030668Y0064720D02* -X0060769Y0064720D01* -X0060769Y0065918D02* -X0030668Y0065918D01* -X0031942Y0062323D02* -X0059960Y0062323D01* -X0067105Y0064720D02* -X0070378Y0064720D01* -X0069377Y0065918D02* -X0067105Y0065918D01* -X0067815Y0067117D02* -X0069017Y0067117D01* -X0069103Y0068315D02* -X0068847Y0068315D01* -X0069065Y0069514D02* -X0069647Y0069514D01* -X0069065Y0070712D02* -X0071134Y0070712D01* -X0075353Y0069514D02* -X0076854Y0069514D01* -X0075897Y0068315D02* -X0085395Y0068315D01* -X0088505Y0067117D02* -X0075983Y0067117D01* -X0075623Y0065918D02* -X0088505Y0065918D01* -X0092143Y0059926D02* -X0092442Y0059926D01* -X0092442Y0058727D02* -X0091565Y0058727D01* -X0091565Y0057529D02* -X0092442Y0057529D01* -X0092442Y0056330D02* -X0091561Y0056330D01* -X0090910Y0055132D02* -X0092442Y0055132D01* -X0092442Y0053933D02* -X0089180Y0053933D01* -X0088062Y0052734D02* -X0092427Y0052734D01* -X0091228Y0051536D02* -X0086863Y0051536D01* -X0086198Y0046742D02* -X0002568Y0046742D01* -X0002568Y0045543D02* -X0084999Y0045543D01* -X0084394Y0044345D02* -X0002568Y0044345D01* -X0002568Y0043146D02* -X0084331Y0043146D01* -X0084331Y0041948D02* -X0002568Y0041948D01* -X0002568Y0040749D02* -X0084331Y0040749D01* -X0084331Y0039551D02* -X0002568Y0039551D01* -X0002568Y0038352D02* -X0084331Y0038352D01* -X0084331Y0037154D02* -X0002568Y0037154D01* -X0002568Y0035955D02* -X0084331Y0035955D01* -X0084331Y0034757D02* -X0002568Y0034757D01* -X0002568Y0033558D02* -X0084331Y0033558D01* -X0084331Y0032360D02* -X0002568Y0032360D01* -X0002568Y0031161D02* -X0084331Y0031161D01* -X0082900Y0029963D02* -X0082100Y0029963D01* -X0082100Y0028764D02* -X0082900Y0028764D01* -X0082900Y0027566D02* -X0082100Y0027566D01* -X0082100Y0026367D02* -X0082900Y0026367D01* -X0082100Y0025169D02* -X0002568Y0025169D01* -X0002568Y0026367D02* -X0077400Y0026367D01* -X0077853Y0027566D02* -X0002568Y0027566D01* -X0002568Y0028764D02* -X0079052Y0028764D01* -X0080250Y0029963D02* -X0002568Y0029963D01* -X0002568Y0023970D02* -X0077400Y0023970D01* -X0077516Y0022772D02* -X0002568Y0022772D01* -X0002568Y0021573D02* -X0078714Y0021573D01* -X0079717Y0020375D02* -X0002568Y0020375D01* -X0002568Y0019176D02* -X0078518Y0019176D01* -X0077320Y0017978D02* -X0002568Y0017978D01* -X0002568Y0016779D02* -X0076731Y0016779D01* -X0076731Y0015581D02* -X0002568Y0015581D01* -X0002568Y0014382D02* -X0076731Y0014382D01* -X0076731Y0013184D02* -X0002568Y0013184D01* -X0002568Y0011985D02* -X0077357Y0011985D01* -X0078555Y0010787D02* -X0002568Y0010787D01* -X0002568Y0009588D02* -X0079754Y0009588D01* -X0079163Y0055132D02* -X0077963Y0055132D01* -X0077963Y0056330D02* -X0079163Y0056330D01* -X0079163Y0057529D02* -X0077963Y0057529D01* -X0077963Y0058727D02* -X0079163Y0058727D01* -X0079163Y0061124D02* -X0077963Y0061124D01* -X0077963Y0062323D02* -X0079163Y0062323D01* -X0079163Y0063521D02* -X0077963Y0063521D01* -X0077963Y0064720D02* -X0079163Y0064720D01* -X0074923Y0064720D02* -X0074622Y0064720D01* -X0100000Y0086142D02* -X0117264Y0086142D01* -X0117264Y0072559D01* -X0117264Y0067500D01* -X0127500Y0067500D01* -X0136063Y0067500D01* -X0137036Y0050337D02* -X0163731Y0050337D01* -X0163778Y0049139D02* -X0138099Y0049139D01* -X0138471Y0047940D02* -X0164274Y0047940D01* -X0165518Y0046742D02* -X0138408Y0046742D01* -X0129872Y0088690D02* -X0194782Y0088690D01* -X0193583Y0089888D02* -X0129872Y0089888D01* -X0124941Y0097953D02* -X0190000Y0097953D01* -X0162500Y0122500D02* -X0161240Y0122500D01* -X0088505Y0130638D02* -X0088441Y0130638D01* -X0088505Y0131836D02* -X0087614Y0131836D01* -X0088218Y0133035D02* -X0088505Y0133035D01* -X0088505Y0134233D02* -X0088218Y0134233D01* -X0088218Y0135432D02* -X0088505Y0135432D01* -X0088505Y0136630D02* -X0088218Y0136630D01* -X0088218Y0137829D02* -X0088505Y0137829D01* -X0088505Y0139027D02* -X0088218Y0139027D01* -X0088505Y0140226D02* -X0087678Y0140226D01* -X0087550Y0141424D02* -X0088505Y0141424D01* -X0088505Y0142623D02* -X0087550Y0142623D01* -X0082500Y0136063D02* -X0082500Y0127500D01* -X0087736Y0127500D01* -X0087736Y0117441D01* -X0087500Y0117500D02* -X0087500Y0110000D01* -X0080059Y0109764D02* -X0075000Y0109764D01* -X0072500Y0112264D01* -X0072500Y0116063D01* -X0066782Y0116256D02* -X0065538Y0116256D01* -X0066737Y0115057D02* -X0066782Y0115057D01* -X0066782Y0117454D02* -X0063974Y0117454D01* -X0063168Y0118653D02* -X0066782Y0118653D01* -X0067079Y0119851D02* -X0063168Y0119851D01* -X0063944Y0121050D02* -X0067471Y0121050D01* -X0067450Y0122248D02* -X0064065Y0122248D01* -X0064065Y0123447D02* -X0071900Y0123447D01* -X0071900Y0124537D02* -X0067450Y0124537D01* -X0067450Y0126746D01* -X0067580Y0127229D01* -X0067830Y0127663D01* -X0068184Y0128016D01* -X0068617Y0128267D01* -X0069100Y0128396D01* -X0071900Y0128396D01* -X0071900Y0124537D01* -X0071900Y0124645D02* -X0073100Y0124645D01* -X0073100Y0123447D02* -X0084568Y0123447D01* -X0084568Y0122248D02* -X0077550Y0122248D01* -X0077529Y0121050D02* -X0077590Y0121050D01* -X0077550Y0124645D02* -X0081112Y0124645D01* -X0079756Y0125844D02* -X0077550Y0125844D01* -X0077470Y0127042D02* -X0079331Y0127042D01* -X0079331Y0128241D02* -X0076428Y0128241D01* -X0079331Y0129439D02* -X0063742Y0129439D01* -X0064065Y0128241D02* -X0068572Y0128241D01* -X0067530Y0127042D02* -X0064065Y0127042D01* -X0064065Y0125844D02* -X0067450Y0125844D01* -X0067450Y0124645D02* -X0064065Y0124645D01* -X0060000Y0125000D02* -X0060000Y0113750D01* -X0060000Y0112500D01* -X0060000Y0113750D02* -X0063563Y0113750D01* -X0075423Y0101890D01* -X0080059Y0101890D01* -X0080059Y0099921D02* -X0050669Y0099921D01* -X0050669Y0106654D01* -X0040000Y0106654D01* -X0040000Y0106063D01* -X0045141Y0110263D02* -X0045650Y0110263D01* -X0046013Y0111462D02* -X0045050Y0111462D01* -X0045050Y0112660D02* -X0046013Y0112660D01* -X0046831Y0113859D02* -X0040600Y0113859D01* -X0040000Y0113937D02* -X0040000Y0113346D01* -X0050669Y0113346D01* -X0050000Y0112500D02* -X0050000Y0125000D01* -X0046831Y0124645D02* -X0043488Y0124645D01* -X0043491Y0124656D02* -X0043491Y0125000D01* -X0043491Y0125344D01* -X0043356Y0126018D01* -X0043093Y0126653D01* -X0042711Y0127225D01* -X0042225Y0127711D01* -X0041653Y0128093D01* -X0041018Y0128356D01* -X0040344Y0128491D01* -X0040000Y0128491D01* -X0039656Y0128491D01* -X0038982Y0128356D01* -X0038347Y0128093D01* -X0037775Y0127711D01* -X0037289Y0127225D01* -X0036907Y0126653D01* -X0036644Y0126018D01* -X0036509Y0125344D01* -X0036509Y0125000D01* -X0036509Y0124656D01* -X0036644Y0123982D01* -X0036907Y0123347D01* -X0037289Y0122775D01* -X0037775Y0122289D01* -X0038347Y0121907D01* -X0038982Y0121644D01* -X0039656Y0121509D01* -X0040000Y0121509D01* -X0040344Y0121509D01* -X0041018Y0121644D01* -X0041653Y0121907D01* -X0042225Y0122289D01* -X0042711Y0122775D01* -X0043093Y0123347D01* -X0043356Y0123982D01* -X0043491Y0124656D01* -X0043491Y0125000D02* -X0040000Y0125000D01* -X0043491Y0125000D01* -X0043391Y0125844D02* -X0046604Y0125844D01* -X0046604Y0127042D02* -X0042833Y0127042D01* -X0041297Y0128241D02* -X0046604Y0128241D01* -X0047107Y0129439D02* -X0020668Y0129439D01* -X0020668Y0128241D02* -X0038703Y0128241D01* -X0040000Y0128241D02* -X0040000Y0128241D01* -X0040000Y0128491D02* -X0040000Y0125000D01* -X0040000Y0125000D01* -X0040000Y0125000D01* -X0040000Y0128491D01* -X0040000Y0127042D02* -X0040000Y0127042D01* -X0040000Y0125844D02* -X0040000Y0125844D01* -X0040000Y0125000D02* -X0040000Y0125000D01* -X0040000Y0121509D01* -X0040000Y0125000D01* -X0040000Y0125000D01* -X0036509Y0125000D01* -X0040000Y0125000D01* -X0040000Y0124645D02* -X0040000Y0124645D01* -X0040000Y0123447D02* -X0040000Y0123447D01* -X0040000Y0122248D02* -X0040000Y0122248D01* -X0042164Y0122248D02* -X0046604Y0122248D01* -X0046604Y0123447D02* -X0043135Y0123447D01* -X0046772Y0121050D02* -X0020668Y0121050D01* -X0020668Y0122248D02* -X0037836Y0122248D01* -X0036865Y0123447D02* -X0020668Y0123447D01* -X0020668Y0124645D02* -X0036512Y0124645D01* -X0036609Y0125844D02* -X0020668Y0125844D01* -X0020668Y0127042D02* -X0037167Y0127042D01* -X0036600Y0118396D02* -X0036117Y0118267D01* -X0035684Y0118016D01* -X0035330Y0117663D01* -X0035080Y0117229D01* -X0034950Y0116746D01* -X0034950Y0114537D01* -X0039400Y0114537D01* -X0039400Y0118396D01* -X0036600Y0118396D01* -X0035210Y0117454D02* -X0020668Y0117454D01* -X0020668Y0116256D02* -X0034950Y0116256D01* -X0034950Y0115057D02* -X0020668Y0115057D01* -X0020668Y0113859D02* -X0039400Y0113859D01* -X0039400Y0115057D02* -X0040600Y0115057D01* -X0040600Y0116256D02* -X0039400Y0116256D01* -X0039400Y0117454D02* -X0040600Y0117454D01* -X0044790Y0117454D02* -X0046831Y0117454D01* -X0046831Y0118653D02* -X0020668Y0118653D01* -X0020668Y0119851D02* -X0046831Y0119851D01* -X0046093Y0116256D02* -X0045050Y0116256D01* -X0045050Y0115057D02* -X0046013Y0115057D01* -X0034950Y0112660D02* -X0020668Y0112660D01* -X0020668Y0111462D02* -X0034950Y0111462D01* -X0034859Y0110263D02* -X0020668Y0110263D01* -X0020668Y0109065D02* -X0034282Y0109065D01* -X0034282Y0107866D02* -X0020668Y0107866D01* -X0020668Y0106668D02* -X0034282Y0106668D01* -X0034282Y0105469D02* -X0020668Y0105469D01* -X0020668Y0104270D02* -X0034282Y0104270D01* -X0034282Y0103072D02* -X0020668Y0103072D01* -X0020668Y0101873D02* -X0034848Y0101873D01* -X0045152Y0101873D02* -X0047039Y0101873D01* -X0047501Y0100675D02* -X0020668Y0100675D01* -X0020668Y0099476D02* -X0047501Y0099476D01* -X0047920Y0098278D02* -X0020668Y0098278D01* -X0021339Y0097079D02* -X0049250Y0097079D01* -X0060000Y0105000D02* -X0066250Y0105000D01* -X0060000Y0105000D02* -X0060000Y0107500D01* -X0065693Y0095881D02* -X0022537Y0095881D01* -X0021979Y0077903D02* -X0002568Y0077903D01* -X0002568Y0076705D02* -X0021979Y0076705D01* -X0022047Y0075506D02* -X0002568Y0075506D01* -X0002568Y0074308D02* -X0021979Y0074308D01* -X0021979Y0073109D02* -X0002568Y0073109D01* -X0002568Y0071911D02* -X0021979Y0071911D01* -X0066063Y0092500D02* -X0076516Y0097953D01* -X0080059Y0097953D01* -X0073100Y0125844D02* -X0071900Y0125844D01* -X0071900Y0127042D02* -X0073100Y0127042D01* -X0073100Y0128241D02* -X0071900Y0128241D01* -X0077386Y0131836D02* -X0020668Y0131836D01* -X0020668Y0130638D02* -X0055673Y0130638D01* -X0051663Y0129439D02* -X0050463Y0129439D01* -X0050463Y0128241D02* -X0051663Y0128241D01* -X0062201Y0130638D02* -X0079331Y0130638D01* -X0031124Y0158203D02* -X0018168Y0158203D01* -X0018168Y0157005D02* -X0018961Y0157005D01* -X0018168Y0159402D02* -X0029680Y0159402D01* -X0021782Y0149814D02* -X0020732Y0149814D01* -X0020668Y0148615D02* -X0021782Y0148615D01* -X0021782Y0147417D02* -X0020668Y0147417D01* -X0020668Y0146218D02* -X0021782Y0146218D01* -X0022133Y0145020D02* -X0020668Y0145020D01* -X0020668Y0143821D02* -X0022450Y0143821D01* -X0022450Y0142623D02* -X0020668Y0142623D01* -X0026900Y0139027D02* -X0028100Y0139027D01* -X0028100Y0137829D02* -X0026900Y0137829D01* -X0026900Y0136630D02* -X0028100Y0136630D01* -X0210011Y0059926D02* -X0213124Y0059926D01* -X0213249Y0058727D02* -X0210770Y0058727D01* -X0283559Y0147417D02* -X0286132Y0147417D01* -X0286132Y0148615D02* -X0285235Y0148615D01* -X0286116Y0149814D02* -X0286132Y0149814D01* -X0285972Y0166593D02* -X0286132Y0166593D01* -X0286132Y0198953D02* -X0268797Y0198953D01* -X0269085Y0200151D02* -X0286132Y0200151D01* -X0269295Y0213335D02* -X0268166Y0213335D01* -X0275000Y0216437D02* -X0275000Y0217874D01* -X0261369Y0201350D02* -X0260403Y0201350D01* -X0260403Y0200151D02* -X0261369Y0200151D01* -X0261369Y0198953D02* -X0260403Y0198953D01* -X0221516Y0182174D02* -X0218484Y0182174D01* -X0219683Y0180975D02* -X0220317Y0180975D01* -X0240565Y0164196D02* -X0242481Y0164196D01* -X0242481Y0162998D02* -X0240960Y0162998D01* -X0240919Y0161799D02* -X0242481Y0161799D01* -X0242481Y0160601D02* -X0240429Y0160601D01* -X0241527Y0159402D02* -X0239142Y0159402D01* -D32* -X0246250Y0154980D02* -X0246250Y0177500D01* -X0262500Y0162500D02* -X0257500Y0157500D01* -X0257500Y0154980D01* -X0262500Y0162500D02* -X0277500Y0162500D01* -X0262500Y0140000D02* -X0257500Y0140000D01* -X0247500Y0140000D01* -X0262500Y0140000D02* -X0267500Y0135000D01* -X0267500Y0085000D01* -X0262500Y0080000D01* -X0240000Y0080000D01* -X0237500Y0080000D01* -X0237500Y0077500D01* -X0242500Y0077500D01* -X0242500Y0072500D01* -X0237500Y0077500D02* -X0222500Y0077500D01* -X0222500Y0073701D01* -X0228402Y0062201D02* -X0228402Y0060000D01* -X0244094Y0060000D01* -X0245000Y0060000D01* -X0245000Y0050000D01* -X0167500Y0050000D01* -X0167500Y0075000D01* -X0127500Y0075000D01* -X0245000Y0050000D02* -X0266250Y0050000D01* -X0267500Y0047500D01* -X0255906Y0060000D02* -X0255906Y0072500D01* -X0255000Y0072500D02* -X0267500Y0072500D01* -D33* -X0267500Y0075000D01* -X0272500Y0080000D01* -X0275000Y0080000D01* -X0267510Y0072500D02* -X0267500Y0072500D01* -X0244094Y0072500D02* -X0242500Y0072500D01* -X0240000Y0080000D02* -X0240000Y0081270D01* -X0237500Y0094980D02* -X0237500Y0095000D01* -X0237500Y0094980D02* -X0240000Y0096230D01* -X0237500Y0098701D02* -X0255157Y0098701D01* -X0255157Y0111299D02* -X0240000Y0111299D01* -X0222500Y0073701D02* -X0222500Y0063201D01* -X0267500Y0047500D02* -X0267500Y0037500D01* -X0277500Y0037500D01* -X0277500Y0027500D02* -X0267500Y0027500D01* -X0267500Y0017500D01* -X0277500Y0017500D01* -X0277500Y0047500D02* -X0267500Y0047500D01* -X0127500Y0067500D02* -X0127500Y0075000D01* -D34* -X0135000Y0047500D03* -X0072500Y0067500D03* -X0058750Y0081250D03* -X0040000Y0125000D03* -X0072500Y0137500D03* -X0080000Y0188750D03* -X0152500Y0175000D03* -X0170000Y0195000D03* -X0212500Y0207500D03* -X0237500Y0162500D03* -X0225000Y0135000D03* -X0240000Y0122500D03* -X0277500Y0137500D03* -X0275000Y0080000D03* -X0255000Y0032500D03* -X0207500Y0057500D03* -X0151250Y0112500D03* -X0150000Y0131250D03* -D35* -X0177500Y0147500D03* -X0197500Y0147500D03* -X0197500Y0157500D03* -X0190000Y0130000D03* -X0246250Y0177500D03* -X0082500Y0155000D03* -X0066250Y0105000D03* -M02* diff --git a/tests/gerber_files/detector_contour.gbr b/tests/gerber_files/detector_contour.gbr deleted file mode 100644 index 93adef01..00000000 --- a/tests/gerber_files/detector_contour.gbr +++ /dev/null @@ -1,26 +0,0 @@ -G04 MADE WITH FRITZING* -G04 WWW.FRITZING.ORG* -G04 DOUBLE SIDED* -G04 HOLES PLATED* -G04 CONTOUR ON CENTER OF CONTOUR VECTOR* -%ASAXBY*% -%FSLAX23Y23*% -%MOIN*% -%OFA0B0*% -%SFA1.0B1.0*% -%ADD10R,1.771650X1.181100*% -%ADD11C,0.008000*% -%ADD10C,0.008*% -%LNCONTOUR*% -G90* -G70* -G54D10* -G54D11* -X4Y1177D02* -X1768Y1177D01* -X1768Y4D01* -X4Y4D01* -X4Y1177D01* -D02* -G04 End of contour* -M02* \ No newline at end of file diff --git a/tests/gerber_files/detector_copper_bottom.gbr b/tests/gerber_files/detector_copper_bottom.gbr deleted file mode 100644 index d3bca481..00000000 --- a/tests/gerber_files/detector_copper_bottom.gbr +++ /dev/null @@ -1,2146 +0,0 @@ -G04 MADE WITH FRITZING* -G04 WWW.FRITZING.ORG* -G04 DOUBLE SIDED* -G04 HOLES PLATED* -G04 CONTOUR ON CENTER OF CONTOUR VECTOR* -%ASAXBY*% -%FSLAX23Y23*% -%MOIN*% -%OFA0B0*% -%SFA1.0B1.0*% -%ADD10C,0.075000*% -%ADD11C,0.099055*% -%ADD12C,0.078740*% -%ADD13R,0.075000X0.075000*% -%ADD14C,0.048000*% -%ADD15C,0.020000*% -%ADD16R,0.001000X0.001000*% -%LNCOPPER0*% -G90* -G70* -G54D10* -X1149Y872D03* -X1349Y872D03* -X749Y722D03* -X749Y522D03* -X1149Y522D03* -X1449Y522D03* -X1149Y422D03* -X1449Y422D03* -X1149Y322D03* -X1449Y322D03* -X1149Y222D03* -X1449Y222D03* -X949Y472D03* -X949Y72D03* -G54D11* -X749Y972D03* -X599Y972D03* -X349Y322D03* -X349Y472D03* -X349Y672D03* -X349Y822D03* -G54D10* -X699Y122D03* -X699Y322D03* -G54D12* -X699Y222D03* -X949Y972D03* -X749Y622D03* -X1049Y222D03* -X1249Y872D03* -G54D13* -X1149Y872D03* -X1149Y522D03* -G54D14* -X949Y373D02* -X949Y433D01* -D02* -X999Y323D02* -X949Y373D01* -D02* -X1109Y322D02* -X999Y323D01* -D02* -X499Y873D02* -X1109Y872D01* -D02* -X1299Y73D02* -X989Y72D01* -D02* -X1399Y322D02* -X1349Y272D01* -D02* -X1349Y272D02* -X1349Y122D01* -D02* -X1349Y122D02* -X1299Y73D01* -D02* -X1409Y322D02* -X1399Y322D01* -D02* -X909Y72D02* -X749Y73D01* -D02* -X749Y73D02* -X727Y94D01* -D02* -X649Y522D02* -X709Y522D01* -D02* -X599Y473D02* -X649Y522D01* -D02* -X401Y472D02* -X599Y473D01* -D02* -X789Y522D02* -X899Y522D01* -D02* -X709Y722D02* -X599Y722D01* -D02* -X599Y722D02* -X549Y673D01* -D02* -X549Y673D02* -X401Y672D01* -D02* -X1149Y562D02* -X1149Y833D01* -D02* -X499Y972D02* -X499Y873D01* -D02* -X547Y972D02* -X499Y972D01* -D02* -X699Y283D02* -X699Y260D01* -D02* -X749Y562D02* -X749Y584D01* -D02* -X499Y873D02* -X499Y972D01* -D02* -X499Y972D02* -X547Y972D01* -D02* -X401Y823D02* -X449Y823D01* -D02* -X899Y522D02* -X921Y500D01* -D02* -X1309Y872D02* -X1287Y872D01* -D02* -X449Y823D02* -X499Y873D01* -D02* -X1349Y422D02* -X1349Y833D01* -D02* -X1189Y422D02* -X1349Y422D01* -D02* -X1399Y322D02* -X1409Y322D01* -D02* -X1349Y372D02* -X1399Y322D01* -D02* -X1349Y422D02* -X1349Y372D01* -D02* -X1189Y422D02* -X1349Y422D01* -D02* -X801Y972D02* -X911Y972D01* -D02* -X1109Y222D02* -X1087Y222D01* -D02* -X401Y322D02* -X659Y322D01* -D02* -X1399Y972D02* -X987Y972D01* -D02* -X1449Y923D02* -X1399Y972D01* -D02* -X1449Y562D02* -X1449Y923D01* -G54D15* -X776Y695D02* -X721Y695D01* -X721Y750D01* -X776Y750D01* -X776Y695D01* -D02* -X671Y150D02* -X726Y150D01* -X726Y95D01* -X671Y95D01* -X671Y150D01* -D02* -G54D16* -X766Y1112D02* -X769Y1112D01* -X764Y1111D02* -X771Y1111D01* -X763Y1110D02* -X772Y1110D01* -X762Y1109D02* -X772Y1109D01* -X762Y1108D02* -X773Y1108D01* -X762Y1107D02* -X773Y1107D01* -X762Y1106D02* -X773Y1106D01* -X762Y1105D02* -X773Y1105D01* -X762Y1104D02* -X773Y1104D01* -X762Y1103D02* -X773Y1103D01* -X762Y1102D02* -X773Y1102D01* -X762Y1101D02* -X773Y1101D01* -X762Y1100D02* -X773Y1100D01* -X762Y1099D02* -X773Y1099D01* -X762Y1098D02* -X773Y1098D01* -X762Y1097D02* -X773Y1097D01* -X762Y1096D02* -X773Y1096D01* -X762Y1095D02* -X773Y1095D01* -X762Y1094D02* -X773Y1094D01* -X762Y1093D02* -X773Y1093D01* -X762Y1092D02* -X773Y1092D01* -X762Y1091D02* -X773Y1091D01* -X762Y1090D02* -X773Y1090D01* -X762Y1089D02* -X773Y1089D01* -X566Y1088D02* -X618Y1088D01* -X741Y1088D02* -X793Y1088D01* -X565Y1087D02* -X620Y1087D01* -X740Y1087D02* -X795Y1087D01* -X564Y1086D02* -X621Y1086D01* -X739Y1086D02* -X796Y1086D01* -X563Y1085D02* -X621Y1085D01* -X738Y1085D02* -X796Y1085D01* -X563Y1084D02* -X622Y1084D01* -X738Y1084D02* -X796Y1084D01* -X563Y1083D02* -X622Y1083D01* -X738Y1083D02* -X796Y1083D01* -X563Y1082D02* -X622Y1082D01* -X738Y1082D02* -X796Y1082D01* -X563Y1081D02* -X622Y1081D01* -X738Y1081D02* -X796Y1081D01* -X563Y1080D02* -X622Y1080D01* -X738Y1080D02* -X796Y1080D01* -X563Y1079D02* -X622Y1079D01* -X739Y1079D02* -X795Y1079D01* -X563Y1078D02* -X622Y1078D01* -X739Y1078D02* -X795Y1078D01* -X563Y1077D02* -X622Y1077D01* -X741Y1077D02* -X794Y1077D01* -X563Y1076D02* -X622Y1076D01* -X762Y1076D02* -X773Y1076D01* -X563Y1075D02* -X621Y1075D01* -X762Y1075D02* -X773Y1075D01* -X563Y1074D02* -X621Y1074D01* -X762Y1074D02* -X773Y1074D01* -X564Y1073D02* -X620Y1073D01* -X762Y1073D02* -X773Y1073D01* -X565Y1072D02* -X619Y1072D01* -X762Y1072D02* -X773Y1072D01* -X569Y1071D02* -X615Y1071D01* -X762Y1071D02* -X773Y1071D01* -X762Y1070D02* -X773Y1070D01* -X762Y1069D02* -X773Y1069D01* -X762Y1068D02* -X773Y1068D01* -X762Y1067D02* -X773Y1067D01* -X762Y1066D02* -X773Y1066D01* -X762Y1065D02* -X773Y1065D01* -X762Y1064D02* -X773Y1064D01* -X762Y1063D02* -X773Y1063D01* -X762Y1062D02* -X773Y1062D01* -X762Y1061D02* -X773Y1061D01* -X762Y1060D02* -X773Y1060D01* -X762Y1059D02* -X773Y1059D01* -X762Y1058D02* -X773Y1058D01* -X762Y1057D02* -X773Y1057D01* -X762Y1056D02* -X773Y1056D01* -X763Y1055D02* -X772Y1055D01* -X763Y1054D02* -X771Y1054D01* -X765Y1053D02* -X770Y1053D01* -X1661Y878D02* -X1697Y878D01* -X1658Y877D02* -X1698Y877D01* -X1656Y876D02* -X1700Y876D01* -X1653Y875D02* -X1701Y875D01* -X1651Y874D02* -X1701Y874D01* -X1648Y873D02* -X1702Y873D01* -X1645Y872D02* -X1702Y872D01* -X1643Y871D02* -X1702Y871D01* -X1640Y870D02* -X1702Y870D01* -X1638Y869D02* -X1703Y869D01* -X1635Y868D02* -X1702Y868D01* -X1633Y867D02* -X1702Y867D01* -X1630Y866D02* -X1702Y866D01* -X1627Y865D02* -X1701Y865D01* -X1625Y864D02* -X1701Y864D01* -X1622Y863D02* -X1700Y863D01* -X1620Y862D02* -X1699Y862D01* -X1617Y861D02* -X1697Y861D01* -X1615Y860D02* -X1664Y860D01* -X1612Y859D02* -X1661Y859D01* -X1609Y858D02* -X1659Y858D01* -X1607Y857D02* -X1656Y857D01* -X1604Y856D02* -X1653Y856D01* -X1602Y855D02* -X1651Y855D01* -X1599Y854D02* -X1648Y854D01* -X1597Y853D02* -X1646Y853D01* -X1594Y852D02* -X1643Y852D01* -X1592Y851D02* -X1641Y851D01* -X1589Y850D02* -X1638Y850D01* -X1586Y849D02* -X1635Y849D01* -X1584Y848D02* -X1633Y848D01* -X1581Y847D02* -X1630Y847D01* -X1579Y846D02* -X1628Y846D01* -X1576Y845D02* -X1625Y845D01* -X1574Y844D02* -X1623Y844D01* -X1571Y843D02* -X1620Y843D01* -X1569Y842D02* -X1618Y842D01* -X1567Y841D02* -X1615Y841D01* -X1566Y840D02* -X1612Y840D01* -X1565Y839D02* -X1610Y839D01* -X1564Y838D02* -X1607Y838D01* -X1564Y837D02* -X1605Y837D01* -X1563Y836D02* -X1602Y836D01* -X1563Y835D02* -X1600Y835D01* -X1563Y834D02* -X1597Y834D01* -X1563Y833D02* -X1599Y833D01* -X1563Y832D02* -X1601Y832D01* -X1564Y831D02* -X1604Y831D01* -X1564Y830D02* -X1606Y830D01* -X1564Y829D02* -X1609Y829D01* -X1565Y828D02* -X1611Y828D01* -X1566Y827D02* -X1614Y827D01* -X1567Y826D02* -X1616Y826D01* -X1569Y825D02* -X1619Y825D01* -X1572Y824D02* -X1622Y824D01* -X1574Y823D02* -X1624Y823D01* -X1577Y822D02* -X1627Y822D01* -X1580Y821D02* -X1629Y821D01* -X1582Y820D02* -X1632Y820D01* -X1585Y819D02* -X1634Y819D01* -X1587Y818D02* -X1637Y818D01* -X1590Y817D02* -X1639Y817D01* -X1592Y816D02* -X1642Y816D01* -X1595Y815D02* -X1645Y815D01* -X1598Y814D02* -X1647Y814D01* -X1600Y813D02* -X1650Y813D01* -X1603Y812D02* -X1652Y812D01* -X1605Y811D02* -X1655Y811D01* -X1608Y810D02* -X1657Y810D01* -X1610Y809D02* -X1660Y809D01* -X1613Y808D02* -X1662Y808D01* -X1616Y807D02* -X1695Y807D01* -X1618Y806D02* -X1698Y806D01* -X1621Y805D02* -X1699Y805D01* -X1623Y804D02* -X1700Y804D01* -X1626Y803D02* -X1701Y803D01* -X1628Y802D02* -X1702Y802D01* -X1631Y801D02* -X1702Y801D01* -X1634Y800D02* -X1702Y800D01* -X1636Y799D02* -X1702Y799D01* -X1639Y798D02* -X1703Y798D01* -X1641Y797D02* -X1702Y797D01* -X1644Y796D02* -X1702Y796D01* -X1646Y795D02* -X1702Y795D01* -X1649Y794D02* -X1702Y794D01* -X1652Y793D02* -X1701Y793D01* -X1654Y792D02* -X1700Y792D01* -X1657Y791D02* -X1699Y791D01* -X1659Y790D02* -X1698Y790D01* -X1662Y789D02* -X1694Y789D01* -X191Y786D02* -X194Y786D01* -X106Y785D02* -X117Y785D01* -X189Y785D02* -X198Y785D01* -X104Y784D02* -X119Y784D01* -X187Y784D02* -X200Y784D01* -X102Y783D02* -X121Y783D01* -X186Y783D02* -X202Y783D01* -X101Y782D02* -X122Y782D01* -X186Y782D02* -X204Y782D01* -X100Y781D02* -X123Y781D01* -X185Y781D02* -X205Y781D01* -X99Y780D02* -X125Y780D01* -X185Y780D02* -X206Y780D01* -X98Y779D02* -X126Y779D01* -X185Y779D02* -X207Y779D01* -X97Y778D02* -X127Y778D01* -X185Y778D02* -X208Y778D01* -X97Y777D02* -X128Y777D01* -X185Y777D02* -X208Y777D01* -X96Y776D02* -X130Y776D01* -X185Y776D02* -X209Y776D01* -X96Y775D02* -X131Y775D01* -X186Y775D02* -X210Y775D01* -X96Y774D02* -X132Y774D01* -X186Y774D02* -X210Y774D01* -X95Y773D02* -X134Y773D01* -X187Y773D02* -X211Y773D01* -X95Y772D02* -X135Y772D01* -X188Y772D02* -X211Y772D01* -X95Y771D02* -X136Y771D01* -X191Y771D02* -X211Y771D01* -X95Y770D02* -X109Y770D01* -X113Y770D02* -X137Y770D01* -X195Y770D02* -X211Y770D01* -X95Y769D02* -X109Y769D01* -X114Y769D02* -X139Y769D01* -X196Y769D02* -X212Y769D01* -X95Y768D02* -X109Y768D01* -X116Y768D02* -X140Y768D01* -X197Y768D02* -X212Y768D01* -X95Y767D02* -X109Y767D01* -X117Y767D02* -X141Y767D01* -X197Y767D02* -X212Y767D01* -X95Y766D02* -X109Y766D01* -X118Y766D02* -X143Y766D01* -X198Y766D02* -X212Y766D01* -X95Y765D02* -X109Y765D01* -X120Y765D02* -X144Y765D01* -X198Y765D02* -X212Y765D01* -X95Y764D02* -X109Y764D01* -X121Y764D02* -X145Y764D01* -X198Y764D02* -X212Y764D01* -X95Y763D02* -X109Y763D01* -X122Y763D02* -X146Y763D01* -X198Y763D02* -X212Y763D01* -X95Y762D02* -X109Y762D01* -X123Y762D02* -X148Y762D01* -X198Y762D02* -X212Y762D01* -X95Y761D02* -X109Y761D01* -X125Y761D02* -X149Y761D01* -X198Y761D02* -X212Y761D01* -X95Y760D02* -X109Y760D01* -X126Y760D02* -X150Y760D01* -X198Y760D02* -X212Y760D01* -X95Y759D02* -X109Y759D01* -X127Y759D02* -X152Y759D01* -X198Y759D02* -X212Y759D01* -X95Y758D02* -X109Y758D01* -X129Y758D02* -X153Y758D01* -X198Y758D02* -X212Y758D01* -X95Y757D02* -X109Y757D01* -X130Y757D02* -X154Y757D01* -X198Y757D02* -X212Y757D01* -X95Y756D02* -X109Y756D01* -X131Y756D02* -X155Y756D01* -X198Y756D02* -X212Y756D01* -X95Y755D02* -X109Y755D01* -X132Y755D02* -X157Y755D01* -X198Y755D02* -X212Y755D01* -X95Y754D02* -X109Y754D01* -X134Y754D02* -X158Y754D01* -X198Y754D02* -X212Y754D01* -X95Y753D02* -X109Y753D01* -X135Y753D02* -X159Y753D01* -X198Y753D02* -X212Y753D01* -X95Y752D02* -X109Y752D01* -X136Y752D02* -X161Y752D01* -X198Y752D02* -X212Y752D01* -X95Y751D02* -X109Y751D01* -X138Y751D02* -X162Y751D01* -X198Y751D02* -X212Y751D01* -X95Y750D02* -X109Y750D01* -X139Y750D02* -X163Y750D01* -X198Y750D02* -X212Y750D01* -X95Y749D02* -X109Y749D01* -X140Y749D02* -X164Y749D01* -X198Y749D02* -X212Y749D01* -X95Y748D02* -X109Y748D01* -X141Y748D02* -X166Y748D01* -X198Y748D02* -X212Y748D01* -X1569Y748D02* -X1620Y748D01* -X95Y747D02* -X109Y747D01* -X143Y747D02* -X167Y747D01* -X198Y747D02* -X212Y747D01* -X1567Y747D02* -X1622Y747D01* -X95Y746D02* -X109Y746D01* -X144Y746D02* -X168Y746D01* -X198Y746D02* -X212Y746D01* -X1566Y746D02* -X1623Y746D01* -X95Y745D02* -X109Y745D01* -X145Y745D02* -X170Y745D01* -X198Y745D02* -X212Y745D01* -X1565Y745D02* -X1624Y745D01* -X95Y744D02* -X109Y744D01* -X147Y744D02* -X171Y744D01* -X198Y744D02* -X212Y744D01* -X1565Y744D02* -X1625Y744D01* -X95Y743D02* -X109Y743D01* -X148Y743D02* -X172Y743D01* -X198Y743D02* -X212Y743D01* -X1564Y743D02* -X1626Y743D01* -X95Y742D02* -X109Y742D01* -X149Y742D02* -X173Y742D01* -X198Y742D02* -X212Y742D01* -X1564Y742D02* -X1626Y742D01* -X95Y741D02* -X109Y741D01* -X151Y741D02* -X175Y741D01* -X198Y741D02* -X212Y741D01* -X1563Y741D02* -X1626Y741D01* -X95Y740D02* -X109Y740D01* -X152Y740D02* -X176Y740D01* -X198Y740D02* -X212Y740D01* -X1563Y740D02* -X1626Y740D01* -X95Y739D02* -X109Y739D01* -X153Y739D02* -X177Y739D01* -X198Y739D02* -X212Y739D01* -X1563Y739D02* -X1626Y739D01* -X95Y738D02* -X109Y738D01* -X154Y738D02* -X179Y738D01* -X198Y738D02* -X212Y738D01* -X1563Y738D02* -X1626Y738D01* -X95Y737D02* -X109Y737D01* -X156Y737D02* -X180Y737D01* -X198Y737D02* -X212Y737D01* -X1563Y737D02* -X1626Y737D01* -X95Y736D02* -X109Y736D01* -X157Y736D02* -X181Y736D01* -X198Y736D02* -X212Y736D01* -X1563Y736D02* -X1626Y736D01* -X95Y735D02* -X109Y735D01* -X158Y735D02* -X182Y735D01* -X198Y735D02* -X212Y735D01* -X1563Y735D02* -X1626Y735D01* -X95Y734D02* -X109Y734D01* -X160Y734D02* -X184Y734D01* -X198Y734D02* -X212Y734D01* -X1563Y734D02* -X1626Y734D01* -X95Y733D02* -X109Y733D01* -X161Y733D02* -X185Y733D01* -X198Y733D02* -X212Y733D01* -X1563Y733D02* -X1626Y733D01* -X95Y732D02* -X109Y732D01* -X162Y732D02* -X186Y732D01* -X198Y732D02* -X212Y732D01* -X1563Y732D02* -X1626Y732D01* -X95Y731D02* -X109Y731D01* -X163Y731D02* -X188Y731D01* -X198Y731D02* -X212Y731D01* -X1563Y731D02* -X1626Y731D01* -X95Y730D02* -X109Y730D01* -X165Y730D02* -X189Y730D01* -X198Y730D02* -X212Y730D01* -X1563Y730D02* -X1581Y730D01* -X1609Y730D02* -X1626Y730D01* -X95Y729D02* -X110Y729D01* -X166Y729D02* -X190Y729D01* -X198Y729D02* -X212Y729D01* -X1563Y729D02* -X1580Y729D01* -X1609Y729D02* -X1626Y729D01* -X95Y728D02* -X110Y728D01* -X167Y728D02* -X191Y728D01* -X198Y728D02* -X212Y728D01* -X1563Y728D02* -X1580Y728D01* -X1609Y728D02* -X1626Y728D01* -X95Y727D02* -X111Y727D01* -X169Y727D02* -X193Y727D01* -X198Y727D02* -X212Y727D01* -X1563Y727D02* -X1580Y727D01* -X1609Y727D02* -X1626Y727D01* -X96Y726D02* -X114Y726D01* -X170Y726D02* -X194Y726D01* -X196Y726D02* -X212Y726D01* -X1563Y726D02* -X1580Y726D01* -X1609Y726D02* -X1626Y726D01* -X96Y725D02* -X118Y725D01* -X171Y725D02* -X212Y725D01* -X1563Y725D02* -X1580Y725D01* -X1609Y725D02* -X1626Y725D01* -X96Y724D02* -X119Y724D01* -X172Y724D02* -X212Y724D01* -X1563Y724D02* -X1580Y724D01* -X1609Y724D02* -X1626Y724D01* -X97Y723D02* -X120Y723D01* -X174Y723D02* -X211Y723D01* -X1563Y723D02* -X1580Y723D01* -X1609Y723D02* -X1626Y723D01* -X97Y722D02* -X121Y722D01* -X175Y722D02* -X211Y722D01* -X1563Y722D02* -X1580Y722D01* -X1609Y722D02* -X1626Y722D01* -X98Y721D02* -X122Y721D01* -X176Y721D02* -X211Y721D01* -X1563Y721D02* -X1580Y721D01* -X1609Y721D02* -X1626Y721D01* -X98Y720D02* -X122Y720D01* -X178Y720D02* -X210Y720D01* -X1563Y720D02* -X1580Y720D01* -X1609Y720D02* -X1626Y720D01* -X99Y719D02* -X122Y719D01* -X179Y719D02* -X210Y719D01* -X1563Y719D02* -X1580Y719D01* -X1609Y719D02* -X1626Y719D01* -X100Y718D02* -X122Y718D01* -X180Y718D02* -X209Y718D01* -X1563Y718D02* -X1580Y718D01* -X1609Y718D02* -X1626Y718D01* -X101Y717D02* -X122Y717D01* -X181Y717D02* -X208Y717D01* -X1563Y717D02* -X1580Y717D01* -X1609Y717D02* -X1626Y717D01* -X102Y716D02* -X122Y716D01* -X183Y716D02* -X207Y716D01* -X1563Y716D02* -X1580Y716D01* -X1609Y716D02* -X1626Y716D01* -X103Y715D02* -X121Y715D01* -X184Y715D02* -X206Y715D01* -X1563Y715D02* -X1580Y715D01* -X1609Y715D02* -X1626Y715D01* -X104Y714D02* -X121Y714D01* -X185Y714D02* -X205Y714D01* -X1563Y714D02* -X1580Y714D01* -X1609Y714D02* -X1626Y714D01* -X106Y713D02* -X120Y713D01* -X187Y713D02* -X204Y713D01* -X1563Y713D02* -X1580Y713D01* -X1609Y713D02* -X1626Y713D01* -X108Y712D02* -X119Y712D01* -X189Y712D02* -X202Y712D01* -X1563Y712D02* -X1580Y712D01* -X1609Y712D02* -X1626Y712D01* -X112Y711D02* -X117Y711D01* -X192Y711D02* -X198Y711D01* -X1563Y711D02* -X1580Y711D01* -X1609Y711D02* -X1626Y711D01* -X1563Y710D02* -X1580Y710D01* -X1609Y710D02* -X1626Y710D01* -X1563Y709D02* -X1580Y709D01* -X1609Y709D02* -X1626Y709D01* -X1563Y708D02* -X1580Y708D01* -X1609Y708D02* -X1626Y708D01* -X1563Y707D02* -X1580Y707D01* -X1609Y707D02* -X1626Y707D01* -X1563Y706D02* -X1580Y706D01* -X1609Y706D02* -X1626Y706D01* -X1563Y705D02* -X1580Y705D01* -X1609Y705D02* -X1626Y705D01* -X1563Y704D02* -X1580Y704D01* -X1609Y704D02* -X1626Y704D01* -X1563Y703D02* -X1580Y703D01* -X1609Y703D02* -X1626Y703D01* -X1563Y702D02* -X1580Y702D01* -X1609Y702D02* -X1626Y702D01* -X1563Y701D02* -X1580Y701D01* -X1609Y701D02* -X1626Y701D01* -X1563Y700D02* -X1580Y700D01* -X1609Y700D02* -X1626Y700D01* -X1563Y699D02* -X1580Y699D01* -X1609Y699D02* -X1626Y699D01* -X1563Y698D02* -X1580Y698D01* -X1609Y698D02* -X1626Y698D01* -X1563Y697D02* -X1580Y697D01* -X1609Y697D02* -X1626Y697D01* -X1563Y696D02* -X1580Y696D01* -X1609Y696D02* -X1626Y696D01* -X1563Y695D02* -X1580Y695D01* -X1609Y695D02* -X1626Y695D01* -X1563Y694D02* -X1580Y694D01* -X1609Y694D02* -X1626Y694D01* -X1563Y693D02* -X1580Y693D01* -X1609Y693D02* -X1626Y693D01* -X1563Y692D02* -X1580Y692D01* -X1609Y692D02* -X1626Y692D01* -X1563Y691D02* -X1580Y691D01* -X1609Y691D02* -X1626Y691D01* -X1563Y690D02* -X1580Y690D01* -X1609Y690D02* -X1626Y690D01* -X1563Y689D02* -X1580Y689D01* -X1609Y689D02* -X1626Y689D01* -X1563Y688D02* -X1580Y688D01* -X1609Y688D02* -X1626Y688D01* -X1563Y687D02* -X1580Y687D01* -X1609Y687D02* -X1626Y687D01* -X1563Y686D02* -X1580Y686D01* -X1609Y686D02* -X1626Y686D01* -X1563Y685D02* -X1580Y685D01* -X1609Y685D02* -X1626Y685D01* -X1690Y685D02* -X1698Y685D01* -X1563Y684D02* -X1580Y684D01* -X1609Y684D02* -X1626Y684D01* -X1689Y684D02* -X1699Y684D01* -X1563Y683D02* -X1580Y683D01* -X1609Y683D02* -X1626Y683D01* -X1688Y683D02* -X1700Y683D01* -X1563Y682D02* -X1580Y682D01* -X1609Y682D02* -X1626Y682D01* -X1687Y682D02* -X1701Y682D01* -X1563Y681D02* -X1580Y681D01* -X1609Y681D02* -X1626Y681D01* -X1686Y681D02* -X1702Y681D01* -X1563Y680D02* -X1580Y680D01* -X1609Y680D02* -X1626Y680D01* -X1686Y680D02* -X1702Y680D01* -X1563Y679D02* -X1580Y679D01* -X1609Y679D02* -X1626Y679D01* -X1686Y679D02* -X1702Y679D01* -X1563Y678D02* -X1580Y678D01* -X1609Y678D02* -X1626Y678D01* -X1685Y678D02* -X1702Y678D01* -X1563Y677D02* -X1581Y677D01* -X1609Y677D02* -X1627Y677D01* -X1685Y677D02* -X1703Y677D01* -X1563Y676D02* -X1703Y676D01* -X1563Y675D02* -X1703Y675D01* -X1563Y674D02* -X1703Y674D01* -X1563Y673D02* -X1703Y673D01* -X1563Y672D02* -X1703Y672D01* -X1563Y671D02* -X1703Y671D01* -X1563Y670D02* -X1703Y670D01* -X1563Y669D02* -X1703Y669D01* -X1563Y668D02* -X1703Y668D01* -X1563Y667D02* -X1702Y667D01* -X1563Y666D02* -X1702Y666D01* -X1564Y665D02* -X1702Y665D01* -X1564Y664D02* -X1702Y664D01* -X1565Y663D02* -X1701Y663D01* -X1566Y662D02* -X1700Y662D01* -X1567Y661D02* -X1699Y661D01* -X1568Y660D02* -X1698Y660D01* -X1572Y659D02* -X1694Y659D01* -X1623Y618D02* -X1635Y618D01* -X1621Y617D02* -X1637Y617D01* -X1620Y616D02* -X1639Y616D01* -X1619Y615D02* -X1640Y615D01* -X1618Y614D02* -X1640Y614D01* -X1617Y613D02* -X1641Y613D01* -X1617Y612D02* -X1641Y612D01* -X1617Y611D02* -X1641Y611D01* -X1617Y610D02* -X1642Y610D01* -X1617Y609D02* -X1642Y609D01* -X1617Y608D02* -X1642Y608D01* -X1617Y607D02* -X1642Y607D01* -X1617Y606D02* -X1642Y606D01* -X1617Y605D02* -X1642Y605D01* -X1617Y604D02* -X1642Y604D01* -X1617Y603D02* -X1642Y603D01* -X1617Y602D02* -X1642Y602D01* -X1617Y601D02* -X1642Y601D01* -X1617Y600D02* -X1642Y600D01* -X1617Y599D02* -X1642Y599D01* -X1617Y598D02* -X1642Y598D01* -X1617Y597D02* -X1642Y597D01* -X1617Y596D02* -X1642Y596D01* -X1617Y595D02* -X1642Y595D01* -X1617Y594D02* -X1642Y594D01* -X1617Y593D02* -X1642Y593D01* -X1617Y592D02* -X1642Y592D01* -X1617Y591D02* -X1642Y591D01* -X1617Y590D02* -X1642Y590D01* -X1617Y589D02* -X1642Y589D01* -X1617Y588D02* -X1642Y588D01* -X1617Y587D02* -X1642Y587D01* -X1617Y586D02* -X1642Y586D01* -X1617Y585D02* -X1642Y585D01* -X1617Y584D02* -X1642Y584D01* -X1617Y583D02* -X1642Y583D01* -X1617Y582D02* -X1642Y582D01* -X1617Y581D02* -X1642Y581D01* -X1617Y580D02* -X1642Y580D01* -X1617Y579D02* -X1642Y579D01* -X1617Y578D02* -X1642Y578D01* -X1617Y577D02* -X1642Y577D01* -X1617Y576D02* -X1642Y576D01* -X1617Y575D02* -X1642Y575D01* -X1617Y574D02* -X1642Y574D01* -X1617Y573D02* -X1642Y573D01* -X1617Y572D02* -X1642Y572D01* -X1617Y571D02* -X1642Y571D01* -X1617Y570D02* -X1642Y570D01* -X1617Y569D02* -X1642Y569D01* -X1617Y568D02* -X1642Y568D01* -X1617Y567D02* -X1642Y567D01* -X1617Y566D02* -X1642Y566D01* -X1617Y565D02* -X1642Y565D01* -X1617Y564D02* -X1642Y564D01* -X1617Y563D02* -X1642Y563D01* -X1617Y562D02* -X1642Y562D01* -X1617Y561D02* -X1642Y561D01* -X1617Y560D02* -X1642Y560D01* -X1617Y559D02* -X1642Y559D01* -X1617Y558D02* -X1642Y558D01* -X1617Y557D02* -X1642Y557D01* -X1617Y556D02* -X1642Y556D01* -X1617Y555D02* -X1642Y555D01* -X1617Y554D02* -X1642Y554D01* -X1617Y553D02* -X1642Y553D01* -X1617Y552D02* -X1642Y552D01* -X1617Y551D02* -X1642Y551D01* -X1617Y550D02* -X1642Y550D01* -X1617Y549D02* -X1642Y549D01* -X1617Y548D02* -X1642Y548D01* -X1617Y547D02* -X1642Y547D01* -X1617Y546D02* -X1642Y546D01* -X1617Y545D02* -X1642Y545D01* -X1617Y544D02* -X1642Y544D01* -X1617Y543D02* -X1642Y543D01* -X1617Y542D02* -X1642Y542D01* -X1617Y541D02* -X1642Y541D01* -X1617Y540D02* -X1642Y540D01* -X1617Y539D02* -X1642Y539D01* -X1617Y538D02* -X1642Y538D01* -X1617Y537D02* -X1642Y537D01* -X1617Y536D02* -X1641Y536D01* -X1617Y535D02* -X1641Y535D01* -X1618Y534D02* -X1641Y534D01* -X1618Y533D02* -X1640Y533D01* -X1619Y532D02* -X1639Y532D01* -X1620Y531D02* -X1638Y531D01* -X1621Y530D02* -X1637Y530D01* -X1625Y529D02* -X1633Y529D01* -X1627Y488D02* -X1638Y488D01* -X1623Y487D02* -X1643Y487D01* -X1620Y486D02* -X1646Y486D01* -X1617Y485D02* -X1649Y485D01* -X1615Y484D02* -X1651Y484D01* -X1613Y483D02* -X1653Y483D01* -X1611Y482D02* -X1655Y482D01* -X1609Y481D02* -X1657Y481D01* -X1607Y480D02* -X1659Y480D01* -X1605Y479D02* -X1661Y479D01* -X1603Y478D02* -X1663Y478D01* -X1601Y477D02* -X1665Y477D01* -X1599Y476D02* -X1667Y476D01* -X1597Y475D02* -X1669Y475D01* -X1595Y474D02* -X1671Y474D01* -X1593Y473D02* -X1673Y473D01* -X1591Y472D02* -X1675Y472D01* -X1589Y471D02* -X1677Y471D01* -X1587Y470D02* -X1629Y470D01* -X1637Y470D02* -X1679Y470D01* -X1585Y469D02* -X1625Y469D01* -X1641Y469D02* -X1681Y469D01* -X1583Y468D02* -X1622Y468D01* -X1643Y468D02* -X1683Y468D01* -X1581Y467D02* -X1620Y467D01* -X1645Y467D02* -X1685Y467D01* -X1579Y466D02* -X1618Y466D01* -X1647Y466D02* -X1687Y466D01* -X1577Y465D02* -X1616Y465D01* -X1649Y465D02* -X1689Y465D01* -X1575Y464D02* -X1614Y464D01* -X1651Y464D02* -X1690Y464D01* -X1573Y463D02* -X1612Y463D01* -X1653Y463D02* -X1692Y463D01* -X1572Y462D02* -X1611Y462D01* -X1655Y462D02* -X1693Y462D01* -X1571Y461D02* -X1609Y461D01* -X1657Y461D02* -X1694Y461D01* -X1570Y460D02* -X1607Y460D01* -X1659Y460D02* -X1695Y460D01* -X1569Y459D02* -X1605Y459D01* -X1661Y459D02* -X1696Y459D01* -X1569Y458D02* -X1603Y458D01* -X1663Y458D02* -X1697Y458D01* -X1568Y457D02* -X1601Y457D01* -X1665Y457D02* -X1697Y457D01* -X1567Y456D02* -X1599Y456D01* -X1667Y456D02* -X1698Y456D01* -X1567Y455D02* -X1597Y455D01* -X1669Y455D02* -X1699Y455D01* -X1566Y454D02* -X1595Y454D01* -X1671Y454D02* -X1699Y454D01* -X1566Y453D02* -X1593Y453D01* -X1673Y453D02* -X1700Y453D01* -X1565Y452D02* -X1591Y452D01* -X1675Y452D02* -X1700Y452D01* -X1565Y451D02* -X1589Y451D01* -X1677Y451D02* -X1701Y451D01* -X1565Y450D02* -X1587Y450D01* -X1679Y450D02* -X1701Y450D01* -X1564Y449D02* -X1585Y449D01* -X1681Y449D02* -X1701Y449D01* -X1564Y448D02* -X1583Y448D01* -X1682Y448D02* -X1702Y448D01* -X1564Y447D02* -X1582Y447D01* -X1683Y447D02* -X1702Y447D01* -X1564Y446D02* -X1582Y446D01* -X1684Y446D02* -X1702Y446D01* -X1563Y445D02* -X1581Y445D01* -X1685Y445D02* -X1702Y445D01* -X1563Y444D02* -X1581Y444D01* -X1685Y444D02* -X1702Y444D01* -X1563Y443D02* -X1581Y443D01* -X1685Y443D02* -X1702Y443D01* -X1563Y442D02* -X1580Y442D01* -X1685Y442D02* -X1703Y442D01* -X1563Y441D02* -X1580Y441D01* -X1685Y441D02* -X1703Y441D01* -X1563Y440D02* -X1580Y440D01* -X1685Y440D02* -X1703Y440D01* -X1563Y439D02* -X1580Y439D01* -X1685Y439D02* -X1703Y439D01* -X1563Y438D02* -X1580Y438D01* -X1685Y438D02* -X1703Y438D01* -X1563Y437D02* -X1580Y437D01* -X1685Y437D02* -X1703Y437D01* -X1563Y436D02* -X1580Y436D01* -X1685Y436D02* -X1703Y436D01* -X1563Y435D02* -X1581Y435D01* -X1685Y435D02* -X1703Y435D01* -X1563Y434D02* -X1703Y434D01* -X99Y433D02* -X105Y433D01* -X202Y433D02* -X208Y433D01* -X1563Y433D02* -X1703Y433D01* -X98Y432D02* -X106Y432D01* -X200Y432D02* -X209Y432D01* -X1563Y432D02* -X1703Y432D01* -X97Y431D02* -X107Y431D01* -X199Y431D02* -X210Y431D01* -X1563Y431D02* -X1703Y431D01* -X96Y430D02* -X108Y430D01* -X199Y430D02* -X211Y430D01* -X1563Y430D02* -X1703Y430D01* -X95Y429D02* -X109Y429D01* -X198Y429D02* -X211Y429D01* -X1563Y429D02* -X1703Y429D01* -X95Y428D02* -X109Y428D01* -X198Y428D02* -X212Y428D01* -X1563Y428D02* -X1703Y428D01* -X95Y427D02* -X109Y427D01* -X198Y427D02* -X212Y427D01* -X1563Y427D02* -X1703Y427D01* -X95Y426D02* -X109Y426D01* -X198Y426D02* -X212Y426D01* -X1563Y426D02* -X1703Y426D01* -X95Y425D02* -X109Y425D01* -X198Y425D02* -X212Y425D01* -X1563Y425D02* -X1703Y425D01* -X95Y424D02* -X109Y424D01* -X198Y424D02* -X212Y424D01* -X1563Y424D02* -X1703Y424D01* -X95Y423D02* -X109Y423D01* -X198Y423D02* -X212Y423D01* -X1563Y423D02* -X1703Y423D01* -X95Y422D02* -X109Y422D01* -X198Y422D02* -X212Y422D01* -X1563Y422D02* -X1703Y422D01* -X95Y421D02* -X109Y421D01* -X198Y421D02* -X212Y421D01* -X1563Y421D02* -X1703Y421D01* -X95Y420D02* -X109Y420D01* -X198Y420D02* -X212Y420D01* -X1563Y420D02* -X1703Y420D01* -X95Y419D02* -X109Y419D01* -X198Y419D02* -X212Y419D01* -X1563Y419D02* -X1703Y419D01* -X95Y418D02* -X109Y418D01* -X198Y418D02* -X212Y418D01* -X1563Y418D02* -X1703Y418D01* -X95Y417D02* -X109Y417D01* -X198Y417D02* -X212Y417D01* -X1563Y417D02* -X1703Y417D01* -X95Y416D02* -X109Y416D01* -X198Y416D02* -X212Y416D01* -X1563Y416D02* -X1580Y416D01* -X1685Y416D02* -X1703Y416D01* -X95Y415D02* -X109Y415D01* -X198Y415D02* -X212Y415D01* -X1563Y415D02* -X1580Y415D01* -X1685Y415D02* -X1703Y415D01* -X95Y414D02* -X109Y414D01* -X198Y414D02* -X212Y414D01* -X1563Y414D02* -X1580Y414D01* -X1685Y414D02* -X1703Y414D01* -X95Y413D02* -X109Y413D01* -X198Y413D02* -X212Y413D01* -X1563Y413D02* -X1580Y413D01* -X1685Y413D02* -X1703Y413D01* -X95Y412D02* -X109Y412D01* -X198Y412D02* -X212Y412D01* -X1563Y412D02* -X1580Y412D01* -X1685Y412D02* -X1703Y412D01* -X95Y411D02* -X109Y411D01* -X198Y411D02* -X212Y411D01* -X1563Y411D02* -X1580Y411D01* -X1685Y411D02* -X1703Y411D01* -X95Y410D02* -X109Y410D01* -X198Y410D02* -X212Y410D01* -X1563Y410D02* -X1580Y410D01* -X1685Y410D02* -X1703Y410D01* -X95Y409D02* -X109Y409D01* -X198Y409D02* -X212Y409D01* -X1563Y409D02* -X1580Y409D01* -X1685Y409D02* -X1703Y409D01* -X95Y408D02* -X109Y408D01* -X198Y408D02* -X212Y408D01* -X1563Y408D02* -X1580Y408D01* -X1685Y408D02* -X1703Y408D01* -X95Y407D02* -X109Y407D01* -X198Y407D02* -X212Y407D01* -X1563Y407D02* -X1580Y407D01* -X1685Y407D02* -X1702Y407D01* -X95Y406D02* -X109Y406D01* -X198Y406D02* -X212Y406D01* -X1563Y406D02* -X1580Y406D01* -X1686Y406D02* -X1702Y406D01* -X95Y405D02* -X109Y405D01* -X198Y405D02* -X212Y405D01* -X1564Y405D02* -X1580Y405D01* -X1686Y405D02* -X1702Y405D01* -X95Y404D02* -X109Y404D01* -X198Y404D02* -X212Y404D01* -X1564Y404D02* -X1580Y404D01* -X1686Y404D02* -X1702Y404D01* -X95Y403D02* -X109Y403D01* -X198Y403D02* -X212Y403D01* -X1565Y403D02* -X1579Y403D01* -X1687Y403D02* -X1701Y403D01* -X95Y402D02* -X109Y402D01* -X198Y402D02* -X212Y402D01* -X1565Y402D02* -X1578Y402D01* -X1688Y402D02* -X1700Y402D01* -X95Y401D02* -X109Y401D01* -X198Y401D02* -X212Y401D01* -X1567Y401D02* -X1577Y401D01* -X1689Y401D02* -X1699Y401D01* -X95Y400D02* -X109Y400D01* -X198Y400D02* -X212Y400D01* -X1568Y400D02* -X1576Y400D01* -X1690Y400D02* -X1698Y400D01* -X95Y399D02* -X109Y399D01* -X198Y399D02* -X212Y399D01* -X1571Y399D02* -X1573Y399D01* -X1693Y399D02* -X1695Y399D01* -X95Y398D02* -X109Y398D01* -X198Y398D02* -X212Y398D01* -X95Y397D02* -X109Y397D01* -X198Y397D02* -X212Y397D01* -X95Y396D02* -X109Y396D01* -X197Y396D02* -X212Y396D01* -X95Y395D02* -X110Y395D01* -X197Y395D02* -X212Y395D01* -X95Y394D02* -X110Y394D01* -X197Y394D02* -X212Y394D01* -X95Y393D02* -X111Y393D01* -X196Y393D02* -X211Y393D01* -X96Y392D02* -X112Y392D01* -X195Y392D02* -X211Y392D01* -X96Y391D02* -X114Y391D01* -X193Y391D02* -X211Y391D01* -X96Y390D02* -X116Y390D01* -X191Y390D02* -X211Y390D01* -X97Y389D02* -X118Y389D01* -X189Y389D02* -X210Y389D01* -X97Y388D02* -X120Y388D01* -X187Y388D02* -X210Y388D01* -X98Y387D02* -X122Y387D01* -X185Y387D02* -X209Y387D01* -X98Y386D02* -X124Y386D01* -X183Y386D02* -X209Y386D01* -X99Y385D02* -X126Y385D01* -X181Y385D02* -X208Y385D01* -X100Y384D02* -X128Y384D01* -X179Y384D02* -X207Y384D01* -X101Y383D02* -X130Y383D01* -X177Y383D02* -X207Y383D01* -X101Y382D02* -X132Y382D01* -X175Y382D02* -X206Y382D01* -X102Y381D02* -X134Y381D01* -X173Y381D02* -X205Y381D01* -X104Y380D02* -X136Y380D01* -X171Y380D02* -X204Y380D01* -X105Y379D02* -X138Y379D01* -X169Y379D02* -X202Y379D01* -X107Y378D02* -X140Y378D01* -X167Y378D02* -X201Y378D01* -X108Y377D02* -X141Y377D01* -X165Y377D02* -X199Y377D01* -X110Y376D02* -X143Y376D01* -X163Y376D02* -X197Y376D01* -X112Y375D02* -X146Y375D01* -X161Y375D02* -X195Y375D01* -X114Y374D02* -X149Y374D01* -X157Y374D02* -X193Y374D01* -X116Y373D02* -X191Y373D01* -X118Y372D02* -X189Y372D01* -X120Y371D02* -X187Y371D01* -X122Y370D02* -X185Y370D01* -X124Y369D02* -X183Y369D01* -X126Y368D02* -X181Y368D01* -X128Y367D02* -X179Y367D01* -X130Y366D02* -X177Y366D01* -X132Y365D02* -X174Y365D01* -X134Y364D02* -X172Y364D01* -X136Y363D02* -X170Y363D01* -X138Y362D02* -X168Y362D01* -X141Y361D02* -X166Y361D01* -X144Y360D02* -X163Y360D01* -X148Y359D02* -X159Y359D01* -X1569Y358D02* -X1702Y358D01* -X1567Y357D02* -X1703Y357D01* -X1566Y356D02* -X1703Y356D01* -X1565Y355D02* -X1703Y355D01* -X1565Y354D02* -X1703Y354D01* -X1564Y353D02* -X1703Y353D01* -X1564Y352D02* -X1703Y352D01* -X1563Y351D02* -X1703Y351D01* -X1563Y350D02* -X1703Y350D01* -X1563Y349D02* -X1703Y349D01* -X1563Y348D02* -X1703Y348D01* -X1564Y347D02* -X1703Y347D01* -X1564Y346D02* -X1703Y346D01* -X1564Y345D02* -X1703Y345D01* -X1565Y344D02* -X1703Y344D01* -X1566Y343D02* -X1703Y343D01* -X1567Y342D02* -X1703Y342D01* -X1569Y341D02* -X1703Y341D01* -X1678Y340D02* -X1703Y340D01* -X1677Y339D02* -X1703Y339D01* -X1675Y338D02* -X1703Y338D01* -X1674Y337D02* -X1703Y337D01* -X1672Y336D02* -X1703Y336D01* -X1671Y335D02* -X1702Y335D01* -X1670Y334D02* -X1700Y334D01* -X1668Y333D02* -X1699Y333D01* -X1667Y332D02* -X1697Y332D01* -X1665Y331D02* -X1696Y331D01* -X1664Y330D02* -X1694Y330D01* -X1662Y329D02* -X1693Y329D01* -X1661Y328D02* -X1692Y328D01* -X1660Y327D02* -X1690Y327D01* -X1658Y326D02* -X1689Y326D01* -X1657Y325D02* -X1687Y325D01* -X1655Y324D02* -X1686Y324D01* -X1654Y323D02* -X1684Y323D01* -X1645Y322D02* -X1683Y322D01* -X1643Y321D02* -X1682Y321D01* -X1642Y320D02* -X1680Y320D01* -X1641Y319D02* -X1679Y319D01* -X1641Y318D02* -X1677Y318D01* -X1640Y317D02* -X1676Y317D01* -X1640Y316D02* -X1674Y316D01* -X1640Y315D02* -X1673Y315D01* -X1640Y314D02* -X1672Y314D01* -X1640Y313D02* -X1672Y313D01* -X1640Y312D02* -X1673Y312D01* -X1640Y311D02* -X1675Y311D01* -X1640Y310D02* -X1676Y310D01* -X1641Y309D02* -X1678Y309D01* -X1641Y308D02* -X1679Y308D01* -X1642Y307D02* -X1681Y307D01* -X1644Y306D02* -X1682Y306D01* -X1646Y305D02* -X1683Y305D01* -X1654Y304D02* -X1685Y304D01* -X1655Y303D02* -X1686Y303D01* -X1657Y302D02* -X1688Y302D01* -X1658Y301D02* -X1689Y301D01* -X1660Y300D02* -X1691Y300D01* -X1661Y299D02* -X1692Y299D01* -X1663Y298D02* -X1693Y298D01* -X1664Y297D02* -X1695Y297D01* -X1665Y296D02* -X1696Y296D01* -X1667Y295D02* -X1698Y295D01* -X1668Y294D02* -X1699Y294D01* -X1670Y293D02* -X1700Y293D01* -X1671Y292D02* -X1702Y292D01* -X1673Y291D02* -X1703Y291D01* -X1674Y290D02* -X1703Y290D01* -X1675Y289D02* -X1703Y289D01* -X1677Y288D02* -X1703Y288D01* -X1571Y287D02* -X1703Y287D01* -X1568Y286D02* -X1703Y286D01* -X1567Y285D02* -X1703Y285D01* -X1566Y284D02* -X1703Y284D01* -X1565Y283D02* -X1703Y283D01* -X1564Y282D02* -X1703Y282D01* -X1564Y281D02* -X1703Y281D01* -X1563Y280D02* -X1703Y280D01* -X1563Y279D02* -X1703Y279D01* -X1563Y278D02* -X1703Y278D01* -X1563Y277D02* -X1703Y277D01* -X1563Y276D02* -X1703Y276D01* -X1564Y275D02* -X1703Y275D01* -X1564Y274D02* -X1703Y274D01* -X1565Y273D02* -X1703Y273D01* -X1565Y272D02* -X1703Y272D01* -X1567Y271D02* -X1703Y271D01* -X1568Y270D02* -X1703Y270D01* -X1571Y269D02* -X1702Y269D01* -D02* -G04 End of Copper0* -M02* \ No newline at end of file diff --git a/tests/gerber_files/detector_copper_top.gbr b/tests/gerber_files/detector_copper_top.gbr deleted file mode 100644 index 52b2e2ae..00000000 --- a/tests/gerber_files/detector_copper_top.gbr +++ /dev/null @@ -1,71 +0,0 @@ -G04 MADE WITH FRITZING* -G04 WWW.FRITZING.ORG* -G04 DOUBLE SIDED* -G04 HOLES PLATED* -G04 CONTOUR ON CENTER OF CONTOUR VECTOR* -%ASAXBY*% -%FSLAX23Y23*% -%MOIN*% -%OFA0B0*% -%SFA1.0B1.0*% -%ADD10C,0.075000*% -%ADD11C,0.099055*% -%ADD12C,0.078740*% -%ADD13R,0.075000X0.075000*% -%ADD14C,0.024000*% -%ADD15C,0.020000*% -%LNCOPPER1*% -G90* -G70* -G54D10* -X1149Y872D03* -X1349Y872D03* -X749Y722D03* -X749Y522D03* -X1149Y522D03* -X1449Y522D03* -X1149Y422D03* -X1449Y422D03* -X1149Y322D03* -X1449Y322D03* -X1149Y222D03* -X1449Y222D03* -X949Y472D03* -X949Y72D03* -G54D11* -X749Y972D03* -X599Y972D03* -X349Y322D03* -X349Y472D03* -X349Y672D03* -X349Y822D03* -G54D10* -X699Y122D03* -X699Y322D03* -G54D12* -X699Y222D03* -X949Y972D03* -X749Y622D03* -X1049Y222D03* -X1249Y872D03* -G54D13* -X1149Y872D03* -X1149Y522D03* -G54D14* -X952Y946D02* -X1045Y249D01* -G54D15* -X776Y695D02* -X721Y695D01* -X721Y750D01* -X776Y750D01* -X776Y695D01* -D02* -X671Y150D02* -X726Y150D01* -X726Y95D01* -X671Y95D01* -X671Y150D01* -D02* -G04 End of Copper1* -M02* \ No newline at end of file diff --git a/tests/gerber_files/detector_drill.txt b/tests/gerber_files/detector_drill.txt deleted file mode 100644 index c4945b84..00000000 --- a/tests/gerber_files/detector_drill.txt +++ /dev/null @@ -1,46 +0,0 @@ -; NON-PLATED HOLES START AT T1 -; THROUGH (PLATED) HOLES START AT T100 -M48 -INCH -T1C0.125984 -T100C0.031496 -T101C0.035000 -T102C0.059055 -% -T1 -X001488Y010223 -X001488Y001223 -X016488Y001223 -X016488Y010223 -T100 -X009488Y009723 -X007488Y006223 -X012488Y008723 -X010488Y002223 -X006988Y002223 -T101 -X014488Y004223 -X006988Y003223 -X013488Y008723 -X011488Y008723 -X007488Y005223 -X014488Y003223 -X014488Y002223 -X011488Y005223 -X009488Y000723 -X011488Y004223 -X006988Y001223 -X009488Y004723 -X007488Y007223 -X011488Y003223 -X014488Y005223 -X011488Y002223 -T102 -X003488Y008223 -X003488Y004723 -X007488Y009723 -X003488Y006723 -X005988Y009723 -X003488Y003223 -T00 -M30 diff --git a/tests/gerber_files/simple1.gbr b/tests/gerber_files/simple1.gbr deleted file mode 100644 index 2ca21d77..00000000 --- a/tests/gerber_files/simple1.gbr +++ /dev/null @@ -1,54 +0,0 @@ -G04 MADE WITH FRITZING* -G04 WWW.FRITZING.ORG* -G04 DOUBLE SIDED* -G04 HOLES PLATED* -G04 CONTOUR ON CENTER OF CONTOUR VECTOR* -%ASAXBY*% -%FSLAX23Y23*% -%MOIN*% -%OFA0B0*% -%SFA1.0B1.0*% -%ADD10R,0.047244X0.078740*% -%ADD11C,0.024000*% -%LNCOPPER1*% -G90* -G70* -G54D10* -X2940Y1051D03* -X2940Y941D03* -G54D11* -X2438Y839D02* -X2440Y1023D01* -D02* -X2940Y907D02* -X2941Y839D01* -D02* -X2941Y839D02* -X2438Y839D01* -D02* -X2941Y1239D02* -X2940Y1085D01* -D02* -X2438Y1239D02* -X2941Y1239D01* -D02* -X2440Y1126D02* -X2438Y1239D01* -G36* -X2418Y1064D02* -X2461Y1064D01* -X2461Y1017D01* -X2418Y1017D01* -X2418Y1064D01* -G37* -D02* -G36* -X2418Y1131D02* -X2461Y1131D01* -X2461Y1084D01* -X2418Y1084D01* -X2418Y1131D01* -G37* -D02* -G04 End of Copper1* -M02* \ No newline at end of file diff --git a/tests/gerber_parsing_profiling/gerber1.gbr b/tests/gerber_parsing_profiling/gerber1.gbr deleted file mode 100755 index 245ae335..00000000 --- a/tests/gerber_parsing_profiling/gerber1.gbr +++ /dev/null @@ -1,3045 +0,0 @@ -G04 Generated by Ultiboard 12.0 * -%FSLAX25Y25*% -%MOMM*% - -%ADD10C,0.00001*% -%ADD11C,0.25400*% -%ADD12C,0.50800*% -%ADD13C,1.90500*% -%ADD14C,0.12700*% -%ADD15C,2.00000*% -%ADD16R,1.80000X1.15000*% -%ADD17C,1.60884*% -%ADD18R,0.67742X0.67742*% -%ADD19C,0.84658*% -%ADD20R,0.76200X0.76200*% -%ADD21C,0.50800*% -%ADD22R,1.27000X1.27000*% -%ADD23R,2.70000X1.15000*% -%ADD24R,1.15000X1.45000*% -%ADD25R,1.15000X2.70000*% -%ADD26R,0.52908X0.52908*% -%ADD27C,0.99492*% -%ADD28C,1.80000*% -%ADD29R,1.80000X1.80000*% -%ADD30R,2.57000X2.80000*% -%ADD31C,1.98984*% - - -G04 ColorRGB 002000 for the following layer * -%LNCopper Top*% -%LPD*% -G54D10* -G36* -X1590549Y63807D02* -X1590549Y63807D01* -X3936193Y63807D01* -X3936193Y6436193D01* -X63807Y6436193D01* -X63807Y63807D01* -X1254251Y63807D01* -G75* -D01* -G02X1230093Y113800I39649J49993* -G01* -X1230093Y113800D01* -X1230093Y185606D01* -X1354206Y185606D01* -X1354206Y63807D01* -X1490594Y63807D01* -X1490594Y185606D01* -X1614707Y185606D01* -X1614707Y113800D01* -G75* -D01* -G02X1590549Y63807I-63807J0* -G01* -D02* -G37* -%LPC*% -G36* -X2821307Y4787900D02* -X2821307Y4787900D01* -X2821307Y4717860D01* -G75* -D01* -G02X2855900Y4724830I34593J-82359* -G01* -X2855900Y4724830D01* -X2932100Y4724830D01* -G74* -D01* -G02X3021430Y4635500I0J89330* -G01* -X3021430Y4635500D01* -X3021430Y4559300D01* -G75* -D01* -G02X2940855Y4470400I-89330J0* -G01* -G74* -D01* -G02X3021430Y4381500I8755J88900* -G01* -X3021430Y4381500D01* -X3021430Y4379662D01* -X3024710Y4382942D01* -X3024710Y5027758D01* -X2858598Y5193870D01* -X1490507Y5193870D01* -X1490507Y5148200D01* -G75* -D01* -G02X1426700Y5084393I-63807J0* -G01* -X1426700Y5084393D01* -X1311700Y5084393D01* -G75* -D01* -G02X1247893Y5148200I0J63807* -G01* -X1247893Y5148200D01* -X1247893Y5418200D01* -G75* -D01* -G02X1311700Y5482007I63807J0* -G01* -X1311700Y5482007D01* -X1426700Y5482007D01* -G74* -D01* -G02X1490507Y5418200I0J63807* -G01* -X1490507Y5418200D01* -X1490507Y5372530D01* -X2022842Y5372530D01* -G75* -D01* -G02X2244358Y5372530I110758J120269* -G01* -X2244358Y5372530D01* -X2530842Y5372530D01* -G75* -D01* -G02X2752358Y5372530I110758J120269* -G01* -X2752358Y5372530D01* -X2895490Y5372530D01* -G75* -D01* -G02X2928856Y5366109I110J-89330* -G01* -G74* -D01* -G02X2958845Y5346286I33257J82908* -G01* -X2958845Y5346286D01* -X3177126Y5128005D01* -G74* -D01* -G02X3203370Y5064760I63085J63245* -G01* -X3203370Y5064760D01* -X3203370Y4345940D01* -G75* -D01* -G02X3177126Y4282695I-89330J1* -G01* -X3177126Y4282695D01* -X3047745Y4153314D01* -G74* -D01* -G02X3021121Y4134921I63246J63084* -G01* -G74* -D01* -G02X3021430Y4127500I89020J7424* -G01* -X3021430Y4127500D01* -X3021430Y4051300D01* -G75* -D01* -G02X2940855Y3962400I-89330J0* -G01* -G74* -D01* -G02X3021148Y3880588I8755J88900* -G01* -X3021148Y3880588D01* -X2939188Y3880588D01* -X2939188Y3962252D01* -G74* -D01* -G02X2932100Y3961970I7092J89047* -G01* -X2932100Y3961970D01* -X2855900Y3961970D01* -G75* -D01* -G02X2848812Y3962252I4J89330* -G01* -X2848812Y3962252D01* -X2848812Y3880588D01* -X2810004Y3880588D01* -G74* -D01* -G02X2740855Y3835400I77904J43711* -G01* -G74* -D01* -G02X2810004Y3790212I8756J88900* -G01* -X2810004Y3790212D01* -X2848812Y3790212D01* -X2848812Y3708548D01* -G75* -D01* -G02X2855900Y3708830I7092J-89047* -G01* -X2855900Y3708830D01* -X2932100Y3708830D01* -G74* -D01* -G02X2939188Y3708548I4J89330* -G01* -X2939188Y3708548D01* -X2939188Y3790212D01* -X3021148Y3790212D01* -G74* -D01* -G02X2940855Y3708400I89047J7087* -G01* -G74* -D01* -G02X3021430Y3619500I8755J88900* -G01* -X3021430Y3619500D01* -X3021430Y3543300D01* -G75* -D01* -G02X2940855Y3454400I-89330J0* -G01* -G74* -D01* -G02X3021430Y3365500I8755J88900* -G01* -X3021430Y3365500D01* -X3021430Y3289300D01* -G75* -D01* -G02X3001389Y3232918I-89330J0* -G01* -X3001389Y3232918D01* -X3318326Y3232918D01* -G75* -D01* -G02X3364423Y3252607I46097J-44117* -G01* -X3364423Y3252607D01* -X3412122Y3252607D01* -G75* -D01* -G02X3496724Y3252607I42301J-153806* -G01* -X3496724Y3252607D01* -X3544423Y3252607D01* -G74* -D01* -G02X3608231Y3188800I1J63807* -G01* -X3608231Y3188800D01* -X3608231Y3141101D01* -G75* -D01* -G02X3608231Y3056499I-153807J-42301* -G01* -X3608231Y3056499D01* -X3608231Y3008800D01* -G75* -D01* -G02X3544423Y2944993I-63808J1* -G01* -X3544423Y2944993D01* -X3523668Y2944993D01* -G74* -D01* -G02X3429023Y2913882I94645J128407* -G01* -X3429023Y2913882D01* -X3001389Y2913882D01* -G74* -D01* -G02X3021430Y2857500I69289J56382* -G01* -X3021430Y2857500D01* -X3021430Y2781300D01* -G75* -D01* -G02X2940855Y2692400I-89330J0* -G01* -G74* -D01* -G02X3021148Y2610588I8755J88900* -G01* -X3021148Y2610588D01* -X2939188Y2610588D01* -X2939188Y2692252D01* -G74* -D01* -G02X2932100Y2691970I7092J89047* -G01* -X2932100Y2691970D01* -X2855900Y2691970D01* -G75* -D01* -G02X2848812Y2692252I4J89330* -G01* -X2848812Y2692252D01* -X2848812Y2610588D01* -X2810004Y2610588D01* -G74* -D01* -G02X2740855Y2565400I77904J43711* -G01* -G74* -D01* -G02X2810004Y2520212I8756J88900* -G01* -X2810004Y2520212D01* -X2848812Y2520212D01* -X2848812Y2438548D01* -G75* -D01* -G02X2855900Y2438830I7092J-89047* -G01* -X2855900Y2438830D01* -X2932100Y2438830D01* -G74* -D01* -G02X2939188Y2438548I4J89330* -G01* -X2939188Y2438548D01* -X2939188Y2520212D01* -X3021148Y2520212D01* -G74* -D01* -G02X2940855Y2438400I89047J7087* -G01* -G74* -D01* -G02X3021430Y2349500I8755J88900* -G01* -X3021430Y2349500D01* -X3021430Y2273300D01* -G75* -D01* -G02X2940855Y2184400I-89330J0* -G01* -G74* -D01* -G02X3021430Y2095500I8755J88900* -G01* -X3021430Y2095500D01* -X3021430Y2019300D01* -G75* -D01* -G02X2940855Y1930400I-89330J0* -G01* -G74* -D01* -G02X3021430Y1841500I8755J88900* -G01* -X3021430Y1841500D01* -X3021430Y1765300D01* -G75* -D01* -G02X2932100Y1675970I-89330J0* -G01* -X2932100Y1675970D01* -X2855900Y1675970D01* -G75* -D01* -G02X2821430Y1682888I-1J89330* -G01* -X2821430Y1682888D01* -X2821430Y1638300D01* -G75* -D01* -G02X2732100Y1548970I-89330J0* -G01* -X2732100Y1548970D01* -X2655900Y1548970D01* -G75* -D01* -G02X2566570Y1638300I0J89330* -G01* -X2566570Y1638300D01* -X2566570Y1714500D01* -G74* -D01* -G02X2647145Y1803400I89330J0* -G01* -G75* -D01* -G02X2566570Y1892300I8755J88900* -G01* -X2566570Y1892300D01* -X2566570Y1968500D01* -G74* -D01* -G02X2647145Y2057400I89330J0* -G01* -G74* -D01* -G02X2582720Y2095070I8755J88900* -G01* -X2582720Y2095070D01* -X2045877Y2095070D01* -G75* -D01* -G02X1982664Y2121234I-47J89330* -G01* -X1982664Y2121234D01* -X1562434Y2541464D01* -G75* -D01* -G02X1536270Y2604716I63166J63166* -G01* -X1536270Y2604716D01* -X1536270Y2878293D01* -X1490600Y2878293D01* -G75* -D01* -G02X1427407Y2933270I0J63807* -G01* -X1427407Y2933270D01* -X725170Y2933270D01* -G75* -D01* -G02X701417Y2936486I0J89330* -G01* -G74* -D01* -G02X662004Y2959434I23752J86113* -G01* -X662004Y2959434D01* -X597330Y3024108D01* -X597330Y2563005D01* -G74* -D01* -G02X648212Y2472271I55458J90734* -G01* -X648212Y2472271D01* -X648212Y2404529D01* -G75* -D01* -G02X597330Y2313795I-106341J0* -G01* -X597330Y2313795D01* -X597330Y2297269D01* -G75* -D01* -G02X597330Y2071531I-89329J-112869* -G01* -X597330Y2071531D01* -X597330Y2043269D01* -G75* -D01* -G02X597330Y1817531I-89329J-112869* -G01* -X597330Y1817531D01* -X597330Y1789269D01* -G75* -D01* -G02X597330Y1563531I-89329J-112869* -G01* -X597330Y1563531D01* -X597330Y1486330D01* -X1473200Y1486330D01* -G74* -D01* -G02X1536445Y1460086I1J89330* -G01* -X1536445Y1460086D01* -X1815686Y1180845D01* -G74* -D01* -G02X1827393Y1166446I63083J63248* -G01* -X1827393Y1166446D01* -X1827393Y1172700D01* -G75* -D01* -G02X1891200Y1236507I63807J0* -G01* -X1891200Y1236507D01* -X1891870Y1236507D01* -X1891870Y1239969D01* -G75* -D01* -G02X1918034Y1303266I89330J131* -G01* -X1918034Y1303266D01* -X2032334Y1417566D01* -G74* -D01* -G02X2052310Y1432595I63165J63167* -G01* -G75* -D01* -G02X2309229Y1443730I132090J-78194* -G01* -X2309229Y1443730D01* -X2362157Y1443730D01* -G75* -D01* -G02X2370371Y1443356I48J-89330* -G01* -G74* -D01* -G02X2425445Y1417486I8172J88955* -G01* -X2425445Y1417486D01* -X2603086Y1239845D01* -G74* -D01* -G02X2629330Y1176600I63085J63245* -G01* -X2629330Y1176600D01* -X2629330Y644332D01* -G74* -D01* -G02X2702712Y517549I89329J136332* -G01* -X2702712Y517549D01* -X2712261Y508000D01* -X2702712Y498451D01* -G75* -D01* -G02X2413000Y405837I-162711J9547* -G01* -G75* -D01* -G02X2196670Y644332I-126997J102166* -G01* -X2196670Y644332D01* -X2196670Y693893D01* -X2196000Y693893D01* -G75* -D01* -G02X2140699Y725870I0J63807* -G01* -X2140699Y725870D01* -X2126501Y725870D01* -G74* -D01* -G02X2071200Y693893I55301J31830* -G01* -X2071200Y693893D01* -X1891200Y693893D01* -G75* -D01* -G02X1835899Y725870I0J63807* -G01* -X1835899Y725870D01* -X1826450Y725870D01* -G75* -D01* -G02X1763234Y752034I-50J89330* -G01* -X1763234Y752034D01* -X1689434Y825834D01* -G75* -D01* -G02X1663270Y889088I63166J63166* -G01* -X1663270Y889088D01* -X1663270Y1080598D01* -X1625968Y1117900D01* -G74* -D01* -G02X1625969Y1117600I76567J405* -G01* -X1625969Y1117600D01* -X1625969Y736600D01* -G75* -D01* -G02X1567930Y662307I-76569J0* -G01* -G74* -D01* -G02X1550900Y659993I17028J61493* -G01* -X1550900Y659993D01* -X1293900Y659993D01* -G75* -D01* -G02X1276871Y662307I-1J63807* -G01* -G74* -D01* -G02X1266963Y665508I18531J74292* -G01* -X1266963Y665508D01* -X758963Y868708D01* -G75* -D01* -G02X710831Y939939I28436J71092* -G01* -X710831Y939939D01* -X710831Y1117600D01* -G75* -D01* -G02X787400Y1194169I76569J0* -G01* -X787400Y1194169D01* -X1549400Y1194169D01* -G74* -D01* -G02X1549700Y1194168I105J76569* -G01* -X1549700Y1194168D01* -X1436198Y1307670D01* -X508000Y1307670D01* -G75* -D01* -G02X418670Y1397000I0J89330* -G01* -X418670Y1397000D01* -X418670Y1563531D01* -G75* -D01* -G02X418670Y1789269I89329J112869* -G01* -X418670Y1789269D01* -X418670Y1817531D01* -G75* -D01* -G02X418670Y2043269I89329J112869* -G01* -X418670Y2043269D01* -X418670Y2071531D01* -G75* -D01* -G02X418670Y2297269I89329J112869* -G01* -X418670Y2297269D01* -X418670Y2313795D01* -G75* -D01* -G02X367788Y2404529I55458J90734* -G01* -X367788Y2404529D01* -X367788Y2472271D01* -G74* -D01* -G02X418670Y2563005I106341J0* -G01* -X418670Y2563005D01* -X418670Y4408331D01* -G75* -D01* -G02X418670Y4634069I89329J112869* -G01* -X418670Y4634069D01* -X418670Y4650595D01* -G75* -D01* -G02X367788Y4741329I55458J90734* -G01* -X367788Y4741329D01* -X367788Y4809071D01* -G74* -D01* -G02X418670Y4899805I106341J0* -G01* -X418670Y4899805D01* -X418670Y5029034D01* -G75* -D01* -G02X444834Y5092366I89330J166* -G01* -X444834Y5092366D01* -X698834Y5346366D01* -G74* -D01* -G02X749888Y5371705I63166J63166* -G01* -G75* -D01* -G02X762000Y5372530I12112J-88504* -G01* -X762000Y5372530D01* -X947893Y5372530D01* -X947893Y5418200D01* -G75* -D01* -G02X1011700Y5482007I63807J0* -G01* -X1011700Y5482007D01* -X1126700Y5482007D01* -G74* -D01* -G02X1190507Y5418200I0J63807* -G01* -X1190507Y5418200D01* -X1190507Y5148200D01* -G75* -D01* -G02X1126700Y5084393I-63807J0* -G01* -X1126700Y5084393D01* -X1011700Y5084393D01* -G75* -D01* -G02X947893Y5148200I0J63807* -G01* -X947893Y5148200D01* -X947893Y5193870D01* -X799002Y5193870D01* -X597330Y4992198D01* -X597330Y4899805D01* -G74* -D01* -G02X648212Y4809071I55458J90734* -G01* -X648212Y4809071D01* -X648212Y4741329D01* -G75* -D01* -G02X597330Y4650595I-106341J0* -G01* -X597330Y4650595D01* -X597330Y4634069D01* -G75* -D01* -G02X597330Y4408331I-89329J-112869* -G01* -X597330Y4408331D01* -X597330Y4379992D01* -X646904Y4429566D01* -G74* -D01* -G02X677608Y4449623I63166J63166* -G01* -G75* -D01* -G02X710070Y4455730I32462J-83223* -G01* -X710070Y4455730D01* -X1141809Y4455730D01* -G75* -D01* -G02X1202249Y4648200I128190J65470* -G01* -G75* -D01* -G02X1382869Y4864530I67754J126998* -G01* -X1382869Y4864530D01* -X2640232Y4864530D01* -G75* -D01* -G02X2669697Y4859565I98J-89330* -G01* -G74* -D01* -G02X2686444Y4851707I29368J84364* -G01* -X2686444Y4851707D01* -X2757500Y4851707D01* -G74* -D01* -G02X2821307Y4787900I0J63807* -G01* -D02* -G37* -G36* -X1202249Y2311400D02* -G75* -D01* -G02X1337751Y2311400I67751J126999* -G01* -G75* -D01* -G02X1337751Y2057400I-67750J-127000* -G01* -G75* -D01* -G02X1337751Y1803400I-67750J-127000* -G01* -G75* -D01* -G02X1202249Y1803400I-67751J-126999* -G01* -G75* -D01* -G02X1202249Y2057400I67750J127000* -G01* -G75* -D01* -G02X1202249Y2311400I67750J127000* -G01* -D02* -G37* -G36* -X2986100Y5492800D02* -G75* -D01* -G02X2986100Y5492800I163500J0* -G01* -D02* -G37* -G36* -X3494100Y5492800D02* -G75* -D01* -G02X3494100Y5492800I163500J0* -G01* -D02* -G37* -G36* -X2864000Y2565400D02* -G75* -D01* -G02X2864000Y2565400I30000J0* -G01* -D02* -G37* -G36* -X2864000Y3835400D02* -G75* -D01* -G02X2864000Y3835400I30000J0* -G01* -D02* -G37* -G36* -X2860893Y359367D02* -G75* -D01* -G02X2727107Y359367I-66893J148633* -G01* -X2727107Y359367D01* -X2794000Y426261D01* -X2860893Y359367D01* -D02* -G37* -G36* -X3300593Y351300D02* -X3300593Y351300D01* -X3300593Y365783D01* -X3411383Y365783D01* -X3411383Y287493D01* -X3364400Y287493D01* -G75* -D01* -G02X3300593Y351300I0J63807* -G01* -D02* -G37* -G36* -X3608207Y351300D02* -G75* -D01* -G02X3544400Y287493I-63807J0* -G01* -X3544400Y287493D01* -X3497417Y287493D01* -X3497417Y365783D01* -X3608207Y365783D01* -X3608207Y351300D01* -D02* -G37* -G36* -X2727107Y656633D02* -G75* -D01* -G02X2860893Y656633I66893J-148633* -G01* -X2860893Y656633D01* -X2794000Y589739D01* -X2727107Y656633D01* -D02* -G37* -G36* -X2734729Y508000D02* -G75* -D01* -G02X2734729Y508000I59271J0* -G01* -D02* -G37* -G36* -X2942633Y574893D02* -G75* -D01* -G02X2942633Y441107I-148633J-66893* -G01* -X2942633Y441107D01* -X2875739Y508000D01* -X2942633Y574893D01* -D02* -G37* -G36* -X3364400Y530107D02* -X3364400Y530107D01* -X3411383Y530107D01* -X3411383Y451817D01* -X3300593Y451817D01* -X3300593Y466300D01* -G75* -D01* -G02X3364400Y530107I63807J0* -G01* -D02* -G37* -G36* -X3543730Y873971D02* -X3543730Y873971D01* -X3543730Y830107D01* -X3544400Y830107D01* -G74* -D01* -G02X3608207Y766300I0J63807* -G01* -X3608207Y766300D01* -X3608207Y651300D01* -G75* -D01* -G02X3544400Y587493I-63807J0* -G01* -X3544400Y587493D01* -X3364400Y587493D01* -G75* -D01* -G02X3300593Y651300I0J63807* -G01* -X3300593Y651300D01* -X3300593Y766300D01* -G75* -D01* -G02X3364400Y830107I63807J0* -G01* -X3364400Y830107D01* -X3365070Y830107D01* -X3365070Y873971D01* -G75* -D01* -G02X3543730Y873971I89330J124828* -G01* -D02* -G37* -G36* -X3608207Y466300D02* -X3608207Y466300D01* -X3608207Y451817D01* -X3497417Y451817D01* -X3497417Y530107D01* -X3544400Y530107D01* -G74* -D01* -G02X3608207Y466300I0J63807* -G01* -D02* -G37* -G36* -X1230093Y393800D02* -G75* -D01* -G02X1293900Y457607I63807J0* -G01* -X1293900Y457607D01* -X1354206Y457607D01* -X1354206Y321994D01* -X1230093Y321994D01* -X1230093Y393800D01* -D02* -G37* -G36* -X1614707Y393800D02* -X1614707Y393800D01* -X1614707Y321994D01* -X1490594Y321994D01* -X1490594Y457607D01* -X1550900Y457607D01* -G74* -D01* -G02X1614707Y393800I0J63807* -G01* -D02* -G37* -G36* -X242900Y1009600D02* -G75* -D01* -G02X242900Y1009600I163500J0* -G01* -D02* -G37* -%LPD*% -G36* -X1760600Y2878293D02* -X1760600Y2878293D01* -X1714930Y2878293D01* -X1714930Y2641632D01* -X2020369Y2336193D01* -X2082832Y2273730D01* -X2582720Y2273730D01* -G74* -D01* -G02X2647145Y2311400I73180J51229* -G01* -G75* -D01* -G02X2566570Y2400300I8755J88900* -G01* -X2566570Y2400300D01* -X2566570Y2476500D01* -G74* -D01* -G02X2647145Y2565400I89330J0* -G01* -G75* -D01* -G02X2566570Y2654300I8755J88900* -G01* -X2566570Y2654300D01* -X2566570Y2730500D01* -G74* -D01* -G02X2647145Y2819400I89330J0* -G01* -G75* -D01* -G02X2566570Y2908300I8755J88900* -G01* -X2566570Y2908300D01* -X2566570Y2984500D01* -G74* -D01* -G02X2647145Y3073400I89330J0* -G01* -G75* -D01* -G02X2566570Y3162300I8755J88900* -G01* -X2566570Y3162300D01* -X2566570Y3238500D01* -G74* -D01* -G02X2586611Y3294882I89330J0* -G01* -X2586611Y3294882D01* -X2184423Y3294882D01* -G75* -D01* -G02X2142122Y3300593I0J159518* -G01* -X2142122Y3300593D01* -X2094423Y3300593D01* -G75* -D01* -G02X2030616Y3364400I0J63807* -G01* -X2030616Y3364400D01* -X2030616Y3412099D01* -G75* -D01* -G02X2030616Y3496701I153806J42301* -G01* -X2030616Y3496701D01* -X2030616Y3544400D01* -G75* -D01* -G02X2094423Y3608207I63807J0* -G01* -X2094423Y3608207D01* -X2142122Y3608207D01* -G75* -D01* -G02X2184423Y3613918I42301J-153806* -G01* -X2184423Y3613918D01* -X2586611Y3613918D01* -G75* -D01* -G02X2566570Y3670300I69289J56382* -G01* -X2566570Y3670300D01* -X2566570Y3746500D01* -G74* -D01* -G02X2647145Y3835400I89330J0* -G01* -G74* -D01* -G02X2582720Y3873070I8755J88900* -G01* -X2582720Y3873070D01* -X2495048Y3873070D01* -G74* -D01* -G02X2433500Y3826093I61547J16830* -G01* -X2433500Y3826093D01* -X2318500Y3826093D01* -G75* -D01* -G02X2286000Y3834990I0J63807* -G01* -G74* -D01* -G02X2253500Y3826093I32500J54910* -G01* -X2253500Y3826093D01* -X2138500Y3826093D01* -G75* -D01* -G02X2093648Y3844516I-1J63807* -G01* -X2093648Y3844516D01* -X1714930Y3465798D01* -X1714930Y3420907D01* -X1760600Y3420907D01* -G74* -D01* -G02X1824407Y3357100I0J63807* -G01* -X1824407Y3357100D01* -X1824407Y3242100D01* -G75* -D01* -G02X1760600Y3178293I-63807J0* -G01* -X1760600Y3178293D01* -X1490600Y3178293D01* -G75* -D01* -G02X1433985Y3212670I0J63807* -G01* -X1433985Y3212670D01* -X1252630Y3212670D01* -G75* -D01* -G02X1201009Y3212670I-25810J85519* -G01* -X1201009Y3212670D01* -X925669Y3212670D01* -G75* -D01* -G02X702740Y3209231I-112869J89329* -G01* -X702740Y3209231D01* -X702740Y3171362D01* -X762172Y3111930D01* -X1457965Y3111930D01* -G75* -D01* -G02X1490600Y3120907I32634J-54830* -G01* -X1490600Y3120907D01* -X1760600Y3120907D01* -G74* -D01* -G02X1824407Y3057100I0J63807* -G01* -X1824407Y3057100D01* -X1824407Y2942100D01* -G75* -D01* -G02X1760600Y2878293I-63807J0* -G01* -D02* -G37* -G36* -X699445Y3644713D02* -G74* -D01* -G03X646764Y3619166I10485J88713* -G01* -X646764Y3619166D01* -X597330Y3569732D01* -X597330Y4127328D01* -X747072Y4277070D01* -X1435299Y4277070D01* -G75* -D01* -G03X1490600Y4245093I55301J31830* -G01* -X1490600Y4245093D01* -X1760600Y4245093D01* -G75* -D01* -G03X1824407Y4308900I0J63807* -G01* -X1824407Y4308900D01* -X1824407Y4423900D01* -G74* -D01* -G03X1760600Y4487707I63807J0* -G01* -X1760600Y4487707D01* -X1490600Y4487707D01* -G75* -D01* -G03X1435299Y4455730I0J-63807* -G01* -X1435299Y4455730D01* -X1398191Y4455730D01* -G74* -D01* -G03X1413342Y4508070I128190J65470* -G01* -X1413342Y4508070D01* -X2056368Y4508070D01* -X1736005Y4187707D01* -X1490600Y4187707D01* -G75* -D01* -G03X1433985Y4153330I0J-63807* -G01* -X1433985Y4153330D01* -X934099Y4153330D01* -G74* -D01* -G03X839254Y4204248I94845J62875* -G01* -X839254Y4204248D01* -X786346Y4204248D01* -G75* -D01* -G03X672552Y4090454I0J-113794* -G01* -X672552Y4090454D01* -X672552Y4037546D01* -G75* -D01* -G03X739463Y3933859I113794J0* -G01* -G75* -D01* -G03X745049Y3683000I73337J-123859* -G01* -G74* -D01* -G03X699445Y3644713I67749J127000* -G01* -D02* -G37* -G36* -X2376000Y993893D02* -X2376000Y993893D01* -X2196000Y993893D01* -G75* -D01* -G02X2140699Y1025870I0J63807* -G01* -X2140699Y1025870D01* -X2126501Y1025870D01* -G74* -D01* -G02X2071200Y993893I55301J31830* -G01* -X2071200Y993893D01* -X1891200Y993893D01* -G75* -D01* -G02X1841930Y1017156I0J63807* -G01* -X1841930Y1017156D01* -X1841930Y926002D01* -X1848142Y919789D01* -G75* -D01* -G02X1891200Y936507I43058J-47089* -G01* -X1891200Y936507D01* -X2071200Y936507D01* -G74* -D01* -G02X2126501Y904530I0J63807* -G01* -X2126501Y904530D01* -X2140699Y904530D01* -G75* -D01* -G02X2196000Y936507I55301J-31830* -G01* -X2196000Y936507D01* -X2376000Y936507D01* -G74* -D01* -G02X2439807Y872700I0J63807* -G01* -X2439807Y872700D01* -X2439807Y757700D01* -G75* -D01* -G02X2376000Y693893I-63807J0* -G01* -X2376000Y693893D01* -X2375330Y693893D01* -X2375330Y644332D01* -G74* -D01* -G02X2413000Y610163I89329J136332* -G01* -G74* -D01* -G02X2450670Y644332I126999J102163* -G01* -X2450670Y644332D01* -X2450670Y1139598D01* -X2439807Y1150461D01* -X2439807Y1057700D01* -G75* -D01* -G02X2376000Y993893I-63807J0* -G01* -D02* -G37* -G36* -X787400Y1117600D02* -X787400Y1117600D01* -X1549400Y1117600D01* -X1549400Y736600D01* -X1295400Y736600D01* -X787400Y939800D01* -X787400Y1117600D01* -D02* -G37* -G36* -X925669Y3391330D02* -G74* -D01* -G03X880551Y3429000I112868J89330* -G01* -G75* -D01* -G03X880551Y3683000I-67750J127000* -G01* -G74* -D01* -G03X925669Y3720670I67750J127000* -G01* -X925669Y3720670D01* -X1129185Y3720670D01* -G75* -D01* -G03X1185800Y3686293I56615J29430* -G01* -X1185800Y3686293D01* -X1455800Y3686293D01* -G74* -D01* -G03X1512415Y3720670I0J63807* -G01* -X1512415Y3720670D01* -X1715696Y3720670D01* -G75* -D01* -G03X1717149Y3720681I50J89330* -G01* -X1717149Y3720681D01* -X1562434Y3565966D01* -G75* -D01* -G03X1536270Y3502656I63166J-63166* -G01* -X1536270Y3502656D01* -X1536270Y3420907D01* -X1512537Y3420907D01* -G75* -D01* -G03X1519607Y3450100I-56736J29193* -G01* -X1519607Y3450100D01* -X1519607Y3565100D01* -G74* -D01* -G03X1455800Y3628907I63807J0* -G01* -X1455800Y3628907D01* -X1185800Y3628907D01* -G75* -D01* -G03X1121993Y3565100I0J-63807* -G01* -X1121993Y3565100D01* -X1121993Y3450100D01* -G75* -D01* -G03X1160951Y3391330I63807J0* -G01* -X1160951Y3391330D01* -X925669Y3391330D01* -D02* -G37* -G36* -X2566570Y4178300D02* -X2566570Y4178300D01* -X2566570Y4254070D01* -X2286172Y4254070D01* -X2130277Y4098175D01* -G75* -D01* -G02X2138500Y4098707I8222J-63275* -G01* -X2138500Y4098707D01* -X2253500Y4098707D01* -G74* -D01* -G02X2286000Y4089810I0J63807* -G01* -G75* -D01* -G02X2318500Y4098707I32500J-54910* -G01* -X2318500Y4098707D01* -X2433500Y4098707D01* -G74* -D01* -G02X2495048Y4051730I1J63807* -G01* -X2495048Y4051730D01* -X2582720Y4051730D01* -G74* -D01* -G02X2647145Y4089400I73180J51229* -G01* -G75* -D01* -G02X2566570Y4178300I8755J88900* -G01* -D02* -G37* -G36* -X925669Y3899330D02* -G74* -D01* -G03X886137Y3933859I112869J89329* -G01* -G74* -D01* -G03X934099Y3974670I46883J103686* -G01* -X934099Y3974670D01* -X1436752Y3974670D01* -G75* -D01* -G03X1490600Y3945093I53848J34229* -G01* -X1490600Y3945093D01* -X1724531Y3945093D01* -X1678768Y3899330D01* -X1509648Y3899330D01* -G74* -D01* -G03X1455800Y3928907I53848J34229* -G01* -X1455800Y3928907D01* -X1185800Y3928907D01* -G75* -D01* -G03X1131952Y3899330I0J-63807* -G01* -X1131952Y3899330D01* -X925669Y3899330D01* -D02* -G37* -G36* -X2309229Y1265070D02* -X2309229Y1265070D01* -X2325198Y1265070D01* -X2353761Y1236507D01* -X2282703Y1236507D01* -G74* -D01* -G03X2309229Y1265070I98303J117891* -G01* -D02* -G37* -G54D11* -X787400Y1117600D02* -X1549400Y1117600D01* -X1549400Y736600D01* -X1295400Y736600D01* -X787400Y939800D01* -X787400Y1117600D01* -X2821307Y4787900D02* -X2821307Y4717860D01* -G75* -D01* -G02X2855900Y4724830I34593J-82359* -G01* -X2932100Y4724830D01* -G74* -D01* -G02X3021430Y4635500I0J89330* -G01* -X3021430Y4559300D01* -G75* -D01* -G02X2940855Y4470400I-89330J0* -G01* -G74* -D01* -G02X3021430Y4381500I8755J88900* -G01* -X3021430Y4379662D01* -X3024710Y4382942D01* -X3024710Y5027758D01* -X2858598Y5193870D01* -X1490507Y5193870D01* -X1490507Y5148200D01* -G75* -D01* -G02X1426700Y5084393I-63807J0* -G01* -X1311700Y5084393D01* -G75* -D01* -G02X1247893Y5148200I0J63807* -G01* -X1247893Y5418200D01* -G75* -D01* -G02X1311700Y5482007I63807J0* -G01* -X1426700Y5482007D01* -G74* -D01* -G02X1490507Y5418200I0J63807* -G01* -X1490507Y5372530D01* -X2022842Y5372530D01* -G75* -D01* -G02X2244358Y5372530I110758J120269* -G01* -X2530842Y5372530D01* -G75* -D01* -G02X2752358Y5372530I110758J120269* -G01* -X2895490Y5372530D01* -G75* -D01* -G02X2928856Y5366109I110J-89330* -G01* -G74* -D01* -G02X2958845Y5346286I33257J82908* -G01* -X3177126Y5128005D01* -G74* -D01* -G02X3203370Y5064760I63085J63245* -G01* -X3203370Y4345940D01* -G75* -D01* -G02X3177126Y4282695I-89330J1* -G01* -X3047745Y4153314D01* -G74* -D01* -G02X3021121Y4134921I63246J63084* -G01* -G74* -D01* -G02X3021430Y4127500I89020J7424* -G01* -X3021430Y4051300D01* -G75* -D01* -G02X2940855Y3962400I-89330J0* -G01* -G74* -D01* -G02X3021148Y3880588I8755J88900* -G01* -X2939188Y3880588D01* -X2939188Y3962252D01* -G74* -D01* -G02X2932100Y3961970I7092J89047* -G01* -X2855900Y3961970D01* -G75* -D01* -G02X2848812Y3962252I4J89330* -G01* -X2848812Y3880588D01* -X2810004Y3880588D01* -G74* -D01* -G02X2740855Y3835400I77904J43711* -G01* -G74* -D01* -G02X2810004Y3790212I8756J88900* -G01* -X2848812Y3790212D01* -X2848812Y3708548D01* -G75* -D01* -G02X2855900Y3708830I7092J-89047* -G01* -X2932100Y3708830D01* -G74* -D01* -G02X2939188Y3708548I4J89330* -G01* -X2939188Y3790212D01* -X3021148Y3790212D01* -G74* -D01* -G02X2940855Y3708400I89047J7087* -G01* -G74* -D01* -G02X3021430Y3619500I8755J88900* -G01* -X3021430Y3543300D01* -G75* -D01* -G02X2940855Y3454400I-89330J0* -G01* -G74* -D01* -G02X3021430Y3365500I8755J88900* -G01* -X3021430Y3289300D01* -G75* -D01* -G02X3001389Y3232918I-89330J0* -G01* -X3318326Y3232918D01* -G75* -D01* -G02X3364423Y3252607I46097J-44117* -G01* -X3412122Y3252607D01* -G75* -D01* -G02X3496724Y3252607I42301J-153806* -G01* -X3544423Y3252607D01* -G74* -D01* -G02X3608231Y3188800I1J63807* -G01* -X3608231Y3141101D01* -G75* -D01* -G02X3608231Y3056499I-153807J-42301* -G01* -X3608231Y3008800D01* -G75* -D01* -G02X3544423Y2944993I-63808J1* -G01* -X3523668Y2944993D01* -G74* -D01* -G02X3429023Y2913882I94645J128407* -G01* -X3001389Y2913882D01* -G74* -D01* -G02X3021430Y2857500I69289J56382* -G01* -X3021430Y2781300D01* -G75* -D01* -G02X2940855Y2692400I-89330J0* -G01* -G74* -D01* -G02X3021148Y2610588I8755J88900* -G01* -X2939188Y2610588D01* -X2939188Y2692252D01* -G74* -D01* -G02X2932100Y2691970I7092J89047* -G01* -X2855900Y2691970D01* -G75* -D01* -G02X2848812Y2692252I4J89330* -G01* -X2848812Y2610588D01* -X2810004Y2610588D01* -G74* -D01* -G02X2740855Y2565400I77904J43711* -G01* -G74* -D01* -G02X2810004Y2520212I8756J88900* -G01* -X2848812Y2520212D01* -X2848812Y2438548D01* -G75* -D01* -G02X2855900Y2438830I7092J-89047* -G01* -X2932100Y2438830D01* -G74* -D01* -G02X2939188Y2438548I4J89330* -G01* -X2939188Y2520212D01* -X3021148Y2520212D01* -G74* -D01* -G02X2940855Y2438400I89047J7087* -G01* -G74* -D01* -G02X3021430Y2349500I8755J88900* -G01* -X3021430Y2273300D01* -G75* -D01* -G02X2940855Y2184400I-89330J0* -G01* -G74* -D01* -G02X3021430Y2095500I8755J88900* -G01* -X3021430Y2019300D01* -G75* -D01* -G02X2940855Y1930400I-89330J0* -G01* -G74* -D01* -G02X3021430Y1841500I8755J88900* -G01* -X3021430Y1765300D01* -G75* -D01* -G02X2932100Y1675970I-89330J0* -G01* -X2855900Y1675970D01* -G75* -D01* -G02X2821430Y1682888I-1J89330* -G01* -X2821430Y1638300D01* -G75* -D01* -G02X2732100Y1548970I-89330J0* -G01* -X2655900Y1548970D01* -G75* -D01* -G02X2566570Y1638300I0J89330* -G01* -X2566570Y1714500D01* -G74* -D01* -G02X2647145Y1803400I89330J0* -G01* -G75* -D01* -G02X2566570Y1892300I8755J88900* -G01* -X2566570Y1968500D01* -G74* -D01* -G02X2647145Y2057400I89330J0* -G01* -G74* -D01* -G02X2582720Y2095070I8755J88900* -G01* -X2045877Y2095070D01* -G75* -D01* -G02X1982664Y2121234I-47J89330* -G01* -X1562434Y2541464D01* -G75* -D01* -G02X1536270Y2604716I63166J63166* -G01* -X1536270Y2878293D01* -X1490600Y2878293D01* -G75* -D01* -G02X1427407Y2933270I0J63807* -G01* -X725170Y2933270D01* -G75* -D01* -G02X701417Y2936486I0J89330* -G01* -G74* -D01* -G02X662004Y2959434I23752J86113* -G01* -X597330Y3024108D01* -X597330Y2563005D01* -G74* -D01* -G02X648212Y2472271I55458J90734* -G01* -X648212Y2404529D01* -G75* -D01* -G02X597330Y2313795I-106341J0* -G01* -X597330Y2297269D01* -G75* -D01* -G02X597330Y2071531I-89329J-112869* -G01* -X597330Y2043269D01* -G75* -D01* -G02X597330Y1817531I-89329J-112869* -G01* -X597330Y1789269D01* -G75* -D01* -G02X597330Y1563531I-89329J-112869* -G01* -X597330Y1486330D01* -X1473200Y1486330D01* -G74* -D01* -G02X1536445Y1460086I1J89330* -G01* -X1815686Y1180845D01* -G74* -D01* -G02X1827393Y1166446I63083J63248* -G01* -X1827393Y1172700D01* -G75* -D01* -G02X1891200Y1236507I63807J0* -G01* -X1891870Y1236507D01* -X1891870Y1239969D01* -G75* -D01* -G02X1918034Y1303266I89330J131* -G01* -X2032334Y1417566D01* -G74* -D01* -G02X2052310Y1432595I63165J63167* -G01* -G75* -D01* -G02X2309229Y1443730I132090J-78194* -G01* -X2362157Y1443730D01* -G75* -D01* -G02X2370371Y1443356I48J-89330* -G01* -G74* -D01* -G02X2425445Y1417486I8172J88955* -G01* -X2603086Y1239845D01* -G74* -D01* -G02X2629330Y1176600I63085J63245* -G01* -X2629330Y644332D01* -G74* -D01* -G02X2702712Y517549I89329J136332* -G01* -X2712261Y508000D01* -X2702712Y498451D01* -G75* -D01* -G02X2413000Y405837I-162711J9547* -G01* -G75* -D01* -G02X2196670Y644332I-126997J102166* -G01* -X2196670Y693893D01* -X2196000Y693893D01* -G75* -D01* -G02X2140699Y725870I0J63807* -G01* -X2126501Y725870D01* -G74* -D01* -G02X2071200Y693893I55301J31830* -G01* -X1891200Y693893D01* -G75* -D01* -G02X1835899Y725870I0J63807* -G01* -X1826450Y725870D01* -G75* -D01* -G02X1763234Y752034I-50J89330* -G01* -X1689434Y825834D01* -G75* -D01* -G02X1663270Y889088I63166J63166* -G01* -X1663270Y1080598D01* -X1625968Y1117900D01* -G74* -D01* -G02X1625969Y1117600I76567J405* -G01* -X1625969Y736600D01* -G75* -D01* -G02X1567930Y662307I-76569J0* -G01* -G74* -D01* -G02X1550900Y659993I17028J61493* -G01* -X1293900Y659993D01* -G75* -D01* -G02X1276871Y662307I-1J63807* -G01* -G74* -D01* -G02X1266963Y665508I18531J74292* -G01* -X758963Y868708D01* -G75* -D01* -G02X710831Y939939I28436J71092* -G01* -X710831Y1117600D01* -G75* -D01* -G02X787400Y1194169I76569J0* -G01* -X1549400Y1194169D01* -G74* -D01* -G02X1549700Y1194168I105J76569* -G01* -X1436198Y1307670D01* -X508000Y1307670D01* -G75* -D01* -G02X418670Y1397000I0J89330* -G01* -X418670Y1563531D01* -G75* -D01* -G02X418670Y1789269I89329J112869* -G01* -X418670Y1817531D01* -G75* -D01* -G02X418670Y2043269I89329J112869* -G01* -X418670Y2071531D01* -G75* -D01* -G02X418670Y2297269I89329J112869* -G01* -X418670Y2313795D01* -G75* -D01* -G02X367788Y2404529I55458J90734* -G01* -X367788Y2472271D01* -G74* -D01* -G02X418670Y2563005I106341J0* -G01* -X418670Y4408331D01* -G75* -D01* -G02X418670Y4634069I89329J112869* -G01* -X418670Y4650595D01* -G75* -D01* -G02X367788Y4741329I55458J90734* -G01* -X367788Y4809071D01* -G74* -D01* -G02X418670Y4899805I106341J0* -G01* -X418670Y5029034D01* -G75* -D01* -G02X444834Y5092366I89330J166* -G01* -X698834Y5346366D01* -G74* -D01* -G02X749888Y5371705I63166J63166* -G01* -G75* -D01* -G02X762000Y5372530I12112J-88504* -G01* -X947893Y5372530D01* -X947893Y5418200D01* -G75* -D01* -G02X1011700Y5482007I63807J0* -G01* -X1126700Y5482007D01* -G74* -D01* -G02X1190507Y5418200I0J63807* -G01* -X1190507Y5148200D01* -G75* -D01* -G02X1126700Y5084393I-63807J0* -G01* -X1011700Y5084393D01* -G75* -D01* -G02X947893Y5148200I0J63807* -G01* -X947893Y5193870D01* -X799002Y5193870D01* -X597330Y4992198D01* -X597330Y4899805D01* -G74* -D01* -G02X648212Y4809071I55458J90734* -G01* -X648212Y4741329D01* -G75* -D01* -G02X597330Y4650595I-106341J0* -G01* -X597330Y4634069D01* -G75* -D01* -G02X597330Y4408331I-89329J-112869* -G01* -X597330Y4379992D01* -X646904Y4429566D01* -G74* -D01* -G02X677608Y4449623I63166J63166* -G01* -G75* -D01* -G02X710070Y4455730I32462J-83223* -G01* -X1141809Y4455730D01* -G75* -D01* -G02X1202249Y4648200I128190J65470* -G01* -G75* -D01* -G02X1382869Y4864530I67754J126998* -G01* -X2640232Y4864530D01* -G75* -D01* -G02X2669697Y4859565I98J-89330* -G01* -G74* -D01* -G02X2686444Y4851707I29368J84364* -G01* -X2757500Y4851707D01* -G74* -D01* -G02X2821307Y4787900I0J63807* -G01* -X1202249Y2311400D02* -G75* -D01* -G02X1337751Y2311400I67751J126999* -G01* -G75* -D01* -G02X1337751Y2057400I-67750J-127000* -G01* -G75* -D01* -G02X1337751Y1803400I-67750J-127000* -G01* -G75* -D01* -G02X1202249Y1803400I-67751J-126999* -G01* -G75* -D01* -G02X1202249Y2057400I67750J127000* -G01* -G75* -D01* -G02X1202249Y2311400I67750J127000* -G01* -X2986100Y5492800D02* -G75* -D01* -G02X2986100Y5492800I163500J0* -G01* -X3494100Y5492800D02* -G75* -D01* -G02X3494100Y5492800I163500J0* -G01* -X2864000Y2565400D02* -G75* -D01* -G02X2864000Y2565400I30000J0* -G01* -X2864000Y3835400D02* -G75* -D01* -G02X2864000Y3835400I30000J0* -G01* -X2860893Y359367D02* -G75* -D01* -G02X2727107Y359367I-66893J148633* -G01* -X2794000Y426261D01* -X2860893Y359367D01* -X3300593Y351300D02* -X3300593Y365783D01* -X3411383Y365783D01* -X3411383Y287493D01* -X3364400Y287493D01* -G75* -D01* -G02X3300593Y351300I0J63807* -G01* -X3608207Y351300D02* -G75* -D01* -G02X3544400Y287493I-63807J0* -G01* -X3497417Y287493D01* -X3497417Y365783D01* -X3608207Y365783D01* -X3608207Y351300D01* -X2727107Y656633D02* -G75* -D01* -G02X2860893Y656633I66893J-148633* -G01* -X2794000Y589739D01* -X2727107Y656633D01* -X2734729Y508000D02* -G75* -D01* -G02X2734729Y508000I59271J0* -G01* -X2942633Y574893D02* -G75* -D01* -G02X2942633Y441107I-148633J-66893* -G01* -X2875739Y508000D01* -X2942633Y574893D01* -X3364400Y530107D02* -X3411383Y530107D01* -X3411383Y451817D01* -X3300593Y451817D01* -X3300593Y466300D01* -G75* -D01* -G02X3364400Y530107I63807J0* -G01* -X3543730Y873971D02* -X3543730Y830107D01* -X3544400Y830107D01* -G74* -D01* -G02X3608207Y766300I0J63807* -G01* -X3608207Y651300D01* -G75* -D01* -G02X3544400Y587493I-63807J0* -G01* -X3364400Y587493D01* -G75* -D01* -G02X3300593Y651300I0J63807* -G01* -X3300593Y766300D01* -G75* -D01* -G02X3364400Y830107I63807J0* -G01* -X3365070Y830107D01* -X3365070Y873971D01* -G75* -D01* -G02X3543730Y873971I89330J124828* -G01* -X3608207Y466300D02* -X3608207Y451817D01* -X3497417Y451817D01* -X3497417Y530107D01* -X3544400Y530107D01* -G74* -D01* -G02X3608207Y466300I0J63807* -G01* -X1230093Y393800D02* -G75* -D01* -G02X1293900Y457607I63807J0* -G01* -X1354206Y457607D01* -X1354206Y321994D01* -X1230093Y321994D01* -X1230093Y393800D01* -X1614707Y393800D02* -X1614707Y321994D01* -X1490594Y321994D01* -X1490594Y457607D01* -X1550900Y457607D01* -G74* -D01* -G02X1614707Y393800I0J63807* -G01* -X242900Y1009600D02* -G75* -D01* -G02X242900Y1009600I163500J0* -G01* -X1590549Y63807D02* -X3936193Y63807D01* -X3936193Y6436193D01* -X63807Y6436193D01* -X63807Y63807D01* -X1254251Y63807D01* -G75* -D01* -G02X1230093Y113800I39649J49993* -G01* -X1230093Y185606D01* -X1354206Y185606D01* -X1354206Y63807D01* -X1490594Y63807D01* -X1490594Y185606D01* -X1614707Y185606D01* -X1614707Y113800D01* -G75* -D01* -G02X1590549Y63807I-63807J0* -G01* -X2376000Y993893D02* -X2196000Y993893D01* -G75* -D01* -G02X2140699Y1025870I0J63807* -G01* -X2126501Y1025870D01* -G74* -D01* -G02X2071200Y993893I55301J31830* -G01* -X1891200Y993893D01* -G75* -D01* -G02X1841930Y1017156I0J63807* -G01* -X1841930Y926002D01* -X1848142Y919789D01* -G75* -D01* -G02X1891200Y936507I43058J-47089* -G01* -X2071200Y936507D01* -G74* -D01* -G02X2126501Y904530I0J63807* -G01* -X2140699Y904530D01* -G75* -D01* -G02X2196000Y936507I55301J-31830* -G01* -X2376000Y936507D01* -G74* -D01* -G02X2439807Y872700I0J63807* -G01* -X2439807Y757700D01* -G75* -D01* -G02X2376000Y693893I-63807J0* -G01* -X2375330Y693893D01* -X2375330Y644332D01* -G74* -D01* -G02X2413000Y610163I89329J136332* -G01* -G74* -D01* -G02X2450670Y644332I126999J102163* -G01* -X2450670Y1139598D01* -X2439807Y1150461D01* -X2439807Y1057700D01* -G75* -D01* -G02X2376000Y993893I-63807J0* -G01* -X2309229Y1265070D02* -X2325198Y1265070D01* -X2353761Y1236507D01* -X2282703Y1236507D01* -G74* -D01* -G03X2309229Y1265070I98303J117891* -G01* -X1760600Y2878293D02* -X1714930Y2878293D01* -X1714930Y2641632D01* -X2020369Y2336193D01* -X2082832Y2273730D01* -X2582720Y2273730D01* -G74* -D01* -G02X2647145Y2311400I73180J51229* -G01* -G75* -D01* -G02X2566570Y2400300I8755J88900* -G01* -X2566570Y2476500D01* -G74* -D01* -G02X2647145Y2565400I89330J0* -G01* -G75* -D01* -G02X2566570Y2654300I8755J88900* -G01* -X2566570Y2730500D01* -G74* -D01* -G02X2647145Y2819400I89330J0* -G01* -G75* -D01* -G02X2566570Y2908300I8755J88900* -G01* -X2566570Y2984500D01* -G74* -D01* -G02X2647145Y3073400I89330J0* -G01* -G75* -D01* -G02X2566570Y3162300I8755J88900* -G01* -X2566570Y3238500D01* -G74* -D01* -G02X2586611Y3294882I89330J0* -G01* -X2184423Y3294882D01* -G75* -D01* -G02X2142122Y3300593I0J159518* -G01* -X2094423Y3300593D01* -G75* -D01* -G02X2030616Y3364400I0J63807* -G01* -X2030616Y3412099D01* -G75* -D01* -G02X2030616Y3496701I153806J42301* -G01* -X2030616Y3544400D01* -G75* -D01* -G02X2094423Y3608207I63807J0* -G01* -X2142122Y3608207D01* -G75* -D01* -G02X2184423Y3613918I42301J-153806* -G01* -X2586611Y3613918D01* -G75* -D01* -G02X2566570Y3670300I69289J56382* -G01* -X2566570Y3746500D01* -G74* -D01* -G02X2647145Y3835400I89330J0* -G01* -G74* -D01* -G02X2582720Y3873070I8755J88900* -G01* -X2495048Y3873070D01* -G74* -D01* -G02X2433500Y3826093I61547J16830* -G01* -X2318500Y3826093D01* -G75* -D01* -G02X2286000Y3834990I0J63807* -G01* -G74* -D01* -G02X2253500Y3826093I32500J54910* -G01* -X2138500Y3826093D01* -G75* -D01* -G02X2093648Y3844516I-1J63807* -G01* -X1714930Y3465798D01* -X1714930Y3420907D01* -X1760600Y3420907D01* -G74* -D01* -G02X1824407Y3357100I0J63807* -G01* -X1824407Y3242100D01* -G75* -D01* -G02X1760600Y3178293I-63807J0* -G01* -X1490600Y3178293D01* -G75* -D01* -G02X1433985Y3212670I0J63807* -G01* -X1252630Y3212670D01* -G75* -D01* -G02X1201009Y3212670I-25810J85519* -G01* -X925669Y3212670D01* -G75* -D01* -G02X702740Y3209231I-112869J89329* -G01* -X702740Y3171362D01* -X762172Y3111930D01* -X1457965Y3111930D01* -G75* -D01* -G02X1490600Y3120907I32634J-54830* -G01* -X1760600Y3120907D01* -G74* -D01* -G02X1824407Y3057100I0J63807* -G01* -X1824407Y2942100D01* -G75* -D01* -G02X1760600Y2878293I-63807J0* -G01* -X925669Y3391330D02* -G74* -D01* -G03X880551Y3429000I112868J89330* -G01* -G75* -D01* -G03X880551Y3683000I-67750J127000* -G01* -G74* -D01* -G03X925669Y3720670I67750J127000* -G01* -X1129185Y3720670D01* -G75* -D01* -G03X1185800Y3686293I56615J29430* -G01* -X1455800Y3686293D01* -G74* -D01* -G03X1512415Y3720670I0J63807* -G01* -X1715696Y3720670D01* -G75* -D01* -G03X1717149Y3720681I50J89330* -G01* -X1562434Y3565966D01* -G75* -D01* -G03X1536270Y3502656I63166J-63166* -G01* -X1536270Y3420907D01* -X1512537Y3420907D01* -G75* -D01* -G03X1519607Y3450100I-56736J29193* -G01* -X1519607Y3565100D01* -G74* -D01* -G03X1455800Y3628907I63807J0* -G01* -X1185800Y3628907D01* -G75* -D01* -G03X1121993Y3565100I0J-63807* -G01* -X1121993Y3450100D01* -G75* -D01* -G03X1160951Y3391330I63807J0* -G01* -X925669Y3391330D01* -X699445Y3644713D02* -G74* -D01* -G03X646764Y3619166I10485J88713* -G01* -X597330Y3569732D01* -X597330Y4127328D01* -X747072Y4277070D01* -X1435299Y4277070D01* -G75* -D01* -G03X1490600Y4245093I55301J31830* -G01* -X1760600Y4245093D01* -G75* -D01* -G03X1824407Y4308900I0J63807* -G01* -X1824407Y4423900D01* -G74* -D01* -G03X1760600Y4487707I63807J0* -G01* -X1490600Y4487707D01* -G75* -D01* -G03X1435299Y4455730I0J-63807* -G01* -X1398191Y4455730D01* -G74* -D01* -G03X1413342Y4508070I128190J65470* -G01* -X2056368Y4508070D01* -X1736005Y4187707D01* -X1490600Y4187707D01* -G75* -D01* -G03X1433985Y4153330I0J-63807* -G01* -X934099Y4153330D01* -G74* -D01* -G03X839254Y4204248I94845J62875* -G01* -X786346Y4204248D01* -G75* -D01* -G03X672552Y4090454I0J-113794* -G01* -X672552Y4037546D01* -G75* -D01* -G03X739463Y3933859I113794J0* -G01* -G75* -D01* -G03X745049Y3683000I73337J-123859* -G01* -G74* -D01* -G03X699445Y3644713I67749J127000* -G01* -X925669Y3899330D02* -G74* -D01* -G03X886137Y3933859I112869J89329* -G01* -G74* -D01* -G03X934099Y3974670I46883J103686* -G01* -X1436752Y3974670D01* -G75* -D01* -G03X1490600Y3945093I53848J34229* -G01* -X1724531Y3945093D01* -X1678768Y3899330D01* -X1509648Y3899330D01* -G74* -D01* -G03X1455800Y3928907I53848J34229* -G01* -X1185800Y3928907D01* -G75* -D01* -G03X1131952Y3899330I0J-63807* -G01* -X925669Y3899330D01* -X2566570Y4178300D02* -X2566570Y4254070D01* -X2286172Y4254070D01* -X2130277Y4098175D01* -G75* -D01* -G02X2138500Y4098707I8222J-63275* -G01* -X2253500Y4098707D01* -G74* -D01* -G02X2286000Y4089810I0J63807* -G01* -G75* -D01* -G02X2318500Y4098707I32500J-54910* -G01* -X2433500Y4098707D01* -G74* -D01* -G02X2495048Y4051730I1J63807* -G01* -X2582720Y4051730D01* -G74* -D01* -G02X2647145Y4089400I73180J51229* -G01* -G75* -D01* -G02X2566570Y4178300I8755J88900* -G01* -G54D12* -X3454400Y304600D02* -X3302000Y152200D01* -X3454400Y408800D02* -X3454400Y304600D01* -X2286000Y815200D02* -X2286000Y508000D01* -X3454400Y408800D02* -X2893200Y408800D01* -X2794000Y508000D01* -X3454400Y708800D02* -X3454400Y998800D01* -X1752600Y1117600D02* -X1752600Y889000D01* -X1826400Y815200D01* -X2286000Y815200D01* -X1473200Y1397000D02* -X1752600Y1117600D01* -X508000Y5029200D02* -X508000Y1397000D01* -X1473200Y1397000D01* -X1459230Y3302000D02* -X812800Y3302000D01* -X1625600Y3299600D02* -X1461630Y3299600D01* -X1715770Y3810000D02* -X812800Y3810000D01* -X2249170Y4343400D02* -X1715770Y3810000D01* -X2694000Y3962400D02* -X2376000Y3962400D01* -X2894000Y4343400D02* -X2249170Y4343400D01* -X2694000Y4216400D02* -X2984500Y4216400D01* -X3114040Y4345940D01* -X3114040Y5064760D01* -X1346200Y4597400D02* -X1270000Y4521200D01* -X2894000Y4597400D02* -X1346200Y4597400D01* -X762000Y5283200D02* -X508000Y5029200D01* -X3114040Y5064760D02* -X2895600Y5283200D01* -X1069200Y5283200D02* -X762000Y5283200D01* -X2895600Y5283200D02* -X1369200Y5283200D01* -X1981200Y1240100D02* -X2095500Y1354400D01* -X1981200Y1115200D02* -X1981200Y1240100D01* -X710070Y4366400D02* -X511810Y4168140D01* -X1625600Y4366400D02* -X710070Y4366400D01* -X613410Y3459480D02* -X709930Y3556000D01* -X812800Y3556000D01* -X725170Y3022600D02* -X613410Y3134360D01* -X725170Y3022600D02* -X1602600Y3022600D01* -X613410Y3134360D02* -X613410Y3459480D01* -X1602600Y3022600D02* -X1625600Y2999600D01* -X1625600Y2604630D02* -X2045830Y2184400D01* -X1625600Y2604630D02* -X1625600Y2999600D01* -X2045830Y2184400D02* -X2694000Y2184400D01* -X2085200Y3962400D02* -X1625600Y3502800D01* -X2085200Y3962400D02* -X2196000Y3962400D01* -X1625600Y3502800D02* -X1625600Y3299600D01* -X1320800Y3392170D02* -X1226820Y3298190D01* -X1320800Y3507600D02* -X1320800Y3392170D01* -X2691130Y4724400D02* -X2640330Y4775200D01* -X2694000Y4724400D02* -X2691130Y4724400D01* -X2640330Y4775200D02* -X1270000Y4775200D01* -X1738630Y4064000D02* -X2145030Y4470400D01* -X2694000Y4470400D01* -X812800Y4064000D02* -X1738630Y4064000D01* -X1981200Y1115200D02* -X2286000Y1115200D01* -X2540000Y508000D02* -X2540000Y1176600D01* -X2362200Y1354400D01* -X2095500Y1354400D02* -X2362200Y1354400D01* -G54D13* -X3694230Y152200D02* -X3840480Y298450D01* -X3840480Y298450D02* -X3840480Y3542030D01* -X3562350Y2565400D02* -X3835400Y2292350D01* -X2894000Y2565400D02* -X3562350Y2565400D01* -X2894000Y3073400D02* -X3429023Y3073400D01* -X3454423Y3098800D01* -X2694000Y3454400D02* -X2184423Y3454400D01* -X3840480Y3542030D02* -X3547110Y3835400D01* -X2894000Y3835400D01* -X3694230Y152200D02* -X1524000Y152200D01* -X1422400Y253800D01* -G54D14* -X-63500Y-63500D02* -X-63500Y599200D01* -X-63500Y-63500D02* -X349200Y-63500D01* -X4063500Y-63500D02* -X3650800Y-63500D01* -X4063500Y-63500D02* -X4063500Y599200D01* -X4063500Y6563500D02* -X4063500Y5900800D01* -X4063500Y6563500D02* -X3650800Y6563500D01* -X-63500Y6563500D02* -X349200Y6563500D01* -X-63500Y6563500D02* -X-63500Y5900800D01* -X-563500Y-63500D02* -X-1563500Y-63500D01* -X-1063500Y-563500D02* -X-1063500Y436500D01* -X-1438500Y-63500D02* -G75* -D01* -G02X-1438500Y-63500I375000J0* -G01* -X4563500Y-63500D02* -X5563500Y-63500D01* -X5063500Y-563500D02* -X5063500Y436500D01* -X4688500Y-63500D02* -G75* -D01* -G02X4688500Y-63500I375000J0* -G01* -X4938500Y-63500D02* -G75* -D01* -G02X4938500Y-63500I125000J0* -G01* -X-563500Y6563500D02* -X-1563500Y6563500D01* -X-1063500Y6063500D02* -X-1063500Y7063500D01* -X-1438500Y6563500D02* -G75* -D01* -G02X-1438500Y6563500I375000J0* -G01* -X-1313500Y6563500D02* -G75* -D01* -G02X-1313500Y6563500I250000J0* -G01* -X-1188500Y6563500D02* -G75* -D01* -G02X-1188500Y6563500I125000J0* -G01* -G54D15* -X406400Y1009600D03* -X914400Y1009600D03* -X3657600Y5492800D03* -X3149600Y5492800D03* -X2641600Y5492800D03* -X2133600Y5492800D03* -G54D16* -X3454400Y408800D03* -X3454400Y708800D03* -X1981200Y815200D03* -X1981200Y1115200D03* -X2286000Y815200D03* -X2286000Y1115200D03* -G54D17* -X1270000Y2438400D03* -X508000Y1676400D03* -X1270000Y1676400D03* -X508000Y1930400D03* -X508000Y2184400D03* -X1270000Y1930400D03* -X1270000Y2184400D03* -X508000Y4521200D03* -X1270000Y4521200D03* -X1270000Y4775200D03* -X812800Y3556000D03* -X812800Y3810000D03* -X812800Y3302000D03* -G54D18* -X508000Y2438400D03* -X508000Y4775200D03* -G54D19* -X474129Y2404529D02* -X541871Y2404529D01* -X541871Y2472271D01* -X474129Y2472271D01* -X474129Y2404529D01*D02* -X474129Y4741329D02* -X541871Y4741329D01* -X541871Y4809071D01* -X474129Y4809071D01* -X474129Y4741329D01*D02* -G54D20* -X2694000Y4470400D03* -X2694000Y4216400D03* -X2694000Y3962400D03* -X2694000Y3708400D03* -X2694000Y3454400D03* -X2694000Y3200400D03* -X2694000Y2946400D03* -X2694000Y2692400D03* -X2694000Y2438400D03* -X2694000Y2184400D03* -X2694000Y1930400D03* -X2694000Y1676400D03* -X2894000Y4597400D03* -X2894000Y4343400D03* -X2894000Y4089400D03* -X2894000Y3835400D03* -X2894000Y3581400D03* -X2894000Y3327400D03* -X2894000Y3073400D03* -X2894000Y2819400D03* -X2894000Y2565400D03* -X2894000Y2311400D03* -X2894000Y2057400D03* -X2894000Y1803400D03* -G54D21* -X2655900Y4432300D02* -X2732100Y4432300D01* -X2732100Y4508500D01* -X2655900Y4508500D01* -X2655900Y4432300D01*D02* -X2655900Y4178300D02* -X2732100Y4178300D01* -X2732100Y4254500D01* -X2655900Y4254500D01* -X2655900Y4178300D01*D02* -X2655900Y3924300D02* -X2732100Y3924300D01* -X2732100Y4000500D01* -X2655900Y4000500D01* -X2655900Y3924300D01*D02* -X2655900Y3670300D02* -X2732100Y3670300D01* -X2732100Y3746500D01* -X2655900Y3746500D01* -X2655900Y3670300D01*D02* -X2655900Y3416300D02* -X2732100Y3416300D01* -X2732100Y3492500D01* -X2655900Y3492500D01* -X2655900Y3416300D01*D02* -X2655900Y3162300D02* -X2732100Y3162300D01* -X2732100Y3238500D01* -X2655900Y3238500D01* -X2655900Y3162300D01*D02* -X2655900Y2908300D02* -X2732100Y2908300D01* -X2732100Y2984500D01* -X2655900Y2984500D01* -X2655900Y2908300D01*D02* -X2655900Y2654300D02* -X2732100Y2654300D01* -X2732100Y2730500D01* -X2655900Y2730500D01* -X2655900Y2654300D01*D02* -X2655900Y2400300D02* -X2732100Y2400300D01* -X2732100Y2476500D01* -X2655900Y2476500D01* -X2655900Y2400300D01*D02* -X2655900Y2146300D02* -X2732100Y2146300D01* -X2732100Y2222500D01* -X2655900Y2222500D01* -X2655900Y2146300D01*D02* -X2655900Y1892300D02* -X2732100Y1892300D01* -X2732100Y1968500D01* -X2655900Y1968500D01* -X2655900Y1892300D01*D02* -X2655900Y1638300D02* -X2732100Y1638300D01* -X2732100Y1714500D01* -X2655900Y1714500D01* -X2655900Y1638300D01*D02* -X2855900Y4559300D02* -X2932100Y4559300D01* -X2932100Y4635500D01* -X2855900Y4635500D01* -X2855900Y4559300D01*D02* -X2855900Y4305300D02* -X2932100Y4305300D01* -X2932100Y4381500D01* -X2855900Y4381500D01* -X2855900Y4305300D01*D02* -X2855900Y4051300D02* -X2932100Y4051300D01* -X2932100Y4127500D01* -X2855900Y4127500D01* -X2855900Y4051300D01*D02* -X2855900Y3797300D02* -X2932100Y3797300D01* -X2932100Y3873500D01* -X2855900Y3873500D01* -X2855900Y3797300D01*D02* -X2855900Y3543300D02* -X2932100Y3543300D01* -X2932100Y3619500D01* -X2855900Y3619500D01* -X2855900Y3543300D01*D02* -X2855900Y3289300D02* -X2932100Y3289300D01* -X2932100Y3365500D01* -X2855900Y3365500D01* -X2855900Y3289300D01*D02* -X2855900Y3035300D02* -X2932100Y3035300D01* -X2932100Y3111500D01* -X2855900Y3111500D01* -X2855900Y3035300D01*D02* -X2855900Y2781300D02* -X2932100Y2781300D01* -X2932100Y2857500D01* -X2855900Y2857500D01* -X2855900Y2781300D01*D02* -X2855900Y2527300D02* -X2932100Y2527300D01* -X2932100Y2603500D01* -X2855900Y2603500D01* -X2855900Y2527300D01*D02* -X2855900Y2273300D02* -X2932100Y2273300D01* -X2932100Y2349500D01* -X2855900Y2349500D01* -X2855900Y2273300D01*D02* -X2855900Y2019300D02* -X2932100Y2019300D01* -X2932100Y2095500D01* -X2855900Y2095500D01* -X2855900Y2019300D01*D02* -X2855900Y1765300D02* -X2932100Y1765300D01* -X2932100Y1841500D01* -X2855900Y1841500D01* -X2855900Y1765300D01*D02* -G54D22* -X2694000Y4724400D03* -G54D23* -X1625600Y3299600D03* -X1625600Y2999600D03* -X1625600Y4366400D03* -X1625600Y4066400D03* -X1320800Y3507600D03* -X1320800Y3807600D03* -G54D24* -X2196000Y3962400D03* -X2376000Y3962400D03* -G54D25* -X1069200Y5283200D03* -X1369200Y5283200D03* -G54D26* -X812800Y4064000D03* -G54D27* -X786346Y4037546D02* -X839254Y4037546D01* -X839254Y4090454D01* -X786346Y4090454D01* -X786346Y4037546D01*D02* -G54D28* -X3454400Y998800D03* -X2184400Y1354400D03* -G54D29* -X3454423Y3098800D03* -X2184423Y3454400D03* -G54D30* -X1422400Y863800D03* -X1422400Y253800D03* -G54D31* -X2286000Y508000D03* -X2540000Y508000D03* -X2794000Y508000D03* - -M00* diff --git a/tests/gerber_parsing_profiling/gerber_parsing_line_profile_1.py b/tests/gerber_parsing_profiling/gerber_parsing_line_profile_1.py deleted file mode 100644 index 1ff32fb0..00000000 --- a/tests/gerber_parsing_profiling/gerber_parsing_line_profile_1.py +++ /dev/null @@ -1,13 +0,0 @@ -# This script is for profiling Gerber.parse_lines() line by line. -# Run kernprof -l -v gerber_parsing_line_profile_1.py - -import sys -sys.path.append('../../') - -from flatcamParsers.ParseGerber import * - -log = logging.getLogger('base2') -log.setLevel(logging.WARNING) - -g = Gerber() -g.parse_file("gerber1.gbr") \ No newline at end of file diff --git a/tests/gerber_parsing_profiling/gerber_parsing_profile_1.py b/tests/gerber_parsing_profiling/gerber_parsing_profile_1.py deleted file mode 100644 index 60e7d02a..00000000 --- a/tests/gerber_parsing_profiling/gerber_parsing_profile_1.py +++ /dev/null @@ -1,17 +0,0 @@ -import cProfile -import pstats -import sys -sys.path.append('../../') - -from flatcamParsers.ParseGerber import * - -log = logging.getLogger('base2') -log.setLevel(logging.WARNING) - -g = Gerber() - -#cProfile.run('g.parse_file("gerber1.gbr")', 'gerber1_profile', sort='cumtime') -cProfile.run('g.parse_file("/home/jpcaram/flatcam_test_files/Gerbers/AVR_Transistor_Tester_silkscreen_top.GTO")', - 'gerber1_profile', sort='cumtime') -p = pstats.Stats('gerber1_profile') -p.strip_dirs().sort_stats('cumulative').print_stats(.1) \ No newline at end of file diff --git a/tests/new_window_test.py b/tests/new_window_test.py deleted file mode 100644 index 9d0eb4d8..00000000 --- a/tests/new_window_test.py +++ /dev/null @@ -1,70 +0,0 @@ -import sys -from PyQt5.Qt import * -from PyQt5 import QtGui, QtWidgets - - -class MyPopup(QWidget): - def __init__(self): - QWidget.__init__(self) - lay = QtWidgets.QVBoxLayout() - self.setLayout(lay) - lay.setContentsMargins(0, 0, 0, 0) - le = QtWidgets.QLineEdit() - le.setText("Abracadabra") - le.setReadOnly(True) - # le.setStyleSheet("QLineEdit { qproperty-frame: false }") - le.setFrame(False) - le.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) - - # lay.addStretch() - but = QtWidgets.QPushButton("OK") - hlay = QtWidgets.QHBoxLayout() - hlay.setContentsMargins(0, 5, 5, 5) - - hlay.addStretch() - hlay.addWidget(but) - - lay.addWidget(le) - lay.addLayout(hlay) - # def paintEvent(self, e): - # dc = QtGui.QPainter(self) - # dc.drawLine(0, 0, 100, 100) - # dc.drawLine(100, 0, 0, 100) - - -class MainWindow(QMainWindow): - def __init__(self, *args): - QtWidgets.QMainWindow.__init__(self, *args) - self.cw = QtWidgets.QWidget(self) - self.setCentralWidget(self.cw) - self.btn1 = QtWidgets.QPushButton("Click me", self.cw) - self.btn1.setGeometry(QRect(0, 0, 100, 30)) - self.btn1.clicked.connect(self.doit) - self.w = None - - def doit(self): - print("Opening a new popup window...") - self.w = MyPopup() - self.w.setGeometry(QRect(100, 100, 400, 200)) - self.w.show() - - -class App(QApplication): - def __init__(self, *args): - QtWidgets.QApplication.__init__(self, *args) - self.main = MainWindow() - # self.lastWindowClosed.connect(self.byebye) - self.main.show() - - def byebye(self): - self.exit(0) - - -def main(args): - global app - app = App(args) - app.exec_() - - -if __name__ == "__main__": - main(sys.argv) \ No newline at end of file diff --git a/tests/other/destructor_test.py b/tests/other/destructor_test.py deleted file mode 100644 index 28950277..00000000 --- a/tests/other/destructor_test.py +++ /dev/null @@ -1,34 +0,0 @@ -import sys -from PyQt5 import QtCore, QtGui, QtWidgets - - -class MyObj(): - - def __init__(self): - pass - - def __del__(self): - print("##### Destroyed ######") - - -def parse(): - o = MyObj() - raise Exception("Intentional Exception") - - -class Example(QtWidgets.QWidget): - - def __init__(self): - super(Example, self).__init__() - - qbtn = QtWidgets.QPushButton('Raise', self) - qbtn.clicked.connect(parse) - - self.setWindowTitle('Quit button') - self.show() - - -if __name__ == '__main__': - app = QtWidgets.QApplication(sys.argv) - ex = Example() - sys.exit(app.exec_()) \ No newline at end of file diff --git a/tests/other/profile_gerber_parser.py b/tests/other/profile_gerber_parser.py deleted file mode 100644 index bdf671c2..00000000 --- a/tests/other/profile_gerber_parser.py +++ /dev/null @@ -1,8 +0,0 @@ -import os -os.chdir('../') - -from flatcamParsers.ParseGerber import * - -g = Gerber() -g.parse_file(r'C:\Users\jpcaram\Dropbox\CNC\pcbcam\test_files\PlacaReles-F_Cu.gtl') - diff --git a/tests/other/test_excellon_1.py b/tests/other/test_excellon_1.py deleted file mode 100644 index c3895bd7..00000000 --- a/tests/other/test_excellon_1.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Sun Jan 05 13:30:47 2014 - -@author: jpcaram -""" - -import os -os.chdir('../') - -from flatcamParsers.ParseGerber import * -from flatcamParsers.ParseExcellon import * - -from matplotlib import pyplot - -# Gerber. To see if the Excellon is correct -project_dir = "tests/gerber_files" -gerber_filename = project_dir + "KiCad_Squarer-F_Cu.gtl" -g = Gerber() -g.parse_file(gerber_filename) -g.create_geometry() - -excellon_filename = project_dir + "KiCad_Squarer.drl" -ex = Excellon() -ex.parse_file(excellon_filename) -ex.create_geometry() - -#fig = Figure() -fig = pyplot.figure() -ax = fig.add_subplot(111) -ax.set_aspect(1) - -# Plot gerber -for geo in g.solid_geometry: - x, y = geo.exterior.coords.xy - pyplot.plot(x, y, 'k-') - for ints in geo.interiors: - x, y = ints.coords.xy - ax.plot(x, y, 'k-') - -# Plot excellon -for geo in ex.solid_geometry: - x, y = geo.exterior.coords.xy - pyplot.plot(x, y, 'r-') - for ints in geo.interiors: - x, y = ints.coords.xy - ax.plot(x, y, 'g-') - -fig.show() \ No newline at end of file diff --git a/tests/other/test_fcrts.py b/tests/other/test_fcrts.py deleted file mode 100644 index 5c1222d5..00000000 --- a/tests/other/test_fcrts.py +++ /dev/null @@ -1,37 +0,0 @@ -from camlib import * -from shapely.geometry import LineString, LinearRing - -s = FlatCAMRTreeStorage() - -geoms = [ - LinearRing(((0.5699056603773586, 0.7216037735849057), - (0.9885849056603774, 0.7216037735849057), - (0.9885849056603774, 0.6689622641509434), - (0.5699056603773586, 0.6689622641509434), - (0.5699056603773586, 0.7216037735849057))), - LineString(((0.8684952830188680, 0.6952830188679245), - (0.8680655198743615, 0.6865349890935113), - (0.8667803692948564, 0.6778712076279851), - (0.8646522079829676, 0.6693751114229638), - (0.8645044888670096, 0.6689622641509434))), - LineString(((0.9874952830188680, 0.6952830188679245), - (0.9864925023483531, 0.6748709493942936), - (0.9856160316877274, 0.6689622641509434))), - -] - -for geo in geoms: - s.insert(geo) - -current_pt = (0, 0) -pt, geo = s.nearest(current_pt) -while geo is not None: - print((pt, geo)) - print(("OBJECTS BEFORE:", s.objects)) - - #geo.coords = list(geo.coords[::-1]) - s.remove(geo) - - print(("OBJECTS AFTER:", s.objects)) - current_pt = geo.coords[-1] - pt, geo = s.nearest(current_pt) diff --git a/tests/other/test_plotg.py b/tests/other/test_plotg.py deleted file mode 100644 index 6ec1a3a3..00000000 --- a/tests/other/test_plotg.py +++ /dev/null @@ -1,48 +0,0 @@ -from shapely.geometry import LineString, Polygon -from shapely.ops import unary_union -from matplotlib.pyplot import plot, subplot, show, axes -from matplotlib.axes import * -from camlib import * - - -def plotg2(geo, solid_poly=False, color="black", linestyle='solid'): - - try: - for sub_geo in geo: - plotg2(sub_geo, solid_poly=solid_poly, color=color, linestyle=linestyle) - except TypeError: - if type(geo) == Polygon: - if solid_poly: - patch = PolygonPatch(geo, - #facecolor="#BBF268", - facecolor=color, - edgecolor="#006E20", - alpha=0.5, - zorder=2) - ax = subplot(111) - ax.add_patch(patch) - else: - x, y = geo.exterior.coords.xy - plot(x, y, color=color, linestyle=linestyle) - for ints in geo.interiors: - x, y = ints.coords.xy - plot(x, y, color=color, linestyle=linestyle) - - if type(geo) == LineString or type(geo) == LinearRing: - x, y = geo.coords.xy - plot(x, y, color=color, linestyle=linestyle) - - if type(geo) == Point: - x, y = geo.coords.xy - plot(x, y, 'o') - - -if __name__ == "__main__": - p = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) - paths = [ - LineString([[0.5, 2], [2, 4.5]]), - LineString([[2, 0.5], [4.5, 2]]) - ] - plotg2(p, solid_poly=True) - plotg2(paths, linestyle="dashed") - show() \ No newline at end of file diff --git a/tests/other/test_rt.py b/tests/other/test_rt.py deleted file mode 100644 index 2df9bd1a..00000000 --- a/tests/other/test_rt.py +++ /dev/null @@ -1,24 +0,0 @@ -from rtree import index as rtindex - -def pt2rect(pt): - return pt[0], pt[1], pt[0], pt[1] - -pts = [(0.0, 0.0), (1.0, 1.0), (0.0, 1.0)] - -p = rtindex.Property() -p.buffering_capacity = 1 -p.dimension = 2 -rt = rtindex.Index(properties=p) -#rt = rtindex.Index() - -# If interleaved is True, the coordinates must be in -# the form [xmin, ymin, ..., kmin, xmax, ymax, ..., kmax]. -print((rt.interleaved)) - -[rt.add(0, pt2rect(pt)) for pt in pts] -print([r.bbox for r in list(rt.nearest((0, 0), 10, True))]) - -for pt in pts: - rt.delete(0, pt2rect(pt)) - print((pt2rect(pt), [r.bbox for r in list(rt.nearest((0, 0), 10, True))])) - diff --git a/tests/svg/7segment_9,9.svg b/tests/svg/7segment_9,9.svg deleted file mode 100644 index ffe7c653..00000000 --- a/tests/svg/7segment_9,9.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/svg/Arduino Nano3_pcb.svg b/tests/svg/Arduino Nano3_pcb.svg deleted file mode 100644 index f1f3b0c2..00000000 --- a/tests/svg/Arduino Nano3_pcb.svg +++ /dev/null @@ -1,468 +0,0 @@ - - - - -Fritzing footprint generated by brd2svg - - - - element:J1 - - package:HEAD15-NOSS - - - - element:J2 - - package:HEAD15-NOSS-1 - - - - element:U2 - - package:SSOP28 - - - - element:U3 - - package:SOT223 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - layer 21 - - text:TX1 - - - TX1 - - - - - text:RX0 - - - RX0 - - - - - text:RST - - - RST - - - - - text:GND - - - GND - - - - - text:D2 - - - D2 - - - - - text:D3 - - - D3 - - - - - text:D4 - - - D4 - - - - - text:D5 - - - D5 - - - - - text:D6 - - - D6 - - - - - text:D7 - - - D7 - - - - - text:D8 - - - D8 - - - - - text:D9 - - - D9 - - - - - text:D10 - - - D10 - - - - - text:D11 - - - D11 - - - - - text:D12 - - - D12 - - - - - text:D13 - - - D13 - - - - - text:3V3 - - - 3V3 - - - - - text:REF - - - REF - - - - - text:A0 - - - A0 - - - - - text:A1 - - - A1 - - - - - text:A2 - - - A2 - - - - - text:A3 - - - A3 - - - - - text:A4 - - - A4 - - - - - text:A5 - - - A5 - - - - - text:A6 - - - A6 - - - - - text:A7 - - - A7 - - - - - text:5V - - - 5V - - - - - text:RST - - - RST - - - - - text:GND - - - GND - - - - - text:VIN - - - VIN - - - - - text:* - - - * - - - - - text:* - - - * - - - - - text:* - - - * - - - - - text:* - - - * - - - - - text:* - - - * - - - - - text:* - - - * - - - - - element:C1 - - package:CAP0805-NP - - - - element:C2 - - package:TAN-A - - - - element:C3 - - package:CAP0805-NP - - - - element:C4 - - package:CAP0805-NP - - - - element:C7 - - package:CAP0805-NP - - - - element:C8 - - package:TAN-A - - - - element:C9 - - package:CAP0805-NP - - - - element:D1 - - package:SOD-123 - - - - element:J1 - - package:HEAD15-NOSS - - - - element:J2 - - package:HEAD15-NOSS-1 - - - - element:RP1 - - package:RES4NT - - - - element:RP2 - - package:RES4NT - - - - element:U$4 - - package:FIDUCIAL-1X2 - - - - element:U$37 - - package:FIDUCIAL-1X2 - - - - element:U$53 - - package:FIDUCIAL-1X2 - - - - element:U$54 - - package:FIDUCIAL-1X2 - - - - element:U2 - - package:SSOP28 - - - - element:U3 - - package:SOT223 - - - - diff --git a/tests/svg/drawing.svg b/tests/svg/drawing.svg deleted file mode 100644 index 7feb03a4..00000000 --- a/tests/svg/drawing.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/svg/usb_connector.svg b/tests/svg/usb_connector.svg deleted file mode 100644 index 25db7071..00000000 --- a/tests/svg/usb_connector.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/svg/use.svg b/tests/svg/use.svg deleted file mode 100644 index 735c5954..00000000 --- a/tests/svg/use.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tests/test_excellon.py b/tests/test_excellon.py deleted file mode 100644 index da7e0233..00000000 --- a/tests/test_excellon.py +++ /dev/null @@ -1,331 +0,0 @@ -import unittest -from flatcamParsers.ParseExcellon import Excellon -from flatcamParsers.ParseGerber import Gerber - - -class ExcellonNumberParseTestInch(unittest.TestCase): - # Inch base format: 00.0000 - - # LEADING ZEROS - # With leading zeros, when you type in a coordinate, - # the leading zeros must always be included. Trailing zeros - # are unneeded and may be left off. The CNC-7 will automatically add them. - - # TRAILING ZEROS - # You must show all zeros to the right of the number and can omit - # all zeros to the left of the number. The CNC-7 will count the number - # of digits you typed and automatically fill in the missing zeros. - - def test_inch_leading_6digit(self): - excellon = Excellon() - self.assertEqual(excellon.zeros, "L") - self.assertEqual(excellon.parse_number("123456"), 12.3456) - - def test_inch_leading_5digit(self): - excellon = Excellon() - self.assertEqual(excellon.parse_number("12345"), 12.345) - - def test_inch_leading_15digit(self): - excellon = Excellon() - self.assertEqual(excellon.parse_number("012345"), 1.2345) - - def test_inch_leading_51digit(self): - excellon = Excellon() - self.assertEqual(excellon.parse_number("123450"), 12.345) - - def test_inch_trailing_6digit(self): - excellon = Excellon() - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("123456"), 12.3456) - - def test_inch_trailing_5digit(self): - excellon = Excellon() - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("12345"), 1.2345) - - def test_inch_trailing_15digit(self): - excellon = Excellon() - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("012345"), 1.2345) - - def test_inch_trailing_51digit(self): - excellon = Excellon() - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("123450"), 12.345) - - -class ExcellonNumberParseTestMetric(unittest.TestCase): - # Metric base format: 000.000 - - # LEADING ZEROS - # With leading zeros, when you type in a coordinate, - # the leading zeros must always be included. Trailing zeros - # are unneeded and may be left off. The CNC-7 will automatically add them. - - # TRAILING ZEROS - # You must show all zeros to the right of the number and can omit - # all zeros to the left of the number. The CNC-7 will count the number - # of digits you typed and automatically fill in the missing zeros. - - def test_inch_leading_6digit(self): - excellon = Excellon() - excellon.units = "mm" - self.assertEqual(excellon.parse_number("123456"), 123.456) - - def test_inch_leading_5digit(self): - excellon = Excellon() - excellon.units = "mm" - self.assertEqual(excellon.parse_number("12345"), 123.45) - - def test_inch_leading_15digit(self): - excellon = Excellon() - excellon.units = "mm" - self.assertEqual(excellon.parse_number("012345"), 12.345) - - def test_inch_leading_51digit(self): - excellon = Excellon() - excellon.units = "mm" - self.assertEqual(excellon.parse_number("123450"), 123.45) - - def test_inch_trailing_6digit(self): - excellon = Excellon() - excellon.units = "mm" - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("123456"), 123.456) - - def test_inch_trailing_5digit(self): - excellon = Excellon() - excellon.units = "mm" - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("12345"), 12.345) - - def test_inch_trailing_15digit(self): - excellon = Excellon() - excellon.units = "mm" - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("012345"), 12.345) - - def test_inch_trailing_51digit(self): - excellon = Excellon() - excellon.units = "mm" - excellon.zeros = "T" - self.assertEqual(excellon.parse_number("123450"), 123.45) - - -class ExcellonFormatM72Test(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - M72 - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "in") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (90.0, 11.75)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (30.25, 10.5)) - - -class ExcellonFormatM71Test(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - M71 - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "mm") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (900.0, 117.5)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (302.5, 105.0)) - - -class ExcellonFormatINCHLZTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - INCH,LZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "in") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (90.0, 11.75)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (30.25, 10.5)) - - -class ExcellonFormatINCHTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - INCH,LZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "in") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (90.0, 11.75)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (30.25, 10.5)) - - -class ExcellonFormatINCHTZTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - INCH,TZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "in") - self.assertEqual(self.excellon.zeros, "T") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (0.9, 1.175)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (3.025, 1.05)) - - -class ExcellonFormatMETRICLZTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - METRIC,LZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "mm") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (900.0, 117.5)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (302.5, 105.0)) - - -class ExcellonFormatMETRICTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - METRIC,LZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "mm") - self.assertEqual(self.excellon.zeros, "L") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (900.0, 117.5)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (302.5, 105.0)) - - -class ExcellonFormatMETRICTZTest(unittest.TestCase): - - def setUp(self): - self.excellon = Excellon() - code = """ - M48 - METRIC,TZ - T1C.02362F197S550 - T2C.03543F197S550 - M95 - T1 - X9000Y11750 - X30250Y10500 - """ - code = code.split('\n') - self.excellon.parse_lines(code) - - def test_format(self): - self.assertEqual(self.excellon.units.lower(), "mm") - self.assertEqual(self.excellon.zeros, "T") - - def test_coords(self): - # For X9000 add the missing 00 on the right. Then divide by 10000. - self.assertEqual(self.excellon.drills[0]["point"].coords[0], (9.0, 11.75)) - self.assertEqual(self.excellon.drills[1]["point"].coords[0], (30.25, 10.5)) - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/tests/test_excellon_flow.py b/tests/test_excellon_flow.py deleted file mode 100644 index 946c2df6..00000000 --- a/tests/test_excellon_flow.py +++ /dev/null @@ -1,163 +0,0 @@ -import unittest -from PyQt5 import QtGui, QtWidgets -import sys -from FlatCAMApp import App -from FlatCAMObj import FlatCAMExcellon, FlatCAMCNCjob -from flatcamGUI.ObjectUI import ExcellonObjectUI -import tempfile -import os -from time import sleep - - -class ExcellonFlowTestCase(unittest.TestCase): - """ - This is a top-level test covering the Excellon-to-GCode - generation workflow. - - THIS IS A REQUIRED TEST FOR ANY UPDATES. - - """ - - filename = 'case1.drl' - - def setUp(self): - self.app = QtWidgets.QApplication(sys.argv) - - # Create App, keep app defaults (do not load - # user-defined defaults). - self.fc = App(user_defaults=False) - - self.fc.open_excellon('tests/excellon_files/' + self.filename) - - def tearDown(self): - del self.fc - del self.app - - def test_flow(self): - # Names of available objects. - names = self.fc.collection.get_names() - print(names) - - #-------------------------------------- - # Total of 1 objects. - #-------------------------------------- - self.assertEqual(len(names), 1, - "Expected 1 object, found %d" % len(names)) - - #-------------------------------------- - # Object's name matches the file name. - #-------------------------------------- - self.assertEqual(names[0], self.filename, - "Expected name == %s, got %s" % (self.filename, names[0])) - - #--------------------------------------- - # Get object by that name, make sure it's a FlatCAMExcellon. - #--------------------------------------- - excellon_name = names[0] - excellon_obj = self.fc.collection.get_by_name(excellon_name) - self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon), - "Expected FlatCAMExcellon, instead, %s is %s" % - (excellon_name, type(excellon_obj))) - - #---------------------------------------- - # Object's GUI matches Object's options - #---------------------------------------- - # TODO: Open GUI with double-click on object. - # Opens the Object's GUI, populates it. - excellon_obj.build_ui() - for option, value in list(excellon_obj.options.items()): - try: - form_field = excellon_obj.form_fields[option] - except KeyError: - print(("**********************************************************\n" - "* WARNING: Option '{}' has no form field\n" - "**********************************************************" - "".format(option))) - continue - self.assertEqual(value, form_field.get_value(), - "Option '{}' == {} but form has {}".format( - option, value, form_field.get_value() - )) - - # -------------------------------------------------- - # Changes in the GUI should be read in when - # running any process. Changing something here. - # -------------------------------------------------- - - form_field = excellon_obj.form_fields['feedrate'] - value = form_field.get_value() - form_field.set_value(value * 1.1) # Increase by 10% - print(("'feedrate' == {}".format(value))) - - # -------------------------------------------------- - # Create GCode using all tools. - # -------------------------------------------------- - - assert isinstance(excellon_obj, FlatCAMExcellon) # Just for the IDE - ui = excellon_obj.ui - assert isinstance(ui, ExcellonObjectUI) - ui.tools_table.selectAll() # Select All - ui.generate_cnc_button.click() # Click - - # Work is done in a separate thread and results are - # passed via events to the main event loop which is - # not running. Run only for pending events. - # - # I'm not sure why, but running it only once does - # not catch the new object. Might be a timing issue. - # http://pyqt.sourceforge.net/Docs/PyQt4/qeventloop.html#details - for _ in range(2): - sleep(0.1) - self.app.processEvents() - - # --------------------------------------------- - # Check that GUI has been read in. - # --------------------------------------------- - - value = excellon_obj.options['feedrate'] - form_value = form_field.get_value() - self.assertEqual(value, form_value, - "Form value for '{}' == {} was not read into options" - "which has {}".format('feedrate', form_value, value)) - print(("'feedrate' == {}".format(value))) - - # --------------------------------------------- - # Check that only 1 object has been created. - # --------------------------------------------- - - names = self.fc.collection.get_names() - self.assertEqual(len(names), 2, - "Expected 2 objects, found %d" % len(names)) - - # ------------------------------------------------------- - # Make sure the CNCJob Object has the correct name - # ------------------------------------------------------- - - cncjob_name = excellon_name + "_cnc" - self.assertTrue(cncjob_name in names, - "Object named %s not found." % cncjob_name) - - # ------------------------------------------------------- - # Get the object make sure it's a cncjob object - # ------------------------------------------------------- - - cncjob_obj = self.fc.collection.get_by_name(cncjob_name) - self.assertTrue(isinstance(cncjob_obj, FlatCAMCNCjob), - "Expected a FlatCAMCNCjob, got %s" % type(cncjob_obj)) - - # ----------------------------------------- - # Export G-Code, check output - # ----------------------------------------- - assert isinstance(cncjob_obj, FlatCAMCNCjob) # For IDE - - # get system temporary file(try create it and delete) - with tempfile.NamedTemporaryFile(prefix='unittest.', - suffix="." + cncjob_name + '.gcode', - delete=True) as tmp_file: - output_filename = tmp_file.name - - cncjob_obj.export_gcode(output_filename) - self.assertTrue(os.path.isfile(output_filename)) - os.remove(output_filename) - - print(names) diff --git a/tests/test_gerber_buffer.py b/tests/test_gerber_buffer.py deleted file mode 100644 index b79893eb..00000000 --- a/tests/test_gerber_buffer.py +++ /dev/null @@ -1,35 +0,0 @@ -import unittest -import camlib -from flatcamParsers.ParseGerber import Gerber - - -class GerberBuffer(unittest.TestCase): - def setUp(self): - self.gerber1 = Gerber() - self.gerber1.use_buffer_for_union = True - self.gerber1.parse_file("tests/gerber_files/STM32F4-spindle.cmp") - geometry1 = self.gerber1.solid_geometry - self.geometry1_area = self.compute_area(geometry1) - self.gerber2 = Gerber() - self.gerber2.use_buffer_for_union = False - self.gerber2.parse_file("tests/gerber_files/STM32F4-spindle.cmp") - geometry2 = self.gerber2.solid_geometry - self.geometry2_area = self.compute_area (geometry2) - - def compute_area(self, geometry): - area = 0 - try: - for geo in geometry: - area += geo.area - - # Not iterable, do the actual indexing and add. - except TypeError: - area = geometry.area - return area - - def test_buffer(self): - self.assertLessEqual(abs(self.geometry2_area - self.geometry1_area), 0.000001) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_gerber_flow.py b/tests/test_gerber_flow.py deleted file mode 100644 index 4549afc0..00000000 --- a/tests/test_gerber_flow.py +++ /dev/null @@ -1,190 +0,0 @@ -import sys -import unittest -from PyQt5 import QtGui, QtWidgets -from FlatCAMApp import App, tclCommands -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMCNCjob -from flatcamGUI.ObjectUI import GerberObjectUI, GeometryObjectUI -from time import sleep -import os -import tempfile - - -class GerberFlowTestCase(unittest.TestCase): - """ - This is a top-level test covering the Gerber-to-GCode - generation workflow. - - THIS IS A REQUIRED TEST FOR ANY UPDATES. - - """ - - filename = 'simple1.gbr' - - def setUp(self): - self.app = QtWidgets.QApplication(sys.argv) - - # Create App, keep app defaults (do not load - # user-defined defaults). - self.fc = App(user_defaults=False) - - self.fc.open_gerber('tests/gerber_files/' + self.filename) - - def tearDown(self): - del self.fc - del self.app - - def test_flow(self): - # Names of available objects. - names = self.fc.collection.get_names() - print(names) - - # -------------------------------------- - # Total of 1 objects. - # -------------------------------------- - self.assertEqual(len(names), 1, - "Expected 1 object, found %d" % len(names)) - - # -------------------------------------- - # Object's name matches the file name. - # -------------------------------------- - self.assertEqual(names[0], self.filename, - "Expected name == %s, got %s" % (self.filename, names[0])) - - # --------------------------------------- - # Get object by that name, make sure it's a FlatCAMGerber. - # --------------------------------------- - gerber_name = names[0] - gerber_obj = self.fc.collection.get_by_name(gerber_name) - self.assertTrue(isinstance(gerber_obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % - (gerber_name, type(gerber_obj))) - - # ---------------------------------------- - # Object's GUI matches Object's options - # ---------------------------------------- - # TODO: Open GUI with double-click on object. - # Opens the Object's GUI, populates it. - gerber_obj.build_ui() - for option, value in list(gerber_obj.options.items()): - try: - form_field = gerber_obj.form_fields[option] - except KeyError: - print(("**********************************************************\n" - "* WARNING: Option '{}' has no form field\n" - "**********************************************************" - "".format(option))) - continue - self.assertEqual(value, form_field.get_value(), - "Option '{}' == {} but form has {}".format( - option, value, form_field.get_value() - )) - - # -------------------------------------------------- - # Changes in the GUI should be read in when - # running any process. Changing something here. - # -------------------------------------------------- - - form_field = gerber_obj.form_fields['isotooldia'] - value = form_field.get_value() - form_field.set_value(value * 1.1) # Increase by 10% - print(("'isotooldia' == {}".format(value))) - - # -------------------------------------------------- - # Create isolation routing using default values - # and by clicking on the button. - # -------------------------------------------------- - # Get the object's GUI and click on "Generate Geometry" under - # "Isolation Routing" - assert isinstance(gerber_obj, FlatCAMGerber) # Just for the IDE - # Changed: UI has been build already - #gerber_obj.build_ui() # Open the object's UI. - ui = gerber_obj.ui - assert isinstance(ui, GerberObjectUI) - ui.generate_iso_button.click() # Click - - # --------------------------------------------- - # Check that GUI has been read in. - # --------------------------------------------- - value = gerber_obj.options['isotooldia'] - form_value = form_field.get_value() - self.assertEqual(value, form_value, - "Form value for '{}' == {} was not read into options" - "which has {}".format('isotooldia', form_value, value)) - print(("'isotooldia' == {}".format(value))) - - # --------------------------------------------- - # Check that only 1 object has been created. - # --------------------------------------------- - names = self.fc.collection.get_names() - self.assertEqual(len(names), 2, - "Expected 2 objects, found %d" % len(names)) - - # ------------------------------------------------------- - # Make sure the Geometry Object has the correct name - # ------------------------------------------------------- - geo_name = gerber_name + "_iso" - self.assertTrue(geo_name in names, - "Object named %s not found." % geo_name) - - # ------------------------------------------------------- - # Get the object make sure it's a geometry object - # ------------------------------------------------------- - geo_obj = self.fc.collection.get_by_name(geo_name) - self.assertTrue(isinstance(geo_obj, FlatCAMGeometry), - "Expected a FlatCAMGeometry, got %s" % type(geo_obj)) - - # ------------------------------------ - # Open the UI, make CNCObject - # ------------------------------------ - geo_obj.build_ui() - ui = geo_obj.ui - assert isinstance(ui, GeometryObjectUI) # Just for the IDE - ui.generate_cnc_button.click() # Click - - # Work is done in a separate thread and results are - # passed via events to the main event loop which is - # not running. Run only for pending events. - # - # I'm not sure why, but running it only once does - # not catch the new object. Might be a timing issue. - # http://pyqt.sourceforge.net/Docs/PyQt4/qeventloop.html#details - for _ in range(2): - sleep(0.1) - self.app.processEvents() - - # --------------------------------------------- - # Check that only 1 object has been created. - # --------------------------------------------- - names = self.fc.collection.get_names() - self.assertEqual(len(names), 3, - "Expected 3 objects, found %d" % len(names)) - - # ------------------------------------------------------- - # Make sure the CNC Job Object has the correct name - # ------------------------------------------------------- - cnc_name = geo_name + "_cnc" - self.assertTrue(cnc_name in names, - "Object named %s not found." % geo_name) - - # ------------------------------------------------------- - # Get the object make sure it's a CNC Job object - # ------------------------------------------------------- - cnc_obj = self.fc.collection.get_by_name(cnc_name) - self.assertTrue(isinstance(cnc_obj, FlatCAMCNCjob), - "Expected a FlatCAMCNCJob, got %s" % type(geo_obj)) - - # ----------------------------------------- - # Export G-Code, check output - # ----------------------------------------- - assert isinstance(cnc_obj, FlatCAMCNCjob) - output_filename = "" - # get system temporary file(try create it and delete also) - with tempfile.NamedTemporaryFile(prefix='unittest.', - suffix="." + cnc_name + '.gcode', - delete=True) as tmp_file: - output_filename = tmp_file.name - cnc_obj.export_gcode(output_filename) - self.assertTrue(os.path.isfile(output_filename)) - os.remove(output_filename) - - print(names) diff --git a/tests/test_paint.py b/tests/test_paint.py deleted file mode 100644 index 2ee77be8..00000000 --- a/tests/test_paint.py +++ /dev/null @@ -1,213 +0,0 @@ -import unittest - -from shapely.geometry import LineString, Polygon -from shapely.ops import unary_union -from matplotlib.pyplot import plot, subplot, show, cla, clf, xlim, ylim, title -from matplotlib.axes import * -from camlib import * -from copy import deepcopy - - -def mkstorage(paths): - def get_pts(o): - return [o.coords[0], o.coords[-1]] - storage = FlatCAMRTreeStorage() - storage.get_points = get_pts - for p in paths: - storage.insert(p) - return storage - - -def plotg2(geo, solid_poly=False, color="black", linestyle='solid'): - - try: - for sub_geo in geo: - plotg2(sub_geo, solid_poly=solid_poly, color=color, linestyle=linestyle) - except TypeError: - if type(geo) == Polygon: - if solid_poly: - patch = PolygonPatch(geo, - #facecolor="#BBF268", - facecolor=color, - edgecolor="#006E20", - alpha=0.5, - zorder=2) - ax = subplot(111) - ax.add_patch(patch) - else: - x, y = geo.exterior.coords.xy - plot(x, y, color=color, linestyle=linestyle) - for ints in geo.interiors: - x, y = ints.coords.xy - plot(x, y, color=color, linestyle=linestyle) - - if type(geo) == LineString or type(geo) == LinearRing: - x, y = geo.coords.xy - plot(x, y, color=color, linestyle=linestyle) - - if type(geo) == Point: - x, y = geo.coords.xy - plot(x, y, 'o') - - -class PaintTestCase(unittest.TestCase): - # def __init__(self): - # super(PaintTestCase, self).__init__() - # self.boundary = None - # self.descr = None - - def plot_summary_A(self, paths, tooldia, result, msg): - plotg2(self.boundary, solid_poly=True, color="green") - plotg2(paths, color="red") - plotg2([r.buffer(tooldia / 2) for r in result], solid_poly=True, color="blue") - plotg2(result, color="black", linestyle='dashed') - title(msg) - xlim(0, 5) - ylim(0, 5) - show() - - -class PaintConnectTest(PaintTestCase): - """ - Simple rectangular boundary and paths inside. - """ - - def setUp(self): - self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) - - def test_jump(self): - print("Test: WALK Expected") - paths = [ - LineString([[0.5, 2], [2, 4.5]]), - LineString([[2, 0.5], [4.5, 2]]) - ] - for p in paths: - print(p) - - tooldia = 1.0 - - print("--") - result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) - - result = list(result.get_objects()) - for r in result: - print(r) - - self.assertEqual(len(result), 1) - - # self.plot_summary_A(paths, tooldia, result, "WALK expected.") - - def test_no_jump1(self): - print("Test: FLY Expected") - paths = [ - LineString([[0, 2], [2, 5]]), - LineString([[2, 0], [5, 2]]) - ] - for p in paths: - print(p) - - tooldia = 1.0 - - print("--") - result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) - - result = list(result.get_objects()) - for r in result: - print(r) - - self.assertEqual(len(result), len(paths)) - - # self.plot_summary_A(paths, tooldia, result, "FLY Expected") - - def test_no_jump2(self): - print("Test: FLY Expected") - paths = [ - LineString([[0.5, 2], [2, 4.5]]), - LineString([[2, 0.5], [4.5, 2]]) - ] - for p in paths: - print(p) - - tooldia = 1.1 - - print("--") - result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) - - result = list(result.get_objects()) - for r in result: - print(r) - - self.assertEqual(len(result), len(paths)) - - # self.plot_summary_A(paths, tooldia, result, "FLY Expected") - - -class PaintConnectTest2(PaintTestCase): - """ - Boundary with an internal cutout. - """ - - def setUp(self): - self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) - self.boundary = self.boundary.difference( - Polygon([[2, 1], [3, 1], [3, 4], [2, 4]]) - ) - - def test_no_jump3(self): - print("TEST: No jump expected") - paths = [ - LineString([[0.5, 1], [1.5, 3]]), - LineString([[4, 1], [4, 4]]) - ] - for p in paths: - print(p) - - tooldia = 1.0 - - print("--") - result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) - - result = list(result.get_objects()) - for r in result: - print(r) - - self.assertEqual(len(result), len(paths)) - - # self.plot_summary_A(paths, tooldia, result, "FLY Expected") - - -class PaintConnectTest3(PaintTestCase): - """ - Tests with linerings among elements. - """ - - def setUp(self): - self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) - print("TEST w/ LinearRings") - - def test_jump2(self): - print("Test: WALK Expected") - paths = [ - LineString([[0.5, 2], [2, 4.5]]), - LineString([[2, 0.5], [4.5, 2]]), - self.boundary.buffer(-0.5).exterior - ] - for p in paths: - print(p) - - tooldia = 1.0 - - print("--") - result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) - - result = list(result.get_objects()) - for r in result: - print(r) - - self.assertEqual(len(result), 1) - - # self.plot_summary_A(paths, tooldia, result, "WALK Expected") - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_pathconnect.py b/tests/test_pathconnect.py deleted file mode 100644 index cf25389f..00000000 --- a/tests/test_pathconnect.py +++ /dev/null @@ -1,89 +0,0 @@ -import unittest - -from shapely.geometry import LineString, Polygon -from shapely.ops import unary_union -from matplotlib.pyplot import plot, subplot, show, cla, clf, xlim, ylim, title -from camlib import * -from random import random - - -def mkstorage(paths): - def get_pts(o): - return [o.coords[0], o.coords[-1]] - storage = FlatCAMRTreeStorage() - storage.get_points = get_pts - for p in paths: - storage.insert(p) - return storage - - -class PathConnectTest1(unittest.TestCase): - - def setUp(self): - print("PathConnectTest1.setUp()") - pass - - def test_simple_connect(self): - paths = [ - LineString([[0, 0], [1, 1]]), - LineString([[1, 1], [2, 1]]) - ] - - result = Geometry.path_connect(mkstorage(paths)) - - result = list(result.get_objects()) - self.assertEqual(len(result), 1) - self.assertTrue(result[0].equals(LineString([[0, 0], [1, 1], [2, 1]]))) - - def test_interfere_connect(self): - paths = [ - LineString([[0, 0], [1, 1]]), - LineString([[1, 1], [2, 1]]), - LineString([[-0.5, 0.5], [0.5, 0]]) - ] - - result = Geometry.path_connect(mkstorage(paths)) - - result = list(result.get_objects()) - self.assertEqual(len(result), 2) - matches = [p for p in result if p.equals(LineString([[0, 0], [1, 1], [2, 1]]))] - self.assertEqual(len(matches), 1) - - def test_simple_connect_offset1(self): - for i in range(20): - offset_x = random() - offset_y = random() - - paths = [ - LineString([[0 + offset_x, 0 + offset_y], [1 + offset_x, 1 + offset_y]]), - LineString([[1 + offset_x, 1 + offset_y], [2 + offset_x, 1 + offset_y]]) - ] - - result = Geometry.path_connect(mkstorage(paths)) - - result = list(result.get_objects()) - self.assertEqual(len(result), 1) - self.assertTrue(result[0].equals(LineString([[0 + offset_x, 0 + offset_y], - [1 + offset_x, 1 + offset_y], - [2 + offset_x, 1 + offset_y]]))) - - def test_ring_interfere_connect(self): - print() - print("TEST STARTING ...") - - paths = [ - LineString([[0, 0], [1, 1]]), - LineString([[1, 1], [2, 1]]), - LinearRing([[1, 1], [2, 2], [1, 3], [0, 2]]) - ] - - result = Geometry.path_connect(mkstorage(paths)) - - result = list(result.get_objects()) - self.assertEqual(len(result), 2) - matches = [p for p in result if p.equals(LineString([[0, 0], [1, 1], [2, 1]]))] - self.assertEqual(len(matches), 1) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_polygon_paint.py b/tests/test_polygon_paint.py deleted file mode 100644 index 34707fa2..00000000 --- a/tests/test_polygon_paint.py +++ /dev/null @@ -1,220 +0,0 @@ -import sys -import unittest -from PyQt5 import QtGui, QtWidgets -from FlatCAMApp import App -from FlatCAMObj import FlatCAMGeometry, FlatCAMCNCjob -from flatcamGUI.ObjectUI import GerberObjectUI, GeometryObjectUI -from time import sleep -import os -import tempfile -from shapely.geometry import LineString, LinearRing, Polygon, MultiPolygon - - -class PolyPaintTestCase(unittest.TestCase): - - def setUp(self): - self.app = QtWidgets.QApplication(sys.argv) - - # Create App, keep app defaults (do not load - # user-defined defaults). - self.fc = App(user_defaults=False) - - def tearDown(self): - - for _ in range(2): - self.app.processEvents() - - # NOTE: These are creating problems... - # del self.fc - # del self.app - - def test_poly_paint_svg_all(self): - - print("*********************************") - print("* svg_all *") - print("*********************************") - - # Clear workspace - self.fc.on_file_new() - for _ in range(2): - self.app.processEvents() - - # Open SVG with polygons - self.fc.import_svg('tests/svg/drawing.svg') - - name = self.fc.collection.get_names()[0] - - self.fc.collection.set_active(name) - - geo_obj = self.fc.collection.get_by_name(name) - - # Paint all polygons - geo_obj.paint_poly_all(5, 0.2, 1) - sleep(5) # Todo: Do not base it on fixed time. - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - self.assertEqual(len(names), 2) - - # Verify new geometry makes sense - painted = self.fc.collection.get_by_name(names[-1]) - for geo in painted.solid_geometry: - # Correct Type - self.assertTrue(isinstance(geo, LineString)) - # Lots of points (Should be 1000s) - self.assertGreater(len(geo.coords), 2) - - def test_poly_paint_svg_click(self): - - print("*********************************") - print("* svg_click *") - print("*********************************") - - # Clear workspace - self.fc.on_file_new() - for _ in range(2): - self.app.processEvents() - - # Open SVG with polygons - self.fc.import_svg('tests/svg/drawing.svg') - - name = self.fc.collection.get_names()[0] - - self.fc.collection.set_active(name) - - geo_obj = self.fc.collection.get_by_name(name) - - # Paint all polygons - geo_obj.paint_poly_single_click([300, 700], 5, 0.2, 1) - sleep(5) - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - sleep(1) - self.assertEqual(len(names), 2) - - # Verify new geometry makes sense - painted = self.fc.collection.get_by_name(names[-1]) - for geo in painted.solid_geometry: - # Correct Type - self.assertTrue(isinstance(geo, LineString)) - # Lots of points (Should be 1000s) - self.assertGreater(len(geo.coords), 2) - - def test_poly_paint_noncopper_all(self): - - print("*********************************") - print("* noncopper_all *") - print("*********************************") - - # Clear workspace - self.fc.on_file_new() - for _ in range(2): - self.app.processEvents() - - self.fc.open_gerber('tests/gerber_files/simple1.gbr') - sleep(1) - for _ in range(2): - self.app.processEvents() - - name = self.fc.collection.get_names()[0] - - gerber_obj = self.fc.collection.get_by_name(name) - - self.fc.collection.set_active(name) - - gerber_obj.on_generatenoncopper_button_click() - sleep(1) - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - sleep(1) - self.assertEqual(len(names), 2) - - geoname = "simple1.gbr_noncopper" - geo_obj = self.fc.collection.get_by_name(geoname) - self.fc.collection.set_active(geoname) - - geo_obj.paint_poly_all(0.02, 0.2, 0) - sleep(5) - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - sleep(1) - self.assertEqual(len(names), 3) - - # Verify new geometry makes sense - painted = self.fc.collection.get_by_name(names[-1]) - for geo in painted.solid_geometry: - # Correct Type - self.assertTrue(isinstance(geo, LineString)) - # Lots of points (Should be 1000s) - self.assertGreater(len(geo.coords), 2) - - def test_poly_paint_noncopper_click(self): - - print("*********************************") - print("* noncopper_click *") - print("*********************************") - - # Clear workspace - self.fc.on_file_new() - for _ in range(2): - self.app.processEvents() - - self.fc.open_gerber('tests/gerber_files/simple1.gbr') - sleep(1) - for _ in range(2): - self.app.processEvents() - - name = self.fc.collection.get_names()[0] - - gerber_obj = self.fc.collection.get_by_name(name) - - self.fc.collection.set_active(name) - - gerber_obj.on_generatenoncopper_button_click() - sleep(1) - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - sleep(1) - self.assertEqual(len(names), 2) - - geoname = "simple1.gbr_noncopper" - geo_obj = self.fc.collection.get_by_name(geoname) - self.fc.collection.set_active(geoname) - - geo_obj.paint_poly_single_click([2.7, 1.0], 0.02, 0.2, 0) - sleep(5) - for _ in range(2): - self.app.processEvents() - - # New object should be available - names = self.fc.collection.get_names() - - sleep(1) - self.assertEqual(len(names), 3) - - # Verify new geometry makes sense - painted = self.fc.collection.get_by_name(names[-1]) - for geo in painted.solid_geometry: - # Correct Type - self.assertTrue(isinstance(geo, LineString)) - # Lots of points (Should be 1000s) - self.assertGreater(len(geo.coords), 2) diff --git a/tests/test_svg_flow.py b/tests/test_svg_flow.py deleted file mode 100644 index 7fbd6658..00000000 --- a/tests/test_svg_flow.py +++ /dev/null @@ -1,127 +0,0 @@ -import sys -import unittest -from PyQt5 import QtWidgets -from FlatCAMApp import App -from FlatCAMObj import FlatCAMGeometry, FlatCAMCNCjob -from flatcamGUI.ObjectUI import GerberObjectUI, GeometryObjectUI -from time import sleep -import os -import tempfile - - -class SVGFlowTestCase(unittest.TestCase): - - def setUp(self): - self.app = QtWidgets.QApplication(sys.argv) - - # Create App, keep app defaults (do not load - # user-defined defaults). - self.fc = App(user_defaults=False) - - self.filename = 'drawing.svg' - - def tearDown(self): - del self.fc - del self.app - - def test_flow(self): - - self.fc.import_svg('tests/svg/' + self.filename) - - names = self.fc.collection.get_names() - print(names) - - # -------------------------------------- - # Total of 1 objects. - # -------------------------------------- - self.assertEqual(len(names), 1, "Expected 1 object, found %d" % len(names)) - - # -------------------------------------- - # Object's name matches the file name. - # -------------------------------------- - self.assertEqual(names[0], self.filename, "Expected name == %s, got %s" % (self.filename, names[0])) - - # --------------------------------------- - # Get object by that name, make sure it's a FlatCAMGerber. - # --------------------------------------- - geo_name = names[0] - geo_obj = self.fc.collection.get_by_name(geo_name) - self.assertTrue(isinstance(geo_obj, FlatCAMGeometry), - "Expected FlatCAMGeometry, instead, %s is %s" % - (geo_name, type(geo_obj))) - - # ---------------------------------------- - # Object's GUI matches Object's options - # ---------------------------------------- - # TODO: Open GUI with double-click on object. - # Opens the Object's GUI, populates it. - geo_obj.build_ui() - for option, value in list(geo_obj.options.items()): - try: - form_field = geo_obj.form_fields[option] - except KeyError: - print(("**********************************************************\n" - "* WARNING: Option '{}' has no form field\n" - "**********************************************************" - "".format(option))) - continue - self.assertEqual(value, form_field.get_value(), - "Option '{}' == {} but form has {}".format( - option, value, form_field.get_value() - )) - - # ------------------------------------ - # Open the UI, make CNCObject - # ------------------------------------ - geo_obj.build_ui() - ui = geo_obj.ui - assert isinstance(ui, GeometryObjectUI) # Just for the IDE - ui.generate_cnc_button.click() # Click - - # Work is done in a separate thread and results are - # passed via events to the main event loop which is - # not running. Run only for pending events. - # - # I'm not sure why, but running it only once does - # not catch the new object. Might be a timing issue. - # http://pyqt.sourceforge.net/Docs/PyQt4/qeventloop.html#details - for _ in range(2): - sleep(0.1) - self.app.processEvents() - - # --------------------------------------------- - # Check that only 1 object has been created. - # --------------------------------------------- - names = self.fc.collection.get_names() - self.assertEqual(len(names), 2, - "Expected 2 objects, found %d" % len(names)) - - # ------------------------------------------------------- - # Make sure the CNC Job Object has the correct name - # ------------------------------------------------------- - cnc_name = geo_name + "_cnc" - self.assertTrue(cnc_name in names, - "Object named %s not found." % geo_name) - - # ------------------------------------------------------- - # Get the object make sure it's a CNC Job object - # ------------------------------------------------------- - cnc_obj = self.fc.collection.get_by_name(cnc_name) - self.assertTrue(isinstance(cnc_obj, FlatCAMCNCjob), - "Expected a FlatCAMCNCJob, got %s" % type(geo_obj)) - - # ----------------------------------------- - # Export G-Code, check output - # ----------------------------------------- - assert isinstance(cnc_obj, FlatCAMCNCjob) - output_filename = "" - # get system temporary file(try create it and delete also) - with tempfile.NamedTemporaryFile(prefix='unittest.', - suffix="." + cnc_name + '.gcode', - delete=True) as tmp_file: - output_filename = tmp_file.name - cnc_obj.export_gcode(output_filename) - self.assertTrue(os.path.isfile(output_filename)) - os.remove(output_filename) - - print(names) diff --git a/tests/test_tclCommands/__init__.py b/tests/test_tclCommands/__init__.py deleted file mode 100644 index 615ad03d..00000000 --- a/tests/test_tclCommands/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -import pkgutil -import sys - -# allowed command tests (please append them alphabetically ordered) -from .test_TclCommandAddPolygon import * -from .test_TclCommandAddPolyline import * -from .test_TclCommandCncjob import * -from .test_TclCommandDrillcncjob import * -from .test_TclCommandExportGcode import * -from .test_TclCommandExteriors import * -from .test_TclCommandImportSvg import * -from .test_TclCommandInteriors import * -from .test_TclCommandIsolate import * -from .test_TclCommandNew import * -from .test_TclCommandNewGeometry import * -from .test_TclCommandOpenExcellon import * -from .test_TclCommandOpenGerber import * -from .test_TclCommandPaintPolygon import * diff --git a/tests/test_tclCommands/test_TclCommandAddPolygon.py b/tests/test_tclCommands/test_TclCommandAddPolygon.py deleted file mode 100644 index e2099add..00000000 --- a/tests/test_tclCommands/test_TclCommandAddPolygon.py +++ /dev/null @@ -1,18 +0,0 @@ -from FlatCAMObj import FlatCAMGeometry - - -def test_add_polygon(self): - """ - Test add polygon into geometry - :param self: - :return: - """ - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - points = '0 0 20 0 10 10 0 10' - - self.fc.exec_command_test('add_polygon "%s" %s' % (self.geometry_name, points)) diff --git a/tests/test_tclCommands/test_TclCommandAddPolyline.py b/tests/test_tclCommands/test_TclCommandAddPolyline.py deleted file mode 100644 index 69c0577d..00000000 --- a/tests/test_tclCommands/test_TclCommandAddPolyline.py +++ /dev/null @@ -1,18 +0,0 @@ -from FlatCAMObj import FlatCAMGeometry - - -def test_add_polyline(self): - """ - Test add polyline into geometry - :param self: - :return: - """ - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - points = '0 0 20 0 10 10 0 10 33 33' - - self.fc.exec_command_test('add_polyline "%s" %s' % (self.geometry_name, points)) diff --git a/tests/test_tclCommands/test_TclCommandCncjob.py b/tests/test_tclCommands/test_TclCommandCncjob.py deleted file mode 100644 index 63ded99b..00000000 --- a/tests/test_tclCommands/test_TclCommandCncjob.py +++ /dev/null @@ -1,17 +0,0 @@ -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMObj -from .test_TclCommandIsolate import * - -def test_cncjob(self): - """ - Test cncjob - :param self: - :return: - """ - - # reuse isolate tests - test_isolate(self) - - self.fc.exec_command_test('cncjob %s_iso -tooldia 0.5 -z_cut 0.05 -z_move 3 -feedrate 300' % self.gerber_top_name) - cam_top_obj = self.fc.collection.get_by_name(self.gerber_top_name + '_iso_cnc') - self.assertTrue(isinstance(cam_top_obj, FlatCAMObj), "Expected FlatCAMObj, instead, %s is %s" - % (self.gerber_top_name + '_iso_cnc', type(cam_top_obj))) \ No newline at end of file diff --git a/tests/test_tclCommands/test_TclCommandDrillcncjob.py b/tests/test_tclCommands/test_TclCommandDrillcncjob.py deleted file mode 100644 index ce651a6e..00000000 --- a/tests/test_tclCommands/test_TclCommandDrillcncjob.py +++ /dev/null @@ -1,18 +0,0 @@ -from FlatCAMObj import FlatCAMObj -from .test_TclCommandOpenExcellon import * - - -def test_drillcncjob(self): - """ - Test cncjob - :param self: - :return: - """ - # reuse open excellontests - test_open_excellon(self) - - self.fc.exec_command_test('drillcncjob %s -tools all -drillz 0.5 -travelz 3 -feedrate 300' - % self.excellon_name) - cam_top_obj = self.fc.collection.get_by_name(self.excellon_name + '_cnc') - self.assertTrue(isinstance(cam_top_obj, FlatCAMObj), "Expected FlatCAMObj, instead, %s is %s" - % (self.excellon_name + '_cnc', type(cam_top_obj))) diff --git a/tests/test_tclCommands/test_TclCommandExportGcode.py b/tests/test_tclCommands/test_TclCommandExportGcode.py deleted file mode 100644 index 880b5bea..00000000 --- a/tests/test_tclCommands/test_TclCommandExportGcode.py +++ /dev/null @@ -1,33 +0,0 @@ -import os -import tempfile - -from .test_TclCommandCncjob import * -from .test_TclCommandDrillcncjob import * - - -def test_export_gcodecncjob(self): - """ - Test cncjob - :param self: - :return: - """ - - # reuse tests - test_cncjob(self) - test_drillcncjob(self) - - with tempfile.NamedTemporaryFile(prefix='unittest.', suffix="." + self.excellon_name + '.gcode', delete=True)\ - as tmp_file: - output_filename = tmp_file.name - self.fc.exec_command_test('write_gcode "%s" "%s"' % (self.excellon_name + '_cnc', output_filename)) - self.assertTrue(os.path.isfile(output_filename)) - os.remove(output_filename) - - with tempfile.NamedTemporaryFile(prefix='unittest.', suffix="." + self.gerber_top_name + '.gcode', delete=True)\ - as tmp_file: - output_filename = tmp_file.name - self.fc.exec_command_test('write_gcode "%s" "%s"' % (self.gerber_top_name + '_iso_cnc', output_filename)) - self.assertTrue(os.path.isfile(output_filename)) - os.remove(output_filename) - - # TODO check what is inside files , it should be same every time \ No newline at end of file diff --git a/tests/test_tclCommands/test_TclCommandExteriors.py b/tests/test_tclCommands/test_TclCommandExteriors.py deleted file mode 100644 index da47be9f..00000000 --- a/tests/test_tclCommands/test_TclCommandExteriors.py +++ /dev/null @@ -1,24 +0,0 @@ -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry - - -def test_exteriors(self): - """ - Test exteriors - :param self: - :return: - """ - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' - % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name)) - gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name) - self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" - % (self.gerber_cutout_name, type(gerber_cutout_obj))) - - # exteriors interiors and delete isolated traces - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter)) - self.fc.exec_command_test('exteriors %s -outname %s' - % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_exterior')) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso')) - obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior') - self.assertTrue(isinstance(obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.gerber_cutout_name + '_iso_exterior', type(obj))) diff --git a/tests/test_tclCommands/test_TclCommandImportSvg.py b/tests/test_tclCommands/test_TclCommandImportSvg.py deleted file mode 100644 index 3db2590c..00000000 --- a/tests/test_tclCommands/test_TclCommandImportSvg.py +++ /dev/null @@ -1,60 +0,0 @@ -from os import listdir - -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry - - -def test_import_svg(self): - """ - Test all SVG files inside svg directory. - Problematic SVG files shold be put there as test reference. - :param self: - :return: - """ - - file_list = listdir(self.svg_files) - - for svg_file in file_list: - - # import without outname - self.fc.exec_command_test('import_svg "%s/%s"' % (self.svg_files, svg_file)) - - obj = self.fc.collection.get_by_name(svg_file) - self.assertTrue(isinstance(obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (svg_file, type(obj))) - - # import with outname - outname = '%s-%s' % (self.geometry_name, svg_file) - self.fc.exec_command_test('import_svg "%s/%s" -outname "%s"' % (self.svg_files, svg_file, outname)) - - obj = self.fc.collection.get_by_name(outname) - self.assertTrue(isinstance(obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (outname, type(obj))) - - names = self.fc.collection.get_names() - self.assertEqual(len(names), len(file_list)*2, - "Expected %d objects, found %d" % (len(file_list)*2, len(file_list))) - - -def test_import_svg_as_geometry(self): - - self.fc.exec_command_test('import_svg "%s/%s" -type geometry -outname "%s"' - % (self.svg_files, self.svg_filename, self.geometry_name)) - - obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(obj, FlatCAMGeometry) and not isinstance(obj, FlatCAMGerber), - "Expected FlatCAMGeometry, instead, %s is %s" % (self.geometry_name, type(obj))) - - -def test_import_svg_as_gerber(self): - - self.fc.exec_command_test('import_svg "%s/%s" -type gerber -outname "%s"' - % (self.svg_files, self.svg_filename, self.gerber_name)) - - obj = self.fc.collection.get_by_name(self.gerber_name) - self.assertTrue(isinstance(obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % (self.gerber_name, type(obj))) - - self.fc.exec_command_test('isolate "%s"' % self.gerber_name) - obj = self.fc.collection.get_by_name(self.gerber_name+'_iso') - self.assertTrue(isinstance(obj, FlatCAMGeometry), - "Expected FlatCAMGeometry, instead, %s is %s" % (self.gerber_name+'_iso', type(obj))) diff --git a/tests/test_tclCommands/test_TclCommandInteriors.py b/tests/test_tclCommands/test_TclCommandInteriors.py deleted file mode 100644 index c58c380c..00000000 --- a/tests/test_tclCommands/test_TclCommandInteriors.py +++ /dev/null @@ -1,24 +0,0 @@ -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry - - -def test_interiors(self): - """ - Test interiors - :param self: - :return: - """ - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' - % (self.gerber_files, self.cutout_filename, self.gerber_cutout_name)) - gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name) - self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" - % (self.gerber_cutout_name, type(gerber_cutout_obj))) - - # interiors and delete isolated traces - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_cutout_name, self.engraver_diameter)) - self.fc.exec_command_test('interiors %s -outname %s' - % (self.gerber_cutout_name + '_iso', self.gerber_cutout_name + '_iso_interior')) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso')) - obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_interior') - self.assertTrue(isinstance(obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.gerber_cutout_name + '_iso_interior', type(obj))) diff --git a/tests/test_tclCommands/test_TclCommandIsolate.py b/tests/test_tclCommands/test_TclCommandIsolate.py deleted file mode 100644 index e61aa40b..00000000 --- a/tests/test_tclCommands/test_TclCommandIsolate.py +++ /dev/null @@ -1,21 +0,0 @@ -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry - - -def test_isolate(self): - """ - Test isolate gerber - :param self: - :return: - """ - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' - % (self.gerber_files, self.copper_top_filename, self.gerber_top_name)) - gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name) - self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" - % (self.gerber_top_name, type(gerber_top_obj))) - - # isolate traces - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter)) - geometry_top_obj = self.fc.collection.get_by_name(self.gerber_top_name+'_iso') - self.assertTrue(isinstance(geometry_top_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.gerber_top_name+'_iso', type(geometry_top_obj))) \ No newline at end of file diff --git a/tests/test_tclCommands/test_TclCommandNew.py b/tests/test_tclCommands/test_TclCommandNew.py deleted file mode 100644 index 07eba0b7..00000000 --- a/tests/test_tclCommands/test_TclCommandNew.py +++ /dev/null @@ -1,48 +0,0 @@ -from FlatCAMObj import FlatCAMGeometry - - -def test_new(self): - """ - Test new project - :param self: - :return: - """ - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - self.fc.exec_command_test('proc testproc {} { puts "testresult" }') - - result = self.fc.exec_command_test('testproc') - - self.assertEqual(result, "testresult",'testproc should return "testresult"') - - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - # object should not exists anymore - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertIsNone(geometry_obj, "Expected object to be None, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - # TODO after new it should delete all procedures and variables, we need to make sure "testproc" does not exists - - # Test it again with same names - - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - # object should not exists anymore - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertIsNone(geometry_obj, "Expected object to be None, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) diff --git a/tests/test_tclCommands/test_TclCommandNewGeometry.py b/tests/test_tclCommands/test_TclCommandNewGeometry.py deleted file mode 100644 index 72e069c6..00000000 --- a/tests/test_tclCommands/test_TclCommandNewGeometry.py +++ /dev/null @@ -1,14 +0,0 @@ -from FlatCAMObj import FlatCAMGeometry - - -def test_new_geometry(self): - """ - Test create new geometry - :param self: - :return: - """ - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) diff --git a/tests/test_tclCommands/test_TclCommandOpenExcellon.py b/tests/test_tclCommands/test_TclCommandOpenExcellon.py deleted file mode 100644 index 7570ea53..00000000 --- a/tests/test_tclCommands/test_TclCommandOpenExcellon.py +++ /dev/null @@ -1,15 +0,0 @@ -from FlatCAMObj import FlatCAMExcellon - - -def test_open_excellon(self): - """ - Test open excellon file - :param self: - :return: - """ - - self.fc.exec_command_test('open_excellon %s/%s -outname %s' - % (self.gerber_files, self.excellon_filename, self.excellon_name)) - excellon_obj = self.fc.collection.get_by_name(self.excellon_name) - self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon), "Expected FlatCAMExcellon, instead, %s is %s" - % (self.excellon_name, type(excellon_obj))) diff --git a/tests/test_tclCommands/test_TclCommandOpenGerber.py b/tests/test_tclCommands/test_TclCommandOpenGerber.py deleted file mode 100644 index 71d50b0d..00000000 --- a/tests/test_tclCommands/test_TclCommandOpenGerber.py +++ /dev/null @@ -1,25 +0,0 @@ -from FlatCAMObj import FlatCAMGerber - - -def test_open_gerber(self): - """ - Test open gerber file - :param self: - :return: - """ - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' - % (self.gerber_files, self.copper_top_filename, self.gerber_top_name)) - gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name) - self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" - % (self.gerber_top_name, type(gerber_top_obj))) - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' - % (self.gerber_files, self.copper_bottom_filename, self.gerber_bottom_name)) - gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name) - self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber), "Expected FlatCAMGerber, instead, %s is %s" - % (self.gerber_bottom_name, type(gerber_bottom_obj))) - - #just read with original name - self.fc.exec_command_test('open_gerber %s/%s' - % (self.gerber_files, self.copper_top_filename)) diff --git a/tests/test_tclCommands/test_TclCommandPaintPolygon.py b/tests/test_tclCommands/test_TclCommandPaintPolygon.py deleted file mode 100644 index cc0c5616..00000000 --- a/tests/test_tclCommands/test_TclCommandPaintPolygon.py +++ /dev/null @@ -1,25 +0,0 @@ -from FlatCAMObj import FlatCAMGeometry - - -def test_paint_polygon(self): - """ - Test create paint polygon geometry - :param self: - :return: - """ - - self.fc.exec_command_test('new_geometry "%s"' % self.geometry_name) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name) - self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - % (self.geometry_name, type(geometry_obj))) - - points = '0 0 20 0 10 10 0 10' - - self.fc.exec_command_test('add_polygon "%s" %s' % (self.geometry_name, points)) - - # TODO rename to paint_polygon in future oop command implementation - self.fc.exec_command_test('paint_poly "%s" 5 5 2 0.5' % (self.geometry_name)) - geometry_obj = self.fc.collection.get_by_name(self.geometry_name+'_paint') - # TODO uncoment check after oop implementation, because of threading inside paint poly - #self.assertTrue(isinstance(geometry_obj, FlatCAMGeometry), "Expected FlatCAMGeometry, instead, %s is %s" - # % (self.geometry_name+'_paint', type(geometry_obj))) diff --git a/tests/test_tcl_shell.py b/tests/test_tcl_shell.py deleted file mode 100644 index 0933f66b..00000000 --- a/tests/test_tcl_shell.py +++ /dev/null @@ -1,272 +0,0 @@ -import sys -import unittest -from PyQt5 import QtWidgets, QtGui -from PyQt5.QtCore import QThread - -from FlatCAMApp import App -from os import listdir -from os.path import isfile -from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMCNCjob, FlatCAMExcellon -from flatcamGUI.ObjectUI import GerberObjectUI, GeometryObjectUI -from time import sleep -import os -import tempfile - - -class TclShellTest(unittest.TestCase): - - svg_files = 'tests/svg' - svg_filename = 'Arduino Nano3_pcb.svg' - gerber_files = 'tests/gerber_files' - copper_bottom_filename = 'detector_copper_bottom.gbr' - copper_top_filename = 'detector_copper_top.gbr' - cutout_filename = 'detector_contour.gbr' - excellon_filename = 'detector_drill.txt' - gerber_name = "gerber" - geometry_name = "geometry" - excellon_name = "excellon" - gerber_top_name = "top" - gerber_bottom_name = "bottom" - gerber_cutout_name = "cutout" - engraver_diameter = 0.3 - cutout_diameter = 3 - drill_diameter = 0.8 - - # load test methods to split huge test file into smaller pieces - # reason for this is reuse one test window only, - - # CANNOT DO THIS HERE!!! - # from tests.test_tclCommands import * - - @classmethod - def setUpClass(cls): - - cls.setup = True - cls.app = QtWidgets.QApplication(sys.argv) - - # Create App, keep app defaults (do not load - # user-defined defaults). - cls.fc = App(user_defaults=False) - cls.fc.ui.shell_dock.show() - - def setUp(self): - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - @classmethod - def tearDownClass(cls): - - cls.fc.tcl = None - cls.app.closeAllWindows() - del cls.fc - del cls.app - pass - - def test_set_get_units(self): - """ - Tests setting and getting units via the ``set_sys`` command, - and persistance after ``new`` command. - - :return: None - """ - - # MM - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - # IN - self.fc.exec_command_test('set_sys units IN') - self.fc.exec_command_test('new') - - # ---------------------------------------- - # Units must be IN - # ---------------------------------------- - units = self.fc.exec_command_test('get_sys units') - self.assertEqual(units, "IN") - - # MM - self.fc.exec_command_test('set_sys units MM') - self.fc.exec_command_test('new') - - # ---------------------------------------- - # Units must be MM - # ---------------------------------------- - units = self.fc.exec_command_test('get_sys units') - self.assertEqual(units, "MM") - - def test_gerber_flow(self): - """ - Typical workflow from Gerber to GCode. - - :return: None - """ - - gbr_cmd = 'open_gerber {path}/{filename} -outname {outname}' - - # ----------------------------------------- - # Open top layer and check for object type - # ----------------------------------------- - cmd = gbr_cmd.format( - path=self.gerber_files, - filename=self.copper_top_filename, - outname=self.gerber_top_name) - self.fc.exec_command_test(cmd) - gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name) - self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % - (self.gerber_top_name, type(gerber_top_obj))) - - # -------------------------------------------- - # Open bottom layer and check for object type - # -------------------------------------------- - cmd = gbr_cmd.format( - path=self.gerber_files, - filename=self.copper_bottom_filename, - outname=self.gerber_bottom_name) - self.fc.exec_command_test(cmd) - gerber_bottom_obj = self.fc.collection.get_by_name(self.gerber_bottom_name) - self.assertTrue(isinstance(gerber_bottom_obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % - (self.gerber_bottom_name, type(gerber_bottom_obj))) - - # -------------------------------------------- - # Open cutout layer and check for object type - # -------------------------------------------- - cmd = gbr_cmd.format( - path=self.gerber_files, - filename=self.cutout_filename, - outname=self.gerber_cutout_name - ) - self.fc.exec_command_test(cmd) - gerber_cutout_obj = self.fc.collection.get_by_name(self.gerber_cutout_name) - self.assertTrue(isinstance(gerber_cutout_obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % - (self.gerber_cutout_name, type(gerber_cutout_obj))) - - # exteriors delete and join geometries for top layer - cmd = 'isolate {objname} -dia {dia}'.format( - objname=self.gerber_cutout_name, - dia=self.engraver_diameter) - self.fc.exec_command_test(cmd) - - cmd = 'exteriors {objname} -outname {outname}'.format( - objname=self.gerber_cutout_name + '_iso', - outname=self.gerber_cutout_name + '_iso_exterior') - self.fc.exec_command_test(cmd) - - cmd = 'delete {objname}'.format( - objname=self.gerber_cutout_name + '_iso') - self.fc.exec_command_test(cmd) - - # TODO: Check deleteb object is gone. - - # -------------------------------------------- - # Exteriors of cutout layer, check type - # -------------------------------------------- - obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_iso_exterior') - self.assertTrue(isinstance(obj, FlatCAMGeometry), - "Expected FlatCAMGeometry, instead, %s is %s" % - (self.gerber_cutout_name + '_iso_exterior', type(obj))) - - # mirror bottom gerbers - self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_bottom_name, self.gerber_cutout_name)) - self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.gerber_cutout_name, self.gerber_cutout_name)) - - # exteriors delete and join geometries for bottom layer - self.fc.exec_command_test( - 'isolate %s -dia %f -outname %s' % - (self.gerber_cutout_name, self.engraver_diameter, self.gerber_cutout_name + '_bottom_iso') - ) - self.fc.exec_command_test( - 'exteriors %s -outname %s' % - (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior') - ) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso')) - obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior') - self.assertTrue(isinstance(obj, FlatCAMGeometry), - "Expected FlatCAMGeometry, instead, %s is %s" % - (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj))) - - # at this stage we should have 5 objects - names = self.fc.collection.get_names() - self.assertEqual(len(names), 5, - "Expected 5 objects, found %d" % len(names)) - - # isolate traces - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_top_name, self.engraver_diameter)) - self.fc.exec_command_test('isolate %s -dia %f' % (self.gerber_bottom_name, self.engraver_diameter)) - - # join isolated geometries for top and bottom - 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') - ) - 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') - ) - - # at this stage we should have 9 objects - names = self.fc.collection.get_names() - self.assertEqual(len(names), 9, - "Expected 9 objects, found %d" % len(names)) - - # clean unused isolations - self.fc.exec_command_test('delete %s' % (self.gerber_bottom_name + '_iso')) - self.fc.exec_command_test('delete %s' % (self.gerber_top_name + '_iso')) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_iso_exterior')) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso_exterior')) - - # at this stage we should have 5 objects again - names = self.fc.collection.get_names() - self.assertEqual(len(names), 5, - "Expected 5 objects, found %d" % len(names)) - - # geocutout bottom test (it cuts to same object) - self.fc.exec_command_test( - 'isolate %s -dia %f -outname %s' % - (self.gerber_cutout_name, self.cutout_diameter, self.gerber_cutout_name + '_bottom_iso') - ) - self.fc.exec_command_test( - 'exteriors %s -outname %s' % - (self.gerber_cutout_name + '_bottom_iso', self.gerber_cutout_name + '_bottom_iso_exterior') - ) - self.fc.exec_command_test('delete %s' % (self.gerber_cutout_name + '_bottom_iso')) - obj = self.fc.collection.get_by_name(self.gerber_cutout_name + '_bottom_iso_exterior') - self.assertTrue(isinstance(obj, FlatCAMGeometry), - "Expected FlatCAMGeometry, instead, %s is %s" % - (self.gerber_cutout_name + '_bottom_iso_exterior', type(obj))) - self.fc.exec_command_test('geocutout %s -dia %f -gapsize 0.3 -gaps 4' % - (self.gerber_cutout_name + '_bottom_iso_exterior', self.cutout_diameter)) - - # at this stage we should have 6 objects - names = self.fc.collection.get_names() - self.assertEqual(len(names), 6, - "Expected 6 objects, found %d" % len(names)) - - # TODO: tests for tcl - - def test_open_gerber(self): - - self.fc.exec_command_test('open_gerber %s/%s -outname %s' % - (self.gerber_files, self.copper_top_filename, self.gerber_top_name)) - gerber_top_obj = self.fc.collection.get_by_name(self.gerber_top_name) - self.assertTrue(isinstance(gerber_top_obj, FlatCAMGerber), - "Expected FlatCAMGerber, instead, %s is %s" % - (self.gerber_top_name, type(gerber_top_obj))) - - def test_excellon_flow(self): - - self.fc.exec_command_test('open_excellon %s/%s -outname %s' % - (self.gerber_files, self.excellon_filename, self.excellon_name)) - excellon_obj = self.fc.collection.get_by_name(self.excellon_name) - self.assertTrue(isinstance(excellon_obj, FlatCAMExcellon), - "Expected FlatCAMExcellon, instead, %s is %s" % - (self.excellon_name, type(excellon_obj))) - - # mirror bottom excellon - self.fc.exec_command_test('mirror %s -box %s -axis X' % (self.excellon_name, self.gerber_cutout_name)) - - # TODO: tests for tcl diff --git a/tests/test_voronoi.py b/tests/test_voronoi.py deleted file mode 100644 index 71a62942..00000000 --- a/tests/test_voronoi.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Test cases for Voronoi Diagram creation. -Overall, I'm trying less to test the correctness of the result -and more to cover input cases and behavior, making sure -that we return a sane result without error or raise a useful one. -""" - -import pytest - -from shapely.geos import geos_version -from shapely.wkt import loads as load_wkt - -from shapely.ops import voronoi_diagram - -requires_geos_35 = pytest.mark.skipif(geos_version < (3, 5, 0), reason='GEOS >= 3.5.0 is required.') - -@requires_geos_35 -def test_from_multipoint_without_tolerace_with_floating_point_coordinates(): - """But it's fine without it.""" - mp = load_wkt('MULTIPOINT (20.1273 18.7303, 26.5107 18.7303, 20.1273 23.8437, 26.5107 23.8437)') - - regions = voronoi_diagram(mp) - print("Len: %d -> Regions: %s" % (len(regions), str(regions))) - -print(geos_version) -test_from_multipoint_without_tolerace_with_floating_point_coordinates() diff --git a/tests/titlebar_custom.py b/tests/titlebar_custom.py deleted file mode 100644 index f136d0a6..00000000 --- a/tests/titlebar_custom.py +++ /dev/null @@ -1,197 +0,0 @@ -# ######################################################## -# # customize Title bar -# # dotpy.ir -# # iraj.jelo@gmail.com -# ######################################################## -import sys -from PyQt6 import QtWidgets, QtGui -from PyQt6 import QtCore -from PyQt6.QtCore import Qt - -from datetime import datetime -import traceback - - -class TitleBar(QtWidgets.QDialog): - def __init__(self, parent=None): - QtWidgets.QWidget.__init__(self, parent) - self.setWindowFlags(Qt.WindowType.FramelessWindowHint) - css = """ - QWidget{ - Background: #0000FF; - color:white; - font:12px bold; - font-weight:bold; - border-radius: 1px; - height: 11px; - } - QDialog{ - Background-image:url('img/titlebar bg.png'); - font-size:12px; - color: black; - - } - QToolButton{ - Background:#AA00AA; - font-size:11px; - } - QToolButton:hover{ - Background: #FF00FF; - font-size:11px; - } - """ - self.setAutoFillBackground(True) - self.setBackgroundRole(QtGui.QPalette.ColorRole.Highlight) - self.setStyleSheet(css) - self.minimize = QtWidgets.QToolButton(self) - self.minimize.setIcon(QtGui.QIcon('img/min.png')) - self.maximize = QtWidgets.QToolButton(self) - self.maximize.setIcon(QtGui.QIcon('img/max.png')) - close = QtWidgets.QToolButton(self) - close.setIcon(QtGui.QIcon('img/close.png')) - self.minimize.setMinimumHeight(10) - close.setMinimumHeight(10) - self.maximize.setMinimumHeight(10) - label = QtWidgets.QLabel(self) - label.setText("Window Title") - self.setWindowTitle("Window Title") - hbox = QtWidgets.QHBoxLayout(self) - hbox.addWidget(label) - hbox.addWidget(self.minimize) - hbox.addWidget(self.maximize) - hbox.addWidget(close) - hbox.insertStretch(1, 500) - hbox.setSpacing(0) - self.setSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) - self.maxNormal = False - close.clicked.connect(self.close) - self.minimize.clicked.connect(self.showSmall) - self.maximize.clicked.connect(self.showMaxRestore) - - @staticmethod - def showSmall(): - box.showMinimized() - - def showMaxRestore(self): - if self.maxNormal: - box.showNormal() - self.maxNormal = False - self.maximize.setIcon(QtGui.QIcon('img/max.png')) - else: - box.showMaximized() - self.maxNormal = True - self.maximize.setIcon(QtGui.QIcon('img/max2.png')) - - def close(self): - box.close() - - def mousePressEvent(self, event): - if event.button() == Qt.MouseButton.LeftButton: - box.moving = True - box.offset = event.position() - if event.type() == QtCore.QEvent.Type.MouseButtonDblClick: - self.showMaxRestore() - - def mouseMoveEvent(self, event): - if box.isMaximized(): - self.showMaxRestore() - box.move(event.globalPosition().toPoint() - box.offset) - else: - if box.moving: - box.move(event.globalPosition().toPoint() - box.offset) - - -class Frame(QtWidgets.QFrame): - def __init__(self, parent=None): - QtWidgets.QFrame.__init__(self, parent) - - self.m_old_pos = None - self.m_mouse_down = False - self.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - css = """ - QFrame{ - Background: #FFFFF0; - color:white; - font:13px ; - font-weight:bold; - } - """ - self.setStyleSheet(css) - self.setWindowFlags(Qt.WindowType.FramelessWindowHint) - self.setMouseTracking(True) - self.m_titleBar = TitleBar(self) - self.m_content = QtWidgets.QWidget(self) - vbox = QtWidgets.QVBoxLayout(self) - vbox.addWidget(self.m_titleBar) - vbox.setContentsMargins(0, 0, 0, 0) - vbox.setSpacing(0) - layout = QtWidgets.QVBoxLayout() - layout.addWidget(self.m_content) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(0) - vbox.addLayout(layout) - # Allows you to access the content area of the frame - # where widgets and layouts can be added - - def contentWidget(self): - return self.m_content - - def titleBar(self): - return self.m_titleBar - - def mousePressEvent(self, event): - self.m_old_pos = event.pos() - self.m_mouse_down = event.button() == Qt.MouseButton.LeftButton - - def mouseMoveEvent(self, event): - event.position().x() - event.position().y() - - def mouseReleaseEvent(self, event): - self.m_mouse_down = False - - -if __name__ == '__main__': - def excepthook(exc_type, exc_value, exc_tb): - msg = '%s\n' % str(datetime.today()) - if exc_type != KeyboardInterrupt: - msg += "".join(traceback.format_exception(exc_type, exc_value, exc_tb)) - - # show the message - try: - msgbox = QtWidgets.QMessageBox() - displayed_msg = "The application encountered a critical error and it will close.\n" \ - "Please report this error to the developers." - - msgbox.setText(displayed_msg) - msgbox.setDetailedText(msg) - msgbox.setWindowTitle("Critical Error") - # msgbox.setWindowIcon() - msgbox.setIcon(QtWidgets.QMessageBox.Icon.Critical) - - bt_yes = msgbox.addButton("Quit", QtWidgets.QMessageBox.ButtonRole.YesRole) - - msgbox.setDefaultButton(bt_yes) - # msgbox.setTextFormat(Qt.TextFormat.RichText) - msgbox.exec() - except Exception: - pass - QtWidgets.QApplication.quit() - # or QtWidgets.QApplication.exit(0) - - - sys.excepthook = excepthook - - app = QtWidgets.QApplication(sys.argv) - box = Frame() - box.move(60, 60) - - le = QtWidgets.QVBoxLayout(box.contentWidget()) - - le.setContentsMargins(0, 0, 0, 0) - edit = QtWidgets.QLabel("""I would've did anything for you to show you how much I adored you -But it's over now, it's too late to save our loveJust promise me you'll think of me -Every time you look up in the sky and see a star 'cuz I'm your star.""") - le.addWidget(edit) - box.show() - app.exec() diff --git a/tests/toolpath_optimization_profiling/toollift_minimization_line_profile1.py b/tests/toolpath_optimization_profiling/toollift_minimization_line_profile1.py deleted file mode 100644 index c66245bc..00000000 --- a/tests/toolpath_optimization_profiling/toollift_minimization_line_profile1.py +++ /dev/null @@ -1,8 +0,0 @@ -# Run kernprof -l -v gerber_parsing_line_profile_1.py -import sys -sys.path.append('../../') -from camlib import * -from shapely.geometry import Polygon - -poly = Polygon([(0.0, 0.0), (1.0, 0.0), (1.0, 0.5), (0.0, 0.5)]) -result = Geometry.clear_polygon2(poly, 0.01) diff --git a/tests/toolpath_optimization_profiling/toollift_minimization_profile1.py b/tests/toolpath_optimization_profiling/toollift_minimization_profile1.py deleted file mode 100644 index 038e09b3..00000000 --- a/tests/toolpath_optimization_profiling/toollift_minimization_profile1.py +++ /dev/null @@ -1,11 +0,0 @@ -import cProfile -import pstats -from camlib import * -from shapely.geometry import Polygon - -poly = Polygon([(0.0, 0.0), (1.0, 0.0), (1.0, 0.5), (0.0, 0.5)]) - -cProfile.run('result = Geometry.clear_polygon2(poly, 0.01)', - 'toollist_minimization_profile', sort='cumtime') -p = pstats.Stats('toollist_minimization_profile') -p.sort_stats('cumulative').print_stats(.1) \ No newline at end of file