feat(layout): MVSETUP sets a drawing up for plotting

In model space MVSETUP draws the sheet border at the drawing scale
(scale factor, paper width and height) and zooms to it, or switches to
a layout. On a layout it creates viewports in a bounding area (a single
one, a 2x2 engineering set of top/front/right/isometric views, or an
array with spacing), deletes picked objects, and scales picked
viewports to a paper/model unit ratio.

A viewport's fit to the model now measures the model along the
viewport's own view direction, so side and isometric views frame it
too.

Refs #1501

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 5.5 committed 2026-10-13 15:21:26 +03:00
1 parent b1d4c9bd9b
commit 57eb7fe4db
31 files changed
+929 -10

No files matched your search

+19
View File
@@ -4436,6 +4436,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP حدد الكائنات المراد حذفها:
.delete-objects-option = حذف الكائنات
.mvsetup-enable-paper-space = MVSETUP تمكين فضاء الورق؟ [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP أدخل معامل المقياس <1>:
.mvsetup-enter-paper-width = MVSETUP أدخل عرض الورقة:
.mvsetup-enter-paper-height = MVSETUP أدخل ارتفاع الورقة:
.mvsetup-enter-option = MVSETUP أدخل خيارًا [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP أدخل تخطيط منافذ العرض [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP حدد الزاوية الأولى لمنطقة منافذ العرض <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP حدد الزاوية المقابلة:
.mvsetup-viewports-in-x = MVSETUP أدخل عدد منافذ العرض في اتجاه X <2>:
.mvsetup-viewports-in-y = MVSETUP أدخل عدد منافذ العرض في اتجاه Y <2>:
.mvsetup-distance-in-x = MVSETUP حدد المسافة بين منافذ العرض في اتجاه X <0>:
.mvsetup-distance-in-y = MVSETUP حدد المسافة بين منافذ العرض في اتجاه Y <0>:
.mvsetup-select-viewports = MVSETUP حدد منافذ العرض المراد تغيير مقياسها:
.mvsetup-paper-space-units = MVSETUP أدخل عدد وحدات فضاء الورق <1>:
.mvsetup-model-space-units = MVSETUP أدخل عدد وحدات فضاء النموذج <1>:
.mvsetup-viewports-do-not-fit = MVSETUP منافذ العرض لا تتسع في المنطقة المحددة.
.scale-viewports-option = تغيير مقياس منافذ العرض
.active = نشط
.inactive = غير نشط
.insert-view = إدراج عرض
+19
View File
@@ -4423,6 +4423,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Изберете обектите за изтриване:
.delete-objects-option = Изтриване на обекти
.mvsetup-enable-paper-space = MVSETUP Активиране на хартиеното пространство? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Въведете мащабен коефициент <1>:
.mvsetup-enter-paper-width = MVSETUP Въведете ширина на листа:
.mvsetup-enter-paper-height = MVSETUP Въведете височина на листа:
.mvsetup-enter-option = MVSETUP Въведете опция [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Въведете подредба на прозорците [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Задайте първи ъгъл на областта за прозорците <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Задайте противоположен ъгъл:
.mvsetup-viewports-in-x = MVSETUP Въведете брой прозорци по X <2>:
.mvsetup-viewports-in-y = MVSETUP Въведете брой прозорци по Y <2>:
.mvsetup-distance-in-x = MVSETUP Задайте разстояние между прозорците по X <0>:
.mvsetup-distance-in-y = MVSETUP Задайте разстояние между прозорците по Y <0>:
.mvsetup-select-viewports = MVSETUP Изберете прозорците за мащабиране:
.mvsetup-paper-space-units = MVSETUP Въведете броя единици в хартиеното пространство <1>:
.mvsetup-model-space-units = MVSETUP Въведете броя единици в пространството на модела <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Прозорците не се побират в областта.
.scale-viewports-option = Мащабиране на прозорците
.active = Активно
.inactive = Неактивно
.insert-view = Вмъкни изглед
+19
View File
@@ -4421,6 +4421,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Vyberte objekty k odstranění:
.delete-objects-option = Odstranit objekty
.mvsetup-enable-paper-space = MVSETUP Povolit výkresový prostor? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Zadejte měřítko <1>:
.mvsetup-enter-paper-width = MVSETUP Zadejte šířku papíru:
.mvsetup-enter-paper-height = MVSETUP Zadejte výšku papíru:
.mvsetup-enter-option = MVSETUP Zadejte možnost [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Zadejte rozvržení výřezů [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Zadejte první roh oblasti pro výřezy <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Zadejte protější roh:
.mvsetup-viewports-in-x = MVSETUP Zadejte počet výřezů ve směru X <2>:
.mvsetup-viewports-in-y = MVSETUP Zadejte počet výřezů ve směru Y <2>:
.mvsetup-distance-in-x = MVSETUP Zadejte vzdálenost mezi výřezy ve směru X <0>:
.mvsetup-distance-in-y = MVSETUP Zadejte vzdálenost mezi výřezy ve směru Y <0>:
.mvsetup-select-viewports = MVSETUP Vyberte výřezy ke změně měřítka:
.mvsetup-paper-space-units = MVSETUP Zadejte počet jednotek výkresového prostoru <1>:
.mvsetup-model-space-units = MVSETUP Zadejte počet jednotek modelového prostoru <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Výřezy se do oblasti nevejdou.
.scale-viewports-option = Měřítko výřezů
.active = Aktivní
.inactive = Neaktivní
.insert-view = Vložit pohled
+19
View File
@@ -4422,6 +4422,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Zu löschende Objekte wählen:
.delete-objects-option = Objekte löschen
.mvsetup-enable-paper-space = MVSETUP Papierbereich aktivieren? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Skalierfaktor eingeben <1>:
.mvsetup-enter-paper-width = MVSETUP Papierbreite eingeben:
.mvsetup-enter-paper-height = MVSETUP Papierhöhe eingeben:
.mvsetup-enter-option = MVSETUP Option eingeben [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Ansichtsfensteranordnung eingeben [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Erste Ecke des Bereichs für Ansichtsfenster angeben <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Gegenüberliegende Ecke angeben:
.mvsetup-viewports-in-x = MVSETUP Anzahl der Ansichtsfenster in X-Richtung eingeben <2>:
.mvsetup-viewports-in-y = MVSETUP Anzahl der Ansichtsfenster in Y-Richtung eingeben <2>:
.mvsetup-distance-in-x = MVSETUP Abstand zwischen Ansichtsfenstern in X-Richtung angeben <0>:
.mvsetup-distance-in-y = MVSETUP Abstand zwischen Ansichtsfenstern in Y-Richtung angeben <0>:
.mvsetup-select-viewports = MVSETUP Zu skalierende Ansichtsfenster wählen:
.mvsetup-paper-space-units = MVSETUP Anzahl der Papierbereichseinheiten eingeben <1>:
.mvsetup-model-space-units = MVSETUP Anzahl der Modellbereichseinheiten eingeben <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Die Ansichtsfenster passen nicht in den Bereich.
.scale-viewports-option = Ansichtsfenster skalieren
.active = Aktiv
.inactive = Inaktiv
.insert-view = Ansicht einfügen
+19
View File
@@ -4424,6 +4424,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Επιλέξτε τα αντικείμενα για διαγραφή:
.delete-objects-option = Διαγραφή αντικειμένων
.mvsetup-enable-paper-space = MVSETUP Ενεργοποίηση χώρου χαρτιού; [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Εισαγάγετε συντελεστή κλίμακας <1>:
.mvsetup-enter-paper-width = MVSETUP Εισαγάγετε πλάτος χαρτιού:
.mvsetup-enter-paper-height = MVSETUP Εισαγάγετε ύψος χαρτιού:
.mvsetup-enter-option = MVSETUP Εισαγάγετε επιλογή [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Εισαγάγετε διάταξη παραθύρων [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Καθορίστε πρώτη γωνία της περιοχής παραθύρων <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Καθορίστε την απέναντι γωνία:
.mvsetup-viewports-in-x = MVSETUP Εισαγάγετε αριθμό παραθύρων στην κατεύθυνση X <2>:
.mvsetup-viewports-in-y = MVSETUP Εισαγάγετε αριθμό παραθύρων στην κατεύθυνση Y <2>:
.mvsetup-distance-in-x = MVSETUP Καθορίστε απόσταση μεταξύ παραθύρων στην κατεύθυνση X <0>:
.mvsetup-distance-in-y = MVSETUP Καθορίστε απόσταση μεταξύ παραθύρων στην κατεύθυνση Y <0>:
.mvsetup-select-viewports = MVSETUP Επιλέξτε τα παράθυρα για κλιμάκωση:
.mvsetup-paper-space-units = MVSETUP Εισαγάγετε αριθμό μονάδων χώρου χαρτιού <1>:
.mvsetup-model-space-units = MVSETUP Εισαγάγετε αριθμό μονάδων χώρου μοντέλου <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Τα παράθυρα δεν χωρούν στην περιοχή.
.scale-viewports-option = Κλιμάκωση παραθύρων
.active = Ενεργή
.inactive = Ανενεργή
.insert-view = Εισαγωγή προβολής
+19
View File
@@ -4423,6 +4423,25 @@ model =
.cube = Cube
layout =
.mvsetup-select-objects-to-delete = MVSETUP Select the objects to delete:
.delete-objects-option = Delete objects
.mvsetup-enable-paper-space = MVSETUP Enable paper space? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Enter the scale factor <1>:
.mvsetup-enter-paper-width = MVSETUP Enter the paper width:
.mvsetup-enter-paper-height = MVSETUP Enter the paper height:
.mvsetup-enter-option = MVSETUP Enter an option [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Enter viewport layout [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Specify first corner of bounding area for viewport(s) <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Specify opposite corner:
.mvsetup-viewports-in-x = MVSETUP Enter number of viewports in X direction <2>:
.mvsetup-viewports-in-y = MVSETUP Enter number of viewports in Y direction <2>:
.mvsetup-distance-in-x = MVSETUP Specify distance between viewports in X direction <0>:
.mvsetup-distance-in-y = MVSETUP Specify distance between viewports in Y direction <0>:
.mvsetup-select-viewports = MVSETUP Select the viewports to scale:
.mvsetup-paper-space-units = MVSETUP Enter the number of paper space units <1>:
.mvsetup-model-space-units = MVSETUP Enter the number of model space units <1>:
.mvsetup-viewports-do-not-fit = MVSETUP The viewports do not fit in the bounding area.
.scale-viewports-option = Scale viewports
.active = Active
.inactive = Inactive
.insert-view = Insert view
+19
View File
@@ -4424,6 +4424,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Seleccione los objetos que desea suprimir:
.delete-objects-option = Suprimir objetos
.mvsetup-enable-paper-space = MVSETUP ¿Activar espacio papel? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Indique el factor de escala <1>:
.mvsetup-enter-paper-width = MVSETUP Indique la anchura del papel:
.mvsetup-enter-paper-height = MVSETUP Indique la altura del papel:
.mvsetup-enter-option = MVSETUP Indique una opción [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Indique la disposición de ventanas [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Precise la primera esquina del área de ventanas <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Precise la esquina opuesta:
.mvsetup-viewports-in-x = MVSETUP Indique el número de ventanas en dirección X <2>:
.mvsetup-viewports-in-y = MVSETUP Indique el número de ventanas en dirección Y <2>:
.mvsetup-distance-in-x = MVSETUP Precise la distancia entre ventanas en dirección X <0>:
.mvsetup-distance-in-y = MVSETUP Precise la distancia entre ventanas en dirección Y <0>:
.mvsetup-select-viewports = MVSETUP Seleccione las ventanas que desea escalar:
.mvsetup-paper-space-units = MVSETUP Indique el número de unidades de espacio papel <1>:
.mvsetup-model-space-units = MVSETUP Indique el número de unidades de espacio modelo <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Las ventanas no caben en el área.
.scale-viewports-option = Escalar ventanas
.active = Activo
.inactive = Inactivo
.insert-view = Insertar vista
+19
View File
@@ -4423,6 +4423,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Valitse poistettavat objektit:
.delete-objects-option = Poista objektit
.mvsetup-enable-paper-space = MVSETUP Otetaanko paperitila käyttöön? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Anna mittakaavakerroin <1>:
.mvsetup-enter-paper-width = MVSETUP Anna paperin leveys:
.mvsetup-enter-paper-height = MVSETUP Anna paperin korkeus:
.mvsetup-enter-option = MVSETUP Anna valinta [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Anna näkymäikkunoiden asettelu [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Määritä näkymäikkunoiden alueen ensimmäinen kulma <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Määritä vastakkainen kulma:
.mvsetup-viewports-in-x = MVSETUP Anna näkymäikkunoiden määrä X-suunnassa <2>:
.mvsetup-viewports-in-y = MVSETUP Anna näkymäikkunoiden määrä Y-suunnassa <2>:
.mvsetup-distance-in-x = MVSETUP Määritä näkymäikkunoiden väli X-suunnassa <0>:
.mvsetup-distance-in-y = MVSETUP Määritä näkymäikkunoiden väli Y-suunnassa <0>:
.mvsetup-select-viewports = MVSETUP Valitse skaalattavat näkymäikkunat:
.mvsetup-paper-space-units = MVSETUP Anna paperitilan yksiköiden määrä <1>:
.mvsetup-model-space-units = MVSETUP Anna mallitilan yksiköiden määrä <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Näkymäikkunat eivät mahdu alueelle.
.scale-viewports-option = Skaalaa näkymäikkunat
.active = Aktiivinen
.inactive = Ei-aktiivinen
.insert-view = Lisää näkymä
+19
View File
@@ -4425,6 +4425,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Sélectionnez les objets à supprimer :
.delete-objects-option = Supprimer des objets
.mvsetup-enable-paper-space = MVSETUP Activer l’espace papier ? [No/Yes] <Y> :
.mvsetup-enter-scale-factor = MVSETUP Entrez le facteur d’échelle <1> :
.mvsetup-enter-paper-width = MVSETUP Entrez la largeur du papier :
.mvsetup-enter-paper-height = MVSETUP Entrez la hauteur du papier :
.mvsetup-enter-option = MVSETUP Entrez une option [Create/Delete objects/Scale viewports] :
.mvsetup-enter-viewport-layout = MVSETUP Entrez la disposition des fenêtres [Single/Engineering/Array] <Single> :
.mvsetup-specify-first-corner = MVSETUP Spécifiez le premier coin de la zone des fenêtres <Sheet> :
.mvsetup-specify-opposite-corner = MVSETUP Spécifiez le coin opposé :
.mvsetup-viewports-in-x = MVSETUP Entrez le nombre de fenêtres en X <2> :
.mvsetup-viewports-in-y = MVSETUP Entrez le nombre de fenêtres en Y <2> :
.mvsetup-distance-in-x = MVSETUP Spécifiez la distance entre les fenêtres en X <0> :
.mvsetup-distance-in-y = MVSETUP Spécifiez la distance entre les fenêtres en Y <0> :
.mvsetup-select-viewports = MVSETUP Sélectionnez les fenêtres à mettre à l’échelle :
.mvsetup-paper-space-units = MVSETUP Entrez le nombre d’unités de l’espace papier <1> :
.mvsetup-model-space-units = MVSETUP Entrez le nombre d’unités de l’espace objet <1> :
.mvsetup-viewports-do-not-fit = MVSETUP Les fenêtres ne tiennent pas dans la zone.
.scale-viewports-option = Échelle des fenêtres
.active = Actif
.inactive = Inactif
.insert-view = Insérer une vue
+19
View File
@@ -4412,6 +4412,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP हटाने के लिए ऑब्जेक्ट चुनें:
.delete-objects-option = ऑब्जेक्ट हटाएँ
.mvsetup-enable-paper-space = MVSETUP पेपर स्पेस सक्षम करें? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP स्केल फ़ैक्टर दर्ज करें <1>:
.mvsetup-enter-paper-width = MVSETUP पेपर की चौड़ाई दर्ज करें:
.mvsetup-enter-paper-height = MVSETUP पेपर की ऊँचाई दर्ज करें:
.mvsetup-enter-option = MVSETUP विकल्प दर्ज करें [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP व्यूपोर्ट लेआउट दर्ज करें [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP व्यूपोर्ट क्षेत्र का पहला कोना निर्दिष्ट करें <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP विपरीत कोना निर्दिष्ट करें:
.mvsetup-viewports-in-x = MVSETUP X दिशा में व्यूपोर्ट की संख्या दर्ज करें <2>:
.mvsetup-viewports-in-y = MVSETUP Y दिशा में व्यूपोर्ट की संख्या दर्ज करें <2>:
.mvsetup-distance-in-x = MVSETUP X दिशा में व्यूपोर्ट के बीच दूरी निर्दिष्ट करें <0>:
.mvsetup-distance-in-y = MVSETUP Y दिशा में व्यूपोर्ट के बीच दूरी निर्दिष्ट करें <0>:
.mvsetup-select-viewports = MVSETUP स्केल करने के लिए व्यूपोर्ट चुनें:
.mvsetup-paper-space-units = MVSETUP पेपर स्पेस इकाइयों की संख्या दर्ज करें <1>:
.mvsetup-model-space-units = MVSETUP मॉडल स्पेस इकाइयों की संख्या दर्ज करें <1>:
.mvsetup-viewports-do-not-fit = MVSETUP व्यूपोर्ट क्षेत्र में फिट नहीं होते।
.scale-viewports-option = व्यूपोर्ट स्केल करें
.active = सक्रिय
.inactive = निष्क्रिय
.insert-view = दृश्य डालें
+19
View File
@@ -4421,6 +4421,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Válassza ki a törlendő objektumokat:
.delete-objects-option = Objektumok törlése
.mvsetup-enable-paper-space = MVSETUP Papírtér engedélyezése? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Adja meg a léptéktényezőt <1>:
.mvsetup-enter-paper-width = MVSETUP Adja meg a papír szélességét:
.mvsetup-enter-paper-height = MVSETUP Adja meg a papír magasságát:
.mvsetup-enter-option = MVSETUP Adja meg a lehetőséget [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Adja meg a nézetablak-elrendezést [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Adja meg a nézetablakok területének első sarkát <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Adja meg a szemközti sarkot:
.mvsetup-viewports-in-x = MVSETUP Adja meg a nézetablakok számát X irányban <2>:
.mvsetup-viewports-in-y = MVSETUP Adja meg a nézetablakok számát Y irányban <2>:
.mvsetup-distance-in-x = MVSETUP Adja meg a nézetablakok távolságát X irányban <0>:
.mvsetup-distance-in-y = MVSETUP Adja meg a nézetablakok távolságát Y irányban <0>:
.mvsetup-select-viewports = MVSETUP Válassza ki a méretezendő nézetablakokat:
.mvsetup-paper-space-units = MVSETUP Adja meg a papírtér egységeinek számát <1>:
.mvsetup-model-space-units = MVSETUP Adja meg a modelltér egységeinek számát <1>:
.mvsetup-viewports-do-not-fit = MVSETUP A nézetablakok nem férnek el a területen.
.scale-viewports-option = Nézetablakok méretezése
.active = Aktív
.inactive = Inaktív
.insert-view = Nézet beszúrása
+19
View File
@@ -4423,6 +4423,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Selezionare gli oggetti da eliminare:
.delete-objects-option = Elimina oggetti
.mvsetup-enable-paper-space = MVSETUP Attivare lo spazio carta? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Immettere il fattore di scala <1>:
.mvsetup-enter-paper-width = MVSETUP Immettere la larghezza del foglio:
.mvsetup-enter-paper-height = MVSETUP Immettere l'altezza del foglio:
.mvsetup-enter-option = MVSETUP Immettere un'opzione [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Immettere la disposizione delle finestre [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Specificare il primo angolo dell'area delle finestre <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Specificare l'angolo opposto:
.mvsetup-viewports-in-x = MVSETUP Immettere il numero di finestre in direzione X <2>:
.mvsetup-viewports-in-y = MVSETUP Immettere il numero di finestre in direzione Y <2>:
.mvsetup-distance-in-x = MVSETUP Specificare la distanza tra le finestre in direzione X <0>:
.mvsetup-distance-in-y = MVSETUP Specificare la distanza tra le finestre in direzione Y <0>:
.mvsetup-select-viewports = MVSETUP Selezionare le finestre da scalare:
.mvsetup-paper-space-units = MVSETUP Immettere il numero di unità dello spazio carta <1>:
.mvsetup-model-space-units = MVSETUP Immettere il numero di unità dello spazio modello <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Le finestre non entrano nell'area.
.scale-viewports-option = Scala finestre
.active = Attivo
.inactive = Inattivo
.insert-view = Inserisci vista
+19
View File
@@ -4412,6 +4412,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP 削除するオブジェクトを選択:
.delete-objects-option = オブジェクトを削除
.mvsetup-enable-paper-space = MVSETUP ペーパー空間を有効にしますか? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP 尺度を入力 <1>:
.mvsetup-enter-paper-width = MVSETUP 用紙の幅を入力:
.mvsetup-enter-paper-height = MVSETUP 用紙の高さを入力:
.mvsetup-enter-option = MVSETUP オプションを入力 [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP ビューポートの配置を入力 [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP ビューポート領域の最初のコーナーを指定 <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP もう一方のコーナーを指定:
.mvsetup-viewports-in-x = MVSETUP X 方向のビューポート数を入力 <2>:
.mvsetup-viewports-in-y = MVSETUP Y 方向のビューポート数を入力 <2>:
.mvsetup-distance-in-x = MVSETUP X 方向のビューポート間隔を指定 <0>:
.mvsetup-distance-in-y = MVSETUP Y 方向のビューポート間隔を指定 <0>:
.mvsetup-select-viewports = MVSETUP 尺度を設定するビューポートを選択:
.mvsetup-paper-space-units = MVSETUP ペーパー空間の単位数を入力 <1>:
.mvsetup-model-space-units = MVSETUP モデル空間の単位数を入力 <1>:
.mvsetup-viewports-do-not-fit = MVSETUP ビューポートが領域に収まりません。
.scale-viewports-option = ビューポートの尺度
.active = アクティブ
.inactive = 非アクティブ
.insert-view = ビューを挿入
+19
View File
@@ -4423,6 +4423,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP 삭제할 객체 선택:
.delete-objects-option = 객체 삭제
.mvsetup-enable-paper-space = MVSETUP 도면 공간을 사용하시겠습니까? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP 축척 비율 입력 <1>:
.mvsetup-enter-paper-width = MVSETUP 용지 폭 입력:
.mvsetup-enter-paper-height = MVSETUP 용지 높이 입력:
.mvsetup-enter-option = MVSETUP 옵션 입력 [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP 뷰포트 배치 입력 [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP 뷰포트 영역의 첫 번째 구석 지정 <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP 반대 구석 지정:
.mvsetup-viewports-in-x = MVSETUP X 방향 뷰포트 수 입력 <2>:
.mvsetup-viewports-in-y = MVSETUP Y 방향 뷰포트 수 입력 <2>:
.mvsetup-distance-in-x = MVSETUP X 방향 뷰포트 간 거리 지정 <0>:
.mvsetup-distance-in-y = MVSETUP Y 방향 뷰포트 간 거리 지정 <0>:
.mvsetup-select-viewports = MVSETUP 축척할 뷰포트 선택:
.mvsetup-paper-space-units = MVSETUP 도면 공간 단위 수 입력 <1>:
.mvsetup-model-space-units = MVSETUP 모형 공간 단위 수 입력 <1>:
.mvsetup-viewports-do-not-fit = MVSETUP 뷰포트가 영역에 맞지 않습니다.
.scale-viewports-option = 뷰포트 축척
.active = 활성
.inactive = 비활성
.insert-view = 삽입 뷰
+19
View File
@@ -4424,6 +4424,25 @@ model =
.cube = ລູກບາດກ໌
layout =
.mvsetup-select-objects-to-delete = MVSETUP ເລືອກວັດຖຸທີ່ຈະລຶບ:
.delete-objects-option = ລຶບວັດຖຸ
.mvsetup-enable-paper-space = MVSETUP ເປີດໃຊ້ພື້ນທີ່ເຈ້ຍບໍ? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP ໃສ່ຕົວຄູນມາດຕາສ່ວນ <1>:
.mvsetup-enter-paper-width = MVSETUP ໃສ່ຄວາມກວ້າງເຈ້ຍ:
.mvsetup-enter-paper-height = MVSETUP ໃສ່ຄວາມສູງເຈ້ຍ:
.mvsetup-enter-option = MVSETUP ໃສ່ຕົວເລືອກ [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP ໃສ່ການຈັດວາງຊ່ອງມອງ [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP ກຳນົດມຸມທຳອິດຂອງພື້ນທີ່ຊ່ອງມອງ <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP ກຳນົດມຸມກົງກັນຂ້າມ:
.mvsetup-viewports-in-x = MVSETUP ໃສ່ຈຳນວນຊ່ອງມອງໃນທິດ X <2>:
.mvsetup-viewports-in-y = MVSETUP ໃສ່ຈຳນວນຊ່ອງມອງໃນທິດ Y <2>:
.mvsetup-distance-in-x = MVSETUP ກຳນົດໄລຍະຫ່າງລະຫວ່າງຊ່ອງມອງໃນທິດ X <0>:
.mvsetup-distance-in-y = MVSETUP ກຳນົດໄລຍະຫ່າງລະຫວ່າງຊ່ອງມອງໃນທິດ Y <0>:
.mvsetup-select-viewports = MVSETUP ເລືອກຊ່ອງມອງທີ່ຈະປັບມາດຕາສ່ວນ:
.mvsetup-paper-space-units = MVSETUP ໃສ່ຈຳນວນຫົວໜ່ວຍພື້ນທີ່ເຈ້ຍ <1>:
.mvsetup-model-space-units = MVSETUP ໃສ່ຈຳນວນຫົວໜ່ວຍພື້ນທີ່ແບບຈຳລອງ <1>:
.mvsetup-viewports-do-not-fit = MVSETUP ຊ່ອງມອງບໍ່ພໍດີກັບພື້ນທີ່.
.scale-viewports-option = ປັບມາດຕາສ່ວນຊ່ອງມອງ
.active = ໃຊ້ງານຢູ່
.inactive = ບໍ່ໄດ້ໃຊ້ງານ
.insert-view = ແຊກມຸມມອງ
+19
View File
@@ -4422,6 +4422,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Selecteer de te verwijderen objecten:
.delete-objects-option = Objecten verwijderen
.mvsetup-enable-paper-space = MVSETUP Papierruimte inschakelen? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Geef schaalfactor op <1>:
.mvsetup-enter-paper-width = MVSETUP Geef papierbreedte op:
.mvsetup-enter-paper-height = MVSETUP Geef papierhoogte op:
.mvsetup-enter-option = MVSETUP Geef optie op [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Geef viewportindeling op [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Geef eerste hoek van het viewportgebied op <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Geef tegenoverliggende hoek op:
.mvsetup-viewports-in-x = MVSETUP Geef aantal viewports in X-richting op <2>:
.mvsetup-viewports-in-y = MVSETUP Geef aantal viewports in Y-richting op <2>:
.mvsetup-distance-in-x = MVSETUP Geef afstand tussen viewports in X-richting op <0>:
.mvsetup-distance-in-y = MVSETUP Geef afstand tussen viewports in Y-richting op <0>:
.mvsetup-select-viewports = MVSETUP Selecteer de te schalen viewports:
.mvsetup-paper-space-units = MVSETUP Geef aantal papierruimte-eenheden op <1>:
.mvsetup-model-space-units = MVSETUP Geef aantal modelruimte-eenheden op <1>:
.mvsetup-viewports-do-not-fit = MVSETUP De viewports passen niet in het gebied.
.scale-viewports-option = Viewports schalen
.active = Actief
.inactive = Inactief
.insert-view = Beeld invoegen
+19
View File
@@ -4423,6 +4423,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Wybierz obiekty do usunięcia:
.delete-objects-option = Usuń obiekty
.mvsetup-enable-paper-space = MVSETUP Włączyć obszar papieru? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Podaj współczynnik skali <1>:
.mvsetup-enter-paper-width = MVSETUP Podaj szerokość papieru:
.mvsetup-enter-paper-height = MVSETUP Podaj wysokość papieru:
.mvsetup-enter-option = MVSETUP Podaj opcję [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Podaj układ rzutni [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Określ pierwszy narożnik obszaru rzutni <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Określ przeciwległy narożnik:
.mvsetup-viewports-in-x = MVSETUP Podaj liczbę rzutni w kierunku X <2>:
.mvsetup-viewports-in-y = MVSETUP Podaj liczbę rzutni w kierunku Y <2>:
.mvsetup-distance-in-x = MVSETUP Określ odstęp między rzutniami w kierunku X <0>:
.mvsetup-distance-in-y = MVSETUP Określ odstęp między rzutniami w kierunku Y <0>:
.mvsetup-select-viewports = MVSETUP Wybierz rzutnie do skalowania:
.mvsetup-paper-space-units = MVSETUP Podaj liczbę jednostek obszaru papieru <1>:
.mvsetup-model-space-units = MVSETUP Podaj liczbę jednostek obszaru modelu <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Rzutnie nie mieszczą się w obszarze.
.scale-viewports-option = Skaluj rzutnie
.active = Aktywny
.inactive = Nieaktywny
.insert-view = Wstaw widok
+19
View File
@@ -4424,6 +4424,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Selecione os objetos a excluir:
.delete-objects-option = Excluir objetos
.mvsetup-enable-paper-space = MVSETUP Ativar espaço do papel? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Informe o fator de escala <1>:
.mvsetup-enter-paper-width = MVSETUP Informe a largura do papel:
.mvsetup-enter-paper-height = MVSETUP Informe a altura do papel:
.mvsetup-enter-option = MVSETUP Informe uma opção [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Informe o arranjo das janelas [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Especifique o primeiro canto da área das janelas <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Especifique o canto oposto:
.mvsetup-viewports-in-x = MVSETUP Informe o número de janelas na direção X <2>:
.mvsetup-viewports-in-y = MVSETUP Informe o número de janelas na direção Y <2>:
.mvsetup-distance-in-x = MVSETUP Especifique a distância entre janelas na direção X <0>:
.mvsetup-distance-in-y = MVSETUP Especifique a distância entre janelas na direção Y <0>:
.mvsetup-select-viewports = MVSETUP Selecione as janelas a escalar:
.mvsetup-paper-space-units = MVSETUP Informe o número de unidades do espaço do papel <1>:
.mvsetup-model-space-units = MVSETUP Informe o número de unidades do espaço do modelo <1>:
.mvsetup-viewports-do-not-fit = MVSETUP As janelas não cabem na área.
.scale-viewports-option = Escalar janelas
.active = Ativo
.inactive = Inativo
.insert-view = Inserir vista
+19
View File
@@ -4425,6 +4425,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP Выберите объекты для удаления:
.delete-objects-option = Удалить объекты
.mvsetup-enable-paper-space = MVSETUP Включить пространство листа? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Введите масштабный коэффициент <1>:
.mvsetup-enter-paper-width = MVSETUP Введите ширину листа:
.mvsetup-enter-paper-height = MVSETUP Введите высоту листа:
.mvsetup-enter-option = MVSETUP Задайте параметр [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Задайте компоновку видовых экранов [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Укажите первый угол области видовых экранов <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Укажите противоположный угол:
.mvsetup-viewports-in-x = MVSETUP Введите число видовых экранов по X <2>:
.mvsetup-viewports-in-y = MVSETUP Введите число видовых экранов по Y <2>:
.mvsetup-distance-in-x = MVSETUP Укажите расстояние между видовыми экранами по X <0>:
.mvsetup-distance-in-y = MVSETUP Укажите расстояние между видовыми экранами по Y <0>:
.mvsetup-select-viewports = MVSETUP Выберите видовые экраны для масштабирования:
.mvsetup-paper-space-units = MVSETUP Введите число единиц пространства листа <1>:
.mvsetup-model-space-units = MVSETUP Введите число единиц пространства модели <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Видовые экраны не помещаются в области.
.scale-viewports-option = Масштаб видовых экранов
.active = Включён
.inactive = неактивный
.insert-view = Включить вид
+19
View File
@@ -4382,6 +4382,25 @@ model =
.cube = Küp
layout =
.mvsetup-select-objects-to-delete = MVSETUP Silinecek nesneleri seçin:
.delete-objects-option = Nesneleri sil
.mvsetup-enable-paper-space = MVSETUP Kâğıt alanı etkinleştirilsin mi? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP Ölçek faktörünü girin <1>:
.mvsetup-enter-paper-width = MVSETUP Kâğıt genişliğini girin:
.mvsetup-enter-paper-height = MVSETUP Kâğıt yüksekliğini girin:
.mvsetup-enter-option = MVSETUP Seçenek girin [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP Görünüm penceresi düzenini girin [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP Görünüm pencereleri alanının ilk köşesini belirtin <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP Karşı köşeyi belirtin:
.mvsetup-viewports-in-x = MVSETUP X yönündeki görünüm penceresi sayısını girin <2>:
.mvsetup-viewports-in-y = MVSETUP Y yönündeki görünüm penceresi sayısını girin <2>:
.mvsetup-distance-in-x = MVSETUP X yönünde görünüm pencereleri arasındaki mesafeyi belirtin <0>:
.mvsetup-distance-in-y = MVSETUP Y yönünde görünüm pencereleri arasındaki mesafeyi belirtin <0>:
.mvsetup-select-viewports = MVSETUP Ölçeklenecek görünüm pencerelerini seçin:
.mvsetup-paper-space-units = MVSETUP Kâğıt alanı birim sayısını girin <1>:
.mvsetup-model-space-units = MVSETUP Model alanı birim sayısını girin <1>:
.mvsetup-viewports-do-not-fit = MVSETUP Görünüm pencereleri alana sığmıyor.
.scale-viewports-option = Görünüm pencerelerini ölçekle
.active = Etkin
.inactive = Etkin Değil
.insert-view = Görünüm Ekle
+19
View File
@@ -4407,6 +4407,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP 选择要删除的对象:
.delete-objects-option = 删除对象
.mvsetup-enable-paper-space = MVSETUP 启用图纸空间? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP 输入比例因子 <1>:
.mvsetup-enter-paper-width = MVSETUP 输入图纸宽度:
.mvsetup-enter-paper-height = MVSETUP 输入图纸高度:
.mvsetup-enter-option = MVSETUP 输入选项 [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP 输入视口布局 [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP 指定视口区域的第一个角点 <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP 指定对角点:
.mvsetup-viewports-in-x = MVSETUP 输入 X 方向的视口数 <2>:
.mvsetup-viewports-in-y = MVSETUP 输入 Y 方向的视口数 <2>:
.mvsetup-distance-in-x = MVSETUP 指定 X 方向的视口间距 <0>:
.mvsetup-distance-in-y = MVSETUP 指定 Y 方向的视口间距 <0>:
.mvsetup-select-viewports = MVSETUP 选择要缩放的视口:
.mvsetup-paper-space-units = MVSETUP 输入图纸空间单位数 <1>:
.mvsetup-model-space-units = MVSETUP 输入模型空间单位数 <1>:
.mvsetup-viewports-do-not-fit = MVSETUP 视口无法放入该区域。
.scale-viewports-option = 缩放视口
.active = 激活
.inactive = 不活动
.insert-view = 插入视图
+19
View File
@@ -4419,6 +4419,25 @@ model =
layout =
.mvsetup-select-objects-to-delete = MVSETUP 選擇要刪除的物件:
.delete-objects-option = 刪除物件
.mvsetup-enable-paper-space = MVSETUP 啟用圖紙空間? [No/Yes] <Y>:
.mvsetup-enter-scale-factor = MVSETUP 輸入比例係數 <1>:
.mvsetup-enter-paper-width = MVSETUP 輸入圖紙寬度:
.mvsetup-enter-paper-height = MVSETUP 輸入圖紙高度:
.mvsetup-enter-option = MVSETUP 輸入選項 [Create/Delete objects/Scale viewports]:
.mvsetup-enter-viewport-layout = MVSETUP 輸入視埠配置 [Single/Engineering/Array] <Single>:
.mvsetup-specify-first-corner = MVSETUP 指定視埠區域的第一個角點 <Sheet>:
.mvsetup-specify-opposite-corner = MVSETUP 指定對角點:
.mvsetup-viewports-in-x = MVSETUP 輸入 X 方向的視埠數 <2>:
.mvsetup-viewports-in-y = MVSETUP 輸入 Y 方向的視埠數 <2>:
.mvsetup-distance-in-x = MVSETUP 指定 X 方向的視埠間距 <0>:
.mvsetup-distance-in-y = MVSETUP 指定 Y 方向的視埠間距 <0>:
.mvsetup-select-viewports = MVSETUP 選擇要縮放的視埠:
.mvsetup-paper-space-units = MVSETUP 輸入圖紙空間單位數 <1>:
.mvsetup-model-space-units = MVSETUP 輸入模型空間單位數 <1>:
.mvsetup-viewports-do-not-fit = MVSETUP 視埠無法放入該區域。
.scale-viewports-option = 縮放視埠
.active = 激活
.inactive = 不活動
.insert-view = 插入視圖
+7
View File
@@ -882,6 +882,13 @@ impl OpenCADStudio {
CmdResult::ZoomToWindow { p1, p2 } => {
self.handle_zoom_to_window(p1, p2);
}
CmdResult::CommitAndZoom { entity, p1, p2 } => {
self.handle_commit_entities_and_exit(vec![entity], false, false);
self.handle_zoom_to_window(p1, p2);
}
CmdResult::ScaleViewports { handles, factor } => {
self.handle_scale_viewports(handles, factor);
}
CmdResult::TwistView(twist) => {
self.handle_twist_view(twist);
}
+27
View File
@@ -447,6 +447,33 @@ impl OpenCADStudio {
.push_output(crate::t!("Zoom Window").as_ref());
}
/// MVSETUP Scale viewports: each picked layout viewport shows the model
/// at `factor` paper units per model unit. One undo step.
pub(in crate::app) fn handle_scale_viewports(&mut self, handles: Vec<Handle>, factor: f64) {
let i = self.active_tab;
self.tabs[i].active_cmd = None;
self.tabs[i].snap_result = None;
let handles: Vec<Handle> = handles
.into_iter()
.filter(|handle| {
matches!(
self.tabs[i].scene.document.get_entity(*handle),
Some(codec::EntityType::Viewport(viewport)) if viewport.id > 1
)
})
.collect();
if handles.is_empty() {
return;
}
self.push_undo_snapshot(i, "MVSETUP");
for handle in handles {
self.tabs[i]
.scene
.set_viewport_scale_factor_for(handle, factor);
}
self.tabs[i].dirty = true;
}
/// 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) {
+28
View File
@@ -647,6 +647,34 @@ impl OpenCADStudio {
}
}
// MVSETUP — sheet border in model space, viewports on a layout.
"MVSETUP" => {
let scene = &mut self.tabs[i].scene;
let target = (scene.current_layout == "Model").then(|| {
scene
.layout_names()
.into_iter()
.find(|name| name != "Model")
.unwrap_or_else(|| "Layout1".to_string())
});
// The sheet MVSETUP lays viewports out on: the layout it
// switches to from model space, or the current one.
let current = target
.clone()
.map(|name| std::mem::replace(&mut scene.current_layout, name));
let paper_bounds = scene
.printable_area_limits()
.or_else(|| scene.paper_limits())
.unwrap_or(((0.0, 0.0), (297.0, 210.0)));
if let Some(current) = current {
scene.current_layout = current;
}
use crate::modules::layout::mvsetup::MvsetupCommand;
let command = MvsetupCommand::new(target, paper_bounds);
self.command_line.push_info(&command.prompt());
self.tabs[i].active_cmd = Some(Box::new(command));
}
// ── MSPACE / PSPACE ───────────────────────────────────────────
"MSPACE" => {
return Some(Task::done(Message::MspaceCommand));
+2 -2
View File
@@ -6445,10 +6445,10 @@ properties={:.1}ms picked={}",
&& self.tabs[i]
.active_cmd
.as_ref()
.is_some_and(|command| command.name() == "MVIEW");
.is_some_and(|command| matches!(command.name(), "MVIEW" | "MVSETUP"));
if context_changed {
if preserve_active_command {
// MVIEW keeps its command-owned step data, but all host-owned
// MVIEW and MVSETUP keep their step data, but all host-owned
// cursor/snap/dynamic-input state belongs to the old space.
self.reset_space_interaction_state();
}
+12
View File
@@ -1943,6 +1943,18 @@ pub enum CmdResult {
p1: DVec3,
p2: DVec3,
},
/// Commit `entity`, then zoom to the given corner points; end command.
CommitAndZoom {
entity: EntityType,
p1: DVec3,
p2: DVec3,
},
/// Scale the given layout viewports to `factor` paper units per model
/// unit; end command.
ScaleViewports {
handles: Vec<Handle>,
factor: f64,
},
/// Print a measurement result to the command line and end the command.
Measurement(String),
/// Print a measurement result and keep the command active.
+19
View File
@@ -2089,6 +2089,25 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
"MText" => Some(("common", "mtext")),
"MVIEW Specify corner of viewport or [Polygonal/Object/Fit/Insert view]:" => Some(("layout", "mview-specify-corner-of-viewport-or-polygonal")),
"MVIEW Specify opposite corner:" => Some(("layout", "mview-specify-opposite-corner")),
"MVSETUP Enable paper space? [No/Yes] <Y>:" => Some(("layout", "mvsetup-enable-paper-space")),
"MVSETUP Enter the scale factor <1>:" => Some(("layout", "mvsetup-enter-scale-factor")),
"MVSETUP Enter the paper width:" => Some(("layout", "mvsetup-enter-paper-width")),
"MVSETUP Enter the paper height:" => Some(("layout", "mvsetup-enter-paper-height")),
"MVSETUP Enter an option [Create/Delete objects/Scale viewports]:" => Some(("layout", "mvsetup-enter-option")),
"MVSETUP Select the objects to delete:" => Some(("layout", "mvsetup-select-objects-to-delete")),
"Delete objects" => Some(("layout", "delete-objects-option")),
"MVSETUP Enter viewport layout [Single/Engineering/Array] <Single>:" => Some(("layout", "mvsetup-enter-viewport-layout")),
"MVSETUP Specify first corner of bounding area for viewport(s) <Sheet>:" => Some(("layout", "mvsetup-specify-first-corner")),
"MVSETUP Specify opposite corner:" => Some(("layout", "mvsetup-specify-opposite-corner")),
"MVSETUP Enter number of viewports in X direction <2>:" => Some(("layout", "mvsetup-viewports-in-x")),
"MVSETUP Enter number of viewports in Y direction <2>:" => Some(("layout", "mvsetup-viewports-in-y")),
"MVSETUP Specify distance between viewports in X direction <0>:" => Some(("layout", "mvsetup-distance-in-x")),
"MVSETUP Specify distance between viewports in Y direction <0>:" => Some(("layout", "mvsetup-distance-in-y")),
"MVSETUP Select the viewports to scale:" => Some(("layout", "mvsetup-select-viewports")),
"MVSETUP Enter the number of paper space units <1>:" => Some(("layout", "mvsetup-paper-space-units")),
"MVSETUP Enter the number of model space units <1>:" => Some(("layout", "mvsetup-model-space-units")),
"MVSETUP The viewports do not fit in the bounding area." => Some(("layout", "mvsetup-viewports-do-not-fit")),
"Scale viewports" => Some(("layout", "scale-viewports-option")),
"MVIEW Insert view Choose a named view or [New]:" => Some(("layout", "mview-insert-view-choose-a-named-view-or-new")),
"MVIEW Insert view No named views; choose [New]:" => Some(("layout", "mview-insert-view-no-named-views-choose-new")),
"MVIEW Insert view Specify placement point:" => Some(("layout", "mview-insert-view-specify-placement-point")),
+1
View File
@@ -2,6 +2,7 @@
// This tab is only shown when the active layout is not "Model".
pub mod mview;
pub mod mvsetup;
pub mod vplayer;
use crate::modules::{CadModule, IconKind, ModuleEvent, RibbonGroup, ToolDef};
+374
View File
@@ -0,0 +1,374 @@
// MVSETUP — set a drawing up for plotting.
//
// In model space without paper space it draws the sheet border at the
// drawing scale:
// Enable paper space? [No/Yes] <Y>:
// Enter the scale factor <1>:
// Enter the paper width:
// Enter the paper height:
// On a layout it lays out viewports or scales them:
// Enter an option [Create/Delete objects/Scale viewports]:
// Enter viewport layout [Single/Engineering/Array] <Single>:
// Specify first corner of bounding area for viewport(s) <Sheet>:
// Specify opposite corner:
// Enter number of viewports in X direction <2>: (Array)
// Enter number of viewports in Y direction <2>: (Array)
// Specify distance between viewports in X direction <0>:
// Specify distance between viewports in Y direction <0>:
// Select the objects to delete:
// Select the viewports to scale:
// Enter the number of paper space units <1>:
// Enter the number of model space units <1>:
use crate::t;
use codec::entities::{LwPolyline, LwVertex, Viewport};
use codec::types::{Vector2, Vector3};
use codec::{EntityType, Handle};
use glam::{DVec2, DVec3};
use crate::command::{CadCommand, CmdOption, CmdResult};
#[derive(Clone, Copy, PartialEq)]
enum Step {
PaperSpace,
Scale,
Width,
Height,
Option,
Arrangement,
FirstCorner,
SecondCorner,
Columns,
Rows,
GapX,
GapY,
Delete,
Viewports,
PaperUnits,
ModelUnits,
}
#[derive(Clone, Copy, PartialEq)]
enum Arrangement {
Single,
Engineering,
Array,
}
pub struct MvsetupCommand {
step: Step,
/// The layout model space switches to when paper space is enabled.
layout: String,
paper_bounds: ((f64, f64), (f64, f64)),
scale: f64,
width: f64,
arrangement: Arrangement,
first: DVec2,
area: (DVec2, DVec2),
columns: u32,
rows: u32,
gap_x: f64,
picked: Vec<Handle>,
paper_units: f64,
}
impl MvsetupCommand {
/// `layout` is `None` on a layout, or the layout to switch to from model
/// space; `paper_bounds` is the sheet's printable area.
pub fn new(layout: Option<String>, paper_bounds: ((f64, f64), (f64, f64))) -> Self {
Self {
step: if layout.is_some() {
Step::PaperSpace
} else {
Step::Option
},
layout: layout.unwrap_or_default(),
paper_bounds,
scale: 1.0,
width: 0.0,
arrangement: Arrangement::Single,
first: DVec2::ZERO,
area: (DVec2::ZERO, DVec2::ZERO),
columns: 2,
rows: 2,
gap_x: 0.0,
picked: Vec::new(),
paper_units: 1.0,
}
}
fn after_area(&mut self) -> CmdResult {
self.step = match self.arrangement {
Arrangement::Single => return self.create(0.0),
Arrangement::Engineering => Step::GapX,
Arrangement::Array => Step::Columns,
};
CmdResult::NeedPoint
}
/// The viewports of the chosen arrangement, `gap_y` apart vertically.
fn create(&self, gap_y: f64) -> CmdResult {
let (columns, rows, gap_x) = match self.arrangement {
Arrangement::Single => (1, 1, 0.0),
Arrangement::Engineering => (2, 2, self.gap_x),
Arrangement::Array => (self.columns, self.rows, self.gap_x),
};
let (min, max) = self.area;
let width = (max.x - min.x - gap_x * (columns - 1) as f64) / columns as f64;
let height = (max.y - min.y - gap_y * (rows - 1) as f64) / rows as f64;
if width <= 1e-6 || height <= 1e-6 {
return CmdResult::ReportError(
t!("MVSETUP The viewports do not fit in the bounding area.").into_owned(),
);
}
// Engineering: top view over front view, right view beside it, and
// an isometric view in the remaining corner.
let directions = [
Vector3::new(0.0, 0.0, 1.0),
Vector3::new(1.0, -1.0, 1.0),
Vector3::new(0.0, -1.0, 0.0),
Vector3::new(1.0, 0.0, 0.0),
];
let mut viewports = Vec::new();
for row in 0..rows {
for column in 0..columns {
let mut viewport = Viewport::new();
viewport.center = Vector3::new(
min.x + column as f64 * (width + gap_x) + width / 2.0,
max.y - row as f64 * (height + gap_y) - height / 2.0,
0.0,
);
viewport.width = width;
viewport.height = height;
viewport.id = 2;
if self.arrangement == Arrangement::Engineering {
viewport.view_direction = directions[(row * 2 + column) as usize].clone();
}
viewports.push(EntityType::Viewport(viewport));
}
}
CmdResult::CommitEntitiesAndExit(viewports)
}
fn sheet_border(&self, height: f64) -> CmdResult {
let (width, height) = (self.width * self.scale, height * self.scale);
let mut border = LwPolyline::new();
border.is_closed = true;
border.vertices = [(0.0, 0.0), (width, 0.0), (width, height), (0.0, height)]
.into_iter()
.map(|(x, y)| LwVertex::new(Vector2::new(x, y)))
.collect();
CmdResult::CommitAndZoom {
entity: EntityType::LwPolyline(border),
p1: DVec3::ZERO,
p2: DVec3::new(width, height, 0.0),
}
}
}
/// A positive number, or `default` for an empty answer.
fn positive(text: &str, default: f64) -> Option<f64> {
if text.is_empty() {
return Some(default);
}
crate::entities::common::parse_typed_length(text).filter(|value| *value > 0.0)
}
impl CadCommand for MvsetupCommand {
fn name(&self) -> &'static str {
"MVSETUP"
}
fn prompt(&self) -> String {
t!(match self.step {
Step::PaperSpace => "MVSETUP Enable paper space? [No/Yes] <Y>:",
Step::Scale => "MVSETUP Enter the scale factor <1>:",
Step::Width => "MVSETUP Enter the paper width:",
Step::Height => "MVSETUP Enter the paper height:",
Step::Option => "MVSETUP Enter an option [Create/Delete objects/Scale viewports]:",
Step::Arrangement => {
"MVSETUP Enter viewport layout [Single/Engineering/Array] <Single>:"
}
Step::FirstCorner => {
"MVSETUP Specify first corner of bounding area for viewport(s) <Sheet>:"
}
Step::SecondCorner => "MVSETUP Specify opposite corner:",
Step::Columns => "MVSETUP Enter number of viewports in X direction <2>:",
Step::Rows => "MVSETUP Enter number of viewports in Y direction <2>:",
Step::GapX => "MVSETUP Specify distance between viewports in X direction <0>:",
Step::GapY => "MVSETUP Specify distance between viewports in Y direction <0>:",
Step::Delete => "MVSETUP Select the objects to delete:",
Step::Viewports => "MVSETUP Select the viewports to scale:",
Step::PaperUnits => "MVSETUP Enter the number of paper space units <1>:",
Step::ModelUnits => "MVSETUP Enter the number of model space units <1>:",
})
.into_owned()
}
fn options(&self) -> Vec<CmdOption> {
match self.step {
Step::PaperSpace => vec![CmdOption::new("No", "N"), CmdOption::new("Yes", "Y")],
Step::Option => vec![
CmdOption::new("Create", "C"),
CmdOption::new("Delete objects", "D"),
CmdOption::new("Scale viewports", "S"),
],
Step::Arrangement => vec![
CmdOption::new("Single", "S"),
CmdOption::new("Engineering", "E"),
CmdOption::new("Array", "A"),
],
_ => Vec::new(),
}
}
fn wants_text_input(&self) -> bool {
!matches!(self.step, Step::Delete | Step::Viewports)
}
fn needs_entity_pick(&self) -> bool {
matches!(self.step, Step::Delete | Step::Viewports)
}
fn entity_pick_highlights_hover(&self) -> bool {
true
}
fn on_entity_pick(&mut self, handle: Handle, _pt: DVec3) -> CmdResult {
if !handle.is_null() && !self.picked.contains(&handle) {
self.picked.push(handle);
}
CmdResult::NeedPoint
}
fn on_text_input(&mut self, text: &str) -> Option<CmdResult> {
let text = text.trim();
let word = text.trim_start_matches('_').to_ascii_uppercase();
match self.step {
Step::PaperSpace => match word.as_str() {
"N" | "NO" => self.step = Step::Scale,
"" | "Y" | "YES" => {
self.step = Step::Option;
return Some(CmdResult::MviewSwitchLayout(self.layout.clone()));
}
_ => return None,
},
Step::Scale => {
self.scale = positive(text, 1.0)?;
self.step = Step::Width;
}
Step::Width => {
self.width = positive(text, f64::NAN).filter(|value| value.is_finite())?;
self.step = Step::Height;
}
Step::Height => {
let height = positive(text, f64::NAN).filter(|value| value.is_finite())?;
return Some(self.sheet_border(height));
}
Step::Option => match word.as_str() {
"C" | "CREATE" => self.step = Step::Arrangement,
"D" | "DELETE" => self.step = Step::Delete,
"S" | "SCALE" => self.step = Step::Viewports,
_ => return None,
},
Step::Arrangement => {
self.arrangement = match word.as_str() {
"" | "S" | "SINGLE" | "1" => Arrangement::Single,
"E" | "ENGINEERING" | "2" => Arrangement::Engineering,
"A" | "ARRAY" | "3" => Arrangement::Array,
_ => return None,
};
self.step = Step::FirstCorner;
}
Step::FirstCorner if text.is_empty() => {
let ((x0, y0), (x1, y1)) = self.paper_bounds;
self.area = (
DVec2::new(x0.min(x1), y0.min(y1)),
DVec2::new(x0.max(x1), y0.max(y1)),
);
return Some(self.after_area());
}
Step::Columns | Step::Rows => {
let count = if text.is_empty() {
2
} else {
text.parse::<u32>().ok().filter(|count| (1..=100).contains(count))?
};
if self.step == Step::Columns {
self.columns = count;
self.step = Step::Rows;
} else {
self.rows = count;
self.step = Step::GapX;
}
}
Step::GapX | Step::GapY => {
let gap = if text.is_empty() {
0.0
} else {
crate::entities::common::parse_typed_length(text).filter(|v| *v >= 0.0)?
};
if self.step == Step::GapY {
return Some(self.create(gap));
}
self.gap_x = gap;
self.step = Step::GapY;
}
Step::PaperUnits => {
self.paper_units = positive(text, 1.0)?;
self.step = Step::ModelUnits;
}
Step::ModelUnits => {
let model_units = positive(text, 1.0)?;
return Some(CmdResult::ScaleViewports {
handles: std::mem::take(&mut self.picked),
factor: self.paper_units / model_units,
});
}
Step::FirstCorner | Step::SecondCorner | Step::Delete | Step::Viewports => {
return None
}
}
Some(CmdResult::NeedPoint)
}
fn on_point(&mut self, pt: DVec3) -> CmdResult {
match self.step {
Step::FirstCorner => {
self.first = pt.truncate();
self.step = Step::SecondCorner;
CmdResult::NeedPoint
}
Step::SecondCorner => {
let second = pt.truncate();
self.area = (self.first.min(second), self.first.max(second));
self.after_area()
}
_ => CmdResult::NeedPoint,
}
}
fn on_enter(&mut self) -> CmdResult {
match self.step {
Step::Delete => {
self.step = Step::Option;
let erased = std::mem::take(&mut self.picked);
if erased.is_empty() {
return CmdResult::NeedPoint;
}
CmdResult::ReplaceManyContinue(
erased.into_iter().map(|handle| (handle, Vec::new())).collect(),
)
}
Step::Viewports if self.picked.is_empty() => CmdResult::Cancel,
Step::Viewports => {
self.step = Step::PaperUnits;
CmdResult::NeedPoint
}
Step::Option | Step::Width | Step::Height | Step::SecondCorner => CmdResult::Cancel,
_ => self.on_text_input("").unwrap_or(CmdResult::NeedPoint),
}
}
}
inventory::submit!(crate::command::CommandRegistration { names: &["MVSETUP"] });
+41 -8
View File
@@ -6656,6 +6656,12 @@ impl Scene {
let Some(viewport) = self.explicit_viewport_handle() else {
return false;
};
self.set_viewport_scale_factor_for(viewport, factor)
}
/// Scale `viewport` to `factor` paper units per model unit, as
/// [`Self::set_viewport_scale_factor`] does for the active one.
pub fn set_viewport_scale_factor_for(&mut self, viewport: Handle, factor: f64) -> bool {
let unit_factor = self.annotation_scale_unit_factor();
let named = self
.document
@@ -12990,22 +12996,49 @@ vis_index={:.1} visible_probe={:.1}",
Some(e) => e,
None => return,
};
let (min, max) = (min.as_dvec3(), max.as_dvec3());
let center = (min + max) * 0.5;
let content_w = (max.x - min.x).max(1e-3);
let content_h = (max.y - min.y).max(1e-3);
let vp = match self.document.get_entity_mut(vp_handle) {
Some(codec::EntityType::Viewport(vp)) => vp,
_ => return,
};
// Set the view target to the model-space centroid (XY plane, z=0).
vp.view_target.x = center.x as f64;
vp.view_target.y = center.y as f64;
vp.view_target.z = 0.0;
let direction = glam::DVec3::new(
vp.view_direction.x,
vp.view_direction.y,
vp.view_direction.z,
)
.normalize_or(glam::DVec3::Z);
// The extents box as seen along the view direction: its span across
// the view's right and up axes. Looking down Z that is its X/Y size.
let right = glam::DVec3::Z.cross(direction).normalize_or(glam::DVec3::X);
let up = direction.cross(right);
let (mut span_right, mut span_up) = ((f64::MAX, f64::MIN), (f64::MAX, f64::MIN));
for corner in 0..8 {
let point = glam::DVec3::new(
if corner & 1 == 0 { min.x } else { max.x },
if corner & 2 == 0 { min.y } else { max.y },
if corner & 4 == 0 { min.z } else { max.z },
);
let (along_right, along_up) = (point.dot(right), point.dot(up));
span_right = (span_right.0.min(along_right), span_right.1.max(along_right));
span_up = (span_up.0.min(along_up), span_up.1.max(along_up));
}
let content_w = (span_right.1 - span_right.0).max(1e-3);
let content_h = (span_up.1 - span_up.0).max(1e-3);
// Aim at the model's centre; a plan view keeps it on the XY plane.
vp.view_target.x = center.x;
vp.view_target.y = center.y;
vp.view_target.z = if direction == glam::DVec3::Z {
0.0
} else {
center.z
};
// Choose the scale that fits both dimensions with the margin.
let scale_w = vp.width / (content_w as f64 * margin);
let scale_h = vp.height / (content_h as f64 * margin);
let scale_w = vp.width / (content_w * margin);
let scale_h = vp.height / (content_h * margin);
let fit_scale = scale_w.min(scale_h).min(1000.0).max(1e-6);
vp.custom_scale = fit_scale;