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_()
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_()