From 8377256e7d90aa7ba1cb51f6164e99f81e2eb53c Mon Sep 17 00:00:00 2001 From: Jayaram Pai Date: Mon, 19 May 2014 11:02:57 +0530 Subject: initial commit --- OSCAD/analysisInserter/convertgui.py | 392 +++++++++++++++++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 OSCAD/analysisInserter/convertgui.py (limited to 'OSCAD/analysisInserter/convertgui.py') 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() -- cgit