Ejemplo n.º 1
0
    def functionForCreateButton(self):
        #if a project is already started save it before starting a new one
        if (self.model.project != '') & (self.model.project is not None):
            self.model = switchProject(self)
            global model
            model = self.model

        s = self.WizardTree
        s.exec_()
        handler = UIToHandler()
        handler.makeSetup(model)
        #display collected data
        #returns true if setup info has been entered
        hasSetup = model.feedSetupInfo()
        self.projectDatabase = False
        if hasSetup:
            #self.topBlock.setEnabled(True)
            #self.environmentBlock.setEnabled(True)
            #self.componentBlock.setEnabled(True)
            #enable the model and optimize pages too
            pages = self.window().findChild(QtWidgets.QTabWidget, 'pages')
            pages.enableTabs()
            self.tabs.setEnabled(True)
            self.findChild(QtWidgets.QLabel,
                           'projectTitle').setText(self.model.project)
Ejemplo n.º 2
0
    def generateNetcdf(self):

        handler = UIToHandler()
        #df gets read in from TimeSeries processed data folder
        #component dictionary comes from setupXML's
        MainWindow = self.window()
        setupForm = MainWindow.findChild(QtWidgets.QWidget, 'setupDialog')
        setupModel = setupForm.model
        if 'setupFolder' in setupModel.__dict__.keys():
            setupFile = os.path.join(setupModel.setupFolder,
                                     setupModel.project + 'Setup.xml')
            componentModel = setupForm.findChild(QtWidgets.QWidget,
                                                 'components').model()
            #From the setup file read the location of the input pickle
            #by replacing the current pickle with the loaded one the user can manually edit the input and
            #  then return to working with the interface
            data = handler.loadInputData(setupFile)
            if data:
                df = data.fixed
                componentDict = {}
                if 'components' not in setupModel.__dict__.keys():
                    #generate components
                    setupForm.makeComponentList(componentModel)
                for c in setupModel.components:
                    componentDict[c.column_name] = c.toDictionary()
                #filesCreated is a list of netcdf files that were generated
                filesCreated = handler.createNetCDF(df, componentDict,
                                                    setupModel.setupFolder)
                self.netCDFsLoaded.setText(', '.join(filesCreated))
            else:
                print("no data found")
Ejemplo n.º 3
0
    def functionForLoadDescriptor(self):

        msg = QtWidgets.QMessageBox(
            QtWidgets.QMessageBox.Warning, 'Load Descriptor',
            'If the component descriptor file you are loading has the same name as an existing component it will not load'
        )
        msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
        msg.exec()

        tableView = self.findChild((QtWidgets.QTableView), 'components')
        model = tableView.model()
        # identify the xml
        descriptorFile = QtWidgets.QFileDialog.getOpenFileName(
            self, "Select a descriptor file", None, "*xml")
        if (descriptorFile == ('', '')) | (descriptorFile is None):
            return

        fieldName, ok = QtWidgets.QInputDialog.getText(
            self, 'Field Name',
            'Enter the name of the channel that contains data for this component.'
        )
        # if a field was entered add it to the table model and database
        if ok:
            record = model.record()
            record.setValue('original_field_name', fieldName)

            handler = UIToHandler()
            record = handler.copyDescriptor(descriptorFile[0],
                                            self.model.componentFolder, record)

            # add a row into the database
            model.insertRowIntoTable(record)
            # refresh the table
            model.select()
        return
Ejemplo n.º 4
0
    def feedSetupInfo(self):
        import os
        handler = UIToHandler()

        if (self.project is None) | (self.project == ''):
            return False
        if not os.path.exists(self.setupFolder):
            return False

        # tell the controller to tell the InputHandler to read the xml and set the model values
        handler.inputHandlerToUI(self.setupFolder, self)

        return True
Ejemplo n.º 5
0
    def createInputFiles(self):
        import os
        self.addProgressBar()
        self.progress.setRange(0, 0)
        self.sendSetupData()
        # check all the required fields are filled
        dbhandler = ProjectSQLiteHandler()
        if not dbhandler.dataComplete():
            #if required fields are not filled in return to setup page.
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, "Missing Required Fields",
                "Please fill in all required fields before generating input files."
            )
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msg.exec()
            dbhandler.closeDatabase()
            return

        dbhandler.closeDatabase()
        # write all the xml files

        # start with the setupxml
        self.model.writeNewXML()

        # import datafiles
        handler = UIToHandler()
        cleaned_data, components = handler.loadFixData(
            os.path.join(model.setupFolder, model.project + 'Setup.xml'))
        self.updateModelPage(cleaned_data)
        # pickled data to be used later if needed
        handler.storeData(
            cleaned_data,
            os.path.join(model.setupFolder, model.project + 'Setup.xml'))
        handler.storeComponents(
            components,
            os.path.join(model.setupFolder, model.project + 'Setup.xml'))
        self.dataLoaded.setText('data loaded')
        self.progress.setRange(0, 1)
        # generate netcdf files
        msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,
                                    "Time Series loaded",
                                    "Do you want to generate netcdf files?.")
        msg.setStandardButtons(QtWidgets.QMessageBox.Ok
                               | QtWidgets.QMessageBox.Cancel)
        result = msg.exec()

        # if yes create netcdf files, Otherwise this can be done after the data is reviewed.
        if result == QtWidgets.QMessageBox.Ok:
            d = {}
            for c in components:
                d[c.column_name] = c.toDictionary()
            handler.createNetCDF(
                cleaned_data.fixed, d,
                os.path.join(model.setupFolder, model.project + 'Setup.xml'))

        return
Ejemplo n.º 6
0
    def functionForDeleteRecord(self, table):
        # get selected rows
        tableView = self.parent.findChild((QtWidgets.QTableView), table)
        model = tableView.model()
        # selected is the indices of the selected rows
        selected = tableView.selectionModel().selection().indexes()
        if len(selected) == 0:
            #exit if no rows were selected
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, 'Select Rows',
                'Select rows before attempting to delete')
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msg.exec()

        else:
            #confirm delete
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, 'Confirm Delete',
                'Are you sure you want to delete the selected records?')
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok
                                   | QtWidgets.QMessageBox.Cancel)

            result = msg.exec()

            if result == 1024:
                handler = UIToHandler()
                for r in selected:
                    model.removeRows(r.row(), 1)

                # Delete the record from the database and refresh the tableview
                model.submitAll()
                model.select()

        return
def getComponentAttributesAsList(componentName, componentFolder):
    from Controller.UIToHandler import UIToHandler

    handler = UIToHandler()
    componentSoup = handler.makeComponentDescriptor(componentName, componentFolder)
    attributeList = []
    for tag in componentSoup.find_all():
        if (tag.parent.name not in ['component', 'childOf', 'type']) & (tag.name not in ['component','childOf','type']):
            parent = tag.parent.name
            pt = '.'.join([parent,tag.name])
        else:
            pt = tag.name

        for a in tag.attrs:
            if a != 'unit':
                 attributeList.append('.'.join([pt,str(a)]))
    return attributeList
Ejemplo n.º 8
0
def updateSetsSql(set, setupModel):
    uihandler = UIToHandler()
    xmlfile =  setupModel.getSetAttributeXML(set)
    soup = uihandler.getSetAttributeXML(xmlfile)
    setupTags = soup.findChild('setupTag')['value'].split(' ')
    setupValue = soup.findChild('setupValue')['value'].split(' ')
    if setupValue[setupTags.index("runTimeSteps")].split(',') != 'all':
        start = integerToTimeIndex(setupModel.data.fixed, setupValue[setupTags.index("runTimeSteps")].split(',')[0])
        end = integerToTimeIndex(setupModel.data.fixed, setupValue[setupTags.index("runTimeSteps")].split(',')[1])
    else:
        start = ''
        end = ''
    timestep = setupValue[setupTags.index("timeStep")]
    components = setupValue[setupTags.index("componentNames")]
    updateTuple = (start, end, timestep, components,  set)
    # check if the setup information exists in the database
    sqlHandler = ProjectSQLiteHandler()
    dataTuple = sqlHandler.cursor.execute("select date_start, date_end, timestep, component_names, _id from setup where set_name = '" + set + "'").fetchone()
    # update setup table database columns with xml attribute information if it exists otherwise create a record
    if dataTuple is not None:
        #update

        sqlHandler.cursor.execute("UPDATE setup set date_start = ?, date_end = ?, timestep = ?,component_names = ? where set_name = ?", updateTuple)
    else:
        #insert
        sqlHandler.cursor.execute(
            "INSERT INTO setup (date_start, date_end, timestep, component_names, set_name) Values(?,?,?,?,?) ", updateTuple)

    # update the set table also
    compNames = soup.findChild('compName')['value'].split(' ')
    compTags = soup.findChild('compTag')['value'].split(' ')
    compAttrs = soup.findChild('compAttr')['value'].split(' ')
    compValues = soup.findChild('compValue')['value'].split(' ')
    for i,c in enumerate(compNames):
        dataTuple = (set,c,compTags[i],compValues[i])
        #this will result in a new row if a value has changed directly in the xml but not in the project database
        if len(sqlHandler.cursor.execute("SELECT * from sets where set_name = ? AND component = ? AND change_tag = ? AND to_value = ?", dataTuple).fetchall()) < 1:
            sqlHandler.cursor.execute("INSERT INTO sets (set_name, component, change_tag, to_value) VALUES (?,?,?,?)", dataTuple)

    sqlHandler.connection.commit()
    sqlHandler.closeDatabase()

    return
Ejemplo n.º 9
0
    def runSet(self):
        # currentSet
        currentSet = self.set
        #set info needs to be updated in the database
        setInfo = (currentSet, self.findChild(QtWidgets.QDateEdit,
                                              'startDate').text(),
                   self.findChild(QtWidgets.QDateEdit, 'endDate').text(),
                   self.findChild(QtWidgets.QLineEdit, 'timestep').text(),
                   self.findChild(QtWidgets.QLineEdit,
                                  'componentNames').text())
        sqlhandler = ProjectSQLiteHandler()
        try:
            sqlhandler.cursor.execute(
                "INSERT INTO setup(set_name, date_start, date_end, timestep, component_names) VALUES(?,?,?,?,?)",
                setInfo)
        except:
            sqlhandler.cursor.execute(
                "UPDATE setup set date_start = ?, date_end=?, timestep=?, component_names=? WHERE set_name = '"
                + setInfo[0] + "'", setInfo[1:])
        sqlhandler.connection.commit()
        sqlhandler.closeDatabase()
        uihandler = UIToHandler()

        # component table is the table associated with the button
        componentTable = self.findChild(SetTableView).model()
        if componentTable.rowCount() > 0:

            uihandler.runModels(
                currentSet, componentTable,
                self.window().findChild(QtWidgets.QWidget,
                                        'setupDialog').model)
        else:
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, "Add components",
                "You need to select component attributes to alter before running sets."
            )
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msg.exec()
Ejemplo n.º 10
0
    def functionForDeleteRecord(self, table):

        # get selected rows
        tableView = self.findChild((QtWidgets.QTableView), table)
        model = tableView.model()
        # selected is the indices of the selected rows
        selected = tableView.selectionModel().selection().indexes()
        if len(selected) == 0:
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, 'Select Rows',
                'Select rows before attempting to delete')
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msg.exec()
        else:
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, 'Confirm Delete',
                'Are you sure you want to delete the selected records?')
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok
                                   | QtWidgets.QMessageBox.Cancel)

            result = msg.exec()

            if result == QtWidgets.QMessageBox.Ok:
                handler = UIToHandler()
                removedRows = []
                for r in selected:
                    if r.row() not in removedRows:
                        if table == 'components':
                            # remove the xml files too
                            handler.removeDescriptor(
                                model.data(model.index(r.row(), 3)),
                                self.model.componentFolder)
                        removedRows.append(r.row())
                        model.removeRows(r.row(), 1)

                # Delete the record from the database and refresh the tableview
                model.submitAll()
                model.select()
Ejemplo n.º 11
0
    def writeNewXML(self):

        #tell controller to tell InputHandler package to write input xmls
        handler = UIToHandler()
        handler.makeSetup(self)
        return True
Ejemplo n.º 12
0
    def functionForLoadButton(self):
        '''The load function reads the designated setup xml, looks for descriptor xmls,
        looks for an existing project database and a pickled data object.'''

        #if we were already working on a project its state gets saved and  new project is loaded
        if (self.model.project != '') & (self.model.project is not None):
            self.model = switchProject(self)
            global model
            model = self.model

        #launch file navigator to identify setup file
        setupFile = QtWidgets.QFileDialog.getOpenFileName(
            self, "Select your setup file", self.lastProjectPath, "*xml")
        if (setupFile == ('', '')) | (setupFile is None):
            return
        model.assignSetupFolder(setupFile[0])

        # assign setup information to data model
        model.feedSetupInfo()

        # now that setup data is set display it in the form
        self.displayModelData()

        #Look for an existing project database and replace the default one with it
        if os.path.exists(
                os.path.join(self.model.projectFolder, 'project_manager')):
            print('An existing project database was found for %s.' %
                  self.model.project)

            replaceDefaultDatabase(
                os.path.join(self.model.projectFolder, 'project_manager'))
            self.projectDatabase = True
        else:
            self.projectDatabase = False
            print('An existing project database was not found for %s.' %
                  self.model.project)

        # record the current project
        self.dbHandler.insertRecord('project', ['project_path'],
                                    [setupFile[0]])

        # look for an existing data pickle
        handler = UIToHandler()
        self.model.data = handler.loadInputData(
            os.path.join(self.model.setupFolder,
                         self.model.project + 'Setup.xml'))

        if self.model.data is not None:
            self.updateModelPage(self.model.data)
            self.dataLoaded.setText('data loaded')
            #refresh the plot
            resultDisplay = self.parent().findChild(ResultsSetup)
            resultDisplay.defaultPlot()

        #look for an existing component pickle or create one from information in setup xml
        self.model.components = handler.loadComponents(
            os.path.join(self.model.setupFolder,
                         self.model.project + 'Setup.xml'))
        if self.model.components is None:
            self.getComponentsFromSetup()

        #list netcdf files previously generated
        self.netCDFsLoaded.setText(', '.join(self.listNetCDFs()))
        #TODO this part of the code always sets setsRun to false, need to implement check for models run
        #boolean indicator of whether or not model sets have already been run
        setsRun = False
        #make the data blocks editable if there are no sets already created
        #if sets have been created then input data is not editable from the interface
        if setsRun:
            msg = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Warning, "Analysis in Progress",
                "Analysis results were detected. You cannot edit input data after analysis has begun."
            )
            msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msg.exec()
        else:
            self.tabs.setEnabled(True)

            print('Loaded %s:' % model.project)

        #set the project name on the form
        self.findChild(QtWidgets.QLabel,
                       'projectTitle').setText(self.model.project)

        return