Wed 28 Aug 21:38:52 CEST 2024
This commit is contained in:
		
							parent
							
								
									0496c7c6ff
								
							
						
					
					
						commit
						e7516ce500
					
				
							
								
								
									
										836
									
								
								src/SimNDT/gui/MainWindow.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										836
									
								
								src/SimNDT/gui/MainWindow.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,836 @@ | ||||||
|  | import sys, os, datetime | ||||||
|  | import numpy as np | ||||||
|  | from scipy.io import savemat, loadmat | ||||||
|  | 
 | ||||||
|  | from PySide.QtCore import * | ||||||
|  | from PySide.QtGui import * | ||||||
|  | 
 | ||||||
|  | from SimNDT.gui.ui_mainwindow import Ui_MainWindow | ||||||
|  | 
 | ||||||
|  | from SimNDT.gui import HelperMethods | ||||||
|  | from SimNDT.gui import managerFile | ||||||
|  | 
 | ||||||
|  | from SimNDT.gui.managerDialogsController import ManagerDialogs | ||||||
|  | from SimNDT.gui.managerPlotsController import ManagerPlots | ||||||
|  | from SimNDT.gui.Warnings import WarningParms | ||||||
|  | from SimNDT.gui.checkOpenCL import isOpenCL | ||||||
|  | 
 | ||||||
|  | from SimNDT.gui.statusBarWidget import StatusBarWidget | ||||||
|  | from SimNDT.gui.treeWidget import TreeWidget | ||||||
|  | from SimNDT.gui.helpForm import HelpForm | ||||||
|  | 
 | ||||||
|  | from SimNDT.graphics.graphicView import GraphicView | ||||||
|  | 
 | ||||||
|  | from SimNDT.core.scenario import Scenario | ||||||
|  | from SimNDT.core.material import Material | ||||||
|  | from SimNDT.core.boundary import Boundary | ||||||
|  | from SimNDT.core.geometryObjects import Ellipse, Circle, Inclusions, Rectangle, Square | ||||||
|  | from SimNDT.core.geometryObjects import Concrete2Phase, Concrete2PhaseImmersion, Concrete3Phase, Concrete3PhaseImmersion | ||||||
|  | from SimNDT.core.inspectionMethods import Source, LinearScan, Transmission, PulseEcho, Tomography | ||||||
|  | from SimNDT.core.signal import Signals | ||||||
|  | from SimNDT.core.receivers import Receivers | ||||||
|  | from SimNDT.core.transducer import Transducer | ||||||
|  | from SimNDT.core.simulation import Simulation | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import jsonpickle | ||||||
|  | import math | ||||||
|  | 
 | ||||||
|  | YEAR = 2080 | ||||||
|  | MONTH = 12 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Info: | ||||||
|  |     def __init__(self): | ||||||
|  |         self.version = "0.63.2" | ||||||
|  |         self.date = "07-05-2024" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | info = Info() | ||||||
|  | 
 | ||||||
|  | class MainWindow(QMainWindow, Ui_MainWindow, ManagerDialogs, ManagerPlots): | ||||||
|  |     def __init__(self, parent=None): | ||||||
|  | 
 | ||||||
|  |         super(MainWindow, self).__init__(parent) | ||||||
|  |         self.setupUi(self) | ||||||
|  |         self.init() | ||||||
|  | 
 | ||||||
|  |         self.createMenus() | ||||||
|  |         self.createToolBar() | ||||||
|  |         self.setupGraphicView() | ||||||
|  |         self.setupStatusBar() | ||||||
|  |         self.tree() | ||||||
|  |         self.setupConnections() | ||||||
|  |         self.initSettings() | ||||||
|  | 
 | ||||||
|  |         isOpenCL(self.statusBarWidget.openclIcon, self.statusBarWidget.openclLabel) | ||||||
|  |         self.OnLicence() | ||||||
|  | 
 | ||||||
|  |         self.updateFileMenu() | ||||||
|  | 
 | ||||||
|  |         self.OpenSimFile = False | ||||||
|  |         QTimer.singleShot(0, self.loadInitialFile) | ||||||
|  | 
 | ||||||
|  |         if self.filename is None: | ||||||
|  |             self.initSim() | ||||||
|  | 
 | ||||||
|  |     def OnLicence(self): | ||||||
|  |         year = datetime.datetime.today().year | ||||||
|  |         month = datetime.datetime.today().month | ||||||
|  |         if year >= YEAR and month >= MONTH: | ||||||
|  |             dial = WarningParms('Get the new version!!!!, please contact to: sbosse@uni-bremen.de') | ||||||
|  |             if dial.exec_(): | ||||||
|  |                 self.close() | ||||||
|  |                 sys.exit() | ||||||
|  | 
 | ||||||
|  |     def createObjects(self): | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_Scenario = None | ||||||
|  |         self.SimNDT_ObjectList = None | ||||||
|  |         self.SimNDT_Materials = None | ||||||
|  |         self.SimNDT_Boundaries = None | ||||||
|  |         self.SimNDT_Transducers = None | ||||||
|  |         self.SimNDT_Inspection = None | ||||||
|  |         self.SimNDT_Source = None | ||||||
|  |         self.SimNDT_Signal = None | ||||||
|  |         self.SimNDT_Simulation = None | ||||||
|  |         self.SimNDT_Receivers = None | ||||||
|  |         self.SimNDT_SnapShots = None | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_ConcreteMicrostructure = None | ||||||
|  | 
 | ||||||
|  |     def setupConnections(self): | ||||||
|  |         self.actionNew_Geometry_Model.triggered.connect(self.newGeometryModel) | ||||||
|  |         self.actionPreview_Labeled_Scenario.triggered.connect(self.previewScenario) | ||||||
|  |         self.actionAdd_Ellipse.triggered.connect(self.addEllipse) | ||||||
|  |         self.actionAdd_Rectangle.triggered.connect(self.addRectangle) | ||||||
|  |         self.actionShow_Scenario.triggered.connect(self.showScenario) | ||||||
|  |         self.actionLoad_Scenario_From_Image.triggered.connect(self.loadImage) | ||||||
|  |         self.actionRotate_The_Scenario_90_Clockwise.triggered.connect(self.rotateScenarioClockwise) | ||||||
|  |         self.actionRotate_The_Scenario_90_Counter_Clockwise.triggered.connect(self.rotateScenarioCounterClockwise) | ||||||
|  | 
 | ||||||
|  |         self.actionTwo_Phase_Model_Dry_Case.triggered.connect(self.twoPhaseModelDryCase) | ||||||
|  |         self.actionThree_Phase_Model_Dry_Case.triggered.connect(self.threePhaseModelDryCase) | ||||||
|  |         self.actionTwo_Phase_Model_Immersion_Case.triggered.connect(self.twoPhaseModelImmersionCase) | ||||||
|  |         self.actionThree_Phase_Model_Immersion_Case.triggered.connect(self.threePhaseModelImmersionCase) | ||||||
|  | 
 | ||||||
|  |         self.actionMaterials_Setup.triggered.connect(self.materialSetup) | ||||||
|  |         self.actionBoundaty_Conditions_Setup.triggered.connect(self.boundarySetup) | ||||||
|  |         self.actionSingle_Launch_Inspection.triggered.connect(self.singleLaunchSetup) | ||||||
|  |         self.actionLinear_Scan_Inspections.triggered.connect(self.linearScanSetup) | ||||||
|  |         self.actionTomography_Inspections.triggered.connect(self.tomographySetup) | ||||||
|  |         self.actionSignal.triggered.connect(self.signalSetup) | ||||||
|  |         self.actionSimulation_Setup.triggered.connect(self.simulationSetup) | ||||||
|  |         self.actionCheck_Simulation_Setup.triggered.connect(self.checkSimulation) | ||||||
|  |         self.actionRun_Simulation.triggered.connect(self.runSimulation) | ||||||
|  | 
 | ||||||
|  |         self.actionPlot_Receiver_Signals_SingleLaunch.triggered.connect(self.plotSingleLaunch) | ||||||
|  |         self.actionPlot_Receiver_Signals_Spectra.triggered.connect(self.spectraSingleLaunch) | ||||||
|  |         self.actionPlot_Receivers_Signals_LinearScan.triggered.connect(self.plotLinearScan) | ||||||
|  |         self.actionPlot_Receivers_Signals_Tomography.triggered.connect(self.plotTomoSignals) | ||||||
|  | 
 | ||||||
|  |         self.actionCreate_Video_from_Images.triggered.connect(self.generateVideo) | ||||||
|  | 
 | ||||||
|  |         self.GraphicView.refreshZoom.zoomed.connect(self.statusBarWidget.zoomSpinBox.setValue) | ||||||
|  | 
 | ||||||
|  |     def init(self): | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_Info = Info() | ||||||
|  |         self.SimNDT_Check = False | ||||||
|  | 
 | ||||||
|  |         self.dirty = False | ||||||
|  |         self.reset = False | ||||||
|  |         self.filename = None | ||||||
|  |         self.recentFiles = [] | ||||||
|  | 
 | ||||||
|  |         self.StopSimulation = False | ||||||
|  |         self.PauseSimulation = False | ||||||
|  | 
 | ||||||
|  |         self.setGeometry(100, 100, 900, 600) | ||||||
|  |         self.setMinimumSize(400, 400) | ||||||
|  | 
 | ||||||
|  |         self.setWindowTitle('SimNDT2 v' + self.SimNDT_Info.version) | ||||||
|  |         self.setWindowFlags(self.windowFlags()) | ||||||
|  | 
 | ||||||
|  |     def setTitle(self, fname): | ||||||
|  |         title = os.path.basename(fname) | ||||||
|  |         self.setWindowTitle('SimNDT2 v' + self.SimNDT_Info.version + ': ' + title) | ||||||
|  | 
 | ||||||
|  |     def loadInitialFile(self): | ||||||
|  |         settings = QSettings() | ||||||
|  |         fname = settings.value("LastFile") | ||||||
|  |         if fname and QFile.exists(fname): | ||||||
|  |             self.loadFile(fname) | ||||||
|  | 
 | ||||||
|  |     def createMenus(self): | ||||||
|  | 
 | ||||||
|  |         newFileAction = HelperMethods.createAction(self, "&New Simulation", self.fileNew, | ||||||
|  |                                                    QKeySequence.New, "document-new.png", self.tr("New Simulation File")) | ||||||
|  |         fileOpenAction = HelperMethods.createAction(self, "&Open existing Simulation", self.fileOpen, | ||||||
|  |                                                     QKeySequence.Open, 'document-open.png', | ||||||
|  |                                                     self.tr("Open an existing Simulation")) | ||||||
|  |         fileSaveAction = HelperMethods.createAction(self, "&Save Simulation", self.fileSave, | ||||||
|  |                                                     QKeySequence.Save, "document-save.png", | ||||||
|  |                                                     self.tr("Save the current Simulation")) | ||||||
|  |         fileSaveAsAction = HelperMethods.createAction(self, "Save &As", self.fileSaveAs, | ||||||
|  |                                                       QKeySequence.SaveAs, icon="document-save-as.png", | ||||||
|  |                                                       tip=self.tr("Save Simulation File As")) | ||||||
|  | 
 | ||||||
|  |         fileOpenAction.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon)) | ||||||
|  |         # fileSaveAction.setIcon(self.style().standardIcon(QStyle.SP_FileDialogNewFolder)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         fileImportJSONAction = HelperMethods.createAction(self, "&Import from .json", self.importJSON, | ||||||
|  |                                                     QKeySequence.Open, 'document-open.png', | ||||||
|  |                                                     self.tr("Import .json Simulation")) | ||||||
|  |         fileExportJSONAction = HelperMethods.createAction(self, "Export in .json File", self.exportJSON, | ||||||
|  |                                                             "Ctrl+J", icon="exportMatlab.png", | ||||||
|  |                                                             tip=self.tr("Export in .json File")) | ||||||
|  | 
 | ||||||
|  |         fileExportMatlabAction = HelperMethods.createAction(self, "Export in .mat File", self.exportMatlab, | ||||||
|  |                                                             "Ctrl+E", icon="exportMatlab.png", | ||||||
|  |                                                             tip=self.tr("Export in .mat File")) | ||||||
|  | 
 | ||||||
|  |         fileResetAction = HelperMethods.createAction(self, "Reset Settings", self.resetSettings, icon="reset.png") | ||||||
|  | 
 | ||||||
|  |         fileQuitAction = HelperMethods.createAction(self, "&Quit", self.close, | ||||||
|  |                                                     "Ctrl+Q", "close", self.tr("Close the application")) | ||||||
|  | 
 | ||||||
|  |         self.fileMenuActions = (newFileAction, fileOpenAction, | ||||||
|  |                                 fileSaveAction, fileSaveAsAction, fileImportJSONAction, fileExportJSONAction, fileExportMatlabAction, None, fileResetAction, | ||||||
|  |                                 fileQuitAction) | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.fileMenuActions[2:4], False) | ||||||
|  |         HelperMethods.setEnabled(self.fileMenuActions[5:6], False) | ||||||
|  |         self.connect(self.menuFile, SIGNAL("aboutToShow()"), self.updateFileMenu) | ||||||
|  | 
 | ||||||
|  |         self.geometryMenuActions = ( | ||||||
|  |         self.actionNew_Geometry_Model, None, self.actionAdd_Ellipse, self.actionAdd_Rectangle, | ||||||
|  |         self.actionShow_Scenario, None, self.actionShow_Scenario, | ||||||
|  |         self.actionLoad_Scenario_From_Image, None, self.actionPreview_Labeled_Scenario, | ||||||
|  |         self.actionRotate_The_Scenario_90_Clockwise, self.actionRotate_The_Scenario_90_Counter_Clockwise) | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.menuNew_Simulation_Scenario, False) | ||||||
|  |         HelperMethods.setEnabled(self.geometryMenuActions, False) | ||||||
|  | 
 | ||||||
|  |         self.configurationMenuActions = (self.actionMaterials_Setup, self.actionBoundaty_Conditions_Setup) | ||||||
|  |         HelperMethods.setEnabled(self.configurationMenuActions, False) | ||||||
|  | 
 | ||||||
|  |         self.inspectionMenuActions = ( | ||||||
|  |         self.actionSingle_Launch_Inspection, self.actionLinear_Scan_Inspections, self.actionTomography_Inspections) | ||||||
|  |         inspectionGroup = QActionGroup(self) | ||||||
|  |         HelperMethods.addActions(inspectionGroup, self.inspectionMenuActions) | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.menuInspection_Setup, False) | ||||||
|  |         HelperMethods.setEnabled(self.actionSimulation_Setup, False) | ||||||
|  |         HelperMethods.setEnabled(self.actionCheck_Simulation_Setup, False) | ||||||
|  |         HelperMethods.setEnabled(self.actionRun_Simulation, False) | ||||||
|  | 
 | ||||||
|  |         self.actionSignal = HelperMethods.createAction(self, "&Signal Setup", self.signalSetup, | ||||||
|  |                                                        "Ctrl+Shift+p", "signal.png", self.tr("Signal Setup")) | ||||||
|  | 
 | ||||||
|  |         self.simulationMenuActions = (self.actionNew_Geometry_Model, self.actionMaterials_Setup, | ||||||
|  |                                       self.actionBoundaty_Conditions_Setup, self.actionSingle_Launch_Inspection, | ||||||
|  |                                       self.actionLinear_Scan_Inspections, self.actionTomography_Inspections, | ||||||
|  |                                       self.actionSimulation_Setup, self.actionCheck_Simulation_Setup, | ||||||
|  |                                       self.actionRun_Simulation) | ||||||
|  | 
 | ||||||
|  |         self.menuPlotting_Tools.menuAction().setVisible(False) | ||||||
|  | 
 | ||||||
|  |         # self.menuAdd_Microstructure.menuAction().setVisible(False) | ||||||
|  |         # self.menuTools.menuAction().setVisible(False) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         helpAboutAction = HelperMethods.createAction(self, "&About SimNDT", self.helpAbout) | ||||||
|  |         helpHelpAction = HelperMethods.createAction(self, self.tr("&Help"), self.helpHelp, QKeySequence.HelpContents) | ||||||
|  | 
 | ||||||
|  |         helpMenu = self.menubar.addMenu(self.tr("&Help")) | ||||||
|  |         HelperMethods.addActions(helpMenu, (helpAboutAction, helpHelpAction)) | ||||||
|  | 
 | ||||||
|  |     def updateFileMenu(self): | ||||||
|  | 
 | ||||||
|  |         self.menuFile.clear() | ||||||
|  |         HelperMethods.addActions(self.menuFile, self.fileMenuActions[0:-2]) | ||||||
|  |         current = self.filename if self.filename is not None else None | ||||||
|  |         recentFiles = [] | ||||||
|  | 
 | ||||||
|  |         for fname in self.recentFiles: | ||||||
|  |             if fname != current and QFile.exists(fname): | ||||||
|  |                 recentFiles.append(fname) | ||||||
|  |         if recentFiles: | ||||||
|  |             self.menuFile.addSeparator() | ||||||
|  |             for i, fname in enumerate(recentFiles): | ||||||
|  |                 action = QAction(QIcon(":/logo_SimNDT.png"), "&%d %s" % ( | ||||||
|  |                     i + 1, QFileInfo(fname).fileName()), self) | ||||||
|  |                 action.setData(fname) | ||||||
|  |                 self.connect(action, SIGNAL("triggered()"), | ||||||
|  |                              self.loadFile) | ||||||
|  |                 self.menuFile.addAction(action) | ||||||
|  | 
 | ||||||
|  |         self.menuFile.addSeparator() | ||||||
|  |         self.menuFile.addAction(self.fileMenuActions[-2]) | ||||||
|  |         self.menuFile.addAction(self.fileMenuActions[-1]) | ||||||
|  | 
 | ||||||
|  |     def okToContinue(self): | ||||||
|  | 
 | ||||||
|  |         if self.dirty: | ||||||
|  |             reply = QMessageBox.question(self, | ||||||
|  |                                          "SimNDT - Unsaved Changes", | ||||||
|  |                                          "Save unsaved changes?", | ||||||
|  |                                          QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) | ||||||
|  | 
 | ||||||
|  |             if reply == QMessageBox.Cancel: | ||||||
|  |                 return False | ||||||
|  |             elif reply == QMessageBox.Yes: | ||||||
|  |                 self.fileSave() | ||||||
|  |         return True | ||||||
|  | 
 | ||||||
|  |     def loadFile(self, fname=None): | ||||||
|  | 
 | ||||||
|  |         if fname is None: | ||||||
|  |             action = self.sender() | ||||||
|  |             if isinstance(action, QAction): | ||||||
|  |                 fname = action.data() | ||||||
|  |                 if not self.okToContinue(): | ||||||
|  |                     return | ||||||
|  |             else: | ||||||
|  |                 return | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             self.filename = None | ||||||
|  |             self.addRecentFile(fname) | ||||||
|  |             self.filename = fname | ||||||
|  |             self.dirty = False | ||||||
|  |             HelperMethods.setEnabled(self.fileMenuActions[2:4], True) | ||||||
|  |             HelperMethods.setEnabled(self.fileMenuActions[5:6], True) | ||||||
|  |             self.setTitle(fname) | ||||||
|  |             if fname.endswith('.json'): | ||||||
|  |               self.importSim(fname) | ||||||
|  |             else: | ||||||
|  |               self.openSim() | ||||||
|  | 
 | ||||||
|  |     def addRecentFile(self, fname): | ||||||
|  | 
 | ||||||
|  |         if fname is None: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         if not self.recentFiles.count(fname): | ||||||
|  |             self.recentFiles.insert(0, fname) | ||||||
|  |             while len(self.recentFiles) > 9: | ||||||
|  |                 self.recentFiles.pop() | ||||||
|  | 
 | ||||||
|  |     def createToolBar(self): | ||||||
|  | 
 | ||||||
|  |         self.fileToolBar = self.addToolBar("File Tools") | ||||||
|  |         self.fileToolBar.setObjectName("FileToolBar") | ||||||
|  |         HelperMethods.addActions(self.fileToolBar, self.fileMenuActions[:-2]) | ||||||
|  | 
 | ||||||
|  |     def simulationToolBar(self, numWidgets): | ||||||
|  | 
 | ||||||
|  |         if not hasattr(self, 'SimToolBar'): | ||||||
|  |             self.SimToolBar = QToolBar(self.tr("Simulation Tools")) | ||||||
|  |             self.SimToolBar.setObjectName("SimToolBar") | ||||||
|  |             self.SimToolBar.setAllowedAreas( | ||||||
|  |                 Qt.TopToolBarArea | Qt.BottomToolBarArea | Qt.LeftToolBarArea | Qt.RightToolBarArea) | ||||||
|  | 
 | ||||||
|  |         self.SimToolBar.clear() | ||||||
|  |         HelperMethods.addActions(self.SimToolBar, self.simulationMenuActions[0:numWidgets]) | ||||||
|  |         self.addToolBar(Qt.TopToolBarArea, self.SimToolBar) | ||||||
|  | 
 | ||||||
|  |     def geometryToolBar(self, reset=False, LoadImage=False): | ||||||
|  |         if not hasattr(self, 'GeometryToolBar'): | ||||||
|  |             self.GeometryToolBar = QToolBar(self.tr("Geometry Tools")) | ||||||
|  |             self.GeometryToolBar.setObjectName("GeometryToolBar") | ||||||
|  |             self.GeometryToolBar.setAllowedAreas( | ||||||
|  |                 Qt.TopToolBarArea | Qt.BottomToolBarArea | Qt.LeftToolBarArea | Qt.RightToolBarArea) | ||||||
|  | 
 | ||||||
|  |         self.GeometryToolBar.clear() | ||||||
|  |         if LoadImage: | ||||||
|  |             HelperMethods.addActions(self.GeometryToolBar, self.geometryMenuActions[4]) | ||||||
|  |             self.addToolBar(Qt.RightToolBarArea, self.GeometryToolBar) | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         if reset: | ||||||
|  |             return | ||||||
|  |         else: | ||||||
|  |             HelperMethods.addActions(self.GeometryToolBar, self.geometryMenuActions[2:]) | ||||||
|  |             # self.addToolBarBreak(Qt.TopToolBarArea) | ||||||
|  |             self.addToolBar(Qt.RightToolBarArea, self.GeometryToolBar) | ||||||
|  | 
 | ||||||
|  |     def setupGraphicView(self): | ||||||
|  | 
 | ||||||
|  |         self.GraphicView = GraphicView(self) | ||||||
|  |         self.setCentralWidget(self.GraphicView) | ||||||
|  | 
 | ||||||
|  |     def setupStatusBar(self): | ||||||
|  | 
 | ||||||
|  |         self.status = self.statusBar() | ||||||
|  |         self.status.setSizeGripEnabled(False) | ||||||
|  | 
 | ||||||
|  |         self.statusBarWidget = StatusBarWidget() | ||||||
|  |         self.connect(self.statusBarWidget.zoomSpinBox, SIGNAL("valueChanged(int)"), self.GraphicView, | ||||||
|  |                      SLOT("setZoom(int)")) | ||||||
|  | 
 | ||||||
|  |         self.status.insertPermanentWidget(0, self.statusBarWidget.statusFrame) | ||||||
|  |         self.status.showMessage("Ready", 15000) | ||||||
|  | 
 | ||||||
|  |         self.connect(self.statusBarWidget.StopStatusBar, SIGNAL("clicked()"), self.stopFunc) | ||||||
|  |         self.connect(self.statusBarWidget.StartPauseStatusBar, SIGNAL("clicked()"), self.startPauseFunc) | ||||||
|  | 
 | ||||||
|  |         self.StopSimulation = False | ||||||
|  |         self.PauseSimulation = False | ||||||
|  | 
 | ||||||
|  |     def tree(self): | ||||||
|  | 
 | ||||||
|  |         self.treeWidget = TreeWidget() | ||||||
|  |         self.treeDockWidget = QDockWidget(self.tr("Simulation Parameters")) | ||||||
|  |         self.treeDockWidget.setObjectName("treeDockWidget") | ||||||
|  |         self.treeDockWidget.setWidget(self.treeWidget) | ||||||
|  |         self.treeDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) | ||||||
|  | 
 | ||||||
|  |         self.treeWidget.deleteDone.sig.connect(self.updateUI) | ||||||
|  | 
 | ||||||
|  |     def initSettings(self): | ||||||
|  | 
 | ||||||
|  |         settings = QSettings() | ||||||
|  |         self.recentFiles = [] # settings.value("RecentFiles",[]) | ||||||
|  |         size = settings.value("MainWindow/Size", QSize(900, 600)) | ||||||
|  |         position = settings.value("MainWindow/Position", QPoint(50, 50)) | ||||||
|  |         self.restoreState(settings.value("MainWindow/State")) | ||||||
|  |         zoom = float(settings.value("Graphics/Zoom", 100.0)) | ||||||
|  | 
 | ||||||
|  |         if self.recentFiles is None: | ||||||
|  |             self.recentFiles = [] | ||||||
|  | 
 | ||||||
|  |         self.resize(size) | ||||||
|  |         self.move(position) | ||||||
|  | 
 | ||||||
|  |         # self.GraphicView.setupZoom(zoom) | ||||||
|  |         self.statusBarWidget.zoomSpinBox.setValue(zoom) | ||||||
|  | 
 | ||||||
|  |     def resetSettings(self): | ||||||
|  | 
 | ||||||
|  |         settings = QSettings() | ||||||
|  |         settings.clear() | ||||||
|  |         self.reset = True | ||||||
|  |         self.close() | ||||||
|  | 
 | ||||||
|  |     def fileNew(self): | ||||||
|  | 
 | ||||||
|  |         if not self.okToContinue(): | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.fileNew(self.filename) | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             HelperMethods.setEnabled(self.fileMenuActions[2:4], True) | ||||||
|  |             self.filename = fname | ||||||
|  |             self.dirty = True | ||||||
|  |             self.setTitle(fname) | ||||||
|  |             self.newSim() | ||||||
|  | 
 | ||||||
|  |     def fileOpen(self): | ||||||
|  | 
 | ||||||
|  |         if not self.okToContinue(): | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.fileOpen(self.filename) | ||||||
|  |         if fname: | ||||||
|  |             self.loadFile(fname) | ||||||
|  | 
 | ||||||
|  |     def fileSave(self): | ||||||
|  | 
 | ||||||
|  |         if self.filename is None: | ||||||
|  |             self.fileSaveAs() | ||||||
|  |         else: | ||||||
|  |             self.dirty = False | ||||||
|  |             self.saveSim() | ||||||
|  | 
 | ||||||
|  |     def fileSaveAs(self): | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.fileSaveAs(self.filename) | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             if "." not in fname: | ||||||
|  |                 fname += ".sim" | ||||||
|  | 
 | ||||||
|  |             self.addRecentFile(fname) | ||||||
|  |             self.filename = fname | ||||||
|  |             self.setTitle(self.filename) | ||||||
|  |             self.saveSim() | ||||||
|  | 
 | ||||||
|  |     def importJSON(self): | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.importJSON(self.filename) | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             if "." not in fname: | ||||||
|  |                 fname += ".json" | ||||||
|  | 
 | ||||||
|  |             self.importSim(fname) | ||||||
|  | 
 | ||||||
|  |     def exportMatlab(self): | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.exportMatlab(self.filename) | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             if "." not in fname: | ||||||
|  |                 fname += ".mat" | ||||||
|  | 
 | ||||||
|  |             self.exportSimulation(fname) | ||||||
|  | 
 | ||||||
|  |     def exportJSON(self): | ||||||
|  | 
 | ||||||
|  |         fname = managerFile.exportJSON(self.filename) | ||||||
|  | 
 | ||||||
|  |         if fname: | ||||||
|  |             if "." not in fname: | ||||||
|  |                 fname += ".json" | ||||||
|  | 
 | ||||||
|  |             self.exportSimulation(fname) | ||||||
|  | 
 | ||||||
|  |     def initSim(self): | ||||||
|  | 
 | ||||||
|  |         self.createObjects() | ||||||
|  |         self.treeWidget.clear() | ||||||
|  | 
 | ||||||
|  |         self.statusBarWidget.zoomSpinBox.setVisible(False) | ||||||
|  |         self.GraphicView.clearUpdate() | ||||||
|  |         self.removeDockWidget(self.treeDockWidget) | ||||||
|  | 
 | ||||||
|  |     def newSim(self): | ||||||
|  | 
 | ||||||
|  |         self.initSim() | ||||||
|  | 
 | ||||||
|  |         self.simulationToolBar(1) | ||||||
|  |         self.geometryToolBar(reset=True) | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.menuNew_Simulation_Scenario, True) | ||||||
|  |         HelperMethods.setEnabled(self.geometryMenuActions[0], True) | ||||||
|  |         HelperMethods.setEnabled(self.geometryMenuActions[4], True) | ||||||
|  | 
 | ||||||
|  |         # Show loadImage in Geometric Toolbar | ||||||
|  |         self.geometryToolBar(LoadImage=True) | ||||||
|  |         self.updateUI() | ||||||
|  | 
 | ||||||
|  |     def openSim(self): | ||||||
|  |         data2load = {} | ||||||
|  |         data2load = loadmat(self.filename, squeeze_me=True, struct_as_record=False) | ||||||
|  | 
 | ||||||
|  |         self.OpenSimFile = True | ||||||
|  |         if "Info" in data2load: | ||||||
|  |             self.SimNDT_Info = HelperMethods.mat2Obj(data2load["Info"], Info()) | ||||||
|  | 
 | ||||||
|  |         if "Scenario" in data2load: | ||||||
|  |             Width = getattr(data2load["Scenario"], 'Width') | ||||||
|  |             Height = getattr(data2load["Scenario"], 'Height') | ||||||
|  |             Pixel_mm = getattr(data2load["Scenario"], 'Pixel_mm') | ||||||
|  |             Label = getattr(data2load["Scenario"], 'Label') | ||||||
|  |             self.SimNDT_Scenario = Scenario(Width=Width, Height=Height, Pixel_mm=Pixel_mm, Label=Label) | ||||||
|  |             self.SimNDT_Scenario = HelperMethods.mat2Obj(data2load["Scenario"], self.SimNDT_Scenario) | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_Materials = HelperMethods.loadDataFromList(data2load, 'Materials', Material()) | ||||||
|  |         self.SimNDT_Boundaries = HelperMethods.loadDataFromList(data2load, "Boundaries", Boundary()) | ||||||
|  |         self.SimNDT_Transducers = HelperMethods.loadDataFromList(data2load, "Transducers", Transducer()) | ||||||
|  | 
 | ||||||
|  |         geoLabels = ["ellipse", "circle", "square", "rectangle"] | ||||||
|  |         geoObjects = [Ellipse(), Circle(), Square(), Rectangle()] | ||||||
|  |         self.SimNDT_ObjectList = HelperMethods.loadDataFromListWithLabels(data2load, 'GeometricObjects', geoLabels, | ||||||
|  |                                                                           geoObjects) | ||||||
|  | 
 | ||||||
|  |         ConcreteLabels = ["Concrete2Phase", "Concrete2PhaseImmersion", "Concrete3Phase", "Concrete3PhaseImmersion"] | ||||||
|  |         ConcreteObjects = [Concrete2Phase(), Concrete2PhaseImmersion(), Concrete3Phase(), Concrete3PhaseImmersion()] | ||||||
|  | 
 | ||||||
|  |         if "ConcreteMicrostructure" in data2load: | ||||||
|  |             self.SimNDT_ConcreteMicrostructure = HelperMethods.loadDataWithLabels(data2load, 'ConcreteMicrostructure', | ||||||
|  |                                                                                   ConcreteLabels, ConcreteObjects) | ||||||
|  | 
 | ||||||
|  |         if "Inspection" in data2load: | ||||||
|  |             inspLabels = ['Transmission', 'PulseEcho', 'LinearScan', 'Tomography'] | ||||||
|  |             inspObjects = [Transmission(), PulseEcho(), LinearScan(), Tomography()] | ||||||
|  |             self.SimNDT_Inspection = HelperMethods.loadDataWithLabels(data2load, "Inspection", inspLabels, inspObjects) | ||||||
|  | 
 | ||||||
|  |         if "Source" in data2load: | ||||||
|  |             self.SimNDT_Source = HelperMethods.mat2Obj(data2load["Source"], Source()) | ||||||
|  | 
 | ||||||
|  |         if "Signal" in data2load: | ||||||
|  |             self.SimNDT_Signal = HelperMethods.mat2Obj(data2load["Signal"], Signals()) | ||||||
|  | 
 | ||||||
|  |         if "Simulation" in data2load: | ||||||
|  |             self.SimNDT_Simulation = HelperMethods.mat2Obj(data2load["Simulation"], Simulation()) | ||||||
|  | 
 | ||||||
|  |         if "Receivers" in data2load: | ||||||
|  |             self.SimNDT_Receivers = HelperMethods.mat2Obj(data2load["Receivers"], Receivers()) | ||||||
|  | 
 | ||||||
|  |             self.setPlotInspectionsMenu() | ||||||
|  | 
 | ||||||
|  |         self.updateUI() | ||||||
|  | 
 | ||||||
|  |     def importSim(self,filename): | ||||||
|  |         data2load = {} | ||||||
|  |         with open(filename, 'r') as file: | ||||||
|  |           data2load = jsonpickle.decode(file.read()) # loadmat(self.filename, squeeze_me=True, struct_as_record=False) | ||||||
|  | 
 | ||||||
|  |         self.OpenSimFile = True | ||||||
|  |         self.filename = filename | ||||||
|  |          | ||||||
|  |         if "Info" in data2load: | ||||||
|  |             self.SimNDT_Info = data2load["Info"] | ||||||
|  | 
 | ||||||
|  |         if "Scenario" in data2load: | ||||||
|  |             Width = getattr(data2load["Scenario"], 'Width') | ||||||
|  |             Height = getattr(data2load["Scenario"], 'Height') | ||||||
|  |             Pixel_mm = getattr(data2load["Scenario"], 'Pixel_mm') | ||||||
|  |             Label = getattr(data2load["Scenario"], 'Label') | ||||||
|  |             self.SimNDT_Scenario = Scenario(Width=Width, Height=Height, Pixel_mm=Pixel_mm, Label=Label) | ||||||
|  |             self.SimNDT_Scenario = data2load["Scenario"] | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_Materials = data2load['Materials'] | ||||||
|  |         self.SimNDT_Boundaries = data2load["Boundaries"] | ||||||
|  |         self.SimNDT_Transducers = data2load["Transducers"] | ||||||
|  |          | ||||||
|  |         self.SimNDT_ObjectList = data2load['GeometricObjects'] | ||||||
|  |          | ||||||
|  |         if "Inspection" in data2load: | ||||||
|  |             self.SimNDT_Inspection = data2load["Inspection"] | ||||||
|  | 
 | ||||||
|  |         if "Source" in data2load: | ||||||
|  |             self.SimNDT_Source = data2load["Source"] | ||||||
|  | 
 | ||||||
|  |         if "Signal" in data2load: | ||||||
|  |             self.SimNDT_Signal = data2load["Signal"] | ||||||
|  | 
 | ||||||
|  |         if "Simulation" in data2load: | ||||||
|  |             self.SimNDT_Simulation = data2load["Simulation"] | ||||||
|  | 
 | ||||||
|  |         if "Receivers" in data2load: | ||||||
|  |             self.SimNDT_Receivers = data2load["Receivers"] | ||||||
|  | 
 | ||||||
|  |             self.setPlotInspectionsMenu() | ||||||
|  | 
 | ||||||
|  |         self.updateUI() | ||||||
|  | 
 | ||||||
|  |     def saveSim(self): | ||||||
|  |         self._saveSimulation(self.filename) | ||||||
|  | 
 | ||||||
|  |     def exportSimulation(self, filename): | ||||||
|  |         self._saveSimulation(filename) | ||||||
|  | 
 | ||||||
|  |     def _saveSimulation(self, filename): | ||||||
|  | 
 | ||||||
|  |         data2save = {} | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Info is not None: | ||||||
|  |             data2save['Info'] = self.SimNDT_Info | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Scenario is not None: | ||||||
|  |             data2save['Scenario'] = self.SimNDT_Scenario | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_ObjectList is not None: | ||||||
|  |             data2save["GeometricObjects"] = self.SimNDT_ObjectList | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_ConcreteMicrostructure is not None: | ||||||
|  |             data2save["ConcreteMicrostructure"] = self.SimNDT_ConcreteMicrostructure | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Materials is not None: | ||||||
|  |             data2save["Materials"] = self.SimNDT_Materials | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Boundaries is not None: | ||||||
|  |             data2save["Boundaries"] = self.SimNDT_Boundaries | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Transducers is not None: | ||||||
|  |             data2save["Transducers"] = self.SimNDT_Transducers | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Inspection is not None: | ||||||
|  |             data2save["Inspection"] = self.SimNDT_Inspection | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Source is not None: | ||||||
|  |             data2save["Source"] = self.SimNDT_Source | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Signal is not None: | ||||||
|  |             data2save["Signal"] = self.SimNDT_Signal | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Simulation is not None: | ||||||
|  |             data2save["Simulation"] = self.SimNDT_Simulation | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Receivers is not None: | ||||||
|  |             data2save["Receivers"] = self.SimNDT_Receivers | ||||||
|  | 
 | ||||||
|  |         if filename.endswith('.json'): | ||||||
|  |           # savemat('/tmp/_simndt.mat', data2save, appendmat=False) | ||||||
|  |           # mat2json('/tmp/_simndt.mat',filename) | ||||||
|  |           with open(filename, 'w') as f: | ||||||
|  |             f.write(jsonpickle.encode(data2save)) | ||||||
|  |         else: | ||||||
|  |           savemat(filename, data2save, appendmat=False) | ||||||
|  |         self.dirty = False | ||||||
|  | 
 | ||||||
|  |     def stopFunc(self): | ||||||
|  |         self.StopSimulation = True | ||||||
|  | 
 | ||||||
|  |     def startPauseFunc(self): | ||||||
|  |         self.PauseSimulation = not self.PauseSimulation | ||||||
|  |         if self.PauseSimulation: | ||||||
|  |             self.statusBarWidget.StartPauseStatusBar.setIcon(QIcon(":/play.png")) | ||||||
|  |         else: | ||||||
|  |             self.statusBarWidget.StartPauseStatusBar.setIcon(QIcon(":/pause.png")) | ||||||
|  | 
 | ||||||
|  |     def helpAbout(self): | ||||||
|  | 
 | ||||||
|  |         QMessageBox.about(self, "About SimNDT", | ||||||
|  |                           """ <b> SimNDT </b> v{0}X, date: {1} | ||||||
|  |                               <p> Copyright © 2014 M. Molero (original author v0.52) </p> | ||||||
|  |                               <p> Copyright © 2024 Dr. Stefan Bosse (> 0.60) </p> | ||||||
|  |                               <p> Ultrasonic Simulation Software - Plus | ||||||
|  |                               <p> info: | ||||||
|  |                               <p> sbosse@uni-bremen.de | ||||||
|  |                               <p> | ||||||
|  |                               <p> | ||||||
|  |                               <p> if you use SimNDT Software in your research, we would appreciate the citation of the following article: | ||||||
|  |                               <p> M. Molero, U. Iturraran-Viveros, S. Sofia, M.G. Hernandez, | ||||||
|  |                               <p> Optimized OpenCL implementation of the Elastodynamic Finite Integration Technique for viscoelastic media, | ||||||
|  |                               <p> Computer Physics Communications Volume 185, Issue 10, October 2014, Pages 2683-2696 | ||||||
|  |                           """.format(info.version, info.date)) | ||||||
|  | 
 | ||||||
|  |     def helpHelp(self): | ||||||
|  | 
 | ||||||
|  |         dlg = HelpForm("index.html", self) | ||||||
|  |         dlg.show() | ||||||
|  | 
 | ||||||
|  |     def closeEvent(self, event): | ||||||
|  | 
 | ||||||
|  |         if self.reset: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         if self.okToContinue(): | ||||||
|  |             settings = QSettings() | ||||||
|  |             filename = self.filename if self.filename is not None else None | ||||||
|  |             settings.setValue("LastFile", filename) | ||||||
|  |             recentFiles = self.recentFiles if self.recentFiles else None | ||||||
|  |             settings.setValue("RecentFiles", recentFiles) | ||||||
|  |             settings.setValue("MainWindow/Size", self.size()) | ||||||
|  |             settings.setValue("MainWindow/Position", self.pos()) | ||||||
|  |             settings.setValue("MainWindow/State", self.saveState()) | ||||||
|  |             settings.setValue("Graphics/Zoom", self.GraphicView.getZoom()) | ||||||
|  | 
 | ||||||
|  |         else: | ||||||
|  |             event.ignore() | ||||||
|  | 
 | ||||||
|  |     def setPlotInspectionsMenu(self): | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.actionPlot_Receiver_Signals_SingleLaunch, False) | ||||||
|  |         HelperMethods.setEnabled(self.actionPlot_Receiver_Signals_Spectra, False) | ||||||
|  | 
 | ||||||
|  |         HelperMethods.setEnabled(self.actionPlot_Receivers_Signals_LinearScan, False) | ||||||
|  |         HelperMethods.setEnabled(self.actionPlot_Receivers_Signals_Tomography, False) | ||||||
|  | 
 | ||||||
|  |         Name = self.SimNDT_Inspection.Name | ||||||
|  |         if Name == "Transmission" or Name == "PulseEcho": | ||||||
|  |             self.menuPlotting_Tools.menuAction().setVisible(True) | ||||||
|  |             HelperMethods.setEnabled(self.actionPlot_Receiver_Signals_SingleLaunch, True) | ||||||
|  |         elif Name == "LinearScan": | ||||||
|  |             self.menuPlotting_Tools.menuAction().setVisible(True) | ||||||
|  |             HelperMethods.setEnabled(self.actionPlot_Receivers_Signals_LinearScan, True) | ||||||
|  |         elif Name == 'Tomography': | ||||||
|  |             self.menuPlotting_Tools.menuAction().setVisible(True) | ||||||
|  |             HelperMethods.setEnabled(self.actionPlot_Receivers_Signals_Tomography, True) | ||||||
|  | 
 | ||||||
|  |     def updateUI(self): | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Scenario is not None: | ||||||
|  |             try: | ||||||
|  |                 self.GraphicView.imshow(self.SimNDT_Scenario.I) | ||||||
|  |             except Exception as e: | ||||||
|  |                 msgBox = WarningParms("Unable to display GRAPHICS!!!. Incompatible Graphic Card, %s" % e) | ||||||
|  |                 if msgBox.exec_(): | ||||||
|  |                     sys.exit() | ||||||
|  | 
 | ||||||
|  |             HelperMethods.setEnabled(self.menuNew_Simulation_Scenario, True) | ||||||
|  |             HelperMethods.setEnabled(self.fileMenuActions[2:5], True) | ||||||
|  |             HelperMethods.setEnabled(self.geometryMenuActions[0:], True) | ||||||
|  |             HelperMethods.setEnabled(self.configurationMenuActions[0], True) | ||||||
|  | 
 | ||||||
|  |             self.addDockWidget(Qt.LeftDockWidgetArea, self.treeDockWidget) | ||||||
|  |             self.treeDockWidget.show() | ||||||
|  | 
 | ||||||
|  |             self.geometryToolBar() | ||||||
|  |             self.simulationToolBar(2) | ||||||
|  |             self.statusBarWidget.zoomSpinBox.setVisible(True) | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Materials is not None: | ||||||
|  |             HelperMethods.setEnabled(self.configurationMenuActions[1], True) | ||||||
|  |             self.simulationToolBar(3) | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Boundaries is not None: | ||||||
|  |             if np.size(self.SimNDT_Scenario.Iabs) == 1:                 | ||||||
|  |                 self.GraphicView.imshow(self.SimNDT_Scenario.Iabs) | ||||||
|  |             else: | ||||||
|  |                 self.GraphicView.imshow(self.SimNDT_Scenario.Iabs) | ||||||
|  |             HelperMethods.setEnabled(self.menuInspection_Setup, True) | ||||||
|  |             HelperMethods.setEnabled(self.inspectionMenuActions[:], True) | ||||||
|  |             self.simulationToolBar(6) | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Inspection is not None: | ||||||
|  |             HelperMethods.setEnabled(self.simulationMenuActions[6], True) | ||||||
|  |             self.simulationToolBar(7) | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Simulation is not None: | ||||||
|  |             HelperMethods.setEnabled(self.simulationMenuActions[7], True) | ||||||
|  |             self.simulationToolBar(8) | ||||||
|  | 
 | ||||||
|  |         if self.SimNDT_Check: | ||||||
|  |             HelperMethods.setEnabled(self.actionRun_Simulation, True) | ||||||
|  |             if not self.OpenSimFile: | ||||||
|  |                 self.simulationToolBar(9) | ||||||
|  | 
 | ||||||
|  |         self.treeWidget.update(self.SimNDT_Scenario, | ||||||
|  |                                self.SimNDT_ObjectList, | ||||||
|  |                                self.SimNDT_Materials, | ||||||
|  |                                self.SimNDT_Boundaries, | ||||||
|  |                                self.SimNDT_Inspection, | ||||||
|  |                                self.SimNDT_Source, | ||||||
|  |                                self.SimNDT_Transducers, | ||||||
|  |                                self.SimNDT_Signal, | ||||||
|  |                                self.SimNDT_Simulation) | ||||||
|  |     def showScenario(self): | ||||||
|  |         self.SimNDT_Scenario.resetImage() | ||||||
|  | 
 | ||||||
|  |         for obj in self.SimNDT_ObjectList: | ||||||
|  |             self.SimNDT_Scenario.addObject(obj) | ||||||
|  |    | ||||||
|  |         if self.SimNDT_Boundaries is not None:   | ||||||
|  |           self.SimNDT_Scenario.createBoundaries(self.SimNDT_Boundaries)       | ||||||
|  | 
 | ||||||
|  |         self.updateUI() | ||||||
|  |         # @blab+ Add transducer as circle and show I/Iabs copy | ||||||
|  |         I=self.SimNDT_Scenario.addTransducer(self.SimNDT_Scenario.Width/2+self.SimNDT_Transducers[0].CenterOffset, | ||||||
|  |                                self.SimNDT_Transducers[0].BorderOffset,  | ||||||
|  |                                self.SimNDT_Transducers[0].Size, 240) | ||||||
|  |         if self.SimNDT_SnapShots is not None: | ||||||
|  |           if len(self.SimNDT_SnapShots.sensorShape) == 2: | ||||||
|  |             xn = self.SimNDT_Scenario.Width | ||||||
|  |             yn = self.SimNDT_Scenario.Height | ||||||
|  |             dx = 1 # sensor delta | ||||||
|  |             dy = 1 | ||||||
|  |             ox = 0 # offset | ||||||
|  |             oy = 0 | ||||||
|  |             # size of sensor matrix | ||||||
|  |             sx = self.SimNDT_SnapShots.sensorShape[0] | ||||||
|  |             sy = self.SimNDT_SnapShots.sensorShape[1] | ||||||
|  |             S = np.zeros([sy,sx]) | ||||||
|  |             if len(self.SimNDT_SnapShots.sensorPlacement) == 4: | ||||||
|  |               p=self.SimNDT_SnapShots.sensorPlacement | ||||||
|  |               ox=p[0] | ||||||
|  |               dx=p[1] | ||||||
|  |               oy=p[2] | ||||||
|  |               dy=p[3] | ||||||
|  |             else: | ||||||
|  |               ox=dx=round(xn/(sx+1.0)) | ||||||
|  |               oy=dy=round(yn/(sy+1.0)) | ||||||
|  |             for x in range(0,sx): | ||||||
|  |               for y in range(0,sy): | ||||||
|  |                 self.SimNDT_Scenario.addSensor(I,ox+x*dx,oy+y*dy,10, 255) | ||||||
|  |         self.GraphicView.clearUpdate() | ||||||
|  |         self.GraphicView.imshow(I) | ||||||
|  |          | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user