summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Shetye2019-06-27 16:43:26 +0530
committerGitHub2019-06-27 16:43:26 +0530
commita620e3f94c46f02d7ee1b58bdb5fb7cc8e7be2f1 (patch)
treed1d4bf9d8140c06be8ab22d530c53d4838851b2c
parentb9957bac0e86410007b0b728e58edeca5aa52d85 (diff)
parent0811375e0a4769ef0e31efbd85418ccc1d41816e (diff)
downloadeSim-a620e3f94c46f02d7ee1b58bdb5fb7cc8e7be2f1.tar.gz
eSim-a620e3f94c46f02d7ee1b58bdb5fb7cc8e7be2f1.tar.bz2
eSim-a620e3f94c46f02d7ee1b58bdb5fb7cc8e7be2f1.zip
Merge pull request #107 from anjalijaiswal08/UploadSubcircuit
Upload subcircuit
-rw-r--r--src/frontEnd/ProjectExplorer.py2
-rw-r--r--src/ngspiceSimulation/NgspiceWidget.py4
-rw-r--r--src/ngspiceSimulation/pythonPlotting.py4
-rw-r--r--src/projManagement/Validation.py168
-rw-r--r--src/subcircuit/Subcircuit.py11
-rw-r--r--src/subcircuit/uploadSub.py105
6 files changed, 231 insertions, 63 deletions
diff --git a/src/frontEnd/ProjectExplorer.py b/src/frontEnd/ProjectExplorer.py
index 638b3147..8832cb41 100644
--- a/src/frontEnd/ProjectExplorer.py
+++ b/src/frontEnd/ProjectExplorer.py
@@ -99,8 +99,6 @@ class ProjectExplorer(QtGui.QWidget):
menu = QtGui.QMenu()
if level == 0:
- renameProject = menu.addAction(self.tr("Rename Project"))
- renameProject.triggered.connect(self.renameProject)
deleteproject = menu.addAction(self.tr("Remove Project"))
deleteproject.triggered.connect(self.removeProject)
refreshproject = menu.addAction(self.tr("Refresh"))
diff --git a/src/ngspiceSimulation/NgspiceWidget.py b/src/ngspiceSimulation/NgspiceWidget.py
index 1d5c974f..a963c51f 100644
--- a/src/ngspiceSimulation/NgspiceWidget.py
+++ b/src/ngspiceSimulation/NgspiceWidget.py
@@ -9,8 +9,8 @@ class NgspiceWidget(QtGui.QWidget):
def __init__(self, command, projPath):
"""
- 1)Creates constructor for NgspiceWidget class.
- 2)Checks whether OS is linux or windows
+ - Creates constructor for NgspiceWidget class.
+ - Checks whether OS is linux or windows
and creates NgSpice window accordingly.
"""
QtGui.QWidget.__init__(self)
diff --git a/src/ngspiceSimulation/pythonPlotting.py b/src/ngspiceSimulation/pythonPlotting.py
index b9474403..22f2100a 100644
--- a/src/ngspiceSimulation/pythonPlotting.py
+++ b/src/ngspiceSimulation/pythonPlotting.py
@@ -14,10 +14,10 @@ import numpy as np
# This class creates Python Plotting window
class plotWindow(QtGui.QMainWindow):
- '''
+ """
This class defines python plotting window, its features, buttons,
colors, AC and DC analysis, plotting etc.
- '''
+ """
def __init__(self, fpath, projectName):
"""This create constructor for plotWindow class."""
diff --git a/src/projManagement/Validation.py b/src/projManagement/Validation.py
index 65103282..f2d84314 100644
--- a/src/projManagement/Validation.py
+++ b/src/projManagement/Validation.py
@@ -1,4 +1,3 @@
-
# =========================================================================
#
# FILE: Validation.py
@@ -21,12 +20,25 @@ import os
import re
import distutils.spawn
+"""
+This is Validation class use for validating Project.
+e.g if .proj is present in project directory
+or if new project name is already exist in workspace etc
+"""
+
class Validation:
"""
- This is Validation class use for validating Project.
- e.g if .proj is present in project directory
- or if new project name is already exist in workspace etc
+ Takes as input the path of the project and checks if
+ projName.proj file exists
+ projName is same as the folder selected
+
+ @params
+ :projDir => contains the path of the project folder selected to open
+
+ @return
+ True => If the folder contains the projName.proj file
+ False => If the folder doesn't contain projName.proj file
"""
def __init__(self):
@@ -34,17 +46,7 @@ class Validation:
def validateOpenproj(self, projDir):
"""
- Takes as input the path of the project and checks if
- projName.proj file exists
- projName is same as the folder selected
-
- @params
- :projDir => contains the path of the project folder selected\
- to open
-
- @return
- True => If the folder contains the projName.proj file
- False => If the folder doesn't contain projName.proj file
+ This function validate Open Project Information.
"""
print("Function: Validating Open Project Information")
projName = os.path.basename(str(projDir))
@@ -55,17 +57,21 @@ class Validation:
else:
return False
- def validateNewproj(self, projDir):
- """
- Validate new project created
+ """
+ Validate new project created
- @params
- :projDir => Contains path of the new projDir created
+ @params
+ :projDir => Contains path of the new projDir created
- @return
- :"CHECKEXIST" => If smae project name folder exists
- :"CHECKNAME" => If space is there in name
- :"VALID" => If valid project name given
+ @return
+ :"CHECKEXIST" => If smae project name folder exists
+ :"CHECKNAME" => If space is there in name
+ :"VALID" => If valid project name given
+ """
+
+ def validateNewproj(self, projDir):
+ """
+ This Project Validate New Project Information
"""
print("Function: Validating New Project Information")
@@ -79,18 +85,22 @@ class Validation:
else:
return "VALID"
- def validateKicad(self, projDir):
- """
- Validate if projDir is set appropriately in the function calling file
- and if Kicad components are present
+ """
+ Validate if projDir is set appropriately in the function calling file
+ and if Kicad components are present
- @params
- :projDir => the path of the project directory, passed from
- the calling function
+ @params
+ :projDir => the path of the project directory, passed from
+ the calling function
- @return
- True
- False
+ @return
+ True
+ False
+ """
+
+ def validateKicad(self, projDir):
+ """
+ This function validate if Kicad components are present
"""
print("FUnction : Validating for Kicad components")
if projDir is None:
@@ -98,17 +108,21 @@ class Validation:
else:
return True
- def validateCir(self, projDir):
- """
- Validate if cir file present in the directory with the appropriate .cir
- file name, same as the project directory base
+ """
+ Validate if cir file present in the directory with the appropriate .cir
+ file name, same as the project directory base
- @params
- :projDir => the path to the project directory
+ @params
+ :projDir => the path to the project diretory
- @return
- True
- False
+ @return
+ True
+ False
+ """
+
+ def validateCir(self, projDir):
+ """
+ This function checks if ".cir" file is present.
"""
projName = os.path.basename(str(projDir))
lookCir = os.path.join(str(projDir), projName + ".cir")
@@ -161,17 +175,7 @@ class Validation:
return "DIREC"
def validateCirOut(self, projDir):
- """
- This function checks if ".cir.out" file is present.
-
- @params
- :projDir => the path of the project directory, passed from
- the calling function
-
- @return
- True
- False
- """
+ """This function checks if ".cir.out" file is present."""
projName = os.path.basename(str(projDir))
lookCirOut = os.path.join(str(projDir), projName + ".cir.out")
# Check existence of project
@@ -181,8 +185,58 @@ class Validation:
return False
def validateTool(self, toolName):
+ """This function check if tool is present in the system."""
+ return distutils.spawn.find_executable(toolName) is not None
+
+ def validateSubcir(self, projDir):
"""
- This function check if tool is present in the system,
- Example, nghdl, eeschema...
+ This function checks for valid format of .sub file.
+ Correct format of file is:
+ - File should start with **.subckt <filename>**
+ - End with **.ends <filename>**
+ Function is passed with the file of path it checks the
+ file line by line untill it get .subckt as its first word
+ and then check for second word is it <fileName> or not.
+
+ Then it checks for second last line if it is ".ends
+ <filename>" it return True if conditions satisfy else
+ return False.
+
"""
- return distutils.spawn.find_executable(toolName) is not None
+ projName = os.path.basename(str(projDir))
+ fileName = projName[:-4]
+
+ first = True
+ last_line = []
+
+ # Checks if file is empty or not.
+ if os.stat(projDir).st_size == 0:
+ print("File is empty")
+ print("===================")
+ return False
+
+ with open(projDir, 'r') as f:
+ for line in f:
+ word = line.split()
+ if len(word) == 0 or word[0][0] == "*":
+ continue
+ if first:
+ if word[0] == ".subckt" and word[1] == fileName:
+ first = False
+ else:
+ print("First line not found")
+ return False
+ else:
+ last_line = word
+
+ if first is True:
+ print("First line not found")
+ return False
+
+ print(last_line)
+ if len(last_line) >= 2 and last_line[0] == ".ends" and \
+ last_line[1] == fileName:
+ return True
+
+ print("Last line not found")
+ return False
diff --git a/src/subcircuit/Subcircuit.py b/src/subcircuit/Subcircuit.py
index d2e7ec5a..8f55ea13 100644
--- a/src/subcircuit/Subcircuit.py
+++ b/src/subcircuit/Subcircuit.py
@@ -4,6 +4,7 @@ from projManagement.Validation import Validation
from subcircuit.newSub import NewSub
from subcircuit.openSub import openSub
from subcircuit.convertSub import convertSub
+from subcircuit.uploadSub import UploadSub
# This class creates Subcircuit GUI.
@@ -41,11 +42,17 @@ class Subcircuit(QtGui.QWidget):
'<b>To convert Subcircuit Kicad Netlist to Ngspice Netlist</b>')
self.convertbtn.setFixedSize(200, 40)
self.convertbtn.clicked.connect(self.convertsch)
+ self.uploadbtn = QtGui.QPushButton('Upload a Subcircuit')
+ self.uploadbtn.setToolTip(
+ '<b>To Upload a subcircuit</b>')
+ self.uploadbtn.setFixedSize(180, 38)
+ self.uploadbtn.clicked.connect(self.uploadSub)
self.hbox = QtGui.QHBoxLayout()
self.hbox.addWidget(self.newbtn)
self.hbox.addWidget(self.editbtn)
self.hbox.addWidget(self.convertbtn)
+ self.hbox.addWidget(self.uploadbtn)
self.hbox.addStretch(1)
self.vbox = QtGui.QVBoxLayout()
@@ -73,3 +80,7 @@ class Subcircuit(QtGui.QWidget):
def convertsch(self):
self.obj_convertsubcircuit = convertSub(self.obj_dockarea)
self.obj_convertsubcircuit.createSub()
+
+ def uploadSub(self):
+ self.obj_uploadsubcircuit = UploadSub()
+ self.obj_uploadsubcircuit.upload()
diff --git a/src/subcircuit/uploadSub.py b/src/subcircuit/uploadSub.py
new file mode 100644
index 00000000..dfabea8d
--- /dev/null
+++ b/src/subcircuit/uploadSub.py
@@ -0,0 +1,105 @@
+from PyQt4 import QtGui
+from configuration.Appconfig import Appconfig
+from projManagement.Validation import Validation
+import os
+import shutil
+
+
+class UploadSub(QtGui.QWidget):
+ """
+ This class contain function for ulaoding subcircuits
+ in Subcircuit library present in src folder.
+ A folder is created in src/SubcircuitLibrary
+ and desired file is moved to that folder.
+ """
+
+ def __init__(self):
+ super(UploadSub, self).__init__()
+ self.obj_validation = Validation()
+ self.obj_appconfig = Appconfig()
+
+ def upload(self):
+ """
+ This method opens a dialogue box when Upload subcircuit button is
+ clicked and after entering folder name, it opens directory system
+ to chose file for folder, it only shows file with extension .sub
+ and with the name of project entered earlier as folder name.
+
+ It then validates file if it is in proper format or not, for it
+ the file is passed to the function **validateSub** and it returns
+ true if file has valid format or else it shows an error message.
+ """
+ text, ok = QtGui.QInputDialog.getText(
+ self, 'Subcircuit Info', 'Enter Subcircuit Name:')
+
+ if ok:
+ projname = (str(text))
+ create_subcircuit = projname
+ subcircuit_path = (os.path.join(os.path.abspath('..'),
+ 'SubcircuitLibrary', create_subcircuit))
+
+ if subcircuit_path == "":
+ reply = "NONE"
+ else:
+ reply = self.obj_validation.validateNewproj(str(
+ subcircuit_path))
+
+ if reply == "VALID":
+ print("Validated: Creating subcircuit directory")
+ os.mkdir(subcircuit_path)
+ editfile = str(
+ QtGui.QFileDialog.getOpenFileName(
+ None, "Upload File", os.path.expanduser("~"),
+ (projname + ".sub")))
+
+ upload = os.path.basename(editfile)
+ print("===================")
+ print("Current path of subcircuit file is " + editfile)
+ print("===================")
+ print("Selected file is " + upload)
+ print("===================")
+ self.valid = self.obj_validation.validateSubcir(str(editfile))
+ print("===================")
+
+ if self.valid is True:
+ print("Right file format!!!")
+ print("===================")
+ subcircuit = (os.path.join(subcircuit_path, upload))
+ print("Final path of file is " + subcircuit)
+ print("===================")
+ print("Copying file from "
+ + editfile
+ + " to "
+ + subcircuit)
+ print("===================")
+ shutil.copy(editfile, subcircuit)
+ else:
+ self.msg = QtGui.QErrorMessage(self)
+ self.msg.showMessage(
+ "Content of file does not meet the required format.\
+ Please make sure file starts with * .subckt \
+ " + upload + "** and ends with **.ends \
+ " + upload + "**")
+ self.msg.setWindowTitle("Error Message")
+ print("Invalid file format")
+ print("===================")
+ print("Removing directory " + subcircuit_path)
+ print("===================")
+ os.rmdir(subcircuit_path)
+
+ elif reply == "CHECKEXIST":
+ print("Project name already exists.")
+ print("==========================")
+ msg = QtGui.QErrorMessage(self)
+ msg.showMessage(
+ "The project already exist. Please select \
+ the different name or delete existing project")
+ msg.setWindowTitle("Error Message")
+
+ elif reply == "CHECKNAME":
+ print("Name can not contain space between them")
+ print("===========================")
+ msg = QtGui.QErrorMessage(self)
+ msg.showMessage(
+ 'The project name should not contain space between them')
+ msg.setWindowTitle("Error Message")