Changeset 577 for trunk/GSASII.py


Ignore:
Timestamp:
Apr 27, 2012 9:45:26 AM (10 years ago)
Author:
toby
Message:

fix error in reporting constraint errors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r570 r577  
    356356        return
    357357       
     358    def _init_Import_Sfact(self,parent):
     359        '''import all the G2importsfact*.py files that are found in the
     360        path and configure the Import Structure Factor menus accordingly
     361        '''
     362
     363        path2GSAS2 = os.path.dirname(os.path.realpath(__file__)) # location of this file
     364        pathlist = sys.path[:]
     365        if path2GSAS2 not in pathlist: pathlist.append(path2GSAS2)
     366        filelist = []
     367        for path in pathlist:
     368            for filename in glob.iglob(os.path.join(path, "G2importsfact*.py")):
     369                filelist.append(filename)   
     370                #print 'found',filename
     371        filelist = sorted(list(set(filelist))) # remove duplicates
     372        self.ImportSfactReaderlist = []
     373        for filename in filelist:
     374            path,rootname = os.path.split(filename)
     375            pkg = os.path.splitext(rootname)[0]
     376            try:
     377                fp = None
     378                fp, fppath,desc = imp.find_module(pkg,[path,])
     379                pkg = imp.load_module(pkg,fp,fppath,desc)
     380                for clss in inspect.getmembers(pkg): # find classes defined in package
     381                    if clss[0].startswith('_'): continue
     382                    if inspect.isclass(clss[1]):
     383                        # check if we have the required methods
     384                        for m in 'Reader','ExtensionValidator','ContentsValidator':
     385                            if not hasattr(clss[1],m): break
     386                            if not callable(getattr(clss[1],m)): break
     387                        else:
     388                            reader = clss[1]() # create a Structure Factor import instance
     389                            self.ImportSfactReaderlist.append(reader)
     390            except AttributeError:
     391                print 'Import_Sfact: Attribute Error',filename
     392                pass
     393            except ImportError:
     394                print 'Import_Sfact: Error importing file',filename
     395                pass
     396            finally:
     397                if fp: fp.close()
     398        submenu = wx.Menu()
     399        item = parent.AppendMenu(wx.ID_ANY, 'Import Structure Factor menu',
     400            submenu, help='Import Structure Factor data')
     401        self.SfactImportMenuId = {}
     402        item = submenu.Append(wx.ID_ANY,
     403                              help='Import Structure Factor data based selected by extension',
     404                              kind=wx.ITEM_NORMAL,text='Import Structure Factor by extension')
     405        self.Bind(wx.EVT_MENU, self.OnImportSfactGeneric, id=item.GetId())
     406        for reader in self.ImportSfactReaderlist:
     407            item = submenu.Append(wx.ID_ANY,
     408                help='Import specific format Structure Factor data',
     409                kind=wx.ITEM_NORMAL,text='Import Structure Factor '+reader.formatName+'...')
     410            self.SfactImportMenuId[item.GetId()] = reader
     411            self.Bind(wx.EVT_MENU, self.OnImportSfactGeneric, id=item.GetId())
     412
     413    def OnImportSfactGeneric(self,event):
     414        # find out which format was requested
     415        reader = self.SfactImportMenuId.get(event.GetId())
     416        if reader is None:
     417            #print "use all formats"
     418            readerlist = self.ImportSfactReaderlist
     419            choices = "any file (*.*)|*.*"
     420            extdict = {}
     421            # compile a list of allowed extensions
     422            for rd in readerlist:
     423                fmt = rd.formatName
     424                for extn in rd.extensionlist:
     425                    if not extdict.get(extn): extdict[extn] = []
     426                    extdict[extn] += [fmt,]
     427            for extn in sorted(extdict.keys(),cmp=lambda x,y: cmp(x.lower(), y.lower())):
     428                fmt = ''
     429                for f in extdict[extn]:
     430                    if fmt != "": fmt += ', '
     431                    fmt += f
     432                choices += "|" + fmt + " file (*" + extn + ")|*" + extn
     433        else:
     434            readerlist = [reader,]
     435            # compile a list of allowed extensions
     436            choices = reader.formatName + " file ("
     437            w = ""
     438            for extn in reader.extensionlist:
     439                if w != "": w += ";"
     440                w += "*" + extn
     441            choices += w + ")|" + w
     442            if not reader.strictExtension:
     443                choices += "|any file (*.*)|*.*"
     444        # get the file
     445        dlg = wx.FileDialog(
     446            self, message="Choose Structure Factor input file",
     447            #defaultDir=os.getcwd(),
     448            defaultFile="",
     449            wildcard=choices,
     450            style=wx.OPEN | wx.CHANGE_DIR
     451            )
     452        try:
     453            if dlg.ShowModal() == wx.ID_OK:
     454                file = dlg.GetPath()
     455            else: # cancel was pressed
     456                return
     457        finally:
     458            dlg.Destroy()
     459        # set what formats are compatible with this file
     460        primaryReaders = []
     461        secondaryReaders = []
     462        for reader in readerlist:
     463            flag = reader.ExtensionValidator(file)
     464            if flag is None:
     465                secondaryReaders.append(reader)
     466            elif flag:
     467                primaryReaders.append(reader)
     468        if len(secondaryReaders) + len(primaryReaders) == 0:
     469            self.ErrorDialog('No Format','No matching format for file '+file)
     470            return
     471       
     472        fp = None
     473        try:
     474            fp = open(file,'r')
     475            # try the file first with Readers that specify the
     476            # files extension and later with ones that allow it
     477            for rd in primaryReaders+secondaryReaders:
     478                if not rd.ContentsValidator(fp):
     479                    continue # rejected on cursory check
     480                #flag = rd.Reader(file,fp,self)
     481                try:
     482                    flag = rd.Reader(file,fp,self)
     483                except:
     484                    import traceback
     485                    print traceback.format_exc()
     486                    self.ErrorDialog('Read Error',
     487                                     'Error reading file '+file
     488                                     +' with format '+ rd.formatName)
     489                    continue
     490                if not flag: continue
     491#                dlg = wx.TextEntryDialog( # allow editing of Structure Factor name
     492#                    self, 'Enter the name for the new Structure Factor',
     493#                    'Edit Structure Factor name', rd.Phase['General']['Name'],
     494 #                   style=wx.OK)
     495                dlg.CenterOnParent()
     496#                if dlg.ShowModal() == wx.ID_OK:
     497#                    rd.Phase['General']['Name'] = dlg.GetValue()
     498#                dlg.Destroy()
     499#                PhaseName = rd.Phase['General']['Name']
     500#                if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     501#                    sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
     502#                else:
     503#                    sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     504#                psub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
     505#                self.PatternTree.SetItemPyData(psub,rd.Phase)
     506#                self.PatternTree.Expand(self.root) # make sure phases are seen
     507#                self.PatternTree.Expand(sub)
     508#                self.PatternTree.Expand(psub)
     509                return # success
     510        except:
     511            import traceback
     512            print traceback.format_exc()
     513            self.ErrorDialog('Open Error',
     514                             'Error on open of file '+file)
     515        finally:
     516            if fp: fp.close()
     517
     518        return
    358519
    359520    def _init_coll_Import_Items(self,parent):
     
    404565        self._init_coll_Calculate_Items(self.Calculate)
    405566        self._init_Import_Phase(self.Import)
     567        self._init_Import_Sfact(self.Import)
    406568        self._init_coll_Import_Items(self.Import)
    407569        self._init_coll_Export_Items(self.Export)
     
    706868        finally:
    707869            dlg.Destroy()
    708        
     870
     871    # this will be removed eventually
    709872    def OnSnglRead(self,event):
    710873        self.CheckNotebook()
     
    744907           
    745908    def CheckNotebook(self):
     909        '''Make sure the data tree has the minimally expected controls
     910        (BHT) correct?
     911        '''
    746912        if not G2gd.GetPatternTreeItemId(self,self.root,'Notebook'):
    747913            sub = self.PatternTree.AppendItem(parent=self.root,text='Notebook')
Note: See TracChangeset for help on using the changeset viewer.