Created
September 4, 2015 14:43
-
-
Save leefsmp/8b274a0b5fda41766140 to your computer and use it in GitHub Desktop.
GeometrySelector viewer extension by Philippe Leefsma, August 2015
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/////////////////////////////////////////////////////////////////////////////// | |
// GeometrySelector viewer extension | |
// by Philippe Leefsma, August 2015 | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
AutodeskNamespace("Autodesk.ADN.Viewing.Extension"); | |
AutodeskNamespace("Autodesk.ADN.Viewing.Extension.GeometrySelector"); | |
Autodesk.ADN.Viewing.Extension.GeometrySelector = function (viewer, options) { | |
Autodesk.Viewing.Extension.call(this, viewer, options); | |
var _self = this; | |
var _panel = null; | |
var _snapper = null; | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
_self.load = function () { | |
var dependencies = [ | |
"uploads/extensions/Autodesk.ADN.Viewing.Extension.GeometrySelector/Autodesk.ADN.Viewing.Tool.Snapper.js" | |
]; | |
require(dependencies, function() { | |
loadCSS(); | |
_snapper = new Autodesk.ADN.Viewing.Tool.Snapper(viewer); | |
viewer.toolController.registerTool(_snapper); | |
_snapper.setDetectRadius(0.15); | |
logSnapEvents(true); | |
_panel = new Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel( | |
viewer.container, | |
guid(), 0, 0); | |
_panel.setVisible(true); | |
console.log('Autodesk.ADN.Viewing.Extension.GeometrySelector loaded'); | |
}); | |
return true; | |
}; | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
_self.unload = function () { | |
_panel.setVisible(false); | |
_panel.uninitialize(); | |
console.log('Autodesk.ADN.Viewing.Extension.GeometrySelector unloaded'); | |
return true; | |
}; | |
///////////////////////////////////////////////////////// | |
// Generates random guid | |
// | |
///////////////////////////////////////////////////////// | |
function guid() { | |
var d = new Date().getTime(); | |
var guid = 'xxxx-xxxx-xxxx'.replace( | |
/[xy]/g, | |
function (c) { | |
var r = (d + Math.random() * 16) % 16 | 0; | |
d = Math.floor(d / 16); | |
return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16); | |
}); | |
return guid; | |
}; | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
function pointToString(point, fx) { | |
return '[' + | |
point.x.toFixed(fx) + ', ' + | |
point.y.toFixed(fx) + ', ' + | |
point.z.toFixed(fx) + ']'; | |
} | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
function logSnapEvents(enabled) { | |
if(enabled) { | |
_snapper.onVertexSnapped(function (vertex) { | |
_panel.log("Vertex: " + pointToString(vertex, 2)); | |
console.log(vertex); | |
}); | |
_snapper.onEdgeSnapped(function (edge) { | |
_panel.log("Edge: " + | |
pointToString(edge.vertices[0], 1) + ', ' + | |
pointToString(edge.vertices[1], 1)); | |
console.log(edge); | |
}); | |
_snapper.onFaceSnapped(function (face) { | |
_panel.log("Face: " + | |
face.vertices.length + " vertices"); | |
console.log(face); | |
}); | |
} | |
else { | |
_snapper.onVertexSnapped(null); | |
_snapper.onEdgeSnapped(null); | |
_snapper.onFaceSnapped(null); | |
} | |
} | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
function loadCSS() { | |
var css = [ | |
'div.snap-panel-content {', | |
'margin: 15px;', | |
'}', | |
'label.snap-panel {', | |
'color: #FFFFFF;', | |
'}', | |
'textarea.snap-panel {', | |
'width: calc(100% - 10px);', | |
'resize: none;', | |
'height: 150px;', | |
'max-height: 150px;', | |
'background-color: #989898;', | |
'}', | |
'button.snap-panel {', | |
'width: 240px;', | |
'}', | |
'hr.snap-panel-spacer {', | |
'margin: 0;', | |
'height: 5px;', | |
'visibility: hidden;', | |
'}', | |
'hr.snap-panel-splitter {', | |
'margin-top: 15px;', | |
'margin-left: 10px;', | |
'margin-right: 20px;', | |
'margin-bottom: 10px;', | |
'}', | |
'input.snap-panel {', | |
'height: 20px;', | |
'width: 100px;', | |
'border-radius: 5px;', | |
'text-align: right;', | |
'}', | |
].join('\n'); | |
$('<style type="text/css">' + css + '</style>').appendTo('head'); | |
} | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel = function( | |
parentContainer, | |
id, x, y) { | |
var _thisPanel = this; | |
this.content = document.createElement('div'); | |
Autodesk.Viewing.UI.DockingPanel.call( | |
this, | |
parentContainer, | |
id, | |
"Geometry Selector", | |
{shadow: true}); | |
this.container.style.top = y + "px"; | |
this.container.style.left = x + "px"; | |
this.container.style.width = "300px"; | |
this.container.style.height = "635px"; | |
this.container.style.resize = "none"; | |
var detectId = guid(); | |
var cbVertexSnapId = guid(); | |
var cbEdgeSnapId = guid(); | |
var cbFaceSnapId = guid(); | |
var loggerId = guid(); | |
var btnClearId = guid(); | |
var btnPickVertexId = guid(); | |
var btnPickEdgeId = guid(); | |
var btnPickFaceId = guid(); | |
var btnPickAnyId = guid(); | |
var html = [ | |
'<div class="snap-panel-content">', | |
'<label class="snap-panel">', | |
' Detection Radius: ' + | |
'</label>', | |
' ', | |
'<input class="snap-panel" type="text" id="' + detectId +'" value="0.1">', | |
'<hr class="snap-panel-splitter"/>', | |
'<label class="snap-panel">', | |
' Snap Filters: ' + | |
'</label>', | |
'<hr class="snap-panel-spacer"/>', | |
'<label class="snap-panel">', | |
'<input id="' + cbVertexSnapId + '" type="checkbox">', | |
' Vertex' + | |
'</label>', | |
' ', | |
'<label class="snap-panel">', | |
'<input id="' + cbEdgeSnapId + '" type="checkbox">', | |
' Edge' + | |
'</label>', | |
' ', | |
'<label class="snap-panel">', | |
'<input id="' + cbFaceSnapId + '" type="checkbox">', | |
' Face' + | |
'</label>', | |
'<hr class="snap-panel-splitter"/>', | |
'<label class="snap-panel">', | |
' Pick Commands: ' + | |
'</label>', | |
'<hr class="snap-panel-spacer"/>', | |
'<button class="btn btn-info snap-panel" id="'+ btnPickVertexId + '">', | |
'<span class="glyphicon glyphicon-screenshot" aria-hidden="true"></span>' + | |
' Pick Vertex', | |
'</button>', | |
'<hr class="snap-panel-spacer"/>', | |
'<button class="btn btn-info snap-panel" id="'+ btnPickEdgeId + '">', | |
'<span class="glyphicon glyphicon-minus" aria-hidden="true"></span>' + | |
' Pick Edge', | |
'</button>', | |
'<hr class="snap-panel-spacer"/>', | |
'<button class="btn btn-info snap-panel" id="'+ btnPickFaceId + '">', | |
'<span class="glyphicon glyphicon-stop" aria-hidden="true"></span>' + | |
' Pick Face', | |
'</button>', | |
'<hr class="snap-panel-spacer"/>', | |
'<button class="btn btn-info snap-panel" id="'+ btnPickAnyId + '">', | |
'<span class="glyphicon glyphicon-screenshot" aria-hidden="true"></span> ' + | |
'<span class="glyphicon glyphicon-minus" aria-hidden="true"></span>' + | |
'<span class="glyphicon glyphicon-stop" aria-hidden="true"></span>' + | |
' Pick Any', | |
'</button>', | |
'<hr class="snap-panel-splitter"/>', | |
'<label class="snap-panel">', | |
' Output: ' + | |
'</label>', | |
'<hr class="snap-panel-spacer"/>', | |
'<textarea id="'+ loggerId + '" readonly="readonly" class="snap-panel">' + | |
'</textarea>', | |
'<hr class="snap-panel-spacer"/>', | |
'<button class="btn btn-info snap-panel" id="'+ btnClearId + '">', | |
'<span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>' + | |
' Clear output', | |
'</button>', | |
'</div>', | |
].join('\n'); | |
$(_thisPanel.content).html(html); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
_thisPanel.log = function(message) { | |
var $text = $('#' + loggerId); | |
var val = $text.val(); | |
$text.html(val + message + ' '); | |
$text[0].scrollTop = $text[0].scrollHeight; | |
} | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
function enableFilters(enabled) { | |
$('#' + cbVertexSnapId).attr('disabled', !enabled); | |
$('#' + cbEdgeSnapId).attr('disabled', !enabled); | |
$('#' + cbFaceSnapId).attr('disabled', !enabled); | |
} | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + detectId).on('input',function(e) { | |
if(!isNaN($('#' + detectId).val())) { | |
var radius = parseFloat($('#' + detectId).val()); | |
_snapper.setDetectRadius(radius); | |
console.log(radius); | |
} | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + cbVertexSnapId).change(function () { | |
if (this.checked) { | |
_snapper.addSelectionFilter('vertex'); | |
} | |
else { | |
_snapper.removeSelectionFilter('vertex'); | |
} | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + cbEdgeSnapId).change(function () { | |
if (this.checked) { | |
_snapper.addSelectionFilter('edge'); | |
} | |
else { | |
_snapper.removeSelectionFilter('edge'); | |
} | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + cbFaceSnapId).change(function () { | |
if (this.checked) { | |
_snapper.addSelectionFilter('face'); | |
} | |
else { | |
_snapper.removeSelectionFilter('face'); | |
_snapper.onFaceSnapped(null); | |
} | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + btnPickVertexId).click(function () { | |
_panel.clearLog(); | |
_panel.log("Starting Pick Vertex ...") | |
enableFilters(false); | |
logSnapEvents(false); | |
_snapper.clearSelectionFilter(); | |
_snapper.addSelectionFilter('vertex'); | |
_snapper.showTooltip(true, "Select vertex"); | |
_snapper.onGeometrySelected(function(vertex) { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Picked Vertex * : "); | |
_thisPanel.log(pointToString(vertex, 2)); | |
}); | |
_snapper.onSelectionCancelled(function() { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Pick cancelled *"); | |
}); | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + btnPickEdgeId).click(function () { | |
_panel.clearLog(); | |
_panel.log("Starting Pick Edge ...") | |
enableFilters(false); | |
logSnapEvents(false); | |
_snapper.clearSelectionFilter(); | |
_snapper.addSelectionFilter('edge'); | |
_snapper.showTooltip(true, "Select edge"); | |
_snapper.onGeometrySelected(function(edge) { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Picked Edge * : "); | |
_thisPanel.log( | |
pointToString(edge.vertices[0], 1) + ', ' + | |
pointToString(edge.vertices[1], 1)); | |
}); | |
_snapper.onSelectionCancelled(function() { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Pick cancelled *"); | |
}); | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + btnPickFaceId).click(function () { | |
_panel.clearLog(); | |
_panel.log("Starting Pick Face ...") | |
enableFilters(false); | |
logSnapEvents(false); | |
_snapper.clearSelectionFilter(); | |
_snapper.addSelectionFilter('face'); | |
_snapper.showTooltip(true, "Select face"); | |
_snapper.onGeometrySelected(function(face) { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.onGeometrySelected(null); | |
_snapper.showTooltip(false); | |
_thisPanel.log("* Picked Face * : "); | |
_thisPanel.log(face.vertices.length + ' vertices'); | |
}); | |
_snapper.onSelectionCancelled(function() { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Pick cancelled *"); | |
}); | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + btnPickAnyId).click(function () { | |
_panel.clearLog(); | |
_panel.log("Starting Pick Any ...") | |
enableFilters(false); | |
logSnapEvents(false); | |
_snapper.clearSelectionFilter(); | |
_snapper.showTooltip(true, "Select geometry"); | |
_snapper.onGeometrySelected(function(geometry, type) { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Picked Geometry * : " + type); | |
}); | |
_snapper.onSelectionCancelled(function() { | |
enableFilters(true); | |
logSnapEvents(true); | |
_snapper.showTooltip(false); | |
_snapper.onGeometrySelected(null); | |
_thisPanel.log("* Pick cancelled *"); | |
}); | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
$('#' + btnClearId).click(function(){ | |
_thisPanel.clearLog(); | |
}); | |
///////////////////////////////////////////////////////// | |
// | |
// | |
///////////////////////////////////////////////////////// | |
_thisPanel.clearLog = function () { | |
$('#' + loggerId).html(''); | |
} | |
}; | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel.prototype = Object.create( | |
Autodesk.Viewing.UI.DockingPanel.prototype); | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel.prototype.constructor = | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel; | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel.prototype.initialize = function() | |
{ | |
this.title = this.createTitleBar( | |
this.titleLabel || | |
this.container.id); | |
this.closer = this.createCloseButton(); | |
this.container.appendChild(this.title); | |
this.title.appendChild(this.closer); | |
this.container.appendChild(this.content); | |
this.initializeMoveHandlers(this.title); | |
this.initializeCloseHandler(this.closer); | |
}; | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.Panel.prototype.setVisible = function(show) | |
{ | |
Autodesk.Viewing.UI.DockingPanel.prototype.setVisible.call(this, show); | |
this.isVisible = show; | |
if(show) { | |
viewer.toolController.activateTool( | |
_snapper.getName()); | |
} | |
else { | |
viewer.toolController.deactivateTool( | |
_snapper.getName()); | |
} | |
}; | |
}; | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.prototype = | |
Object.create(Autodesk.Viewing.Extension.prototype); | |
Autodesk.ADN.Viewing.Extension.GeometrySelector.prototype.constructor = | |
Autodesk.ADN.Viewing.Extension.GeometrySelector; | |
Autodesk.Viewing.theExtensionManager.registerExtension( | |
'Autodesk.ADN.Viewing.Extension.GeometrySelector', | |
Autodesk.ADN.Viewing.Extension.GeometrySelector); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment