Пример #1
0
    def __readBlocksData(self):
        '''
        read block data from file
        '''
        import Base , os
        filename = os.path.join(Base.__currentProjectPath__ , 'data.df')
        if not os.path.exists(filename):
            Base.showErrorMessageBox('FileNotFound', '\'data.df\' file was not found in project path.')
            return
        
        from loadDataTools import ParseDFInputGraphData
        self.dataParser = ParseDFInputGraphData()
        
        if not self.dataParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            self.__mainWidget.ui.loadDataLabel.setText('faild')
            return

        self.__mainWidget.ui.loadDataLabel.setText('sucessed')

        print 'DF data parse successfully'    
        self.__mainWidget.enableConfigPanel(True)
        
        from DDADatabase import df_inputDatabase
        data = df_inputDatabase
        self.__mainWidget.ui.blockNumLineE.setText(str(len(df_inputDatabase.blockMatCollections)))
        print df_inputDatabase.blockMatCollections
        self.__mainWidget.ui.jointNumLineE.setText(str(len(df_inputDatabase.jointMatCollections)))
        print df_inputDatabase.jointMatCollections
        self.dataParser = None
        
        self.__setDefaultParameters()
Пример #2
0
    def __readBlocksData(self):
        '''
        read block data from file
        '''
        import Base
        filename = str( QtGui.QFileDialog.getOpenFileName(None , 'please select input file' , Base.__currentProjectPath__) )
        if not filename:
            return
        
        from loadDataTools import ParseDFInputGraphData
        self.dataParser = ParseDFInputGraphData()
        
        if not self.dataParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            return

        print 'DF data parse successfully'    
        self.__enableConfigPanel(True)
        
        from DDADatabase import df_inputDatabase
        data = df_inputDatabase
        self.configUI.ui.lineE_Path.setText(filename)                
        self.configUI.ui.lineE_BlockNum.setText(str(len(df_inputDatabase.blockMatCollections)))
        self.configUI.ui.lineE_JointNum.setText(str(len(df_inputDatabase.jointMatCollections)))
        self.__initMatConfigUI()
        
        self.dataParser = None
Пример #3
0
class DFCalculation:
    '''
    process DF
    '''
    def __init__(self):
        self.current_path = __workbenchPath__
        self.origin_path = os.getcwd()
        self.dataParser = None
        #self.__initConfigUI()
        self.__initUI()
        self.__initConnections()
        self.__mainWidget.ui.comboBox.currentIndexChanged.connect(self.__matsWidget.enableEarthquake)
                
        
    def __initUI(self):
        '''
        init the DF configuration Panel
        '''
        self.__mainWidget = Ui_DFPanel()
        self.__matsWidget = Ui_DFMaterialPanel()
        
        
    def __initConnections(self):
        '''
        init connections in self.configUI.ui
        '''
        self.__mainWidget.ui.btn_ReadPara.pressed.connect(self.__readParameters)
        self.__mainWidget.ui.btn_ReadData.pressed.connect(self.__readBlocksData)
        #self.__mainWidget.ui.btn_Calc.pressed.connect(self.__calculateDF)
        self.__mainWidget.ui.buttonBox.accepted.connect(self.accept)
        self.__mainWidget.ui.btn_Config.pressed.connect(self.__configMats)
    
    def __configMats(self):
        
        if self.__matsWidget.setEarthquakeMaxSteps(self.__mainWidget.ui.stepsNumSpinB.value()):
            self.__matsWidget.show()
        else:
            import Base
            Base.showErrorMessageBox("DataError", "The sum of Earthquake steps and earthquake start step numer is bigger than total steps for DDA analysis.\nPlease modify total step number.")
    
    def __readBlocksData(self):
        '''
        read block data from file
        '''
        import Base , os
        filename = os.path.join(Base.__currentProjectPath__ , 'data.df')
        if not os.path.exists(filename):
            Base.showErrorMessageBox('FileNotFound', '\'data.df\' file was not found in project path.')
            return
        
        from loadDataTools import ParseDFInputGraphData
        self.dataParser = ParseDFInputGraphData()
        
        if not self.dataParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            self.__mainWidget.ui.loadDataLabel.setText('faild')
            return

        self.__mainWidget.ui.loadDataLabel.setText('sucessed')

        print 'DF data parse successfully'    
        self.__mainWidget.enableConfigPanel(True)
        
        from DDADatabase import df_inputDatabase
        data = df_inputDatabase
        self.__mainWidget.ui.blockNumLineE.setText(str(len(df_inputDatabase.blockMatCollections)))
        print df_inputDatabase.blockMatCollections
        self.__mainWidget.ui.jointNumLineE.setText(str(len(df_inputDatabase.jointMatCollections)))
        print df_inputDatabase.jointMatCollections
        self.dataParser = None
        
        self.__setDefaultParameters()
        
    def __setDefaultParameters(self):
        from DDADatabase import df_inputDatabase as dfDB
        # block material
        self.__matsWidget.setContent(0,[[0.0]*14]*len(dfDB.blockMatCollections))
        nums = list(dfDB.blockMatCollections)
        for i , n in enumerate(nums):
            nums[i] = str(n)
        self.__matsWidget.setHeaders4PageIdx(0, nums)
        # joint material
        self.__matsWidget.setContent(1, [[0.0]*3]*len(dfDB.jointMatCollections))
        nums = list(dfDB.jointMatCollections)
        for i , n in enumerate(nums):
            nums[i] = str(n)
        self.__matsWidget.setHeaders4PageIdx(1, nums)
        # loading points
        self.__matsWidget.setContent(2, [[[0.0]*3]*2]*len(dfDB.loadingPoints))

                                            
    
    def __readParameters(self):
        '''
        read parameters from file
        '''
        import Base
        filename = os.path.join(Base.__currentProjectPath__ , 'parameters.df')
        if not os.path.exists(filename):
            Base.showErrorMessageBox('FileNotFound', '\'parameters.df\' file was not found in project path.')
            return

        from loadDataTools import ParseDFInputParameters
        parasParser = ParseDFInputParameters()
        
        if not parasParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            self.__mainWidget.ui.loadParasLabel.setText('faild')
            return        
        self.__mainWidget.ui.loadParasLabel.setText('sucessed')

        self.__storePara2Panel()
        
    def __storePara2Panel(self):
        from DDADatabase import df_inputDatabase
        paras = df_inputDatabase.paras
        
        self.__mainWidget.ui.StaticDynamicSpinB.setValue(paras.ifDynamic)
        self.__mainWidget.ui.stepsNumSpinB.setValue(paras.stepsNum)
        self.__mainWidget.ui.maxRatioSpinB.setValue(paras.ratio)
        self.__mainWidget.ui.timeIntervalSpinB.setValue(paras.OneSteptimeLimit)
        self.__mainWidget.ui.springStiffnessSpinB.setValue(paras.springStiffness)
        self.__mainWidget.ui.SORSpinB.setValue(paras.SOR)
        self.__mainWidget.ui.comboBox.setCurrentIndex(paras.ifRightHand)
        
        self.__matsWidget.setContent(0,  paras.blockMats )
        print 'blocks mats import done'
        self.__matsWidget.setContent(1, paras.jointMats)
        print 'joints mats import done'
        if(len(paras.loadingPointMats))>0:
            self.__matsWidget.setContent(2, paras.loadingPointMats)
            print 'loading points import done'
        if len(paras.waterControlPoints)>0:
            self.__matsWidget.setWaterUnitWeight(paras.waterUnitWeight)
            self.__matsWidget.setContent(3, paras.waterControlPoints)
        if paras.ifRightHand==1:
            self.__matsWidget.setEarthquakeParas(paras.sectionAngle\
                  , paras.gravityAcceleration , paras.earthquakeTimeInterval)
            self.__matsWidget.setEarthquakeMaxSteps(paras.stepsNum)
#            self.__matsWidget.setContent(4, paras.earthquakePoints)
            
        
    def __storePanelData2Database(self):
        from DDADatabase import df_inputDatabase
        paras = df_inputDatabase.paras
        paras.ifDynamic = self.__mainWidget.ui.StaticDynamicSpinB.value()
        paras.stepsNum = self.__mainWidget.ui.stepsNumSpinB.value()
        paras.ratio = self.__mainWidget.ui.maxRatioSpinB.value()
        paras.OneSteptimeLimit = self.__mainWidget.ui.timeIntervalSpinB.value()
        paras.springStiffness = self.__mainWidget.ui.springStiffnessSpinB.value()
        paras.SOR = self.__mainWidget.ui.SORSpinB.value()
        paras.ifRightHand = self.__mainWidget.ui.comboBox.currentIndex()
        
        paras.blockMats = self.__matsWidget.getContent(0)
        print 'blocks mats export done'
        paras.jointMats = self.__matsWidget.getContent(1)
        print 'joints mats export done'
        if(len(paras.loadingPointMats))>0:
            paras.loadingPointMats = self.__matsWidget.getContent(2)
            print 'loading points export done'
        #water
        paras.waterUnitWeight = self.__matsWidget.ui.waterUnitSpinB.value()
        paras.waterControlPoints = self.__matsWidget.getContent(3)
        
        #earthquake
        paras.sectionAngle = self.__matsWidget.ui.sectionAngleSpinBox.value()
        paras.gravityAcceleration = self.__matsWidget.ui.gravitySpinB.value()
        paras.earthquakeTimeInterval = self.__matsWidget.ui.timeSpinB.value()
#        paras.earthquakePoints = self.__matsWidget.getContent(4)
        
    def __saveParameters2File(self):
        '''
        save parameters to self.current_path/parameters.df,and revise df_Ff.c
        '''
        import Base
        outfile = open(Base.__currentProjectPath__+'/parameters.df',  'wb' )
        print Base.__currentProjectPath__+'/parameters.df'
        if not outfile:
            showErrorMessageBox('File open failed' , 'Can\'t open parameters.df')
            return
        
        # schema
        from DDADatabase import df_inputDatabase
        paras = df_inputDatabase.paras
        tmpUI = self.__mainWidget.ui
        outfile.write('%f\n%d\n%d\n%d\n%f\n%f\n%f\n'%(paras.ifDynamic\
                        , int(paras.stepsNum) , int(paras.blockMatsNum)\
                        , int(paras.jointMatsNum) , paras.ratio\
                        , paras.OneSteptimeLimit , paras.springStiffness))
        print 'schema store done.'
        
        # fixed points and loading points
        if len(df_inputDatabase.fixedPoints)>0:
            fps = len(df_inputDatabase.fixedPoints)
            outfile.write('0 '*fps )
            print 'fixed points : ' ,fps 
        if len(paras.loadingPointMats)>0:
            for lp in paras.loadingPointMats:
                outfile.write('%d '%len(lp))
            print 'loading points : ' , paras.loadingPointMats 
        outfile.write('\n')
        for lp in paras.loadingPointMats:
            for nums in lp:
                outfile.write( '%f %f %f\n'%tuple(nums))
        print 'fixed points and loading points materials store done.'
         
        # block materials
        for block in paras.blockMats:
            outfile.write( '%f %f %f %f %f\n%f %f %f\n%f %f %f\n%f %f %f\n'%(block[0] ,block[1] ,block[2]\
                               ,block[3] ,block[4] ,block[5] ,block[6] ,block[7] ,block[8] ,block[9] ,block[10]\
                               ,block[11] ,block[12] ,block[13]))
        print 'block materials store done.'
        
        # joints materials
        for joint in paras.jointMats:
            outfile.write( '%f %f %f\n'%(joint[0] ,joint[1] ,joint[2]))
        print 'joint materials store done.'
        
        # rest parameters
        if paras.ifRightHand==1: # right hand
            outfile.write('%s\n0 1 2\n'%str(self.__mainWidget.ui.SORSpinB.value()))
        else:
            outfile.write('%s\n0 0 0\n'%str(self.__mainWidget.ui.SORSpinB.value()))
        print 'all parameters store done.'
        
        # water
        outfile.write('%f\n%d %f\n'%(paras.sectionAngle \
                  ,len(paras.waterControlPoints) , paras.waterUnitWeight))
        for nums in paras.waterControlPoints:
            outfile.write('%f %f\n'%tuple(nums))
        outfile.close()
        
        #earthquake
        if not paras.ifRightHand: return
        self.__matsWidget.storeEarthquakeData()
        
    def accept(self):
        self.__storePanelData2Database()
        import Base
        Base.delaycommand(self.__calculateDF)

    def __calculateDF(self):
        '''
        save parameters to self.current_path/parameters.df , and then start calculation
        '''
        self.__saveParameters2File()

        print 'Calculation button pressed'
        
        def __calc():
            import FreeCADGui
            FreeCADGui.runCommand('DDA_DFCalc')
            import DDAGui
            DDAGui.setInterval4Calculation(self.__mainWidget.ui.spinB_framesInterval.value())
            
        import Base
        Base.delaycommand(__calc)        
        
    def GetResources(self):
        return {'Pixmap'  :'DF',
                'MenuText':  QtCore.QT_TRANSLATE_NOOP('DFCalculation','DFCalculation'),
                'ToolTip': QtCore.QT_TRANSLATE_NOOP('DFCalculation',"DF calculation process.")}
                
    def Activated(self, name="None"):
        FreeCAD.Console.PrintMessage( 'Creator activing\n')
        if FreeCAD.activeDDACommand:
            FreeCAD.activeDDACommand.finish()
        self.doc = FreeCAD.ActiveDocument
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.featureName = name
        
        if not self.doc:
            FreeCAD.Console.PrintMessage( 'FreeCAD.ActiveDocument get failed\n')
            self.finish()
        else:
            FreeCAD.activeDDACommand = self  # FreeCAD.activeDDACommand 在不同的时间会接收不同的命令
            import Base
            Base.__currentStage__ = 'DF' 
            #self.ui.show()

        # Hide Panel
        Base.setCurrentDDACommand(self)
        self.__mainWidget.show()
        
        # clear Dcoument 
        import DDADisplay
        DDADisplay.clearDocument()
        
        
        
    def IsActive(self):
        import Base
        return Base.ifReady4Drawing('DDA')
        
    
    def finish(self):
        pass
        
    def hideUI(self):
        self.__mainWidget.hide()
        import DDAGui
        DDAGui.clearCalculator()
Пример #4
0
class DFCalculation:
    '''
    process DF
    '''
    def __init__(self):
        self.current_path = __workbenchPath__
        self.origin_path = os.getcwd()
        self.dataParser = None
        self.__initConfigUI()
        self.__initConnections()
        self.__enableConfigPanel(False)
                
        
    def __initConfigUI(self):
        '''
        init the DF configuration Panel
        '''
        self.configUI = Ui_DFConfigurationPanel()
        self.matConfigUI = None
        
    def __initMatConfigUI(self):
        if self.matConfigUI:
            self.configUI.ui.btn_Config.pressed.disconnect(self.matConfigUI.show)
        
        import Base
        
        from DDADatabase import df_inputDatabase
        self.matConfigUI = Ui_DFMatParaConfigPanel(len(df_inputDatabase.blockMatCollections) \
                    , self.dataParser.loadingPointsNum, len(df_inputDatabase.jointMatCollections) )
        
        self.configUI.ui.btn_Config.pressed.connect(self.matConfigUI.show)        
        
        
    def __initConnections(self):
        '''
        init connections in self.configUI.ui
        '''
        self.configUI.ui.btn_ReadPara.pressed.connect(self.__readParameters)
        self.configUI.ui.btn_ReadData.pressed.connect(self.__readBlocksData)
        self.configUI.ui.btn_Calc.pressed.connect(self.__calculateDF)
    
    def __enableConfigPanel(self , flag):
        print 'set configuration panel : ' , flag
        self.configUI.ui.btn_ReadPara.setEnabled(flag)
        self.configUI.ui.btn_Config.setEnabled(flag)
        self.configUI.ui.btn_Calc.setEnabled(flag)
        self.configUI.ui.doubleSpinBox_IFStatic.setEnabled(flag)
        self.configUI.ui.spinBox__NumStep.setEnabled(flag)
        self.configUI.ui.spinBox_Ratio.setEnabled(flag)
        self.configUI.ui.spinBox_timeInterval.setEnabled(flag)
        self.configUI.ui.spinBox_SpringStiffness.setEnabled(flag)
        self.configUI.ui.spinBox_SOR.setEnabled(flag)

    
    def __readBlocksData(self):
        '''
        read block data from file
        '''
        import Base
        filename = str( QtGui.QFileDialog.getOpenFileName(None , 'please select input file' , Base.__currentProjectPath__) )
        if not filename:
            return
        
        from loadDataTools import ParseDFInputGraphData
        self.dataParser = ParseDFInputGraphData()
        
        if not self.dataParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            return

        print 'DF data parse successfully'    
        self.__enableConfigPanel(True)
        
        from DDADatabase import df_inputDatabase
        data = df_inputDatabase
        self.configUI.ui.lineE_Path.setText(filename)                
        self.configUI.ui.lineE_BlockNum.setText(str(len(df_inputDatabase.blockMatCollections)))
        self.configUI.ui.lineE_JointNum.setText(str(len(df_inputDatabase.jointMatCollections)))
        self.__initMatConfigUI()
        
        self.dataParser = None
        
    def __readParameters(self):
        '''
        read parameters from file
        '''
        import Base
        filename = str( QtGui.QFileDialog.getOpenFileName(None , 'please select input file' , Base.__currentProjectPath__) )
        if not filename:
            return
        from loadDataTools import ParseDFInputParameters
        parasParser = ParseDFInputParameters()
        
        if not parasParser.parse(str(filename)):
            showErrorMessageBox('Data Error' , 'the schema of file is incorrected')
            return        
        self.__storePara2Panel()
        
    def __storePara2Panel(self):
        from DDADatabase import df_inputDatabase
        paras = df_inputDatabase.paras
        
        self.configUI.ui.doubleSpinBox_IFStatic.setValue(paras.ifDynamic)
        self.configUI.ui.spinBox__NumStep.setValue(paras.stepsNum)
        self.configUI.ui.spinBox_Ratio.setValue(paras.ratio)
        self.configUI.ui.spinBox_timeInterval.setValue(paras.OneSteptimeLimit)
        self.configUI.ui.spinBox_SpringStiffness.setValue(paras.springStiffness)
        self.configUI.ui.spinBox_SOR.setValue(paras.SOR)
        self.matConfigUI.dataTableBLocksMats.writeData2Table(paras.blockMats)
        print 'blocks mats import done'
        self.matConfigUI.dataTableJointsMats.writeData2Table(paras.jointMats)
        print 'joints mats import done'
        if(len(paras.loadingPointMats))>0:
            self.matConfigUI.dataTableLoadingPointsMats.writeData2Table(paras.loadingPoints)
            print 'loading points import done'
        
    def __saveParameters2File(self):
        '''
        save parameters to self.current_path/parameters.df,and revise df_Ff.c
        '''
        import Base
        outfile = open(Base.__currentProjectPath__+'/parameters.df',  'wb' )
        if not outfile:
            showErrorMessageBox('File open failed' , 'Can\'t open parameters.df')
            return
        
        # schema
        tmpUI = self.configUI.ui
        outfile.write('%s\n%s\n%s\n%s\n%s\n%s\n%s\n'%(str(tmpUI.doubleSpinBox_IFStatic.text())\
                        , str(tmpUI.spinBox__NumStep.text()) , str(tmpUI.lineE_BlockNum.text())\
                        , str(tmpUI.lineE_JointNum.text()) , str(tmpUI.spinBox_Ratio.text())\
                        , str(tmpUI.spinBox_timeInterval.text()) , str(tmpUI.spinBox_SpringStiffness.text())))
        print 'schema store done.'
        
        # fixed points and loading points
        from DDADatabase import df_inputDatabase
        if len(df_inputDatabase.fixedPoints)>0:
            fps = len(df_inputDatabase.fixedPoints)
            outfile.write('0 '*fps +'\n')
            print 'fixed points : ' ,fps 
        if len(df_inputDatabase.loadingPoints)>0:
            lps = len(df_inputDatabase.loadingPoints)
            outfile.write('2 '*lps +'\n')
            print 'loading points : ' , lps 
        tmpTable = self.matConfigUI.tableLoadingPointsMats
        nums = [1]*6
        for i in range(len(df_inputDatabase.loadingPoints)):
            for j in range(6):
                nums[j] = str(tmpTable.item(i,j).text())
            outfile.write( '%s %s %s\n%s %s %s\n'%(nums[0] ,nums[1] ,nums[2] ,nums[3] ,nums[4] ,nums[5] ))
        print 'fixed points and loading points materials store done.'
         
        # block materials
        tmpTable = self.matConfigUI.tableBLocksMats
        nums = [1]*14
        for i in range(tmpTable.rowCount()):
            for j in range(14):
                nums[j] = str(tmpTable.item(i,j).text())
            outfile.write( '%s %s %s %s %s\n%s %s %s\n%s %s %s\n%s %s %s\n'%(nums[0] ,nums[1] ,nums[2]\
                               ,nums[3] ,nums[4] ,nums[5] ,nums[6] ,nums[7] ,nums[8] ,nums[9] ,nums[10]\
                               ,nums[11] ,nums[12] ,nums[13]))
        print 'block materials store done.'
        
        # joints materials
        tmpTable = self.matConfigUI.tableJointsMats
        nums = [1]*3
        for i in range(tmpTable.rowCount()):
            for j in range(3):
                nums[j] = str(tmpTable.item(i,j).text())
            outfile.write( '%s %s %s\n'%(nums[0] ,nums[1] ,nums[2]))
        print 'joint materials store done.'
        
        # rest parameters
        outfile.write('%s\n0 0 0'%str(self.configUI.ui.spinBox_SOR.text()))
        print 'all parameters store done.'
        
        outfile.close()
        
        import Base
        outfile = open(Base.__workbenchPath__+'/df_Ff.c' , 'wb')
        outfile.write(str(self.configUI.ui.lineE_Path.text())+'\n')
        outfile.write(Base.__currentProjectPath__+'/parameters.df')
        outfile.close()

    def __calculateDF(self):
        '''
        save parameters to self.current_path/parameters.df , and then start calculation
        '''
        if not self.matConfigUI.ifMatConfigPanelOK(): # all 3 tables' parameters are valid
            showErrorMessageBox('Data Error' , 'check recorrect parameters in tables')
            return
        self.__saveParameters2File()

        print 'Calculation button pressed'
        
        import os
        originPath = os.getcwd() 
        import Base
        print 'change dir to ' , Base.__workbenchPath__
        os.chdir(Base.__workbenchPath__)
        
        
        # begin to calculation

        processDialog =  Ui_DFCalculationProcess()
        print 'processbar widget showed'
        
        import Base
        f = open(Base.__currentProjectPath__+'/data.dg' , 'wb')  # clear file
        f.close()
        
        maxSteps = int(str(self.configUI.ui.spinBox__NumStep.text()))
#        maxSteps = 20000
        processDialog.ui.progressBar.setMaximum(maxSteps)
        processDialog.show()
        process = PyDDA.DF()
        process.calculationInit()
        for i in range(maxSteps):
            process.calculate1Step()
            processDialog.ui.progressBar.setValue(i)
            processDialog.ui.label_rate.setText('steps : %d /%d '%(i , maxSteps))
            e=QtCore.QEventLoop()
            e.processEvents()
        
        file = open('dg_ff.c' , 'wb')
        file.write(Base.__currentProjectPath__+'/data.dg')
        file.close()
        
        print 'change dir to ' , originPath
        os.chdir(originPath)        
        
    def GetResources(self):
        return {
                'MenuText':  'DFCalculation',
                'ToolTip': "DF calculation process."}
                
    def Activated(self, name="None"):
        FreeCAD.Console.PrintMessage( 'Creator activing\n')
        if FreeCAD.activeDDACommand:
            FreeCAD.activeDDACommand.finish()
        self.doc = FreeCAD.ActiveDocument
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.featureName = name
        self.ui = None
        
        if not self.doc:
            FreeCAD.Console.PrintMessage( 'FreeCAD.ActiveDocument get failed\n')
            self.finish()
        else:
            FreeCAD.activeDDACommand = self  # FreeCAD.activeDDACommand 在不同的时间会接收不同的命令
            import Base
            Base.__currentStage__ = 'DF' 
            #self.ui.show()

        # Hide Panel
        if __currentDDAPanel__ != None :
            __currentDDAPanel__.hide()
        
        self.configUI.show()        
        
    def IsActive(self):
        if FreeCADGui.ActiveDocument:
            import Base
            if len(Base.__workbenchPath__)>1 and len(Base.__currentProjectPath__)>0:
                return True
        else:
            return False
        
    
    def finish(self):
        pass