diff --git a/assets/ocad.pgp b/assets/ocad.pgp index bde60d84f..78aa32244 100644 --- a/assets/ocad.pgp +++ b/assets/ocad.pgp @@ -155,6 +155,7 @@ SHA, *SHADEMODE COL, *COLOR DR, *DRAWORDER DS, *DSETTINGS +DV, *DVIEW LT, *LINETYPE LTS, *LTSCALE OS, *OSNAP diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index 6cf05bb03..f01c22786 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -4459,6 +4459,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = تجميد | T = إلغاء التجميد | Enter = خروج view = + .twist-option = لف + .dview-specify-view-twist-angle = DVIEW حدد زاوية لف العرض <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW أدخل خيارًا [TWist/Undo]: .color-scheme-set-to-system-currently-name = تم تعيين نظام الألوان على "النظام" (حاليًا __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = يتطلب عددًا صحيحًا بين __ocs_fmt_0__ و __ocs_fmt_1__. diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index f7798179b..509be26cc 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <слой> = Замрази | T <слой> = Размрази | Enter = Изход view = + .twist-option = Завъртане + .dview-specify-view-twist-angle = DVIEW Задайте ъгъл на завъртане на изгледа <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Въведете опция [TWist/Undo]: .color-scheme-set-to-system-currently-name = Цветовата схема е зададена на „Системна“ (в момента __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Изисква се цяло число между __ocs_fmt_0__ и __ocs_fmt_1__. diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index 3661065e4..11f3c6a68 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -4444,6 +4444,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Zmrazit | T = Rozmrazit | Enter = Konec view = + .twist-option = Natočení + .dview-specify-view-twist-angle = DVIEW Zadejte úhel natočení pohledu <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Zadejte možnost [TWist/Undo]: .color-scheme-set-to-system-currently-name = Barevné schéma nastaveno na „Systém“ (aktuálně __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Vyžaduje celé číslo mezi __ocs_fmt_0__ a __ocs_fmt_1__. diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index cd0cb13ae..ac0531932 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -4445,6 +4445,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Einfrieren | T = Auftauen | Eingabe = Beenden view = + .twist-option = Verdrehen + .dview-specify-view-twist-angle = DVIEW Ansichtsverdrehwinkel angeben <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Option eingeben [TWist/Undo]: .color-scheme-set-to-system-currently-name = Farbschema auf „System“ eingestellt (derzeit __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Erfordert eine ganze Zahl zwischen __ocs_fmt_0__ und __ocs_fmt_1__. diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index 46e9d4d71..1c2f0d3c2 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -4447,6 +4447,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <επίπεδο> = Πάγωμα | T <επίπεδο> = Ξεπάγωμα | Enter = Έξοδος view = + .twist-option = Στρέψη + .dview-specify-view-twist-angle = DVIEW Καθορίστε γωνία στρέψης όψης <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Εισαγάγετε επιλογή [TWist/Undo]: .color-scheme-set-to-system-currently-name = Ο χρωματικός συνδυασμός ρυθμίστηκε σε „Σύστημα“ (αυτή τη στιγμή __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Απαιτείται ακέραιος αριθμός μεταξύ __ocs_fmt_0__ και __ocs_fmt_1__. diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index bbb98097d..7129bf9ba 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Freeze | T = Thaw | Enter = Exit view = + .twist-option = TWist + .dview-specify-view-twist-angle = DVIEW Specify view twist angle <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Enter option [TWist/Undo]: .color-scheme-set-to-system-currently-name = Color scheme set to 'System' (currently __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Requires an integer between __ocs_fmt_0__ and __ocs_fmt_1__. diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index 554d1c5ad..558fcf07a 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -4447,6 +4447,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Inutilizar | T = Reutilizar | Intro = Salir view = + .twist-option = Girar + .dview-specify-view-twist-angle = DVIEW Precise el ángulo de giro de la vista <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Indique una opción [TWist/Undo]: .color-scheme-set-to-system-currently-name = Esquema de color establecido en «Sistema» (actualmente __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Requiere un número entero entre __ocs_fmt_0__ y __ocs_fmt_1__. diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index 375a601ca..389c34957 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Jäädytys | T = Sulatus | Enter = Poistu view = + .twist-option = Kierto + .dview-specify-view-twist-angle = DVIEW Määritä näkymän kiertokulma <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Anna valinta [TWist/Undo]: .color-scheme-set-to-system-currently-name = Väriteema asetettu arvoon "Järjestelmä" (tällä hetkellä __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Vaatii kokonaisluvun väliltä __ocs_fmt_0__–__ocs_fmt_1__. diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index 28ae934ca..52be9d1a1 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -4448,6 +4448,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Freeze , T = Thaw , Entrée = Sortie view = + .twist-option = Rotation + .dview-specify-view-twist-angle = DVIEW Spécifiez l’angle de rotation de la vue <__ocs_fmt_0__> : + .dview-enter-option-twist-undo = DVIEW Entrez une option [TWist/Undo] : .color-scheme-set-to-system-currently-name = Jeu de couleurs défini sur « Système » (actuellement __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Nécessite un nombre entier compris entre __ocs_fmt_0__ et __ocs_fmt_1__. diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index cdaf7c092..1061a7622 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -4435,6 +4435,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <लेयर> = फ़्रीज़ | T <लेयर> = थॉ | Enter = बाहर निकलें view = + .twist-option = घुमाव + .dview-specify-view-twist-angle = DVIEW दृश्य घुमाव कोण निर्दिष्ट करें <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW विकल्प दर्ज करें [TWist/Undo]: .color-scheme-set-to-system-currently-name = रंग योजना 'सिस्टम' पर सेट की गई (वर्तमान में __ocs_fmt_0__)। .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = __ocs_fmt_0__ और __ocs_fmt_1__ के बीच एक पूर्णांक आवश्यक है। diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index 54b476fc8..0bce1d572 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -4444,6 +4444,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Fagyasztás | T = Felengedés | Enter = Kilépés view = + .twist-option = Elforgatás + .dview-specify-view-twist-angle = DVIEW Adja meg a nézet elforgatási szögét <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Adja meg a lehetőséget [TWist/Undo]: .color-scheme-set-to-system-currently-name = Színséma beállítva: „Rendszer” (jelenleg __ocs_fmt_0__). .ss-create-sheet-set = Tervlapkészlet létrehozása .ss-requires-integer-between = __ocs_fmt_0__ és __ocs_fmt_1__ közötti egész szám szükséges. diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index facf64bf4..a6e68a91e 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Congela | T = Scongela | Enter = Esci view = + .twist-option = Rotazione + .dview-specify-view-twist-angle = DVIEW Specificare l'angolo di rotazione della vista <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Immettere un'opzione [TWist/Undo]: .color-scheme-set-to-system-currently-name = Combinazione colori impostata su "Sistema" (attualmente __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Richiede un numero intero compreso tra __ocs_fmt_0__ e __ocs_fmt_1__. diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index 7e27c2697..1a58d56ab 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -4435,6 +4435,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = フリーズ | T = フリーズ解除 | Enter = 終了 view = + .twist-option = ねじれ + .dview-specify-view-twist-angle = DVIEW ビューのねじれ角度を指定 <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW オプションを入力 [TWist/Undo]: .color-scheme-set-to-system-currently-name = カラースキームを「システム」に設定しました(現在: __ocs_fmt_0__)。 .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = __ocs_fmt_0__ から __ocs_fmt_1__ までの整数が必要です。 diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index 7bd6325f7..f154d8638 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = 동결 | T = 해동 | Enter = 종료 view = + .twist-option = 비틀기 + .dview-specify-view-twist-angle = DVIEW 뷰 비틀기 각도 지정 <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW 옵션 입력 [TWist/Undo]: .color-scheme-set-to-system-currently-name = 색 구성표가 '시스템'으로 설정되었습니다(현재 __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = __ocs_fmt_0__에서 __ocs_fmt_1__ 사이의 정수가 필요합니다. diff --git a/locales/lo-LA/opencadstudio.ftl b/locales/lo-LA/opencadstudio.ftl index f4419053f..d44fddbab 100644 --- a/locales/lo-LA/opencadstudio.ftl +++ b/locales/lo-LA/opencadstudio.ftl @@ -4447,6 +4447,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <ເລເຢີ> = ແຊ່ແຂງ | T <ເລເຢີ> = ລະລາຍ | Enter = ອອກ view = + .twist-option = ບິດ + .dview-specify-view-twist-angle = DVIEW ກຳນົດມຸມບິດມຸມມອງ <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW ໃສ່ຕົວເລືອກ [TWist/Undo]: .color-scheme-set-to-system-currently-name = ຕັ້ງຮູບແບບສີເປັນ 'ລະບົບ' ແລ້ວ (ປັດຈຸບັນ __ocs_fmt_0__). .ss-create-sheet-set = ສ້າງຊຸດແຜ່ນງານ .ss-requires-integer-between = ຕ້ອງການຈໍານວນຖ້ວນລະຫວ່າງ __ocs_fmt_0__ ຫາ __ocs_fmt_1__. diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index 7c6cf1aba..2a53a42e9 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -4445,6 +4445,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Bevriezen | T = Ontdooien | Enter = Afsluiten view = + .twist-option = Draaien + .dview-specify-view-twist-angle = DVIEW Geef weergavedraaihoek op <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Geef optie op [TWist/Undo]: .color-scheme-set-to-system-currently-name = Kleurenschema ingesteld op 'Systeem' (momenteel __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Vereist een geheel getal tussen __ocs_fmt_0__ en __ocs_fmt_1__. diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index 4f3468a57..092e157f3 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -4446,6 +4446,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Zamrożenie | T = Odwilż | Enter = Wyjście view = + .twist-option = Skręcenie + .dview-specify-view-twist-angle = DVIEW Określ kąt skręcenia widoku <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Podaj opcję [TWist/Undo]: .color-scheme-set-to-system-currently-name = Schemat kolorów ustawiono na „System” (obecnie __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Wymagana liczba całkowita z zakresu od __ocs_fmt_0__ do __ocs_fmt_1__. diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index 3861a9dbd..a499e2648 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -4447,6 +4447,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Congelar | T = Descongelar | Enter = Sair view = + .twist-option = Girar + .dview-specify-view-twist-angle = DVIEW Especifique o ângulo de giro da vista <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Informe uma opção [TWist/Undo]: .color-scheme-set-to-system-currently-name = Esquema de cores definido como "Sistema" (atualmente __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Requer um número inteiro entre __ocs_fmt_0__ e __ocs_fmt_1__. diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 20aff58e8..5ab664934 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -4448,6 +4448,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <слой> = заморозить | T <слой> = разморозить | Enter = выход view = + .twist-option = Поворот + .dview-specify-view-twist-angle = DVIEW Укажите угол поворота вида <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Задайте параметр [TWist/Undo]: .color-scheme-set-to-system-currently-name = Цветовая схема установлена на «Системную» (сейчас __ocs_fmt_0__). .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = Требуется целое число от __ocs_fmt_0__ до __ocs_fmt_1__. diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index 4a6d6f26c..5e255ced1 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -4405,6 +4405,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F = Dondur | T = Çöz | Enter = Çık view = + .twist-option = Döndür + .dview-specify-view-twist-angle = DVIEW Görünüm döndürme açısını belirtin <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW Seçenek girin [TWist/Undo]: .color-scheme-set-to-system-currently-name = Renk düzeni 'Sistem' olarak ayarlandı (şu anda __ocs_fmt_0__). .ss-create-sheet-set = Sayfa Kümesi Oluştur .ss-requires-integer-between = __ocs_fmt_0__ ile __ocs_fmt_1__ arasında bir tam sayı gerekir. diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index 6ea365f46..2b85b94b0 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -4430,6 +4430,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <图层> = 冻结 | T <图层> = 解冻 | Enter = 退出 view = + .twist-option = 扭曲 + .dview-specify-view-twist-angle = DVIEW 指定视图扭曲角度 <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW 输入选项 [TWist/Undo]: .color-scheme-set-to-system-currently-name = 颜色方案已设为“系统”(当前:__ocs_fmt_0__)。 .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = 需要介于 __ocs_fmt_0__ 和 __ocs_fmt_1__ 之间的整数。 diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index b33c7307f..99ee6edbb 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -4442,6 +4442,9 @@ layout = .vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <圖層> = 凍結 | T <圖層> = 解凍 | Enter = 退出 view = + .twist-option = 扭轉 + .dview-specify-view-twist-angle = DVIEW 指定視圖扭轉角度 <__ocs_fmt_0__>: + .dview-enter-option-twist-undo = DVIEW 輸入選項 [TWist/Undo]: .color-scheme-set-to-system-currently-name = 配色方案已設為「系統」(目前:__ocs_fmt_0__)。 .ss-create-sheet-set = Create Sheet Set .ss-requires-integer-between = 需要介於 __ocs_fmt_0__ 和 __ocs_fmt_1__ 之間的整數。 diff --git a/src/app/alias.rs b/src/app/alias.rs index 7d11ba72e..f6db65401 100644 --- a/src/app/alias.rs +++ b/src/app/alias.rs @@ -80,7 +80,7 @@ const WEB_ALIAS_KEY: &str = "opencadstudio.aliases"; /// migrated forward (see `introduced_at` / `migrate_aliases`). Version 1 shipped /// the pre-REDRAW table; version 2 introduced the REDRAW-family aliases; version 3 /// introduced HB (HATCHTOBACK); version 4 introduced ER (EXTERNALREFERENCES). -const DEFAULT_ALIASES_VERSION: u32 = 6; +const DEFAULT_ALIASES_VERSION: u32 = 7; #[cfg(target_arch = "wasm32")] const WEB_ALIAS_VERSION_KEY: &str = "opencadstudio.aliases.version"; @@ -101,6 +101,7 @@ fn introduced_at(version: u32) -> &'static [(&'static str, &'static str)] { 4 => &[("ER", "EXTERNALREFERENCES")], 5 => &[("-ATT", "-ATTDEF")], 6 => &[("VV", "QLAYER")], + 7 => &[("DV", "DVIEW")], _ => &[], } } diff --git a/src/app/command_driver/mod.rs b/src/app/command_driver/mod.rs index 404238e41..5f28a6a94 100644 --- a/src/app/command_driver/mod.rs +++ b/src/app/command_driver/mod.rs @@ -882,6 +882,9 @@ impl OpenCADStudio { CmdResult::ZoomToWindow { p1, p2 } => { self.handle_zoom_to_window(p1, p2); } + CmdResult::TwistView(twist) => { + self.handle_twist_view(twist); + } CmdResult::Measurement(msg) => { self.handle_measurement(msg); } diff --git a/src/app/command_driver/viewport.rs b/src/app/command_driver/viewport.rs index 455960fd9..025a38d4b 100644 --- a/src/app/command_driver/viewport.rs +++ b/src/app/command_driver/viewport.rs @@ -447,6 +447,26 @@ impl OpenCADStudio { .push_output(crate::t!("Zoom Window").as_ref()); } + /// Turn the active view about its line of sight so the drawing shows + /// `twist` radians counter-clockwise from its untwisted orientation. + pub(in crate::app) fn handle_twist_view(&mut self, twist: f64) { + let i = self.active_tab; + self.tabs[i].scene.remember_current_view(); + let set = |camera: &mut crate::scene::view::camera::Camera| { + // The drawing turns one way when the camera rolls the other. + camera.roll_by(-twist as f32 - camera.roll()); + }; + if self.tabs[i].scene.active_viewport.is_some() { + self.tabs[i].scene.mutate_active_viewport_camera(set); + } else { + set(&mut self.tabs[i].scene.camera.borrow_mut()); + } + self.tabs[i].scene.camera_generation += 1; + if let Some(prompt) = self.tabs[i].active_cmd.as_ref().map(|c| c.prompt()) { + self.command_line.push_info(&prompt); + } + } + pub(super) fn handle_set_plot_window(&mut self, p1: glam::DVec3, p2: glam::DVec3) { let i = self.active_tab; let layout_name = self.tabs[i].scene.current_layout.clone(); diff --git a/src/app/commands/dim.rs b/src/app/commands/dim.rs index fe7b2423a..489c140ee 100644 --- a/src/app/commands/dim.rs +++ b/src/app/commands/dim.rs @@ -935,6 +935,21 @@ impl OpenCADStudio { self.tabs[i].active_cmd = Some(Box::new(cmd)); } + "DVIEW" => { + use crate::modules::view::dview::DviewCommand; + let twist = { + let scene = &self.tabs[i].scene; + let roll = match scene.active_viewport { + Some(_) => scene.navigation_camera().roll(), + None => scene.camera.borrow().roll(), + }; + -(roll as f64) + }; + let cmd = DviewCommand::new(twist.rem_euclid(std::f64::consts::TAU)); + self.command_line.push_info(&cmd.prompt()); + self.tabs[i].active_cmd = Some(Box::new(cmd)); + } + "ZOOM" | "ZOOM WINDOW" | "ZOOM W" | "ZW" => { use crate::modules::view::zoom_window::ZoomWindowCommand; let new_cmd = ZoomWindowCommand::new(); diff --git a/src/command.rs b/src/command.rs index 9bf1a580e..adb883d84 100644 --- a/src/command.rs +++ b/src/command.rs @@ -1935,6 +1935,9 @@ pub enum CmdResult { PasteClipboard { base_pt: DVec3, }, + /// Set the view's twist about its line of sight (radians, + /// counter-clockwise); the command stays active. + TwistView(f64), /// Zoom the model-space camera to fit the given corner points; end command. ZoomToWindow { p1: DVec3, diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index d277ff0e8..a9010ebe6 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -3838,6 +3838,9 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "ZOOM [Window / Extents / Extents All / All / In / Out / Scale]:" => Some(("view", "zoom-window-extents-extents-all-all-in-out-sca")), "ZOOM scale factor (e.g. 2 or 0.5):" => Some(("annotate", "zoom-scale-factor-e-g-2-or-0-5")), "ZOOM WINDOW Specify first corner:" => Some(("view", "zoom-window-specify-first-corner")), + "DVIEW Enter option [TWist/Undo]:" => Some(("view", "dview-enter-option-twist-undo")), + "DVIEW Specify view twist angle <{current}>:" => Some(("view", "dview-specify-view-twist-angle")), + "TWist" => Some(("view", "twist-option")), "ZOOM WINDOW Specify opposite corner:" => Some(("view", "zoom-window-specify-opposite-corner")), "Zero" => Some(("properties", "zero")), "Zero suppress (DIMALTZ)" => Some(("common", "zero-suppress-dimaltz")), diff --git a/src/modules/view/dview.rs b/src/modules/view/dview.rs new file mode 100644 index 000000000..bc8a95d02 --- /dev/null +++ b/src/modules/view/dview.rs @@ -0,0 +1,89 @@ +// DVIEW command — turn the view about its line of sight (TWist). + +use crate::t; +use glam::DVec3; + +use crate::command::{CadCommand, CmdOption, CmdResult}; + +pub struct DviewCommand { + /// The view's twist when the command started or last changed, radians. + current: f64, + /// Earlier twists, for Undo. + history: Vec, + twist_prompt: bool, +} + +impl DviewCommand { + /// `current` is the view's present twist, counter-clockwise, in radians. + pub fn new(current: f64) -> Self { + Self { + current, + history: Vec::new(), + twist_prompt: false, + } + } +} + +impl CadCommand for DviewCommand { + fn name(&self) -> &'static str { + "DVIEW" + } + + fn prompt(&self) -> String { + if self.twist_prompt { + let current = crate::entities::common::format_angle(self.current); + crate::tf!("DVIEW Specify view twist angle <{current}>:").into_owned() + } else { + t!("DVIEW Enter option [TWist/Undo]:").into_owned() + } + } + + fn options(&self) -> Vec { + if self.twist_prompt { + return Vec::new(); + } + vec![CmdOption::new("TWist", "TW"), CmdOption::new("Undo", "U")] + } + + fn wants_text_input(&self) -> bool { + true + } + + fn on_text_input(&mut self, text: &str) -> Option { + let text = text.trim(); + if self.twist_prompt { + let twist = crate::entities::common::parse_angle(&text.replace(',', "."))?; + self.twist_prompt = false; + self.history.push(self.current); + self.current = twist; + return Some(CmdResult::TwistView(twist)); + } + match text.trim_start_matches('_').to_ascii_uppercase().as_str() { + "TW" | "TWIST" => { + self.twist_prompt = true; + Some(CmdResult::NeedPoint) + } + "U" | "UNDO" => { + let previous = self.history.pop()?; + self.current = previous; + Some(CmdResult::TwistView(previous)) + } + _ => None, + } + } + + fn on_point(&mut self, _pt: DVec3) -> CmdResult { + CmdResult::NeedPoint + } + + fn on_enter(&mut self) -> CmdResult { + if self.twist_prompt { + // Enter keeps the current twist and returns to the options. + self.twist_prompt = false; + return CmdResult::NeedPoint; + } + CmdResult::Cancel + } +} + +inventory::submit!(crate::command::CommandRegistration { names: &["DVIEW"] }); diff --git a/src/modules/view/mod.rs b/src/modules/view/mod.rs index eb448e4dc..978024674 100644 --- a/src/modules/view/mod.rs +++ b/src/modules/view/mod.rs @@ -5,6 +5,7 @@ mod count_palette; mod file_tabs; mod graphic_attributes_palette; mod layout_tabs; +pub mod dview; pub mod limits; mod orbit; mod ortho;