From 9d28160bf49acb0010f2f49ebd62f624ae2d35c2 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Thu, 21 Feb 2019 02:08:52 -0800 Subject: [PATCH] adding some icons for datum operations --- web/app/cad/actions/coreActions.js | 10 ++++++++ .../datum/create/createDatumOperation.js | 2 +- .../datum/rotate/rotateDatumOperation.js | 2 +- web/app/cad/exportPlugin.js | 23 +++++++++++++++++- web/app/cad/keyboard/keymaps/default.js | 1 + web/app/cad/part/menuConfig.js | 2 +- web/app/cad/part/uiConfigPlugin.js | 2 +- web/img/cad/datum-rotate32.png | Bin 0 -> 3107 bytes web/img/cad/datum-rotate96.png | Bin 0 -> 9910 bytes web/img/cad/datum32.png | Bin 0 -> 2502 bytes web/img/cad/datum96.png | Bin 0 -> 6924 bytes 11 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 web/img/cad/datum-rotate32.png create mode 100644 web/img/cad/datum-rotate96.png create mode 100644 web/img/cad/datum32.png create mode 100644 web/img/cad/datum96.png diff --git a/web/app/cad/actions/coreActions.js b/web/app/cad/actions/coreActions.js index dedfac07..30d71e41 100644 --- a/web/app/cad/actions/coreActions.js +++ b/web/app/cad/actions/coreActions.js @@ -46,6 +46,16 @@ export default [ }, invoke: (context) => context.services.export.stlAscii() }, + + { + id: 'ImagePngExport', + appearance: { + cssIcons: ['image'], + label: 'PNG Export', + info: 'export model as png image/render a snapshot', + }, + invoke: (context) => context.services.export.imagePng() + }, { diff --git a/web/app/cad/craft/datum/create/createDatumOperation.js b/web/app/cad/craft/datum/create/createDatumOperation.js index ff1e46f4..62f937ad 100644 --- a/web/app/cad/craft/datum/create/createDatumOperation.js +++ b/web/app/cad/craft/datum/create/createDatumOperation.js @@ -76,7 +76,7 @@ function previewer(ctx, initialParams, updateParams) { export default { id: 'DATUM_CREATE', label: 'Create Datum', - icon: 'img/cad/plane', + icon: 'img/cad/datum', info: 'originates a new datum from origin or off of a selected face', paramsInfoComponent: DatumParamsRenderer, paramsInfo: pointAsText, diff --git a/web/app/cad/craft/datum/rotate/rotateDatumOperation.js b/web/app/cad/craft/datum/rotate/rotateDatumOperation.js index f35bfba7..7187c0c4 100644 --- a/web/app/cad/craft/datum/rotate/rotateDatumOperation.js +++ b/web/app/cad/craft/datum/rotate/rotateDatumOperation.js @@ -66,7 +66,7 @@ function applyRotation(origCsys, csys, angle, axis) { export default { id: 'DATUM_ROTATE', label: 'Rotate Datum', - icon: 'img/cad/plane', + icon: 'img/cad/datum-rotate', info: 'rotates a datum', paramsInfo: ({axis, angle}) => `${axis} - ${angle}`, previewer, diff --git a/web/app/cad/exportPlugin.js b/web/app/cad/exportPlugin.js index 0e8e077e..e897e655 100644 --- a/web/app/cad/exportPlugin.js +++ b/web/app/cad/exportPlugin.js @@ -9,7 +9,28 @@ export function activate(ctx) { exportTextData(result, ctx.services.project.id + ".stl"); } + function imagePng() { + let auxVisible = ctx.services.cadScene.auxGroup.visible; + ctx.services.cadScene.auxGroup.visible = false; + let renderer = ctx.services.viewer.sceneSetup.renderer; + let clearAlpha = renderer.getClearAlpha(); + renderer.setClearAlpha(0); + renderer.preserveDrawingBuffer = true; + ctx.services.viewer.sceneSetup.render(); + + let link = document.getElementById("downloader"); + link.href = renderer.domElement.toDataURL('image/png'); + link.download = ctx.services.project.id + "-snapshot.png"; + link.click(); + + renderer.preserveDrawingBuffer = false; + ctx.services.cadScene.auxGroup.visible = auxVisible; + renderer.setClearAlpha(0); + renderer.setClearAlpha(clearAlpha); + ctx.services.viewer.sceneSetup.render(); + } + ctx.services.export = { - stlAscii + stlAscii, imagePng }; } \ No newline at end of file diff --git a/web/app/cad/keyboard/keymaps/default.js b/web/app/cad/keyboard/keymaps/default.js index 865bd692..059dfbd5 100644 --- a/web/app/cad/keyboard/keymaps/default.js +++ b/web/app/cad/keyboard/keymaps/default.js @@ -24,6 +24,7 @@ export default { 'menu.primitives': 'shift+a', 'menu.main': 'space', 'Save': 'ctrl+s', + 'ImagePngExport': 'shift+3', 'Info': 'F1', 'DebugOpenBrepDebugger': 'ctrl+b' }; diff --git a/web/app/cad/part/menuConfig.js b/web/app/cad/part/menuConfig.js index dbcfa5f7..ab420d3f 100644 --- a/web/app/cad/part/menuConfig.js +++ b/web/app/cad/part/menuConfig.js @@ -2,7 +2,7 @@ export default [ { id: 'file', cssIcons: ['file'], - actions: ['Save', 'StlExport', '-', 'IMPORT_STL', '-', 'ReassignSketch'] + actions: ['Save', 'StlExport', 'ImagePngExport', '-', 'IMPORT_STL', '-', 'ReassignSketch'] }, { id: 'craft', diff --git a/web/app/cad/part/uiConfigPlugin.js b/web/app/cad/part/uiConfigPlugin.js index 9602ea91..b04b5f23 100644 --- a/web/app/cad/part/uiConfigPlugin.js +++ b/web/app/cad/part/uiConfigPlugin.js @@ -16,7 +16,7 @@ export function activate({services, streams}) { ['ShowSketches', {label: 'sketches'}], ['DeselectAll', {label: null}], ['ToggleCameraMode', {label: null}] ]; - streams.ui.toolbars.headsUp.value = ['PLANE', 'EditFace', 'EXTRUDE', 'CUT', 'REVOLVE', '-', 'FILLET', '-', 'INTERSECTION', 'SUBTRACT', 'UNION']; + streams.ui.toolbars.headsUp.value = ['DATUM_CREATE', 'PLANE', 'EditFace', 'EXTRUDE', 'CUT', 'REVOLVE', '-', 'FILLET', '-', 'INTERSECTION', 'SUBTRACT', 'UNION']; streams.ui.toolbars.headsUpQuickActions.value = ['Save', 'StlExport']; services.action.registerActions(CoreActions); diff --git a/web/img/cad/datum-rotate32.png b/web/img/cad/datum-rotate32.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6f2302f37f83b20b827d879fe6f900d813586a GIT binary patch literal 3107 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 xoEj|xl^_QlqxkbOHwLsnY6Mb^iT|np>R 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 literal 0 HcmV?d00001 diff --git a/web/img/cad/datum32.png b/web/img/cad/datum32.png new file mode 100644 index 0000000000000000000000000000000000000000..89b8e55a4a4ba2b8b6cbf6a1c39b5d29b35d298f GIT binary patch literal 2502 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 literal 0 HcmV?d00001