summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--src/main/python/shapes/__init__.py2
-rw-r--r--src/main/python/shapes/line.py22
-rw-r--r--src/main/python/shapes/shapes.py305
-rw-r--r--src/main/python/utils/app.py6
-rw-r--r--src/main/python/utils/canvas.py42
-rw-r--r--src/main/python/utils/fileWindow.py11
-rw-r--r--src/main/python/utils/tabs.py23
-rw-r--r--src/main/python/utils/toolbar.py21
-rw-r--r--src/main/python/utils/undo.py3
-rw-r--r--src/main/resources/base/config/items.json944
-rw-r--r--src/main/resources/base/svg/Piping/Inflow Line.svg35
-rw-r--r--src/main/resources/base/svg/Piping/Outflow Line.svg44
-rw-r--r--src/main/resources/base/svg/Pumps/Duplex Pump.svg108
-rw-r--r--src/main/resources/base/svg/Pumps/Plunger Pump.svg56
-rw-r--r--src/main/resources/base/svg/Pumps/Proportioning Pump.svg105
-rw-r--r--src/main/resources/base/svg/Pumps/Reciprocating Pump.svg99
-rw-r--r--src/main/resources/base/svg/ellipse.svg8
-rw-r--r--src/main/resources/base/toolbar/Piping/Inflow Line.pngbin0 -> 1283 bytes
-rw-r--r--src/main/resources/base/toolbar/Piping/Outflow Line.pngbin0 -> 1323 bytes
-rw-r--r--src/main/resources/base/toolbar/Pumps/Duplex Pump.pngbin0 -> 1416 bytes
-rw-r--r--src/main/resources/base/toolbar/Pumps/Plunger Pump.pngbin0 -> 1037 bytes
-rw-r--r--src/main/resources/base/toolbar/Pumps/Proportioning Pump.pngbin0 -> 1289 bytes
-rw-r--r--src/main/resources/base/toolbar/Pumps/Reciprocating Pump.pngbin0 -> 1312 bytes
-rw-r--r--src/main/resources/base/toolbar/ellipse.pngbin37162 -> 0 bytes
25 files changed, 609 insertions, 1229 deletions
diff --git a/.gitignore b/.gitignore
index 8ad00c3..9aeb547 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
new file mode 100644
index 0000000..eee1712
--- /dev/null
+++ b/src/main/resources/base/toolbar/Piping/Inflow Line.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/Piping/Outflow Line.png b/src/main/resources/base/toolbar/Piping/Outflow Line.png
new file mode 100644
index 0000000..1d69427
--- /dev/null
+++ b/src/main/resources/base/toolbar/Piping/Outflow Line.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/Pumps/Duplex Pump.png b/src/main/resources/base/toolbar/Pumps/Duplex Pump.png
new file mode 100644
index 0000000..50ba6a4
--- /dev/null
+++ b/src/main/resources/base/toolbar/Pumps/Duplex Pump.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/Pumps/Plunger Pump.png b/src/main/resources/base/toolbar/Pumps/Plunger Pump.png
new file mode 100644
index 0000000..ea202cd
--- /dev/null
+++ b/src/main/resources/base/toolbar/Pumps/Plunger Pump.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png b/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png
new file mode 100644
index 0000000..cf23409
--- /dev/null
+++ b/src/main/resources/base/toolbar/Pumps/Proportioning Pump.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png b/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png
new file mode 100644
index 0000000..a697be3
--- /dev/null
+++ b/src/main/resources/base/toolbar/Pumps/Reciprocating Pump.png
Binary files differ
diff --git a/src/main/resources/base/toolbar/ellipse.png b/src/main/resources/base/toolbar/ellipse.png
deleted file mode 100644
index e708bdd..0000000
--- a/src/main/resources/base/toolbar/ellipse.png
+++ /dev/null
Binary files differ