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 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
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"
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"
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()
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": {
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()