From 089b7d40b53b453674f8ea2c47c68280dd03fa53 Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Mon, 11 Sep 2023 18:24:57 +0100 Subject: [PATCH] [Path] Improve Sanity to generate html output without... (#5) ...the need for dependences. --- src/Mod/Path/CMakeLists.txt | 4 + src/Mod/Path/Path/Main/Gui/Sanity.py | 1052 ++++++++++++++++- src/Mod/Path/Path/Main/Gui/Sanity_Bulb.svg | 637 ++++++++++ src/Mod/Path/Path/Main/Gui/Sanity_Caution.svg | 88 ++ src/Mod/Path/Path/Main/Gui/Sanity_Note.svg | 281 +++++ src/Mod/Path/Path/Main/Gui/Sanity_Warning.svg | 71 ++ 6 files changed, 2108 insertions(+), 25 deletions(-) create mode 100644 src/Mod/Path/Path/Main/Gui/Sanity_Bulb.svg create mode 100644 src/Mod/Path/Path/Main/Gui/Sanity_Caution.svg create mode 100644 src/Mod/Path/Path/Main/Gui/Sanity_Note.svg create mode 100644 src/Mod/Path/Path/Main/Gui/Sanity_Warning.svg diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index 4e00a938d5..f9c0ae30e7 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -95,6 +95,10 @@ SET(PathPythonMainGui_SRCS Path/Main/Gui/JobDlg.py Path/Main/Gui/PreferencesJob.py Path/Main/Gui/Sanity.py + Path/Main/Gui/Sanity_Bulb.svg + Path/Main/Gui/Sanity_Caution.svg + Path/Main/Gui/Sanity_Note.svg + Path/Main/Gui/Sanity_Warning.svg Path/Main/Gui/Simulator.py ) diff --git a/src/Mod/Path/Path/Main/Gui/Sanity.py b/src/Mod/Path/Path/Main/Gui/Sanity.py index f668906c7e..8e7834634d 100644 --- a/src/Mod/Path/Path/Main/Gui/Sanity.py +++ b/src/Mod/Path/Path/Main/Gui/Sanity.py @@ -35,7 +35,9 @@ import Path import Path.Log from collections import Counter from datetime import datetime +import codecs import os +import time import webbrowser import subprocess from PySide.QtCore import QT_TRANSLATE_NOOP @@ -80,7 +82,7 @@ class CommandPathSanity: if "%M" in filepath: pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") M = pref.GetString("MacroPath", FreeCAD.getUserAppDataDir()) - filepath = filepath.replace("%M", M+ os.path.sep) + filepath = filepath.replace("%M", M + os.path.sep) # strip out all substitutions related to output splitting for elem in ["%O", "%W", "%T", "%t", "%S"]: @@ -130,16 +132,33 @@ class CommandPathSanity: def Activated(self): # if everything is ok, execute - self.squawkData = {"items": []} + if FreeCAD.GuiUp: + currentCamera = FreeCADGui.ActiveDocument.ActiveView.getCameraType() + if currentCamera != "Perspective": + FreeCADGui.SendMsgToActiveView("PerspectiveCamera") + FreeCADGui.updateGui() + time.sleep(4) + FreeCAD.Console.PrintLog( + "Path - Sanity - Changing to Perspective Camera temporarily\n" + ) + FreeCADGui.addIconPath(":/icons") + self.squawkData = {"items": []} obj = FreeCADGui.Selection.getSelectionEx()[0].Object self.outputpath = self.resolveOutputPath(obj) Path.Log.debug(f"outputstring: {self.outputpath}") data = self.__summarize(obj) html = self.__report(data) if html is not None: - FreeCAD.Console.PrintMessage("HTML report written to {}".format(html)) webbrowser.open(html) + if FreeCAD.GuiUp: + if currentCamera != "Perspective": + FreeCADGui.SendMsgToActiveView("OrthographicCamera") + FreeCADGui.updateGui() + time.sleep(0.5) + FreeCAD.Console.PrintLog( + "Path - Sanity - Changing back to Orthographic Camera\n" + ) def __makePicture(self, obj, imageName): """ @@ -187,6 +206,983 @@ class CommandPathSanity: """ generates an asciidoc file with the report information """ + Title = translate("Path_Sanity", "Setup Report for FreeCAD Job") + ToC = translate("Path_Sanity", "Table of Contents") + PartInfoHeading = translate("Path_Sanity", "Part Information") + RunSumHeading = translate("Path_Sanity", "Run Summary") + RoughStkHeading = translate("Path_Sanity", "Rough Stock") + ToolDataHeading = translate("Path_Sanity", "Tool Data") + OutputHeading = translate("Path_Sanity", "Output") + FixturesHeading = translate("Path_Sanity", "Fixtures") + SquawksHeading = translate("Path_Sanity", "Squawks") + + PartLabel = translate("Path_Sanity", "Base Object(s)") + SequenceLabel = translate("Path_Sanity", "Job Sequence") + DescriptionLabel = translate("Path_Sanity", "Job Description") + JobTypeLabel = translate("Path_Sanity", "Job Type") + CADLabel = translate("Path_Sanity", "CAD File Name") + LastSaveLabel = translate("Path_Sanity", "Last Save Date") + CustomerLabel = translate("Path_Sanity", "Customer") + DesignerLabel = translate("Path_Sanity", "Designer") + + b = data["baseData"] + d = data["designData"] + jobname = d["JobLabel"] + + opLabel = translate("Path_Sanity", "Operation") + zMinLabel = translate("Path_Sanity", "Minimum Z Height") + zMaxLabel = translate("Path_Sanity", "Maximum Z Height") + cycleTimeLabel = translate("Path_Sanity", "Cycle Time") + + coolantLabel = translate("Path_Sanity", "Coolant") + jobTotalLabel = translate("Path_Sanity", "TOTAL JOB") + d = data["toolData"] + toolLabel = translate("Path_Sanity", "Tool Number") + imageCounter = 1 + reportHtmlTemplate = """ + + + + + + Setup Report for FreeCAD Job: Path Special + + + +

+""" + reportHtmlTemplate += Title + ": " + jobname + reportHtmlTemplate += """ +

+

+
+ +

+

+ +""" + reportHtmlTemplate += ToC + reportHtmlTemplate += """ +

+
+
+

+ + +""" + reportHtmlTemplate += PartInfoHeading + reportHtmlTemplate += """ +

+ +

+
+
+ +

+

+ +""" + reportHtmlTemplate += PartInfoHeading + reportHtmlTemplate += """ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += PartLabel + reportHtmlTemplate += """ +

+
+ + + + """ + d = data["designData"] + for key, val in b["bases"].items(): + reportHtmlTemplate += """ + + + + """ + reportHtmlTemplate += """ +

+ """ + reportHtmlTemplate += key + reportHtmlTemplate += """ +

+

+ """ + reportHtmlTemplate += val + reportHtmlTemplate += """ +

+
+


+ +

+

+ Base Object(s)

+

+ """ + reportHtmlTemplate += SequenceLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["Sequence"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += JobTypeLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["JobType"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += DescriptionLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["JobDescription"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += CADLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["FileName"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += LastSaveLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["LastModifiedDate"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += CustomerLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["Customer"] + reportHtmlTemplate += """

+
""" + + descriptionLabel = translate("Path_Sanity", "Description") + manufLabel = translate("Path_Sanity", "Manufacturer") + partNumberLabel = translate("Path_Sanity", "Part Number") + urlLabel = translate("Path_Sanity", "URL") + inspectionNotesLabel = translate("Path_Sanity", "Inspection Notes") + opLabel = translate("Path_Sanity", "Operation") + tcLabel = translate("Path_Sanity", "Tool Controller") + feedLabel = translate("Path_Sanity", "Feed Rate") + speedLabel = translate("Path_Sanity", "Spindle Speed") + shapeLabel = translate("Path_Sanity", "Tool Shape") + diameterLabel = translate("Path_Sanity", "Tool Diameter") + + xDimLabel = translate("Path_Sanity", "X Size") + yDimLabel = translate("Path_Sanity", "Y Size") + zDimLabel = translate("Path_Sanity", "Z Size") + materialLabel = translate("Path_Sanity", "Material") + + offsetsLabel = translate("Path_Sanity", "Work Offsets") + orderByLabel = translate("Path_Sanity", "Order By") + datumLabel = translate("Path_Sanity", "Part Datum") + + gcodeFileLabel = translate("Path_Sanity", "G-code File") + lastpostLabel = translate("Path_Sanity", "Last Post Process Date") + stopsLabel = translate("Path_Sanity", "Stops") + programmerLabel = translate("Path_Sanity", "Programmer") + machineLabel = translate("Path_Sanity", "Machine") + postLabel = translate("Path_Sanity", "Postprocessor") + flagsLabel = translate("Path_Sanity", "Post Processor Flags") + fileSizeLabel = translate("Path_Sanity", "File Size (kB)") + lineCountLabel = translate("Path_Sanity", "Line Count") + + noteLabel = translate("Path_Sanity", "Note") + operatorLabel = translate("Path_Sanity", "Operator") + dateLabel = translate("Path_Sanity", "Date") + + d = data["runData"] + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += RunSumHeading + reportHtmlTemplate += """ +

""" + for i in d["items"]: + reportHtmlTemplate += """ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += opLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += zMinLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += zMaxLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += coolantLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += cycleTimeLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["opName"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["minZ"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["maxZ"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["coolantMode"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["cycleTime"] + reportHtmlTemplate += """ +

+
""" + d = data["stockData"] + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += RoughStkHeading + reportHtmlTemplate += """ +

+ + + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += materialLabel + reportHtmlTemplate += """ +

+

+ """ + reportHtmlTemplate += d["material"] + "

" + reportHtmlTemplate += """ +

+ stock" + imageCounter += 1 + reportHtmlTemplate += """ +

+

+ """ + reportHtmlTemplate += xDimLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["xLen"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += yDimLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["yLen"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += zDimLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["zLen"] + reportHtmlTemplate += """

+
""" + d = data["toolData"] + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += ToolDataHeading + reportHtmlTemplate += """ +

""" + for key, value in d.items(): + reportHtmlTemplate += """ +

" + reportHtmlTemplate += """ + +""" + reportHtmlTemplate += toolLabel + ": T" + key + reportHtmlTemplate += """

""" + reportHtmlTemplate += """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += descriptionLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["description"] + reportHtmlTemplate += """ +

+

+ 2" + ) + reportHtmlTemplate += """ +

+

+ """ + reportHtmlTemplate += manufLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["manufacturer"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += partNumberLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["partNumber"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += urlLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["url"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += shapeLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["shape"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += inspectionNotesLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["inspectionNotes"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += diameterLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += value["diameter"] + imageCounter += 1 + reportHtmlTemplate += """

+
""" + for o in value["ops"]: + reportHtmlTemplate += """ + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += opLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += tcLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += feedLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += speedLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += o["Operation"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += o["ToolController"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += o["Feed"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += o["Speed"] + reportHtmlTemplate += """

+
""" + d = data["outputData"] + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += OutputHeading + " (Gcode)" + reportHtmlTemplate += """ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += gcodeFileLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["lastgcodefile"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += lastpostLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["lastpostprocess"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += stopsLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["optionalstops"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += programmerLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["programmer"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += machineLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["machine"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += postLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["postprocessor"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += flagsLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["postprocessorFlags"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += fileSizeLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["filesize"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += lineCountLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["linecount"] + reportHtmlTemplate += """

+
""" + d = data["fixtureData"] + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += FixturesHeading + reportHtmlTemplate += """ +

+ + + + + + + + + + + + + + + + + +

+ """ + reportHtmlTemplate += offsetsLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["fixtures"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += orderByLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += d["orderBy"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += datumLabel + reportHtmlTemplate += """

+

+ origin t

+
""" + d = data["squawkData"] + TIPIcon = FreeCAD.getHomePath() + "Mod/Path/Path/Main/Gui/Sanity_Bulb.svg" + NOTEIcon = FreeCAD.getHomePath() + "Mod/Path/Path/Main/Gui/Sanity_Note.svg" + WARNINGIcon = ( + FreeCAD.getHomePath() + "Mod/Path/Path/Main/Gui/Sanity_Warning.svg" + ) + CAUTIONIcon = FreeCAD.getHomePath() + "Mod/Path/Path/Main/Gui/Sanity_Stop.svg" + + reportHtmlTemplate += """ +

+ +""" + reportHtmlTemplate += SquawksHeading + reportHtmlTemplate += """ +

+ + + + + + + + + + + + """ + for i in d["items"]: + reportHtmlTemplate += """ + + + + + """ + reportHtmlTemplate += """ +

+ """ + reportHtmlTemplate += noteLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += operatorLabel + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += dateLabel + reportHtmlTemplate += """

+
+ + + + +

+ """ + if str(i["squawkType"]) == "TIP": + reportHtmlTemplate += ( + "TIP" + + "

" + + str(i["Note"]) + ) + if str(i["squawkType"]) == "NOTE": + reportHtmlTemplate += ( + "NOTE" + + "

" + + str(i["Note"]) + ) + if str(i["squawkType"]) == "WARNING": + reportHtmlTemplate += ( + "WARNING" + + "

" + + str(i["Note"]) + ) + if str(i["squawkType"]) == "CAUTION": + reportHtmlTemplate += ( + "CAUTION" + + "

" + + str(i["Note"]) + ) + imageCounter += 1 + reportHtmlTemplate += """

+
+

+ """ + reportHtmlTemplate += i["Operator"] + reportHtmlTemplate += """

+

+ """ + reportHtmlTemplate += i["Date"] + reportHtmlTemplate += """

+
+


+ +

+ + +""" reportTemplate = """ = Setup Report for FreeCAD Job: {jobname} @@ -470,23 +1466,18 @@ class CommandPathSanity: reportraw = self.outputpath + data["outputData"]["outputfilename"] + ".asciidoc" reporthtml = self.outputpath + data["outputData"]["outputfilename"] + ".html" - with open(reportraw, "w") as fd: + # Python 3.11 aware + with codecs.open(reportraw, encoding="utf-8", mode="w") as fd: fd.write(report) fd.close() FreeCAD.Console.PrintMessage( "asciidoc file written to {}\n".format(reportraw) ) - try: - result = subprocess.run(["asciidoctor", reportraw, "-o", reporthtml]) - if str(result) == "32512": - msg = "asciidoctor not found. html cannot be generated." - QtGui.QMessageBox.information(None, "Path Sanity", msg) - FreeCAD.Console.PrintMessage(msg) - reporthtml = None - - except Exception as e: - FreeCAD.Console.PrintError(e) + with codecs.open(reporthtml, encoding="utf-8", mode="w") as fd: + fd.write(reportHtmlTemplate) + fd.close() + FreeCAD.Console.PrintMessage("html file written to {}\n".format(reporthtml)) return reporthtml @@ -594,10 +1585,11 @@ class CommandPathSanity: if not hasattr(TC.Tool, "BitBody"): self.squawk( "PathSanity", - "Tool number {} is a legacy tool. Legacy tools not \ - supported by Path-Sanity".format( - TC.ToolNumber - ), + translate( + "Path_Sanity", + "Tool number {} is a legacy tool. Legacy tools not \ + supported by Path-Sanity", + ).format(TC.ToolNumber), squawkType="WARNING", ) continue # skip old-style tools @@ -606,7 +1598,9 @@ class CommandPathSanity: if bitshape not in ["", TC.Tool.BitShape]: self.squawk( "PathSanity", - "Tool number {} used by multiple tools".format(TC.ToolNumber), + translate( + "Path_Sanity", "Tool number {} used by multiple tools" + ).format(TC.ToolNumber), squawkType="CAUTION", ) tooldata["bitShape"] = TC.Tool.BitShape @@ -632,7 +1626,9 @@ class CommandPathSanity: if TC.SpindleSpeed == 0.0: self.squawk( "PathSanity", - "Tool Controller '{}' has no spindlespeed".format(TC.Label), + translate( + "Path_Sanity", "Tool Controller '{}' has no spindlespeed" + ).format(TC.Label), squawkType="WARNING", ) @@ -658,7 +1654,9 @@ class CommandPathSanity: tooldata.setdefault("ops", []) self.squawk( "PathSanity", - "Tool Controller '{}' is not used".format(TC.Label), + translate( + "Path_Sanity", "Tool Controller '{}' is not used" + ).format(TC.Label), squawkType="WARNING", ) @@ -688,7 +1686,6 @@ class CommandPathSanity: data["items"] = [] for op in obj.Operations.Group: - oplabel = op.Label ctime = op.CycleTime if hasattr(op, "CycleTime") else 0.0 cool = op.CoolantMode if hasattr(op, "CoolantMode") else "N/A" @@ -754,7 +1751,7 @@ class CommandPathSanity: if data["material"] == "Not Specified": self.squawk( "PathSanity", - "Consider Specifying the Stock Material", + translate("Path_Sanity", "Consider Specifying the Stock Material"), squawkType="TIP", ) @@ -843,9 +1840,14 @@ class CommandPathSanity: if obj.LastPostProcessOutput == "": data["filesize"] = str(0.0) data["linecount"] = str(0) - self.squawk("PathSanity", "The Job has not been post-processed") + self.squawk( + "PathSanity", + translate("Path_Sanity", "The Job has not been post-processed"), + ) else: - data["filesize"] = str(os.path.getsize(obj.LastPostProcessOutput)/1000) + data["filesize"] = str( + os.path.getsize(obj.LastPostProcessOutput) / 1000 + ) data["linecount"] = str( sum(1 for line in open(obj.LastPostProcessOutput)) ) diff --git a/src/Mod/Path/Path/Main/Gui/Sanity_Bulb.svg b/src/Mod/Path/Path/Main/Gui/Sanity_Bulb.svg new file mode 100644 index 0000000000..91b398732d --- /dev/null +++ b/src/Mod/Path/Path/Main/Gui/Sanity_Bulb.svg @@ -0,0 +1,637 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + + media + stop + playback + video + music + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Path/Main/Gui/Sanity_Caution.svg b/src/Mod/Path/Path/Main/Gui/Sanity_Caution.svg new file mode 100644 index 0000000000..c649464d32 --- /dev/null +++ b/src/Mod/Path/Path/Main/Gui/Sanity_Caution.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + image/svg+xml + + Path_Stop + 2015-07-04 + http://www.freecad.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path_Stop.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + diff --git a/src/Mod/Path/Path/Main/Gui/Sanity_Note.svg b/src/Mod/Path/Path/Main/Gui/Sanity_Note.svg new file mode 100644 index 0000000000..41944e532f --- /dev/null +++ b/src/Mod/Path/Path/Main/Gui/Sanity_Note.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + 2005-10-15 + + + Andreas Nilsson + + + + + edit + copy + + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Path/Main/Gui/Sanity_Warning.svg b/src/Mod/Path/Path/Main/Gui/Sanity_Warning.svg new file mode 100644 index 0000000000..866c61a732 --- /dev/null +++ b/src/Mod/Path/Path/Main/Gui/Sanity_Warning.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + +