Updated Ubuntu setup script to support rtree. Removed defaults.json and recent.json from the main dir.
This commit is contained in:
@@ -239,13 +239,13 @@ class App(QtCore.QObject):
|
|||||||
chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
|
chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
|
||||||
if self.defaults['serial'] == 0 or len(str(self.defaults['serial'])) < 10:
|
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.defaults['serial'] = ''.join([random.choice(chars) for i in range(20)])
|
||||||
self.save_defaults()
|
self.save_defaults(silent=True)
|
||||||
|
|
||||||
self.propagate_defaults()
|
self.propagate_defaults()
|
||||||
|
|
||||||
def auto_save_defaults():
|
def auto_save_defaults():
|
||||||
try:
|
try:
|
||||||
self.save_defaults()
|
self.save_defaults(silent=True)
|
||||||
finally:
|
finally:
|
||||||
QtCore.QTimer.singleShot(self.defaults["defaults_save_period_ms"], auto_save_defaults)
|
QtCore.QTimer.singleShot(self.defaults["defaults_save_period_ms"], auto_save_defaults)
|
||||||
|
|
||||||
@@ -819,7 +819,7 @@ class App(QtCore.QObject):
|
|||||||
|
|
||||||
self.save_defaults()
|
self.save_defaults()
|
||||||
|
|
||||||
def save_defaults(self):
|
def save_defaults(self, silent=False):
|
||||||
"""
|
"""
|
||||||
Saves application default options
|
Saves application default options
|
||||||
``self.defaults`` to defaults.json.
|
``self.defaults`` to defaults.json.
|
||||||
@@ -863,7 +863,8 @@ class App(QtCore.QObject):
|
|||||||
self.inform.emit("[error] Failed to write defaults to file.")
|
self.inform.emit("[error] Failed to write defaults to file.")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.inform.emit("Defaults saved.")
|
if not silent:
|
||||||
|
self.inform.emit("Defaults saved.")
|
||||||
|
|
||||||
def on_edit_join(self):
|
def on_edit_join(self):
|
||||||
"""
|
"""
|
||||||
@@ -2327,9 +2328,11 @@ class App(QtCore.QObject):
|
|||||||
full_url = App.version_url + \
|
full_url = App.version_url + \
|
||||||
"?s=" + str(self.defaults['serial']) + \
|
"?s=" + str(self.defaults['serial']) + \
|
||||||
"&v=" + str(self.version) + \
|
"&v=" + str(self.version) + \
|
||||||
|
"&os=" + str(self.os) + \
|
||||||
"&" + urllib.urlencode(self.defaults["stats"])
|
"&" + urllib.urlencode(self.defaults["stats"])
|
||||||
App.log.debug("Checking for updates @ %s" % full_url)
|
App.log.debug("Checking for updates @ %s" % full_url)
|
||||||
|
|
||||||
|
### Get the data
|
||||||
try:
|
try:
|
||||||
f = urllib.urlopen(full_url)
|
f = urllib.urlopen(full_url)
|
||||||
except:
|
except:
|
||||||
@@ -2348,6 +2351,7 @@ class App(QtCore.QObject):
|
|||||||
|
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
### Latest version?
|
||||||
if self.version >= data["version"]:
|
if self.version >= data["version"]:
|
||||||
App.log.debug("FlatCAM is up to date!")
|
App.log.debug("FlatCAM is up to date!")
|
||||||
self.inform.emit("[success] 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.")
|
App.log.debug("Newer version available.")
|
||||||
self.message.emit(
|
self.message.emit(
|
||||||
"Newer Version Available",
|
"Newer Version Available",
|
||||||
"There is a newer version of FlatCAM\n" +
|
QtCore.QString("There is a newer version of FlatCAM " +
|
||||||
"available for download:\n\n" +
|
"available for download:<br><br>" +
|
||||||
data["name"] + "\n\n" + data["message"],
|
"<B>" + data["name"] + "</b><br>" +
|
||||||
|
data["message"].replace("\n", "<br>")),
|
||||||
"info"
|
"info"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,14 @@ from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea
|
|||||||
|
|
||||||
from rtree import index as rtindex
|
from rtree import index as rtindex
|
||||||
|
|
||||||
|
|
||||||
class DrawTool(object):
|
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):
|
def __init__(self, draw_app):
|
||||||
self.draw_app = draw_app
|
self.draw_app = draw_app
|
||||||
self.complete = False
|
self.complete = False
|
||||||
@@ -40,6 +47,10 @@ class FCShapeTool(DrawTool):
|
|||||||
|
|
||||||
|
|
||||||
class FCCircle(FCShapeTool):
|
class FCCircle(FCShapeTool):
|
||||||
|
"""
|
||||||
|
Resulting type: Polygon
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, draw_app):
|
def __init__(self, draw_app):
|
||||||
DrawTool.__init__(self, draw_app)
|
DrawTool.__init__(self, draw_app)
|
||||||
self.start_msg = "Click on CENTER ..."
|
self.start_msg = "Click on CENTER ..."
|
||||||
@@ -60,7 +71,7 @@ class FCCircle(FCShapeTool):
|
|||||||
if len(self.points) == 1:
|
if len(self.points) == 1:
|
||||||
p1 = self.points[0]
|
p1 = self.points[0]
|
||||||
p2 = data
|
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 Point(p1).buffer(radius)
|
||||||
|
|
||||||
return None
|
return None
|
||||||
@@ -68,12 +79,16 @@ class FCCircle(FCShapeTool):
|
|||||||
def make(self):
|
def make(self):
|
||||||
p1 = self.points[0]
|
p1 = self.points[0]
|
||||||
p2 = self.points[1]
|
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.geometry = Point(p1).buffer(radius)
|
||||||
self.complete = True
|
self.complete = True
|
||||||
|
|
||||||
|
|
||||||
class FCRectangle(FCShapeTool):
|
class FCRectangle(FCShapeTool):
|
||||||
|
"""
|
||||||
|
Resulting type: Polygon
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, draw_app):
|
def __init__(self, draw_app):
|
||||||
DrawTool.__init__(self, draw_app)
|
DrawTool.__init__(self, draw_app)
|
||||||
self.start_msg = "Click on 1st corner ..."
|
self.start_msg = "Click on 1st corner ..."
|
||||||
@@ -107,6 +122,10 @@ class FCRectangle(FCShapeTool):
|
|||||||
|
|
||||||
|
|
||||||
class FCPolygon(FCShapeTool):
|
class FCPolygon(FCShapeTool):
|
||||||
|
"""
|
||||||
|
Resulting type: Polygon
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, draw_app):
|
def __init__(self, draw_app):
|
||||||
DrawTool.__init__(self, draw_app)
|
DrawTool.__init__(self, draw_app)
|
||||||
self.start_msg = "Click on 1st point ..."
|
self.start_msg = "Click on 1st point ..."
|
||||||
@@ -139,6 +158,10 @@ class FCPolygon(FCShapeTool):
|
|||||||
|
|
||||||
|
|
||||||
class FCPath(FCPolygon):
|
class FCPath(FCPolygon):
|
||||||
|
"""
|
||||||
|
Resulting type: LineString
|
||||||
|
"""
|
||||||
|
|
||||||
def make(self):
|
def make(self):
|
||||||
self.geometry = LineString(self.points)
|
self.geometry = LineString(self.points)
|
||||||
self.complete = True
|
self.complete = True
|
||||||
@@ -166,10 +189,11 @@ class FCSelect(DrawTool):
|
|||||||
if self.draw_app.key != 'control':
|
if self.draw_app.key != 'control':
|
||||||
shape["selected"] = False
|
shape["selected"] = False
|
||||||
|
|
||||||
distance = Point(point).distance(shape["geometry"])
|
# TODO: Do this with rtree?
|
||||||
if distance < min_distance:
|
dist = Point(point).distance(shape["geometry"])
|
||||||
|
if dist < min_distance:
|
||||||
closest_shape = shape
|
closest_shape = shape
|
||||||
min_distance = distance
|
min_distance = dist
|
||||||
|
|
||||||
if closest_shape is not None:
|
if closest_shape is not None:
|
||||||
closest_shape["selected"] = True
|
closest_shape["selected"] = True
|
||||||
@@ -799,4 +823,4 @@ class FlatCAMDraw(QtCore.QObject):
|
|||||||
|
|
||||||
|
|
||||||
def distance(pt1, pt2):
|
def distance(pt1, pt2):
|
||||||
return sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
|
return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
|
||||||
@@ -295,7 +295,9 @@ class GeometryObjectUI(ObjectUI):
|
|||||||
# Method
|
# Method
|
||||||
methodlabel = QtGui.QLabel('Method:')
|
methodlabel = QtGui.QLabel('Method:')
|
||||||
methodlabel.setToolTip(
|
methodlabel.setToolTip(
|
||||||
"Algorithm to paint the polygon."
|
"Algorithm to paint the polygon:<BR>"
|
||||||
|
"<B>Standard</B>: Fixed step inwards.<BR>"
|
||||||
|
"<B>Seed-based</B>: Outwards from seed."
|
||||||
)
|
)
|
||||||
grid2.addWidget(methodlabel, 3, 0)
|
grid2.addWidget(methodlabel, 3, 0)
|
||||||
self.paintmethod_combo = RadioSet([
|
self.paintmethod_combo = RadioSet([
|
||||||
|
|||||||
@@ -125,19 +125,15 @@ class Geometry(object):
|
|||||||
log.debug("Geometry->bounds()")
|
log.debug("Geometry->bounds()")
|
||||||
if self.solid_geometry is None:
|
if self.solid_geometry is None:
|
||||||
log.debug("solid_geometry is None")
|
log.debug("solid_geometry is None")
|
||||||
log.warning("solid_geometry not computed yet.")
|
|
||||||
return 0, 0, 0, 0
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
if type(self.solid_geometry) is list:
|
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.
|
# TODO: This can be done faster. See comment from Shapely mailing lists.
|
||||||
if len(self.solid_geometry) == 0:
|
if len(self.solid_geometry) == 0:
|
||||||
log.debug('solid_geometry is empty []')
|
log.debug('solid_geometry is empty []')
|
||||||
return 0, 0, 0, 0
|
return 0, 0, 0, 0
|
||||||
log.debug('solid_geometry is not empty, returning cascaded union of items')
|
|
||||||
return cascaded_union(self.solid_geometry).bounds
|
return cascaded_union(self.solid_geometry).bounds
|
||||||
else:
|
else:
|
||||||
log.debug("type(solid_geometry) is not list, returning .bounds property")
|
|
||||||
return self.solid_geometry.bounds
|
return self.solid_geometry.bounds
|
||||||
|
|
||||||
def flatten_to_paths(self, geometry=None, reset=True):
|
def flatten_to_paths(self, geometry=None, reset=True):
|
||||||
|
|||||||
@@ -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}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[]
|
|
||||||
@@ -12,3 +12,5 @@ easy_install -U distribute
|
|||||||
apt-get install python-pip
|
apt-get install python-pip
|
||||||
pip install --upgrade matplotlib
|
pip install --upgrade matplotlib
|
||||||
pip install --upgrade Shapely
|
pip install --upgrade Shapely
|
||||||
|
apt-get install libspatialindex-dev
|
||||||
|
pip install rtree
|
||||||
|
|||||||
Reference in New Issue
Block a user