[Frontend] forgeTest2.html: 電梯移動,模型半透明,電梯門顯示綠色
This commit is contained in:
parent
a57e40bf44
commit
87fe72c242
@ -50,25 +50,38 @@
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/jstree.min.js"></script>
|
||||
<script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.js"></script>
|
||||
|
||||
|
||||
<script src="js/forge/modeltest.js"></script>
|
||||
<!--<script src="js/forge/AdnLevelSectionPanel.js"></script>-->
|
||||
<script src="js/forge/AdnLevelSectionPanel.js"></script>
|
||||
|
||||
<style>
|
||||
.show-env-bg-button {
|
||||
background: red;
|
||||
}
|
||||
|
||||
<script>
|
||||
.hide-env-bg-button {
|
||||
background: blue;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script >
|
||||
$(document).ready(function () {
|
||||
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDLm53ZA');
|
||||
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDMjAyMjEyMDEubndk');
|
||||
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDMjAyMjEyMDEubndk');
|
||||
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1vZGVsX3Rlc3QxMTIxLyVFMyU4MCU5MCVFNSU4RiVCMCVFNSU4QyU5NyVFNCVCOCVBRCVFOCU4RiVCMSVFNSVBNCVBNyVFNiVBOCU5MyVFMyU4MCU5MUFSQ18yMDIyMTIwNS5ud2Q');
|
||||
});
|
||||
function move1Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(0);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move2Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(1);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move3Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(2);
|
||||
@ -80,46 +93,55 @@
|
||||
setElevatorFloor(3);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move5Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(4);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move6Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(5);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move7Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(6);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move8Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(7);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move9Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(8);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move10Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(9);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move11Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(10);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function move12Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(11);
|
||||
requestAnimationFrame(movElevator);
|
||||
}
|
||||
|
||||
function moveB1Floor() {
|
||||
setElevatorSpeed(0.2);
|
||||
setElevatorFloor(-1);
|
||||
@ -128,12 +150,12 @@
|
||||
|
||||
function changeLightPower() {
|
||||
var value = document.getElementById('lightBar').value;
|
||||
console.log("power: " + value);
|
||||
console .log("power: " + value);
|
||||
setLightPower(value);
|
||||
}
|
||||
|
||||
</script>
|
||||
</script >
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</body >
|
||||
</html >
|
||||
|
227
Frontend/js/forge/AdnLevelSectionPanel.js
Normal file
227
Frontend/js/forge/AdnLevelSectionPanel.js
Normal file
@ -0,0 +1,227 @@
|
||||
'use strict';
|
||||
|
||||
$(function () {
|
||||
class AdnLevelSectionPanel extends Autodesk.Viewing.UI.DockingPanel {
|
||||
constructor(viewer, title, options) {
|
||||
options = options || {};
|
||||
|
||||
// Height adjustment for scroll container, offset to height of the title bar and footer by default.
|
||||
if (!options.heightAdjustment)
|
||||
options.heightAdjustment = 70;
|
||||
|
||||
if (!options.marginTop)
|
||||
options.marginTop = 0;
|
||||
|
||||
super(viewer.container, viewer.container.id + 'AdnLevelSectionPanel', title, options);
|
||||
|
||||
this.container.classList.add('adn-docking-panel');
|
||||
this.container.classList.add('adn-lvl-section-panel');
|
||||
this.createScrollContainer(options);
|
||||
|
||||
this.viewer = viewer;
|
||||
this.options = options;
|
||||
this.uiCreated = false;
|
||||
|
||||
this.addVisibilityListener((show) => {
|
||||
if (!show) return;
|
||||
|
||||
if (!this.uiCreated)
|
||||
this.createUI();
|
||||
});
|
||||
|
||||
this.onButtonClicked = this.onButtonClicked.bind(this);
|
||||
}
|
||||
|
||||
async getRemoteLevels() {
|
||||
const aecData = await Autodesk.Viewing.Document.getAecModelData(this.viewer.model.getDocumentNode());
|
||||
if (!aecData.levels) return null;
|
||||
|
||||
const levels = aecData.levels;
|
||||
levels.sort((a, b) => b.elevation - a.elevation);
|
||||
return levels;
|
||||
}
|
||||
|
||||
createSelectOptions(data, selector) {
|
||||
if (!data || !selector || !(selector instanceof HTMLSelectElement))
|
||||
return;
|
||||
|
||||
for (let i = 0; i < data.length; ++i) {
|
||||
const level = data[i];
|
||||
|
||||
const option = document.createElement('option');
|
||||
option.value = level.guid;
|
||||
option.text = level.name;
|
||||
selector.add(option);
|
||||
}
|
||||
}
|
||||
|
||||
async createUI() {
|
||||
this.uiCreated = true;
|
||||
|
||||
const table = document.createElement('table');
|
||||
table.className = 'adsk-lmv-tftable adn-lvl-section-panel-table';
|
||||
|
||||
const tbody = document.createElement('tbody');
|
||||
table.appendChild(tbody);
|
||||
this.scrollContainer.appendChild(table);
|
||||
|
||||
const upperRow = tbody.insertRow(-1);
|
||||
const upperTextCell = upperRow.insertCell(0);
|
||||
upperTextCell.innerText = 'Upper:';
|
||||
const upperSelectCell = upperRow.insertCell(1);
|
||||
|
||||
const lowerRow = tbody.insertRow(-1);
|
||||
const lowerTextCell = lowerRow.insertCell(0);
|
||||
lowerTextCell.innerText = 'Lower:';
|
||||
const lowerSelectCell = lowerRow.insertCell(1);
|
||||
|
||||
const upperLvlSelector = document.createElement('select');
|
||||
upperLvlSelector.id = 'adn-upper-lvl-selector';
|
||||
upperLvlSelector.className = 'adn-lvl-selector';
|
||||
upperSelectCell.appendChild(upperLvlSelector);
|
||||
|
||||
const lowerLvlSelector = document.createElement('select');
|
||||
lowerLvlSelector.id = 'adn-lower-lvl-selector';
|
||||
lowerLvlSelector.className = 'adn-lvl-selector';
|
||||
lowerSelectCell.appendChild(lowerLvlSelector);
|
||||
|
||||
const data = await this.getRemoteLevels();
|
||||
this.levels = data;
|
||||
|
||||
this.createSelectOptions(data, upperLvlSelector);
|
||||
this.createSelectOptions(data, lowerLvlSelector);
|
||||
|
||||
const buttonRow = tbody.insertRow(-1);
|
||||
const buttonCell = buttonRow.insertCell(0);
|
||||
buttonCell.colSpan = 2;
|
||||
|
||||
const sectionButton = document.createElement('button');
|
||||
sectionButton.type = 'button';
|
||||
sectionButton.textContent = 'Apply';
|
||||
buttonCell.appendChild(sectionButton);
|
||||
|
||||
sectionButton.addEventListener(
|
||||
'click',
|
||||
this.onButtonClicked
|
||||
);
|
||||
|
||||
this.resizeToContent();
|
||||
}
|
||||
|
||||
getCutPlaneParam(idx, n) {
|
||||
if (idx < 0 || !n) return;
|
||||
|
||||
const level = this.levels[idx];
|
||||
if (!level) return;
|
||||
|
||||
//const precision = Autodesk.Viewing.Private.calculatePrecision( level.elevation );
|
||||
const model = this.viewer.model;
|
||||
const globalOffset = model.getData().globalOffset;
|
||||
const units = model.getUnitString();
|
||||
const elevRaw = Autodesk.Viewing.Private.convertUnits('ft', units, 1, level.elevation);
|
||||
|
||||
let d = elevRaw - globalOffset.z - 0.5;
|
||||
if (n == 1)
|
||||
d = -1 * d;
|
||||
|
||||
return new THREE.Vector4(0, 0, n, d);
|
||||
}
|
||||
|
||||
onButtonClicked() {
|
||||
const upperSelector = document.getElementById('adn-upper-lvl-selector');
|
||||
const lowerSelector = document.getElementById('adn-lower-lvl-selector');
|
||||
|
||||
if (!upperSelector || !lowerSelector)
|
||||
return;
|
||||
|
||||
const upperIdx = upperSelector.selectedIndex;
|
||||
const upperCutPlaneParam = this.getCutPlaneParam(upperIdx, 1);
|
||||
const lowerIdx = lowerSelector.selectedIndex;
|
||||
const lowerCutPlaneParam = this.getCutPlaneParam(lowerIdx, -1);
|
||||
|
||||
this.viewer.setCutPlanes([upperCutPlaneParam, lowerCutPlaneParam]);
|
||||
}
|
||||
}
|
||||
|
||||
class AdnLevelSectionPanelExtension extends Autodesk.Viewing.Extension {
|
||||
constructor(viewer, options) {
|
||||
super(viewer, options);
|
||||
|
||||
this.panel = null;
|
||||
this.createUI = this.createUI.bind(this);
|
||||
this.onToolbarCreated = this.onToolbarCreated.bind(this);
|
||||
}
|
||||
|
||||
onToolbarCreated() {
|
||||
this.viewer.removeEventListener(
|
||||
Autodesk.Viewing.TOOLBAR_CREATED_EVENT,
|
||||
this.onToolbarCreated
|
||||
);
|
||||
|
||||
this.createUI();
|
||||
}
|
||||
|
||||
createUI() {
|
||||
const viewer = this.viewer;
|
||||
|
||||
const lvlSectionPanel = new AdnLevelSectionPanel(viewer, 'Level Section');
|
||||
|
||||
viewer.addPanel(lvlSectionPanel);
|
||||
this.panel = lvlSectionPanel;
|
||||
|
||||
const lvlSectionButton = new Autodesk.Viewing.UI.Button('toolbar-adnLevelSectionsTool');
|
||||
lvlSectionButton.setToolTip('Level Sections');
|
||||
lvlSectionButton.setIcon('adsk-icon-properties');
|
||||
lvlSectionButton.onClick = function () {
|
||||
lvlSectionPanel.setVisible(!lvlSectionPanel.isVisible());
|
||||
};
|
||||
|
||||
const subToolbar = new Autodesk.Viewing.UI.ControlGroup('toolbar-adn-tools');
|
||||
subToolbar.addControl(lvlSectionButton);
|
||||
subToolbar.adnLvlsectionbutton = lvlSectionButton;
|
||||
this.subToolbar = subToolbar;
|
||||
|
||||
viewer.toolbar.addControl(this.subToolbar);
|
||||
|
||||
lvlSectionPanel.addVisibilityListener(function (visible) {
|
||||
if (visible)
|
||||
viewer.onPanelVisible(lvlSectionPanel, viewer);
|
||||
|
||||
lvlSectionButton.setState(visible ? Autodesk.Viewing.UI.Button.State.ACTIVE : Autodesk.Viewing.UI.Button.State.INACTIVE);
|
||||
});
|
||||
}
|
||||
|
||||
load() {
|
||||
if (this.viewer.toolbar) {
|
||||
// Toolbar is already available, create the UI
|
||||
this.createUI();
|
||||
} else {
|
||||
// Toolbar hasn't been created yet, wait until we get notification of its creation
|
||||
this.viewer.addEventListener(
|
||||
Autodesk.Viewing.TOOLBAR_CREATED_EVENT,
|
||||
this.onToolbarCreated
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
unload() {
|
||||
if (this.panel) {
|
||||
this.panel.uninitialize();
|
||||
delete this.panel;
|
||||
this.panel = null;
|
||||
}
|
||||
|
||||
if (this.subToolbar) {
|
||||
this.viewer.toolbar.removeControl(this.subToolbar);
|
||||
delete this.subToolbar;
|
||||
this.subToolbar = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Autodesk.Viewing.theExtensionManager.registerExtension('Autodesk.ADN.LevelSectionPanel', AdnLevelSectionPanelExtension);
|
||||
})
|
@ -2,6 +2,7 @@
|
||||
let fragProxy;
|
||||
var targetFloorZ;
|
||||
var elevatorSpeed;
|
||||
var allDbIdsStr;
|
||||
|
||||
function launchViewer(urn) {
|
||||
var options = {
|
||||
@ -15,6 +16,7 @@ function launchViewer(urn) {
|
||||
viewer.start();
|
||||
var documentId = 'urn:' + urn;
|
||||
Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@ -112,19 +114,23 @@ function onDocumentLoadSuccess(doc) {
|
||||
|
||||
});
|
||||
|
||||
//viewer.loadExtension('ToolbarExtension');
|
||||
|
||||
|
||||
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
|
||||
var instanceTree = viewer.model.getData().instanceTree;
|
||||
var allDbIdsStr = Object.keys(instanceTree.nodeAccess.dbIdToIndex);
|
||||
allDbIdsStr = Object.keys(instanceTree.nodeAccess.dbIdToIndex);
|
||||
var domElem = document.getElementById('all_id');
|
||||
domElem.innerText = allDbIdsStr;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
let tree = viewer.model.getData().instanceTree;
|
||||
let nodeId = 749;//10952;
|
||||
let nodeId2 = 750;
|
||||
let nodeId3 = 751;
|
||||
let nodeId = 12112;//12104; //749; //10952;
|
||||
let nodeId2 = 12111;//12105; //750;
|
||||
let nodeId3 = 12110;//12104; //751;
|
||||
|
||||
tree.enumNodeFragments(nodeId, function (frag) {
|
||||
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
|
||||
@ -165,9 +171,100 @@ function onDocumentLoadSuccess(doc) {
|
||||
|
||||
});
|
||||
|
||||
//add toolbar fail
|
||||
//function ToolbarExtension(viewer, options) {
|
||||
// Autodesk.Viewing.Extension.call(this, viewer, options);
|
||||
//}
|
||||
|
||||
//ToolbarExtension.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
|
||||
//ToolbarExtension.prototype.constructor = ToolbarExtension;
|
||||
|
||||
//ToolbarExtension.prototype.load = function () {
|
||||
// this.viewer.setLightPreset(6);
|
||||
// this.viewer.setEnvMapBackground(true);
|
||||
// this.viewer.fitToView();
|
||||
// return true;
|
||||
//};
|
||||
|
||||
//ToolbarExtension.prototype.unload = function () {
|
||||
|
||||
//};
|
||||
//Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension);
|
||||
|
||||
//ToolbarExtension.prototype.onToolbarCreated = function (toolbar) {
|
||||
// //alert('TODO: customize Viewer toolbar');
|
||||
|
||||
// var viewer = this.viewer;
|
||||
// var button1 = new Autodesk.Viewing.UI.Button('show-env-bg-button');
|
||||
// button1.onClick = function (e) {
|
||||
// viewer.setEnvMapBackground(true);
|
||||
// };
|
||||
// button1.addClass('show-env-bg-button');
|
||||
// button1.setToolTip('Show Environment');
|
||||
|
||||
// //SubToolbar
|
||||
// this.subToolbar = new Autodesk.Viewing.UI.ControlGroup('my-custom-toolbar');
|
||||
// this.subToolbar.addControl(button1);
|
||||
// toolbar.addControl(this.subToolbar);
|
||||
|
||||
//};
|
||||
|
||||
|
||||
//NOP_VIEWER.getProperties(NOP_VIEWER.getSelection(), data => console.log(data));
|
||||
}
|
||||
|
||||
function setTransparentBuilding() {
|
||||
//allDbIdsStr.forEach((dbId) => {
|
||||
// setTransparency(dbId, 0.2);
|
||||
//})
|
||||
|
||||
for (var i = 0; i < allDbIdsStr.length; i++) {
|
||||
setTransparency(parseInt(allDbIdsStr[i]) , 0.2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function recoverTransparentBuilding() {
|
||||
//allDbIdsStr.forEach((dbId) => {
|
||||
// setTransparency(dbId, 1);
|
||||
//})
|
||||
|
||||
for (var i = 0; i < allDbIdsStr.length; i++) {
|
||||
setTransparency(parseInt(allDbIdsStr[i]), 1);
|
||||
}
|
||||
}
|
||||
|
||||
//設定模型 透明度
|
||||
function setTransparency(nodeId, opacity) {
|
||||
var model = viewer.model;
|
||||
//var nodeId = 1633;
|
||||
|
||||
var fragList = viewer.model.getFragmentList();
|
||||
|
||||
var fragIds = []
|
||||
|
||||
model.getData().instanceTree.enumNodeFragments(
|
||||
nodeId, (fragId) => {
|
||||
fragIds.push(fragId)
|
||||
});
|
||||
|
||||
fragIds.forEach((fragId) => {
|
||||
//获取材质
|
||||
var material = fragList.getMaterial(fragId);
|
||||
|
||||
if (material) {
|
||||
//设置透明度
|
||||
material.opacity = opacity;//0.5;
|
||||
material.transparent = true;
|
||||
//标记更新
|
||||
material.needsUpdate = true;
|
||||
}
|
||||
})
|
||||
|
||||
//更新viewer
|
||||
viewer.impl.invalidate(true, true, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function setElevatorFloor(floor) {
|
||||
@ -209,12 +306,14 @@ function movElevator() {
|
||||
|
||||
|
||||
let tree = viewer.model.getData().instanceTree;//三組:(749,750,751),(755,756,757),(761,762,763)
|
||||
let nodeId = 749; //10952;
|
||||
let nodeId2 = 750;
|
||||
let nodeId3 = 751;
|
||||
let nodeId = 12112;//12104; //749; //10952;
|
||||
let nodeId2 = 12111;//12105; //750;
|
||||
let nodeId3 = 12110;//12104; //751;
|
||||
let fragProxyZ = 0;
|
||||
var movStatus = 0; // 0=no 1=up 2=down
|
||||
changeColor(nodeId3);
|
||||
//setTransparency(0.2);
|
||||
setTransparentBuilding();
|
||||
|
||||
|
||||
if (fragProxy.position.z > targetFloorZ) {
|
||||
@ -285,6 +384,8 @@ function movElevator() {
|
||||
}
|
||||
else {
|
||||
hideColor(nodeId3);
|
||||
//setTransparency(1);
|
||||
recoverTransparentBuilding();
|
||||
}
|
||||
}
|
||||
else if (movStatus == 1) {
|
||||
@ -293,6 +394,8 @@ function movElevator() {
|
||||
}
|
||||
else {
|
||||
hideColor(nodeId3);
|
||||
//setTransparency(1);
|
||||
recoverTransparentBuilding();
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,12 +409,12 @@ function movElevator() {
|
||||
//viewer.impl.sceneUpdated(true);
|
||||
}
|
||||
|
||||
function changeColor(nodeId) {
|
||||
function changeColor(nodeId) {//電梯變綠色
|
||||
var color = new THREE.Vector4(0, 1, 0, 1);
|
||||
viewer.setThemingColor(nodeId, color);
|
||||
}
|
||||
|
||||
function hideColor(nodeId) {
|
||||
function hideColor(nodeId) {//顏色改成透明
|
||||
var color = new THREE.Vector4(0, 1, 0, 0);
|
||||
viewer.setThemingColor(nodeId, color);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user