Calculate Volume and Surface Area #72

This commit is contained in:
Viktor Kovacs 2021-05-21 16:29:30 +02:00
parent 7d74e68c4e
commit 21fe0267b7
7 changed files with 83 additions and 83 deletions

View File

@ -20,16 +20,7 @@ OV.ShowMessageDialog = function (title, message, subMessage)
OV.ShowListPopup = function (button, items, callbacks)
{
let popup = new OV.ListPopup ();
popup.SetCustomResizeHandler (function (modalDiv) {
let offset = button.offset ();
let left = offset.left + button.outerWidth (false);
let bottom = offset.top + button.outerHeight (false);
modalDiv.offset ({
left : left,
top : bottom - modalDiv.outerHeight (true)
});
});
popup.Init ();
popup.Init (button);
for (let i = 0; i < items.length; i++) {
let item = items[i];
popup.AddListItem (item, {

View File

@ -1,5 +1,4 @@
OV.FeatureSet =
{
SetDefaultColor : false,
ModelQuantities : false
SetDefaultColor : false
};

View File

@ -115,8 +115,8 @@ OV.InfoPanel = class
let contentDiv = this.detailsItem.GetChildrenDiv ();
let counterContainer = $('<div>').addClass ('ov_info_box').appendTo (contentDiv);
AddCounter (counterContainer, 'Vertices', info.vertexCount);
AddCounter (counterContainer, 'Triangles', info.triangleCount);
AddCounter (counterContainer, 'Vertices', info.element.VertexCount ());
AddCounter (counterContainer, 'Triangles', info.element.TriangleCount ());
let sizeContainer = $('<div>').addClass ('ov_info_box').appendTo (contentDiv);
$('<div>').addClass ('ov_info_box_title').html ('Size').appendTo (sizeContainer);
@ -134,6 +134,10 @@ OV.InfoPanel = class
}
let obj = this;
this.CreateButton (contentDiv, 'Calculate Quantities', function (button) {
obj.popup = OV.ShowQuantitiesPopup (button, info.element);
});
let materialsText = 'Materials (' + materialItems.length + ')';
this.CreateButton (contentDiv, materialsText, function (button) {
obj.popup = OV.ShowListPopup (button, materialItems, {

View File

@ -181,19 +181,27 @@ OV.ButtonDialog = class
}
};
OV.ListPopup = class
OV.PopupDialog = class
{
constructor ()
{
this.modal = new OV.Modal ();
this.listDiv = null;
}
Init ()
Init (parentItem)
{
let contentDiv = this.modal.GetContentDiv ();
contentDiv.addClass ('ov_popup');
this.listDiv = $('<div>').addClass ('ov_popup_list').addClass ('ov_thin_scrollbar').appendTo (contentDiv);
this.modal.SetCustomResizeHandler (function (modalDiv) {
let offset = parentItem.offset ();
let left = offset.left + parentItem.outerWidth (false);
let bottom = offset.top + parentItem.outerHeight (false);
modalDiv.offset ({
left : left,
top : bottom - modalDiv.outerHeight (true)
});
});
return contentDiv;
}
SetCustomResizeHandler (customResizeHandler)
@ -201,6 +209,32 @@ OV.ListPopup = class
this.modal.SetCustomResizeHandler (customResizeHandler);
}
Show ()
{
this.modal.Open ();
}
Hide ()
{
this.modal.Close ();
}
};
OV.ListPopup = class extends OV.PopupDialog
{
constructor ()
{
super ();
this.listDiv = null;
}
Init (parentItem)
{
let contentDiv = super.Init (parentItem);
this.listDiv = $('<div>').addClass ('ov_popup_list').addClass ('ov_thin_scrollbar').appendTo (contentDiv);
return contentDiv;
}
AddListItem (item, callbacks)
{
let listItemDiv = $('<div>').addClass ('ov_popup_list_item').appendTo (this.listDiv);
@ -220,14 +254,4 @@ OV.ListPopup = class
);
}
}
Show ()
{
this.modal.Open ();
}
Hide ()
{
this.modal.Close ();
}
};

View File

@ -1,51 +1,29 @@
OV.ShowQuantitiesDialog = function (model)
OV.ShowQuantitiesPopup = function (parentItem, element)
{
function AddTableRow (table, name, value)
{
let row = $('<tr>').appendTo (table);
$('<td>').html (name).appendTo (row);
$('<td>').addClass ('right').html (value).appendTo (row);
}
let popup = new OV.PopupDialog ();
let contentDiv = popup.Init (parentItem);
$('<div>').addClass ('ov_popup_title').html ('Volume').appendTo (contentDiv);
let volumeDiv = $('<div>').addClass ('ov_popup_text').html ('Calculating...').appendTo (contentDiv);
$('<div>').addClass ('ov_popup_title').html ('Surface Area').appendTo (contentDiv);
let surfaceAreaDiv = $('<div>').addClass ('ov_popup_text').html ('Calculating...').appendTo (contentDiv);
if (model === null) {
return OV.ShowMessageDialog (
'Quantity Calculation Failed',
'Please load a model before calculating quantities.',
null
);
}
let dialog = new OV.ButtonDialog ();
let contentDiv = dialog.Init ('Quantities', [
{
name : 'OK',
onClick () {
dialog.Hide ();
}
}
]);
let progressDialog = new OV.ProgressDialog ();
progressDialog.Show ('Calculating Quantities');
OV.RunTaskAsync (function () {
progressDialog.Hide ();
const volume = OV.CalculateVolume (model);
const surfaceArea = OV.CalculateSurfaceArea (model);
const volume = OV.CalculateVolume (element);
const surfaceArea = OV.CalculateSurfaceArea (element);
let volumeString = '';
if (volume === null) {
volumeString = 'Model is not closed';
volumeString = 'The model is not closed.';
} else {
volumeString = volume.toFixed (5);
}
let surfaceAreaString = surfaceArea.toFixed (5);
let table = $('<table>').addClass ('ov_dialog_table').appendTo (contentDiv);
AddTableRow (table, 'Volume', volumeString);
AddTableRow (table, 'Surface Area', surfaceAreaString);
dialog.Show ();
volumeDiv.html (volumeString);
surfaceAreaDiv.html (surfaceAreaString);
});
return dialog;
popup.Show ();
return popup;
};

View File

@ -628,6 +628,22 @@ div.ov_popup
border-radius: 5px;
}
div.ov_popup div.ov_popup_title
{
font-weight: bold;
margin-top: 15px;
margin-bottom: 10px;
margin-left: 10px;
margin-right: 10px;
}
div.ov_popup div.ov_popup_text
{
margin-bottom: 15px;
margin-left: 10px;
margin-right: 10px;
}
div.ov_popup div.ov_popup_list
{
max-height: 200px;

View File

@ -305,13 +305,7 @@ OV.Website = class
});
});
}
if (OV.FeatureSet.ModelQuantities) {
AddSeparator (this.toolbar, true);
AddButton (this.toolbar, 'settings', 'Model Quantities', true, function () {
obj.dialog = OV.ShowQuantitiesDialog (obj.model);
});
}
this.parameters.fileInput.on ('change', function (ev) {
if (ev.target.files.length > 0) {
obj.LoadModelFromFileList (ev.target.files);
@ -440,17 +434,13 @@ OV.Website = class
function GetMeshInfo (viewer, model, meshIndex)
{
let result = {
name : null,
vertexCount : null,
triangleCount : null,
element : null,
usedMaterials : null,
boundingBox : null
};
let mesh = model.GetMesh (meshIndex);
result.name = mesh.GetName ();
result.vertexCount = mesh.VertexCount ();
result.triangleCount = mesh.TriangleCount ();
result.element = mesh;
let userData = GetMeshUserData (viewer, meshIndex);
result.usedMaterials = [];
@ -472,9 +462,7 @@ OV.Website = class
function GetModelInfo (model, viewer)
{
let result = {
name : null,
vertexCount : model.VertexCount (),
triangleCount : model.TriangleCount (),
element : model,
usedMaterials : null,
boundingBox : null
};