Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion environment/environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ dependencies:
- pip:
- opencv-python==4.7.0.68
- numpy==1.25.0
- qtpy>=2.0.0
- qtpy>=2.0.0
- NodeGraphQt
62 changes: 62 additions & 0 deletions src/cvnodegraph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import re
from qtpy.QtWidgets import QDockWidget
from NodeGraphQt import (
NodeGraph,
PropertiesBinWidget,
NodesTreeWidget,
NodesPaletteWidget
)

from NodeGraphQt import BaseNode
# from examples.nodes import basic_nodes


# UI: create the widget wrapper that can be docked to the main window.
class NodeGraphPanel(QDockWidget):
"""
Widget wrapper for the node graph that can be docked to
the main window.
"""
def __init__(self, graph, parent=None):
super(NodeGraphPanel, self).__init__(parent)
self.setObjectName('nodeGraphQt.NodeGraphPanel')
self.setWindowTitle('CV2 pipeline visualisation')
self.setWidget(graph.widget)

# utils
def slugify(s):
return re.sub(r'[^a-z0-9-]', r'', s.lower()).replace('-', '_')

# Below individual NodeGraph default constructor (1-in => 1-out)
def node_constructor(self):
BaseNode.__init__(self)
self.add_input('in A')
self.add_output('out A')

class CvNodeGraph():
def __init__(self, main_window):
self.main_window = main_window
self.graph = graph = NodeGraph()
self.panel = NodeGraphPanel(graph)

for key, value in self.main_window.transformer.commands.items():
if 'inputs' in value:
# Defines dynamic class input/output/colors/labels based on `commands.txt`
pass
else:
# A default class for command with simple 1-in/1-out
cls = type(slugify(key), (BaseNode, ), {
# acts as a namespace
"__identifier__": 'nodes.transform',
"NODE_NAME": key,
"__init__": node_constructor
})
print("register", cls)
graph.register_node(cls)


def add_node(self, pipelineitem):
key = 'nodes.transform' + '.' + slugify(pipelineitem.transformation_item.name)
print("adding node to graph:", key)
self.graph.create_node(key, text_color='#feab20')

3 changes: 3 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from clickableframe import ClickableFrame
from pipelineitem import PipelineItem
from pipeline import Pipeline
from cvnodegraph import CvNodeGraph
from sliderwithtext import SliderWithText
from menuwithtext import MenuWithText

Expand All @@ -33,6 +34,7 @@ def __init__(self):
self.pipeline = Pipeline(self.transformer, self.display_error_message)
self.transformer_manager = TransformerManager(self, self.pipeline, self.transformer)
self.index_current_img = -1
self.nodegraph = CvNodeGraph(self)

self.setGeometry(100, 100, 700, 700)
self.initiate_frames()
Expand Down Expand Up @@ -130,6 +132,7 @@ def initiate_frames(self):
self.btn_download_image.clicked.connect(self.action_download_current_image)
self.btn_download_image.hide()
self.pipeline_manage_layout.addWidget(self.btn_download_image)
self.addDockWidget(Qt.RightDockWidgetArea, self.nodegraph.panel)

btn_change_current = QRadioButton("Change next")
self.btn_add_after = QRadioButton("Add")
Expand Down
3 changes: 2 additions & 1 deletion src/transformermanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def transformation_saver(self, key_command):
self.main_window.index_current_img += 1
if is_current_last:
self.pipeline.append(new_item)
self.main_window.nodegraph.add_node(new_item)
elif add_after:
self.pipeline.insert(self.main_window.index_current_img, new_item)
elif not add_after:
Expand Down Expand Up @@ -59,4 +60,4 @@ def get_default_transformation_parameters(self, key_command):
default_value = list(current_slider['menu_item'].values())[0]
dict_default_values[var_name] = default_value

return dict_default_values
return dict_default_values