From 4647781b9374d85c514bcd40ae9b54e9d1641565 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Mon, 6 Jan 2025 01:07:30 +0530 Subject: [PATCH 1/8] Add UI tests for the suggestion panel (#660) * Add test for suggestions panel * successfully getting right panel button * can select correct ok * Almost done * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add test for delete suggestion * Cleanup * test delete suggestion before accepting suggestion * Update Playwright Snapshots * Update Playwright Snapshots --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] --- .../dark-Notebook-ipynb-cell-1-linux.png | Bin 1802 -> 1754 bytes ui-tests/tests/ui.spec.ts | 82 ++++++++++++++++++ .../JCAD-Accept-Suggestion-linux.png | Bin 0 -> 41852 bytes .../JCAD-Delete-Suggestion-linux.png | Bin 0 -> 29873 bytes 4 files changed, 82 insertions(+) create mode 100644 ui-tests/tests/ui.spec.ts-snapshots/JCAD-Accept-Suggestion-linux.png create mode 100644 ui-tests/tests/ui.spec.ts-snapshots/JCAD-Delete-Suggestion-linux.png diff --git a/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-1-linux.png b/ui-tests/tests/notebook.spec.ts-snapshots/dark-Notebook-ipynb-cell-1-linux.png index 49c7cb29ba67a85fcf134df5acc6079718b3c8fb..036baff4170956ba19f88f090ab11774a82e316d 100644 GIT binary patch delta 1749 zcmV;`1}gcA4%!Wn8Gix*000#7xrP7$00DDSM?wIu&K&6g00xvvL_t(|+U=aZZ=6UN zhx0FNqBwJjFPtOgc2CI>T^z9|CloGFQgDT}mJXKpsc0f0 zxuBz@qokXXj*^>!HT%VSvAthD{T{inSia_EHP5^=FZ-Yc0Dk}gfSu<7LI3~&06^FP z0001humJ!700oc(BA#Czv9~C0cyazo`hNEQ^2^c1r&ph!Kb$(?@h{)LtVh_%P@R_z={d>V z2koBiMM+vHKK3nT1CEkSH(-~{^E@6Xb07BO)YI>J7ex2cs4q`$k@SHdQ)U9*&|s*G zJ1FeyBGb0QEHLjXvD)tdk+dQ<{7aBTt|2WsiC_jUeGJxL&fr0BM(ZbI0)Z5f*3 z#M$PAEi(lqo~ek02%@4{mM-n0u&;^C+Jr5zoR-DLQbmEZCDpKvWh%aruvODGwVoYh z5HShEb`pdr5PL86oJ&;Bn=zctv)hD)=W*l zbIw2W9VjDEGZ3g3_RTZw>x4abGY~caV1N6<-rIli@2PbDa=I98!&Bn(eX^J4;e3M4 zyUTHZ%=Ho3(p82%+D_DAGU|c(=45cyoAVDErN|3}y*Apa<@n`lJq=y6v^f{a_-=~^ z7ER^4sYT^0Hea%2QP(3n^0W`wNl9W z-L$Z)=CxJROGZs9ro^i(S*V)2U_zMf&2&F*DNU)XkA)o%1}RH*yACIP>DpCZR!GH z^VtKx{$;uLyu_-^e5WI`cnzCYGX`xdm=d-zH#mW?0RZ=0*dtrNdGhSh!#(!bOxQ)y z*>9^aI;%4m(=H9{qDov;blWHnE7!2~nlea7HPJdmO5P_c{ z9;gEQzlp?*q3hbWu3;yNHMIHqHM^Xs6d86giC^TGtbMA`BBJhAO>b`4o5 zQgxXxl#_+RZnbrf@)~@x42-Iq+Ojq5jYo#Rc;$|�kGi!_up#9hX6pnA7tKVHXPq zzR^&qgty5k2S%h>n;>iez<+ffOUYtnhorg>J{p0ZM z#YxvYd;9m(72gHXUDnUiBys;gzjVfzgQ=^nyggheiK7xkW>+BEFm7B20RVuo!HywX zK^j=n>Q8*{g}t`O08Rh^gbj8npS$-NHUI!X*Z=?k0D!Oo00000VFLgF01!3+0000W rYybcN06^FP0001l4FCWDfEDo{ZL;7&P_AG=00000NkvXXu0mjfm3dE7 delta 1797 zcmV+g2m1Kh4T=ts8Gi!+0068`-s1oO00DDSM?wIu&K&6g00OvBOjJb?5D*a&5fTy- z6A=*;6B85^6crT}784Q{78Vy57Z?~A85tQG8X6lL8yp-Q9UUDW9v&YbA0QwgAt50m zA|fLrBP1jwB^eeaB_$>%CMOyeCnqN;C@3i#7AYwyDjOFo8-Euo92YAqD=i!tEiElC zFE21KFflPPGBPqVGczD7ejYThwjg5~+FprOqk&%&-l9H2?la-Z~mX?;6mzSBDnVOoKoJ=&FoSdGX zo}W!MpP!$gprE0lp`%YVrKP2&P&TNjsHssmsi~=|Q8%hmH>#?tt5P?stE;W8t*)-F zuT(g(Rew3Lv9YpMIkU5~v{pK_w6wLgwYFC}x3{;sxw*Q!y1ZFDy}iA^TRp$Ozreu2 z!NI}8!otJD!^OqL$H&LX$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($v({)z#J4 z*VowC*xK6K+uPgR+}z#W-QM2b-{0Th;Naom;eX=d;^X7vlt)=I7_<=;-L_ z>FMg~>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?# z`uqF){QUg={r&#_{{R2~i4Azh000C4Nklo(U3@-r&L1Hin5`!Qy7zBwykQfYt#2`ov20>yFq$a~}#(VRc z3r?jt)!o_et8{il4cq6vF)!LUsVWHR7=H!iadz8t+oda8JF!QWdO_w_AG{gJZtdd~ zp3?%h1wVR!ID~hw_pZCZB zkO9>ICGU>hdp45=8K#ggX2sFU^sZ!|y#0JZ;aKQ={ex@+=%}t2WXsBc8s>}#WaTrm z{Hy$K5(H^tAZMIu!~?nUnm&*VTYr+x&TMrfq`=Mk^lbw2NmJ3?2!OL`t!yqI)|+U|}$U(C@P|_*6w&2bEaCsyCig_;V2fsTc*e&f=Fltz7dK>Zsmh zqVDS4SS3u0S|ER(A!|T#-4UemL3X-0$na-KE=SVU`#S_gFLJ{($ix+s0DpE&KY)Qs z9c1*!>uk}dJz|iQn*(I71|Jm#Vx|i`T?=4d(w~5gV|)23h|RDhq16|C0|P;7f*_3x z(&^-Q5C}5rnR-tz1ER1mWCR05CxR!FL({nm8=)XslX;P3$tDLkqO^2AzNTqfK8b+j zima(1&4M(cAV)LJ5#;{_vVZ-l2_O`tMCDL>hE#*JV;p}z&rp!CE0I(c17rtl={(ge z&&d(o44DJJQ{BG8pWBZtW`8^cq=@N?AWau!$1_tbEiL(P*((p#3lcJKx!X<~0HN$N zBw4et%+BiyXK3c|_LUbKbZ7k?Km$lw;r39kWe^}|FyZ;ze;R{AWa42@)S0`4SuOnr_G7t z@`oNk#k?-Q?otENHdb1i6VAJ}49Pm)dHX6Yey#1ABv(ndQy`J;F3I)dEv}(2O5Y}k zG$5hNRk<=tBD6YCTYhA!y!im@WvL+?$Uxa!-fQ_}wu%x#8Xx443&%$Ansbj`Y+HBd zsdC!?FN`SjfSxZU(tlaq(2SuA1Cfp~KpG)-%69({r2gs{1Sv3oJVRm-BnE>ZF$fZa nL68^(iNPR941&a98a_V&Q#s0^TJO5700000NkvXXu0mjf#{fwZ diff --git a/ui-tests/tests/ui.spec.ts b/ui-tests/tests/ui.spec.ts index 476b60c3..11f2ee02 100644 --- a/ui-tests/tests/ui.spec.ts +++ b/ui-tests/tests/ui.spec.ts @@ -382,4 +382,86 @@ test.describe('UI Test', () => { } }); }); + + test.describe('Suggestion Panel test', () => { + test(`Test Delete Suggestion`, async ({ page }) => { + await page.goto(); + + const fileName = 'test.jcad'; + const fullPath = `examples/${fileName}`; + await page.notebook.openByPath(fullPath); + await page.notebook.activate(fullPath); + await page.locator('div.jpcad-Spinner').waitFor({ state: 'hidden' }); + + // Activate Right Panel + await page.locator('li#tab-key-1-7').click(); + await page.getByTitle('Create new fork').click(); + await page.locator('div.jp-Dialog-buttonLabel[aria-label="Ok"]').click(); + + // Select cone + await page + .locator('[data-test-id="react-tree-root"]') + .getByText('Cone 1') + .click(); + + await page.locator('input#root_Height').click(); + await page.locator('input#root_Height').fill('20'); + + await page + .locator('div.jp-Dialog-buttonLabel', { + hasText: 'Submit' + }) + .click(); + + await page.getByTitle('Delete suggestion').click(); + await page.locator('div.jp-Dialog-buttonLabel[aria-label="Ok"]').click(); + + let main = await page.$('#jp-main-split-panel'); + if (main) { + expect(await main.screenshot()).toMatchSnapshot({ + name: `JCAD-Delete-Suggestion.png` + }); + } + }); + + test(`Test Accept Suggestion`, async ({ page }) => { + await page.goto(); + + const fileName = 'test.jcad'; + const fullPath = `examples/${fileName}`; + await page.notebook.openByPath(fullPath); + await page.notebook.activate(fullPath); + await page.locator('div.jpcad-Spinner').waitFor({ state: 'hidden' }); + + // Activate Right Panel + await page.locator('li#tab-key-1-7').click(); + await page.getByTitle('Create new fork').click(); + await page.locator('div.jp-Dialog-buttonLabel[aria-label="Ok"]').click(); + + // Select cone + await page + .locator('[data-test-id="react-tree-root"]') + .getByText('Cone 1') + .click(); + + await page.locator('input#root_Height').click(); + await page.locator('input#root_Height').fill('20'); + + await page + .locator('div.jp-Dialog-buttonLabel', { + hasText: 'Submit' + }) + .click(); + + await page.getByTitle('Accept suggestion').click(); + await page.locator('div.jp-Dialog-buttonLabel[aria-label="Ok"]').click(); + + let main = await page.$('#jp-main-split-panel'); + if (main) { + expect(await main.screenshot()).toMatchSnapshot({ + name: `JCAD-Accept-Suggestion.png` + }); + } + }); + }); }); diff --git a/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Accept-Suggestion-linux.png b/ui-tests/tests/ui.spec.ts-snapshots/JCAD-Accept-Suggestion-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d32f6abde3c800b26b4a14bdb09d852cac7fd30b GIT binary patch literal 41852 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
iK3VIgN_yF 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

-I;P?s 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 literal 0 HcmV?d00001 From 4dfec97f9eb62f4de80a9386eaadc3d502610a04 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Mon, 6 Jan 2025 14:04:08 +0530 Subject: [PATCH 2/8] Avoid applying wireframe to selected edges (#655) --- packages/base/src/3dview/mainview.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx index 0f1d471d..b9cdee27 100644 --- a/packages/base/src/3dview/mainview.tsx +++ b/packages/base/src/3dview/mainview.tsx @@ -1237,6 +1237,7 @@ export class MainView extends React.Component { if (material?.linewidth) { material.linewidth = SELECTED_LINEWIDTH; } + selectedMesh.material.wireframe = false; } else { // Highlight non-edges using a bounding box const parentGroup = this._meshGroup?.getObjectByName(selectedMesh.name) From 4b6c7760472477ff16ae9c509632f2fd6baa6f7b Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Mon, 6 Jan 2025 14:04:43 +0530 Subject: [PATCH 3/8] Keep pasted object always visible (#656) --- packages/base/src/commands.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/base/src/commands.ts b/packages/base/src/commands.ts index e98f8c26..4301e932 100644 --- a/packages/base/src/commands.ts +++ b/packages/base/src/commands.ts @@ -1237,7 +1237,11 @@ export function addCommands( counter++; } const jcadModel = current.context.model; - const newObject = { ...clipboard, name: newName }; + const newObject = { + ...clipboard, + name: newName, + visible: true + }; sharedModel.addObject(newObject); jcadModel.syncSelected({ [newObject.name]: { type: 'shape' } }, uuid()); } From 7dd07e03f0eb9a12de94dc57e2c16f9729419df0 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Mon, 6 Jan 2025 14:05:55 +0530 Subject: [PATCH 4/8] Bump `jupyter-collaboration` to `3.1.0` (#657) --- packages/base/package.json | 2 +- python/jupytercad_core/pyproject.toml | 2 +- yarn.lock | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/base/package.json b/packages/base/package.json index 45f753be..b8753cf2 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -35,7 +35,7 @@ "watch": "tsc -w" }, "dependencies": { - "@jupyter/collaborative-drive": "^3.1.0-alpha.0", + "@jupyter/collaborative-drive": "^3.1.0", "@jupyter/ydoc": "^3.0.0", "@jupytercad/occ-worker": "^3.0.0", "@jupytercad/schema": "^3.0.0", diff --git a/python/jupytercad_core/pyproject.toml b/python/jupytercad_core/pyproject.toml index e7456c25..035b7971 100644 --- a/python/jupytercad_core/pyproject.toml +++ b/python/jupytercad_core/pyproject.toml @@ -21,7 +21,7 @@ classifiers = [ dependencies = [ "jupyter_server>=2.0.6,<3", "jupyter_ydoc>=2,<4", - "jupyter-collaboration>=3.0.0,<4", + "jupyter-collaboration>=3.1.0,<4", "pydantic>=2,<3", ] dynamic = ["version", "description", "authors", "urls", "keywords"] diff --git a/yarn.lock b/yarn.lock index 7ac58c5b..9dc2be4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -691,6 +691,18 @@ __metadata: languageName: node linkType: hard +"@jupyter/collaborative-drive@npm:^3.1.0": + version: 3.1.0 + resolution: "@jupyter/collaborative-drive@npm:3.1.0" + dependencies: + "@jupyter/ydoc": ^2.0.0 || ^3.0.0 + "@jupyterlab/services": ^7.2.0 + "@lumino/coreutils": ^2.1.0 + "@lumino/disposable": ^2.1.0 + checksum: ef4288ccc6dc4b353d53c014b2caa87d29e5af64c1649175b6ff75127297953139f79f8774c22ab0e249cc5fcef36dc6503a6c3862e160205bf6a55b368e6ac8 + languageName: node + linkType: hard + "@jupyter/collaborative-drive@npm:^3.1.0-alpha.0, @jupyter/collaborative-drive@npm:^3.1.0-rc.0": version: 3.1.0-rc.0 resolution: "@jupyter/collaborative-drive@npm:3.1.0-rc.0" @@ -767,7 +779,7 @@ __metadata: resolution: "@jupytercad/base@workspace:packages/base" dependencies: "@apidevtools/json-schema-ref-parser": ^9.0.9 - "@jupyter/collaborative-drive": ^3.1.0-alpha.0 + "@jupyter/collaborative-drive": ^3.1.0 "@jupyter/ydoc": ^3.0.0 "@jupytercad/occ-worker": ^3.0.0 "@jupytercad/schema": ^3.0.0 From 3210ee691cb8ff6d91e9af81b188aa18433fee10 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Mon, 6 Jan 2025 16:01:21 +0530 Subject: [PATCH 5/8] Fuse multiple objects at once (#659) * Consider multiple selection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Can fuse multiple objects now * cleanup --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- packages/base/src/commands.ts | 16 +++++++++----- packages/occ-worker/src/occapi/fuse.ts | 30 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/base/src/commands.ts b/packages/base/src/commands.ts index 4301e932..74abc533 100644 --- a/packages/base/src/commands.ts +++ b/packages/base/src/commands.ts @@ -345,13 +345,19 @@ const OPERATORS = { default: (model: IJupyterCadModel) => { const objects = model.getAllObject(); const selected = model.localState?.selected.value || {}; - const sel0 = getSelectedMeshName(selected, 0); - const sel1 = getSelectedMeshName(selected, 1); - const baseName = sel0 || objects[0].name || ''; - const baseModel = model.sharedModel.getObjectByName(baseName); + + const selectedShapes = Object.keys(selected).map(key => key); + + // Fallback to at least two objects if selection is empty + const baseShapes = + selectedShapes.length > 0 + ? selectedShapes + : [objects[0].name || '', objects[1].name || '']; + + const baseModel = model.sharedModel.getObjectByName(baseShapes[0]); return { Name: newName('Union', model), - Shapes: [baseName, sel1 || objects[1].name || ''], + Shapes: baseShapes, Refine: false, Color: baseModel?.parameters?.Color || DEFAULT_MESH_COLOR, Placement: { Position: [0, 0, 0], Axis: [0, 0, 1], Angle: 0 } diff --git a/packages/occ-worker/src/occapi/fuse.ts b/packages/occ-worker/src/occapi/fuse.ts index dc4f6d42..62387b01 100644 --- a/packages/occ-worker/src/occapi/fuse.ts +++ b/packages/occ-worker/src/occapi/fuse.ts @@ -30,13 +30,27 @@ export function _Fuse( } } }); - const operator = new oc.BRepAlgoAPI_Fuse_3( - occShapes[0], - occShapes[1], - new oc.Message_ProgressRange_1() - ); - if (operator.IsDone()) { - return setShapePlacement(operator.Shape(), Placement); + + if (occShapes.length === 0) { + return; + } + + let fusedShape = occShapes[0]; + + for (let i = 1; i < occShapes.length; i++) { + const operator = new oc.BRepAlgoAPI_Fuse_3( + fusedShape, + occShapes[i], + new oc.Message_ProgressRange_1() + ); + + if (operator.IsDone()) { + fusedShape = operator.Shape(); + } else { + console.error(`Fusion failed at index ${i}`); + return; + } } - return; + + return setShapePlacement(fusedShape, Placement); } From 3ae5463dee1310c583fde699b38833d21dedc995 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 22:34:23 +0530 Subject: [PATCH 6/8] [pre-commit.ci] pre-commit autoupdate (#662) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.1 → v0.8.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.1...v0.8.6) - [github.com/pre-commit/mirrors-eslint: v9.16.0 → v9.17.0](https://github.com/pre-commit/mirrors-eslint/compare/v9.16.0...v9.17.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index edc27149..f3085e7b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: - id: black - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.1 + rev: v0.8.6 hooks: - id: ruff args: ['--fix'] @@ -44,7 +44,7 @@ repos: entry: prettier --no-error-on-unmatched-pattern --write --ignore-unknown - repo: https://github.com/pre-commit/mirrors-eslint - rev: v9.16.0 + rev: v9.17.0 hooks: - id: eslint files: \.tsx?$ From d45a0bf4b6a0ea92562af13432010c293f7a6627 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Tue, 7 Jan 2025 20:22:16 +0530 Subject: [PATCH 7/8] Add documentation badge (#663) * Add documentation badge * Add uniform documentation badge w.r.t JGIS --- python/jupytercad/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/python/jupytercad/README.md b/python/jupytercad/README.md index 8f4816cb..306e2de2 100644 --- a/python/jupytercad/README.md +++ b/python/jupytercad/README.md @@ -1,6 +1,11 @@ # JupyterCAD - A JupyterLab extension for collaborative 3D geometry modeling. -[![Lite](https://jupyterlite.rtfd.io/en/latest/_static/badge.svg)](https://jupytercad.github.io/JupyterCAD/) +[![lite-badge]][lite] [![docs-badge]][docs] + +[lite-badge]: https://jupyterlite.rtfd.io/en/latest/_static/badge.svg +[lite]: https://jupytercad.github.io/JupyterCAD/ +[docs-badge]: https://readthedocs.org/projects/jupytergis/badge/?version=latest +[docs]: https://jupytercad.readthedocs.io/ JupyterCAD is a JupyterLab extension for 3D geometry modeling with collaborative editing support. It is designed to allow multiple people to work on the same file at the same time, and to facilitate discussion and collaboration around the 3D shapes being created. From 8bd935f7e2838b7e4a0fd1e08a483870881c3153 Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Wed, 8 Jan 2025 01:37:28 +0530 Subject: [PATCH 8/8] Enable Rotation Snap by default and make it customisable (#661) * rotation snap * set snap with input * snappy * Update packages/base/src/3dview/mainview.tsx Co-authored-by: Duc Trung Le * method name change * Prevent using change event of transform controls * No need of ctrl event listeners * Also remove eventlistener when the component is unmounted --------- Co-authored-by: Duc Trung Le --- packages/base/src/3dview/mainview.tsx | 54 ++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx index b9cdee27..32656d2d 100644 --- a/packages/base/src/3dview/mainview.tsx +++ b/packages/base/src/3dview/mainview.tsx @@ -77,6 +77,8 @@ interface IStates { wireframe: boolean; transform: boolean; clipEnabled: boolean; + rotationSnapValue: number; + transformMode: string | undefined; } interface ILineIntersection extends THREE.Intersection { @@ -121,7 +123,9 @@ export class MainView extends React.Component { firstLoad: true, wireframe: false, transform: false, - clipEnabled: true + clipEnabled: true, + rotationSnapValue: 10, + transformMode: 'translate' }; } @@ -138,10 +142,27 @@ export class MainView extends React.Component { this.lookAtPosition(customEvent.detail.objPosition); } }); + this._transformControls.rotationSnap = THREE.MathUtils.degToRad( + this.state.rotationSnapValue + ); + this._keyDownHandler = (event: KeyboardEvent) => { + if (event.key === 'r') { + const newMode = this._transformControls.mode || 'translate'; + if (this.state.transformMode !== newMode) { + this.setState({ transformMode: newMode }); + } + } + }; + document.addEventListener('keydown', this._keyDownHandler); } componentDidUpdate(oldProps: IProps, oldState: IStates): void { this.resizeCanvasToDisplaySize(); + if (oldState.rotationSnapValue !== this.state.rotationSnapValue) { + this._transformControls.rotationSnap = THREE.MathUtils.degToRad( + this.state.rotationSnapValue + ); + } } componentWillUnmount(): void { @@ -171,6 +192,8 @@ export class MainView extends React.Component { this._mainViewModel.renderSignal.disconnect(this._requestRender, this); this._mainViewModel.workerBusy.disconnect(this._workerBusyHandler, this); this._mainViewModel.dispose(); + + document.removeEventListener('keydown', this._keyDownHandler); } addContextMenu = (): void => { @@ -1837,6 +1860,14 @@ export class MainView extends React.Component { }); return screenPosition; } + + private _handleSnapChange = (e: React.ChangeEvent) => { + const value = parseFloat(e.target.value); + if (!isNaN(value) && value > 0) { + this.setState({ rotationSnapValue: value }); + } + }; + render(): JSX.Element { const isTransformOrClipEnabled = this.state.transform || this._clipSettings.enabled; @@ -1898,7 +1929,25 @@ export class MainView extends React.Component { fontSize: '12px' }} > - Press R to switch mode +

Press R to switch mode
+ + {this.state.transformMode === 'rotate' && ( +
+ + +
+ )} )}
{ private _sliderPos = 0; private _slideInit = false; private _sceneL: THREE.Scene | undefined = undefined; + private _keyDownHandler: (event: KeyboardEvent) => void; }