- added a Laser preprocessor named 'Z_laser' which will change the Z to the Travel Z on each ToolChange event allowing therefore control of the dot size
- by default now a new blank Geometry object created by FlatCAM is of type multigeo - made sure that optimizations of lines when importing SVG or DXF as lines will not encounter polygons but only LinesStrings or LinearRings, otherwise having crashes - fixed the import SVG and import DXF, when importing as Geometry to be imported as multigeo tool - fixed the import SVG and import DXF, the source files will be saved as loaded into the source_file attribute of the resulting object (be it Geometry or Gerber)
This commit is contained in:
@@ -3979,77 +3979,6 @@ class AppGeoEditor(QtCore.QObject):
|
||||
# self.storage = AppGeoEditor.make_storage()
|
||||
self.replot()
|
||||
|
||||
def edit_fcgeometry(self, fcgeometry, multigeo_tool=None):
|
||||
"""
|
||||
Imports the geometry from the given FlatCAM Geometry object
|
||||
into the editor.
|
||||
|
||||
:param fcgeometry: GeometryObject
|
||||
:param multigeo_tool: A tool for the case of the edited geometry being of type 'multigeo'
|
||||
:return: None
|
||||
"""
|
||||
assert isinstance(fcgeometry, Geometry), "Expected a Geometry, got %s" % type(fcgeometry)
|
||||
|
||||
self.deactivate()
|
||||
self.activate()
|
||||
|
||||
self.set_ui()
|
||||
|
||||
# Hide original geometry
|
||||
self.fcgeometry = fcgeometry
|
||||
fcgeometry.visible = False
|
||||
|
||||
# Set selection tolerance
|
||||
DrawToolShape.tolerance = fcgeometry.drawing_tolerance * 10
|
||||
|
||||
self.select_tool("select")
|
||||
|
||||
if self.app.defaults['geometry_spindledir'] == 'CW':
|
||||
if self.app.defaults['geometry_editor_milling_type'] == 'cl':
|
||||
milling_type = 1 # CCW motion = climb milling (spindle is rotating CW)
|
||||
else:
|
||||
milling_type = -1 # CW motion = conventional milling (spindle is rotating CW)
|
||||
else:
|
||||
if self.app.defaults['geometry_editor_milling_type'] == 'cl':
|
||||
milling_type = -1 # CCW motion = climb milling (spindle is rotating CCW)
|
||||
else:
|
||||
milling_type = 1 # CW motion = conventional milling (spindle is rotating CCW)
|
||||
|
||||
# Link shapes into editor.
|
||||
if multigeo_tool:
|
||||
self.multigeo_tool = multigeo_tool
|
||||
geo_to_edit = self.flatten(geometry=fcgeometry.tools[self.multigeo_tool]['solid_geometry'],
|
||||
orient_val=milling_type)
|
||||
self.app.inform.emit(
|
||||
'[WARNING_NOTCL] %s: %s %s: %s' % (
|
||||
_("Editing MultiGeo Geometry, tool"),
|
||||
str(self.multigeo_tool),
|
||||
_("with diameter"),
|
||||
str(fcgeometry.tools[self.multigeo_tool]['tooldia'])
|
||||
)
|
||||
)
|
||||
else:
|
||||
geo_to_edit = self.flatten(geometry=fcgeometry.solid_geometry, orient_val=milling_type)
|
||||
|
||||
for shape in geo_to_edit:
|
||||
if shape is not None:
|
||||
if type(shape) == Polygon:
|
||||
self.add_shape(DrawToolShape(shape.exterior))
|
||||
for inter in shape.interiors:
|
||||
self.add_shape(DrawToolShape(inter))
|
||||
else:
|
||||
self.add_shape(DrawToolShape(shape))
|
||||
|
||||
self.replot()
|
||||
|
||||
# updated units
|
||||
self.units = self.app.defaults['units'].upper()
|
||||
self.decimals = self.app.decimals
|
||||
|
||||
# start with GRID toolbar activated
|
||||
if self.app.ui.grid_snap_btn.isChecked() is False:
|
||||
self.app.ui.grid_snap_btn.trigger()
|
||||
|
||||
def on_buffer_tool(self):
|
||||
buff_tool = BufferSelectionTool(self.app, self)
|
||||
buff_tool.run()
|
||||
@@ -4700,6 +4629,77 @@ class AppGeoEditor(QtCore.QObject):
|
||||
|
||||
return snap_x, snap_y
|
||||
|
||||
def edit_fcgeometry(self, fcgeometry, multigeo_tool=None):
|
||||
"""
|
||||
Imports the geometry from the given FlatCAM Geometry object
|
||||
into the editor.
|
||||
|
||||
:param fcgeometry: GeometryObject
|
||||
:param multigeo_tool: A tool for the case of the edited geometry being of type 'multigeo'
|
||||
:return: None
|
||||
"""
|
||||
assert isinstance(fcgeometry, Geometry), "Expected a Geometry, got %s" % type(fcgeometry)
|
||||
|
||||
self.deactivate()
|
||||
self.activate()
|
||||
|
||||
self.set_ui()
|
||||
|
||||
# Hide original geometry
|
||||
self.fcgeometry = fcgeometry
|
||||
fcgeometry.visible = False
|
||||
|
||||
# Set selection tolerance
|
||||
DrawToolShape.tolerance = fcgeometry.drawing_tolerance * 10
|
||||
|
||||
self.select_tool("select")
|
||||
|
||||
if self.app.defaults['geometry_spindledir'] == 'CW':
|
||||
if self.app.defaults['geometry_editor_milling_type'] == 'cl':
|
||||
milling_type = 1 # CCW motion = climb milling (spindle is rotating CW)
|
||||
else:
|
||||
milling_type = -1 # CW motion = conventional milling (spindle is rotating CW)
|
||||
else:
|
||||
if self.app.defaults['geometry_editor_milling_type'] == 'cl':
|
||||
milling_type = -1 # CCW motion = climb milling (spindle is rotating CCW)
|
||||
else:
|
||||
milling_type = 1 # CW motion = conventional milling (spindle is rotating CCW)
|
||||
|
||||
# Link shapes into editor.
|
||||
if multigeo_tool:
|
||||
self.multigeo_tool = multigeo_tool
|
||||
geo_to_edit = self.flatten(geometry=fcgeometry.tools[self.multigeo_tool]['solid_geometry'],
|
||||
orient_val=milling_type)
|
||||
self.app.inform.emit(
|
||||
'[WARNING_NOTCL] %s: %s %s: %s' % (
|
||||
_("Editing MultiGeo Geometry, tool"),
|
||||
str(self.multigeo_tool),
|
||||
_("with diameter"),
|
||||
str(fcgeometry.tools[self.multigeo_tool]['tooldia'])
|
||||
)
|
||||
)
|
||||
else:
|
||||
geo_to_edit = self.flatten(geometry=fcgeometry.solid_geometry, orient_val=milling_type)
|
||||
|
||||
for shape in geo_to_edit:
|
||||
if shape is not None:
|
||||
if type(shape) == Polygon:
|
||||
self.add_shape(DrawToolShape(shape.exterior))
|
||||
for inter in shape.interiors:
|
||||
self.add_shape(DrawToolShape(inter))
|
||||
else:
|
||||
self.add_shape(DrawToolShape(shape))
|
||||
|
||||
self.replot()
|
||||
|
||||
# updated units
|
||||
self.units = self.app.defaults['units'].upper()
|
||||
self.decimals = self.app.decimals
|
||||
|
||||
# start with GRID toolbar activated
|
||||
if self.app.ui.grid_snap_btn.isChecked() is False:
|
||||
self.app.ui.grid_snap_btn.trigger()
|
||||
|
||||
def update_fcgeometry(self, fcgeometry):
|
||||
"""
|
||||
Transfers the geometry tool shape buffer to the selected geometry
|
||||
|
||||
@@ -36,14 +36,15 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
|
||||
self.ui = AppGCodeEditorUI(app=self.app)
|
||||
|
||||
# #################################################################################
|
||||
# ################### SIGNALS #####################################################
|
||||
# #################################################################################
|
||||
|
||||
self.gcode_obj = None
|
||||
self.code_edited = ''
|
||||
|
||||
def set_ui(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
# #############################################################################################################
|
||||
# ############# ADD a new TAB in the PLot Tab Area
|
||||
# #############################################################################################################
|
||||
@@ -73,9 +74,18 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
self.ui.append_text.set_value(self.app.defaults["cncjob_append"])
|
||||
self.ui.prepend_text.set_value(self.app.defaults["cncjob_prepend"])
|
||||
|
||||
self.ui.exit_editor_button.buttonSave.clicked.connect(self.update_fcgcode)
|
||||
# #################################################################################
|
||||
# ################### SIGNALS #####################################################
|
||||
# #################################################################################
|
||||
self.ui.update_gcode_button.clicked.connect(self.insert_gcode)
|
||||
self.ui.exit_editor_button.clicked.connect(self.update_fcgcode)
|
||||
|
||||
def build_ui(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
# Remove anything else in the GUI Selected Tab
|
||||
self.app.ui.selected_scroll_area.takeWidget()
|
||||
# Put ourselves in the GUI Selected Tab
|
||||
@@ -84,12 +94,27 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab)
|
||||
|
||||
def ui_connect(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
pass
|
||||
|
||||
def ui_disconnect(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
pass
|
||||
|
||||
def handleTextChanged(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
# enable = not self.ui.code_editor.document().isEmpty()
|
||||
# self.ui.buttonPrint.setEnabled(enable)
|
||||
# self.ui.buttonPreview.setEnabled(enable)
|
||||
@@ -97,7 +122,22 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
self.buttonSave.setStyleSheet("QPushButton {color: red;}")
|
||||
self.buttonSave.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as_red.png'))
|
||||
|
||||
def insert_gcode(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
pass
|
||||
|
||||
def edit_fcgcode(self, cnc_obj):
|
||||
"""
|
||||
|
||||
:param cnc_obj:
|
||||
:type cnc_obj:
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
assert isinstance(cnc_obj, CNCJobObject)
|
||||
self.gcode_obj = cnc_obj
|
||||
|
||||
@@ -111,6 +151,11 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
self.app.inform.emit('[success] %s...' % _('Loaded Machine Code into Code Editor'))
|
||||
|
||||
def update_fcgcode(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
preamble = str(self.ui.prepend_text.get_value())
|
||||
postamble = str(self.ui.append_text.get_value())
|
||||
my_gcode = self.ui.gcode_editor_tab.code_editor.toPlainText()
|
||||
@@ -120,7 +165,11 @@ class AppGCodeEditor(QtCore.QObject):
|
||||
self.ui.gcode_editor_tab.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as.png'))
|
||||
|
||||
def on_open_gcode(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
_filter_ = "G-Code Files (*.nc);; G-Code Files (*.txt);; G-Code Files (*.tap);; G-Code Files (*.cnc);; " \
|
||||
"All Files (*.*)"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user