forked from 1b-agent/opencadstudio-upstream
feat(3drotate): rotate about an axis picked in space
3DROTATE (ROTATE3D) took the drawing's rotation path, so a polyline only turned in its own plane. It now asks for a base point, an axis — X, Y, Z or a second point — and an angle, and rotates the selection about that axis in space. Fixes #1641 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e854481f72
commit
f485df7636
24 files changed
+170
-16
No files matched your search
@@ -2349,6 +2349,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: تم نقل __ocs_fmt_0__ كائن إلى فضاء الورق.
|
.chspace-to-paper = CHSPACE: تم نقل __ocs_fmt_0__ كائن إلى فضاء الورق.
|
||||||
.chspace-to-model = CHSPACE: تم نقل __ocs_fmt_0__ كائن إلى فضاء النموذج.
|
.chspace-to-model = CHSPACE: تم نقل __ocs_fmt_0__ كائن إلى فضاء النموذج.
|
||||||
.select-template-title = تحديد قالب
|
.select-template-title = تحديد قالب
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE حدد نقطة الأساس [__ocs_arg_count__ كائنات]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE حدد محور الدوران [X/Y/Z] أو نقطة ثانية عليه <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE حدد زاوية الدوران <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = تحذير الحفظ
|
.save-warning = تحذير الحفظ
|
||||||
.unable-to-save-drawing = تعذر حفظ الرسم
|
.unable-to-save-drawing = تعذر حفظ الرسم
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ обекта преместени в пространството на листа.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ обекта преместени в пространството на листа.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ обекта преместени в пространството на модела.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ обекта преместени в пространството на модела.
|
||||||
.select-template-title = Избор на шаблон
|
.select-template-title = Избор на шаблон
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Посочи базова точка [__ocs_arg_count__ обекта]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Посочете ос на завъртане [X/Y/Z] или втора точка от нея <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Посочи ъгъл на завъртане <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Предупреждение при запазване
|
.save-warning = Предупреждение при запазване
|
||||||
.unable-to-save-drawing = Чертежът не може да бъде запазен
|
.unable-to-save-drawing = Чертежът не може да бъде запазен
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektů přesunuto do výkresového prostoru.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektů přesunuto do výkresového prostoru.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektů přesunuto do modelového prostoru.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektů přesunuto do modelového prostoru.
|
||||||
.select-template-title = Vybrat šablonu
|
.select-template-title = Vybrat šablonu
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Zadejte základní bod [objekty __ocs_arg_count__]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Zadejte osu otáčení [X/Y/Z] nebo druhý bod na ní <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Zadejte úhel natočení <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Uložit varování
|
.save-warning = Uložit varování
|
||||||
.unable-to-save-drawing = Nákres nelze uložit
|
.unable-to-save-drawing = Nákres nelze uložit
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ Objekt(e) in den Papierbereich verschoben.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ Objekt(e) in den Papierbereich verschoben.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ Objekt(e) in den Modellbereich verschoben.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ Objekt(e) in den Modellbereich verschoben.
|
||||||
.select-template-title = Vorlage auswählen
|
.select-template-title = Vorlage auswählen
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Basispunkt angeben [__ocs_arg_count__ Objekte]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Drehachse angeben [X/Y/Z] oder einen zweiten Punkt darauf <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Drehwinkel angeben <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Warnhinweise speichern
|
.save-warning = Warnhinweise speichern
|
||||||
.unable-to-save-drawing = Zeichnung konnte nicht gespeichert werden
|
.unable-to-save-drawing = Zeichnung konnte nicht gespeichert werden
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ αντικείμενα μεταφέρθηκαν στον χώρο χαρτιού.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ αντικείμενα μεταφέρθηκαν στον χώρο χαρτιού.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ αντικείμενα μεταφέρθηκαν στον χώρο μοντέλου.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ αντικείμενα μεταφέρθηκαν στον χώρο μοντέλου.
|
||||||
.select-template-title = Επιλογή προτύπου
|
.select-template-title = Επιλογή προτύπου
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Ορίστε σημείο βάσης [__ocs_arg_count__ αντικείμενα]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Ορίστε άξονα περιστροφής [X/Y/Z] ή δεύτερο σημείο του <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Ορίστε γωνία περιστροφής <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Προειδοποίηση αποθήκευσης
|
.save-warning = Προειδοποίηση αποθήκευσης
|
||||||
.unable-to-save-drawing = Αδυναμία αποθήκευσης σχεδίου
|
.unable-to-save-drawing = Αδυναμία αποθήκευσης σχεδίου
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ object(s) changed to paper space.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ object(s) changed to paper space.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ object(s) changed to model space.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ object(s) changed to model space.
|
||||||
.select-template-title = Select Template
|
.select-template-title = Select Template
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Specify base point [__ocs_arg_count__ objects]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Specify rotation axis [X/Y/Z] or a second point on it <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Specify rotation angle <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Save Warning
|
.save-warning = Save Warning
|
||||||
.unable-to-save-drawing = Unable to Save Drawing
|
.unable-to-save-drawing = Unable to Save Drawing
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objeto(s) pasado(s) al espacio papel.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objeto(s) pasado(s) al espacio papel.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objeto(s) pasado(s) al espacio modelo.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objeto(s) pasado(s) al espacio modelo.
|
||||||
.select-template-title = Seleccionar plantilla
|
.select-template-title = Seleccionar plantilla
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Especifique el punto base [__ocs_arg_count__ objetos]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Precise el eje de giro [X/Y/Z] o un segundo punto en él <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Precise el ángulo de giro <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Advertencia de guardado
|
.save-warning = Advertencia de guardado
|
||||||
.unable-to-save-drawing = No se puede guardar el dibujo
|
.unable-to-save-drawing = No se puede guardar el dibujo
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektia siirretty paperitilaan.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektia siirretty paperitilaan.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektia siirretty mallitilaan.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektia siirretty mallitilaan.
|
||||||
.select-template-title = Valitse malli
|
.select-template-title = Valitse malli
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Määritä peruspiste [__ocs_arg_count__ objektit]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Määritä kiertoakseli [X/Y/Z] tai sen toinen piste <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Määritä kiertokulma <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Tallenna varoitus
|
.save-warning = Tallenna varoitus
|
||||||
.unable-to-save-drawing = Piirustusta ei voi tallentaa
|
.unable-to-save-drawing = Piirustusta ei voi tallentaa
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE : __ocs_fmt_0__ objet(s) déplacé(s) dans l'espace papier.
|
.chspace-to-paper = CHSPACE : __ocs_fmt_0__ objet(s) déplacé(s) dans l'espace papier.
|
||||||
.chspace-to-model = CHSPACE : __ocs_fmt_0__ objet(s) déplacé(s) dans l'espace objet.
|
.chspace-to-model = CHSPACE : __ocs_fmt_0__ objet(s) déplacé(s) dans l'espace objet.
|
||||||
.select-template-title = Sélectionner un gabarit
|
.select-template-title = Sélectionner un gabarit
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Spécifier le point de base [__ocs_arg_count__ objets]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Spécifiez l'axe de rotation [X/Y/Z] ou un second point sur celui-ci <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Spécifier l'angle de rotation <__ocs_arg_a__:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Enregistrer l' avertissement
|
.save-warning = Enregistrer l' avertissement
|
||||||
.unable-to-save-drawing = Impossible de sauvegarder le dessin
|
.unable-to-save-drawing = Impossible de sauvegarder le dessin
|
||||||
|
|||||||
@@ -2325,6 +2325,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ ऑब्जेक्ट पेपर स्पेस में बदले गए।
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ ऑब्जेक्ट पेपर स्पेस में बदले गए।
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ ऑब्जेक्ट मॉडल स्पेस में बदले गए।
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ ऑब्जेक्ट मॉडल स्पेस में बदले गए।
|
||||||
.select-template-title = टेम्पलेट चुनें
|
.select-template-title = टेम्पलेट चुनें
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE आधार बिंदु निर्दिष्ट करें [__ocs_arg_count__ ऑब्जेक्ट]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE घूर्णन अक्ष [X/Y/Z] या उस पर दूसरा बिंदु निर्दिष्ट करें <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE घूर्णन कोण को निर्दिष्ट करें <__ocs_arg_a__:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = चेतावनी सहेजें
|
.save-warning = चेतावनी सहेजें
|
||||||
.unable-to-save-drawing = ड्रॉइंग सहेजी नहीं जा सकी
|
.unable-to-save-drawing = ड्रॉइंग सहेजी नहीं जा सकी
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektum papírtérbe helyezve.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objektum papírtérbe helyezve.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektum modelltérbe helyezve.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objektum modelltérbe helyezve.
|
||||||
.select-template-title = Sablon kiválasztása
|
.select-template-title = Sablon kiválasztása
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Alappont megadása [__ocs_arg_count__ objektumok]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Adja meg a forgástengelyt [X/Y/Z] vagy egy második pontját <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Forgatási szög megadása <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Figyelmeztetés mentése
|
.save-warning = Figyelmeztetés mentése
|
||||||
.unable-to-save-drawing = Nem sikerült menteni a rajzot
|
.unable-to-save-drawing = Nem sikerült menteni a rajzot
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ oggetto/i spostato/i nello spazio carta.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ oggetto/i spostato/i nello spazio carta.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ oggetto/i spostato/i nello spazio modello.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ oggetto/i spostato/i nello spazio modello.
|
||||||
.select-template-title = Seleziona modello
|
.select-template-title = Seleziona modello
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Specificare il punto base [oggetti __ocs_arg_count__]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Specificare l'asse di rotazione [X/Y/Z] o un secondo punto su di esso <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Specificare l'angolo di rotazione <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Salva avviso
|
.save-warning = Salva avviso
|
||||||
.unable-to-save-drawing = Impossibile salvare il disegno
|
.unable-to-save-drawing = Impossibile salvare il disegno
|
||||||
|
|||||||
@@ -2327,6 +2327,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ 個のオブジェクトをペーパー空間に移動しました。
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ 個のオブジェクトをペーパー空間に移動しました。
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ 個のオブジェクトをモデル空間に移動しました。
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ 個のオブジェクトをモデル空間に移動しました。
|
||||||
.select-template-title = テンプレートを選択
|
.select-template-title = テンプレートを選択
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE 基点を指定 [__ocs_arg_count__ 個]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE 回転軸 [X/Y/Z] または軸上の 2 点目を指定 <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE 回転角度を指定 <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = 保存の警告
|
.save-warning = 保存の警告
|
||||||
.unable-to-save-drawing = 図面を保存できません
|
.unable-to-save-drawing = 図面を保存できません
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: 객체 __ocs_fmt_0__개를 도면 공간으로 옮겼습니다.
|
.chspace-to-paper = CHSPACE: 객체 __ocs_fmt_0__개를 도면 공간으로 옮겼습니다.
|
||||||
.chspace-to-model = CHSPACE: 객체 __ocs_fmt_0__개를 모형 공간으로 옮겼습니다.
|
.chspace-to-model = CHSPACE: 객체 __ocs_fmt_0__개를 모형 공간으로 옮겼습니다.
|
||||||
.select-template-title = 템플릿 선택
|
.select-template-title = 템플릿 선택
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE 기준점 지정 [__ocs_arg_count__ 객체]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE 회전 축 [X/Y/Z] 또는 축 위의 두 번째 점 지정 <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE 회전 각도 <__ocs_arg_a__> 지정:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = 경고 저장
|
.save-warning = 경고 저장
|
||||||
.unable-to-save-drawing = 도면을 저장할 수 없습니다
|
.unable-to-save-drawing = 도면을 저장할 수 없습니다
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ object(en) naar de papierruimte verplaatst.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ object(en) naar de papierruimte verplaatst.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ object(en) naar de modelruimte verplaatst.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ object(en) naar de modelruimte verplaatst.
|
||||||
.select-template-title = Sjabloon selecteren
|
.select-template-title = Sjabloon selecteren
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Basispunt [__ocs_arg_count__ objecten] opgeven:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Geef de rotatieas op [X/Y/Z] of een tweede punt erop <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Rotatiehoek <__ocs_arg_a__> opgeven:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Waarschuwing opslaan
|
.save-warning = Waarschuwing opslaan
|
||||||
.unable-to-save-drawing = Kan tekening niet opslaan
|
.unable-to-save-drawing = Kan tekening niet opslaan
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: przeniesiono obiekty do obszaru papieru: __ocs_fmt_0__.
|
.chspace-to-paper = CHSPACE: przeniesiono obiekty do obszaru papieru: __ocs_fmt_0__.
|
||||||
.chspace-to-model = CHSPACE: przeniesiono obiekty do obszaru modelu: __ocs_fmt_0__.
|
.chspace-to-model = CHSPACE: przeniesiono obiekty do obszaru modelu: __ocs_fmt_0__.
|
||||||
.select-template-title = Wybierz szablon
|
.select-template-title = Wybierz szablon
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Określ punkt bazowy [obiekty __ocs_arg_count__]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Określ oś obrotu [X/Y/Z] lub drugi punkt na niej <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Określ kąt obrotu <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Zapisz ostrzeżenie
|
.save-warning = Zapisz ostrzeżenie
|
||||||
.unable-to-save-drawing = Nie można zapisać rysunku
|
.unable-to-save-drawing = Nie można zapisać rysunku
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objeto(s) movido(s) para o espaço do papel.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ objeto(s) movido(s) para o espaço do papel.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objeto(s) movido(s) para o espaço do modelo.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ objeto(s) movido(s) para o espaço do modelo.
|
||||||
.select-template-title = Selecionar modelo
|
.select-template-title = Selecionar modelo
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Especifique o ponto base [__ocs_arg_count__ objetos]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Especifique o eixo de rotação [X/Y/Z] ou um segundo ponto nele <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Especifique o ângulo de rotação <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Aviso de salvamento
|
.save-warning = Aviso de salvamento
|
||||||
.unable-to-save-drawing = Não foi possível salvar o desenho
|
.unable-to-save-drawing = Não foi possível salvar o desenho
|
||||||
|
|||||||
@@ -2340,6 +2340,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: перенесено в пространство листа объектов: __ocs_fmt_0__.
|
.chspace-to-paper = CHSPACE: перенесено в пространство листа объектов: __ocs_fmt_0__.
|
||||||
.chspace-to-model = CHSPACE: перенесено в пространство модели объектов: __ocs_fmt_0__.
|
.chspace-to-model = CHSPACE: перенесено в пространство модели объектов: __ocs_fmt_0__.
|
||||||
.select-template-title = Выбор шаблона
|
.select-template-title = Выбор шаблона
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Укажите базовую точку [__ocs_arg_count__ объекты]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Укажите ось поворота [X/Y/Z] или вторую точку на ней <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Укажите угол поворота <__ocs_arg_a__>
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Спасти предостережение
|
.save-warning = Спасти предостережение
|
||||||
.unable-to-save-drawing = Не удалось сохранить чертёж
|
.unable-to-save-drawing = Не удалось сохранить чертёж
|
||||||
|
|||||||
@@ -2321,6 +2321,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ nesne kağıt alanına taşındı.
|
.chspace-to-paper = CHSPACE: __ocs_fmt_0__ nesne kağıt alanına taşındı.
|
||||||
.chspace-to-model = CHSPACE: __ocs_fmt_0__ nesne model alanına taşındı.
|
.chspace-to-model = CHSPACE: __ocs_fmt_0__ nesne model alanına taşındı.
|
||||||
.select-template-title = Şablon Seç
|
.select-template-title = Şablon Seç
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE Taban noktasını belirtin [__ocs_arg_count__ nesne]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE Döndürme eksenini [X/Y/Z] ya da eksen üzerinde ikinci bir noktayı belirtin <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE Döndürme açısını belirtin <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = Kaydetme Uyarısı
|
.save-warning = Kaydetme Uyarısı
|
||||||
.unable-to-save-drawing = Çizim Kaydedilemiyor
|
.unable-to-save-drawing = Çizim Kaydedilemiyor
|
||||||
|
|||||||
@@ -2324,6 +2324,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: 已将 __ocs_fmt_0__ 个对象移到图纸空间。
|
.chspace-to-paper = CHSPACE: 已将 __ocs_fmt_0__ 个对象移到图纸空间。
|
||||||
.chspace-to-model = CHSPACE: 已将 __ocs_fmt_0__ 个对象移到模型空间。
|
.chspace-to-model = CHSPACE: 已将 __ocs_fmt_0__ 个对象移到模型空间。
|
||||||
.select-template-title = 选择样板
|
.select-template-title = 选择样板
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE 指定基点 [__ocs_arg_count__ 个对象]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE 指定旋转轴 [X/Y/Z] 或轴上的第二点 <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE 指定旋转角度 <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = 保存警告
|
.save-warning = 保存警告
|
||||||
.unable-to-save-drawing = 无法保存图形
|
.unable-to-save-drawing = 无法保存图形
|
||||||
|
|||||||
@@ -2336,6 +2336,9 @@ common =
|
|||||||
.chspace-to-paper = CHSPACE: 已將 __ocs_fmt_0__ 個物件移到圖紙空間。
|
.chspace-to-paper = CHSPACE: 已將 __ocs_fmt_0__ 個物件移到圖紙空間。
|
||||||
.chspace-to-model = CHSPACE: 已將 __ocs_fmt_0__ 個物件移到模型空間。
|
.chspace-to-model = CHSPACE: 已將 __ocs_fmt_0__ 個物件移到模型空間。
|
||||||
.select-template-title = 選取樣板
|
.select-template-title = 選取樣板
|
||||||
|
.threedrotate-specify-base-point-count-objects = 3DROTATE 指定基點 [__ocs_arg_count__ 個物件]:
|
||||||
|
.threedrotate-specify-rotation-axis = 3DROTATE 指定旋轉軸 [X/Y/Z] 或軸上的第二點 <Z>:
|
||||||
|
.threedrotate-specify-rotation-angle-a = 3DROTATE 指定旋轉角度 <__ocs_arg_a__>:
|
||||||
errors =
|
errors =
|
||||||
.save-warning = 儲存警告
|
.save-warning = 儲存警告
|
||||||
.unable-to-save-drawing = 無法儲存圖形
|
.unable-to-save-drawing = 無法儲存圖形
|
||||||
|
|||||||
+19
-14
@@ -2484,21 +2484,26 @@ impl OpenCADStudio {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3DROTATE [X|Y|Z] <angle> — rotate the selected solid about an axis.
|
// 3DROTATE [X|Y|Z] <angle> — rotate the selected solid about an axis.
|
||||||
|
// 3DROTATE — any objects about an axis through a base point.
|
||||||
"3DROTATE" | "ROTATE3D" => {
|
"3DROTATE" | "ROTATE3D" => {
|
||||||
use crate::command::SelectThenKeywordCommand;
|
let handles: Vec<_> = self.tabs[i]
|
||||||
let has_sel = !self.tabs[i].scene.selected_entities().is_empty();
|
.scene
|
||||||
let c = SelectThenKeywordCommand::new(
|
.selected_entities()
|
||||||
"3DROTATE",
|
.into_iter()
|
||||||
"3DROTATE rotation axis [X / Y / Z]:",
|
.map(|(h, _)| h)
|
||||||
vec![
|
.collect();
|
||||||
("X", "X", Some("3DROTATE angle in degrees:")),
|
if handles.is_empty() {
|
||||||
("Y", "Y", Some("3DROTATE angle in degrees:")),
|
use crate::modules::draw::select::SelectObjectsCommand;
|
||||||
("Z", "Z", Some("3DROTATE angle in degrees:")),
|
let cmd = SelectObjectsCommand::new("3DROTATE");
|
||||||
],
|
self.command_line.push_info(&cmd.prompt());
|
||||||
has_sel,
|
self.tabs[i].active_cmd = Some(Box::new(cmd));
|
||||||
);
|
} else {
|
||||||
self.command_line.push_info(&c.prompt());
|
use crate::modules::draw::modify::rotate::RotateCommand;
|
||||||
self.tabs[i].active_cmd = Some(Box::new(c));
|
let wires = self.tabs[i].scene.wire_models_for(&handles);
|
||||||
|
let new_cmd = RotateCommand::new_3d(handles, wires);
|
||||||
|
self.command_line.push_info(&new_cmd.prompt());
|
||||||
|
self.tabs[i].active_cmd = Some(Box::new(new_cmd));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cmd if cmd.starts_with("3DROTATE ") || cmd.starts_with("ROTATE3D ") => {
|
cmd if cmd.starts_with("3DROTATE ") || cmd.starts_with("ROTATE3D ") => {
|
||||||
let parts: Vec<String> = cmd
|
let parts: Vec<String> = cmd
|
||||||
|
|||||||
@@ -4878,6 +4878,9 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
|
|||||||
"Unknown command: {}" => Some(("command", "unknown-command-cmd")),
|
"Unknown command: {}" => Some(("command", "unknown-command-cmd")),
|
||||||
"Unsaved changes will be discarded." => Some(("common", "unsaved-changes-will-be-discarded")),
|
"Unsaved changes will be discarded." => Some(("common", "unsaved-changes-will-be-discarded")),
|
||||||
"Discard & close" => Some(("common", "discard-close")),
|
"Discard & close" => Some(("common", "discard-close")),
|
||||||
|
"3DROTATE Specify base point [%{count} objects]:" => Some(("common", "threedrotate-specify-base-point-count-objects")),
|
||||||
|
"3DROTATE Specify rotation axis [X/Y/Z] or a second point on it <Z>:" => Some(("common", "threedrotate-specify-rotation-axis")),
|
||||||
|
"3DROTATE Specify rotation angle <%{a}>:" => Some(("common", "threedrotate-specify-rotation-angle-a")),
|
||||||
"Select Template" => Some(("common", "select-template-title")),
|
"Select Template" => Some(("common", "select-template-title")),
|
||||||
"CHSPACE: Command not allowed in the Model tab." => Some(("common", "chspace-model-tab")),
|
"CHSPACE: Command not allowed in the Model tab." => Some(("common", "chspace-model-tab")),
|
||||||
"CHSPACE: No plan-view viewport to change space through." => Some(("common", "chspace-no-viewport")),
|
"CHSPACE: No plan-view viewport to change space through." => Some(("common", "chspace-no-viewport")),
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ pub fn tool() -> ToolDef {
|
|||||||
|
|
||||||
enum Step {
|
enum Step {
|
||||||
Center,
|
Center,
|
||||||
|
/// 3DROTATE: the axis through the base point.
|
||||||
|
Axis { center: DVec3 },
|
||||||
Angle { center: DVec3 },
|
Angle { center: DVec3 },
|
||||||
RefFirst { center: DVec3 },
|
RefFirst { center: DVec3 },
|
||||||
RefSecond { center: DVec3, first: DVec3 },
|
RefSecond { center: DVec3, first: DVec3 },
|
||||||
@@ -48,6 +50,11 @@ pub struct RotateCommand {
|
|||||||
step: Step,
|
step: Step,
|
||||||
default_angle: f64, // degrees
|
default_angle: f64, // degrees
|
||||||
plane: WorkingPlane,
|
plane: WorkingPlane,
|
||||||
|
/// 3DROTATE: ask for the axis, then measure the angle in the plane square
|
||||||
|
/// to it.
|
||||||
|
spatial: bool,
|
||||||
|
/// The plane is the one square to the chosen axis, not the UCS.
|
||||||
|
axis_chosen: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RotateCommand {
|
impl RotateCommand {
|
||||||
@@ -58,9 +65,35 @@ impl RotateCommand {
|
|||||||
step: Step::Center,
|
step: Step::Center,
|
||||||
default_angle: defaults::get_rotate_angle(),
|
default_angle: defaults::get_rotate_angle(),
|
||||||
plane: WorkingPlane::default(),
|
plane: WorkingPlane::default(),
|
||||||
|
spatial: false,
|
||||||
|
axis_chosen: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 3DROTATE: any objects, about any axis through a base point.
|
||||||
|
pub fn new_3d(handles: Vec<Handle>, wire_models: Vec<WireModel>) -> Self {
|
||||||
|
Self { spatial: true, ..Self::new(handles, wire_models) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Turn about `axis` through `center`: the angle is then read in the plane
|
||||||
|
/// square to it, so every later step works as in a plain rotation.
|
||||||
|
fn choose_axis(&mut self, center: DVec3, axis: DVec3) -> CmdResult {
|
||||||
|
let Some(axis) = axis.try_normalize() else {
|
||||||
|
return CmdResult::NeedPoint;
|
||||||
|
};
|
||||||
|
// The UCS X laid into that plane, or Y when X runs along the axis.
|
||||||
|
let reference = [self.plane.x, self.plane.y]
|
||||||
|
.into_iter()
|
||||||
|
.map(|direction| direction - axis * direction.dot(axis))
|
||||||
|
.find(|direction| direction.length() > 1e-6)
|
||||||
|
.unwrap_or(DVec3::X);
|
||||||
|
let x = reference.normalize();
|
||||||
|
self.plane = WorkingPlane::new(center, x, axis.cross(x));
|
||||||
|
self.axis_chosen = true;
|
||||||
|
self.step = Step::Angle { center };
|
||||||
|
CmdResult::NeedPoint
|
||||||
|
}
|
||||||
|
|
||||||
fn commit(&self, center: DVec3, angle_rad: f64) -> CmdResult {
|
fn commit(&self, center: DVec3, angle_rad: f64) -> CmdResult {
|
||||||
defaults::set_rotate_angle(angle_rad.to_degrees());
|
defaults::set_rotate_angle(angle_rad.to_degrees());
|
||||||
CmdResult::TransformSelected(
|
CmdResult::TransformSelected(
|
||||||
@@ -138,20 +171,38 @@ impl RotateCommand {
|
|||||||
|
|
||||||
impl CadCommand for RotateCommand {
|
impl CadCommand for RotateCommand {
|
||||||
fn set_working_plane(&mut self, plane: WorkingPlane) {
|
fn set_working_plane(&mut self, plane: WorkingPlane) {
|
||||||
self.plane = plane;
|
if !self.axis_chosen {
|
||||||
|
self.plane = plane;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
"ROTATE"
|
if self.spatial {
|
||||||
|
"3DROTATE"
|
||||||
|
} else {
|
||||||
|
"ROTATE"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prompt(&self) -> String {
|
fn prompt(&self) -> String {
|
||||||
match &self.step {
|
match &self.step {
|
||||||
|
Step::Center if self.spatial => t!(
|
||||||
|
"3DROTATE Specify base point [%{count} objects]:",
|
||||||
|
count = self.handles.len()
|
||||||
|
)
|
||||||
|
.into_owned(),
|
||||||
Step::Center => t!(
|
Step::Center => t!(
|
||||||
"ROTATE Specify rotation center [%{count} objects]:",
|
"ROTATE Specify rotation center [%{count} objects]:",
|
||||||
count = self.handles.len()
|
count = self.handles.len()
|
||||||
)
|
)
|
||||||
.into_owned(),
|
.into_owned(),
|
||||||
|
Step::Axis { .. } => {
|
||||||
|
t!("3DROTATE Specify rotation axis [X/Y/Z] or a second point on it <Z>:").into_owned()
|
||||||
|
}
|
||||||
|
Step::Angle { .. } if self.spatial => {
|
||||||
|
let a = format!("{:.4}", self.default_angle);
|
||||||
|
t!("3DROTATE Specify rotation angle <%{a}>:", a = a).into_owned()
|
||||||
|
}
|
||||||
Step::Angle { .. } => {
|
Step::Angle { .. } => {
|
||||||
let a = format!("{:.4}", self.default_angle);
|
let a = format!("{:.4}", self.default_angle);
|
||||||
t!("ROTATE Specify rotation angle <%{a}>:", a = a).into_owned()
|
t!("ROTATE Specify rotation angle <%{a}>:", a = a).into_owned()
|
||||||
@@ -172,6 +223,7 @@ impl CadCommand for RotateCommand {
|
|||||||
fn options(&self) -> Vec<crate::command::CmdOption> {
|
fn options(&self) -> Vec<crate::command::CmdOption> {
|
||||||
use crate::command::CmdOption;
|
use crate::command::CmdOption;
|
||||||
match self.step {
|
match self.step {
|
||||||
|
Step::Axis { .. } => ["X", "Y", "Z"].map(|axis| CmdOption::new(axis, axis)).to_vec(),
|
||||||
Step::Angle { .. } => vec![CmdOption::new(t!("Reference").as_ref(), "R")],
|
Step::Angle { .. } => vec![CmdOption::new(t!("Reference").as_ref(), "R")],
|
||||||
_ => vec![],
|
_ => vec![],
|
||||||
}
|
}
|
||||||
@@ -179,10 +231,18 @@ impl CadCommand for RotateCommand {
|
|||||||
|
|
||||||
fn on_point(&mut self, pt: DVec3) -> CmdResult {
|
fn on_point(&mut self, pt: DVec3) -> CmdResult {
|
||||||
match &self.step {
|
match &self.step {
|
||||||
|
Step::Center if self.spatial => {
|
||||||
|
self.step = Step::Axis { center: pt };
|
||||||
|
CmdResult::NeedPoint
|
||||||
|
}
|
||||||
Step::Center => {
|
Step::Center => {
|
||||||
self.step = Step::Angle { center: pt };
|
self.step = Step::Angle { center: pt };
|
||||||
CmdResult::NeedPoint
|
CmdResult::NeedPoint
|
||||||
}
|
}
|
||||||
|
Step::Axis { center } => {
|
||||||
|
let center = *center;
|
||||||
|
self.choose_axis(center, pt - center)
|
||||||
|
}
|
||||||
Step::Angle { center } => {
|
Step::Angle { center } => {
|
||||||
let center = *center;
|
let center = *center;
|
||||||
let Some(angle_rad) = self.plane.angle(center, pt) else {
|
let Some(angle_rad) = self.plane.angle(center, pt) else {
|
||||||
@@ -214,6 +274,11 @@ impl CadCommand for RotateCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_enter(&mut self) -> CmdResult {
|
fn on_enter(&mut self) -> CmdResult {
|
||||||
|
// The axis defaults to the UCS Z.
|
||||||
|
if let Step::Axis { center } = &self.step {
|
||||||
|
let center = *center;
|
||||||
|
return self.choose_axis(center, self.plane.z);
|
||||||
|
}
|
||||||
// At the normal angle step, Enter uses the stored default angle.
|
// At the normal angle step, Enter uses the stored default angle.
|
||||||
if let Step::Angle { center } = &self.step {
|
if let Step::Angle { center } = &self.step {
|
||||||
let center = *center;
|
let center = *center;
|
||||||
@@ -228,6 +293,16 @@ impl CadCommand for RotateCommand {
|
|||||||
fn on_text_input(&mut self, text: &str) -> Option<CmdResult> {
|
fn on_text_input(&mut self, text: &str) -> Option<CmdResult> {
|
||||||
let t = text.trim();
|
let t = text.trim();
|
||||||
match &self.step {
|
match &self.step {
|
||||||
|
Step::Axis { center } => {
|
||||||
|
let center = *center;
|
||||||
|
let axis = match t.to_ascii_uppercase().as_str() {
|
||||||
|
"X" => self.plane.x,
|
||||||
|
"Y" => self.plane.y,
|
||||||
|
"Z" => self.plane.z,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
Some(self.choose_axis(center, axis))
|
||||||
|
}
|
||||||
Step::Angle { center } => {
|
Step::Angle { center } => {
|
||||||
let center = *center;
|
let center = *center;
|
||||||
let low = t.to_ascii_lowercase();
|
let low = t.to_ascii_lowercase();
|
||||||
@@ -260,6 +335,14 @@ impl CadCommand for RotateCommand {
|
|||||||
|
|
||||||
fn on_preview_wires(&mut self, pt: DVec3) -> Vec<WireModel> {
|
fn on_preview_wires(&mut self, pt: DVec3) -> Vec<WireModel> {
|
||||||
let (center, angle_rad, guide_angle) = match &self.step {
|
let (center, angle_rad, guide_angle) = match &self.step {
|
||||||
|
Step::Axis { center } => {
|
||||||
|
return vec![WireModel::solid_f64(
|
||||||
|
"rotate_axis".into(),
|
||||||
|
vec![center.to_array(), pt.to_array()],
|
||||||
|
WireModel::CYAN,
|
||||||
|
false,
|
||||||
|
)];
|
||||||
|
}
|
||||||
Step::Angle { center } => {
|
Step::Angle { center } => {
|
||||||
let Some(angle) = self.plane.angle(*center, pt) else {
|
let Some(angle) = self.plane.angle(*center, pt) else {
|
||||||
return vec![];
|
return vec![];
|
||||||
|
|||||||
Reference in new issue
Block a user