summaryrefslogtreecommitdiff
path: root/src/frontEnd/Application.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontEnd/Application.py')
-rw-r--r--src/frontEnd/Application.py143
1 files changed, 48 insertions, 95 deletions
diff --git a/src/frontEnd/Application.py b/src/frontEnd/Application.py
index 795b5bf9..96be7ca4 100644
--- a/src/frontEnd/Application.py
+++ b/src/frontEnd/Application.py
@@ -12,12 +12,15 @@
# AUTHOR: Fahim Khan, fahim.elex@gmail.com
# MAINTAINED: Rahul Paknikar, rahulp@iitb.ac.in
# Sumanto Kar, sumantokar@iitb.ac.in
+# Pranav P, pranavsdreams@gmail.com
# ORGANIZATION: eSim Team at FOSSEE, IIT Bombay
# CREATED: Tuesday 24 February 2015
-# REVISION: Tuesday 13 September 2022
+# REVISION: Wednesday 07 June 2023
# =========================================================================
import os
+import sys
+import shutil
import traceback
if os.name == 'nt':
@@ -28,20 +31,16 @@ else:
init_path = '../../'
from PyQt5 import QtGui, QtCore, QtWidgets
+from PyQt5.Qt import QSize
from configuration.Appconfig import Appconfig
+from frontEnd import ProjectExplorer
+from frontEnd import Workspace
+from frontEnd import DockArea
from projManagement.openProject import OpenProjectInfo
from projManagement.newProject import NewProjectInfo
from projManagement.Kicad import Kicad
from projManagement.Validation import Validation
from projManagement import Worker
-from frontEnd import ProjectExplorer
-from frontEnd import Workspace
-from frontEnd import DockArea
-from PyQt5.Qt import QSize
-import shutil
-import time
-import sys
-import psutil
# Its our main window of application.
@@ -49,6 +48,7 @@ import psutil
class Application(QtWidgets.QMainWindow):
"""This class initializes all objects used in this file."""
global project_name
+ simulationEndSignal = QtCore.pyqtSignal(QtCore.QProcess.ExitStatus, int)
def __init__(self, *args):
"""Initialize main Application window."""
@@ -59,6 +59,9 @@ class Application(QtWidgets.QMainWindow):
# Flag for mode of operation. Default is set to offline mode.
self.online_flag = False
+ # Set slot for simulation end signal to plot simulation data
+ self.simulationEndSignal.connect(self.plotSimulationData)
+
# Creating require Object
self.obj_workspace = Workspace.Workspace()
self.obj_Mainview = MainView()
@@ -551,109 +554,59 @@ class Application(QtWidgets.QMainWindow):
print("Current Project is : ", self.obj_appconfig.current_project)
self.obj_Mainview.obj_dockarea.usermanual()
- def checkIfProcessRunning(self, processName):
- '''
- Check if there is any running process
- that contains the given name processName.
- '''
- # Iterate over the all the running process
- for proc in psutil.process_iter():
+ @QtCore.pyqtSlot(QtCore.QProcess.ExitStatus, int)
+ def plotSimulationData(self, exitCode, exitStatus):
+ """Enables interaction for new simulation and
+ displays the plotter dock where graphs can be plotted.
+ """
+ self.ngspice.setEnabled(True)
+ self.conversion.setEnabled(True)
+ self.closeproj.setEnabled(True)
+ self.wrkspce.setEnabled(True)
+
+ if exitStatus == QtCore.QProcess.NormalExit and exitCode == 0:
try:
- # Check if process name contains the given name string.
- if processName.lower() in proc.name().lower():
- return True
- except (psutil.NoSuchProcess,
- psutil.AccessDenied, psutil.ZombieProcess):
- pass
- return False
+ self.obj_Mainview.obj_dockarea.plottingEditor()
+ except Exception as e:
+ self.msg = QtWidgets.QErrorMessage()
+ self.msg.setModal(True)
+ self.msg.setWindowTitle("Error Message")
+ self.msg.showMessage(
+ 'Data could not be plotted. Please try again.'
+ )
+ self.msg.exec_()
+ print("Exception Message:", str(e), traceback.format_exc())
+ self.obj_appconfig.print_error('Exception Message : '
+ + str(e))
def open_ngspice(self):
"""This Function execute ngspice on current project."""
- self.projDir = self.obj_appconfig.current_project["ProjectName"]
+ projDir = self.obj_appconfig.current_project["ProjectName"]
- if self.projDir is not None:
+ if projDir is not None:
+ projName = os.path.basename(projDir)
+ ngspiceNetlist = os.path.join(projDir, projName + ".cir.out")
- # Edited by Sumanto Kar 25/08/2021
- if self.obj_Mainview.obj_dockarea.ngspiceEditor(
- self.projDir) is False:
+ if not os.path.isfile(ngspiceNetlist):
print(
"Netlist file (*.cir.out) not found."
)
-
self.msg = QtWidgets.QErrorMessage()
self.msg.setModal(True)
self.msg.setWindowTitle("Error Message")
self.msg.showMessage(
- 'Netlist file (*.cir.out) not found.'
+ 'Netlist (*.cir.out) not found.'
)
self.msg.exec_()
return
- currTime = time.time()
- count = 0
- while True:
- try:
- # if os.name == 'nt':
- # proc = 'mintty'
- # else:
- # proc = 'xterm'
-
- # Edited by Sumanto Kar 25/08/2021
- if os.name != 'nt' and \
- self.checkIfProcessRunning('xterm') is False:
- self.msg = QtWidgets.QErrorMessage()
- self.msg.setModal(True)
- self.msg.setWindowTitle("Warning Message")
- self.msg.showMessage(
- 'Simulation was interrupted/failed. '
- 'Please close all the Ngspice windows '
- 'and then rerun the simulation.'
- )
- self.msg.exec_()
- return
+ self.obj_Mainview.obj_dockarea.ngspiceEditor(
+ projName, ngspiceNetlist, self.simulationEndSignal)
- st = os.stat(os.path.join(self.projDir, "plot_data_i.txt"))
- if st.st_mtime >= currTime:
- break
- except Exception:
- pass
- time.sleep(1)
-
- # Fail Safe ===>
- count += 1
- if count >= 10:
- print(
- "Ngspice taking too long for simulation. "
- "Check netlist file (*.cir.out) "
- "to change simulation parameters."
- )
-
- self.msg = QtWidgets.QErrorMessage()
- self.msg.setModal(True)
- self.msg.setWindowTitle("Warning Message")
- self.msg.showMessage(
- 'Ngspice taking too long for simulation. '
- 'Check netlist file (*.cir.out) '
- 'to change simulation parameters.'
- )
- self.msg.exec_()
-
- return
-
- # Calling Python Plotting
- try:
- self.obj_Mainview.obj_dockarea.plottingEditor()
- except Exception as e:
- self.msg = QtWidgets.QErrorMessage()
- self.msg.setModal(True)
- self.msg.setWindowTitle("Error Message")
- self.msg.showMessage(
- 'Error while opening python plotting Editor.'
- ' Please look at console for more details.'
- )
- self.msg.exec_()
- print("Exception Message:", str(e), traceback.format_exc())
- self.obj_appconfig.print_error('Exception Message : ' + str(e))
+ self.ngspice.setEnabled(False)
+ self.conversion.setEnabled(False)
+ self.closeproj.setEnabled(False)
+ self.wrkspce.setEnabled(False)
else:
self.msg = QtWidgets.QErrorMessage()
@@ -756,7 +709,7 @@ class Application(QtWidgets.QMainWindow):
# Creating a command for Ngspice to Modelica converter
self.cmd1 = "
python3 ../ngspicetoModelica/NgspicetoModelica.py "\
- +self.ngspiceNetlist
+ + self.ngspiceNetlist
self.obj_workThread1 = Worker.WorkerThread(self.cmd1)
self.obj_workThread1.start()
if self.obj_validation.validateTool("OMEdit"):