Skip to content

Commit

Permalink
ModelFile: encode model file to base64 in local mode
Browse files Browse the repository at this point in the history
  • Loading branch information
minorua committed Jan 18, 2020
1 parent 4b7cd6b commit 3c60310
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 15 deletions.
4 changes: 2 additions & 2 deletions buildvector.py
Expand Up @@ -469,8 +469,8 @@ def build(self, build_blocks=False):
for feat in vlayer.features(request):
feat.model = vlayer.objectType.model(self.settings, vlayer, feat)
self.features.append(feat)
data["models"] = self.modelManager.build(self.pathRoot is not None)

data["models"] = self.modelManager.build(self.pathRoot is not None,
base64=self.settings.base64)
if build_blocks:
data["blocks"] = [block.build() for block in self.blocks()]

Expand Down
20 changes: 13 additions & 7 deletions datamanager.py
Expand Up @@ -335,18 +335,24 @@ def __init__(self, exportSettings):
def modelIndex(self, path):
return self._index(path)

def build(self, export=True):
def build(self, export=True, base64=False):
a = []
for path_url in self._list:
if path_url.startswith("http:") or path_url.startswith("https:"):
url = path_url
elif export:
url = "./data/{}/models/{}".format(self.exportSettings.outputFileTitle(),
os.path.basename(path_url))
a.append({"url": path_url})
elif base64:
_, ext = os.path.splitext(path_url)
a.append({"base64": tools.base64file(path_url),
"ext": ext[1:],
"resourcePath": "./data/{}/models/".format(self.exportSettings.outputFileTitle())})
else:
url = QUrl.fromLocalFile(path_url).toString()
if export:
url = "./data/{}/models/{}".format(self.exportSettings.outputFileTitle(),
os.path.basename(path_url))
else:
url = QUrl.fromLocalFile(path_url).toString()

a.append({"url": url})
a.append({"url": url})
return a

def hasColladaModel(self):
Expand Down
45 changes: 39 additions & 6 deletions js/Qgis2threejs.js
Expand Up @@ -654,6 +654,26 @@ limitations:
});
};


app.loadModelData = function (data, ext, resourcePath, callback) {

if (ext == "dae") {
var model = new THREE.ColladaLoader(app.loadingManager).parse(data, resourcePath);
if (callback) callback(model);
}
else if (ext == "gltf" || ext == "glb") {
new THREE.GLTFLoader(app.loadingManager).parse(data, resourcePath, function (model) {
if (callback) callback(model);
}, function (e) {
console.log("Failed to load a glTF model: " + e);
});
}
else {
console.log("Model file type not supported: " + ext);
return;
}
};

app.mouseDownPoint = new THREE.Vector2();
app.mouseUpPoint = new THREE.Vector2();

Expand Down Expand Up @@ -3089,8 +3109,21 @@ Q3D.Model.prototype = {
});
},

loadData: function (data, ext, resourcePath, callback) {
var _this = this;
Q3D.application.loadModelData(data, ext, resourcePath, function (model) {
_this.model = model;
_this._loadCompleted(callback);
});
},

loadJSONObject: function (jsonObject, callback) {
this.load(jsonObject.url, callback);
if (jsonObject.url !== undefined) {
this.load(jsonObject.url, callback);
}
else {
this.loadData(atob(jsonObject.base64), jsonObject.ext, jsonObject.resourcePath, callback);
}
},

_loadCompleted: function (anotherCallback) {
Expand Down Expand Up @@ -3135,17 +3168,17 @@ Q3D.Models.prototype.loadJSONObject = function (jsonObject) {

var model, url;
for (var i = 0, l = jsonObject.length; i < l; i++) {
url = jsonObject[i].url;

if (this.cache[url] !== undefined) {
url = jsonObject[i].url;
if (url !== undefined && this.cache[url] !== undefined) {
model = this.cache[url];
}
else {
model = new Q3D.Model();
model.load(url, callback);
this.cache[url] = model;
}
model.loadJSONObject(jsonObject[i], callback);

if (url !== undefined) this.cache[url] = model;
}
this.models.push(model);
}
};
Expand Down
10 changes: 10 additions & 0 deletions qgis2threejstools.py
Expand Up @@ -20,6 +20,7 @@
***************************************************************************/
"""
import os
import base64
import configparser
import re
import shutil
Expand Down Expand Up @@ -148,6 +149,15 @@ def base64image(image):
return "data:image/png;base64," + ba.toBase64().data().decode("ascii")


def base64file(file_path):
try:
with open(file_path, "rb") as f:
return base64.b64encode(f.read()).decode("ascii")
except:
logMessage("Cannot read file: {}".format(file_path))
return None


def getTemplateConfig(template_path):
abspath = os.path.join(templateDir(), template_path)
meta_path = os.path.splitext(abspath)[0] + ".txt"
Expand Down

0 comments on commit 3c60310

Please sign in to comment.