def restoreTimeLayers(self, layerInfos): """restore all time layers""" if layerInfos: if len(layerInfos) > 0: self.guiControl.enableAnimationExport() for l in layerInfos: # for every layer entry try: settings = ls.getSettingsFromSaveStr(l) if settings.layer is None: error_msg = "Could not restore layer with id {} from saved project line {}". \ format(settings.layerId, l) error(error_msg) self.showMessage(error_msg) continue timeLayer = TimeLayerFactory.get_timelayer_class_from_settings( settings)(settings, iface=self.iface) except Exception, e: layerId = "unknown" try: layerId = settings.layerId except: pass error_msg = "An error occured while trying to restore layer " + layerId \ + " to TimeManager. " + str(e) error(error_msg + traceback.format_exc(e)) self.showMessage(error_msg) continue self.timeLayerManager.registerTimeLayer(timeLayer) self.guiControl.refreshMapCanvas('restoreTimeLayer')
def refreshGuiWithCurrentTime(self, currentTimePosition, sender=None): """update the gui when time has changed by refreshing/repainting the layers and changing the time showing in dateTimeEditCurrentTime and horizontalTimeSlider""" # setting the gui elements should not fire the event for # timeChanged, since they were changed to be in sync with the rest of the system on # purpose, no need to sync the system again self.setPropagateGuiChanges(False) if currentTimePosition is None: self.setPropagateGuiChanges(True) return time_util.updateUi(self.guiControl.getTimeWidget(), currentTimePosition) timeval = datetime_to_epoch(currentTimePosition) timeExtents = self.getTimeLayerManager().getProjectTimeExtents() try: pct = (timeval - datetime_to_epoch(timeExtents[0])) * 1.0 / ( datetime_to_epoch(timeExtents[1]) - datetime_to_epoch(timeExtents[0])) sliderVal = self.guiControl.dock.horizontalTimeSlider.minimum( ) + int(pct * (self.guiControl.dock.horizontalTimeSlider.maximum() - self.guiControl.dock.horizontalTimeSlider.minimum())) self.guiControl.dock.horizontalTimeSlider.setValue(sliderVal) self.guiControl.repaintRasters() self.guiControl.repaintJoined() self.guiControl.repaintVectors() self.guiControl.refreshMapCanvas() except Exception, e: error(e)
def restoreTimeLayers(self, layerInfos): """restore all time layers""" if layerInfos: if len(layerInfos) > 0: self.guiControl.enableAnimationExport() for l in layerInfos: # for every layer entry try: settings = ls.getSettingsFromSaveStr(l) if settings.layer is None: error_msg = "Could not restore layer with id {} from saved project line {}". \ format(settings.layerId, l) error(error_msg) self.showMessage(error_msg) continue timeLayer = TimeLayerFactory.get_timelayer_class_from_settings(settings)( settings, iface=self.iface) except Exception, e: layerId = "unknown" try: layerId = settings.layerId except: pass error_msg = "An error occured while trying to restore layer " + layerId \ + " to TimeManager. " + str(e) error(error_msg + traceback.format_exc(e)) self.showMessage(error_msg) continue self.timeLayerManager.registerTimeLayer(timeLayer) self.guiControl.refreshMapCanvas('restoreTimeLayer')
def refreshGuiWithCurrentTime(self, currentTimePosition, sender=None): """update the gui when time has changed by refreshing/repainting the layers and changing the time showing in dateTimeEditCurrentTime and horizontalTimeSlider""" # setting the gui elements should not fire the event for # timeChanged, since they were changed to be in sync with the rest of the system on # purpose, no need to sync the system again self.setPropagateGuiChanges(False) timeExtent = self.getTimeLayerManager().getProjectTimeExtents() if currentTimePosition is None or timeExtent[0] is None or timeExtent[1] is None: self.setPropagateGuiChanges(True) return time_util.updateUi(self.guiControl.getTimeWidget(), currentTimePosition) timeval = datetime_to_epoch(currentTimePosition) timeExtents = self.getTimeLayerManager().getProjectTimeExtents() try: pct = (timeval - datetime_to_epoch(timeExtents[0])) * 1.0 / (datetime_to_epoch( timeExtents[1]) - datetime_to_epoch(timeExtents[0])) sliderVal = self.guiControl.dock.horizontalTimeSlider.minimum() + int(pct * ( self.guiControl.dock.horizontalTimeSlider.maximum() - self.guiControl.dock.horizontalTimeSlider.minimum())) self.guiControl.dock.horizontalTimeSlider.setValue(sliderVal) self.guiControl.repaintRasters() self.guiControl.repaintJoined() self.guiControl.repaintVectors() self.guiControl.refreshMapCanvas() except Exception, e: error(e)
def setArchaeology(self, enabled=0): if enabled == 0: if filter(lambda x: time_util.is_archaeological_layer(x), self.getTimeLayerManager().layers()): QMessageBox.information(self.iface.mainWindow(), 'Error', "Already have archaeological layers in the project." + "Please delete them to switch to normal mode") self.guiControl.setArchaeologyPressed(True) return time_util.setCurrentMode(time_util.NORMAL_MODE) self.guiControl.setWindowTitle("Time Manager") self.guiControl.setArchaeologyPressed(False) self.guiControl.disableArchaeologyTextBox() else: if filter(lambda x: not time_util.is_archaeological_layer(x), self.getTimeLayerManager().layers()): QMessageBox.information(self.iface.mainWindow(), 'Error', "Already have non archaeological layers in the project." + "Please delete them to switch to archaeological mode") self.guiControl.setArchaeologyPressed(False) return time_util.setCurrentMode(time_util.ARCHAELOGY_MODE) self.guiControl.setWindowTitle("Time Manager Archaeology Mode") self.guiControl.setArchaeologyPressed(True) ctx = self.guiControl.dock.objectName() try: self.guiControl.setTimeFrameType(QCoreApplication.translate(ctx, 'years')) except: error("should only happen during testing") self.guiControl.enableArchaeologyTextBox() self.showMessage( "Archaelogy mode enabled. Expecting data of the form {0} BC or {0} AD.".format( "Y" * time_util.getArchDigits()) + " Disable to work with regular datetimes from year 1 onwards")
def change_i18n(self, new_lang): """Change internationalisation for the plugin. Override the system locale and then see if we can get a valid translation file for whatever locale is effectively being used. """ #os.environ["LANG"] = str(new_lang) root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) translation_path = os.path.join( root, self.name, I18N_FOLDER, self.name + "_" + str(new_lang) + ".qm") if os.path.exists(translation_path): self.translator = QTranslator() result = self.translator.load(translation_path) if not result: error( "Translation file {} for lang {} was not loaded properly," + "falling back to English".format(translation_path, new_lang)) return if qVersion() > "4.3.3": QCoreApplication.installTranslator(self.translator) else: self.translator = None warn("Translation not supported for Qt <= {}".format( qVersion())) else: if new_lang != "en": warn("Translation failed for lang {}, falling back to English". format(new_lang))
def change_i18n(self, new_lang): """Change internationalisation for the plugin. Override the system locale and then see if we can get a valid translation file for whatever locale is effectively being used. """ #os.environ["LANG"] = str(new_lang) root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) translation_path = os.path.join( root, self.name, I18N_FOLDER, self.name+"_" + str(new_lang) + ".qm") if os.path.exists(translation_path): self.translator = QTranslator() result = self.translator.load(translation_path) if not result: error( "Translation file {} for lang {} was not loaded properly," + "falling back to English".format(translation_path, new_lang) ) return if qVersion() > "4.3.3": QCoreApplication.installTranslator(self.translator) else: self.translator = None warn("Translation not supported for Qt <= {}".format(qVersion())) else: if new_lang != "en": warn("Translation failed for lang {}, falling back to English".format(new_lang))
def toggleAnimation(self): """toggle animation on/off""" if self.animationActivated: self.animationActivated = False else: self.animationActivated = True self.animationFrameCounter = 0 expectedNumberOfFrames = self.timeLayerManager.getFrameCount() if expectedNumberOfFrames == 0: # will be zero if no layer is time managed self.animationActivated = False if len(self.getTimeLayerManager().getTimeLayerList()) > 0: error("Have layers, but animation not possible") self.exportNameDigits = len(str(expectedNumberOfFrames)) self.startAnimation() # if animation is activated, it will start
def toggleAnimation(self): """toggle animation on/off""" if self.animationActivated: self.animationActivated = False else: self.animationActivated = True self.animationFrameCounter = 0 expectedNumberOfFrames = self.timeLayerManager.getFrameCount() if expectedNumberOfFrames == 0: # will be zero if no layer is time managed self.animationActivated = False if len(self.getTimeLayerManager().getTimeLayerList()) > 0: error("Have layers, but animation not possible") self.exportNameDigits = len(str(expectedNumberOfFrames)) + 1 # add 1 to deal with cornercases (hacky fix) self.startAnimation() # if animation is activated, it will start
def __init__(self, settings, iface=None): TimeLayer.__init__(self, settings.layer, settings.isEnabled) try: self.layer = settings.layer self.iface = iface self.minValue, self.maxValue = None, None self.fromTimeAttribute = settings.startTimeAttribute self.toTimeAttribute = settings.endTimeAttribute if settings.endTimeAttribute != "" \ else self.fromTimeAttribute self.accumulate = settings.accumulate self.originalSubsetString = settings.subsetStr self.currSubsetString = self.originalSubsetString self.setSubsetString(self.originalSubsetString) self.geometriesCount = settings.geometriesCount self.type = time_util.DateTypes.determine_type( self.getRawMinValue()) if self.type not in time_util.DateTypes.QDateTypes: # call to throw an exception early if no format can be found self.findValidValues(self.fromTimeAttribute, settings.timeFormat) if self.fromTimeAttribute != self.toTimeAttribute: self.findValidValues(self.toTimeAttribute, settings.timeFormat) self.timeFormat = self.determine_format(self.getRawMinValue(), settings.timeFormat) if self.toTimeAttribute != self.fromTimeAttribute: type2 = time_util.DateTypes.determine_type( self.getRawMaxValue()) tf2 = self.determine_format(self.getRawMaxValue(), settings.timeFormat) if self.type != type2 or self.timeFormat != tf2: raise InvalidTimeLayerError( "Invalid time layer: To and From attributes must have " "exact same format") self.offset = int(settings.offset) assert (self.timeFormat != time_util.PENDING) extents = self.getTimeExtents() info("Layer extents" + str(extents)) except ValueError: # ValueErrors appear for virtual layers, see https://github.com/anitagraser/TimeManager/issues/219 raise InvalidTimeLayerError( 'This layer type is currently not supported.') except Exception, e: error(traceback.format_exc(e)) raise InvalidTimeLayerError(e)
def createTimeLayerFromRow(self, row): """create a TimeLayer from options set in the table row""" try: settings = ls.getSettingsFromRow(self.guiControl.optionsDialog.tableWidget, row) timeLayer = TimeLayerFactory.get_timelayer_class_from_settings(settings)(settings, self.iface) except Exception, e: layer_name = "unknown" try: layer_name = settings.layer.name() except: pass error_msg = "An error occured while trying to add layer " \ + layer_name + " to TimeManager. Cause: " + str(e) error(error_msg + traceback.format_exc(e)) self.showMessage(error_msg) return None
def __init__(self, settings, iface=None): TimeLayer.__init__(self, settings.layer, settings.isEnabled) try: self.layer = settings.layer self.iface = iface self.minValue, self.maxValue = None, None self.fromTimeAttribute = settings.startTimeAttribute self.toTimeAttribute = settings.endTimeAttribute if settings.endTimeAttribute != ""\ else self.fromTimeAttribute self.accumulate = settings.accumulate self.originalSubsetString = settings.subsetStr self.currSubsetString = self.originalSubsetString self.setSubsetString(self.originalSubsetString) self.geometriesCount = settings.geometriesCount self.type = DateTypes.determine_type(self.getRawMinValue()) if self.type not in DateTypes.QDateTypes: # call to throw an exception early if no format can be found self.findValidValues(self.fromTimeAttribute, settings.timeFormat) if self.fromTimeAttribute != self.toTimeAttribute: self.findValidValues(self.toTimeAttribute, settings.timeFormat) self.timeFormat = self.determine_format(self.getRawMinValue(), settings.timeFormat) if self.toTimeAttribute != self.fromTimeAttribute: type2 = DateTypes.determine_type(self.getRawMaxValue()) tf2 = self.determine_format(self.getRawMaxValue(), settings.timeFormat) if self.type != type2 or self.timeFormat != tf2: raise InvalidTimeLayerError( "Invalid time layer: To and From attributes must have " "exact same format") self.offset = int(settings.offset) assert (self.timeFormat != time_util.PENDING) extents = self.getTimeExtents() info("Layer extents" + str(extents)) except Exception, e: error(traceback.format_exc(e)) raise InvalidTimeLayerError(e)