mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-28 23:04:34 +08:00
Merge branch 'CURA-6643_f5_to_reload_gcode' of github.com:Ultimaker/Cura
This commit is contained in:
commit
3fa2fefdef
@ -69,6 +69,7 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
|||||||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
||||||
from cura.Scene.CuraSceneController import CuraSceneController
|
from cura.Scene.CuraSceneController import CuraSceneController
|
||||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||||
|
from cura.Scene.GCodeListDecorator import GCodeListDecorator
|
||||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
||||||
from cura.Scene import ZOffsetDecorator
|
from cura.Scene import ZOffsetDecorator
|
||||||
|
|
||||||
@ -1327,7 +1328,13 @@ class CuraApplication(QtApplication):
|
|||||||
Logger.log("i", "Reloading all loaded mesh data.")
|
Logger.log("i", "Reloading all loaded mesh data.")
|
||||||
nodes = []
|
nodes = []
|
||||||
has_merged_nodes = False
|
has_merged_nodes = False
|
||||||
|
gcode_filename = None # type: Optional[str]
|
||||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||||
|
# Objects loaded from Gcode should also be included.
|
||||||
|
gcode_filename = node.callDecoration("getGcodeFileName")
|
||||||
|
if gcode_filename is not None:
|
||||||
|
break
|
||||||
|
|
||||||
if not isinstance(node, CuraSceneNode) or not node.getMeshData():
|
if not isinstance(node, CuraSceneNode) or not node.getMeshData():
|
||||||
if node.getName() == "MergedMesh":
|
if node.getName() == "MergedMesh":
|
||||||
has_merged_nodes = True
|
has_merged_nodes = True
|
||||||
@ -1335,6 +1342,11 @@ class CuraApplication(QtApplication):
|
|||||||
|
|
||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
|
|
||||||
|
# We can open only one gcode file at the same time. If the current view has a gcode file open, just reopen it
|
||||||
|
# for reloading.
|
||||||
|
if gcode_filename:
|
||||||
|
self._openFile(gcode_filename)
|
||||||
|
|
||||||
if not nodes:
|
if not nodes:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
|
|
||||||
class GCodeListDecorator(SceneNodeDecorator):
|
class GCodeListDecorator(SceneNodeDecorator):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._gcode_list = [] # type: List[str]
|
self._gcode_list = [] # type: List[str]
|
||||||
|
self._filename = None # type: Optional[str]
|
||||||
|
|
||||||
|
def getGcodeFileName(self) -> Optional[str]:
|
||||||
|
return self._filename
|
||||||
|
|
||||||
|
def setGcodeFileName(self, filename: str) -> None:
|
||||||
|
self._filename = filename
|
||||||
|
|
||||||
def getGCodeList(self) -> List[str]:
|
def getGCodeList(self) -> List[str]:
|
||||||
return self._gcode_list
|
return self._gcode_list
|
||||||
|
@ -27,6 +27,6 @@ class GCodeGzReader(MeshReader):
|
|||||||
file_data = file.read()
|
file_data = file.read()
|
||||||
uncompressed_gcode = gzip.decompress(file_data).decode("utf-8")
|
uncompressed_gcode = gzip.decompress(file_data).decode("utf-8")
|
||||||
PluginRegistry.getInstance().getPluginObject("GCodeReader").preReadFromStream(uncompressed_gcode)
|
PluginRegistry.getInstance().getPluginObject("GCodeReader").preReadFromStream(uncompressed_gcode)
|
||||||
result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode)
|
result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode, file_name)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
@ -292,7 +292,7 @@ class FlavorParser:
|
|||||||
extruder.getProperty("machine_nozzle_offset_y", "value")]
|
extruder.getProperty("machine_nozzle_offset_y", "value")]
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def processGCodeStream(self, stream: str) -> Optional[CuraSceneNode]:
|
def processGCodeStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
|
||||||
Logger.log("d", "Preparing to load GCode")
|
Logger.log("d", "Preparing to load GCode")
|
||||||
self._cancelled = False
|
self._cancelled = False
|
||||||
# We obtain the filament diameter from the selected extruder to calculate line widths
|
# We obtain the filament diameter from the selected extruder to calculate line widths
|
||||||
@ -453,6 +453,7 @@ class FlavorParser:
|
|||||||
scene_node.addDecorator(decorator)
|
scene_node.addDecorator(decorator)
|
||||||
|
|
||||||
gcode_list_decorator = GCodeListDecorator()
|
gcode_list_decorator = GCodeListDecorator()
|
||||||
|
gcode_list_decorator.setGcodeFileName(filename)
|
||||||
gcode_list_decorator.setGCodeList(gcode_list)
|
gcode_list_decorator.setGCodeList(gcode_list)
|
||||||
scene_node.addDecorator(gcode_list_decorator)
|
scene_node.addDecorator(gcode_list_decorator)
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
from typing import Optional, Union, List, TYPE_CHECKING
|
||||||
|
|
||||||
from UM.FileHandler.FileReader import FileReader
|
from UM.FileHandler.FileReader import FileReader
|
||||||
from UM.Mesh.MeshReader import MeshReader
|
from UM.Mesh.MeshReader import MeshReader
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
@ -9,8 +11,14 @@ from UM.Application import Application
|
|||||||
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
|
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
|
||||||
|
|
||||||
catalog = i18nCatalog("cura")
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
from .FlavorParser import FlavorParser
|
||||||
from . import MarlinFlavorParser, RepRapFlavorParser
|
from . import MarlinFlavorParser, RepRapFlavorParser
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from UM.Scene.SceneNode import SceneNode
|
||||||
|
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||||
|
|
||||||
|
|
||||||
# Class for loading and parsing G-code files
|
# Class for loading and parsing G-code files
|
||||||
class GCodeReader(MeshReader):
|
class GCodeReader(MeshReader):
|
||||||
@ -30,7 +38,7 @@ class GCodeReader(MeshReader):
|
|||||||
)
|
)
|
||||||
self._supported_extensions = [".gcode", ".g"]
|
self._supported_extensions = [".gcode", ".g"]
|
||||||
|
|
||||||
self._flavor_reader = None
|
self._flavor_reader = None # type: Optional[FlavorParser]
|
||||||
|
|
||||||
Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
|
Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
|
||||||
|
|
||||||
@ -54,10 +62,16 @@ class GCodeReader(MeshReader):
|
|||||||
file_data = file.read()
|
file_data = file.read()
|
||||||
return self.preReadFromStream(file_data, args, kwargs)
|
return self.preReadFromStream(file_data, args, kwargs)
|
||||||
|
|
||||||
def readFromStream(self, stream):
|
def readFromStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
|
||||||
return self._flavor_reader.processGCodeStream(stream)
|
if self._flavor_reader is None:
|
||||||
|
return None
|
||||||
|
return self._flavor_reader.processGCodeStream(stream, filename)
|
||||||
|
|
||||||
def _read(self, file_name):
|
def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
|
||||||
with open(file_name, "r", encoding = "utf-8") as file:
|
with open(file_name, "r", encoding = "utf-8") as file:
|
||||||
file_data = file.read()
|
file_data = file.read()
|
||||||
return self.readFromStream(file_data)
|
result = [] # type: List[SceneNode]
|
||||||
|
node = self.readFromStream(file_data, file_name)
|
||||||
|
if node is not None:
|
||||||
|
result.append(node)
|
||||||
|
return result
|
||||||
|
Loading…
x
Reference in New Issue
Block a user