From c8719353a3bbcf9b6f3aa20ff08b5ea3e6e1b885 Mon Sep 17 00:00:00 2001 From: sbosse Date: Wed, 28 Aug 2024 21:40:10 +0200 Subject: [PATCH] Wed 28 Aug 21:38:52 CEST 2024 --- src/SimNDT/gui/managerDialogsController.py | 516 +++++++++++++++++++++ 1 file changed, 516 insertions(+) create mode 100644 src/SimNDT/gui/managerDialogsController.py diff --git a/src/SimNDT/gui/managerDialogsController.py b/src/SimNDT/gui/managerDialogsController.py new file mode 100644 index 0000000..b5ae2e8 --- /dev/null +++ b/src/SimNDT/gui/managerDialogsController.py @@ -0,0 +1,516 @@ +__author__ = 'Miguel Molero' + + + +import os +import copy +import subprocess + +from PySide.QtCore import * +from PySide.QtGui import * + +from SimNDT.gui.newScenarioController import NewScenario +from SimNDT.gui.addEllipseController import AddEllipse +from SimNDT.gui.addRectangleController import AddRectangle +from SimNDT.gui.loadScenarioFromImageController import LoadScenarioFromImage +from SimNDT.gui.previewScenarioController import PreviewScenario + +from SimNDT.gui.materialSetupController import MaterialSetup +from SimNDT.gui.boundarySetupController import BoundarySetup +from SimNDT.gui.singleLaunchSetupController import SingleLaunchSetup +from SimNDT.gui.linearScanController import LinearScanSetup +from SimNDT.gui.tomographySetupController import TomographySetup + +from SimNDT.gui.simulationSetupController import SimulationSetup +from SimNDT.gui.checkSimulationController import CheckSimulation +from SimNDT.gui.runSimulationController import RunSimulation +from SimNDT.gui.engineController import EngineController +from SimNDT.gui.generateVideoController import GenerateVideo + +from SimNDT.gui.twoPhaseModelDryCaseController import TwoPhaseModelDryCaseDialog +from SimNDT.gui.threePhaseModelDryCaseController import ThreePhaseModelDryCaseDialog +from SimNDT.gui.twoPhaseModelImmersionCaseController import TwoPhaseModelImmersionCaseDialog +from SimNDT.gui.threePhaseModelImmersionCaseController import ThreePhaseModelImmersionCaseDialog + +from SimNDT.core.scenario import Scenario +from SimNDT.core.geometryObjects import Ellipse, Circle, Square, Rectangle +from SimNDT.core.simPack import SimPack +from SimNDT.core.receivers import Receivers + +from SimNDT.gui.snapshots import SnapShots +from SimNDT.gui.Warnings import WarningParms, DoneParms +from SimNDT.gui import HelperMethods + + +from SimNDT.core.concreteModel import TwoPhaseModel + + +import numpy as np + +def toIntList(stringList): + splitList = stringList.split(',') + if len(splitList)==1: + if splitList[0]=='': + splitList=[] # empty list + return [int(x) for x in splitList] + + +class ManagerDialogs(object): + lastSimulationSetup = dict( + isView = False, + color = 0, + dB = 60, + step = 100, + field = 3, + isReceiverPlot = False, + isEnableFields = False, + isEnableSignals = False, + isEnableImages = False, + isEnableNumPy = False, + isEnableVolume = False, + sensorShape = [], + sensorPlacement = [], + sensorSize = 0, + lastPath = '' + ) + + def newGeometryModel(self): + + dialog = NewScenario() + + if self.SimNDT_Scenario is not None: + dialog.widthLineEdit.setText(str(self.SimNDT_Scenario.Width)) + dialog.heightLineEdit.setText(str(self.SimNDT_Scenario.Height)) + dialog.pixelLineEdit.setText(str(self.SimNDT_Scenario.Pixel_mm)) + dialog.labelSpinBox.setValue(int(self.SimNDT_Scenario.Label)) + + if dialog.exec_(): + width = dialog.width + height = dialog.height + pixel = dialog.pixel + label = dialog.label + + self.SimNDT_Scenario = Scenario(width,height,pixel,label) + self.SimNDT_ObjectList = None + self.SimNDT_Check = False + + self.dirty = True + + + self.updateUI() + + + def addEllipse(self): + dlg = AddEllipse() + if dlg.exec_(): + centerX, centerY, major, minor, theta, label = dlg.getParms() + if self.SimNDT_Scenario: + try: + self.SimNDT_Scenario.addEllipse(centerX, centerY, major, minor, theta, label) + if major!=minor: + obj = Ellipse(centerX, centerY, major, minor, theta, label) + else: + obj = Circle(centerX,centerY, major, label) + + except Exception as e: + msg = WarningParms("Error in the object generation!!!. %s"%e) + msg.exec_() + return + + if self.SimNDT_ObjectList is None: + self.SimNDT_ObjectList = list() + self.SimNDT_ObjectList.append(obj) + + + self.dirty = True + self.updateUI() + + + def addRectangle(self): + + dlg = AddRectangle() + if dlg.exec_(): + centerX, centerY, width, height, theta, label = dlg.getParms() + if self.SimNDT_Scenario: + + try: + self.SimNDT_Scenario.addRectangle(centerX, centerY, width, height, theta, label) + if width!=height: + obj = Rectangle(centerX, centerY, width, height, theta, label) + else: + obj = Square(centerX,centerY, width, theta, label) + + except Exception as e: + msg = WarningParms("Error in the object generation!!!") + msg.exec_() + return + + if self.SimNDT_ObjectList is None: + self.SimNDT_ObjectList = list() + self.SimNDT_ObjectList.append(obj) + + self.dirty = True + self.updateUI() + + + + def loadImage(self): + + dlg = LoadScenarioFromImage(self.filename) + if dlg.exec_(): + + + M,N = np.shape(dlg.image_labeled) + Pixel = float(dlg.Pixel) + + Width = N/Pixel + Height = M/Pixel + + if self.SimNDT_Scenario is None: + self.SimNDT_Scenario = Scenario() + self.SimNDT_Scenario.setImage(dlg.image_labeled, Width, Height, Pixel, Label=0) + else: + self.SimNDT_Scenario.setImage(dlg.image_labeled, Width, Height, Pixel, Label=0) + + self.GraphicView.setupZoom(100) + self.statusBarWidget.zoomSpinBox.setValue(100) + + self.SimNDT_ObjectList = None + self.SimNDT_Boundaries = None + self.SimNDT_Check = False + + self.dirty = True + self.updateUI() + + + def previewScenario(self): + + dlg = PreviewScenario(self.SimNDT_Scenario, self) + dlg.show() + + + def rotateScenarioCounterClockwise(self): + + self.SimNDT_Scenario.rotate(direction="clockwise") + self.dirty = True + self.SimNDT_Check = False + self.updateUI() + + + def rotateScenarioClockwise(self): + self.SimNDT_Scenario.rotate(direction="counterclockwise") + self.dirty = True + self.SimNDT_Check = False + self.updateUI() + + + def materialSetup(self): + + dlg = MaterialSetup(self.SimNDT_Materials, filename = self.filename) + if dlg.exec_(): + self.SimNDT_Materials = copy.deepcopy(dlg.SimNDT_Materials) + self.dirty = True + + self.SimNDT_Check = False + self.updateUI() + + + def boundarySetup(self): + + dlg = BoundarySetup(self.SimNDT_Boundaries) + if dlg.exec_(): + self.SimNDT_Boundaries = copy.deepcopy(dlg.Boundaries) + self.SimNDT_Scenario.createBoundaries(self.SimNDT_Boundaries) + + self.dirty = True + self.SimNDT_Check = False + self.updateUI() + + + def singleLaunchSetup(self): + + dlg = SingleLaunchSetup(self.SimNDT_Scenario, self.SimNDT_Source, self.SimNDT_Inspection, self.SimNDT_Transducers, self.SimNDT_Signal) + if dlg.exec_(): + + self.SimNDT_Source = copy.deepcopy(dlg.Source) + self.SimNDT_Transducers = copy.deepcopy(dlg.Transducers) + self.SimNDT_Inspection = copy.deepcopy(dlg.Inspection) + self.SimNDT_Signal = copy.deepcopy(dlg.Signal) + + self.SimNDT_Check = False + self.dirty = True + self.updateUI() + + + def linearScanSetup(self): + dlg = LinearScanSetup(self.SimNDT_Scenario, self.SimNDT_Source, self.SimNDT_Inspection, self.SimNDT_Transducers, self.SimNDT_Signal) + if dlg.exec_(): + + self.SimNDT_Source = copy.deepcopy(dlg.Source) + self.SimNDT_Transducers = copy.deepcopy(dlg.Transducers) + self.SimNDT_Inspection = copy.deepcopy(dlg.Inspection) + self.SimNDT_Signal = copy.deepcopy(dlg.Signal) + + self.SimNDT_Check = False + self.dirty = True + self.updateUI() + + + def tomographySetup(self): + dlg = TomographySetup(self.SimNDT_Scenario, self.SimNDT_Source, self.SimNDT_Inspection, self.SimNDT_Transducers, self.SimNDT_Signal) + if dlg.exec_(): + + + self.SimNDT_Source = copy.deepcopy(dlg.Source) + self.SimNDT_Transducers = copy.deepcopy(dlg.Transducers) + self.SimNDT_Inspection = copy.deepcopy(dlg.Inspection) + self.SimNDT_Signal = copy.deepcopy(dlg.Signal) + + self.SimNDT_Check = False + self.dirty = True + self.updateUI() + + + + def signalSetup(self): + pass + + def simulationSetup(self): + + dlg = SimulationSetup(self.SimNDT_Scenario, self.SimNDT_Materials, + self.SimNDT_Transducers, self.SimNDT_Signal, + self.SimNDT_Simulation) + if dlg.exec_(): + + self.SimNDT_Simulation = copy.deepcopy(dlg.Simulation) + self.dirty = True + self.OpenSimFile = False + self.SimNDT_Check = False + self.updateUI() + + + def checkSimulation(self): + + dlg = CheckSimulation(self.SimNDT_Scenario, self.SimNDT_Materials, self.SimNDT_Boundaries, + self.SimNDT_Transducers, self.SimNDT_Inspection, self.SimNDT_Signal, self.SimNDT_Simulation) + + self.SimNDT_Check = False + + if dlg.exec_(): + self.SimNDT_Check = True + + self.SimNDT_Scenario = copy.deepcopy(dlg.Scenario) + self.SimNDT_Boundaries = copy.deepcopy(dlg.Boundaries) + self.SimNDT_Inspection = copy.deepcopy(dlg.Inspection) + self.dirty = True + self.OpenSimFile = False + self.updateUI() + + + def runSimulation(self): + self.SimNDT_Simulation.lastSimulationSetup = self.lastSimulationSetup + dlg = RunSimulation(self.filename, self.SimNDT_Simulation) + if dlg.exec_(): + + DB = dlg.visualizacionRangeSpinBox.value() + color = dlg.colormapComboBox.currentIndex() + field = dlg.fieldSelectorComboBox.currentIndex() + step = dlg.snapshotStepSpinBox.value() + isView = dlg.viewCheckBox.isChecked() + isReceiverPlot = dlg.receiverCheckBox.isChecked() + isEnableFields = dlg.enableSavingFieldsCheckBox.isChecked() + isEnableSignals = dlg.enableSavingSignalsCheckBox.isChecked() + isEnableImages = dlg.enableSavingImagesCheckBox.isChecked() + isEnableNumPy = dlg.enableSavingNumpyCheckBox.isChecked() + isEnableVolume = dlg.enableSavingVolumeCheckBox.isChecked() + sensorShape = toIntList(dlg.signalShapeLineEdit.text()) + sensorPlacement = toIntList(dlg.signalPlacementLineEdit.text()) + sensorSize = float(dlg.signalSizeLineEdit.text()) + lastPath = self.lastSimulationSetup["lastPath"] + self.lastSimulationSetup = dict( + isView = dlg.viewCheckBox.isChecked(), + color = color, + dB = DB, + step = step, + field = field, + isReceiverPlot = isReceiverPlot, + isEnableFields = isEnableFields, + isEnableSignals = isEnableSignals, + isEnableImages = isEnableImages, + isEnableNumPy = isEnableNumPy, + isEnableVolume = isEnableVolume, + sensorShape = sensorShape, + sensorPlacement = sensorPlacement, + sensorSize = sensorSize, + lastPath = lastPath + ) + if isView: + self.GraphicView.setColormap(color) + + if dlg.basename is not None: + self.SimNDT_SnapShots = SnapShots(True, Step=step, Filename = dlg.basename, dB = DB, + Color = color, + Field = field, + enableFields=isEnableFields, + enableSignals=isEnableSignals, + enableImages=isEnableImages, + enableNumPy=isEnableNumPy, + enableVolume=isEnableVolume, + enableView=isView, + sensorShape = sensorShape, + sensorPlacement = sensorPlacement, + sensorSize = sensorSize ) + else: + self.SimNDT_SnapShots = SnapShots(dB = DB, + enableFields=isEnableFields, + enableSignals=isEnableSignals, + enableImages=isEnableImages, + enableNumPy=isEnableNumPy, + enableVolume=isEnableVolume, + enableView=isView) + + + self.runEngine(isView, isReceiverPlot) + + + + def runEngine(self, isView=False, isReceiverPlot=False): + + + self.dirty = True + + self.menuFile.menuAction().setEnabled(False) + self.menuConfiguration.menuAction().setEnabled(False) + self.menuPlotting_Tools.menuAction().setEnabled(False) + self.menuTools.menuAction().setEnabled(False) + HelperMethods.setEnabled(self.fileMenuActions, False) + HelperMethods.setEnabled(self.geometryMenuActions, False) + HelperMethods.setEnabled(self.inspectionMenuActions, False) + HelperMethods.setEnabled(self.simulationMenuActions, False) + + + self.statusBarWidget.startSimulation(self.SimNDT_Simulation.TimeSteps) + + if isView: + self.statusBarWidget.viewOn() + else: + self.statusBarWidget.updateGeometryFrame() + + + simPack = SimPack(self.SimNDT_Scenario, self.SimNDT_Materials, self.SimNDT_Boundaries, + self.SimNDT_Inspection, self.SimNDT_Source, self.SimNDT_Transducers, self.SimNDT_Signal, + self.SimNDT_Simulation) + + engine = EngineController(simPack, isView, isReceiverPlot, self.statusBarWidget, self) + + + state = engine.run() + + + self.statusBarWidget.endSimulation() + + self.PauseSimulation = False + + if state == "Stop": + self.StopSimulation = False + self.status.showMessage("Stop by User!!!!!", 15000) + message = WarningParms("Stop by User!!!") + message.exec_() + else: + self.status.showMessage("Done", 15000) + message = DoneParms() + message.exec_() + + + + self.menuFile.menuAction().setEnabled(True) + self.menuConfiguration.menuAction().setEnabled(True) + self.menuPlotting_Tools.menuAction().setEnabled(True) + self.menuTools.menuAction().setEnabled(True) + HelperMethods.setEnabled(self.fileMenuActions, True) + HelperMethods.setEnabled(self.geometryMenuActions, True) + HelperMethods.setEnabled(self.inspectionMenuActions, True) + HelperMethods.setEnabled(self.simulationMenuActions, True) + + + self.setPlotInspectionsMenu() + self.SimNDT_Receivers = Receivers(self.SimNDT_Inspection.Name) + self.SimNDT_Receivers.setReceivers(engine) + + + def generateVideo(self): + + dlg = GenerateVideo() + dlg.exec_() + + + def twoPhaseModelDryCase(self): + + dlg = TwoPhaseModelDryCaseDialog(None, self.SimNDT_Scenario, self.SimNDT_ConcreteMicrostructure) + if dlg.exec_(): + + self.SimNDT_Scenario.I = dlg.image + self.SimNDT_Scenario.resetBoundary() + self.SimNDT_ObjectList = None + self.SimNDT_Check = False + self.dirty = True + + + self.SimNDT_ConcreteMicrostructure = dlg.concrete2PhaseObject + + + + + self.updateUI() + + + + + def threePhaseModelDryCase(self): + + dlg = ThreePhaseModelDryCaseDialog(None, self.SimNDT_Scenario, self.SimNDT_ConcreteMicrostructure) + if dlg.exec_(): + + self.SimNDT_Scenario.I = dlg.image + self.SimNDT_Scenario.resetBoundary() + self.SimNDT_ObjectList = None + self.SimNDT_Check = False + self.dirty = True + + self.SimNDT_ConcreteMicrostructure = dlg.concrete3PhaseObject + + self.updateUI() + + + def twoPhaseModelImmersionCase(self): + + dlg = TwoPhaseModelImmersionCaseDialog(None, self.SimNDT_Scenario, self.SimNDT_ConcreteMicrostructure) + if dlg.exec_(): + + self.SimNDT_Scenario.I = dlg.image + self.SimNDT_Scenario.resetBoundary() + self.SimNDT_ObjectList = None + self.SimNDT_Check = False + self.dirty = True + + self.SimNDT_ConcreteMicrostructure = dlg.concrete2PhaseObjectImmersion + + + self.updateUI() + + + def threePhaseModelImmersionCase(self): + + dlg = ThreePhaseModelImmersionCaseDialog(None, self.SimNDT_Scenario, self.SimNDT_ConcreteMicrostructure) + if dlg.exec_(): + + self.SimNDT_Scenario.I = dlg.image + self.SimNDT_Scenario.resetBoundary() + self.SimNDT_ObjectList = None + self.SimNDT_Check = False + self.dirty = True + + self.SimNDT_ConcreteMicrostructure = dlg.concrete3PhaseObjectImmersion + + self.updateUI() +