Difference between revisions of "Qmaze Rules"
Nick Bannink (talk | contribs) |
Nick Bannink (talk | contribs) |
||
Line 43: | Line 43: | ||
var obj = app.scene.getObjectByName(obj); | 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. <br> | ||
+ | The action needs to be 'decompiler' and the value can be a string of different variables with values. <br> | ||
+ | First put in a variable name, secondly the value, separated by a ':' <br> | ||
+ | Make sure you always put in 'function:' with your function name <br> | ||
+ | The function with the name you put in here will be called when the decompiler is done <br> | ||
+ | |||
+ | example of a Qmaze Rule: <br> | ||
+ | |||
+ | 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: <br> | ||
+ | |||
+ | 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: <br> | ||
+ | |||
+ | 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 <br> | ||
+ | This can be changed into whatever you require <br> | ||
+ | |||
+ | |||
+ | TO DO: make an example function |
Revision as of 10:56, 9 April 2019
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