forked from 1b-agent/opencadstudio-upstream
feat(view): DVIEW twists the view about its line of sight
DVIEW (alias DV) offers TWist and Undo. TWist rolls the active view or viewport camera to the typed angle; Undo steps back through the twists made in the session. The new alias reaches existing profiles through the alias migration table. Refs #638 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6490a625f2
commit
4ffae00199
31 files changed
+203
-1
No files matched your search
@@ -155,6 +155,7 @@ SHA, *SHADEMODE
|
||||
COL, *COLOR
|
||||
DR, *DRAWORDER
|
||||
DS, *DSETTINGS
|
||||
DV, *DVIEW
|
||||
LT, *LINETYPE
|
||||
LTS, *LTSCALE
|
||||
OS, *OSNAP
|
||||
|
||||
@@ -4459,6 +4459,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = تجميد | T <layer> = إلغاء التجميد | 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__.
|
||||
|
||||
@@ -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__.
|
||||
|
||||
@@ -4444,6 +4444,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Zmrazit | T <layer> = 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__.
|
||||
|
||||
@@ -4445,6 +4445,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <Ebene> = Einfrieren | T <Ebene> = 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__.
|
||||
|
||||
@@ -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__.
|
||||
|
||||
@@ -4446,6 +4446,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Freeze | T <layer> = 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__.
|
||||
|
||||
@@ -4447,6 +4447,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <capa> = Inutilizar | T <capa> = 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__.
|
||||
|
||||
@@ -4446,6 +4446,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Jäädytys | T <layer> = 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__.
|
||||
|
||||
@@ -4448,6 +4448,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Freeze , T <layer> = 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__.
|
||||
|
||||
@@ -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__ के बीच एक पूर्णांक आवश्यक है।
|
||||
|
||||
@@ -4444,6 +4444,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Fagyasztás | T <layer> = 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.
|
||||
|
||||
@@ -4446,6 +4446,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Congela | T <layer> = 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__.
|
||||
|
||||
@@ -4435,6 +4435,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = フリーズ | T <layer> = フリーズ解除 | 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__ までの整数が必要です。
|
||||
|
||||
@@ -4446,6 +4446,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = 동결 | T <layer> = 해동 | 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__ 사이의 정수가 필요합니다.
|
||||
|
||||
@@ -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__.
|
||||
|
||||
@@ -4445,6 +4445,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <laag> = Bevriezen | T <laag> = 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__.
|
||||
|
||||
@@ -4446,6 +4446,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Zamrożenie | T <layer> = 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__.
|
||||
|
||||
@@ -4447,6 +4447,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <camada> = Congelar | T <camada> = 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__.
|
||||
|
||||
@@ -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__.
|
||||
|
||||
@@ -4405,6 +4405,9 @@ layout =
|
||||
.vplayer-f-layer-freeze-t-layer-thaw-enter-exit = VPLAYER F <layer> = Dondur | T <layer> = Çö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.
|
||||
|
||||
@@ -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__ 之间的整数。
|
||||
|
||||
@@ -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__ 之間的整數。
|
||||
|
||||
+2
-1
@@ -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")],
|
||||
_ => &[],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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")),
|
||||
|
||||
@@ -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<f64>,
|
||||
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<CmdOption> {
|
||||
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<CmdResult> {
|
||||
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"] });
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user