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