def tuflowqgis_apply_check_tf(qgis): #apply check file styles to all open shapefiles error = False message = None #load style layers using tuflowqgis_styles tf_styles = tuflowqgis_styles.TF_Styles() error, message = tf_styles.Load() if error: return error, message for layer_name, layer in QgsMapLayerRegistry.instance().mapLayers( ).iteritems(): if layer.type() == QgsMapLayer.VectorLayer: if (layer.source()[-4:].upper() == '.SHP'): layer_fname = os.path.split(layer.source())[1][:-4] #QMessageBox.information(qgis.mainWindow(), "DEBUG", "shp layer name = "+layer.name()) renderer = region_renderer(layer) if renderer: #if the file requires a attribute based rendered (e.g. BC_Name for a _sac_check_R) layer.setRendererV2(renderer) layer.triggerRepaint() else: # use .qml style using tf_styles error, message, slyr = tf_styles.Find( layer_fname ) #use tuflow styles to find longest matching if error: return error, message if slyr: #style layer found: layer.loadNamedStyle(slyr) layer.triggerRepaint() return error, message
def tuflowqgis_import_check_tf(qgis, basepath, runID, showchecks): #import check file styles using class tf_styles = tuflowqgis_styles.TF_Styles() error, message = tf_styles.Load() if error: QMessageBox.critical(qgis.mainWindow(), "Error", message) return message if (basepath == None): return "Invalid location specified" # Get all the check files in the given directory check_files = glob.glob(basepath + '\*' + runID + '*.shp') if len(check_files) > 100: QMessageBox.critical(qgis.mainWindow(), "Info", ( "You have selected over 100 check files. You can use the RunID to reduce this selection." )) return "Too many check files selected" if not check_files: check_files = glob.glob(basepath + '\*' + runID + '*.mif') if len(check_files) > 0: return ".MIF Files are not supported, only .SHP files." else: return "No check files found for this RunID in this location." # Get the legend interface legint = qgis.legendInterface() # Add each layer to QGIS and style for chk in check_files: pfft, fname = os.path.split(chk) #QMessageBox.information(qgis.mainWindow(),"Debug", fname) fname = fname[:-4] layer = qgis.addVectorLayer(chk, fname, "ogr") renderer = region_renderer(layer) if renderer: #if the file requires a attribute based rendered (e.g. BC_Name for a _sac_check_R) layer.setRendererV2(renderer) layer.triggerRepaint() else: # use .qml style using tf_styles error, message, slyr = tf_styles.Find( fname) #use tuflow styles to find longest matching if error: QMessageBox.critical(qgis.mainWindow(), "ERROR", message) return message if slyr: #style layer found: layer.loadNamedStyle(slyr) if os.path.split(slyr)[1][:-4] == '_zpt_check': legint.setLayerVisible(layer, False) # Switch off by default elif '_uvpt_check' in fname or '_grd_check' in fname: legint.setLayerVisible(layer, False) if not showchecks: legint.setLayerVisible(layer, False) message = None #normal return return message
def tuflowqgis_apply_check_tf_clayer(qgis): error = False message = None try: canvas = qgis.mapCanvas() except: error = True message = "ERROR - Unexpected error trying to QGIS canvas layer." return error, message try: cLayer = canvas.currentLayer() except: error = True message = "ERROR - Unable to get current layer, ensure a selection is made" return error, message #load style layers using tuflowqgis_styles tf_styles = tuflowqgis_styles.TF_Styles() error, message = tf_styles.Load() if error: return error, message if cLayer.type() == QgsMapLayer.VectorLayer: if (cLayer.source()[-4:].upper() == '.SHP'): layer_fname = os.path.split(cLayer.source())[1][:-4] #QMessageBox.information(qgis.mainWindow(), "DEBUG", "shp layer name = "+cLayer.name()) renderer = region_renderer(cLayer) if renderer: #if the file requires a attribute based rendered (e.g. BC_Name for a _sac_check_R) cLayer.setRendererV2(renderer) cLayer.triggerRepaint() else: # use .qml style using tf_styles error, message, slyr = tf_styles.Find( layer_fname) #use tuflow styles to find longest matching if error: return error, message if slyr: #style layer found: cLayer.loadNamedStyle(slyr) cLayer.triggerRepaint() else: error = True message = 'ERROR - Layer is not a shapefile: ' + cLayer.source() return error, message else: error = True message = 'ERROR - Layer is not a vector layer: ' + cLayer.source() return error, message return error, message
def open(self, tpOpen, intFile, defaultPath): self.tpOpen = tpOpen self.intFile = intFile self.defaultPath = defaultPath # check if TuPLOT is already running, otherwise open dialog and let user select tpc try: poll = self.tpOpen.poll() if poll == None: next else: break_statement # break the try statement. 'break' command doesn't seem to work! except: # TuPLOT is not running. Open dialog so user can choose .tpc self.tpcFile = QFileDialog.getOpenFileNames( self.iface.mainWindow(), 'Select TUFLOW Plot Control (.tpc)', self.defaultPath, "TUFLOW Plot Results (*.tpc)") if len(self.tpcFile) < 1: return 'not open', '', self.defaultPath self.tpcFile = self.tpcFile[0] fpath = os.path.dirname(self.tpcFile) self.defaultPath = fpath # next time it will open to this location # Ask user if they want to import gis layers as well alsoOpenGIS = QMessageBox.question( self.iface.mainWindow(), "TuPLOT", 'Do you also want to open result GIS layer?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) # Add gis layers if alsoOpenGIS == QMessageBox.Yes: error, message, gisLayers, nPoints, nLines, nRegions = open_gis( self.tpcFile) if error: # something has gone wrong QMessageBox.information(self.iface.mainWindow(), "TuPLOT: Error", message) else: # all good and now reading in the gis layers to arcmap for layer in gisLayers: if (os.path.basename(layer)[-6:-4] == '_P' and nPoints > 0) or ( os.path.basename(layer)[-6:-4] == '_L' and nLines > 0) or ( os.path.basename(layer)[-6:-4] == '_R' and nRegions > 0): addLayer = self.iface.addVectorLayer( layer, os.path.basename(layer)[:-4], "ogr") # apply tuflow style to imported gis layer try: tf_styles = tuflowqgis_styles.TF_Styles() error, message = tf_styles.Load() error, message, slyr = tf_styles.Find( os.path.basename(addLayer.source())[:-4], addLayer ) #use tuflow styles to find longest matching if error: return error, message if slyr: #style layer found: addLayer.loadNamedStyle(slyr) addLayer.triggerRepaint() except: next # specify .int file self.intFile = os.path.splitext(self.tpcFile)[0] + '.int' iterator = 1 while os.path.isfile(self.intFile): self.intFile = os.path.splitext( self.tpcFile)[0] + '[' + str(iterator) + ']' + '.int' iterator += 1 # write .int file for selected features (if any) try: cLayer = self.iface.mapCanvas().currentLayer() cSelection = cLayer.selectedFeatures() # get geometry type for .int file if cLayer and (cLayer.type() == QgsMapLayer.VectorLayer): geom_type = cLayer.geometryType() if geom_type == 0: geom_type = 'Point' valid = True elif geom_type == 1: geom_type = 'Line' valid = True elif geom_type == 2: geom_type = 'Region' else: message = "Unexpected input geometry." else: message = "Invalid layer or no layer selected" # get attributes for .int file attributes = [] try: for feature in cSelection: try: attribute = [] featureID = feature['ID'].strip() attribute.append(feature['ID'].strip()) attribute.append(feature['Type'].strip()) attribute.append(feature['Source'].strip()) attributes.append(attribute) except: warning = True #suppress the warning below, most likely due to a "X" type channel or blank name except: message = 'Not a valid TUFLOW result file layer.' create_int(self.intFile, geom_type, attributes) except: # no features selected create_int(self.intFile, "", []) # open tkinter program try: # check to see if TuPlot is already running poll = self.tpOpen.poll() if poll == None: # TuPLOT is already running return self.tpOpen, self.intFile, self.defaultPath else: break_statement # break the try statement. 'break' command doesn't seem to work! except: # Tuplot is not running: open tuplot pid = str(os.getpid()) + ".pid" try: # tpLocation not defined, but left in to be consistent with ArcGIS version tpArgs = [ 'python', tpLocation, self.intFile, self.tpcFile, pid ] except: tpArgs = [ 'python', os.path.join(current_path, 'tkinter_tuplot.py'), self.intFile, self.tpcFile, pid ] CREATE_NO_WINDOW = 0x08000000 # suppresses python console window #logfile = open(r'C:\TUFLOW\TUPLOT\example_results\plot\log.txt', 'w') #self.tpOpen = subprocess.Popen(tpArgs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # creationflags=CREATE_NO_WINDOW) #try: # for line in self.tpOpen.stdout: # #sys.stdout.write(line) # logfile.write(line) # self.tpOpen.wait() # logfile.close() #except: # logfile.close() self.tpOpen = Popen(tpArgs, creationflags=CREATE_NO_WINDOW) return self.tpOpen, self.intFile, self.defaultPath
def tuflowqgis_import_check_tf(qgis, basepath, runID, showchecks): #import check file styles using class tf_styles = tuflowqgis_styles.TF_Styles() error, message = tf_styles.Load() if error: QMessageBox.critical(qgis.mainWindow(), "Error", message) return message if (basepath == None): return "Invalid location specified" # Get all the check files in the given directory check_files = glob.glob(basepath + '\*' + runID + '*.shp') + glob.glob(basepath + '\*' + runID + '*.mif') if len(check_files) > 100: QMessageBox.critical(qgis.mainWindow(), "Info", ( "You have selected over 100 check files. You can use the RunID to reduce this selection." )) return "Too many check files selected" #if not check_files: # check_files = glob.glob(basepath + '\*'+ runID +'*.mif') # if len(check_files) > 0: # return ".MIF Files are not supported, only .SHP files." # else: # return "No check files found for this RunID in this location." # Get the legend interface (qgis.legendInterface() no longer supported) legint = QgsProject.instance().layerTreeRoot() # Add each layer to QGIS and style for chk in check_files: pfft, fname = os.path.split(chk) fname = fname[:-4] layer = qgis.addVectorLayer(chk, fname, "ogr") if layer is None: # probably a mif file with 2 geometry types, have to redefine layer object for layer_name, layer_object in QgsProject.instance().mapLayers( ).items(): if fname in layer_name: layer = layer_object renderer = region_renderer(qgis, layer) if renderer: #if the file requires a attribute based rendered (e.g. BC_Name for a _sac_check_R) layer.setRenderer(renderer) layer.triggerRepaint() else: # use .qml style using tf_styles error, message, slyr = tf_styles.Find( fname, layer) #use tuflow styles to find longest matching if error: QMessageBox.critical(qgis.mainWindow(), "ERROR", message) return message if slyr: #style layer found: layer.loadNamedStyle(slyr) #if os.path.split(slyr)[1][:-4] == '_zpt_check': # legint.setLayerVisible(layer, False) # Switch off by default #elif '_uvpt_check' in fname or '_grd_check' in fname: # legint.setLayerVisible(layer, False) #if not showchecks: # legint.setLayerVisible(layer, False) for item in legint.children(): if 'zpt check' in item.name().lower() or 'uvpt check' in item.name().lower() or 'grd check' in item.name().lower() or \ 'zpt_check' in item.name().lower() or 'uvpt_check' in item.name().lower() or 'grd_check' in item.name().lower(): item.setItemVisibilityChecked(False) elif not showchecks: item.setItemVisibilityChecked(False) message = None #normal return return message