var lineGroups = [];
var linesMaterial=null;
function getLeafNodes (model, dbIds) {
const instanceTree = model.getData().instanceTree;
dbIds = dbIds || instanceTree.getRootId();
const dbIdArray = Array.isArray(dbIds) ? dbIds : [dbIds];
let leafIds = [];
const getLeafNodesRec = (id) => {
var childCount = 0;
instanceTree.enumNodeChildren(id, (childId) => {
getLeafNodesRec(childId);
++childCount;
})
if (childCount == 0) {
leafIds.push(id);
}
}
for (var i = 0; i < dbIdArray.length; ++i) {
getLeafNodesRec(dbIdArray[i]);
}
return leafIds;
}
function createMaterial (color = 0x000000, opacity = 1.0) {
return new THREE.LineBasicMaterial({
color: new THREE.Color(color),
transparent: true,
depthWrite: false,
depthTest: true,
linewidth: 10,
opacity
})
}
function getFragIds (model, dbIds) {
const dbIdArray = Array.isArray(dbIds) ? dbIds : [dbIds];
const instanceTree =model.getData().instanceTree;
const leafIds =getLeafNodes(model, dbIdArray);
let fragIds = [];
for(var i=0; i< leafIds.length; ++i) {
instanceTree.enumNodeFragments(
leafIds[i], (fragId) => {
fragIds.push(fragId);
});
}
return fragIds;
}
function getWorldBoundingBox(model, dbId) {
var fragIds =getFragIds(model, dbId);
if(!fragIds.length){
return reject('No geometry, invalid dbId?');
}
var fragList = model.getFragmentList();
var fragbBox = new THREE.Box3();
var nodebBox = new THREE.Box3();
fragIds.forEach(function(fragId) {
fragList.getWorldBounds(fragId, fragbBox);
nodebBox.union(fragbBox);
});
return nodebBox;
}
function drawBox (bbox,viewer) {
const geometry = new THREE.Geometry();
const { min, max } = bbox;
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
this.linesMaterial=createMaterial(0x0000FF);
const lines = new THREE.Line(geometry,this.linesMaterial,THREE.LinePieces);
this.lineGroups.push(lines);
viewer.impl.createOverlayScene ('boundingBox',this.linesMaterial)
viewer.impl.addOverlay('boundingBox', lines);
viewer.impl.invalidate(true, true, true);
}
var linesMaterial=null;
function getLeafNodes (model, dbIds) {
const instanceTree = model.getData().instanceTree;
dbIds = dbIds || instanceTree.getRootId();
const dbIdArray = Array.isArray(dbIds) ? dbIds : [dbIds];
let leafIds = [];
const getLeafNodesRec = (id) => {
var childCount = 0;
instanceTree.enumNodeChildren(id, (childId) => {
getLeafNodesRec(childId);
++childCount;
})
if (childCount == 0) {
leafIds.push(id);
}
}
for (var i = 0; i < dbIdArray.length; ++i) {
getLeafNodesRec(dbIdArray[i]);
}
return leafIds;
}
function createMaterial (color = 0x000000, opacity = 1.0) {
return new THREE.LineBasicMaterial({
color: new THREE.Color(color),
transparent: true,
depthWrite: false,
depthTest: true,
linewidth: 10,
opacity
})
}
function getFragIds (model, dbIds) {
const dbIdArray = Array.isArray(dbIds) ? dbIds : [dbIds];
const instanceTree =model.getData().instanceTree;
const leafIds =getLeafNodes(model, dbIdArray);
let fragIds = [];
for(var i=0; i< leafIds.length; ++i) {
instanceTree.enumNodeFragments(
leafIds[i], (fragId) => {
fragIds.push(fragId);
});
}
return fragIds;
}
function getWorldBoundingBox(model, dbId) {
var fragIds =getFragIds(model, dbId);
if(!fragIds.length){
return reject('No geometry, invalid dbId?');
}
var fragList = model.getFragmentList();
var fragbBox = new THREE.Box3();
var nodebBox = new THREE.Box3();
fragIds.forEach(function(fragId) {
fragList.getWorldBounds(fragId, fragbBox);
nodebBox.union(fragbBox);
});
return nodebBox;
}
function drawBox (bbox,viewer) {
const geometry = new THREE.Geometry();
const { min, max } = bbox;
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, min.z));
geometry.vertices.push(new THREE.Vector3(max.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(max.x, max.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, min.y, max.z));
geometry.vertices.push(new THREE.Vector3(min.x, max.y, max.z));
this.linesMaterial=createMaterial(0x0000FF);
const lines = new THREE.Line(geometry,this.linesMaterial,THREE.LinePieces);
this.lineGroups.push(lines);
viewer.impl.createOverlayScene ('boundingBox',this.linesMaterial)
viewer.impl.addOverlay('boundingBox', lines);
viewer.impl.invalidate(true, true, true);
}