diff options
author | pravindalve | 2020-06-10 17:22:06 +0530 |
---|---|---|
committer | GitHub | 2020-06-10 17:22:06 +0530 |
commit | fd3ff2c037805a6539a9044bd9d26c3400768be8 (patch) | |
tree | e39adff23664647035bdf9c12357b820ed204065 | |
parent | 0d33ceda3262494437fe022466e4368db62c8849 (diff) | |
parent | 48549adea85f9dd08da71b4e4dd310858a391e22 (diff) | |
download | Chemical-PFD-fd3ff2c037805a6539a9044bd9d26c3400768be8.tar.gz Chemical-PFD-fd3ff2c037805a6539a9044bd9d26c3400768be8.tar.bz2 Chemical-PFD-fd3ff2c037805a6539a9044bd9d26c3400768be8.zip |
Merge pull request #12 from Blakeinstein/master
Implement saving + implement svg files
25 files changed, 609 insertions, 1229 deletions
@@ -2,5 +2,5 @@ src/main/python/experimental/* *.pfd .vscode -.vscode/*.json -src/main/resources/base/toolbar/*.png +.vscode/*.jsons +.idea/*
\ No newline at end of file diff --git a/src/main/python/shapes/__init__.py b/src/main/python/shapes/__init__.py index af92a6a..536caf6 100644 --- a/src/main/python/shapes/__init__.py +++ b/src/main/python/shapes/__init__.py @@ -1,4 +1,4 @@ from .shapes import * -# from .line import * +from .line import LineLabel from PyQt5.QtWidgets import * dir()
\ No newline at end of file diff --git a/src/main/python/shapes/line.py b/src/main/python/shapes/line.py index 92c5b1d..466e22b 100644 --- a/src/main/python/shapes/line.py +++ b/src/main/python/shapes/line.py @@ -259,6 +259,19 @@ class LineLabel(QGraphicsTextItem): def focusOutEvent(self, event): super(LineLabel, self).focusOutEvent(event) self.setTextInteractionFlags(Qt.NoTextInteraction) + + def __getstate__(self): + return { + "text": self.toPlainText(), + "index": self.index, + "gap": self.gap, + "pos": (self.pos().x(), self.pos().y()) + } + + def __setstate__(self, dict): + self.setPlainText(dict['text']) + self.index = dict['index'] + self.gap = dict['gap'] def findIndex(line, pos): @@ -919,8 +932,13 @@ class Line(QGraphicsPathItem): "_classname_": self.__class__.__name__, "startPoint": (self.startPoint.x(), self.startPoint.y()), "endPoint": (self.endPoint.x(), self.endPoint.y()), - "points": [(point.x(), point.y()) for point in self.points] + "points": [(point.x(), point.y()) for point in self.points], + "startGripItem": hex(id(self.startGripItem)), + "endGripItem": hex(id(self.endGripItem)) if self.endGripItem else 0, + "refLine": hex(id(self.refLine)) if self.refLine else 0, + "refIndex": self.refIndex, + "label": [i for i in self.label], + "id": hex(id(self)) } - def __setstate__(self, dict): self.points = [QPointF(x, y) for x, y in dict["points"]] diff --git a/src/main/python/shapes/shapes.py b/src/main/python/shapes/shapes.py index 0358898..b825653 100644 --- a/src/main/python/shapes/shapes.py +++ b/src/main/python/shapes/shapes.py @@ -12,7 +12,6 @@ from PyQt5.QtWidgets import (QGraphicsColorizeEffect, QGraphicsEllipseItem, from .line import Line, findIndex from utils.app import fileImporter -from utils.app import fileImporter class ItemLabel(QGraphicsTextItem): def __init__(self, pos, parent=None): @@ -33,7 +32,16 @@ class ItemLabel(QGraphicsTextItem): def focusOutEvent(self, event): super(ItemLabel, self).focusOutEvent(event) self.setTextInteractionFlags(Qt.NoTextInteraction) + + def __getstate__(self): + return { + "text": self.toPlainText(), + "pos": (self.pos().x(), self.pos().y()) + } + def __setstate__(self, dict): + self.setPlainText(dict['text']) + self.setPos(*dict['pos']) class GripItem(QGraphicsPathItem): """ @@ -318,16 +326,13 @@ class NodeItem(QGraphicsSvgItem): Extends PyQt5's QGraphicsSvgItem to create the basic structure of shapes with given unit operation type """ # set a common renderer for all svg - renderer = QSvgRenderer(fileImporter(f'svg/ellipse.svg')) + # renderer = QSvgRenderer(fileImporter(f'svg/ellipse.svg')) def __init__(self, unitOperationType=None, parent=None): QGraphicsSvgItem.__init__(self, parent) self.m_type = str(unitOperationType) self.id = None - # self.m_renderer = QSvgRenderer("svg/" + unitOperationType + ".svg") - # self.m_renderer = QSvgRenderer(fileImporter(f'svg/{unitOperationType}.svg')) - self.m_renderer = QSvgRenderer(fileImporter(f'svg/ellipse.svg')) - # self.m_renderer = QSvgRenderer(resourceManager.get_resource(f'toolbar/{unitOperationType}.svg')) + self.m_renderer = QSvgRenderer(fileImporter(f'{unitOperationType}.svg')) self.setSharedRenderer(self.m_renderer) # set initial size of item self.width = 100 @@ -498,7 +503,9 @@ class NodeItem(QGraphicsSvgItem): "_classname_": self.__class__.__name__, "width": self.width, "height": self.height, - "pos": (self.pos().x(), self.pos().y()) + "pos": (self.pos().x(), self.pos().y()), + "lineGripItems": [(hex(id(i)), i.m_index) for i in self.lineGripItems], + "label": self.label } def __setstate__(self, dict): @@ -506,287 +513,5 @@ class NodeItem(QGraphicsSvgItem): self.width = dict['width'] self.height = dict['height'] self.rect = QRectF(-self.width / 2, -self.height / 2, self.width, self.height) - transform = QTransform() - transform.translate(self.width / 2, self.height / 2) - self.setTransform(transform, True) self.updateSizeGripItem() - -# classes of pfd-symbols -class AirBlownCooler(NodeItem): - def __init__(self): - super(AirBlownCooler, self).__init__("AirBlownCooler", parent=None) - - -class Bag(NodeItem): - def __init__(self): - super(Bag, self).__init__("Bag", parent=None) - - -class Boiler(NodeItem): - def __init__(self): - super(Boiler, self).__init__("Boiler", parent=None) - - -class Breaker(NodeItem): - def __init__(self): - super(Breaker, self).__init__("Breaker", parent=None) - - -class BriquettingMachine(NodeItem): - def __init__(self): - super(BriquettingMachine, self).__init__("BriquettingMachine", parent=None) - - -class Centrifugal(NodeItem): - def __init__(self): - super(Centrifugal, self).__init__("Centrifugal", parent=None) - - -class CentrifugalCompressor(NodeItem): - def __init__(self): - super(CentrifugalCompressor, self).__init__("CentrifugalCompressor", parent=None) - - -class Centrifugalpump(NodeItem): - def __init__(self): - super(Centrifugalpump, self).__init__("Centrifugalpump", parent=None) - - -class CentrifugalPump2(NodeItem): - def __init__(self): - super(CentrifugalPump2, self).__init__("CentrifugalPump2", parent=None) - - -class CentrifugalPump3(NodeItem): - def __init__(self): - super(CentrifugalPump3, self).__init__("CentrifugalPump3", parent=None) - - -class Column(NodeItem): - def __init__(self): - super(Column, self).__init__("Column", parent=None) - - -class Compressor(NodeItem): - def __init__(self): - super(Compressor, self).__init__("Compressor", parent=None) - - -class CompressorSilencers(NodeItem): - def __init__(self): - super(CompressorSilencers, self).__init__("CompressorSilencers", parent=None) - - -class Condenser(NodeItem): - def __init__(self): - super(Condenser, self).__init__("Condenser", parent=None) - - -class Cooler(NodeItem): - def __init__(self): - super(Cooler, self).__init__("Cooler", parent=None) - - -class CoolingTower3(NodeItem): - def __init__(self): - super(CoolingTower3, self).__init__("CoolingTower3", parent=None) - - -class CoolingTwoer2(NodeItem): - def __init__(self): - super(CoolingTwoer2, self).__init__("CoolingTwoer2", parent=None) - - -class Crusher(NodeItem): - def __init__(self): - super(Crusher, self).__init__("Crusher", parent=None) - - -class DoublePipeHeat(NodeItem): - def __init__(self): - super(DoublePipeHeat, self).__init__("DoublePipeHeat", parent=None) - - -class ExtractorHood(NodeItem): - def __init__(self): - super(ExtractorHood, self).__init__("ExtractorHood", parent=None) - - -class FiredHeater(NodeItem): - def __init__(self): - super(FiredHeater, self).__init__("FiredHeater", parent=None) - - -class ForcedDraftCooling(NodeItem): - def __init__(self): - super(ForcedDraftCooling, self).__init__("ForcedDraftCooling", parent=None) - - -class Furnace(NodeItem): - def __init__(self): - super(Furnace, self).__init__("Furnace", parent=None) - - -class GasBottle(NodeItem): - def __init__(self): - super(GasBottle, self).__init__("GasBottle", parent=None) - - -class HalfPipeMixingVessel(NodeItem): - def __init__(self): - super(HalfPipeMixingVessel, self).__init__("HalfPipeMixingVessel", parent=None) - - -class Heater(NodeItem): - def __init__(self): - super(Heater, self).__init__("Heater", parent=None) - - -class HeatExchanger(NodeItem): - def __init__(self): - super(HeatExchanger, self).__init__("HeatExchanger", parent=None) - - -class HeatExchanger2(NodeItem): - def __init__(self): - super(HeatExchanger2, self).__init__("HeatExchanger2", parent=None) - - -class HorizontalVessel(NodeItem): - def __init__(self): - super(HorizontalVessel, self).__init__("HorizontalVessel", parent=None) - - -class InducedDraftCooling(NodeItem): - def __init__(self): - super(InducedDraftCooling, self).__init__("InducedDraftCooling", parent=None) - - -class JacketedMixingVessel(NodeItem): - def __init__(self): - super(JacketedMixingVessel, self).__init__("JacketedMixingVessel", parent=None) - - -class LiquidRingCompressor(NodeItem): - def __init__(self): - super(LiquidRingCompressor, self).__init__("LiquidRingCompressor", parent=None) - - -class Mixing(NodeItem): - def __init__(self): - super(Mixing, self).__init__("Mixing", parent=None) - - -class MixingReactor(NodeItem): - def __init__(self): - super(MixingReactor, self).__init__("MixingReactor", parent=None) - - -class OilBurner(NodeItem): - def __init__(self): - super(OilBurner, self).__init__("OilBurner", parent=None) - - -class OpenTank(NodeItem): - def __init__(self): - super(OpenTank, self).__init__("OpenTank", parent=None) - - -class ProportionalPump(NodeItem): - def __init__(self): - super(ProportionalPump, self).__init__("ProportionalPump", parent=None) - - -class Pump(NodeItem): - def __init__(self): - super(Pump, self).__init__("Pump", parent=None) - - -class Pump2(NodeItem): - def __init__(self): - super(Pump2, self).__init__("Pump2", parent=None) - - -class ReboilerHeatExchange(NodeItem): - def __init__(self): - super(ReboilerHeatExchange, self).__init__("ReboilerHeatExchange", parent=None) - - -class ReciprocatingCompressor(NodeItem): - def __init__(self): - super(ReciprocatingCompressor, self).__init__("ReciprocatingCompressor", parent=None) - - -class RotaryCompresor(NodeItem): - def __init__(self): - super(RotaryCompresor, self).__init__("RotaryCompresor", parent=None) - - -class RotaryGearPump(NodeItem): - def __init__(self): - super(RotaryGearPump, self).__init__("RotaryGearPump", parent=None) - - -class ScrewPump(NodeItem): - def __init__(self): - super(ScrewPump, self).__init__("ScrewPump", parent=None) - - -class SelectableCompressor(NodeItem): - def __init__(self): - super(SelectableCompressor, self).__init__("SelectableCompressor", parent=None) - - -class SelectableFan(NodeItem): - def __init__(self): - super(SelectableFan, self).__init__("SelectableFan", parent=None) - - -class SinglePassHeat(NodeItem): - def __init__(self): - super(SinglePassHeat, self).__init__("SinglePassHeat", parent=None) - - -class SpiralHeatExchanger(NodeItem): - def __init__(self): - super(SpiralHeatExchanger, self).__init__("SpiralHeatExchanger", parent=None) - - -class StraightTubersHeat(NodeItem): - def __init__(self): - super(StraightTubersHeat, self).__init__("StraightTubersHeat", parent=None) - - -class Tank(NodeItem): - def __init__(self): - super(Tank, self).__init__("Tank", parent=None) - - -class TurbinePump(NodeItem): - def __init__(self): - super(TurbinePump, self).__init__("TurbinePump", parent=None) - - -class UTubeHeatExchanger(NodeItem): - def __init__(self): - super(UTubeHeatExchanger, self).__init__("UTubeHeatExchanger", parent=None) - - -class VaccumPump(NodeItem): - def __init__(self): - super(VaccumPump, self).__init__("VaccumPump", parent=None) - - -class VerticalPump(NodeItem): - def __init__(self): - super(VerticalPump, self).__init__("VerticalPump", parent=None) - - -class VerticalVessel(NodeItem): - def __init__(self): - super(VerticalVessel, self).__init__("VerticalVessel", parent=None) - - -class WastewaterTreatment(NodeItem): - def __init__(self): - super(WastewaterTreatment, self).__init__("WastewaterTreatment", parent=None) +
\ No newline at end of file diff --git a/src/main/python/utils/app.py b/src/main/python/utils/app.py index 5d85cb7..9812fda 100644 --- a/src/main/python/utils/app.py +++ b/src/main/python/utils/app.py @@ -8,6 +8,7 @@ from json import JSONEncoder, dumps, loads, dump, load app = ApplicationContext() settings = QSettings(QSettings.IniFormat, QSettings.UserScope ,"FOSSEE", "Chemical-PFD") +version = app.build_settings['version'] def fileImporter(file): # Helper function to fetch files from src/main/resources @@ -49,4 +50,7 @@ class JSON_Typer(JSONEncoder): return JSON_Encoder._encode(obj) def encode(self, obj): - return super(JSON_Typer, self).encode(self._encode(obj))
\ No newline at end of file + return super(JSON_Typer, self).encode(self._encode(obj)) + +shapeGrips = {} +lines = {}
\ No newline at end of file diff --git a/src/main/python/utils/canvas.py b/src/main/python/utils/canvas.py index a83aeb2..3f9cee5 100644 --- a/src/main/python/utils/canvas.py +++ b/src/main/python/utils/canvas.py @@ -6,7 +6,7 @@ from PyQt5.QtWidgets import (QFileDialog, QApplication, QHBoxLayout, QMenu, from . import dialogs from .graphics import customView, customScene from .data import paperSizes, ppiList, sheetDimensionList -from .app import dumps, loads, JSON_Typer +from .app import shapeGrips, lines import shapes @@ -129,9 +129,7 @@ class canvas(QWidget): "canvasSize": self._canvasSize, "ObjectName": self.objectName(), "symbols": [i for i in self.painter.items() if isinstance(i, shapes.NodeItem)], - "lines": [i for i in self.painter.items() if isinstance(i, shapes.Line)], - # "lineLabels": [i.__getstate__() for i in self.painter.items() if isinstance(i, shapes.LineLabel)], - # "itemLabels": [i.__getstate__() for i in self.painter.items() if isinstance(i, shapes.itemLabel)] + "lines": sorted([i for i in self.painter.items() if isinstance(i, shapes.Line)], key = lambda x: 1 if x.refLine else 0) } def __setstate__(self, dict): @@ -144,17 +142,43 @@ class canvas(QWidget): graphic.__setstate__(dict = item) self.painter.addItem(graphic) graphic.setPos(*item['pos']) + graphic.updateLineGripItem() + graphic.updateSizeGripItem() + for gripitem in item['lineGripItems']: + shapeGrips[gripitem[0]] = (graphic, gripitem[1]) + if item['label']: + graphicLabel = shapes.ItemLabel(pos = QPointF(*item['label']['pos']), parent = graphic) + graphicLabel.__setstate__(item['label']) + self.painter.addItem(graphicLabel) for item in dict['lines']: line = shapes.Line(QPointF(*item['startPoint']), QPointF(*item['endPoint'])) + lines[item['id']] = line line.__setstate__(dict = item) self.painter.addItem(line) - + graphic, index = shapeGrips[item['startGripItem']] + line.startGripItem = graphic.lineGripItems[index] + graphic.lineGripItems[index].line = line + if item['endGripItem']: + graphic, index = shapeGrips[item['endGripItem']] + line.endGripItem = graphic.lineGripItems[index] + graphic.lineGripItems[index].line = line + else: + line.refLine = lines[item['refLine']] + lines[item['refLine']].midLines.append(line) + line.refIndex = item['refIndex'] + for label in item['label']: + labelItem = shapes.LineLabel(QPointF(*label['pos']), line) + line.label.append(labelItem) + labelItem.__setstate__(label) + self.painter.addItem(labelItem) + line.updateLine() + line.addGrabber() + + shapeGrips.clear() + lines.clear() self.painter.advance() - # for item in dict['lineLabels']: - # pass - # for item in dict['itemLabels']: - # pass +
\ No newline at end of file diff --git a/src/main/python/utils/fileWindow.py b/src/main/python/utils/fileWindow.py index 04ed81a..663a7f3 100644 --- a/src/main/python/utils/fileWindow.py +++ b/src/main/python/utils/fileWindow.py @@ -3,13 +3,13 @@ from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import (QFileDialog, QHBoxLayout, QMdiSubWindow, QMenu, QPushButton, QSizePolicy, QSplitter, QWidget, QStyle) - +from os import path from . import dialogs from .graphics import customView from .canvas import canvas from .tabs import customTabWidget from .undo import resizeCommand -from .app import dump, loads, JSON_Typer +from .app import dump, loads, JSON_Typer, version class fileWindow(QMdiSubWindow): @@ -221,6 +221,8 @@ class fileWindow(QMdiSubWindow): # called by dialog.saveEvent, saves the current file name = QFileDialog.getSaveFileName(self, 'Save File', f'New Diagram', 'Process Flow Diagram (*.pfd)') if not name else name if name[0]: + self.setObjectName(path.basename(name[0]).split(".")[0]) + self.setWindowTitle(self.objectName()) with open(name[0],'w') as file: dump(self, file, indent=4, cls=JSON_Typer) return True @@ -241,13 +243,14 @@ class fileWindow(QMdiSubWindow): def __getstate__(self) -> dict: return { "_classname_": self.__class__.__name__, + "version": version, "ObjectName": self.objectName(), "tabs": [i.__getstate__() for i in self.tabList] } def __setstate__(self, dict): - self.setObjectName = dict['ObjectName'] - self.setWindowTitle = dict['ObjectName'] + self.setObjectName(dict['ObjectName']) + self.setWindowTitle(dict['ObjectName']) for i in dict['tabs']: diagram = self.newDiagram(i['ObjectName']) diagram.__setstate__(i) diff --git a/src/main/python/utils/tabs.py b/src/main/python/utils/tabs.py index eab056a..5196557 100644 --- a/src/main/python/utils/tabs.py +++ b/src/main/python/utils/tabs.py @@ -1,11 +1,12 @@ -from PyQt5.QtWidgets import QTabBar, QPushButton, QTabWidget -from PyQt5.QtCore import pyqtSignal, QSize +from PyQt5.QtWidgets import QTabBar, QPushButton, QTabWidget, QInputDialog +from PyQt5.QtCore import pyqtSignal, QSize, Qt class tabBarPlus(QTabBar): """ Just implemented to overload resize and layout change to emit a signal """ layoutChanged = pyqtSignal() + nameChanged = pyqtSignal(int, str) def resizeEvent(self, event): super().resizeEvent(event) self.layoutChanged.emit() @@ -14,7 +15,17 @@ class tabBarPlus(QTabBar): super().tabLayoutChange() self.layoutChanged.emit() - + def mouseDoubleClickEvent(self, event): + if event.button() != Qt.LeftButton: + return super().mouseDoubleClickEvent() + index = self.currentIndex() + newName, bool = QInputDialog.getText(self, "Change Diagram Name", "Enter new name", + text = self.tabText(index)) + if bool: + self.setTabText(index, newName) + self.nameChanged.emit(index, newName) + + class customTabWidget(QTabWidget): """ QTabWidget with a new tab button, also catches layoutChange signal by @@ -50,6 +61,7 @@ class customTabWidget(QTabWidget): self.tab.layoutChanged.connect(self.movePlusButton) #connect layout change # to dynamically move the button. + self.tab.nameChanged.connect(self.changeWidgetName) #set custom stylesheet for the widget area self.setStyleSheet("""QTabWidget::pane { @@ -68,4 +80,7 @@ class customTabWidget(QTabWidget): if size > w: #if all the tabs do not overflow the tab bar, add at the end self.plusButton.move(w-self.plusButton.width(), h) else: - self.plusButton.move(size-3, h)
\ No newline at end of file + self.plusButton.move(size-3, h) + + def changeWidgetName(self, index, newName): + self.widget(index).setObjectName(newName)
\ No newline at end of file diff --git a/src/main/python/utils/toolbar.py b/src/main/python/utils/toolbar.py index af6feae..7883136 100644 --- a/src/main/python/utils/toolbar.py +++ b/src/main/python/utils/toolbar.py @@ -20,6 +20,7 @@ class toolbar(QDockWidget): def __init__(self, parent = None): super(toolbar, self).__init__(parent) self.toolbarButtonDict = dict() #initializes empty dict to store toolbar buttons + self.toolbarButtonClassList = [] self.toolbarItems(toolbarItems.keys()) #creates all necessary buttons self.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) @@ -59,8 +60,9 @@ class toolbar(QDockWidget): def populateToolbar(self, list): #called everytime the button box needs to be updated(incase of a filter) self.clearLayout() #clears layout - for item in list: - self.diagAreaLayout.addWidget(self.toolbarButtonDict[item]) + for itemClass in list: + for item in self.toolbarButtonDict[itemClass].keys(): + self.diagAreaLayout.addWidget(self.toolbarButtonDict[itemClass][item]) self.resize() def searchQuery(self): @@ -86,13 +88,16 @@ class toolbar(QDockWidget): self.diagAreaWidget.setLayout(self.diagAreaLayout) self.diagArea.setWidget(self.diagAreaWidget) - def toolbarItems(self, items): + def toolbarItems(self, itemClasses): #helper functions to create required buttons - for item in items: - obj = toolbarItems[item] - button = toolbarButton(self, obj) - button.clicked.connect(lambda : self.toolbuttonClicked.emit(obj)) - self.toolbarButtonDict[item] = button + for itemClass in itemClasses: + self.toolbarButtonDict[itemClass] = {} + self.toolbarButtonClassList.append(itemClass) + for item in toolbarItems[itemClass].keys(): + obj = toolbarItems[itemClass][item] + button = toolbarButton(self, obj) + button.clicked.connect(lambda : self.toolbuttonClicked.emit(obj)) + self.toolbarButtonDict[itemClass][item] = button @property def toolbarItemList(self): diff --git a/src/main/python/utils/undo.py b/src/main/python/utils/undo.py index 7979bf3..b060550 100644 --- a/src/main/python/utils/undo.py +++ b/src/main/python/utils/undo.py @@ -31,12 +31,13 @@ class addCommand(QUndoCommand): def undo(self): self.scene.removeItem(self.diagramItem) self.scene.update() + self.scene.advance() def redo(self): self.scene.addItem(self.diagramItem) self.diagramItem.setPos(self.itemPos) self.scene.clearSelection() - self.scene.update() + self.scene.advance() class deleteCommand(QUndoCommand): """ diff --git a/src/main/resources/base/config/items.json b/src/main/resources/base/config/items.json index 3fbc55b..fff7505 100644 --- a/src/main/resources/base/config/items.json +++ b/src/main/resources/base/config/items.json @@ -1,902 +1,48 @@ { - "Ellipse": { - "name": "Ellipse", - "icon": "ellipse.png", - "object": "QGraphicsEllipseItem", - "args": [20, 20, 300, 300] - }, - "airBlownCooler": { - "name": "Air blown cooler", - "icon": "AirBlownCooler.png", - "object": "NodeItem", - "args": ["airBlownCooler"] - }, - "alkylation": { - "name": "Alkylation", - "icon": "Alkylation.png", - "object": "NodeItem", - "args": ["alkylation"] - }, - "automaticStroker": { - "name": "Automatic stroker", - "icon": "AutomaticStroker.png", - "object": "NodeItem", - "args": ["automaticStroker"] - }, - "axialCompressor": { - "name": "Axial compressor", - "icon": "AxialCompressor.png", - "object": "NodeItem", - "args": ["axialCompressor"] - }, - "axialFlowFan": { - "name": "Axial flow fan", - "icon": "AxialFlowFan.png", - "object": "NodeItem", - "args": ["axialFlowFan"] - }, - "bag": { - "name": "Bag", - "icon": "Bag.png", - "object": "NodeItem", - "args": ["bag"] - }, - "boiler": { - "name": "Boiler", - "icon": "Boiler.png", - "object": "NodeItem", - "args": ["boiler"] - }, - "boomLoader": { - "name": "Boom loader", - "icon": "BoomLoader.png", - "object": "NodeItem", - "args": ["boomLoader"] - }, - "breaker": { - "name": "Breaker", - "icon": "Breaker.png", - "object": "NodeItem", - "args": ["breaker"] - }, - "briquettingMachine": { - "name": "Briquetting machine", - "icon": "BriquettingMachine.png", - "object": "NodeItem", - "args": ["briquettingMachine"] - }, - "cavityPump": { - "name": "Cavity pump", - "icon": "CavityPump.png", - "object": "NodeItem", - "args": ["cavityPump"] - }, - "centrifugal": { - "name": "Centrifugal", - "icon": "Centrifugal.png", - "object": "NodeItem", - "args": ["centrifugal"] - }, - "centrifugalBlower": { - "name": "Centrifugal blower", - "icon": "CentrifugalBlower.png", - "object": "NodeItem", - "args": ["centrifugalBlower"] - }, - "centrifugalCompressor": { - "name": "Centrifugal compressor", - "icon": "CentrifugalCompressor.png", - "object": "NodeItem", - "args": ["centrifugalCompressor"] - }, - "centrifugalCompressor2": { - "name": "Centrifugal compressor2", - "icon": "CentrifugalCompressor2.png", - "object": "NodeItem", - "args": ["centrifugalCompressor2"] - }, - "centrifugalCompressor3": { - "name": "Centrifugal compressor3", - "icon": "CentrifugalCompressor3.png", - "object": "NodeItem", - "args": ["centrifugalCompressor3"] - }, - "centrifugalCompressor4": { - "name": "Centrifugal compressor4", - "icon": "CentrifugalCompressor4.png", - "object": "NodeItem", - "args": ["centrifugalCompressor4"] - }, - "centrifugalPump": { - "name": "Centrifugal pump", - "icon": "CentrifugalPump.png", - "object": "NodeItem", - "args": ["centrifugalPump"] - }, - "centrifugalPump2": { - "name": "Centrifugal pump2", - "icon": "CentrifugalPump2.png", - "object": "NodeItem", - "args": ["centrifugalPump2"] - }, - "centrifugalPump3": { - "name": "Centrifugal pump3", - "icon": "CentrifugalPump3.png", - "object": "NodeItem", - "args": ["centrifugalPump3"] - }, - "centrifugalPump4": { - "name": "Centrifugal pump4", - "icon": "CentrifugalPump4.png", - "object": "NodeItem", - "args": ["centrifugalPump4"] - }, - "chimneyTowerHyperbolic": { - "name": "Chimney tower hyperbolic", - "icon": "ChimneyTowerHyperbolic.png", - "object": "NodeItem", - "args": ["chimneyTowerHyperbolic"] - }, - "coarseCrusher": { - "name": "Coarse crusher", - "icon": "CoarseCrusher.png", - "object": "NodeItem", - "args": ["coarseCrusher"] - }, - "column": { - "name": "Column", - "icon": "Column.png", - "object": "NodeItem", - "args": ["column"] - }, - "compressor": { - "name": "Compressor", - "icon": "Compressor.png", - "object": "NodeItem", - "args": ["compressor"] - }, - "compressor2": { - "name": "Compressor2", - "icon": "Compressor2.png", - "object": "NodeItem", - "args": ["compressor2"] - }, - "compressorSilencer": { - "name": "Compressor silencer", - "icon": "CompressorSilencer.png", - "object": "NodeItem", - "args": ["compressorSilencer"] - }, - "compressorVaccumPump": { - "name": "Compressor vaccum pump", - "icon": "CompressorVaccumPump.png", - "object": "NodeItem", - "args": ["compressorVaccumPump"] - }, - "condenser": { - "name": "Condenser", - "icon": "Condenser.png", - "object": "NodeItem", - "args": ["condenser"] - }, - "coneCrusher": { - "name": "Cone crusher", - "icon": "ConeCrusher.png", - "object": "NodeItem", - "args": ["coneCrusher"] - }, - "cooler": { - "name": "Cooler", - "icon": "Cooler.png", - "object": "NodeItem", - "args": ["cooler"] - }, - "coolingTower2": { - "name": "Cooling tower2", - "icon": "CoolingTower2.png", - "object": "NodeItem", - "args": ["coolingTower2"] - }, - "coolingTower3": { - "name": "Cooling tower3", - "icon": "CoolingTower3.png", - "object": "NodeItem", - "args": ["coolingTower3"] - }, - "counterflowForcedDraft": { - "name": "Counterflow forced draft", - "icon": "CounterflowForcedDraft.png", - "object": "NodeItem", - "args": ["counterflowForcedDraft"] - }, - "crossflowInducedDraft": { - "name": "Crossflow induced draft", - "icon": "CrossflowInducedDraft.png", - "object": "NodeItem", - "args": ["crossflowInducedDraft"] - }, - "crusher": { - "name": "Crusher", - "icon": "Crusher.png", - "object": "NodeItem", - "args": ["crusher"] - }, - "diaphragmCompressor": { - "name": "Diaphragm compressor", - "icon": "DiaphragmCompressor.png", - "object": "NodeItem", - "args": ["diaphragmCompressor"] - }, - "dieselMotor": { - "name": "Diesel motor", - "icon": "DieselMotor.png", - "object": "NodeItem", - "args": ["dieselMotor"] - }, - "doubleFlowTurbine": { - "name": "Double flow turbine", - "icon": "DoubleFlowTurbine.png", - "object": "NodeItem", - "args": ["doubleFlowTurbine"] - }, - "doublePipeHeat": { - "name": "Double pipe heat", - "icon": "DoublePipeHeat.png", - "object": "NodeItem", - "args": ["doublePipeHeat"] - }, - "dryer": { - "name": "Dryer", - "icon": "Dryer.png", - "object": "NodeItem", - "args": ["dryer"] - }, - "dryingOven": { - "name": "Drying oven", - "icon": "DryingOven.png", - "object": "NodeItem", - "args": ["dryingOven"] - }, - "ejector": { - "name": "Ejector", - "icon": "Ejector.png", - "object": "NodeItem", - "args": ["ejector"] - }, - "ejectorCompressor": { - "name": "Ejector compressor", - "icon": "EjectorCompressor.png", - "object": "NodeItem", - "args": ["ejectorCompressor"] - }, - "electricMotor": { - "name": "Electric motor", - "icon": "ElectricMotor.png", - "object": "NodeItem", - "args": ["electricMotor"] - }, - "extractorHood": { - "name": "Extractor hood", - "icon": "ExtractorHood.png", - "object": "NodeItem", - "args": ["extractorHood"] - }, - "fan": { - "name": "Fan", - "icon": "Fan.png", - "object": "NodeItem", - "args": ["fan"] - }, - "fanBlades": { - "name": "Fan blades", - "icon": "FanBlades.png", - "object": "NodeItem", - "args": ["fanBlades"] - }, - "fanBlades2": { - "name": "Fan blades2", - "icon": "FanBlades2.png", - "object": "NodeItem", - "args": ["fanBlades2"] - }, - "fineCrushers": { - "name": "Fine crushers", - "icon": "FineCrushers.png", - "object": "NodeItem", - "args": ["fineCrushers"] - }, - "firedHeater": { - "name": "Fired heater", - "icon": "FiredHeater.png", - "object": "NodeItem", - "args": ["firedHeater"] - }, - "fluidCatalyticCracking": { - "name": "Fluid catalytic cracking", - "icon": "FluidCatalyticCracking.png", - "object": "NodeItem", - "args": ["fluidCatalyticCracking"] - }, - "fluidCoking": { - "name": "Fluid coking", - "icon": "FluidCoking.png", - "object": "NodeItem", - "args": ["fluidCoking"] - }, - "fluidizedBedDryer": { - "name": "Fluidized bed dryer", - "icon": "FluidizedBedDryer.png", - "object": "NodeItem", - "args": ["fluidizedBedDryer"] - }, - "fluidizedReactor": { - "name": "Fluidized reactor", - "icon": "FluidizedReactor.png", - "object": "NodeItem", - "args": ["fluidizedReactor"] - }, - "forcedDraftCooling": { - "name": "Forced draft cooling", - "icon": "ForcedDraftCooling.png", - "object": "NodeItem", - "args": ["forcedDraftCooling"] - }, - "forcedDraftCoolingTower": { - "name": "Forced draft cooling tower", - "icon": "ForcedDraftCoolingTower.png", - "object": "NodeItem", - "args": ["forcedDraftCoolingTower"] - }, - "furnace": { - "name": "Furnace", - "icon": "Furnace.png", - "object": "NodeItem", - "args": ["furnace"] - }, - "furnace2": { - "name": "Furnace2", - "icon": "Furnace2.png", - "object": "NodeItem", - "args": ["furnace2"] - }, - "gasBlower": { - "name": "Gas blower", - "icon": "GasBlower.png", - "object": "NodeItem", - "args": ["gasBlower"] - }, - "gasBottle": { - "name": "Gas bottle", - "icon": "GasBottle.png", - "object": "NodeItem", - "args": ["gasBottle"] - }, - "gearPump": { - "name": "Gear pump", - "icon": "GearPump.png", - "object": "NodeItem", - "args": ["gearPump"] - }, - "generator": { - "name": "Generator", - "icon": "Generator.png", - "object": "NodeItem", - "args": ["generator"] - }, - "halfPipeMixingVessel": { - "name": "Half pipe mixing vessel", - "icon": "HalfPipeMixingVessel.png", - "object": "NodeItem", - "args": ["halfPipeMixingVessel"] - }, - "hammerCrusher": { - "name": "Hammer crusher", - "icon": "HammerCrusher.png", - "object": "NodeItem", - "args": ["hammerCrusher"] - }, - "hammerCrusher2": { - "name": "Hammer crusher2", - "icon": "HammerCrusher2.png", - "object": "NodeItem", - "args": ["hammerCrusher2"] - }, - "heatConsumer": { - "name": "Heat consumer", - "icon": "HeatConsumer.png", - "object": "NodeItem", - "args": ["heatConsumer"] - }, - "heater": { - "name": "Heater", - "icon": "Heater.png", - "object": "NodeItem", - "args": ["heater"] - }, - "heatExchanger": { - "name": "Heat exchanger", - "icon": "HeatExchanger.png", - "object": "NodeItem", - "args": ["heatExchanger"] - }, - "heatExchanger2": { - "name": "Heat exchanger2", - "icon": "HeatExchanger2.png", - "object": "NodeItem", - "args": ["heatExchanger2"] - }, - "horizontalPump": { - "name": "Horizontal pump", - "icon": "HorizontalPump.png", - "object": "NodeItem", - "args": ["horizontalPump"] - }, - "horizontalVessel": { - "name": "Horizontal vessel", - "icon": "HorizontalVessel.png", - "object": "NodeItem", - "args": ["horizontalVessel"] - }, - "hydroCracking": { - "name": "Hydro cracking", - "icon": "HydroCracking.png", - "object": "NodeItem", - "args": ["hydroCracking"] - }, - "hydrocracking2": { - "name": "Hydrocracking2", - "icon": "Hydrocracking2.png", - "object": "NodeItem", - "args": ["hydrocracking2"] - }, - "hydrodesulfurization": { - "name": "Hydrodesulfurization", - "icon": "Hydrodesulfurization.png", - "object": "NodeItem", - "args": ["hydrodesulfurization"] - }, - "impactCrusher": { - "name": "Impact crusher", - "icon": "ImpactCrusher.png", - "object": "NodeItem", - "args": ["impactCrusher"] - }, - "iSOCentrifugalPump": { - "name": "ISOCentrifugal pump", - "icon": "ISOCentrifugalPump.png", - "object": "NodeItem", - "args": ["iSOCentrifugalPump"] - }, - "iSODiaphragmPump": { - "name": "ISODiaphragm pump", - "icon": "ISODiaphragmPump.png", - "object": "NodeItem", - "args": ["iSODiaphragmPump"] - }, - "iSOGearPump": { - "name": "ISOGear pump", - "icon": "ISOGearPump.png", - "object": "NodeItem", - "args": ["iSOGearPump"] - }, - "iSOLiquidPump": { - "name": "ISOLiquid pump", - "icon": "ISOLiquidPump.png", - "object": "NodeItem", - "args": ["iSOLiquidPump"] - }, - "iSOPositiveDisplacementPump": { - "name": "ISOPositive displacement pump", - "icon": "ISOPositiveDisplacementPump.png", - "object": "NodeItem", - "args": ["iSOPositiveDisplacementPump"] - }, - "iSOProgressivePump": { - "name": "ISOProgressive pump", - "icon": "ISOProgressivePump.png", - "object": "NodeItem", - "args": ["iSOProgressivePump"] - }, - "iSOReciprocatingPistonPump": { - "name": "ISOReciprocating piston pump", - "icon": "ISOReciprocatingPistonPump.png", - "object": "NodeItem", - "args": ["iSOReciprocatingPistonPump"] - }, - "iSOScrewPump": { - "name": "ISOScrew pump", - "icon": "ISOScrewPump.png", - "object": "NodeItem", - "args": ["iSOScrewPump"] - }, - "jacketedMixingVessel": { - "name": "Jacketed mixing vessel", - "icon": "JacketedMixingVessel.png", - "object": "NodeItem", - "args": ["jacketedMixingVessel"] - }, - "jawCrusher": { - "name": "Jaw crusher", - "icon": "JawCrusher.png", - "object": "NodeItem", - "args": ["jawCrusher"] - }, - "liquidRingCompressor": { - "name": "Liquid ring compressor", - "icon": "LiquidRingCompressor.png", - "object": "NodeItem", - "args": ["liquidRingCompressor"] - }, - "liquidRingVaccumPump": { - "name": "Liquid ring vaccum pump", - "icon": "LiquidRingVaccumPump.png", - "object": "NodeItem", - "args": ["liquidRingVaccumPump"] - }, - "mediumCrusher": { - "name": "Medium crusher", - "icon": "MediumCrusher.png", - "object": "NodeItem", - "args": ["mediumCrusher"] - }, - "mixing": { - "name": "Mixing", - "icon": "Mixing.png", - "object": "NodeItem", - "args": ["mixing"] - }, - "mixingReactor": { - "name": "Mixing reactor", - "icon": "MixingReactor.png", - "object": "NodeItem", - "args": ["mixingReactor"] - }, - "motor": { - "name": "Motor", - "icon": "Motor.png", - "object": "NodeItem", - "args": ["motor"] - }, - "motorDrivenTurbin": { - "name": "Motor driven turbin", - "icon": "MotorDrivenTurbin.png", - "object": "NodeItem", - "args": ["motorDrivenTurbin"] - }, - "motorGenerator": { - "name": "Motor generator", - "icon": "MotorGenerator.png", - "object": "NodeItem", - "args": ["motorGenerator"] - }, - "movingShelfDryer": { - "name": "Moving shelf dryer", - "icon": "MovingShelfDryer.png", - "object": "NodeItem", - "args": ["movingShelfDryer"] - }, - "oilBurner": { - "name": "Oil burner", - "icon": "OilBurner.png", - "object": "NodeItem", - "args": ["oilBurner"] - }, - "openTank": { - "name": "Open tank", - "icon": "OpenTank.png", - "object": "NodeItem", - "args": ["openTank"] - }, - "packedTower": { - "name": "Packed tower", - "icon": "PackedTower.png", - "object": "NodeItem", - "args": ["packedTower"] - }, - "peristallticPump": { - "name": "Peristalltic pump", - "icon": "PeristallticPump.png", - "object": "NodeItem", - "args": ["peristallticPump"] - }, - "pistonCompressor": { - "name": "Piston compressor", - "icon": "PistonCompressor.png", - "object": "NodeItem", - "args": ["pistonCompressor"] - }, - "plateTower": { - "name": "Plate tower", - "icon": "PlateTower.png", - "object": "NodeItem", - "args": ["plateTower"] - }, - "positiveDisplacementPump": { - "name": "Positive displacement pump", - "icon": "PositiveDisplacementPump.png", - "object": "NodeItem", - "args": ["positiveDisplacementPump"] - }, - "positiveDisplacementPump2": { - "name": "Positive displacement pump2", - "icon": "PositiveDisplacementPump2.png", - "object": "NodeItem", - "args": ["positiveDisplacementPump2"] - }, - "proportioningPump": { - "name": "Proportioning pump", - "icon": "ProportioningPump.png", - "object": "NodeItem", - "args": ["proportioningPump"] - }, - "proportioningPump2": { - "name": "Proportioning pump2", - "icon": "ProportioningPump2.png", - "object": "NodeItem", - "args": ["proportioningPump2"] - }, - "pump": { - "name": "Pump", - "icon": "Pump.png", - "object": "NodeItem", - "args": ["pump"] - }, - "pump2": { - "name": "Pump2", - "icon": "Pump2.png", - "object": "NodeItem", - "args": ["pump2"] - }, - "reboilerHeatExchanger": { - "name": "Reboiler heat exchanger", - "icon": "ReboilerHeatExchanger.png", - "object": "NodeItem", - "args": ["reboilerHeatExchanger"] - }, - "reciprocatingCompressor": { - "name": "Reciprocating compressor", - "icon": "ReciprocatingCompressor.png", - "object": "NodeItem", - "args": ["reciprocatingCompressor"] - }, - "reciprocatingCompressor2": { - "name": "Reciprocating compressor2", - "icon": "ReciprocatingCompressor2.png", - "object": "NodeItem", - "args": ["reciprocatingCompressor2"] - }, - "reciprocatingPump": { - "name": "Reciprocating pump", - "icon": "ReciprocatingPump.png", - "object": "NodeItem", - "args": ["reciprocatingPump"] - }, - "reciprocatingPump2": { - "name": "Reciprocating pump2", - "icon": "ReciprocatingPump2.png", - "object": "NodeItem", - "args": ["reciprocatingPump2"] - }, - "reciprocativeCompressor": { - "name": "Reciprocative compressor", - "icon": "ReciprocativeCompressor.png", - "object": "NodeItem", - "args": ["reciprocativeCompressor"] - }, - "ringCompressor": { - "name": "Ring compressor", - "icon": "RingCompressor.png", - "object": "NodeItem", - "args": ["ringCompressor"] - }, - "rollerConveryorBeltDryer": { - "name": "Roller converyor belt dryer", - "icon": "RollerConveryorBeltDryer.png", - "object": "NodeItem", - "args": ["rollerConveryorBeltDryer"] - }, - "rollerCrusher": { - "name": "Roller crusher", - "icon": "RollerCrusher.png", - "object": "NodeItem", - "args": ["rollerCrusher"] - }, - "rollerVaneCompressor": { - "name": "Roller vane compressor", - "icon": "RollerVaneCompressor.png", - "object": "NodeItem", - "args": ["rollerVaneCompressor"] - }, - "rotaryCompressor": { - "name": "Rotary compressor", - "icon": "RotaryCompressor.png", - "object": "NodeItem", - "args": ["rotaryCompressor"] - }, - "rotaryCompressor2": { - "name": "Rotary compressor2", - "icon": "RotaryCompressor2.png", - "object": "NodeItem", - "args": ["rotaryCompressor2"] - }, - "rotaryCompressor3": { - "name": "Rotary compressor3", - "icon": "RotaryCompressor3.png", - "object": "NodeItem", - "args": ["rotaryCompressor3"] - }, - "rotaryCompressorSilencers": { - "name": "Rotary compressor silencers", - "icon": "RotaryCompressorSilencers.png", - "object": "NodeItem", - "args": ["rotaryCompressorSilencers"] - }, - "rotaryGearPump": { - "name": "Rotary gear pump", - "icon": "RotaryGearPump.png", - "object": "NodeItem", - "args": ["rotaryGearPump"] - }, - "rotaryPump": { - "name": "Rotary pump", - "icon": "RotaryPump.png", - "object": "NodeItem", - "args": ["rotaryPump"] - }, - "screen": { - "name": "Screen", - "icon": "Screen.png", - "object": "NodeItem", - "args": ["screen"] - }, - "screwPump": { - "name": "Screw pump", - "icon": "ScrewPump.png", - "object": "NodeItem", - "args": ["screwPump"] - }, - "screwPump2": { - "name": "Screw pump2", - "icon": "ScrewPump2.png", - "object": "NodeItem", - "args": ["screwPump2"] - }, - "selectableCompressor": { - "name": "Selectable compressor", - "icon": "SelectableCompressor.png", - "object": "NodeItem", - "args": ["selectableCompressor"] - }, - "selectableFan": { - "name": "Selectable fan", - "icon": "SelectableFan.png", - "object": "NodeItem", - "args": ["selectableFan"] - }, - "singlePassHeat": { - "name": "Single pass heat", - "icon": "SinglePassHeat.png", - "object": "NodeItem", - "args": ["singlePassHeat"] - }, - "spiralHeatExchanger": { - "name": "Spiral heat exchanger", - "icon": "SpiralHeatExchanger.png", - "object": "NodeItem", - "args": ["spiralHeatExchanger"] - }, - "spray": { - "name": "Spray", - "icon": "Spray.png", - "object": "NodeItem", - "args": ["spray"] - }, - "sprayDryer": { - "name": "Spray dryer", - "icon": "SprayDryer.png", - "object": "NodeItem", - "args": ["sprayDryer"] - }, - "straightTubesHeat": { - "name": "Straight tubes heat", - "icon": "StraightTubesHeat.png", - "object": "NodeItem", - "args": ["straightTubesHeat"] - }, - "submersiblePump": { - "name": "Submersible pump", - "icon": "SubmersiblePump.png", - "object": "NodeItem", - "args": ["submersiblePump"] - }, - "sumpPump": { - "name": "Sump pump", - "icon": "SumpPump.png", - "object": "NodeItem", - "args": ["sumpPump"] - }, - "tank": { - "name": "Tank", - "icon": "Tank.png", - "object": "NodeItem", - "args": ["tank"] - }, - "transport": { - "name": "Transport", - "icon": "Transport.png", - "object": "NodeItem", - "args": ["transport"] - }, - "tripleFanBlades": { - "name": "Triple fan blades", - "icon": "TripleFanBlades.png", - "object": "NodeItem", - "args": ["tripleFanBlades"] - }, - "tubular": { - "name": "Tubular", - "icon": "Tubular.png", - "object": "NodeItem", - "args": ["tubular"] - }, - "turbineDriver": { - "name": "Turbine driver", - "icon": "TurbineDriver.png", - "object": "NodeItem", - "args": ["turbineDriver"] - }, - "turbinePump": { - "name": "Turbine pump", - "icon": "TurbinePump.png", - "object": "NodeItem", - "args": ["turbinePump"] - }, - "uTubeHeatExchanger": { - "name": "UTube heat exchanger", - "icon": "UTubeHeatExchanger.png", - "object": "NodeItem", - "args": ["uTubeHeatExchanger"] - }, - "vaccumPump": { - "name": "Vaccum pump", - "icon": "VaccumPump.png", - "object": "NodeItem", - "args": ["vaccumPump"] - }, - "variousCrushers": { - "name": "Various crushers", - "icon": "VariousCrushers.png", - "object": "NodeItem", - "args": ["variousCrushers"] - }, - "verticalPump": { - "name": "Vertical pump", - "icon": "VerticalPump.png", - "object": "NodeItem", - "args": ["verticalPump"] - }, - "verticalPump2": { - "name": "Vertical pump2", - "icon": "VerticalPump2.png", - "object": "NodeItem", - "args": ["verticalPump2"] - }, - "verticalVessel": { - "name": "Vertical vessel", - "icon": "VerticalVessel.png", - "object": "NodeItem", - "args": ["verticalVessel"] - }, - "vibrationCrusher": { - "name": "Vibration crusher", - "icon": "VibrationCrusher.png", - "object": "NodeItem", - "args": ["vibrationCrusher"] - }, - "wastewaterTreatment": { - "name": "Wastewater treatment", - "icon": "WastewaterTreatment.png", - "object": "NodeItem", - "args": ["wastewaterTreatment"] + "Piping": { + "Inflow Line": { + "name": "Inflow Line", + "icon": ".\\Piping\\Inflow Line.png", + "class": "Piping", + "object": "InflowLine", + "args": [] + }, + "Outflow Line": { + "name": "Outflow Line", + "icon": ".\\Piping\\Outflow Line.png", + "class": "Piping", + "object": "OutflowLine", + "args": [] + } + }, + "Pumps": { + "Duplex Pump": { + "name": "Duplex Pump", + "icon": ".\\Pumps\\Duplex Pump.png", + "class": "Pumps", + "object": "DuplexPump", + "args": [] + }, + "Plunger Pump": { + "name": "Plunger Pump", + "icon": ".\\Pumps\\Plunger Pump.png", + "class": "Pumps", + "object": "PlungerPump", + "args": [] + }, + "Proportioning Pump": { + "name": "Proportioning Pump", + "icon": ".\\Pumps\\Proportioning Pump.png", + "class": "Pumps", + "object": "ProportioningPump", + "args": [] + }, + "Reciprocating Pump": { + "name": "Reciprocating Pump", + "icon": ".\\Pumps\\Reciprocating Pump.png", + "class": "Pumps", + "object": "ReciprocatingPump", + "args": [] + } } }
\ No newline at end of file diff --git a/src/main/resources/base/svg/Piping/Inflow Line.svg b/src/main/resources/base/svg/Piping/Inflow Line.svg new file mode 100644 index 0000000..a976eea --- /dev/null +++ b/src/main/resources/base/svg/Piping/Inflow Line.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + id="svg914" + version="1.1" + viewBox="0 0 15.19912 11.834809" + height="11.834809mm" + width="15.19912mm"> + <defs + id="defs908" /> + <metadata + id="metadata911"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-133.00758,-166.43974)" + id="layer1"> + <path + id="path3853" + d="m 142.39449,167.36534 -0.0334,3.17382 -8.95351,0.0167 v 4.14268 l 8.982,-0.0443 0.0295,2.69337 5.20876,-4.98618 z" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> +</svg> diff --git a/src/main/resources/base/svg/Piping/Outflow Line.svg b/src/main/resources/base/svg/Piping/Outflow Line.svg new file mode 100644 index 0000000..46bf1f4 --- /dev/null +++ b/src/main/resources/base/svg/Piping/Outflow Line.svg @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + id="svg1509" + version="1.1" + viewBox="0 0 15.199145 11.825459" + height="11.825459mm" + width="15.199145mm"> + <defs + id="defs1503" /> + <metadata + id="metadata1506"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-149.63852,-122.59918)" + id="layer1"> + <g + transform="matrix(0.26458333,0,0,0.26458333,13.552537,60.414904)" + style="stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none" + id="g918"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.02362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 549.81886,238.52548 -0.12627,11.99556 -33.84004,0.0631 v 15.65737 l 33.83611,-0.23438 0.22322,10.24662 19.68663,-18.84539 z" + id="path3865" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.02362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 549.69259,250.52104 v 15.88133" + id="path3871" /> + </g> + </g> +</svg> diff --git a/src/main/resources/base/svg/Pumps/Duplex Pump.svg b/src/main/resources/base/svg/Pumps/Duplex Pump.svg new file mode 100644 index 0000000..7557711 --- /dev/null +++ b/src/main/resources/base/svg/Pumps/Duplex Pump.svg @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + id="svg5576" + version="1.1" + viewBox="0 0 21.156015 22.703859" + height="22.703859mm" + width="21.156015mm"> + <defs + id="defs5570"> + <linearGradient + xlink:href="#linearGradient4926" + id="linearGradient5047" + x1="2331.7856" + y1="280.57645" + x2="2365.7141" + y2="280.57645" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.26458333,0,0,0.26458333,-547.69335,-4.3953684)" /> + <linearGradient + id="linearGradient4926" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4924" /> + </linearGradient> + <linearGradient + xlink:href="#linearGradient4926" + id="linearGradient5051" + gradientUnits="userSpaceOnUse" + x1="2331.7856" + y1="280.57645" + x2="2365.7141" + y2="280.57645" + gradientTransform="matrix(0.73140497,0,0,0.73140497,-702.68351,233.03624)" /> + </defs> + <metadata + id="metadata5573"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-64.994234,-64.999262)" + id="layer1"> + <g + id="g6206"> + <rect + y="65.399261" + x="69.258255" + height="8.8824406" + width="8.9769344" + id="rect5041" + style="fill:#ffffff;stroke:url(#linearGradient5047);stroke-width:0.799999;stroke-miterlimit:4;stroke-dasharray:none" /> + <g + style="stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none" + transform="matrix(0.26458333,0,0,0.26458333,-194.85929,-31.899176)" + id="g5609"> + <rect + y="425.97406" + x="1002.7961" + height="24.554312" + width="24.815525" + id="rect5049" + style="fill:#ffffff;stroke:url(#linearGradient5051);stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.02362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + x="1005.492" + y="446.45251" + id="text5053"><tspan + id="tspan5055" + x="1005.492" + y="446.45251" + style="font-size:22.5px;line-height:1.25;stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none">M</tspan></text> + </g> + <path + id="path5057" + d="m 73.735737,74.294235 0.02196,6.52009" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path5061" + d="m 69.163787,67.667124 -4.169553,3e-6" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path5069" + d="m 78.18796,72.037475 7.961101,0.02363" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.799999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 78.18796,69.840481 H 69.541763" + id="path6185" /> + </g> + </g> +</svg> diff --git a/src/main/resources/base/svg/Pumps/Plunger Pump.svg b/src/main/resources/base/svg/Pumps/Plunger Pump.svg new file mode 100644 index 0000000..6667661 --- /dev/null +++ b/src/main/resources/base/svg/Pumps/Plunger Pump.svg @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + id="svg4959" + version="1.1" + viewBox="0 0 26.974354 18.283966" + height="18.283966mm" + width="26.974354mm"> + <defs + id="defs4953" /> + <metadata + id="metadata4956"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-47.881206,-67.209207)" + id="layer1"> + <g + style="stroke-width:5.18327;stroke-miterlimit:4;stroke-dasharray:none" + transform="matrix(0.14155016,0,0,0.16829148,38.397566,52.467677)" + id="g4214"> + <path + id="path3350" + d="m 211.12256,107.35023 v 69.29929" + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:5.18327;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path4152" + d="M 211.2413,142.21715 H 66.998439" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.18327;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path4163" + d="M 233.07256,108.29095 V 87.595227" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.18327;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.18327;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 232.76062,196.23986 V 175.54414" + id="path4165" /> + <path + id="path4169" + d="m 108.85165,139.07879 0.11087,-32.06341 146.00821,0.22173 v 69.40102 H 108.85165 l -0.15678,-31.66451" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.18327;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/src/main/resources/base/svg/Pumps/Proportioning Pump.svg b/src/main/resources/base/svg/Pumps/Proportioning Pump.svg new file mode 100644 index 0000000..9ce0ce1 --- /dev/null +++ b/src/main/resources/base/svg/Pumps/Proportioning Pump.svg @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + id="svg1065" + version="1.1" + viewBox="0 0 23.424238 17.79081" + height="17.79081mm" + width="23.424238mm"> + <defs + id="defs1059"> + <linearGradient + xlink:href="#linearGradient5079" + id="linearGradient5083" + x1="2311.229" + y1="375.30746" + x2="2344.0591" + y2="375.30746" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.26458333,0,0,0.26458333,-442.74272,-14.475332)" /> + <linearGradient + id="linearGradient5079" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop5081" /> + </linearGradient> + <linearGradient + xlink:href="#linearGradient5079" + id="linearGradient5087" + gradientUnits="userSpaceOnUse" + x1="2311.229" + y1="375.30746" + x2="2344.0591" + y2="375.30746" + gradientTransform="matrix(0.80051209,0,0,1.2801381,-895.39599,-51.96656)" /> + </defs> + <metadata + id="metadata1062"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-161.40098,-81.81888)" + id="layer1"> + <g + style="stroke-width:0.8;stroke-miterlimit:4;stroke-dasharray:none" + id="g1762"> + <rect + y="82.21888" + x="168.76996" + height="5.2117558" + width="8.6862593" + id="rect5077" + style="fill:#ffffff;stroke:url(#linearGradient5083);stroke-width:0.8;stroke-miterlimit:4;stroke-dasharray:none" /> + <g + style="stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none" + transform="matrix(0.26458333,0,0,0.26458333,-82.977047,-17.494539)" + id="g5573"> + <rect + y="415.87073" + x="954.77051" + height="25.216125" + width="26.280779" + id="rect5085" + style="fill:#ffffff;stroke:url(#linearGradient5087);stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.02362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + x="958.19897" + y="436.68008" + id="text5089"><tspan + id="tspan5091" + x="958.19897" + y="436.68008" + style="font-size:22.5px;line-height:1.25;stroke-width:3.02362;stroke-miterlimit:4;stroke-dasharray:none">M</tspan></text> + </g> + <path + id="path5093" + d="m 173.11604,87.510941 v 4.878252" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path5097" + d="m 168.89399,84.828992 -7.49271,-0.0057" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 177.3322,84.820519 7.49271,0.0057" + id="path5561" /> + </g> + </g> +</svg> diff --git a/src/main/resources/base/svg/Pumps/Reciprocating Pump.svg b/src/main/resources/base/svg/Pumps/Reciprocating Pump.svg new file mode 100644 index 0000000..574be6f --- /dev/null +++ b/src/main/resources/base/svg/Pumps/Reciprocating Pump.svg @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + id="svg7104" + version="1.1" + viewBox="0 0 18.596294 22.605106" + height="22.605106mm" + width="18.596294mm"> + <defs + id="defs7098"> + <linearGradient + xlink:href="#linearGradient4926" + id="linearGradient4928" + x1="2750.7144" + y1="235.75505" + x2="2785.7144" + y2="235.75505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.19663354,0,0,0.19663354,-506.64166,95.839202)" /> + <linearGradient + id="linearGradient4926" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4924" /> + </linearGradient> + <linearGradient + xlink:href="#linearGradient4926" + id="linearGradient4956" + x1="2751.0715" + y1="235.75504" + x2="2784.2859" + y2="235.75504" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.26458333,0,0,0.26458333,-694.59952,65.768585)" /> + </defs> + <metadata + id="metadata7101"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + transform="translate(-28.499473,-123.25697)" + id="layer1"> + <g + id="g7739"> + <rect + y="138.93103" + x="34.241028" + height="6.5310431" + width="6.8821745" + id="rect4922" + style="fill:#ffffff;stroke:url(#linearGradient4928);stroke-width:0.8;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + id="text4932" + y="144.25397" + x="35.245747" + style="font-style:normal;font-weight:normal;font-size:5.64444px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + xml:space="preserve"><tspan + y="144.25397" + x="35.245747" + id="tspan4930" + style="stroke-width:0.8;stroke-miterlimit:4;stroke-dasharray:none">M</tspan></text> + <path + id="path4942" + d="m 28.499473,128.12587 h 5.149929" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <rect + y="123.65697" + x="33.288147" + height="8.9769344" + width="8.7879467" + id="rect4950" + style="fill:#ffffff;stroke:url(#linearGradient4956);stroke-width:0.8;stroke-miterlimit:4;stroke-dasharray:none" /> + <path + id="path4996" + d="M 37.688531,139.01274 V 132.6257" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 47.095767,128.13684 H 41.945838" + id="path5102" /> + </g> + </g> +</svg> diff --git a/src/main/resources/base/svg/ellipse.svg b/src/main/resources/base/svg/ellipse.svg deleted file mode 100644 index c455408..0000000 --- a/src/main/resources/base/svg/ellipse.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<svg xmlns="http://example.org" xmlns:svg="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" viewBox="0 0 100 100"> - <!-- parent contents here --> - <!-- <svg:svg version="1.2" baseProfile="tiny" viewBox="0 0 100 100"> --> - <svg:ellipse cx="50" cy="50" rx="50" ry="50" fill="none" stroke="black" stroke-width="1" /> - <!-- </svg:svg> --> - <!-- ... --> -</svg>
\ No newline at end of file diff --git a/src/main/resources/base/toolbar/Piping/Inflow Line.png b/src/main/resources/base/toolbar/Piping/Inflow Line.png Binary files differnew file mode 100644 index 0000000..eee1712 --- /dev/null +++ b/src/main/resources/base/toolbar/Piping/Inflow Line.png diff --git a/src/main/resources/base/toolbar/Piping/Outflow Line.png b/src/main/resources/base/toolbar/Piping/Outflow Line.png Binary files differnew file mode 100644 index 0000000..1d69427 --- /dev/null +++ b/src/main/resources/base/toolbar/Piping/Outflow Line.png diff --git a/src/main/resources/base/toolbar/Pumps/Duplex Pump.png b/src/main/resources/base/toolbar/Pumps/Duplex Pump.png Binary files differnew file mode 100644 index 0000000..50ba6a4 --- /dev/null +++ b/src/main/resources/base/toolbar/Pumps/Duplex Pump.png diff --git a/src/main/resources/base/toolbar/Pumps/Plunger Pump.png b/src/main/resources/base/toolbar/Pumps/Plunger Pump.png Binary files differnew file mode 100644 index 0000000..ea202cd --- /dev/null +++ b/src/main/resources/base/toolbar/Pumps/Plunger Pump.png diff --git a/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png b/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png Binary files differnew file mode 100644 index 0000000..cf23409 --- /dev/null +++ b/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png diff --git a/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png b/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png Binary files differnew file mode 100644 index 0000000..a697be3 --- /dev/null +++ b/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png diff --git a/src/main/resources/base/toolbar/ellipse.png b/src/main/resources/base/toolbar/ellipse.png Binary files differdeleted file mode 100644 index e708bdd..0000000 --- a/src/main/resources/base/toolbar/ellipse.png +++ /dev/null |