227 lines
7.9 KiB
JavaScript
227 lines
7.9 KiB
JavaScript
|
'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);
|
|||
|
})
|