예제 #1
0
    def __init__(self, qgis_iface, pluginManager, settings=None):
        self.qgis_iface = qgis_iface
        self.pluginManager = pluginManager

        if settings is None:
            defaultSettings = {}
            settings = ExportSettings(pluginManager, True)
            settings.loadSettings(defaultSettings)
            settings.setMapCanvas(qgis_iface.mapCanvas())

            err_msg = settings.checkValidity()
            if err_msg:
                logMessage(err_msg or "Invalid settings")

        self.settings = settings
        self.exporter = ThreeJSExporter(settings)

        self.iface = None
        self.enabled = True
        self.extentUpdated = False
예제 #2
0
    def test01_export_scene1_webpage(self):
        """test web page export with testproject1.qgs and scene1.qto3settings"""

        mapSettings = self.loadProject(dataPath("testproject1.qgs"))

        out_path = outputPath("scene1.html")

        exporter = ThreeJSExporter()
        exporter.loadSettings(dataPath("scene1.qto3settings"))
        exporter.setMapSettings(mapSettings)
        err = exporter.export(out_path)

        assert not err, err
예제 #3
0
    def test01_gsielevtile(self):
        """test exporting with GSI elevation tile plugin"""
        mapSettings = self.loadProject(dataPath("testproject1.qgs"))

        out_path = outputPath("scene1_gsielevtile.html")

        exporter = ThreeJSExporter()
        exporter.loadSettings(dataPath("gsielevtile.qto3settings"))
        exporter.settings.localMode = exporter.settings.base64 = True

        exporter.setMapSettings(mapSettings)
        err = exporter.export(out_path)

        assert err, "export failed"
예제 #4
0
    def test02_export_scene1_webpage_localmode(self):
        """test web page export in local mode"""

        mapSettings = self.loadProject(dataPath("testproject1.qgs"))

        out_path = outputPath("scene1LC.html")

        exporter = ThreeJSExporter()
        exporter.loadSettings(dataPath("scene1.qto3settings"))
        exporter.settings.localMode = exporter.settings.base64 = True

        exporter.setMapSettings(mapSettings)
        err = exporter.export(out_path)

        assert err, "export failed"
예제 #5
0
class Q3DViewerController:
    def __init__(self, qgis_iface, pluginManager, settings=None):
        self.qgis_iface = qgis_iface
        self.pluginManager = pluginManager

        if settings is None:
            defaultSettings = {}
            settings = ExportSettings(pluginManager, True)
            settings.loadSettings(defaultSettings)
            settings.setMapCanvas(qgis_iface.mapCanvas())

            err_msg = settings.checkValidity()
            if err_msg:
                logMessage(err_msg or "Invalid settings")

        self.settings = settings
        self.exporter = ThreeJSExporter(settings)

        self.iface = None
        self.enabled = True
        self.extentUpdated = False

    def connectToIface(self, iface):
        """iface: Q3DViewerInterface"""
        self.iface = iface

        self.qgis_iface.mapCanvas().renderComplete.connect(self.canvasUpdated)
        self.qgis_iface.mapCanvas().extentsChanged.connect(
            self.canvasExtentChanged)

    def disconnectFromIface(self):
        self.iface = None

        self.qgis_iface.mapCanvas().renderComplete.disconnect(
            self.canvasUpdated)
        self.qgis_iface.mapCanvas().extentsChanged.disconnect(
            self.canvasExtentChanged)

    def getLayerList(self):
        layers = []
        for plugin in self.pluginManager.demProviderPlugins():
            layers.append({
                "layerId": "plugin:" + plugin.providerId(),
                "name": plugin.providerName(),
                "geomType": q3dconst.TYPE_DEM
            })

        for layer in getLayersInProject():
            layerType = layer.type()
            if layerType == QgsMapLayer.VectorLayer:
                geomType = {
                    QgsWkbTypes.PointGeometry: q3dconst.TYPE_POINT,
                    QgsWkbTypes.LineGeometry: q3dconst.TYPE_LINESTRING,
                    QgsWkbTypes.PolygonGeometry: q3dconst.TYPE_POLYGON,
                    QgsWkbTypes.UnknownGeometry: None,
                    QgsWkbTypes.NullGeometry: None
                }[layer.geometryType()]

            elif layerType == QgsMapLayer.RasterLayer and layer.providerType(
            ) == "gdal" and layer.bandCount() == 1:
                geomType = q3dconst.TYPE_DEM
            else:
                geomType = q3dconst.TYPE_IMAGE
                continue

            if geomType is not None:
                layers.append({
                    "layerId": layer.id(),
                    "name": layer.name(),
                    "geomType": geomType,
                    "properties": None
                })

        return layers

    def exportScene(self):
        if self.iface:
            self.iface.loadJSONObject(self.exporter.exportScene(False))

    def exportLayer(self, layer):
        if self.iface and self.enabled:
            if layer["geomType"] == q3dconst.TYPE_DEM:
                self.iface.loadJSONObject(
                    self.exporter.exportDEMLayer(layer["layerId"],
                                                 layer["properties"],
                                                 layer["jsLayerId"],
                                                 layer["visible"]))
            elif layer["geomType"] in [
                    q3dconst.TYPE_POINT, q3dconst.TYPE_LINESTRING,
                    q3dconst.TYPE_POLYGON
            ]:
                self.iface.loadJSONObject(
                    self.exporter.exportVectorLayer(layer["layerId"],
                                                    layer["properties"],
                                                    layer["jsLayerId"],
                                                    layer["visible"]))
            layer["updated"] = False

    def setEnabled(self, enabled):
        if self.iface is None:
            return

        self.enabled = enabled
        self.iface.runString("app.resume();" if enabled else "app.pause();")
        if enabled:
            # update layers
            for layerId, layer in enumerate(self.iface.treeView.layers):
                if layer.get("updated",
                             False) or (self.extentUpdated
                                        and layer.get("visible", False)):
                    self.exportLayer(layer)

            self.extentUpdated = False

    def canvasUpdated(self, painter):
        # update map settings
        self.exporter.settings.setMapCanvas(self.qgis_iface.mapCanvas())

        if self.iface and self.enabled:
            for layer in self.iface.treeView.layers:
                if layer["visible"]:
                    self.exportLayer(layer)
            self.extentUpdated = False

    def canvasExtentChanged(self):
        self.extentUpdated = True

        # update map settings
        self.exporter.settings.setMapCanvas(self.qgis_iface.mapCanvas())

        # update scene properties
        self.exportScene()
예제 #6
0
    path_tmpl = "/home/knobuntu/QGis/cryoland/FSC3D/" + bassin + fscusuel + ".html"
    print(path)

    # Get map settings from the map canvas
    mapSettings = canvas.mapSettings()

    # apply the above extent to map settings
    #RotatedRect(center, width, height, rotation).toMapSettings(mapSettings)

    #
    # 1. export scene as web page
    #

    filename = "/home/knobuntu/QGis/cryoland/FSC3D/" + bassin + fscusuel + ".html"

    exporter = ThreeJSExporter()
    exporter.loadSettings(
        path_to_settings
    )  # export settings (for scene, layers, decorations and so on)
    exporter.setMapSettings(
        mapSettings)  # extent, texture size, layers to be rendered and so on
    exporter.export(filename)

    # 2. export scene as image
    #

    filename = "/home/knobuntu/QGis/cryoland/FSC3D/image.png"

    # camera position and camera target in world coordinate system (y-up)
    CAMERA = {
        "position": {
예제 #7
0
class Q3DViewerController:
    def __init__(self, qgis_iface, pluginManager, settings=None):
        self.qgis_iface = qgis_iface
        self.pluginManager = pluginManager

        if settings is None:
            defaultSettings = {}
            settings = ExportSettings(pluginManager, True)
            settings.loadSettings(defaultSettings)
            settings.setMapCanvas(qgis_iface.mapCanvas())

            err_msg = settings.checkValidity()
            if err_msg:
                logMessage(err_msg or "Invalid settings")

        self.settings = settings
        self.exporter = ThreeJSExporter(settings)

        self.iface = None
        self.enabled = True
        self.extentUpdated = False

    def connectToIface(self, iface):
        """iface: Q3DViewerInterface"""
        self.iface = iface

        self.qgis_iface.mapCanvas().renderComplete.connect(self.canvasUpdated)
        self.qgis_iface.mapCanvas().extentsChanged.connect(
            self.canvasExtentChanged)

    def disconnectFromIface(self):
        self.iface = None

        self.qgis_iface.mapCanvas().renderComplete.disconnect(
            self.canvasUpdated)
        self.qgis_iface.mapCanvas().extentsChanged.disconnect(
            self.canvasExtentChanged)

    def exportScene(self):
        if self.iface:
            self.extentUpdated = True
            self.exporter.settings.setMapCanvas(self.qgis_iface.mapCanvas())
            self.iface.loadJSONObject(self.exporter.exportScene(False))

    def exportLayer(self, layer):
        if self.iface and self.enabled:
            if layer.geomType == q3dconst.TYPE_DEM:
                for exporter in self.exporter.demExporters(layer):
                    self.iface.loadJSONObject(exporter.build())
                    QgsApplication.processEvents(
                        QEventLoop.ExcludeUserInputEvents)
                    # NOTE: process events only for the calling thread

            elif layer.geomType in [
                    q3dconst.TYPE_POINT, q3dconst.TYPE_LINESTRING,
                    q3dconst.TYPE_POLYGON
            ]:
                for exporter in self.exporter.vectorExporters(layer):
                    self.iface.loadJSONObject(exporter.build())
                    QgsApplication.processEvents(
                        QEventLoop.ExcludeUserInputEvents)

            layer.updated = False

    def setEnabled(self, enabled):
        if self.iface is None:
            return

        self.enabled = enabled
        self.iface.runString("app.resume();" if enabled else "app.pause();")
        if enabled:
            # update layers
            for layerId, layer in enumerate(
                    self.iface.controller.settings.getLayerList()):
                if layer.updated or (self.extentUpdated and layer.visible):
                    self.exportLayer(layer)

            self.extentUpdated = False

    def updateExtent(self):
        self.exporter.settings.setMapCanvas(self.qgis_iface.mapCanvas())

    def canvasUpdated(self, painter):
        # update map settings
        self.exporter.settings.setMapCanvas(self.qgis_iface.mapCanvas())

        if self.iface and self.enabled:
            for layer in self.iface.controller.settings.getLayerList():
                if layer.visible:
                    self.exportLayer(layer)
            self.extentUpdated = False

    def canvasExtentChanged(self):
        self.exportScene()