var selectCount = 0; function treeClick(checkbox, node) { var type = node.getAttribute("data-type"); var checked = checkbox var object = node.getAttribute("data-object"); var child = node.getAttribute("data-child"); var layer = node.getAttribute("data-layer"); console.log(checkbox, "Event: " + (checked ? "Selected" : "Deselected") + " Type: " + type + " Object: " + object + ", child: " + child + ", layer: " + layer) if (type == "doc") { if (checked) { var object = objectsInScene[object] object.traverse(function(child) { if (child.type == "Line") { child.userData.selected = true; } }); } else { var object = objectsInScene[object] object.traverse(function(child) { if (child.type == "Line") { child.userData.selected = false; } }); } } if (type == "layer") { if (checked) { var object = objectsInScene[object] object.traverse(function(child) { if (child.type == "Line") { if (child.userData.layer && child.userData.layer.label == layer) { child.userData.selected = true; } } }); } else { var object = objectsInScene[object] object.traverse(function(child) { if (child.type == "Line") { if (child.userData.layer && child.userData.layer.label == layer) { child.userData.selected = false; } } }); } } if (type == "vector") { if (checked) { objectsInScene[object].children[child].userData.selected = true; } else { objectsInScene[object].children[child].userData.selected = false; } } clearSceneFlag = true; } function filldoctree() { // Empty the Documents node $('#left-tree-view').empty(); clearSceneFlag = true; // Two sorting strategies: // Travelling Salesman Sort // sortDocumentsByGeometryStartpoint() // Sort Smallest to Largest sortPolyGons(); if (objectsInScene.length > 0) { // clear any childless parents for (i = 0; i < objectsInScene.length; i++) { if (objectsInScene[i].children.length < 1) { objectsInScene.splice(i, 1); } }; // Create a New Tree on Viewer, with a Documents Node var template = `<ul data-role="treeview" id="doctree" data-on-node-click="treeClick" data-on-check-click="treeClick"> <li data-icon="<span class='far fa-folder'></span>" data-caption="Documents"> <ul id="documenttree"> </ul> </li>` $('#left-tree-view').append(template); // Add Nodes under Documents for each Document. Documents have id=doc0, doc1, etc doc+i var template = ''; for (i = 0; i < objectsInScene.length; i++) { // <button class='button mini flat-button' onclick='storeUndo(); objectsInScene.splice(` + i + `,1); fillTree();''><i class='far fa-fw fa-trash-alt'></i></button> template += `<li><input id="checkbox_` + i + `" type="checkbox" data-role="checkbox" data-caption="<span class='far fa-file'></span> ` + objectsInScene[i].name + `" data-type="doc" data-object="` + i + `"><ul id="doc` + i + `"></ul></li>` }; $('#documenttree').append(template); //Find Unique Layers for (i = 0; i < objectsInScene.length; i++) { var layersinthisdoc = [] for (j = 0; j < objectsInScene[i].children.length; j++) { if (objectsInScene[i].children[j].userData.layer) { var layer = objectsInScene[i].children[j].userData.layer.label } else { var layer = 'layer1' } var found = jQuery.inArray(layer, layersinthisdoc); if (found >= 0) { // Element was found already } else { layersinthisdoc.push(layer); // Element was not found, add it. } }; // Add Layer Nodes var template = ''; for (j = 0; j < layersinthisdoc.length; j++) { // Layers template += `<li data-collapsed="true"><input type="checkbox" data-role="checkbox" data-caption="<span class='fas fa-layer-group'></span> ` + layersinthisdoc[j] + `" data-type="layer" data-object="` + i + `" data-layer="` + layersinthisdoc[j] + `"><ul id="doc` + i + `layer` + layersinthisdoc[j].replace(/ /g, '') + `"></ul></li>` } // console.log("Document " + i + "contains layers: ", layersinthisdoc, template) $('#doc' + i).append(template); // Add Vectors to Layers for (j = 0; j < objectsInScene[i].children.length; j++) { var template = ` <li><input id="checkbox_` + i + `_` + j + `" type="checkbox" data-role="checkbox" data-caption="<span class='fas fa-vector-square'></span> ` + objectsInScene[i].children[j].name + `" data-type="vector" data-object="` + i + `" data-child="` + j + `" data-layer="` + layersinthisdoc[j] + `"></li>` objectsInScene[i].children[j].userData.link = "link" + i + "_" + j; if (objectsInScene[i].children[j].userData.layer) { var layer = objectsInScene[i].children[j].userData.layer.label.replace(/ /g, '') } else { var layer = 'layer1' } $("#doc" + i + "layer" + layer).append(template); } }; $('#tpaddpath').removeClass('disabled'); $('#tpaddpath-dropdown').removeClass('disabled'); $('#nodocuments').hide() } else { // End of if (objectsInScene.length > 0 $('#nodocuments').show() } } // runs in threejs animate() loop: Sets colors and checkboxes of items based on userdata.selected=true/false function animateTree() { // console.log('running animatetree') var tree = $('#doctree').data('treeview'); selectCount = 0; for (i = 0; i < objectsInScene.length; i++) { var obj = objectsInScene[i] var childselectcount = 0; for (j = 0; j < obj.children.length; j++) { var child = obj.children[j] if (child.type == "Line" && child.userData.selected) { if (child.userData.hover) { // child.material.color.setRGB(0, 0.48, 1); child.material.color.setRGB(1, 0.2, 0.27); } else { child.material.color.setRGB(1, 0.2, 0.27); } var check = $('#checkbox_' + i + '_' + j); check.prop('checked', true); childselectcount++ selectCount++ } else if (child.type == "Line" && !child.userData.selected) { if (child.userData.hover) { child.material.color.setRGB(0, 0.48, 1); } else { var defaultcolor = new THREE.Color(Theme.CAM_DOC_DEFAULT_COLOR); child.material.color = defaultcolor } var check = $('#checkbox_' + i + '_' + j); check.prop('checked', false); } } var tree = $('#doctree').data('treeview'); if (tree) { tree._recheck(check); } } if (selectCount > 0) { $("#tpaddpathParent").prop('disabled', false).removeClass('disabled') $("#tpaddpath").prop('disabled', false); // $('#floating-tpaddpath-btn').prop('disabled', false); // $('#floating-tpaddpath-btn').addClass('success') $('#addJobBtn,#addJobMenuBtn').addClass('success').prop('disabled', false) $("#tpaddicon").addClass('fg-green') $(".addJobBtn-text").html("Create Toolpath using (" + selectCount + ") selected vectors"); if (toolpathsInScene.length > 0) { $("#remJobBtn").addClass('bg-green').addClass('fg-white').removeClass('disabled'); $("#tpaddpath-dropdown").prop('disabled', false); $("#addJobMenuBtn").show() } else { $("#addJobMenuBtn").hide() } } else { $("#tpaddpathParent").prop('disabled', true).addClass('disabled'); $("#tpaddicon").removeClass('fg-green') $("#tpaddpath").prop('disabled', true); // $('#floating-tpaddpath-btn').prop('disabled', true); // $('#floating-tpaddpath-btn').removeClass('success') $('#addJobBtn,#remJobBtn,#addJobMenuBtn').removeClass('success').prop('disabled', true) $("#tpaddpath-dropdown").prop('disabled', true); $(".addJobBtn-text").html("Please select Vector(s) to create toolpaths"); } }