Download model basics.
This commit is contained in:
parent
aa247e7700
commit
5ac604c172
54
assets/icons/download.svg
Normal file
54
assets/icons/download.svg
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 18 18"
|
||||||
|
xml:space="preserve"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4"
|
||||||
|
sodipodi:docname="download.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||||
|
id="defs8" /><sodipodi:namedview
|
||||||
|
id="namedview6"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="23.833333"
|
||||||
|
inkscape:cx="15.713287"
|
||||||
|
inkscape:cy="13.321678"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1017"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g1334"><inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid825" /></sodipodi:namedview><g
|
||||||
|
id="g1334"><g
|
||||||
|
id="g2200"><g
|
||||||
|
id="g2196"><path
|
||||||
|
fill="none"
|
||||||
|
stroke="#263238"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
d="m 1.5,3.4 v 5.7 l 5,3 5,-3 V 3.4 l -5,-2.9 z m 5,8.7 V 6.2 m -5,-2.8 5,2.8 m 0,0 5,-2.8"
|
||||||
|
id="path2"
|
||||||
|
sodipodi:nodetypes="ccccccccccccc" /></g></g><g
|
||||||
|
id="g2200-2"
|
||||||
|
transform="rotate(90,14.5,14.5)"><g
|
||||||
|
id="g2196-6"><path
|
||||||
|
fill="none"
|
||||||
|
stroke="#263238"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
d="M 16.6,14.5 H 6.5 m 8,3 3,-3 m -3,-3 3,3"
|
||||||
|
id="path2-3"
|
||||||
|
sodipodi:nodetypes="cccccc" /></g></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
@ -196,3 +196,21 @@ export function ShowExportDialog (model, viewer, callbacks)
|
|||||||
let exportDialog = new ExportDialog (callbacks);
|
let exportDialog = new ExportDialog (callbacks);
|
||||||
exportDialog.Open (model, viewer);
|
exportDialog.Open (model, viewer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function DownloadModel (importer)
|
||||||
|
{
|
||||||
|
let fileList = importer.GetFileList ().GetFiles ();
|
||||||
|
if (fileList.length === 0) {
|
||||||
|
return;
|
||||||
|
} else if (fileList.length === 1) {
|
||||||
|
let file = fileList[0];
|
||||||
|
DownloadArrayBufferAsFile (file.content, file.name);
|
||||||
|
} else {
|
||||||
|
let filesInZip = {};
|
||||||
|
for (let file of fileList) {
|
||||||
|
filesInZip[file.name] = new Uint8Array (file.content);
|
||||||
|
}
|
||||||
|
let zippedContent = fflate.zipSync (filesInZip);
|
||||||
|
DownloadArrayBufferAsFile (zippedContent.buffer, 'model.zip');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
export const FeatureSet =
|
export const FeatureSet =
|
||||||
{
|
{
|
||||||
|
DownloadModel : false
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { Sidebar } from './sidebar.js';
|
|||||||
import { ThemeHandler } from './themehandler.js';
|
import { ThemeHandler } from './themehandler.js';
|
||||||
import { ThreeModelLoaderUI } from './threemodelloaderui.js';
|
import { ThreeModelLoaderUI } from './threemodelloaderui.js';
|
||||||
import { Toolbar } from './toolbar.js';
|
import { Toolbar } from './toolbar.js';
|
||||||
import { ShowExportDialog } from './exportdialog.js';
|
import { DownloadModel, ShowExportDialog } from './exportdialog.js';
|
||||||
import { ShowSnapshotDialog } from './snapshotdialog.js';
|
import { ShowSnapshotDialog } from './snapshotdialog.js';
|
||||||
import { AddSmallWidthChangeEventListener, AddSvgIconElement, GetFilesFromDataTransfer, InstallTooltip, IsSmallWidth } from './utils.js';
|
import { AddSmallWidthChangeEventListener, AddSvgIconElement, GetFilesFromDataTransfer, InstallTooltip, IsSmallWidth } from './utils.js';
|
||||||
import { ShowOpenUrlDialog } from './openurldialog.js';
|
import { ShowOpenUrlDialog } from './openurldialog.js';
|
||||||
@ -23,6 +23,7 @@ import { CookieGetBoolVal, CookieSetBoolVal } from './cookiehandler.js';
|
|||||||
import { MeasureTool } from './measuretool.js';
|
import { MeasureTool } from './measuretool.js';
|
||||||
import { CloseAllDialogs } from './dialog.js';
|
import { CloseAllDialogs } from './dialog.js';
|
||||||
import { EnumeratePlugins, PluginType } from './pluginregistry.js';
|
import { EnumeratePlugins, PluginType } from './pluginregistry.js';
|
||||||
|
import { FeatureSet } from './featureset.js';
|
||||||
|
|
||||||
import * as THREE from 'three';
|
import * as THREE from 'three';
|
||||||
|
|
||||||
@ -583,6 +584,12 @@ export class Website
|
|||||||
AddButton (this.toolbar, 'snapshot', 'Create snapshot', ['only_full_width', 'only_on_model'], () => {
|
AddButton (this.toolbar, 'snapshot', 'Create snapshot', ['only_full_width', 'only_on_model'], () => {
|
||||||
ShowSnapshotDialog (this.viewer);
|
ShowSnapshotDialog (this.viewer);
|
||||||
});
|
});
|
||||||
|
if (FeatureSet.DownloadModel) {
|
||||||
|
AddButton (this.toolbar, 'download', 'Download model', ['only_full_width', 'only_on_model'], () => {
|
||||||
|
let importer = this.modelLoaderUI.GetImporter ();
|
||||||
|
DownloadModel (importer);
|
||||||
|
});
|
||||||
|
}
|
||||||
AddButton (this.toolbar, 'export', 'Export model', ['only_full_width', 'only_on_model'], () => {
|
AddButton (this.toolbar, 'export', 'Export model', ['only_full_width', 'only_on_model'], () => {
|
||||||
ShowExportDialog (this.model, this.viewer, {
|
ShowExportDialog (this.model, this.viewer, {
|
||||||
isMeshVisible : (meshInstanceId) => {
|
isMeshVisible : (meshInstanceId) => {
|
||||||
|
|||||||
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: "O3DVIcons";
|
font-family: "O3DVIcons";
|
||||||
src: url("O3DVIcons/O3DVIcons.woff?0e003e02b86912dd45c396f7eaa4349e") format("woff");
|
src: url("O3DVIcons/O3DVIcons.woff?c0e5a84e0c3367514518abbacd6417d6") format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
||||||
@ -47,108 +47,111 @@ i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
|||||||
.icon-donate:before {
|
.icon-donate:before {
|
||||||
content: "\f10b";
|
content: "\f10b";
|
||||||
}
|
}
|
||||||
.icon-expand:before {
|
.icon-download:before {
|
||||||
content: "\f10c";
|
content: "\f10c";
|
||||||
}
|
}
|
||||||
.icon-export:before {
|
.icon-expand:before {
|
||||||
content: "\f10d";
|
content: "\f10d";
|
||||||
}
|
}
|
||||||
.icon-feedback:before {
|
.icon-export:before {
|
||||||
content: "\f10e";
|
content: "\f10e";
|
||||||
}
|
}
|
||||||
.icon-file_download:before {
|
.icon-feedback:before {
|
||||||
content: "\f10f";
|
content: "\f10f";
|
||||||
}
|
}
|
||||||
.icon-files:before {
|
.icon-file_download:before {
|
||||||
content: "\f110";
|
content: "\f110";
|
||||||
}
|
}
|
||||||
.icon-fit:before {
|
.icon-files:before {
|
||||||
content: "\f111";
|
content: "\f111";
|
||||||
}
|
}
|
||||||
.icon-fix_up_off:before {
|
.icon-fit:before {
|
||||||
content: "\f112";
|
content: "\f112";
|
||||||
}
|
}
|
||||||
.icon-fix_up_on:before {
|
.icon-fix_up_off:before {
|
||||||
content: "\f113";
|
content: "\f113";
|
||||||
}
|
}
|
||||||
.icon-flat_list:before {
|
.icon-fix_up_on:before {
|
||||||
content: "\f114";
|
content: "\f114";
|
||||||
}
|
}
|
||||||
.icon-flip:before {
|
.icon-flat_list:before {
|
||||||
content: "\f115";
|
content: "\f115";
|
||||||
}
|
}
|
||||||
.icon-github:before {
|
.icon-flip:before {
|
||||||
content: "\f116";
|
content: "\f116";
|
||||||
}
|
}
|
||||||
.icon-hidden:before {
|
.icon-github:before {
|
||||||
content: "\f117";
|
content: "\f117";
|
||||||
}
|
}
|
||||||
.icon-info:before {
|
.icon-hidden:before {
|
||||||
content: "\f118";
|
content: "\f118";
|
||||||
}
|
}
|
||||||
.icon-isolate:before {
|
.icon-info:before {
|
||||||
content: "\f119";
|
content: "\f119";
|
||||||
}
|
}
|
||||||
.icon-materials:before {
|
.icon-isolate:before {
|
||||||
content: "\f11a";
|
content: "\f11a";
|
||||||
}
|
}
|
||||||
.icon-measure_angle:before {
|
.icon-materials:before {
|
||||||
content: "\f11b";
|
content: "\f11b";
|
||||||
}
|
}
|
||||||
.icon-measure_distance_parallel:before {
|
.icon-measure_angle:before {
|
||||||
content: "\f11c";
|
content: "\f11c";
|
||||||
}
|
}
|
||||||
.icon-measure_distance:before {
|
.icon-measure_distance_parallel:before {
|
||||||
content: "\f11d";
|
content: "\f11d";
|
||||||
}
|
}
|
||||||
.icon-measure:before {
|
.icon-measure_distance:before {
|
||||||
content: "\f11e";
|
content: "\f11e";
|
||||||
}
|
}
|
||||||
.icon-meshes:before {
|
.icon-measure:before {
|
||||||
content: "\f11f";
|
content: "\f11f";
|
||||||
}
|
}
|
||||||
.icon-missing_files:before {
|
.icon-meshes:before {
|
||||||
content: "\f120";
|
content: "\f120";
|
||||||
}
|
}
|
||||||
.icon-model:before {
|
.icon-missing_files:before {
|
||||||
content: "\f121";
|
content: "\f121";
|
||||||
}
|
}
|
||||||
.icon-open_url:before {
|
.icon-model:before {
|
||||||
content: "\f122";
|
content: "\f122";
|
||||||
}
|
}
|
||||||
.icon-open:before {
|
.icon-open_url:before {
|
||||||
content: "\f123";
|
content: "\f123";
|
||||||
}
|
}
|
||||||
.icon-print3d:before {
|
.icon-open:before {
|
||||||
content: "\f124";
|
content: "\f124";
|
||||||
}
|
}
|
||||||
.icon-settings:before {
|
.icon-print3d:before {
|
||||||
content: "\f125";
|
content: "\f125";
|
||||||
}
|
}
|
||||||
.icon-share:before {
|
.icon-settings:before {
|
||||||
content: "\f126";
|
content: "\f126";
|
||||||
}
|
}
|
||||||
.icon-snapshot:before {
|
.icon-share:before {
|
||||||
content: "\f127";
|
content: "\f127";
|
||||||
}
|
}
|
||||||
.icon-tree_mesh:before {
|
.icon-snapshot:before {
|
||||||
content: "\f128";
|
content: "\f128";
|
||||||
}
|
}
|
||||||
.icon-tree_view:before {
|
.icon-tree_mesh:before {
|
||||||
content: "\f129";
|
content: "\f129";
|
||||||
}
|
}
|
||||||
.icon-twitter:before {
|
.icon-tree_view:before {
|
||||||
content: "\f12a";
|
content: "\f12a";
|
||||||
}
|
}
|
||||||
.icon-up_y:before {
|
.icon-twitter:before {
|
||||||
content: "\f12b";
|
content: "\f12b";
|
||||||
}
|
}
|
||||||
.icon-up_z:before {
|
.icon-up_y:before {
|
||||||
content: "\f12c";
|
content: "\f12c";
|
||||||
}
|
}
|
||||||
.icon-visible:before {
|
.icon-up_z:before {
|
||||||
content: "\f12d";
|
content: "\f12d";
|
||||||
}
|
}
|
||||||
.icon-warning:before {
|
.icon-visible:before {
|
||||||
content: "\f12e";
|
content: "\f12e";
|
||||||
}
|
}
|
||||||
|
.icon-warning:before {
|
||||||
|
content: "\f12f";
|
||||||
|
}
|
||||||
|
|||||||
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: "O3DVIcons";
|
font-family: "O3DVIcons";
|
||||||
src: url("./O3DVIcons.woff?0e003e02b86912dd45c396f7eaa4349e") format("woff");
|
src: url("./O3DVIcons.woff?c0e5a84e0c3367514518abbacd6417d6") format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
||||||
@ -47,108 +47,111 @@ i[class^="icon-"]:before, i[class*=" icon-"]:before {
|
|||||||
.icon-donate:before {
|
.icon-donate:before {
|
||||||
content: "\f10b";
|
content: "\f10b";
|
||||||
}
|
}
|
||||||
.icon-expand:before {
|
.icon-download:before {
|
||||||
content: "\f10c";
|
content: "\f10c";
|
||||||
}
|
}
|
||||||
.icon-export:before {
|
.icon-expand:before {
|
||||||
content: "\f10d";
|
content: "\f10d";
|
||||||
}
|
}
|
||||||
.icon-feedback:before {
|
.icon-export:before {
|
||||||
content: "\f10e";
|
content: "\f10e";
|
||||||
}
|
}
|
||||||
.icon-file_download:before {
|
.icon-feedback:before {
|
||||||
content: "\f10f";
|
content: "\f10f";
|
||||||
}
|
}
|
||||||
.icon-files:before {
|
.icon-file_download:before {
|
||||||
content: "\f110";
|
content: "\f110";
|
||||||
}
|
}
|
||||||
.icon-fit:before {
|
.icon-files:before {
|
||||||
content: "\f111";
|
content: "\f111";
|
||||||
}
|
}
|
||||||
.icon-fix_up_off:before {
|
.icon-fit:before {
|
||||||
content: "\f112";
|
content: "\f112";
|
||||||
}
|
}
|
||||||
.icon-fix_up_on:before {
|
.icon-fix_up_off:before {
|
||||||
content: "\f113";
|
content: "\f113";
|
||||||
}
|
}
|
||||||
.icon-flat_list:before {
|
.icon-fix_up_on:before {
|
||||||
content: "\f114";
|
content: "\f114";
|
||||||
}
|
}
|
||||||
.icon-flip:before {
|
.icon-flat_list:before {
|
||||||
content: "\f115";
|
content: "\f115";
|
||||||
}
|
}
|
||||||
.icon-github:before {
|
.icon-flip:before {
|
||||||
content: "\f116";
|
content: "\f116";
|
||||||
}
|
}
|
||||||
.icon-hidden:before {
|
.icon-github:before {
|
||||||
content: "\f117";
|
content: "\f117";
|
||||||
}
|
}
|
||||||
.icon-info:before {
|
.icon-hidden:before {
|
||||||
content: "\f118";
|
content: "\f118";
|
||||||
}
|
}
|
||||||
.icon-isolate:before {
|
.icon-info:before {
|
||||||
content: "\f119";
|
content: "\f119";
|
||||||
}
|
}
|
||||||
.icon-materials:before {
|
.icon-isolate:before {
|
||||||
content: "\f11a";
|
content: "\f11a";
|
||||||
}
|
}
|
||||||
.icon-measure_angle:before {
|
.icon-materials:before {
|
||||||
content: "\f11b";
|
content: "\f11b";
|
||||||
}
|
}
|
||||||
.icon-measure_distance_parallel:before {
|
.icon-measure_angle:before {
|
||||||
content: "\f11c";
|
content: "\f11c";
|
||||||
}
|
}
|
||||||
.icon-measure_distance:before {
|
.icon-measure_distance_parallel:before {
|
||||||
content: "\f11d";
|
content: "\f11d";
|
||||||
}
|
}
|
||||||
.icon-measure:before {
|
.icon-measure_distance:before {
|
||||||
content: "\f11e";
|
content: "\f11e";
|
||||||
}
|
}
|
||||||
.icon-meshes:before {
|
.icon-measure:before {
|
||||||
content: "\f11f";
|
content: "\f11f";
|
||||||
}
|
}
|
||||||
.icon-missing_files:before {
|
.icon-meshes:before {
|
||||||
content: "\f120";
|
content: "\f120";
|
||||||
}
|
}
|
||||||
.icon-model:before {
|
.icon-missing_files:before {
|
||||||
content: "\f121";
|
content: "\f121";
|
||||||
}
|
}
|
||||||
.icon-open_url:before {
|
.icon-model:before {
|
||||||
content: "\f122";
|
content: "\f122";
|
||||||
}
|
}
|
||||||
.icon-open:before {
|
.icon-open_url:before {
|
||||||
content: "\f123";
|
content: "\f123";
|
||||||
}
|
}
|
||||||
.icon-print3d:before {
|
.icon-open:before {
|
||||||
content: "\f124";
|
content: "\f124";
|
||||||
}
|
}
|
||||||
.icon-settings:before {
|
.icon-print3d:before {
|
||||||
content: "\f125";
|
content: "\f125";
|
||||||
}
|
}
|
||||||
.icon-share:before {
|
.icon-settings:before {
|
||||||
content: "\f126";
|
content: "\f126";
|
||||||
}
|
}
|
||||||
.icon-snapshot:before {
|
.icon-share:before {
|
||||||
content: "\f127";
|
content: "\f127";
|
||||||
}
|
}
|
||||||
.icon-tree_mesh:before {
|
.icon-snapshot:before {
|
||||||
content: "\f128";
|
content: "\f128";
|
||||||
}
|
}
|
||||||
.icon-tree_view:before {
|
.icon-tree_mesh:before {
|
||||||
content: "\f129";
|
content: "\f129";
|
||||||
}
|
}
|
||||||
.icon-twitter:before {
|
.icon-tree_view:before {
|
||||||
content: "\f12a";
|
content: "\f12a";
|
||||||
}
|
}
|
||||||
.icon-up_y:before {
|
.icon-twitter:before {
|
||||||
content: "\f12b";
|
content: "\f12b";
|
||||||
}
|
}
|
||||||
.icon-up_z:before {
|
.icon-up_y:before {
|
||||||
content: "\f12c";
|
content: "\f12c";
|
||||||
}
|
}
|
||||||
.icon-visible:before {
|
.icon-up_z:before {
|
||||||
content: "\f12d";
|
content: "\f12d";
|
||||||
}
|
}
|
||||||
.icon-warning:before {
|
.icon-visible:before {
|
||||||
content: "\f12e";
|
content: "\f12e";
|
||||||
}
|
}
|
||||||
|
.icon-warning:before {
|
||||||
|
content: "\f12f";
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user