summaryrefslogtreecommitdiff
path: root/OSCAD/analysisInserter/convertgui.py
diff options
context:
space:
mode:
authorJayaram Pai2014-05-19 11:02:57 +0530
committerJayaram Pai2014-05-19 11:02:57 +0530
commit8377256e7d90aa7ba1cb51f6164e99f81e2eb53c (patch)
tree5afcc8e82d7f7d4f6fbff900520bd8f05eb343ca /OSCAD/analysisInserter/convertgui.py
downloadFreeEDA-8377256e7d90aa7ba1cb51f6164e99f81e2eb53c.tar.gz
FreeEDA-8377256e7d90aa7ba1cb51f6164e99f81e2eb53c.tar.bz2
FreeEDA-8377256e7d90aa7ba1cb51f6164e99f81e2eb53c.zip
initial commit
Diffstat (limited to 'OSCAD/analysisInserter/convertgui.py')
-rw-r--r--OSCAD/analysisInserter/convertgui.py392
1 files changed, 392 insertions, 0 deletions
diff --git a/OSCAD/analysisInserter/convertgui.py b/OSCAD/analysisInserter/convertgui.py
new file mode 100644
index 0000000..4345ed2
--- /dev/null
+++ b/OSCAD/analysisInserter/convertgui.py
@@ -0,0 +1,392 @@
+#!/usr/bin/python
+# convertgui.py is a python script to create analysis option for ngspice. It is developed for OSCAD software. It is written by Saket Choudhary (saketkc@gmail.com).
+# Copyright (C) 2012 Yogesh Dilip Save, FOSS Project, IIT Bombay.
+# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# It is modified by Yogesh Dilip Save on 9th October 2012.
+
+import wx
+import os,re
+ID_ABOUT=101
+ID_OPEN=102
+ID_SAVE=103
+ID_BUTTON1=300
+ID_EXIT=200
+
+# Some classes to use for the notebook pages. Obviously you would
+# want to use something more meaningful for your application, these
+# are just for illustration.
+
+def convertintoScientificForm(str):
+ if str[0]=='p':
+ return "e-12"
+ elif str[0]=='n' :
+ return "e-09"
+ elif str[0]=='u' :
+ return "e-06"
+ elif str[0]=='m' :
+ return "e-03"
+ else:
+ return "e-00"
+
+class PageOne(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+
+ grid1 = wx.GridSizer(5, 2)
+ grid1.Add(wx.StaticText(self,-1,'Enter Source Name:'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.source = wx.TextCtrl(self, -1, '', (150, 75), (120, -1))
+ hbox.Add(self.source)
+ grid1.Add(hbox)
+
+ grid1.Add(wx.StaticText(self,-1,'Start'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.start = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.start)
+ self.startscale = wx.ComboBox(self, -1, value = 'Volts or Amperes', choices=['mV or mA', 'uV or uA', 'nV or nA', 'pV or pA'], size=(160, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.startscale)
+ grid1.Add(hbox)
+
+ grid1.Add(wx.StaticText(self,-1,'Increment'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.step = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.step)
+ self.stepscale = wx.ComboBox(self, -1, value = 'Volts or Amperes', choices=['mV or mA', 'uV or uA', 'nV or nA', 'pV or pA'], size=(160, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.stepscale)
+ grid1.Add(hbox)
+
+ grid1.Add(wx.StaticText(self,-1,'Stop'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.stop = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.stop)
+ self.stopscale = wx.ComboBox(self, -1, value = 'Volts or Amperes', choices=['mV or mA', 'uV or uA', 'nV or nA', 'pV or pA'], size=(160, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.stopscale)
+ grid1.Add(hbox)
+
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.cb = wx.CheckBox(self, -1, 'Operating Point analysis', (10, 10))
+ hbox.Add(self.cb)
+ grid1.Add(wx.StaticText(self,-1,''),1)
+ grid1.Add(hbox)
+
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.button = wx.Button(self,901,"Add Simulation Data")
+ hbox.Add(self.button)
+ self.button.Bind(wx.EVT_BUTTON, self.enter_simulation)
+ grid1.Add(wx.StaticText(self,-1,''),1)
+ grid1.Add(hbox)
+ self.SetSizer(grid1)
+ self.Centre()
+ self.Show(True)
+
+ def enter_simulation(self,e):
+ txtctrl = self.GetParent().GetParent().control
+ previous_data = txtctrl.GetValue()
+ start = str(self.start.GetValue()) +convertintoScientificForm(str(self.startscale.GetValue()))
+ stop = str(self.stop.GetValue()) +convertintoScientificForm(str(self.stopscale.GetValue()))
+ step = str(self.step.GetValue()) +convertintoScientificForm(str(self.stepscale.GetValue()))
+ source = str(self.source.GetValue())
+ if self.cb.GetValue():
+ appendline = ".op"
+ else:
+ appendline = ".dc " + " " + str(source)+" "+ str(start) + " " + str(stop) + " " + str(step) + "\n"
+ txtctrl.AppendText(appendline)
+
+class PageTwo(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+ sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, 'Scale'), orient=wx.HORIZONTAL)
+ self.lin = wx.RadioButton(self, -1, 'Lin')
+ self.dec = wx.RadioButton(self, -1, 'Dec')
+ self.octal = wx.RadioButton(self, -1, 'Oct')
+ sizer.Add(self.lin)
+ sizer.Add(self.dec)
+ sizer.Add(self.octal)
+ grid1 = wx.GridSizer(5, 2)
+ grid1.Add(sizer,1)
+ grid1.Add(wx.StaticText(self,-1,''))
+ grid1.Add(wx.StaticText(self,-1,'Start Frequency'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.start = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.start)
+ self.startscale = wx.ComboBox(self, -1, value = 'Hz', choices=['THz', 'GHz', 'Meg', 'KHz', 'Hz'], size=(60, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.startscale)
+ grid1.Add(hbox)
+ grid1.Add(wx.StaticText(self,-1,'Stop Frequency'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.stop = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.stop)
+ self.stopscale = wx.ComboBox(self, -1, value = 'Hz', choices=['THz', 'GHz', 'Meg', 'KHz', 'Hz'], size=(60, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.stopscale)
+ grid1.Add(hbox)
+
+ grid1.Add(wx.StaticText(self,-1,'Number of points'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.datapoints = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.datapoints)
+ grid1.Add(hbox)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.button = wx.Button(self,901,"Add Simulation Data")
+ hbox.Add(self.button)
+ self.button.Bind(wx.EVT_BUTTON, self.enter_simulation)
+ grid1.Add(wx.StaticText(self,-1,''),1)
+ grid1.Add(hbox)
+ self.SetSizer(grid1)
+ self.Centre()
+ self.Show(True)
+ def OnButton(self,e):
+ print self.lin.GetValue()
+ print self.GetParent().GetParent().control.GetValue()
+ def enter_simulation(self,e):
+ txtctrl = self.GetParent().GetParent().control
+ if self.lin.GetValue():
+ ac_scale="lin"
+ elif self.dec.GetValue():
+ ac_scale="dec"
+ elif self.octal.GetValue():
+ ac_scale = "octal"
+ previous_data = txtctrl.GetValue()
+ #print previous_data
+ data_real = re.sub(r'.end.*',"",previous_data)
+ txtctrl.SetValue(data_real)
+ number_of_data_points = str(self.datapoints.GetValue())
+ start_frequency = str(self.start.GetValue())+ str(self.startscale.GetValue())
+ stop_frequency = str(self.stop.GetValue())+ str(self.stopscale.GetValue())
+ appendline_ac = ".ac " + str(ac_scale) + " " + str(number_of_data_points)+" " + str(start_frequency) + " " + str(stop_frequency) + "\n"
+ #appendline_end = ".end\n"
+ #appendline_control=".control\n" + "run\n" + ".endc\n"
+ #with open(filename,"a") as myfile:
+ txtctrl.AppendText("\n")
+ txtctrl.AppendText(appendline_ac)
+ #txtctrl.AppendText("\n\n")
+ #txtctrl.AppendText(appendline_end)
+ #txtctrl.AppendText(appendline_control)
+
+
+class PageThree(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+
+ grid1 = wx.GridSizer(5, 2)
+ grid1.Add(wx.StaticText(self,-1,'Start Time'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.start = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.start)
+ self.startscale = wx.ComboBox(self, -1, value = 'Sec', choices=['ms', 'us', 'ns', 'ps'], size=(60, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.startscale)
+
+ grid1.Add(hbox)
+ grid1.Add(wx.StaticText(self,-1,'Step Time'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.step = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.step)
+ self.stepscale = wx.ComboBox(self, -1, value = 'sec', choices=['ms', 'us', 'ns', 'ps'], size=(60, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.stepscale)
+
+ grid1.Add(hbox)
+ grid1.Add(wx.StaticText(self,-1,'Stop Time'),1)
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.stop = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
+ hbox.Add(self.stop)
+ self.stopscale = wx.ComboBox(self, -1, value = 'sec', choices=['ms', 'us', 'ns', 'ps'], size=(60, -1), style=wx.CB_DROPDOWN)
+ hbox.Add(self.stopscale)
+ grid1.Add(hbox)
+
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ self.button = wx.Button(self,901,"Add Simulation Data")
+ hbox.Add(self.button)
+ self.button.Bind(wx.EVT_BUTTON, self.enter_simulation)
+ grid1.Add(wx.StaticText(self,-1,''),1)
+ grid1.Add(hbox)
+ self.SetSizer(grid1)
+ self.Centre()
+ self.Show(True)
+
+ def enter_simulation(self,e):
+ txtctrl = self.GetParent().GetParent().control
+
+ previous_data = txtctrl.GetValue()
+ #print previous_data
+# data_real = re.sub(r'.end.*',"",previous_data)
+# txtctrl.SetValue(data_real)
+ start_time = str(self.start.GetValue()) +convertintoScientificForm(str(self.startscale.GetValue()))
+ stop_time = str(self.stop.GetValue()) +convertintoScientificForm(str(self.stopscale.GetValue()))
+ step_time = str(self.step.GetValue()) +convertintoScientificForm(str(self.stepscale.GetValue()))
+ appendline_trans = ".tran " + " " + str(step_time) + " " + str(stop_time) + " " + str(start_time) + "\n"
+# appendline_end = ".end\n"
+# appendline_control=".control\n" + "run\n" + ".endc\n"
+ #with open(filename,"a") as myfile:
+# txtctrl.AppendText("\n")
+ txtctrl.AppendText(appendline_trans)
+# txtctrl.AppendText("\n\n")
+# txtctrl.AppendText(appendline_end)
+# txtctrl.AppendText(appendline_control)
+
+
+class PageFour(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+ t = wx.StaticText(self, -1, "Fourier", (60,60))
+
+
+class PageFive(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+ t = wx.StaticText(self, -1, "Pole Zero", (60,60))
+
+
+class PageSix(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+ t = wx.StaticText(self, -1, "Transfer Function", (60,60))
+class MainFrame(wx.Frame):
+ def __init__(self):#self,parent,wx.ID_ANY, title
+ wx.Frame.__init__(self,None, wx.ID_ANY, title="kicad ngspice")
+ self.CreateStatusBar(style=0)
+ self.control = wx.TextCtrl(self, 1, style=wx.TE_MULTILINE)
+ filemenu= wx.Menu()
+ # use ID_ for future easy reference - much better that "48", "404" etc
+ # The & character indicates the short cut key
+ filemenu.Append(ID_OPEN, "&Open"," Open a file to edit")
+ filemenu.AppendSeparator()
+ filemenu.Append(ID_SAVE, "&Save"," Save file")
+ filemenu.AppendSeparator()
+ filemenu.Append(ID_ABOUT, "&About"," Information about this program")
+ filemenu.AppendSeparator()
+ filemenu.Append(ID_EXIT,"E&xit"," Terminate the program")
+
+ # Creating the menubar.
+ menuBar = wx.MenuBar()
+ menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
+ self.SetMenuBar(menuBar) # Adding the MenuBar to the Frame content.
+ # Note - previous line stores the whole of the menu into the current object
+
+ # Define the code to be run when a menu option is selected
+ wx.EVT_MENU(self, ID_ABOUT, self.OnAbout)
+ wx.EVT_MENU(self, ID_EXIT, self.OnExit)
+ wx.EVT_MENU(self, ID_OPEN, self.OnOpen)
+ wx.EVT_MENU(self, ID_SAVE, self.OnSave); # just "pass" in our demo
+
+ self.aboutme = wx.MessageDialog( self, " Converter for kicad \n"
+ " in wxPython","Beta mode", wx.OK)
+ self.doiexit = wx.MessageDialog( self, " Exit - R U Sure? \n",
+ "GOING away ...", wx.YES_NO)
+
+ # dirname is an APPLICATION variable that we're choosing to store
+ # in with the frame - it's the parent directory for any file we
+ # choose to edit in this frame
+ self.dirname = os.getcwd()
+
+ #self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
+ #self.sizer=wx.BoxSizer(wx.VERTICAL)
+ #self.sizer.Add(self.control,1,wx.EXPAND)
+ #self.sizer.Add(self.sizer2,0,wx.EXPAND)
+ #self.SetSizer(self.sizer)
+
+ # Here we create a panel and a notebook on the panel
+ p = wx.Panel(self)
+ nb = wx.Notebook(self)
+
+ # create the page windows as children of the notebook
+ page1 = PageOne(nb)
+ page2 = PageTwo(nb)
+ page3 = PageThree(nb)
+ page4 = PageFour(nb)
+ page5 = PageFive(nb)
+ page6 = PageSix(nb)
+
+ # add the pages to the notebook with the label to show on the tab
+ nb.AddPage(page1, "DC")
+ nb.AddPage(page2, "AC")
+ nb.AddPage(page3, "Transient")
+ nb.AddPage(page4, "Fourier")
+ nb.AddPage(page5, "Pole Zero")
+ nb.AddPage(page6, "Transfer Function")
+
+ # finally, put the notebook in a sizer for the panel to manage
+ # the layout
+ sizer = wx.BoxSizer(wx.VERTICAL)
+ sizer.Add(nb, 1, wx.EXPAND)
+ sizer.Add(self.control,1,wx.EXPAND)
+ self.SetSizer(sizer)
+
+ #wx.Frame.__init__(self,parent,wx.ID_ANY, title)
+
+ # Add a text editor and a status bar
+ # Each of these is within the current instance
+ # so that we can refer to them later.
+ #self.SetAutoLayout(1)
+ #self.sizer.Fit(self)
+
+ # Show it !!!
+ #self.Show(1)
+ self.Maximize()
+
+
+ def OnAbout(self,e):
+ # A modal show will lock out the other windows until it has
+ # been dealt with. Very useful in some programming tasks to
+ # ensure that things happen in an order that the programmer
+ # expects, but can be very frustrating to the user if it is
+ # used to excess!
+ self.aboutme.ShowModal() # Shows it
+ def OnExit(self,e):
+ # A modal with an "are you sure" check - we don't want to exit
+ # unless the user confirms the selection in this case ;-)
+ igot = self.doiexit.ShowModal() # Shows it
+ if igot == wx.ID_YES:
+ self.Close(True) # Closes out this simple application
+
+ def OnOpen(self,e):
+ # In this case, the dialog is created within the method because
+ # the directory name, etc, may be changed during the running of the
+ # application. In theory, you could create one earlier, store it in
+ # your frame object and change it when it was called to reflect
+ # current parameters / values
+ dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN)
+ if dlg.ShowModal() == wx.ID_OK:
+ self.filename=dlg.GetFilename()
+ self.dirname=dlg.GetDirectory()
+
+ # Open the file, read the contents and set them into
+ # the text edit window
+ filehandle=open(os.path.join(self.dirname, self.filename),'r')
+ self.control.SetValue(filehandle.read())
+ filehandle.close()
+
+ # Report on name of latest file read
+ self.SetTitle("Editing ... "+self.filename)
+ # Later - could be enhanced to include a "changed" flag whenever
+ # the text is actually changed, could also be altered on "save" ...
+ dlg.Destroy()
+
+ def OnSave(self,e):
+ # Save away the edited text
+ # Open the file, do an RU sure check for an overwrite!
+ dlg = wx.FileDialog(self, "Choose a file", self.dirname, "analysis", "*.*", \
+ wx.SAVE | wx.OVERWRITE_PROMPT)
+ if dlg.ShowModal() == wx.ID_OK:
+ # Grab the content to be saved
+ itcontains = self.control.GetValue()
+
+ # Open the file for write, write, close
+ self.filename=dlg.GetFilename()
+ self.dirname=dlg.GetDirectory()
+ filehandle=open(os.path.join(self.dirname, self.filename),'w')
+ filehandle.write(itcontains)
+ filehandle.close()
+ # Get rid of the dialog to keep things tidy
+ dlg.Destroy()
+
+
+
+
+if __name__ == "__main__":
+ app = wx.App()
+
+ MainFrame().Show(1)
+ #MainFrame().Maximize()
+ #MainFrame().Layout()
+ app.MainLoop()