From 881d237629a36da1d367e7af56c799af8ec16847 Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Tue, 13 Oct 2026 22:29:56 +0300 Subject: [PATCH] feat(array): ARRAYEDIT Source edits what an associative array repeats ARRAYEDIT picks an associative array (or takes the preselected one) and its Source option opens the objects every item repeats in the Block Editor; saving there updates all items at once. Counts and spacings stay in Properties. Refs #1109 Co-Authored-By: Claude Opus 5.5 --- locales/ar-SA/opencadstudio.ftl | 3 ++ locales/bg-BG/opencadstudio.ftl | 3 ++ locales/cs-CZ/opencadstudio.ftl | 3 ++ locales/de-DE/opencadstudio.ftl | 3 ++ locales/el-GR/opencadstudio.ftl | 3 ++ locales/en-US/opencadstudio.ftl | 3 ++ locales/es-ES/opencadstudio.ftl | 3 ++ locales/fi-FI/opencadstudio.ftl | 3 ++ locales/fr-FR/opencadstudio.ftl | 3 ++ locales/hi-IN/opencadstudio.ftl | 3 ++ locales/hu-HU/opencadstudio.ftl | 3 ++ locales/it-IT/opencadstudio.ftl | 3 ++ locales/ja-JP/opencadstudio.ftl | 3 ++ locales/ko-KR/opencadstudio.ftl | 3 ++ locales/lo-LA/opencadstudio.ftl | 3 ++ locales/nl-NL/opencadstudio.ftl | 3 ++ locales/pl-PL/opencadstudio.ftl | 3 ++ locales/pt-BR/opencadstudio.ftl | 3 ++ locales/ru-RU/opencadstudio.ftl | 3 ++ locales/tr-TR/opencadstudio.ftl | 3 ++ locales/zh-CN/opencadstudio.ftl | 3 ++ locales/zh-TW/opencadstudio.ftl | 3 ++ src/app/commands/blocks.rs | 39 ++++++++++++++ src/locale_catalog.rs | 3 ++ src/modules/draw/modify/arrayedit.rs | 78 ++++++++++++++++++++++++++++ src/modules/draw/modify/mod.rs | 1 + 26 files changed, 187 insertions(+) create mode 100644 src/modules/draw/modify/arrayedit.rs diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index d79fd5109..16f91faad 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -3134,6 +3134,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT حدد كتلة ذات سمات: .annotation-object-scale = مقياس كائن التعليق التوضيحي .bedit-select-block-reference-to-edit = BEDIT حدد مرجع الكتلة لتحريره: + .arrayedit-select-array = ARRAYEDIT حدد المصفوفة: + .arrayedit-options = ARRAYEDIT أدخل خيارًا [المصدر/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: الكائن المحدد ليس مصفوفة ترابطية. .blend-enter-continuity-tangent-curvature-c = BLEND أدخل الاستمرارية [مماس/انحناء] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND حدد المنحنى المفتوح الأول [الاستمرارية=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND حدد المنحنى المفتوح الثاني [الاستمرارية=__ocs_arg_c__]: diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index d63ece461..bc31d88a5 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Избери блок с атрибути: .annotation-object-scale = Мащаб на анотационен обект .bedit-select-block-reference-to-edit = BEDIT Избери препратка към блок за редактиране: + .arrayedit-select-array = ARRAYEDIT Изберете масив: + .arrayedit-options = ARRAYEDIT Въведете опция [Източник/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: избраният обект не е асоциативен масив. .blend-enter-continuity-tangent-curvature-c = BLEND Въведи непрекъснатост [Допирателност/Кривина] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Избери първа отворена крива [Непрекъснатост=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Избери втора отворена крива [Непрекъснатост=__ocs_arg_c__]: diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index 48b554740..c382e053e 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Vyberte blok s atributy: .annotation-object-scale = Měřítko objektu anotace .bedit-select-block-reference-to-edit = BEDIT Vyberte referenci bloku, kterou chcete upravit: + .arrayedit-select-array = ARRAYEDIT Vyberte pole: + .arrayedit-options = ARRAYEDIT Zadejte možnost [Zdroj/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: vybraný objekt není asociativní pole. .blend-enter-continuity-tangent-curvature-c = BLEND Enter spojitost [Tečna/Zakřivení] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Vyberte první otevřenou křivku [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Vyberte druhou otevřenou křivku [Continuity=__ocs_arg_c__]: diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index 5178a577e..4f4dd1745 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Block mit Attributen auswählen: .annotation-object-scale = Beschriftungsobjektmaßstab .bedit-select-block-reference-to-edit = BEDIT Blockreferenz zum Bearbeiten auswählen: + .arrayedit-select-array = ARRAYEDIT Reihe wählen: + .arrayedit-options = ARRAYEDIT Option eingeben [Quelle/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: das gewählte Objekt ist keine assoziative Reihe. .blend-enter-continuity-tangent-curvature-c = BLEND Geben Sie Kontinuität ein [Tangente/Krümmung] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Erste offene Kurve auswählen [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND zweite offene Kurve auswählen [Continuity=__ocs_arg_c__]: diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index 976b4f633..0bebe5c31 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Επιλέξτε μπλοκ με χαρακτηριστικά: .annotation-object-scale = Κλίμακα αντικειμένου επισημείωσης .bedit-select-block-reference-to-edit = BEDIT Επιλέξτε αναφορά μπλοκ προς επεξεργασία: + .arrayedit-select-array = ARRAYEDIT Επιλέξτε διάταξη: + .arrayedit-options = ARRAYEDIT Δώστε επιλογή [Πηγή/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: το επιλεγμένο αντικείμενο δεν είναι συσχετιστική διάταξη. .blend-enter-continuity-tangent-curvature-c = BLEND Δώστε συνέχεια [Εφαπτομενική/Καμπυλότητα] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Επιλέξτε πρώτη ανοικτή καμπύλη [Συνέχεια=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Επιλέξτε δεύτερη ανοικτή καμπύλη [Συνέχεια=__ocs_arg_c__]: diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 9144b0527..73857ab56 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Select block with attributes: .annotation-object-scale = Annotation Object Scale .bedit-select-block-reference-to-edit = BEDIT Select block reference to edit: + .arrayedit-select-array = ARRAYEDIT Select array: + .arrayedit-options = ARRAYEDIT Enter an option [Source/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: the selected object is not an associative array. .blend-enter-continuity-tangent-curvature-c = BLEND Enter continuity [Tangent/Curvature] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Select first open curve [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Select second open curve [Continuity=__ocs_arg_c__]: diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index 18cd02a69..e5b04a7a2 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Seleccione un bloque con atributos: .annotation-object-scale = Escala del objeto anotativo .bedit-select-block-reference-to-edit = BEDIT Seleccione la referencia de bloque que desea editar: + .arrayedit-select-array = ARRAYEDIT Seleccione la matriz: + .arrayedit-options = ARRAYEDIT Indique una opción [Origen/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: el objeto seleccionado no es una matriz asociativa. .blend-enter-continuity-tangent-curvature-c = BLEND Indique la continuidad [Tangente/Curvatura] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Seleccione la primera curva abierta [Continuidad=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Seleccione la segunda curva abierta [Continuidad=__ocs_arg_c__]: diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index c1e6ddd4b..a7e39d5e0 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Valitse lohko määritteillä: .annotation-object-scale = Merkintäobjektin mittakaava .bedit-select-block-reference-to-edit = BEDIT Valitse muokattava lohkoviite: + .arrayedit-select-array = ARRAYEDIT Valitse sarja: + .arrayedit-options = ARRAYEDIT Anna vaihtoehto [Lähde/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: valittu objekti ei ole assosiatiivinen sarja. .blend-enter-continuity-tangent-curvature-c = BLEND Enter jatkuvuus [tangentti/kaarevuus] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Valitse ensimmäinen avoin käyrä [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Valitse toinen avoin käyrä [Continuity=__ocs_arg_c__]: diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index 079c90a53..1a7e72d41 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Sélectionner un bloc avec des attributs : .annotation-object-scale = Échelle d'objets d'annotation .bedit-select-block-reference-to-edit = BEDIT Sélectionnez la référence de bloc à modifier : + .arrayedit-select-array = ARRAYEDIT Sélectionnez le réseau : + .arrayedit-options = ARRAYEDIT Entrez une option [Source/eXit] : + .arrayedit-not-an-array = ARRAYEDIT : l'objet sélectionné n'est pas un réseau associatif. .blend-enter-continuity-tangent-curvature-c = BLEND Entrer la continuité [Tangent/Curvature] <__ocs_arg_c__: .blend-select-first-open-curve-continuity-c = BLEND Sélectionner la première courbe ouverte [Continuité=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Sélectionner la deuxième courbe ouverte [Continuité=__ocs_arg_c__]: diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index b1e8b141f..d68e919a5 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -3110,6 +3110,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT विशेषताओं के साथ ब्लॉक का चयन करें: .annotation-object-scale = Annotation ऑब्जेक्ट स्केल .bedit-select-block-reference-to-edit = BEDIT संपादित करने के लिए ब्लॉक संदर्भ का चयन करें: + .arrayedit-select-array = ARRAYEDIT ऐरे चुनें: + .arrayedit-options = ARRAYEDIT विकल्प दर्ज करें [स्रोत/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: चुना गया ऑब्जेक्ट सहयोगी ऐरे नहीं है। .blend-enter-continuity-tangent-curvature-c = BLEND निरंतरता चुनें [स्पर्शरेखा/वक्रता] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND प्रथम खुले वक्र का चयन करें [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND दूसरा खुला वक्र चुनें [Continuity=__ocs_arg_c__]: diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index b570a4d74..d9bc7790f 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -3124,6 +3124,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Blokk kiválasztása attribútumokkal: .annotation-object-scale = Feliratozási objektum léptéke .bedit-select-block-reference-to-edit = BEDIT Válassza ki a szerkeszteni kívánt blokkreferenciát: + .arrayedit-select-array = ARRAYEDIT Válassza ki a tömböt: + .arrayedit-options = ARRAYEDIT Adjon meg egy lehetőséget [Forrás/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: a kijelölt objektum nem asszociatív tömb. .blend-enter-continuity-tangent-curvature-c = BLEND Adja meg a folytonosságot [Tangent/Curvature] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Válassza ki az első nyitott görbét [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Válassza ki a második nyitott görbét [Continuity=__ocs_arg_c__]: diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index f258b26ad..2dfb5ba3e 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Seleziona blocco con attributi: .annotation-object-scale = Scala oggetto annotazione .bedit-select-block-reference-to-edit = BEDIT Selezionare il riferimento di blocco da modificare: + .arrayedit-select-array = ARRAYEDIT Selezionare la serie: + .arrayedit-options = ARRAYEDIT Immettere un'opzione [Origine/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: l'oggetto selezionato non è una serie associativa. .blend-enter-continuity-tangent-curvature-c = BLEND Enter continuità [Tangente/Curvatura] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Selezionare la prima curva aperta [Continuità=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Selezionare la seconda curva aperta [Continuità=__ocs_arg_c__]: diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index e9ecab250..1bff44ff7 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -3112,6 +3112,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT 属性付きブロックを選択: .annotation-object-scale = 注釈オブジェクト尺度 .bedit-select-block-reference-to-edit = BEDIT 編集するブロック参照を選択: + .arrayedit-select-array = ARRAYEDIT 配列複写を選択: + .arrayedit-options = ARRAYEDIT オプションを入力 [元/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: 選択したオブジェクトは自動調整配列複写ではありません。 .blend-enter-continuity-tangent-curvature-c = BLEND 連続性を入力 [接線/曲率] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND 1 本目の開いた曲線を選択 [連続性=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND 2 本目の開いた曲線を選択 [連続性=__ocs_arg_c__]: diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index 34af88034..5cff614f4 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT 속성이 있는 블록 선택: .annotation-object-scale = 주석 객체 축척 .bedit-select-block-reference-to-edit = BEDIT 편집할 블록 참조 선택: + .arrayedit-select-array = ARRAYEDIT 배열 선택: + .arrayedit-options = ARRAYEDIT 옵션 입력 [원본/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: 선택한 객체는 연관 배열이 아닙니다. .blend-enter-continuity-tangent-curvature-c = BLEND Enter 연속성 [접선/곡률] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND 첫 번째 열린 곡선 선택 [연속성=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND 두 번째 열린 곡선 선택 [연속성=__ocs_arg_c__]: diff --git a/locales/lo-LA/opencadstudio.ftl b/locales/lo-LA/opencadstudio.ftl index ce1fa2137..bce39cf2b 100644 --- a/locales/lo-LA/opencadstudio.ftl +++ b/locales/lo-LA/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT ເລືອກບລັອກທີ່ມີຄຸນລັກສະນະ: .annotation-object-scale = ມາດຕາສ່ວນວັດຖຸຄຳອະທິບາຍ .bedit-select-block-reference-to-edit = BEDIT ເລືອກການອ້າງອີງບລັອກທີ່ຈະແກ້ໄຂ: + .arrayedit-select-array = ARRAYEDIT ເລືອກອາເຣ: + .arrayedit-options = ARRAYEDIT ປ້ອນທາງເລືອກ [ແຫຼ່ງ/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: ວັດຖຸທີ່ເລືອກບໍ່ແມ່ນອາເຣທີ່ເຊື່ອມໂຍງ. .blend-enter-continuity-tangent-curvature-c = BLEND ປ້ອນຄວາມຕໍ່ເນື່ອງ [Tangent/Curvature] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND ເລືອກເສັ້ນໂຄ້ງປາຍເປີດທຳອິດ [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND ເລືອກເສັ້ນໂຄ້ງປາຍເປີດທີສອງ [Continuity=__ocs_arg_c__]: diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index 6e83d91b9..1dc4d41f0 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Selecteer symbool met attributen: .annotation-object-scale = Annotatie objectschaal .bedit-select-block-reference-to-edit = BEDIT Selecteer symboolverwijzing naar bewerken: + .arrayedit-select-array = ARRAYEDIT Selecteer de reeks: + .arrayedit-options = ARRAYEDIT Geef een optie [Bron/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: het geselecteerde object is geen associatieve reeks. .blend-enter-continuity-tangent-curvature-c = BLEND Vul continuïteit [tangent/curvature] <__ocs_arg_c__> in: .blend-select-first-open-curve-continuity-c = BLEND Selecteer eerste open curve [Continuïteit=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Selecteer tweede open curve [Continuïteit=__ocs_arg_c__]: diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index 689beb578..914c97cf9 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Wybierz blok z atrybutami: .annotation-object-scale = Skala obiektu adnotacji .bedit-select-block-reference-to-edit = BEDIT Wybierz odniesienie do bloku do edycji: + .arrayedit-select-array = ARRAYEDIT Wybierz szyk: + .arrayedit-options = ARRAYEDIT Podaj opcję [Źródło/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: wybrany obiekt nie jest szykiem skojarzonym. .blend-enter-continuity-tangent-curvature-c = BLEND Enter ciągłość [styczna/krzywizna] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Wybierz pierwszą otwartą krzywą [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Wybierz drugą otwartą krzywą [Continuity=__ocs_arg_c__]: diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index 3f2055d88..6078e7222 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -3122,6 +3122,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Selecione um bloco com atributos: .annotation-object-scale = Escala de objeto de anotação .bedit-select-block-reference-to-edit = BEDIT Selecione a referência de bloco a editar: + .arrayedit-select-array = ARRAYEDIT Selecione o arranjo: + .arrayedit-options = ARRAYEDIT Digite uma opção [Origem/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: o objeto selecionado não é um arranjo associativo. .blend-enter-continuity-tangent-curvature-c = BLEND Insira a continuidade [Tangente/Curvatura] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Selecione a primeira curva aberta [Continuidade=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Selecione a segunda curva aberta [Continuidade=__ocs_arg_c__]: diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 6d05b4a86..83cda61d5 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -3125,6 +3125,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Выберите блок с атрибутами: .annotation-object-scale = Масштаб аннотативного объекта .bedit-select-block-reference-to-edit = BEDIT Выберите ссылку на блок для редактирования: + .arrayedit-select-array = ARRAYEDIT Выберите массив: + .arrayedit-options = ARRAYEDIT Введите параметр [Исходные/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: выбранный объект не является ассоциативным массивом. .blend-enter-continuity-tangent-curvature-c = BLEND Введите непрерывность [Тангент/Курватура] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND Выберите первую открытую кривую [Продолжение=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND Выберите вторую открытую кривую [Продолжение=__ocs_arg_c__]: diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index b1bb5b4c9..142306fc3 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -3103,6 +3103,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT Öznitelikleri olan bir blok seçin: .annotation-object-scale = Açıklama Nesnesi Ölçeği .bedit-select-block-reference-to-edit = BEDIT Düzenlenecek blok referansını seçin: + .arrayedit-select-array = ARRAYEDIT Diziyi seçin: + .arrayedit-options = ARRAYEDIT Bir seçenek girin [Kaynak/çıKış] <çıKış>: + .arrayedit-not-an-array = ARRAYEDIT: seçilen nesne ilişkili bir dizi değil. .blend-enter-continuity-tangent-curvature-c = BLEND Sürekliliği girin [Teğet/Eğrilik] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND İlk açık eğriyi seçin [Süreklilik=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND İkinci açık eğriyi seçin [Süreklilik=__ocs_arg_c__]: diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index 09c0585f1..38c92b9d8 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -3109,6 +3109,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT 选择带属性的块: .annotation-object-scale = 注释对象比例 .bedit-select-block-reference-to-edit = BEDIT 选择要编辑的块引用 : + .arrayedit-select-array = ARRAYEDIT 选择阵列: + .arrayedit-options = ARRAYEDIT 输入选项 [源/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: 所选对象不是关联阵列。 .blend-enter-continuity-tangent-curvature-c = BLEND 输入连续性 [相切/曲率] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND 选择第一条开放曲线 [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND 选择第二条开放曲线 [Continuity=__ocs_arg_c__]: diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index 0307994fe..3774860a1 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -3121,6 +3121,9 @@ modify = .attedit-select-block-with-attributes = ATTEDIT 選擇帶屬性的圖塊: .annotation-object-scale = 註解物件比例 .bedit-select-block-reference-to-edit = BEDIT 選擇要編輯的圖塊引用 : + .arrayedit-select-array = ARRAYEDIT 選取陣列: + .arrayedit-options = ARRAYEDIT 輸入選項 [來源/eXit] : + .arrayedit-not-an-array = ARRAYEDIT: 選取的物件不是關聯式陣列。 .blend-enter-continuity-tangent-curvature-c = BLEND 輸入連續性 [相切/曲率] <__ocs_arg_c__>: .blend-select-first-open-curve-continuity-c = BLEND 選擇第一條開放曲線 [Continuity=__ocs_arg_c__]: .blend-select-second-open-curve-continuity-c = BLEND 選擇第二條開放曲線 [Continuity=__ocs_arg_c__]: diff --git a/src/app/commands/blocks.rs b/src/app/commands/blocks.rs index b9a74490b..f8ccdab8b 100644 --- a/src/app/commands/blocks.rs +++ b/src/app/commands/blocks.rs @@ -301,6 +301,45 @@ impl OpenCADStudio { } } + // ARRAYEDIT — edit an associative array; a preselected one skips + // the pick. + "ARRAYEDIT" => { + use crate::modules::draw::modify::arrayedit::ArrayEditCommand; + let selected = self.tabs[i].scene.selected_handles_in_order(); + let array = match selected.as_slice() { + [handle] => Some(*handle), + _ => None, + }; + self.tabs[i].scene.deselect_all(); + let command = ArrayEditCommand::new(array); + self.command_line.push_info(&command.prompt()); + self.tabs[i].active_cmd = Some(Box::new(command)); + } + + // ARRAYEDIT Source: edit the objects the array repeats in the + // Block Editor; every item follows when it is saved. + cmd if cmd.starts_with("ARRAYEDIT_SOURCE:") => { + let handle = codec::Handle::new( + cmd["ARRAYEDIT_SOURCE:".len()..].parse().unwrap_or(0), + ); + let document = &self.tabs[i].scene.document; + let source = crate::scene::assoc_array::array_of_insert(document, handle) + .and_then(|array| { + document + .block_records + .iter() + .find(|record| record.handle == array.source_block) + .map(|record| record.name.clone()) + }); + match source { + Some(name) => return Some(self.dispatch_command(&format!("BEDIT_OPEN:{name}"))), + None => self.command_line.push_error( + crate::t!("ARRAYEDIT: the selected object is not an associative array.") + .as_ref(), + ), + } + } + // PASTESPEC — offer the copied objects now; the system clipboard's // text joins the formats once read (Message::PasteSpecial). "PASTESPEC" => { diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index bb757641b..d4ecde9fa 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -802,6 +802,9 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "BACKGROUND colour [Default/Black/DarkGray/Gray/LightGray/White] or R G B (0–255):" => Some(("file", "background-colour-default-black-darkgray-gray")), "BASE Specify base point:" => Some(("insert", "base-specify-base-point")), "BEDIT Select block reference to edit:" => Some(("modify", "bedit-select-block-reference-to-edit")), + "ARRAYEDIT Select array:" => Some(("modify", "arrayedit-select-array")), + "ARRAYEDIT Enter an option [Source/eXit] :" => Some(("modify", "arrayedit-options")), + "ARRAYEDIT: the selected object is not an associative array." => Some(("modify", "arrayedit-not-an-array")), "BEDIT: Block \"{}\" edit discarded." => Some(("inquiry", "bedit-block-edit-discarded")), "BEDIT: Block \"{}\" saved. All references updated." => Some(("inquiry", "bedit-block-saved-all-references-updated")), "BEDIT: Editing block \"{}\". Use Save Block or Discard to finish." => Some(("inquiry", "bedit-editing-block-use-save-block-or-discard")), diff --git a/src/modules/draw/modify/arrayedit.rs b/src/modules/draw/modify/arrayedit.rs new file mode 100644 index 000000000..d1d48311e --- /dev/null +++ b/src/modules/draw/modify/arrayedit.rs @@ -0,0 +1,78 @@ +// ARRAYEDIT — edit an associative array. Counts and spacings are edited in +// Properties; Source opens the objects every item repeats in the Block +// Editor, and closing it updates all items at once. + +use crate::command::{CadCommand, CmdOption, CmdResult}; +use codec::Handle; +use glam::DVec3; + +pub struct ArrayEditCommand { + array: Option, +} + +impl ArrayEditCommand { + pub fn new(array: Option) -> Self { + Self { array } + } +} + +impl CadCommand for ArrayEditCommand { + fn name(&self) -> &'static str { + "ARRAYEDIT" + } + + fn prompt(&self) -> String { + match self.array { + None => crate::t!("ARRAYEDIT Select array:").into_owned(), + Some(_) => crate::t!("ARRAYEDIT Enter an option [Source/eXit] :").into_owned(), + } + } + + fn options(&self) -> Vec { + match self.array { + None => Vec::new(), + Some(_) => vec![ + CmdOption::new(crate::t!("Source").as_ref(), "S"), + CmdOption::new(crate::t!("eXit").as_ref(), "X"), + ], + } + } + + fn needs_entity_pick(&self) -> bool { + self.array.is_none() + } + + fn on_entity_pick(&mut self, handle: Handle, _pt: DVec3) -> CmdResult { + if handle.is_null() { + return CmdResult::NeedPoint; + } + self.array = Some(handle); + CmdResult::NeedPoint + } + + fn wants_text_input(&self) -> bool { + self.array.is_some() + } + + fn on_text_input(&mut self, text: &str) -> Option { + let array = self.array?; + match text.trim().trim_start_matches('_').to_ascii_uppercase().as_str() { + "S" | "SOURCE" => Some(CmdResult::Dispatch(format!( + "ARRAYEDIT_SOURCE:{}", + array.value() + ))), + "X" | "EXIT" => Some(CmdResult::Cancel), + _ => None, + } + } + + fn on_point(&mut self, _pt: DVec3) -> CmdResult { + CmdResult::NeedPoint + } + + fn on_enter(&mut self) -> CmdResult { + CmdResult::Cancel + } +} + +inventory::submit!(crate::command::CommandRegistration { names: &["ARRAYEDIT"] }); diff --git a/src/modules/draw/modify/mod.rs b/src/modules/draw/modify/mod.rs index 0f821ac61..ce4da1d84 100644 --- a/src/modules/draw/modify/mod.rs +++ b/src/modules/draw/modify/mod.rs @@ -1,5 +1,6 @@ pub mod align; pub mod array; +pub mod arrayedit; pub mod attedit; pub mod blend; pub mod block_edit;