diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 9403618..6c9d6f9 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -239,13 +239,13 @@ class App(QtCore.QObject): chars = 'abcdefghijklmnopqrstuvwxyz0123456789' if self.defaults['serial'] == 0 or len(str(self.defaults['serial'])) < 10: self.defaults['serial'] = ''.join([random.choice(chars) for i in range(20)]) - self.save_defaults() + self.save_defaults(silent=True) self.propagate_defaults() def auto_save_defaults(): try: - self.save_defaults() + self.save_defaults(silent=True) finally: QtCore.QTimer.singleShot(self.defaults["defaults_save_period_ms"], auto_save_defaults) @@ -819,7 +819,7 @@ class App(QtCore.QObject): self.save_defaults() - def save_defaults(self): + def save_defaults(self, silent=False): """ Saves application default options ``self.defaults`` to defaults.json. @@ -863,7 +863,8 @@ class App(QtCore.QObject): self.inform.emit("[error] Failed to write defaults to file.") return - self.inform.emit("Defaults saved.") + if not silent: + self.inform.emit("Defaults saved.") def on_edit_join(self): """ @@ -2327,9 +2328,11 @@ class App(QtCore.QObject): full_url = App.version_url + \ "?s=" + str(self.defaults['serial']) + \ "&v=" + str(self.version) + \ + "&os=" + str(self.os) + \ "&" + urllib.urlencode(self.defaults["stats"]) App.log.debug("Checking for updates @ %s" % full_url) + ### Get the data try: f = urllib.urlopen(full_url) except: @@ -2348,6 +2351,7 @@ class App(QtCore.QObject): f.close() + ### Latest version? if self.version >= data["version"]: App.log.debug("FlatCAM is up to date!") self.inform.emit("[success] FlatCAM is up to date!") @@ -2356,9 +2360,10 @@ class App(QtCore.QObject): App.log.debug("Newer version available.") self.message.emit( "Newer Version Available", - "There is a newer version of FlatCAM\n" + - "available for download:\n\n" + - data["name"] + "\n\n" + data["message"], + QtCore.QString("There is a newer version of FlatCAM " + + "available for download:

" + + "" + data["name"] + "
" + + data["message"].replace("\n", "
")), "info" ) diff --git a/FlatCAMDraw.py b/FlatCAMDraw.py index 5ad10ce..cd2648d 100644 --- a/FlatCAMDraw.py +++ b/FlatCAMDraw.py @@ -16,7 +16,14 @@ from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea from rtree import index as rtindex + class DrawTool(object): + """ + Abstract Class representing a tool in the drawing + program. Can generate geometry, including temporary + utility geometry that is updated on user clicks + and mouse motion. + """ def __init__(self, draw_app): self.draw_app = draw_app self.complete = False @@ -40,6 +47,10 @@ class FCShapeTool(DrawTool): class FCCircle(FCShapeTool): + """ + Resulting type: Polygon + """ + def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.start_msg = "Click on CENTER ..." @@ -60,7 +71,7 @@ class FCCircle(FCShapeTool): if len(self.points) == 1: p1 = self.points[0] p2 = data - radius = sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) + radius = sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) return Point(p1).buffer(radius) return None @@ -68,12 +79,16 @@ class FCCircle(FCShapeTool): def make(self): p1 = self.points[0] p2 = self.points[1] - radius = sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) + radius = sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) self.geometry = Point(p1).buffer(radius) self.complete = True class FCRectangle(FCShapeTool): + """ + Resulting type: Polygon + """ + def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.start_msg = "Click on 1st corner ..." @@ -107,6 +122,10 @@ class FCRectangle(FCShapeTool): class FCPolygon(FCShapeTool): + """ + Resulting type: Polygon + """ + def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.start_msg = "Click on 1st point ..." @@ -139,6 +158,10 @@ class FCPolygon(FCShapeTool): class FCPath(FCPolygon): + """ + Resulting type: LineString + """ + def make(self): self.geometry = LineString(self.points) self.complete = True @@ -166,10 +189,11 @@ class FCSelect(DrawTool): if self.draw_app.key != 'control': shape["selected"] = False - distance = Point(point).distance(shape["geometry"]) - if distance < min_distance: + # TODO: Do this with rtree? + dist = Point(point).distance(shape["geometry"]) + if dist < min_distance: closest_shape = shape - min_distance = distance + min_distance = dist if closest_shape is not None: closest_shape["selected"] = True @@ -799,4 +823,4 @@ class FlatCAMDraw(QtCore.QObject): def distance(pt1, pt2): - return sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2) \ No newline at end of file + return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2) \ No newline at end of file diff --git a/ObjectUI.py b/ObjectUI.py index 23a61b4..2a5bf6e 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -295,7 +295,9 @@ class GeometryObjectUI(ObjectUI): # Method methodlabel = QtGui.QLabel('Method:') methodlabel.setToolTip( - "Algorithm to paint the polygon." + "Algorithm to paint the polygon:
" + "Standard: Fixed step inwards.
" + "Seed-based: Outwards from seed." ) grid2.addWidget(methodlabel, 3, 0) self.paintmethod_combo = RadioSet([ diff --git a/camlib.py b/camlib.py index d2dddbc..712370f 100644 --- a/camlib.py +++ b/camlib.py @@ -125,19 +125,15 @@ class Geometry(object): log.debug("Geometry->bounds()") if self.solid_geometry is None: log.debug("solid_geometry is None") - log.warning("solid_geometry not computed yet.") return 0, 0, 0, 0 if type(self.solid_geometry) is list: - log.debug("type(solid_geometry) is list") # TODO: This can be done faster. See comment from Shapely mailing lists. if len(self.solid_geometry) == 0: log.debug('solid_geometry is empty []') return 0, 0, 0, 0 - log.debug('solid_geometry is not empty, returning cascaded union of items') return cascaded_union(self.solid_geometry).bounds else: - log.debug("type(solid_geometry) is not list, returning .bounds property") return self.solid_geometry.bounds def flatten_to_paths(self, geometry=None, reset=True): diff --git a/defaults.json b/defaults.json deleted file mode 100644 index 4c43f17..0000000 --- a/defaults.json +++ /dev/null @@ -1 +0,0 @@ -{"cncjob_append": "", "gerber_noncopperrounded": false, "geometry_paintoverlap": 0.15, "geometry_plot": true, "zoom_ratio": 1.5, "shell_at_startup": false, "gerber_isotooldia": 0.016, "serial": "32qac2m529hogh3lo33a", "shell_shape": [500, 300], "zoom_in_key": "3", "zoom_out_key": "2", "stats": {"save_defaults": 30}, "recent_limit": 10, "gerber_plot": true, "defaults_save_period_ms": 20000, "gerber_cutoutgapsize": 0.15, "geometry_feedrate": 3.0, "units": "IN", "excellon_travelz": 0.1, "gerber_multicolored": false, "gerber_solid": true, "gerber_isopasses": 1, "fit_key": "1", "excellon_plot": true, "excellon_feedrate": 3.0, "cncjob_tooldia": 0.016, "geometry_travelz": 0.1, "gerber_cutoutmargin": 0.1, "excellon_solid": false, "geometry_paintmargin": 0.0, "geometry_cutz": -0.002, "gerber_noncoppermargin": 0.0, "gerber_cutouttooldia": 0.07, "zdownrate": null, "gerber_gaps": "4", "last_folder": null, "gerber_bboxmargin": 0.0, "point_clipboard_format": "(%.4f, %.4f)", "cncjob_plot": true, "excellon_drillz": -0.1, "gerber_isooverlap": 0.15, "gerber_bboxrounded": false, "geometry_cnctooldia": 0.016, "geometry_painttooldia": 0.07} \ No newline at end of file diff --git a/recent.json b/recent.json deleted file mode 100644 index 0637a08..0000000 --- a/recent.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/setup_ubuntu.sh b/setup_ubuntu.sh index 14e81ac..f531968 100644 --- a/setup_ubuntu.sh +++ b/setup_ubuntu.sh @@ -12,3 +12,5 @@ easy_install -U distribute apt-get install python-pip pip install --upgrade matplotlib pip install --upgrade Shapely +apt-get install libspatialindex-dev +pip install rtree