Ejemplo n.º 1
0
class ExportGeoDialog(QtWidgets.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        """Constructor."""
        super(ExportGeoDialog, self).__init__(parent)
        # Set up the user interface from Designer through FORM_CLASS.
        # After self.setupUi() you can access any designer object by doing
        # self.<objectname>, and you can use autoconnect slots - see
        # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
        # #widgets-and-dialogs-with-auto-connect
        self.setupUi(self)
        tools.TitleLayout("Tetra mesh boundaries", self.boundaries,
                          self.verticalLayout)
        tools.TitleLayout("linear mesh boundaries", self.linearboundaries,
                          self.verticalLayout)

        self.meshSizeSelector = QtWidgets.QComboBox(self)
        self.meshSizeSelector.currentIndexChanged.connect(
            self.onMeshSizeSelectorActivated)
        tools.TitleLayout("Mesh size layer", self.meshSizeSelector,
                          self.verticalLayout)

        self.projectionButton = QgsProjectionSelectionWidget()
        tools.TitleLayout("Projection", self.projectionButton,
                          self.verticalLayout).label
        self.projectionLabel = QtWidgets.QLabel()
        self.verticalLayout.addWidget(self.projectionLabel)
        self.projectionLabel.hide()

        self.outputFile = tools.FileSelectorLayout("Output file", parent,
                                                   "save", "*.geo",
                                                   self.verticalLayout)
        self.outputFile.fileWidget.textChanged.connect(self.validate)

        self.runLayout = tools.CancelRunLayout(self, "Generate geometry file",
                                               self.saveGeo,
                                               self.verticalLayout)

        self.boundaries.itemChanged.connect(self.validate)
        self.linearboundaries.itemChanged.connect(self.validate)

        self.setLayout(self.verticalLayout)

    def onMeshSizeSelectorActivated(self, idx):
        layer = self.meshSizeSelector.itemData(idx)
        if layer is None:
            self.projectionLabel.hide()
            self.projectionButton.show()
        else:
            self.projectionButton.hide()
            self.projectionLabel.show()
            self.projectionLabel.setText("%s" % (layer.crs().description()))

    def validate(self):
        outputFile = self.outputFile.getFile()
        something = False
        tetraLayers = []

        for i in range(self.boundaries.count()):
            item = self.boundaries.item(i)
            if item.checkState() == Qt.Checked:
                tetraLayers += [item.data(Qt.UserRole).id()]

        self.runLayout.runButton.setEnabled(
            bool(outputFile != "" and tetraLayers))

    def saveGeo(self):
        filename = self.outputFile.getFile()
        ignoredLayers = []
        QuadLayers = []
        TetraLayers = []
        for i in range(self.boundaries.count()):
            item = self.boundaries.item(i)
            itemi = self.linearboundaries.item(i)
            if item.checkState() == Qt.Checked:
                TetraLayers += [item.data(Qt.UserRole)]
            elif itemi.checkState() == Qt.Checked:
                QuadLayers += [item.data(Qt.UserRole)]
            else:
                ignoredLayers += [item.data(Qt.UserRole)]
        meshSizeLayer = self.meshSizeSelector.itemData(
            self.meshSizeSelector.currentIndex())
        crs = self.projectionButton.crs()
        if meshSizeLayer:
            crs = meshSizeLayer.crs()

        proj = QgsProject.instance()

        proj.writeEntry("qgmsh", "geo_file", filename)
        proj.writeEntry("qgmsh", "ignored_boundary_layers", "%%".join(
            (l.id() for l in ignoredLayers)))
        proj.writeEntry("qgmsh", "tetralayers", "%%".join(
            (l.id() for l in TetraLayers)))
        proj.writeEntry("qgmsh", "quadlayers", "%%".join(
            (l.id() for l in QuadLayers)))
        proj.writeEntry("qgmsh", "projection", crs.authid())
        proj.writeEntry(
            "qgmsh", "mesh_size_layer",
            "None" if meshSizeLayer is None else meshSizeLayer.id())

        status = exportGeo(filename, TetraLayers, QuadLayers, meshSizeLayer,
                           crs)
        self.close()

    def exec_(self):
        proj = QgsProject.instance()
        self.outputFile.setFile(proj.readEntry("qgmsh", "geo_file", "")[0])
        ignoredLayers = set(
            proj.readEntry("qgmsh", "ignored_boundary_layers",
                           "")[0].split("%%"))
        tetraLayers = set(
            proj.readEntry("qgmsh", "tetralayers", "")[0].split("%%"))
        quadLayers = set(
            proj.readEntry("qgmsh", "quadlayers", "")[0].split("%%"))
        meshSizeLayerId = proj.readEntry("qgmsh", "mesh_size_layer", "None")[0]
        projid = proj.readEntry("qgmsh", "projection", "")[0]

        crs = None
        if projid:
            crs = QgsCoordinateReferenceSystem(projid)
        if crs is None or not crs.isValid():
            crs = QgsCoordinateReferenceSystem("EPSG:4326")
        self.projectionButton.setCrs(crs)
        layers = [
            tree_layer.layer() for tree_layer in
            QgsProject.instance().layerTreeRoot().findLayers()
        ]
        self.boundaries.clear()
        self.linearboundaries.clear()
        self.meshSizeSelector.clear()
        self.meshSizeSelector.addItem("None", None)
        for layer in layers:

            if layer.type() == QgsMapLayer.VectorLayer:
                item = QtWidgets.QListWidgetItem(layer.name(), self.boundaries)
                item.setData(Qt.UserRole, layer)
                item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
                item.setCheckState(Qt.Unchecked if (
                    layer.id() in ignoredLayers or layer.id() in quadLayers
                ) else Qt.Checked)
                item = QtWidgets.QListWidgetItem(layer.name(),
                                                 self.linearboundaries)
                item.setData(Qt.UserRole, layer)
                item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
                item.setCheckState(Qt.Checked if layer.id() in
                                   quadLayers else Qt.Unchecked)

            if layer.type() == QgsMapLayer.RasterLayer:
                self.meshSizeSelector.addItem(layer.name(), layer)
                if layer.id() == meshSizeLayerId:
                    self.meshSizeSelector.setCurrentIndex(
                        self.meshSizeSelector.count() - 1)

        self.runLayout.setFocus()
        self.validate()
        super(ExportGeoDialog, self).exec_()
Ejemplo n.º 2
0
class Dialog(QtWidgets.QDialog):
    def __init__(self, mainWindow, iface, meshDialog):
        super(Dialog, self).__init__(mainWindow)
        self.meshDialog = meshDialog
        self.setWindowTitle("Generate a Gmsh geometry file")
        layout = QtWidgets.QVBoxLayout()
        self.geometrySelector = QtWidgets.QListWidget()
        tools.TitleLayout("Mesh Boundaries", self.geometrySelector, layout)
        self.forceAllBndButton = QtWidgets.QCheckBox(
            "Force all boundary points")
        layout.addWidget(self.forceAllBndButton)
        self.insideSelector = QtWidgets.QListWidget()
        tools.TitleLayout("Forced line and points inside the domain",
                          self.insideSelector, layout)
        self.meshSizeSelector = QtWidgets.QComboBox(self)
        self.meshSizeSelector.currentIndexChanged.connect(
            self.onMeshSizeSelectorActivated)
        tools.TitleLayout("Mesh size layer", self.meshSizeSelector, layout)
        self.projectionButton = QgsProjectionSelectionWidget()
        tools.TitleLayout("Projection", self.projectionButton, layout).label
        self.projectionLabel = QtWidgets.QLabel()
        layout.addWidget(self.projectionLabel)
        self.projectionLabel.hide()
        self.outputFile = tools.FileSelectorLayout("Output file",
                                                   iface.mainWindow(), "save",
                                                   "*.geo", layout)
        self.outputFile.fileWidget.textChanged.connect(self.validate)
        self.geometrySelector.itemChanged.connect(self.validate)
        self.runLayout = tools.CancelRunLayout(self, "Generate geometry file",
                                               self.saveGeo, layout)
        self.setLayout(layout)
        self.forceAllBndButton.stateChanged.connect(self.validate)
        self.iface = iface
        self.resize(max(450, self.width()), self.height())

    def validate(self):
        outputFile = self.outputFile.getFile()
        something = False
        activeLayers = []
        for i in range(self.geometrySelector.count()):
            item = self.geometrySelector.item(i)
            if item.checkState() == Qt.Checked:
                activeLayers += [item.data(Qt.UserRole).id()]
        for i in range(self.insideSelector.count()):
            item = self.insideSelector.item(i)
            if item.data(Qt.UserRole).id() in activeLayers:
                item.setFlags(item.flags() & ~Qt.ItemIsEnabled)
            else:
                item.setFlags(item.flags() | Qt.ItemIsEnabled)

        self.runLayout.runButton.setEnabled(
            bool(outputFile != "" and activeLayers))

    def saveGeo(self):
        filename = self.outputFile.getFile()
        ignoredLayers = []
        insideLayers = []
        activeLayers = []
        for i in range(self.geometrySelector.count()):
            item = self.geometrySelector.item(i)
            itemi = self.insideSelector.item(i)
            if item.checkState() == Qt.Checked:
                activeLayers += [item.data(Qt.UserRole)]
            elif itemi.checkState() == Qt.Checked:
                insideLayers += [item.data(Qt.UserRole)]
            else:
                ignoredLayers += [item.data(Qt.UserRole)]
        meshSizeLayer = self.meshSizeSelector.itemData(
            self.meshSizeSelector.currentIndex())
        crs = self.projectionButton.crs()
        if meshSizeLayer:
            crs = meshSizeLayer.crs()
        forceAllBnd = self.forceAllBndButton.isChecked()
        proj = QgsProject.instance()
        proj.writeEntry("gmsh", "geo_file", filename)
        proj.writeEntry("gmsh", "ignored_boundary_layers", "%%".join(
            (l.id() for l in ignoredLayers)))
        proj.writeEntry("gmsh", "inside_layers", "%%".join(
            (l.id() for l in insideLayers)))
        proj.writeEntry("gmsh", "projection", crs.authid())
        proj.writeEntry(
            "gmsh", "mesh_size_layer",
            "None" if meshSizeLayer is None else meshSizeLayer.id())
        proj.writeEntry("gmsh", "force_all_boundary_points",
                        "True" if forceAllBnd else "False")
        status = exportGeo(filename, activeLayers, insideLayers, meshSizeLayer,
                           crs, forceAllBnd)
        self.close()
        if status:
            self.meshDialog.exec_()

    def onMeshSizeSelectorActivated(self, idx):
        layer = self.meshSizeSelector.itemData(idx)
        if layer is None:
            self.projectionLabel.hide()
            self.projectionButton.show()
        else:
            self.projectionButton.hide()
            self.projectionLabel.show()
            self.projectionLabel.setText("%s" % (layer.crs().description()))

    def exec_(self):
        proj = QgsProject.instance()
        self.outputFile.setFile(proj.readEntry("gmsh", "geo_file", "")[0])
        ignoredLayers = set(
            proj.readEntry("gmsh", "ignored_boundary_layers",
                           "")[0].split("%%"))
        insideLayers = set(
            proj.readEntry("gmsh", "inside_layers", "")[0].split("%%"))
        meshSizeLayerId = proj.readEntry("gmsh", "mesh_size_layer", "None")[0]
        projid = proj.readEntry("gmsh", "projection", "")[0]
        forceAllBnd = proj.readEntry("gmsh", "force_all_boundary_points",
                                     "False")[0] == "True"
        self.forceAllBndButton.setCheckState(
            Qt.Checked if forceAllBnd else Qt.Unchecked)
        crs = None
        if projid:
            crs = QgsCoordinateReferenceSystem(projid)
        if crs is None or not crs.isValid():
            crs = QgsCoordinateReferenceSystem("EPSG:4326")
        self.projectionButton.setCrs(crs)
        layers = [
            tree_layer.layer() for tree_layer in
            QgsProject.instance().layerTreeRoot().findLayers()
        ]
        self.geometrySelector.clear()
        self.insideSelector.clear()
        self.meshSizeSelector.clear()
        self.meshSizeSelector.addItem("None", None)
        for layer in layers:
            if layer.type() == QgsMapLayer.VectorLayer:
                item = QtWidgets.QListWidgetItem(layer.name(),
                                                 self.geometrySelector)
                item.setData(Qt.UserRole, layer)
                item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
                item.setCheckState(Qt.Unchecked if (
                    layer.id() in ignoredLayers or layer.id() in insideLayers
                ) else Qt.Checked)
                item = QtWidgets.QListWidgetItem(layer.name(),
                                                 self.insideSelector)
                item.setData(Qt.UserRole, layer)
                item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
                item.setCheckState(Qt.Checked if layer.id() in
                                   insideLayers else Qt.Unchecked)
            if layer.type() == QgsMapLayer.RasterLayer:
                self.meshSizeSelector.addItem(layer.name(), layer)
                if layer.id() == meshSizeLayerId:
                    self.meshSizeSelector.setCurrentIndex(
                        self.meshSizeSelector.count() - 1)
        self.runLayout.setFocus()
        self.validate()
        super(Dialog, self).exec_()