class FlowchartCalibrateWindow: def __init__(self): """ Flowchart inside new window for system calibration """ # Graphics window self.win = QtGui.QMainWindow() self.win.setWindowTitle('System Calibration Flowchart') # Dock Area dockArea = DockArea() # Central widget self.win.setCentralWidget(dockArea) # Window Docks fcWidgetDock = Dock('Flowchart Widget', size=(1, 1), hideTitle=True) displayDock = Dock('Measurement and Calibration', size=(1, 1)) plotDocks = [Dock('Plot {}'.format(i), size=(1, 1)) for i in range(4)] dockArea.addDock(fcWidgetDock, 'left') dockArea.addDock(displayDock, 'right', fcWidgetDock) dockArea.addDock(plotDocks[0], 'top', displayDock) dockArea.addDock(plotDocks[1], 'right', plotDocks[0]) dockArea.addDock(plotDocks[2], 'top', displayDock) dockArea.addDock(plotDocks[3], 'right', plotDocks[2]) # Window size self.win.resize(800, 600) # Flowchart self.fc = Flowchart(terminals={ 'dipImgIn': { 'io': 'in' }, 'CalibConstOut': { 'io': 'out' }, }) # row, column, rowspan, colspan fcWidgetDock.addWidget(self.fc.widget()) # Plot widgets self.plt_widg = [FlowchartPlotWidget() for _ in range(len(plotDocks))] [ plotDocks[i].addWidget(self.plt_widg[i]) for i in range(len(plotDocks)) ] # Graphics layout for displays displayLayout = pg.GraphicsLayoutWidget(border='w') displayDock.addWidget(displayLayout) # Display widgets self.disp_widg = [] self.disp_widg.append( displayLayout.addLabel('', colspan=2, justify='left')) displayLayout.nextRow() self.disp_widg.append( displayLayout.addLabel('', colspan=2, justify='left')) # Flowchart library copy - custom nodes available to user self.fc_library = fclib.LIBRARY.copy() [ self.fc_library.addNodeType(nd, [('dipImage', 'Display')]) for nd in (FlowchartPlotNode, MeasurementDisplayNode, CalibDisplayNode, ORingMeasurementDisplayNode) ] # Filter nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Filters')]) for nd in (GaussianConvolutionNode, GradientNode, GradientMagnitudeNode, GradientDirectionNode, EdgeObjectsRemoveNode, KuwaharaNode, BilateralFilterNode) ] # Binary Filter nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Binary')]) for nd in (BinaryClosingNode, BinaryOpeningNode, BinaryErosionNode, BinaryDilationNode, BinaryAreaClosingNode, BinaryAreaOpeningNode, BinaryPropagationNode, FillHolesNode) ] # Segmentation nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Segmentation')]) for nd in (ThresholdNode, RangeThresholdNode, MinimaNode, MaximaNode, WatershedNode, SeededWatershedNode, CannyNode, SegmentORingNode) ] # Morphological nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Morphological')]) for nd in (DilationNode, ErosionNode, OpeningNode, ClosingNode) ] # Image nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Image')]) for nd in (ConvertNode, FillNode, LabelNode, SetPixelSizeNode) ] # Arithmetics nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Arithmetics')]) for nd in (InvertNode, ApplyMaskNode, CreateMaskNode, OperatorPlusNode) ] # Measurement nodes [ self.fc_library.addNodeType(nd, [('dipImage', 'Measurement')]) for nd in (MeasureNode, WorkingDistanceCorrectionNode, CombineMeasurementNode) ] self.fc.setLibrary(self.fc_library) # Plot nodes and Widget connection plt_nodes_x = (-20 + x * 120 for x in range(len(self.plt_widg))) plt_nodes = [ self.fc.createNode('FlowchartPlot', pos=(x, -60)) for x in plt_nodes_x ] [ nd.set_fcPlotWidget(widg) for nd, widg in zip(plt_nodes, self.plt_widg) ] # Connecting plot and display widgets with nodes self.fc.sigFileLoaded.connect(self.setFlowchartPlotWidgets) self.fc.sigFileLoaded.connect(self.setDisplayWidgets) self.fc.sigChartChanged.connect(self.setFlowchartPlotWidgets) self.fc.sigChartChanged.connect(self.setDisplayWidgets) def setFlowchartPlotWidgets(self): """ Connect Flowchart plot widgets with nodes after loading fc file """ nd_list = [] for name, node in self.fc.nodes().items(): if isinstance(node, FlowchartPlotNode): nd_list.append(node) [nd.set_fcPlotWidget(widg) for nd, widg in zip(nd_list, self.plt_widg)] def setDisplayWidgets(self): """ Connect Display widgets with nodes """ for name, node in self.fc.nodes().items(): if isinstance(node, MeasurementDisplayNode): node.setDisplayWidget(self.disp_widg[0]) if isinstance(node, CalibDisplayNode): node.setDisplayWidget(self.disp_widg[1]) def setInput(self, dip_img): """ Set Flowchart input """ self.fc.setInput(dipImgIn=dip_img) def fc_process(self, dip_img): """ Process data with display=False (speed increase) """ return self.fc.process(dipImgIn=dip_img)['CalibConstOut'] def output(self): """ Process data through flowchart with display=True and return output """ return self.fc.output()['CalibConstOut'] def show(self): self.win.show() def close(self): self.win.hide()