Qmaze Rules
Using Qmaze rules to call functions
Use the following script to catch the x3d commands given in the qmaze builder rules section.
The rules must be written as:
x3d(object).action = value
action: what action needs to be executed? e.g. changeColor.
object: what object is the subject of change?
value: what value needs to be given to the function?
Place this piece of code in your outputscript:
$(document).ready(function(){ $(qmaze.events).on(qmaze.events.CONSTRAINT, function(e, constraints) { if (typeof constraints !== "undefined") { var res = constraints.split(";"); for (var i = 0; i < res.length; i++) { var regex = new RegExp(/(x3d\((.*?)\)\.(\w+)(\s+)?\=['"]?(.*)['"]?)/gi); while (result = regex.exec(res[i])) { var object = result[2], method = result[3], value = unescape(result[5]).replace('\, ); console.log('qmaze:'+method+'='+value); eval(method + '="' + value + '";'); window["my"+method](object, value); } } } }); var lazyLoadingConstraints = $('input[id$="hfLazyLoading"]').val(); $(qmaze.events).trigger(qmaze.events.CONSTRAINT, [lazyLoadingConstraints]); });
In your output script you need to declare all the functions called by the qmaze rules.
The functions always need to begin with ' my ' as seen below.
function mysetColor(obj, val) { obj: is the object in the qmaze rules val: is the value given in the qmaze rules the following example is for looking up an object in the scene (v3d) var obj = app.scene.getObjectByName(obj); }
Custom decompiler function
--ADVANCED
To run the custom decompiler you need to Rule in Qmaze similar to how you would call a function.
The action needs to be 'decompiler' and the value can be a string of different variables with values.
First put in a variable name, secondly the value, separated by a ':'
Make sure you always put in 'function:' with your function name
The function with the name you put in here will be called when the decompiler is done
example of a Qmaze Rule:
x3d(object).decompiler = function:testFunc, filename:'x.gltf', name:'test', posX:3, posY:1, posZ:0, rotX:0, rotY:0, rotZ:0
Include the next code in your Outputscript:
function mydecompiler(obj, val) { var myMap = new Map(); val = val.replace(/\s/g, ); remove all spaces val = val.replace(/'/g, ); remove all ' var res1 = val.split(','); for(var i = 0; i+1 <= res1.length; i++) { var res2 = res1[i].split(':'); myMap.set(res2[0], res2[1]); } console.log(myMap); window[myMap.get("function")](myMap); }
The following function will be run when the decompiler is done:
function testFunc(myMap){ myMap.forEach(function(value,key){ console.log(key + ' = ' + value); }); }
Currently this function prints a list in the console of all the different variable names and values
This can be changed into whatever you require
TO DO: make an example function