10 Jul 2019
Look for exact property value and more
When using the search() function of the Viewer, you can only look for strings that at least partially match a given value. That will include other values as well: e.g. you may look for "Window1", but the search will also return items like "Window12". Having lots of false positives could slow things down.
In v6.5.0 a new function was introduced called executeUserFunction() that can help us out here: https://forge.autodesk.com/en/docs/viewer/v6/change_history/changelog_v6/
You can find samples for it here: https://forge.autodesk.com/en/docs/viewer/v6/tutorials/propdb-queries/
One difficulty is with passing parameters to our userFunction() because it's executed on a worker thread - so not even global variables will be reachable from it.
You can work around it by "baking in" your variable's value into the userFunction()'s implementation. Since executeUserFunction() accepts a string as well that contains the source code of our function, therefore the simplest solution might be to write our function as normal (so we have access to intelli-sense), and once done, just turn it into a template literal by surrounding it with back-tick ` characters. Then we can use inside it ${} placeholders to inject our variable's value into it.
async function autoSelect(viewer, tag) {
let res = await viewer.model.getPropertyDb().executeUserFunction(`function userFunction(pdb) {
console.log('${tag}');
var dbIds = [];
pdb.enumObjects(dbId => {
let p = pdb.getObjectProperties(dbId);
let pv = p && p.properties;
if (!pv) return;
if (p.name === '${tag}') {
dbIds.push(dbId);
return true;
}
});
return dbIds;
}`);
let dbId = res[0];
console.log(`dbId with tag ${tag} => ${dbId}`);
viewer.select([dbId]);
viewer.fitToView([dbId]);
}
Now we can call it e.g. in the browser console to see the result - see above picture.