summaryrefslogtreecommitdiff
path: root/src/ngspiceSimulation/pythonPlotting.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ngspiceSimulation/pythonPlotting.py')
-rw-r--r--src/ngspiceSimulation/pythonPlotting.py746
1 files changed, 746 insertions, 0 deletions
diff --git a/src/ngspiceSimulation/pythonPlotting.py b/src/ngspiceSimulation/pythonPlotting.py
new file mode 100644
index 00000000..295c0a1d
--- /dev/null
+++ b/src/ngspiceSimulation/pythonPlotting.py
@@ -0,0 +1,746 @@
+from __future__ import division # Used for decimal division eg 2/3=0.66 and not '0' 6/2=3.0 and 6//2=3
+import os
+from PyQt4 import QtGui, QtCore
+from decimal import Decimal,getcontext
+from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
+from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
+from matplotlib.figure import Figure
+from configuration.Appconfig import Appconfig
+import numpy as np
+
+class plotWindow(QtGui.QMainWindow):
+ def __init__(self,fpath,projectName):
+ QtGui.QMainWindow.__init__(self)
+ self.fpath = fpath
+ self.projectName = projectName
+ self.obj_appconfig = Appconfig()
+ print "Complete Project Path : ",self.fpath
+ print "Project Name : ",self.projectName
+ self.obj_appconfig.print_info('Ngspice simulation is called : ' + self.fpath)
+ self.obj_appconfig.print_info('PythonPlotting is called : ' + self.fpath)
+ self.combo = []
+ self.combo1 = []
+ self.combo1_rev = []
+ #Creating Frame
+ self.createMainFrame()
+
+ def createMainFrame(self):
+ self.mainFrame = QtGui.QWidget()
+ self.dpi = 100
+ self.fig = Figure((7.0, 7.0), dpi=self.dpi)
+ #Creating Canvas which will figure
+ self.canvas = FigureCanvas(self.fig)
+ self.canvas.setParent(self.mainFrame)
+ self.axes = self.fig.add_subplot(111)
+ self.navToolBar = NavigationToolbar(self.canvas, self.mainFrame)
+
+ #LeftVbox hold navigation tool bar and canvas
+ self.left_vbox = QtGui.QVBoxLayout()
+ self.left_vbox.addWidget(self.navToolBar)
+ self.left_vbox.addWidget(self.canvas)
+
+ #right VBOX is main Layout which hold right grid(bottom part) and top grid(top part)
+ self.right_vbox = QtGui.QVBoxLayout()
+ self.right_grid = QtGui.QGridLayout()
+ self.top_grid = QtGui.QGridLayout()
+
+ #Get DataExtraction Details
+ self.obj_dataext = DataExtraction()
+ self.plotType = self.obj_dataext.openFile(self.fpath)
+
+ self.obj_dataext.computeAxes()
+ self.a = self.obj_dataext.numVals()
+
+ self.chkbox=[]
+
+ ########### Generating list of colors :
+ self.full_colors = ['r','b','g','y','c','m','k']#,(0.4,0.5,0.2),(0.1,0.4,0.9),(0.4,0.9,0.2),(0.9,0.4,0.9)]
+ self.color = []
+ for i in range(0,self.a[0]-1):
+ if i%7 == 0:
+ self.color.append(self.full_colors[0])
+ elif (i-1)%7 == 0:
+ self.color.append(self.full_colors[1])
+ elif (i-2)%7 == 0:
+ self.color.append(self.full_colors[2])
+ elif (i-3)%7 == 0:
+ self.color.append(self.full_colors[3])
+ elif (i-4)%7 == 0:
+ self.color.append(self.full_colors[4])
+ elif (i-5)%7 == 0:
+ self.color.append(self.full_colors[5])
+ elif (i-6)%7 == 0:
+ self.color.append(self.full_colors[6])
+
+ ###########Color generation ends here
+
+
+ #Total number of voltage source
+ self.volts_length = self.a[1]
+ self.analysisType = QtGui.QLabel()
+ self.top_grid.addWidget(self.analysisType,0,0)
+ self.listNode = QtGui.QLabel()
+ self.top_grid.addWidget(self.listNode,1,0)
+ self.listBranch = QtGui.QLabel()
+ self.top_grid.addWidget(self.listBranch,self.a[1]+2,0)
+ for i in range(0,self.a[1]):#a[0]-1
+ self.chkbox.append(QtGui.QCheckBox(self.obj_dataext.NBList[i]))
+ self.chkbox[i].setStyleSheet('color')
+ self.chkbox[i].setToolTip('<b>Check To Plot</b>' )
+ self.top_grid.addWidget(self.chkbox[i],i+2,0)
+ self.colorLab = QtGui.QLabel()
+ self.colorLab.setText('____')
+ self.colorLab.setStyleSheet(self.colorName(self.color[i])+'; font-weight = bold;')
+ self.top_grid.addWidget(self.colorLab,i+2,1)
+
+ for i in range(self.a[1],self.a[0]-1):#a[0]-1
+ self.chkbox.append(QtGui.QCheckBox(self.obj_dataext.NBList[i]))
+ self.chkbox[i].setToolTip('<b>Check To Plot</b>' )
+ self.top_grid.addWidget(self.chkbox[i],i+3,0)
+ self.colorLab = QtGui.QLabel()
+ self.colorLab.setText('____')
+ self.colorLab.setStyleSheet(self.colorName(self.color[i])+'; font-weight = bold;')
+ self.top_grid.addWidget(self.colorLab,i+3,1)
+
+ self.clear = QtGui.QPushButton("Clear")
+ self.warnning = QtGui.QLabel()
+ self.funcName = QtGui.QLabel()
+ self.funcExample = QtGui.QLabel()
+
+ self.plotbtn = QtGui.QPushButton("Plot")
+ self.plotbtn.setToolTip('<b>Press</b> to Plot' )
+ self.multimeterbtn = QtGui.QPushButton("Multimeter")
+ self.multimeterbtn.setToolTip('<b>RMS</b> value of the current and voltage is displayed' )
+ self.text = QtGui.QLineEdit()
+ self.funcLabel = QtGui.QLabel()
+ self.palette1 = QtGui.QPalette()
+ self.palette2 = QtGui.QPalette()
+ self.plotfuncbtn = QtGui.QPushButton("Plot Function")
+ self.plotfuncbtn.setToolTip('<b>Press</b> to Plot the function' )
+
+ self.palette1.setColor(QtGui.QPalette.Foreground,QtCore.Qt.blue)
+ self.palette2.setColor(QtGui.QPalette.Foreground,QtCore.Qt.red)
+ self.funcName.setPalette(self.palette1)
+ self.funcExample.setPalette(self.palette2)
+
+ self.right_vbox.addLayout(self.top_grid)
+ self.right_vbox.addWidget(self.plotbtn)
+ self.right_vbox.addWidget(self.multimeterbtn)
+
+ self.right_grid.addWidget(self.funcLabel,1,0)
+ self.right_grid.addWidget(self.text,1,1)
+ self.right_grid.addWidget(self.plotfuncbtn,2,1)
+ self.right_grid.addWidget(self.clear,2,0)
+ self.right_grid.addWidget(self.warnning,3,0)
+ self.right_grid.addWidget(self.funcName,4,0)
+ self.right_grid.addWidget(self.funcExample,4,1)
+ self.right_vbox.addLayout(self.right_grid)
+
+ self.hbox = QtGui.QHBoxLayout()
+ self.hbox.addLayout(self.left_vbox)
+ self.hbox.addLayout(self.right_vbox)
+
+ self.widget = QtGui.QWidget()
+ self.widget.setLayout(self.hbox)#finalvbox
+ self.scrollArea = QtGui.QScrollArea()
+ self.scrollArea.setWidgetResizable(True)
+ self.scrollArea.setWidget(self.widget)
+
+ self.finalhbox = QtGui.QHBoxLayout()
+ self.finalhbox.addWidget(self.scrollArea)
+
+ self.mainFrame.setLayout(self.finalhbox)
+ self.showMaximized()
+
+ self.listNode.setText("<font color='indigo'>List of Nodes:</font>")
+ self.listBranch.setText("<font color='indigo'>List of Branches:</font>")
+ self.funcLabel.setText("<font color='indigo'>Function:</font>")
+ self.funcName.setText("<font color='indigo'>Standard functions</font>\
+ <br><br>Addition:<br>Subtraction:<br>Multiplication:<br>Division:<br>Comparison:")
+ self.funcExample.setText("\n\nNode1 + Node2\nNode1 - Node2\nNode1 * Node2\nNode1 / Node2\nNode1 vs Node2")
+
+ #Connecting to plot and clear function
+ self.connect(self.clear,QtCore.SIGNAL('clicked()'),self.pushedClear)
+ self.connect(self.plotfuncbtn,QtCore.SIGNAL('clicked()'), self.pushedPlotFunc)
+ self.connect(self.multimeterbtn,QtCore.SIGNAL('clicked()'), self.multiMeter)
+
+
+ if self.plotType[0]==0:
+ self.analysisType.setText("<b>AC Analysis</b>")
+ if self.plotType[1]==1:
+ self.connect(self.plotbtn, QtCore.SIGNAL('clicked()'), self.onPush_decade)
+ else:
+ self.connect(self.plotbtn, QtCore.SIGNAL('clicked()'), self.onPush_ac)
+
+ elif self.plotType[0]==1:
+ self.analysisType.setText("<b>Transient Analysis</b>")
+ self.connect(self.plotbtn, QtCore.SIGNAL('clicked()'), self.onPush_trans)
+
+ else:
+ self.analysisType.setText("<b>DC Analysis</b>")
+ self.connect(self.plotbtn, QtCore.SIGNAL('clicked()'), self.onPush_dc)
+
+ self.setCentralWidget(self.mainFrame)
+
+ def pushedClear(self):
+ self.text.clear()
+ self.axes.cla()
+ self.canvas.draw()
+ QtCore.SLOT('quit()')
+
+ def pushedPlotFunc(self):
+ self.parts = str(self.text.text())
+ self.parts = self.parts.split(" ")
+
+ if self.parts[len(self.parts)-1] == '':
+ self.parts = self.parts[0:-1]
+
+ self.values = self.parts
+ self.comboAll = []
+ self.axes.cla()
+
+ self.plotType2 = self.obj_dataext.openFile(self.fpath)
+
+ if len(self.parts) <= 2:
+ self.warnning.setText("Too few arguments!\nRefer syntax below!")
+ QtGui.QMessageBox.about(self, "Warning!!", "Too Few Arguments/SYNTAX Error!\n Refer Examples")
+ else:
+ self.warnning.setText("")
+
+ a = []
+ finalResult = []
+ p = 0
+
+ for i in range(len(self.parts)):
+ #print "I",i
+ if i%2 == 0:
+ #print "I'm in:"
+ for j in range(len(self.obj_dataext.NBList)):
+ if self.parts[i]==self.obj_dataext.NBList[j]:
+ #print "I got you:",self.parts[i]
+ a.append(j)
+
+ if len(a) != len(self.parts)//2 + 1:
+ QtGui.QMessageBox.about(self, "Warning!!", "One of the operands doesn't belong to the above list of Nodes!!")
+
+ for i in a:
+ self.comboAll.append(self.obj_dataext.y[i])
+
+
+ for i in range(len(a)):
+
+ if a[i] == len(self.obj_dataext.NBList):
+ QtGui.QMessageBox.about(self, "Warning!!", "One of the operands doesn't belong to the above list!!")
+ self.warnning.setText("<font color='red'>To Err Is Human!<br>One of the operands doesn't belong to the above list!!</font>")
+
+ if self.parts[1] == 'vs':
+ if len(self.parts) > 3:
+ self.warnning.setText("Enter two operands only!!")
+ QtGui.QMessageBox.about(self, "Warning!!", "Recheck the expression syntax!")
+
+ else:
+ self.axes.cla()
+
+ for i in range(len(self.obj_dataext.y[a[0]])):
+ self.combo.append(self.obj_dataext.y[a[0]][i])
+ self.combo1.append(self.obj_dataext.y[a[1]][i])
+
+ self.axes.plot(self.combo,self.combo1,c=self.color[1],label=str(2))#_rev
+
+ if max(a) < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ self.axes.set_xlabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+ self.axes.set_ylabel('Current(I)-->')
+
+ elif max(a) >= self.volts_length and min(a) < self.volts_length:
+ QtGui.QMessageBox.about(self, "Warning!!", "Do not combine Voltage and Current!!")
+
+ else:
+ for j in range(len(self.comboAll[0])):
+ for i in range(len(self.values)):
+ if i%2==0:
+ self.values[i] = str(self.comboAll[i//2][j])
+ re = " ".join(self.values[:])
+ try:
+ finalResult.append(eval(re))
+ except ArithmeticError:
+ QtGui.QMessageBox.about(self, "Warning!!", "Dividing by zero!!")
+
+ if self.plotType2[0]==0:
+ #self.setWindowTitle('AC Analysis')
+ if self.plotType2[1]==1:
+ self.axes.semilogx(self.obj_dataext.x,finalResult,c=self.color[0],label=str(1))
+ else:
+ self.axes.plot(self.obj_dataext.x,finalResult,c=self.color[0],label=str(1))
+
+ self.axes.set_xlabel('freq-->')
+
+ if max(a) < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+
+ elif self.plotType2[0]==1:
+ #self.setWindowTitle('Transient Analysis')
+ self.axes.plot(self.obj_dataext.x,finalResult,c=self.color[0],label=str(1))
+ self.axes.set_xlabel('time-->')
+ if max(a) < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+
+ else:
+ #self.setWindowTitle('DC Analysis')
+ self.axes.plot(self.obj_dataext.x,finalResult,c=self.color[0],label=str(1))
+ self.axes.set_xlabel('I/P Voltage-->')
+ if max(a) < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+
+
+ self.axes.grid(True)
+ self.canvas.draw()
+ self.combo = []
+ self.combo1 = []
+ self.combo1_rev = []
+
+
+
+
+ def onPush_decade(self):
+ #print "Calling on push Decade"
+ boxCheck = 0
+ self.axes.cla()
+
+ for i,j in zip(self.chkbox,range(len(self.chkbox))):
+ if i.isChecked():
+ boxCheck += 1
+ self.axes.semilogx(self.obj_dataext.x,self.obj_dataext.y[j],c=self.color[j],label=str(j+1))
+ self.axes.set_xlabel('freq-->')
+ if j < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+
+ self.axes.grid(True)
+ if boxCheck == 0:
+ QtGui.QMessageBox.about(self, "Warning!!","Please select at least one Node OR Branch")
+ self.canvas.draw()
+
+
+ def onPush_ac(self):
+ self.axes.cla()
+ boxCheck = 0
+ for i,j in zip(self.chkbox,range(len(self.chkbox))):
+ if i.isChecked():
+ boxCheck += 1
+ self.axes.plot(self.obj_dataext.x,self.obj_dataext.y[j],c=self.color[j],label=str(j+1))
+ self.axes.set_xlabel('freq-->')
+ if j < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+ self.axes.grid(True)
+ if boxCheck == 0:
+ QtGui.QMessageBox.about(self, "Warning!!","Please select at least one Node OR Branch")
+ self.canvas.draw()
+
+ def onPush_trans(self):
+ self.axes.cla()
+ boxCheck = 0
+ for i,j in zip(self.chkbox,range(len(self.chkbox))):
+ if i.isChecked():
+ boxCheck += 1
+ self.axes.plot(self.obj_dataext.x,self.obj_dataext.y[j],c=self.color[j],label=str(j+1))
+ self.axes.set_xlabel('time-->')
+ if j < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+ self.axes.grid(True)
+ if boxCheck == 0:
+ QtGui.QMessageBox.about(self, "Warning!!","Please select at least one Node OR Branch")
+ self.canvas.draw()
+
+
+ def onPush_dc(self):
+ boxCheck = 0
+ self.axes.cla()
+ for i,j in zip(self.chkbox,range(len(self.chkbox))):
+ if i.isChecked():
+ boxCheck += 1
+ self.axes.plot(self.obj_dataext.x,self.obj_dataext.y[j],c=self.color[j],label=str(j+1))
+ self.axes.set_xlabel('Voltage Sweep(V)-->')
+
+ if j < self.volts_length:
+ self.axes.set_ylabel('Voltage(V)-->')
+ else:
+ self.axes.set_ylabel('Current(I)-->')
+ self.axes.grid(True)
+ if boxCheck == 0:
+ QtGui.QMessageBox.about(self,"Warning!!", "Please select atleast one Node OR Branch")
+ self.canvas.draw()
+
+ def colorName(self,letter):
+ return {
+ 'r':'color:red',
+ 'b':'color:blue',
+ 'g':'color:green',
+ 'y':'color:yellow',
+ 'c':'color:cyan',
+ 'm':'color:magenta',
+ 'k':'color:black'
+ }[letter]
+
+ def multiMeter(self):
+ print "Function : MultiMeter"
+ self.obj = {}
+ boxCheck = 0
+ loc_x = 300
+ loc_y = 300
+
+ for i,j in zip(self.chkbox,range(len(self.chkbox))):
+ if i.isChecked():
+ print "Check box",self.obj_dataext.NBList[j]
+ boxCheck += 1
+ if self.obj_dataext.NBList[j] in self.obj_dataext.NBIList:
+ voltFlag = False
+ else:
+ voltFlag = True
+ #Initializing Multimeter
+ self.obj[j] = MultimeterWidgetClass(self.obj_dataext.NBList[j],self.getRMSValue(self.obj_dataext.y[j]),loc_x,loc_y,voltFlag)
+ loc_x += 50
+ loc_y += 50
+ ## Adding object of multimeter to dictionary
+ self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(self.obj[j])
+
+ if boxCheck == 0:
+ QtGui.QMessageBox.about(self, "Warning!!","Please select at least one Node OR Branch")
+
+
+ def getRMSValue(self,dataPoints):
+ getcontext().prec = 5
+ return np.sqrt(np.mean(np.square(dataPoints)))
+
+class MultimeterWidgetClass(QtGui.QWidget):
+ def __init__(self,node_branch,rmsValue,loc_x,loc_y,voltFlag):
+ QtGui.QWidget.__init__(self)
+
+ self.multimeter = QtGui.QWidget(self)
+ if voltFlag:
+ self.node_branchLabel = QtGui.QLabel("Node")
+ self.rmsValue = QtGui.QLabel(str(rmsValue)+" Volts")
+ else:
+ self.node_branchLabel = QtGui.QLabel("Branch")
+ self.rmsValue = QtGui.QLabel(str(rmsValue)+" Amp")
+
+ self.rmsLabel = QtGui.QLabel("RMS Value")
+ self.nodeBranchValue = QtGui.QLabel(str(node_branch))
+
+
+ self.layout = QtGui.QGridLayout(self)
+ self.layout.addWidget(self.node_branchLabel,0,0)
+ self.layout.addWidget(self.rmsLabel,0,1)
+ self.layout.addWidget(self.nodeBranchValue,1,0)
+ self.layout.addWidget(self.rmsValue,1,1)
+
+ self.multimeter.setLayout(self.layout)
+ self.setGeometry(loc_x,loc_y,200,100)
+ self.setGeometry(loc_x,loc_y,300,100)
+ self.setWindowTitle("MultiMeter")
+ self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
+ self.show()
+
+
+class DataExtraction:
+ def __init__(self):
+ self.obj_appconfig = Appconfig()
+ self.data=[] #consists of all the columns of data belonging to nodes and branches
+ self.y=[] #stores y-axis data
+ self.x=[] #stores x-axis data
+
+
+ def numberFinder(self,fpath):
+ #Opening ANalysis file
+ with open(os.path.join(fpath,"analysis")) as f3:
+ self.analysisInfo = f3.read()
+ self.analysisInfo = self.analysisInfo.split(" ")
+
+
+ #Reading data file for voltage
+ with open(os.path.join(fpath,"plot_data_v.txt")) as f2:
+ self.voltData = f2.read()
+
+ self.voltData = self.voltData.split("\n")
+
+ #Initializing variable
+ #'p' gives no. of lines of data for each node/branch
+ # 'l' gives the no of partitions for a single voltage node
+ #'vnumber' gives total number of voltage
+ #'inumber' gives total number of current
+
+ p = l = vnumber = inumber = 0
+ #print "VoltsData : ",self.voltData
+
+ #Finding totla number of voltage node
+ for i in self.voltData[3:]:
+ #it has possible names of voltage nodes in NgSpice
+ if "Index" in i:#"V(" in i or "x1" in i or "u3" in i:
+ vnumber+=1
+
+ #print "Voltage Number :",vnumber
+
+ #Reading Current Source Data
+ with open (os.path.join(fpath,"plot_data_i.txt")) as f1:
+ self.currentData = f1.read()
+ self.currentData = self.currentData.split("\n")
+
+ #print "CurrentData : ",self.currentData
+
+ #Finding Number of Branch
+ for i in self.currentData[3:]:
+ if "#branch" in i:
+ inumber+=1
+
+ #print "Current Number :",inumber
+
+ self.dec = 0
+
+ #For AC
+ if self.analysisInfo[0][-3:]==".ac":
+ self.analysisType = 0
+ if "dec" in self.analysisInfo:
+ self.dec = 1
+
+ for i in self.voltData[3:]:
+ p+=1 #'p' gives no. of lines of data for each node/branch
+ if "Index" in i:
+ l+=1 # 'l' gives the no of partitions for a single voltage node
+ #print "l:",l
+ if "AC" in i: #DC for dc files and AC for ac ones
+ break
+
+ elif ".tran" in self.analysisInfo:
+ self.analysisType = 1
+ for i in self.voltData[3:]:
+ p+=1
+ if "Index" in i:
+ l+=1 # 'l' gives the no of partitions for a single voltage node
+ #print "l:",l
+ if "Transient" in i: #DC for dc files and AC for ac ones
+ break
+
+
+ # For DC:
+ else:
+ self.analysisType = 2
+ for i in self.voltData[3:]:
+ p+=1
+ if "Index" in i:
+ l+=1 # 'l' gives the no of partitions for a single voltage node
+ #print "l:",l
+ if "DC" in i: #DC for dc files and AC for ac ones
+ break
+
+
+
+
+ #print "VoltNumber",vnumber
+ #print "CurrentNumber",inumber
+ vnumber = vnumber//l #vnumber gives the no of voltage nodes
+ inumber = inumber//l #inumber gives the no of branches
+
+ #print "VoltNumber",vnumber
+ #print "CurrentNumber",inumber
+
+ p=[p,vnumber,self.analysisType,self.dec,inumber]
+
+ return p
+
+ def openFile(self,fpath):
+ try:
+ with open (os.path.join(fpath,"plot_data_i.txt")) as f2:
+ alli = f2.read()
+
+ alli = alli.split("\n")
+ self.NBIList = []
+
+ with open (os.path.join(fpath,"plot_data_v.txt")) as f1:
+ allv = f1.read()
+
+ except Exception as e:
+ print "Exception Message : ",str(e)
+ self.obj_appconfig.print_error('Exception Message :' + str(e))
+ self.msg = QtGui.QErrorMessage(None)
+ self.msg.showMessage('Unable to open plot data files.')
+ self.msg.setWindowTitle("Error Message:openFile")
+
+ try:
+ for l in alli[3].split(" "):
+ if len(l)>0:
+ self.NBIList.append(l)
+ self.NBIList = self.NBIList[2:]
+ len_NBIList = len(self.NBIList)
+ #print "NBILIST : ",self.NBIList
+ except Exception as e:
+ print "Exception Message : ",str(e)
+ self.obj_appconfig.print_error('Exception Message :' + str(e))
+ self.msg = QtGui.QErrorMessage(None)
+ self.msg.showMessage('Error in Analysis File.')
+ self.msg.setWindowTitle("Error Message:openFile")
+
+
+ d = self.numberFinder(fpath)
+ d1 = int(d[0] + 1)
+ d2 = int(d[1])
+ d3 = d[2]
+ d4 = d[4]
+
+ dec = [d3,d[3]]
+ #print "No. of Nodes:", d2
+ self.NBList = []
+ allv=allv.split("\n")
+ for l in allv[3].split(" "):
+ if len(l)>0:
+ self.NBList.append(l)
+ self.NBList=self.NBList[2:]
+ len_NBList = len(self.NBList)
+ print "NBLIST",self.NBList
+
+ ivals=[]
+ inum = len(allv[5].split("\t"))
+ inum_i = len(alli[5].split("\t"))
+
+
+
+ full_data = []
+
+ # Creating list of data:
+ if d3 < 3 :
+ for i in range(1,d2):
+ for l in allv[3+i*d1].split(" "):
+ if len(l)>0:
+ self.NBList.append(l)
+ self.NBList.pop(len_NBList)
+ self.NBList.pop(len_NBList)
+ len_NBList = len(self.NBList)
+
+ for n in range(1,d4):
+ for l in alli[3+n*d1].split(" "):
+ if len(l)>0:
+ self.NBIList.append(l)
+ self.NBIList.pop(len_NBIList)
+ self.NBIList.pop(len_NBIList)
+ len_NBIList = len(self.NBIList)
+
+ p=0
+ k = 0
+ m=0
+
+ for i in alli[5:d1-1]:
+ if len(i.split("\t"))==inum_i:
+ j2=i.split("\t")
+ #print j2
+ j2.pop(0)
+ j2.pop(0)
+ j2.pop()
+ if d3 == 0: #not in trans
+ j2.pop()
+ #print j2
+
+ for l in range(1,d4):
+ j3 = alli[5+l*d1+k].split("\t")
+ j3.pop(0)
+ j3.pop(0)
+ if d3==0:
+ j3.pop() #not required for dc
+ j3.pop()
+ j2 = j2 + j3
+ #print j2
+
+
+ full_data.append(j2)
+
+ k+=1
+
+ #print "FULL DATA :",full_data
+
+
+ for i in allv[5:d1-1]:
+ if len(i.split("\t"))==inum:
+ j=i.split("\t")
+ j.pop()
+ if d3==0:
+ j.pop()
+ for l in range(1,d2):
+ j1 = allv[5+l*d1+p].split("\t")
+ j1.pop(0)
+ j1.pop(0)
+ if d3==0:
+ j1.pop() #not required for dc
+ if self.NBList[len(self.NBList)-1] == 'v-sweep':
+ self.NBList.pop()
+ j1.pop()
+
+ j1.pop()
+ j = j + j1
+ j = j + full_data[m]
+ #print j
+ m+=1
+ #print j[:20]
+ j = "\t".join(j[1:])
+ j = j.replace(",","")
+ ivals.append(j)
+
+ p+=1
+
+ self.data = ivals
+
+ #print "volts:",self.butnames
+ self.volts_length = len(self.NBList)
+ self.NBList = self.NBList + self.NBIList
+
+
+ print dec
+ return dec
+
+
+ def numVals(self):
+ a = self.volts_length # No of voltage nodes
+ b = len(self.data[0].split("\t"))
+ #print "numvals:",b
+ return [b,a]
+
+
+ def computeAxes(self):
+ nums = len(self.data[0].split("\t"))
+ #print "i'm nums:",nums
+ self.y=[]
+ var=self.data[0].split("\t")
+ for i in range(1,nums):
+ self.y.append([Decimal(var[i])])
+ for i in self.data[1:]:
+ temp=i.split("\t")
+ for j in range(1,nums):
+ self.y[j-1].append(Decimal(temp[j]))
+ for i in self.data:
+ temp=i.split("\t")
+ self.x.append(Decimal(temp[0]))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+