Merge branch 'dev' into ifcimporter
This commit is contained in:
commit
5d76010284
27
.github/workflows/build.yml
vendored
Normal file
27
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master, dev ]
|
||||
pull_request:
|
||||
branches: [ master, dev ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ${{ matrix.os-type }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [12.x, 14.x, 16.x]
|
||||
os-type: [windows-latest, macos-latest, ubuntu-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm install
|
||||
- run: npm run build
|
||||
- run: npm run test
|
||||
15
.travis.yml
15
.travis.yml
@ -1,15 +0,0 @@
|
||||
language: node_js
|
||||
|
||||
os:
|
||||
- osx
|
||||
- linux
|
||||
|
||||
node_js:
|
||||
- "15"
|
||||
|
||||
install:
|
||||
- npm install
|
||||
|
||||
script:
|
||||
- npm run build
|
||||
- npm run test
|
||||
@ -3,7 +3,7 @@
|
||||
Online 3D Viewer (https://3dviewer.net) is a free and open source web solution to visualize and explore 3D models right in your browser. This repository contains the source code of the website and the library behind it.
|
||||
|
||||
[](https://ci.appveyor.com/project/kovacsv/online3dviewer)
|
||||
[](https://travis-ci.com/kovacsv/Online3DViewer)
|
||||
[](https://github.com/kovacsv/Online3DViewer/actions/workflows/build.yml)
|
||||
[](https://lgtm.com/projects/g/kovacsv/Online3DViewer/context:javascript)
|
||||
|
||||

|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
style="border:1px solid #eeeeee;">
|
||||
</iframe>
|
||||
<iframe
|
||||
src="../../website/embed.html#model=../test/testfiles/obj/hundred_cubes.obj$color=200,0,0"
|
||||
src="../../website/embed.html#model=../test/testfiles/obj/hundred_cubes.obj$background=200,200,200$color=200,0,0"
|
||||
width=360 height=240
|
||||
style="border:1px solid #eeeeee;">
|
||||
</iframe>
|
||||
|
||||
@ -70,7 +70,9 @@
|
||||
<!-- importer end -->
|
||||
|
||||
<script type='text/javascript'>
|
||||
OV.Init3DViewerElements ();
|
||||
OV.Init3DViewerElements (function (viewers) {
|
||||
viewers[0].viewer.renderer.setClearColor ('#222222', 1.0);
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@ -109,7 +111,8 @@
|
||||
<div class="online_3d_viewer"
|
||||
style="width: 360px; height: 240px;"
|
||||
model="../../test/testfiles/obj/hundred_cubes.obj"
|
||||
color="200,0,0">
|
||||
color="200,0,0"
|
||||
background="200,200,200">
|
||||
</div>
|
||||
<div class="online_3d_viewer"
|
||||
style="width: 360px; height: 240px;"
|
||||
|
||||
10
source/external/rhinoimporter.js
vendored
10
source/external/rhinoimporter.js
vendored
@ -181,9 +181,13 @@ OV.Importer3dm = class extends OV.ImporterBase
|
||||
mesh.SetName (rhinoAttributes.name);
|
||||
|
||||
let userStrings = rhinoAttributes.getUserStrings ();
|
||||
for (let i = 0; i < userStrings.length; i++) {
|
||||
let userString = userStrings[i];
|
||||
mesh.AddProperty (new OV.Property (OV.PropertyType.Text, userString[0], userString[1]));
|
||||
if (userStrings.length > 0) {
|
||||
let propertyGroup = new OV.PropertyGroup ('User texts');
|
||||
for (let i = 0; i < userStrings.length; i++) {
|
||||
let userString = userStrings[i];
|
||||
propertyGroup.AddProperty (new OV.Property (OV.PropertyType.Text, userString[0], userString[1]));
|
||||
}
|
||||
mesh.AddPropertyGroup (propertyGroup);
|
||||
}
|
||||
|
||||
let materialIndex = this.GetMaterialIndex (rhinoDoc, rhinoObject, rhinoInstanceReferences);
|
||||
|
||||
@ -508,14 +508,18 @@ OV.ImporterGltf = class extends OV.ImporterBase
|
||||
|
||||
ImportModelProperties (gltf)
|
||||
{
|
||||
let propertyGroup = new OV.PropertyGroup ('Asset properties');
|
||||
for (let propertyName in gltf.asset) {
|
||||
if (gltf.asset.hasOwnProperty (propertyName)) {
|
||||
if (typeof gltf.asset[propertyName] === 'string') {
|
||||
const property = new OV.Property (OV.PropertyType.Text, propertyName, gltf.asset[propertyName]);
|
||||
this.model.AddProperty (property);
|
||||
propertyGroup.AddProperty (property);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (propertyGroup.PropertyCount () > 0) {
|
||||
this.model.AddPropertyGroup (propertyGroup);
|
||||
}
|
||||
}
|
||||
|
||||
GetDefaultScene (gltf)
|
||||
|
||||
@ -3,7 +3,7 @@ OV.Element = class
|
||||
constructor ()
|
||||
{
|
||||
this.name = '';
|
||||
this.properties = [];
|
||||
this.propertyGroups = [];
|
||||
}
|
||||
|
||||
GetName ()
|
||||
@ -36,20 +36,20 @@ OV.Element = class
|
||||
return 0;
|
||||
}
|
||||
|
||||
PropertyCount ()
|
||||
PropertyGroupCount ()
|
||||
{
|
||||
return this.properties.length;
|
||||
return this.propertyGroups.length;
|
||||
}
|
||||
|
||||
AddProperty (property)
|
||||
AddPropertyGroup (propertyGroup)
|
||||
{
|
||||
this.properties.push (property);
|
||||
return this.properties.length - 1;
|
||||
this.propertyGroups.push (propertyGroup);
|
||||
return this.propertyGroups.length - 1;
|
||||
}
|
||||
|
||||
GetProperty (index)
|
||||
GetPropertyGroup (index)
|
||||
{
|
||||
return this.properties[index];
|
||||
return this.propertyGroups[index];
|
||||
}
|
||||
|
||||
EnumerateVertices (onVertex)
|
||||
|
||||
@ -16,3 +16,27 @@ OV.Property = class
|
||||
this.value = value;
|
||||
}
|
||||
};
|
||||
|
||||
OV.PropertyGroup = class
|
||||
{
|
||||
constructor (name)
|
||||
{
|
||||
this.name = name;
|
||||
this.properties = [];
|
||||
}
|
||||
|
||||
PropertyCount ()
|
||||
{
|
||||
return this.properties.length;
|
||||
}
|
||||
|
||||
AddProperty (property)
|
||||
{
|
||||
this.properties.push (property);
|
||||
}
|
||||
|
||||
GetProperty (index)
|
||||
{
|
||||
return this.properties[index];
|
||||
}
|
||||
};
|
||||
|
||||
@ -118,11 +118,17 @@ OV.ParameterListBuilder = class
|
||||
return this;
|
||||
}
|
||||
|
||||
AddBackground (background)
|
||||
{
|
||||
this.AddUrlPart ('background', OV.ParameterConverter.ColorToString (background));
|
||||
return this;
|
||||
}
|
||||
|
||||
AddColor (color)
|
||||
{
|
||||
this.AddUrlPart ('color', OV.ParameterConverter.ColorToString (color));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
AddUrlPart (keyword, urlPart)
|
||||
{
|
||||
@ -166,6 +172,12 @@ OV.ParameterListParser = class
|
||||
return OV.ParameterConverter.StringToCamera (keywordParams);
|
||||
}
|
||||
|
||||
GetBackground ()
|
||||
{
|
||||
let backgroundParams = this.GetKeywordParams ('background');
|
||||
return OV.ParameterConverter.StringToColor (backgroundParams);
|
||||
}
|
||||
|
||||
GetColor ()
|
||||
{
|
||||
let colorParams = this.GetKeywordParams ('color');
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
OV.Init3DViewerElements = function ()
|
||||
OV.Init3DViewerElements = function (onReady)
|
||||
{
|
||||
function LoadElement (element)
|
||||
{
|
||||
@ -55,6 +55,14 @@ OV.Init3DViewerElements = function ()
|
||||
},
|
||||
});
|
||||
|
||||
let backgroundParam = element.getAttribute ('background');
|
||||
if (backgroundParam) {
|
||||
let color = OV.ParameterConverter.StringToColor (backgroundParam);
|
||||
if (color !== null) {
|
||||
viewer.SetBackgroundColor (color);
|
||||
}
|
||||
}
|
||||
|
||||
let modelParams = element.getAttribute ('model');
|
||||
if (!modelParams) {
|
||||
return;
|
||||
@ -66,9 +74,9 @@ OV.Init3DViewerElements = function ()
|
||||
}
|
||||
|
||||
let settings = new OV.ImportSettings ();
|
||||
let colorParams = element.getAttribute ('color');
|
||||
if (colorParams) {
|
||||
let color = OV.ParameterConverter.StringToColor (colorParams);
|
||||
let colorParam = element.getAttribute ('color');
|
||||
if (colorParam) {
|
||||
let color = OV.ParameterConverter.StringToColor (colorParam);
|
||||
if (color !== null) {
|
||||
settings.defaultColor = color;
|
||||
}
|
||||
@ -89,6 +97,9 @@ OV.Init3DViewerElements = function ()
|
||||
let viewerElement = LoadElement (element);
|
||||
viewerElements.push (viewerElement);
|
||||
}
|
||||
if (onReady !== undefined && onReady !== null) {
|
||||
onReady (viewerElements);
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener ('resize', function () {
|
||||
|
||||
@ -132,6 +132,14 @@ OV.ViewerGeometry = class
|
||||
}
|
||||
};
|
||||
|
||||
OV.ViewerSettings = class
|
||||
{
|
||||
constructor ()
|
||||
{
|
||||
this.backgroundColor = new OV.Color (255, 255, 255);
|
||||
}
|
||||
};
|
||||
|
||||
OV.Viewer = class
|
||||
{
|
||||
constructor ()
|
||||
@ -180,6 +188,13 @@ OV.Viewer = class
|
||||
this.navigation.SetClickHandler (onClick);
|
||||
}
|
||||
|
||||
SetBackgroundColor (color)
|
||||
{
|
||||
let hexColor = '#' + OV.ColorToHexString (color);
|
||||
this.renderer.setClearColor (hexColor, 1.0);
|
||||
this.Render ();
|
||||
}
|
||||
|
||||
GetCamera ()
|
||||
{
|
||||
return this.navigation.GetCamera ();
|
||||
|
||||
@ -184,20 +184,6 @@ describe ('Model Finalization', function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe ('Model Properties', function() {
|
||||
let model = new OV.Model ();
|
||||
model.AddProperty (new OV.Property (OV.PropertyType.Text, 'name 01', 'value 01'));
|
||||
model.AddProperty (new OV.Property (OV.PropertyType.Integer, 'name 02', 2));
|
||||
model.AddProperty (new OV.Property (OV.PropertyType.Number, 'name 03', 3.5));
|
||||
assert.strictEqual (model.PropertyCount (), 3);
|
||||
assert.strictEqual (model.GetProperty (0).name, 'name 01');
|
||||
assert.strictEqual (model.GetProperty (0).value, 'value 01');
|
||||
assert.strictEqual (model.GetProperty (1).name, 'name 02');
|
||||
assert.strictEqual (model.GetProperty (1).value, 2);
|
||||
assert.strictEqual (model.GetProperty (2).name, 'name 03');
|
||||
assert.strictEqual (model.GetProperty (2).value, 3.5);
|
||||
});
|
||||
|
||||
describe ('Color Conversion', function() {
|
||||
it ('Color equality check', function () {
|
||||
assert (OV.ColorIsEqual (new OV.Color (10, 20, 30), new OV.Color (10, 20, 30)));
|
||||
|
||||
@ -8,15 +8,18 @@ describe ('Parameter List', function () {
|
||||
new OV.Coord3D (0.0, 0.0, 0.0),
|
||||
new OV.Coord3D (0.0, 0.0, 1.0)
|
||||
);
|
||||
let background = new OV.Color (4, 5, 6);
|
||||
let color = new OV.Color (1, 2, 3);
|
||||
let urlParams1 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).GetParameterList ();
|
||||
let urlParams2 = OV.CreateUrlBuilder ().AddCamera (camera).GetParameterList ();
|
||||
let urlParams3 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).GetParameterList ();
|
||||
let urlParams4 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddColor (color).GetParameterList ();
|
||||
let urlParams5 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddBackground (background).AddColor (color).GetParameterList ();
|
||||
assert.strictEqual (urlParams1, 'model=a.txt,b.txt');
|
||||
assert.strictEqual (urlParams2, 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000');
|
||||
assert.strictEqual (urlParams3, 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000');
|
||||
assert.strictEqual (urlParams4, 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$color=1,2,3');
|
||||
assert.strictEqual (urlParams5, 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$background=4,5,6$color=1,2,3');
|
||||
});
|
||||
|
||||
it ('Parameter list parser', function () {
|
||||
@ -26,12 +29,14 @@ describe ('Parameter List', function () {
|
||||
new OV.Coord3D (0.0, 0.0, 0.0),
|
||||
new OV.Coord3D (0.0, 0.0, 1.0)
|
||||
);
|
||||
let color = new OV.Color (1, 2, 3);
|
||||
let background = new OV.Color (4, 5, 6);
|
||||
let color = new OV.Color (1, 2, 3);
|
||||
let urlParamsLegacy = 'a.txt,b.txt';
|
||||
let urlParams1 = 'model=a.txt,b.txt';
|
||||
let urlParams2 = 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000';
|
||||
let urlParams3 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000';
|
||||
let urlParams4 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$color=1,2,3';
|
||||
let urlParams5 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$background=4,5,6$color=1,2,3';
|
||||
let parserLegacy = OV.CreateUrlParser (urlParamsLegacy);
|
||||
assert.deepStrictEqual (parserLegacy.GetModelUrls (), modelUrls);
|
||||
assert.deepStrictEqual (parserLegacy.GetCamera (), null);
|
||||
@ -51,5 +56,10 @@ describe ('Parameter List', function () {
|
||||
assert.deepStrictEqual (parser4.GetModelUrls (), modelUrls);
|
||||
assert.deepStrictEqual (parser4.GetCamera (), camera);
|
||||
assert.deepStrictEqual (parser4.GetColor (), color);
|
||||
let parser5 = OV.CreateUrlParser (urlParams5);
|
||||
assert.deepStrictEqual (parser5.GetModelUrls (), modelUrls);
|
||||
assert.deepStrictEqual (parser5.GetCamera (), camera);
|
||||
assert.deepStrictEqual (parser5.GetColor (), color);
|
||||
assert.deepStrictEqual (parser5.GetBackground (), background);
|
||||
});
|
||||
});
|
||||
|
||||
40
test/tests/property_test.js
Normal file
40
test/tests/property_test.js
Normal file
@ -0,0 +1,40 @@
|
||||
var assert = require ('assert');
|
||||
|
||||
describe ('Property Test', function () {
|
||||
it ('Property Group', function() {
|
||||
let group = new OV.PropertyGroup ('Group');
|
||||
group.AddProperty (new OV.Property (OV.PropertyType.Text, 'name 01', 'value 01'));
|
||||
group.AddProperty (new OV.Property (OV.PropertyType.Integer, 'name 02', 2));
|
||||
group.AddProperty (new OV.Property (OV.PropertyType.Number, 'name 03', 3.5));
|
||||
assert.strictEqual (group.PropertyCount (), 3);
|
||||
assert.strictEqual (group.GetProperty (0).name, 'name 01');
|
||||
assert.strictEqual (group.GetProperty (0).value, 'value 01');
|
||||
assert.strictEqual (group.GetProperty (1).name, 'name 02');
|
||||
assert.strictEqual (group.GetProperty (1).value, 2);
|
||||
assert.strictEqual (group.GetProperty (2).name, 'name 03');
|
||||
assert.strictEqual (group.GetProperty (2).value, 3.5);
|
||||
});
|
||||
|
||||
it ('Model Properties', function() {
|
||||
let model = new OV.Model ();
|
||||
let group1 = new OV.PropertyGroup ('Group 01');
|
||||
let group2 = new OV.PropertyGroup ('Group 02');
|
||||
let group3 = new OV.PropertyGroup ('Group 03');
|
||||
group1.AddProperty (new OV.Property (OV.PropertyType.Text, 'name 01', 'value 01'));
|
||||
group2.AddProperty (new OV.Property (OV.PropertyType.Integer, 'name 02', 2));
|
||||
group3.AddProperty (new OV.Property (OV.PropertyType.Number, 'name 03', 3.5));
|
||||
model.AddPropertyGroup (group1);
|
||||
model.AddPropertyGroup (group2);
|
||||
model.AddPropertyGroup (group3);
|
||||
assert.strictEqual (model.PropertyGroupCount (), 3);
|
||||
assert.strictEqual (model.GetPropertyGroup (0).name, 'Group 01');
|
||||
assert.strictEqual (model.GetPropertyGroup (1).name, 'Group 02');
|
||||
assert.strictEqual (model.GetPropertyGroup (2).name, 'Group 03');
|
||||
assert.strictEqual (model.GetPropertyGroup (0).GetProperty (0).name, 'name 01');
|
||||
assert.strictEqual (model.GetPropertyGroup (0).GetProperty (0).value, 'value 01');
|
||||
assert.strictEqual (model.GetPropertyGroup (1).GetProperty (0).name, 'name 02');
|
||||
assert.strictEqual (model.GetPropertyGroup (1).GetProperty (0).value, 2);
|
||||
assert.strictEqual (model.GetPropertyGroup (2).GetProperty (0).name, 'name 03');
|
||||
assert.strictEqual (model.GetPropertyGroup (2).GetProperty (0).value, 3.5);
|
||||
});
|
||||
});
|
||||
@ -10,20 +10,6 @@ OV.CookieHandler = class
|
||||
this.SetStringVal (key, '');
|
||||
}
|
||||
|
||||
GetBoolVal (key, defVal)
|
||||
{
|
||||
let stringVal = this.GetStringVal (key);
|
||||
if (stringVal === null) {
|
||||
return defVal;
|
||||
}
|
||||
return stringVal === 'true' ? true : false;
|
||||
}
|
||||
|
||||
SetBoolVal (key, value)
|
||||
{
|
||||
this.SetStringVal (key, value ? 'true' : false);
|
||||
}
|
||||
|
||||
SetStringVal (key, value)
|
||||
{
|
||||
let date = new Date ();
|
||||
@ -43,4 +29,32 @@ OV.CookieHandler = class
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
GetBoolVal (key, defVal)
|
||||
{
|
||||
let stringVal = this.GetStringVal (key);
|
||||
if (stringVal === null) {
|
||||
return defVal;
|
||||
}
|
||||
return stringVal === 'true' ? true : false;
|
||||
}
|
||||
|
||||
SetBoolVal (key, value)
|
||||
{
|
||||
this.SetStringVal (key, value ? 'true' : 'false');
|
||||
}
|
||||
|
||||
GetColorVal (key, defVal)
|
||||
{
|
||||
let stringVal = this.GetStringVal (key);
|
||||
if (stringVal === null) {
|
||||
return defVal;
|
||||
}
|
||||
return OV.ParameterConverter.StringToColor (stringVal);
|
||||
}
|
||||
|
||||
SetColorVal (key, value)
|
||||
{
|
||||
this.SetStringVal (key, OV.ParameterConverter.ColorToString (value));
|
||||
}
|
||||
};
|
||||
|
||||
@ -20,6 +20,10 @@ OV.Embed = class
|
||||
if (urls === null) {
|
||||
return;
|
||||
}
|
||||
let background = this.hashHandler.GetBackgroundFromHash ();
|
||||
if (background !== null) {
|
||||
this.viewer.SetBackgroundColor (background);
|
||||
}
|
||||
let settings = new OV.ImportSettings ();
|
||||
let color = this.hashHandler.GetColorFromHash ();
|
||||
if (color !== null) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
OV.FeatureSet =
|
||||
{
|
||||
SetDefaultColor : false
|
||||
SettingsAvailable : false
|
||||
};
|
||||
|
||||
@ -46,6 +46,12 @@ OV.HashHandler = class
|
||||
return parser.GetCamera ();
|
||||
}
|
||||
|
||||
GetBackgroundFromHash ()
|
||||
{
|
||||
let parser = OV.CreateUrlParser (this.GetHash ());
|
||||
return parser.GetBackground ();
|
||||
}
|
||||
|
||||
GetColorFromHash ()
|
||||
{
|
||||
let parser = OV.CreateUrlParser (this.GetHash ());
|
||||
|
||||
@ -1,6 +1,18 @@
|
||||
OV.ShowSettingsDialog = function (importSettings, onOk)
|
||||
OV.ShowSettingsDialog = function (viewerSettings, importSettings, onOk)
|
||||
{
|
||||
function AddColorRow (contentDiv, defaultColor, paramName, paramDesc)
|
||||
{
|
||||
let colorRow = $('<div>').addClass ('ov_dialog_table_row').appendTo (contentDiv);
|
||||
$('<div>').html (paramName).addClass ('ov_dialog_table_row_name').appendTo (colorRow);
|
||||
let valueColumn = $('<div>').addClass ('ov_dialog_table_row_value').appendTo (colorRow);
|
||||
let colorInput = $('<input>').attr ('type', 'color').addClass ('ov_dialog_color').appendTo (valueColumn);
|
||||
$('<span>').addClass ('ov_dialog_table_row_comment').html (paramDesc).appendTo (valueColumn);
|
||||
colorInput.val ('#' + OV.ColorToHexString (defaultColor));
|
||||
return colorInput;
|
||||
}
|
||||
|
||||
let dialogSettings = {
|
||||
backgroundColor: viewerSettings.backgroundColor,
|
||||
defaultColor : importSettings.defaultColor
|
||||
};
|
||||
let dialog = new OV.ButtonDialog ();
|
||||
@ -21,16 +33,18 @@ OV.ShowSettingsDialog = function (importSettings, onOk)
|
||||
}
|
||||
]);
|
||||
|
||||
let colorRow = $('<div>').addClass ('ov_dialog_table_row').appendTo (contentDiv);
|
||||
$('<div>').html ('Default Color').addClass ('ov_dialog_table_row_name').appendTo (colorRow);
|
||||
let valueColumn = $('<div>').addClass ('ov_dialog_table_row_value').appendTo (colorRow);
|
||||
let colorInput = $('<input>').attr ('type', 'color').addClass ('ov_dialog_color').appendTo (valueColumn);
|
||||
$('<span>').addClass ('ov_dialog_table_row_comment').html ('(For surfaces with no material)').appendTo (valueColumn);
|
||||
colorInput.val ('#' + OV.ColorToHexString (dialogSettings.defaultColor));
|
||||
let backgroundColorInput = AddColorRow (contentDiv, dialogSettings.backgroundColor, 'Background Color', '(Visualization only)');
|
||||
backgroundColorInput.change (function () {
|
||||
let colorStr = backgroundColorInput.val ().substr (1);
|
||||
dialogSettings.backgroundColor = OV.HexStringToColor (colorStr);
|
||||
});
|
||||
|
||||
let colorInput = AddColorRow (contentDiv, dialogSettings.defaultColor, 'Default Color', '(When no material defined)');
|
||||
colorInput.change (function () {
|
||||
let colorStr = colorInput.val ().substr (1);
|
||||
dialogSettings.defaultColor = OV.HexStringToColor (colorStr);
|
||||
});
|
||||
|
||||
dialog.Show ();
|
||||
return dialog;
|
||||
};
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
|
||||
OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
OV.ShowSharingDialog = function (importer, viewerSettings, importSettings, camera)
|
||||
{
|
||||
function AddCheckboxLine (parentDiv, text, id, onChange)
|
||||
{
|
||||
@ -25,6 +24,7 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
let builder = OV.CreateUrlBuilder ();
|
||||
builder.AddModelUrls (params.files);
|
||||
builder.AddCamera (params.camera);
|
||||
builder.AddBackground (params.background);
|
||||
builder.AddColor (params.color);
|
||||
let hashParameters = builder.GetParameterList ();
|
||||
|
||||
@ -58,18 +58,18 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
return input;
|
||||
}
|
||||
|
||||
function AddSharingLinkTab (parentDiv, sharingLinkParams)
|
||||
function AddSharingLinkTab (parentDiv, importSettings, sharingLinkParams)
|
||||
{
|
||||
let section = $('<div>').addClass ('ov_dialog_section').appendTo (parentDiv);
|
||||
$('<div>').html ('Sharing Link').addClass ('ov_dialog_inner_title').appendTo (section);
|
||||
let optionsSection = null;
|
||||
if (OV.FeatureSet.SetDefaultColor) {
|
||||
if (OV.FeatureSet.SettingsAvailable) {
|
||||
optionsSection = $('<div>').addClass ('ov_dialog_section').appendTo (section);
|
||||
}
|
||||
let sharingLinkInput = AddCopyableTextInput (section, function () {
|
||||
return GetSharingLink (sharingLinkParams);
|
||||
});
|
||||
if (OV.FeatureSet.SetDefaultColor) {
|
||||
if (OV.FeatureSet.SettingsAvailable) {
|
||||
AddCheckboxLine (optionsSection, 'Use overridden default color', 'share_color', function (checked) {
|
||||
sharingLinkParams.color = checked ? importSettings.defaultColor : null;
|
||||
sharingLinkInput.val (GetSharingLink (sharingLinkParams));
|
||||
@ -79,7 +79,7 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
sharingLinkInput.val (GetSharingLink (sharingLinkParams));
|
||||
}
|
||||
|
||||
function AddEmbeddingCodeTab (parentDiv, embeddingCodeParams)
|
||||
function AddEmbeddingCodeTab (parentDiv, viewerSettings, importSettings, embeddingCodeParams)
|
||||
{
|
||||
let section = $('<div>').addClass ('ov_dialog_section').css ('margin-top', '20px').appendTo (parentDiv);
|
||||
$('<div>').html ('Embedding Code').addClass ('ov_dialog_inner_title').appendTo (section);
|
||||
@ -91,11 +91,16 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
embeddingCodeParams.camera = checked ? camera : null;
|
||||
embeddingCodeInput.val (GetEmbeddingCode (embeddingCodeParams));
|
||||
});
|
||||
if (OV.FeatureSet.SetDefaultColor) {
|
||||
if (OV.FeatureSet.SettingsAvailable) {
|
||||
AddCheckboxLine (optionsSection, 'Use overridden background color', 'embed_background', function (checked) {
|
||||
embeddingCodeParams.background = checked ? viewerSettings.backgroundColor : null;
|
||||
embeddingCodeInput.val (GetEmbeddingCode (embeddingCodeParams));
|
||||
});
|
||||
AddCheckboxLine (optionsSection, 'Use overridden default color', 'embed_color', function (checked) {
|
||||
embeddingCodeParams.color = checked ? importSettings.defaultColor : null;
|
||||
embeddingCodeInput.val (GetEmbeddingCode (embeddingCodeParams));
|
||||
});
|
||||
embeddingCodeParams.background = viewerSettings.backgroundColor;
|
||||
embeddingCodeParams.color = importSettings.defaultColor;
|
||||
}
|
||||
embeddingCodeInput.val (GetEmbeddingCode (embeddingCodeParams));
|
||||
@ -124,6 +129,7 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
let embeddingCodeParams = {
|
||||
files : modelFiles,
|
||||
camera : camera,
|
||||
background : null,
|
||||
color : null
|
||||
};
|
||||
|
||||
@ -137,8 +143,8 @@ OV.ShowSharingDialog = function (importer, importSettings, camera)
|
||||
}
|
||||
]);
|
||||
|
||||
AddSharingLinkTab (contentDiv, sharingLinkParams);
|
||||
AddEmbeddingCodeTab (contentDiv, embeddingCodeParams);
|
||||
AddSharingLinkTab (contentDiv, importSettings, sharingLinkParams);
|
||||
AddEmbeddingCodeTab (contentDiv, viewerSettings, importSettings, embeddingCodeParams);
|
||||
|
||||
dialog.Show ();
|
||||
return dialog;
|
||||
|
||||
@ -38,6 +38,12 @@ OV.Sidebar = class
|
||||
return this.visible;
|
||||
}
|
||||
|
||||
AddPropertyGroup (table, propertyGroup)
|
||||
{
|
||||
let row = $('<div>').addClass ('ov_property_table_row group').appendTo (table);
|
||||
row.html (propertyGroup.name).attr ('title', propertyGroup.name);
|
||||
}
|
||||
|
||||
AddProperty (table, property)
|
||||
{
|
||||
let row = $('<div>').addClass ('ov_property_table_row').appendTo (table);
|
||||
@ -45,6 +51,13 @@ OV.Sidebar = class
|
||||
let valueColumn = $('<div>').addClass ('ov_property_table_cell ov_property_table_value').appendTo (row);
|
||||
nameColum.html (property.name + ':').attr ('title', property.name);
|
||||
this.DisplayPropertyValue (property, valueColumn);
|
||||
return row;
|
||||
}
|
||||
|
||||
AddPropertyInGroup (table, property)
|
||||
{
|
||||
let row = this.AddProperty (table, property);
|
||||
row.addClass ('ingroup');
|
||||
}
|
||||
|
||||
AddCalculatedProperty (table, name, calculateValue)
|
||||
@ -121,11 +134,15 @@ OV.Sidebar = class
|
||||
}
|
||||
return new OV.Property (OV.PropertyType.Number, null, volume);
|
||||
});
|
||||
if (element.PropertyCount () > 0) {
|
||||
if (element.PropertyGroupCount () > 0) {
|
||||
let customTable = $('<div>').addClass ('ov_property_table ov_property_table_custom').appendTo (this.contentDiv);
|
||||
for (let i = 0; i < element.PropertyCount (); i++) {
|
||||
const property = element.GetProperty (i);
|
||||
this.AddProperty (customTable, property);
|
||||
for (let i = 0; i < element.PropertyGroupCount (); i++) {
|
||||
const propertyGroup = element.GetPropertyGroup (i);
|
||||
this.AddPropertyGroup (customTable, propertyGroup);
|
||||
for (let j = 0; j < propertyGroup.PropertyCount (); j++) {
|
||||
const property = propertyGroup.GetProperty (j);
|
||||
this.AddPropertyInGroup (customTable, property);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.Resize ();
|
||||
|
||||
@ -562,7 +562,7 @@ div.ov_dialog div.ov_dialog_table_row
|
||||
|
||||
div.ov_dialog div.ov_dialog_table_row_name
|
||||
{
|
||||
width: 120px;
|
||||
width: 140px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
@ -674,6 +674,16 @@ div.ov_property_table div.ov_property_table_row
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
div.ov_property_table div.ov_property_table_row.group
|
||||
{
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
div.ov_property_table div.ov_property_table_row.ingroup
|
||||
{
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
div.ov_property_table div.ov_property_table_cell
|
||||
{
|
||||
padding: 4px 0px;
|
||||
|
||||
@ -9,6 +9,7 @@ OV.Website = class
|
||||
this.toolbar = new OV.Toolbar (this.parameters.toolbarDiv);
|
||||
this.sidebar = new OV.Sidebar (this.parameters.sidebarDiv);
|
||||
this.navigator = new OV.Navigator (this.parameters.navigatorDiv, this.sidebar);
|
||||
this.viewerSettings = new OV.ViewerSettings ();
|
||||
this.importSettings = new OV.ImportSettings ();
|
||||
this.modelLoader = new OV.ThreeModelLoader ();
|
||||
this.highlightMaterial = new THREE.MeshPhongMaterial ({
|
||||
@ -21,12 +22,8 @@ OV.Website = class
|
||||
|
||||
Load ()
|
||||
{
|
||||
|
||||
let canvas = $('<canvas>').appendTo (this.parameters.viewerDiv);
|
||||
this.viewer.Init (canvas.get (0));
|
||||
this.ShowViewer (false);
|
||||
this.hashHandler.SetEventListener (this.OnHashChange.bind (this));
|
||||
|
||||
this.InitSettings ();
|
||||
this.InitViewer ();
|
||||
this.InitToolbar ();
|
||||
this.InitDragAndDrop ();
|
||||
this.InitModelLoader ();
|
||||
@ -37,6 +34,7 @@ OV.Website = class
|
||||
this.viewer.SetClickHandler (this.OnModelClicked.bind (this));
|
||||
this.Resize ();
|
||||
|
||||
this.hashHandler.SetEventListener (this.OnHashChange.bind (this));
|
||||
this.OnHashChange ();
|
||||
|
||||
let obj = this;
|
||||
@ -210,19 +208,33 @@ OV.Website = class
|
||||
if (urls === null) {
|
||||
return;
|
||||
}
|
||||
let settings = new OV.ImportSettings ();
|
||||
settings.defaultColor = this.importSettings.defaultColor;
|
||||
let importSettings = new OV.ImportSettings ();
|
||||
importSettings.defaultColor = this.importSettings.defaultColor;
|
||||
let color = this.hashHandler.GetColorFromHash ();
|
||||
if (color !== null) {
|
||||
settings.defaultColor = color;
|
||||
importSettings.defaultColor = color;
|
||||
}
|
||||
this.LoadModelFromUrlList (urls, settings);
|
||||
this.LoadModelFromUrlList (urls, importSettings);
|
||||
} else {
|
||||
this.ClearModel ();
|
||||
this.parameters.introDiv.show ();
|
||||
}
|
||||
}
|
||||
|
||||
InitSettings ()
|
||||
{
|
||||
this.viewerSettings.backgroundColor = this.cookieHandler.GetColorVal ('ov_background_color', new OV.Color (255, 255, 255));
|
||||
this.importSettings.defaultColor = this.cookieHandler.GetColorVal ('ov_default_color', new OV.Color (200, 200, 200));
|
||||
}
|
||||
|
||||
InitViewer ()
|
||||
{
|
||||
let canvas = $('<canvas>').appendTo (this.parameters.viewerDiv);
|
||||
this.viewer.Init (canvas.get (0));
|
||||
this.viewer.SetBackgroundColor (this.viewerSettings.backgroundColor);
|
||||
this.ShowViewer (false);
|
||||
}
|
||||
|
||||
InitToolbar ()
|
||||
{
|
||||
function AddButton (toolbar, imageName, imageTitle, onlyFullWidth, onClick)
|
||||
@ -314,17 +326,20 @@ OV.Website = class
|
||||
exportDialog.Show (obj.model, obj.viewer);
|
||||
});
|
||||
AddButton (this.toolbar, 'share', 'Share model', true, function () {
|
||||
obj.dialog = OV.ShowSharingDialog (importer, obj.importSettings, obj.viewer.GetCamera ());
|
||||
obj.dialog = OV.ShowSharingDialog (importer, obj.viewerSettings, obj.importSettings, obj.viewer.GetCamera ());
|
||||
});
|
||||
if (OV.FeatureSet.SetDefaultColor) {
|
||||
if (OV.FeatureSet.SettingsAvailable) {
|
||||
AddSeparator (this.toolbar, true);
|
||||
AddButton (this.toolbar, 'settings', 'Settings', true, function () {
|
||||
obj.dialog = OV.ShowSettingsDialog (obj.importSettings, function (dialogSettings) {
|
||||
let reload = false;
|
||||
if (!OV.ColorIsEqual (obj.importSettings.defaultColor, dialogSettings.defaultColor)) {
|
||||
obj.importSettings.defaultColor = dialogSettings.defaultColor;
|
||||
reload = true;
|
||||
}
|
||||
obj.dialog = OV.ShowSettingsDialog (obj.viewerSettings, obj.importSettings, function (dialogSettings) {
|
||||
obj.viewerSettings.backgroundColor = dialogSettings.backgroundColor;
|
||||
obj.viewer.SetBackgroundColor (obj.viewerSettings.backgroundColor);
|
||||
obj.cookieHandler.SetColorVal ('ov_background_color', obj.viewerSettings.backgroundColor);
|
||||
|
||||
let reload = !OV.ColorIsEqual (obj.importSettings.defaultColor, dialogSettings.defaultColor);
|
||||
obj.importSettings.defaultColor = dialogSettings.defaultColor;
|
||||
obj.cookieHandler.SetColorVal ('ov_default_color', obj.importSettings.defaultColor);
|
||||
|
||||
if (reload) {
|
||||
obj.ReloadFiles ();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user