From 1a18fdd0cf936979efdf34b07e70170b4852446f Mon Sep 17 00:00:00 2001 From: ramox81 <184937705+ramox81@users.noreply.github.com> Date: Wed, 7 Oct 2026 09:26:29 +0300 Subject: [PATCH 1/2] SWEEP: reference messages, 3D polyline profiles and Scale Reference - 3D polyline profiles are recorded as wire bodies, like 3D polyline paths. - Refused sweeps print the modeling error code and "Unable to sweep N selected objects."; a scaled sweep rejects closed and cornered spatial paths with the reference messages and asks for the path again. - Scale > Reference asks for start and end reference lengths (start / end). - Bank stays on for later sweeps until a twist angle is entered. - Refused twist/scale edits in Properties print the modeling error code. Co-Authored-By: Claude Opus 5.5 --- src/app/command_driver/solid3d.rs | 45 +++++++++------- src/app/update/command.rs | 14 ++++- src/modules/insert/solid3d_cmds.rs | 73 ++++++++++++++++---------- src/scene/model/sweep_command_model.rs | 59 ++++++++++++++++++--- src/scene/model/sweep_model.rs | 2 +- src/scene/modify.rs | 13 +++++ 6 files changed, 149 insertions(+), 57 deletions(-) diff --git a/src/app/command_driver/solid3d.rs b/src/app/command_driver/solid3d.rs index ccaa8de3c..958e8dea7 100644 --- a/src/app/command_driver/solid3d.rs +++ b/src/app/command_driver/solid3d.rs @@ -497,22 +497,34 @@ impl OpenCADStudio { let mut created_handles = Vec::new(); let mut consumed = Vec::new(); for (handle, profile) in profiles { - let result = path.as_ref().zip(options).and_then(|(path, options)| { - let mut record = sweep_model::sweep_record(&profile, path, options)?; + // A refused sweep reports the modeler error code, as the + // reference does. + let result = (|| -> Result<_, Option> { + let (path, options) = path.as_ref().zip(options).ok_or(None)?; + let mut record = sweep_model::sweep_record(&profile, path, options).ok_or(None)?; record.flags_294_296[0] |= picked_base; let (_, _, closed) = kernel::acis::sweep_profile_geometry( - record.sweep_entity.as_ref()?, + record.sweep_entity.as_ref().ok_or(None)?, record.sweep_entity_transform, ) - .ok()?; + .map_err(|_| None)?; let surface = mode == ExtrudeMode::Surface || !closed; - let body = - kernel::acis::rebuild_sweep_with_mode(&record, surface).ok()?; - Some((body, record, surface)) - }); - let Some((body, record, surface)) = result else { - failed += 1; - continue; + let body = kernel::acis::rebuild_sweep_with_mode(&record, surface).map_err(|error| match error { + kernel::acis::HistoryRebuildError::Refused(why) => Some(sweep_model::sweep_refusal_code(why)), + _ => None, + })?; + Ok((body, record, surface)) + })(); + let (body, record, surface) = match result { + Ok(value) => value, + Err(code) => { + if let Some(code) = code { + self.command_line.push_output(&format!("Modeling Operation Error: +Error Code Number is {code}")); + } + failed += 1; + continue; + } }; let deletes_path = crate::app::delobj_deletes_auxiliary(delete_objects, surface); @@ -550,14 +562,9 @@ impl OpenCADStudio { self.tabs[i].scene.select_entity(*handle, true); } self.tabs[i].dirty = true; - self.command_line.push_output(crate::tf!( - "SWEEP: created {created} object(s); {failed} source(s) could not be swept.", - created = created_handles.len(), failed = failed - ).as_ref()); - } else { - self.command_line.push_error( - crate::t!("SWEEP: could not sweep the profile along the path.").as_ref(), - ); + } + if failed > 0 { + self.command_line.push_output(&format!("Unable to sweep {failed} selected objects.")); } if let Some(pending) = pending { self.commit_undo_delta(i, pending); diff --git a/src/app/update/command.rs b/src/app/update/command.rs index 870692e7e..2c85ace58 100644 --- a/src/app/update/command.rs +++ b/src/app/update/command.rs @@ -3938,11 +3938,21 @@ pub(super) fn on_tab_close(&mut self, idx: usize) -> Task { if crate::scene::model::solid_history::is_primitive_property( field, ) { - self.tabs[i].scene.apply_solid_history_property( + if !self.tabs[i].scene.apply_solid_history_property( handle, field, &val, - ); + ) { + if let Some(code) = self.tabs[i] + .scene + .solid_history_property_refusal(handle, field, &val) + { + self.command_line.push_output(&format!( + "Modeling Operation Error: +Error Code Number is {code}" + )); + } + } } else if self.tabs[i] .scene .apply_solid_position_property( diff --git a/src/modules/insert/solid3d_cmds.rs b/src/modules/insert/solid3d_cmds.rs index 934fbc432..d2aedee51 100644 --- a/src/modules/insert/solid3d_cmds.rs +++ b/src/modules/insert/solid3d_cmds.rs @@ -1606,6 +1606,10 @@ impl CadCommand for RevolveCommand { // ── SWEEP command ────────────────────────────────────────────────────────── +/// Banking stays on for later sweeps until a twist angle is entered, as in +/// the reference. +static SWEEP_BANK: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false); + pub struct SweepCommand { step: SweepStep, profiles: Vec<(Handle, EntityType)>, @@ -1618,6 +1622,7 @@ pub struct SweepCommand { reference_start: Option, reference_length: f64, new_length_start: Option, + end_length: f64, isolines: usize, color: [f32; 4], } @@ -1630,10 +1635,11 @@ enum SweepStep { Alignment, BasePoint, Scale, + /// The start reference length: a distance, or two points. ReferenceLength, ReferenceEnd, + /// The end reference length: a distance, or two points. NewLength, - NewLengthStart, NewLengthEnd, Twist, } @@ -1648,10 +1654,14 @@ impl SweepCommand { preview_key: None, preview_cache: Vec::new(), mode: ExtrudeMode::Solid, - options: SweepOptions::default(), + options: SweepOptions { + bank: SWEEP_BANK.load(std::sync::atomic::Ordering::Relaxed), + ..SweepOptions::default() + }, reference_start: None, reference_length: 1.0, new_length_start: None, + end_length: 1.0, isolines, color, } @@ -1715,10 +1725,13 @@ impl SweepCommand { true } - fn length_anchor(&self) -> DVec3 { - self.reference_start - .or_else(|| self.selection_options().and_then(|options| options.base_point)) - .unwrap_or(DVec3::ZERO) + /// The Reference scale is the start reference length over the end one. + fn set_end_length(&mut self, length: f64) -> bool { + if !length.is_finite() || length <= 1e-12 { + return false; + } + self.end_length = length; + self.set_scale(self.reference_length / length) } } @@ -1746,21 +1759,23 @@ impl CadCommand for SweepCommand { ), SweepStep::ReferenceLength => format!( "{} <{}>:", - t!("SWEEP Specify reference length or first point"), + t!("SWEEP Specify start reference length"), crate::entities::common::format_length(self.reference_length), ), - SweepStep::ReferenceEnd => t!("SWEEP Specify second reference point:").into_owned(), + SweepStep::ReferenceEnd | SweepStep::NewLengthEnd => t!("SWEEP Specify second point:").into_owned(), SweepStep::NewLength => format!( "{} <{}>:", - t!("SWEEP Specify new length or [Points]"), - crate::entities::common::format_length(self.reference_length * self.options.scale), + t!("SWEEP Specify end reference length"), + crate::entities::common::format_length(self.end_length), ), - SweepStep::NewLengthStart => t!("SWEEP Specify first point of new length:").into_owned(), - SweepStep::NewLengthEnd => t!("SWEEP Specify second point of new length:").into_owned(), SweepStep::Twist => format!( "{} <{}>:", t!("SWEEP Specify twist angle or [Bank]"), - crate::entities::common::format_angle(self.options.twist_angle), + if self.options.bank { + "Bank".to_string() + } else { + crate::entities::common::format_angle(self.options.twist_angle) + }, ), } } @@ -1777,7 +1792,6 @@ impl CadCommand for SweepCommand { ], SweepStep::Alignment => vec![CmdOption::new("Yes", "YES"), CmdOption::new("No", "NO")], SweepStep::Scale => vec![CmdOption::new("Reference", "REFERENCE")], - SweepStep::NewLength => vec![CmdOption::new("Points", "POINTS")], SweepStep::Twist => vec![CmdOption::new("Bank", "BANK")], _ => Vec::new(), } @@ -1801,11 +1815,15 @@ impl CadCommand for SweepCommand { .filter(|(hovered, _)| *hovered == handle) .map(|(_, entity)| entity.clone()) }); - if path.as_ref().is_some_and(crate::scene::model::sweep_model::is_sweep_path) { - self.finish(handle) - } else { - CmdResult::NeedPoint + let Some(path) = path.filter(crate::scene::model::sweep_model::is_sweep_path) else { + return CmdResult::NeedPoint; + }; + if (self.options.scale - 1.0).abs() > 1e-12 { + if let Some(message) = crate::scene::model::sweep_model::scaled_sweep_path_refusal(&path) { + return CmdResult::ReportMeasurement(message.to_string()); + } } + self.finish(handle) } fn on_point(&mut self, point: DVec3) -> CmdResult { @@ -1827,15 +1845,12 @@ impl CadCommand for SweepCommand { } } SweepStep::NewLength => { - self.set_scale(point.distance(self.length_anchor()) / self.reference_length); - } - SweepStep::NewLengthStart => { self.new_length_start = Some(point); self.step = SweepStep::NewLengthEnd; } SweepStep::NewLengthEnd => { if let Some(start) = self.new_length_start { - self.set_scale(point.distance(start) / self.reference_length); + self.set_end_length(point.distance(start)); } } _ => {} @@ -1916,10 +1931,8 @@ impl CadCommand for SweepCommand { } } SweepStep::NewLength => { - if "POINTS".starts_with(&keyword) { - self.step = SweepStep::NewLengthStart; - } else if let Some(length) = crate::entities::common::parse_typed_length(value) { - self.set_scale(length / self.reference_length); + if let Some(length) = crate::entities::common::parse_typed_length(value) { + self.set_end_length(length); } else { return None; } @@ -1927,11 +1940,13 @@ impl CadCommand for SweepCommand { SweepStep::Twist => { if "BANK".starts_with(&keyword) { self.options.bank = true; + SWEEP_BANK.store(true, std::sync::atomic::Ordering::Relaxed); self.step = SweepStep::PickPath; } else if let Some(angle) = crate::entities::common::parse_angle(value) { if angle.is_finite() { self.options.twist_angle = angle; self.options.bank = false; + SWEEP_BANK.store(false, std::sync::atomic::Ordering::Relaxed); self.step = SweepStep::PickPath; } } @@ -1947,9 +1962,11 @@ impl CadCommand for SweepCommand { self.step = SweepStep::PickPath; } SweepStep::Mode => self.step = SweepStep::PickProfiles, - SweepStep::Alignment | SweepStep::Scale | SweepStep::Twist - | SweepStep::NewLength => self.step = SweepStep::PickPath, + SweepStep::Alignment | SweepStep::Scale | SweepStep::Twist => self.step = SweepStep::PickPath, SweepStep::ReferenceLength => self.step = SweepStep::NewLength, + SweepStep::NewLength => { + self.set_end_length(self.end_length); + } _ => return CmdResult::Cancel, } CmdResult::NeedPoint diff --git a/src/scene/model/sweep_command_model.rs b/src/scene/model/sweep_command_model.rs index 142d78e4d..f954561af 100644 --- a/src/scene/model/sweep_command_model.rs +++ b/src/scene/model/sweep_command_model.rs @@ -9,20 +9,25 @@ use kernel::brep::Body; use crate::command::{ExtrudeMode, SweepOptions}; use super::sweep_model::{embedded_path, embedded_revolve_profile}; +/// A 3D polyline profile or path as the reference records it: a wire body. fn embedded_sweep_profile(entity: &EntityType) -> Option<(codec::entities::EmbeddedEntity, [f64; 16])> { - if let EntityType::Region(region) = entity { - Some((codec::entities::EmbeddedEntity::Region(region.clone()), glam::DMat4::IDENTITY.to_cols_array())) - } else { - embedded_revolve_profile(entity) + match entity { + EntityType::Region(region) => Some((codec::entities::EmbeddedEntity::Region(region.clone()), glam::DMat4::IDENTITY.to_cols_array())), + EntityType::Polyline3D(value) => Some((polyline_wire(value)?, glam::DMat4::IDENTITY.to_cols_array())), + _ => embedded_revolve_profile(entity), } } /// The sweep path as the reference records it: a 3D polyline as a wire /// body, anything else as its embedded entity. fn embedded_sweep_path(path: &EntityType) -> Option { - let EntityType::Polyline3D(value) = path else { - return embedded_path(path); - }; + match path { + EntityType::Polyline3D(value) => polyline_wire(value), + _ => embedded_path(path), + } +} + +fn polyline_wire(value: &codec::entities::Polyline3D) -> Option { let points = value.vertices.iter() .map(|vertex| [vertex.position.x, vertex.position.y, vertex.position.z]) .collect::>(); @@ -41,6 +46,46 @@ pub fn is_sweep_profile(entity: &EntityType) -> bool { }) } +/// The modeling error code the reference reports for a refused sweep. +pub fn sweep_refusal_code(refusal: kernel::brep::SweepRefusal) -> u32 { + match refusal { + kernel::brep::SweepRefusal::Scale => 5016, + kernel::brep::SweepRefusal::Twist => 115065, + kernel::brep::SweepRefusal::Bank => 115007, + } +} + +/// Why the reference refuses a path for a scaled sweep: scaling needs an +/// open path, and a spatial path must be smooth. +pub fn scaled_sweep_path_refusal(path: &EntityType) -> Option<&'static str> { + let (closed, smooth) = match crate::entities::curve::entity_curve(path) { + Some(planar) => (planar.curve.is_closed(), true), + None => match path { + EntityType::Polyline3D(value) => { + let points = value.vertices.iter() + .map(|vertex| glam::DVec3::new(vertex.position.x, vertex.position.y, vertex.position.z)) + .collect::>(); + let directions = points.windows(2) + .filter_map(|pair| (pair[1] - pair[0]).try_normalize()) + .collect::>(); + let straight = directions.windows(2).all(|pair| pair[0].dot(pair[1]) >= 1.0 - 1e-9); + (value.is_closed(), straight && !value.is_closed()) + } + EntityType::Spline(value) => (value.flags.closed, value.degree > 1), + _ => (false, true), + }, + }; + if closed { + Some("Cannot use scale option when path curve is closed. +The selected path curve is not valid.") + } else if !smooth { + Some("Path curve must be smooth when using scale option. +The selected path curve is not valid.") + } else { + None + } +} + pub fn is_sweep_path(entity: &EntityType) -> bool { match embedded_path(entity) { Some(codec::entities::EmbeddedEntity::Spline(value)) => { diff --git a/src/scene/model/sweep_model.rs b/src/scene/model/sweep_model.rs index fc51db626..3cb12ce46 100644 --- a/src/scene/model/sweep_model.rs +++ b/src/scene/model/sweep_model.rs @@ -13,7 +13,7 @@ use codec::EntityType; use crate::entities::curve::entity_curve; pub use super::sweep_command_model::{ - is_sweep_path, is_sweep_profile, sweep_record, sweep_selection_options, swept_surface_entity, swept_with_options, + is_sweep_path, is_sweep_profile, scaled_sweep_path_refusal, sweep_record, sweep_refusal_code, sweep_selection_options, swept_surface_entity, swept_with_options, }; /// A drawn profile, as the kernel wants it: the plane it lies in and the diff --git a/src/scene/modify.rs b/src/scene/modify.rs index 97dbb38af..45a769e51 100644 --- a/src/scene/modify.rs +++ b/src/scene/modify.rs @@ -1370,6 +1370,19 @@ impl Scene { self.rebuild_solid_history(handle, operation) } + /// The modeler error code the reference reports when it refuses a sweep + /// property edit (twist or scale along a path with a corner). + pub fn solid_history_property_refusal(&self, handle: Handle, field: &str, value: &str) -> Option { + let mut operation = crate::scene::model::solid_history::primitive_property_operation(&self.document, handle)?; + if !crate::scene::model::solid_history::apply_primitive_property(&mut operation, field, value) { + return None; + } + let codec::objects::SolidHistoryOperation::Sweep(record) = &operation else { + return None; + }; + kernel::acis::sweep_history_refusal(record).map(crate::scene::model::sweep_model::sweep_refusal_code) + } + pub fn apply_solid_position_property( &mut self, handle: Handle, From 56f3f68de933bf449ec1d5c952c162fb5fcc1716 Mon Sep 17 00:00:00 2001 From: ramox81 <184937705+ramox81@users.noreply.github.com> Date: Wed, 7 Oct 2026 10:15:32 +0300 Subject: [PATCH 2/2] SWEEP: Expression option, reference prompts and localized messages - Scale and Twist take an Expression evaluated with the drawing's parameters; invalid input prints the reference message and asks again. - The scale and twist prompts use the reference wording and defaults. - The SWEEP prompts and refusal messages are in the locale catalog with translations in every locale. Co-Authored-By: Claude Opus 5.5 --- locales/ar-SA/opencadstudio.ftl | 15 ++++++- locales/bg-BG/opencadstudio.ftl | 15 ++++++- locales/cs-CZ/opencadstudio.ftl | 15 ++++++- locales/de-DE/opencadstudio.ftl | 15 ++++++- locales/el-GR/opencadstudio.ftl | 15 ++++++- locales/en-US/opencadstudio.ftl | 15 ++++++- locales/es-ES/opencadstudio.ftl | 15 ++++++- locales/fi-FI/opencadstudio.ftl | 15 ++++++- locales/fr-FR/opencadstudio.ftl | 15 ++++++- locales/hi-IN/opencadstudio.ftl | 15 ++++++- locales/hu-HU/opencadstudio.ftl | 15 ++++++- locales/it-IT/opencadstudio.ftl | 15 ++++++- locales/ja-JP/opencadstudio.ftl | 15 ++++++- locales/ko-KR/opencadstudio.ftl | 15 ++++++- locales/nl-NL/opencadstudio.ftl | 15 ++++++- locales/pl-PL/opencadstudio.ftl | 15 ++++++- locales/pt-BR/opencadstudio.ftl | 15 ++++++- locales/ru-RU/opencadstudio.ftl | 15 ++++++- locales/tr-TR/opencadstudio.ftl | 15 ++++++- locales/zh-CN/opencadstudio.ftl | 15 ++++++- locales/zh-TW/opencadstudio.ftl | 15 ++++++- src/app/command_driver/solid3d.rs | 6 +-- src/app/commands/display.rs | 1 + src/app/update/command.rs | 8 ++-- src/locale_catalog.rs | 15 ++++++- src/modules/insert/solid3d_cmds.rs | 59 ++++++++++++++++++++++---- src/scene/model/sweep_command_model.rs | 6 +-- 27 files changed, 346 insertions(+), 64 deletions(-) diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index b5088c6f6..7bf85c705 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -3897,13 +3897,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP حدد نقطة الأساس: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP حدد نقطة المرجع الثانية: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP أدخل التعبير: + .sweep-specify-start-reference-length = SWEEP حدد طول المرجع الابتدائي + .sweep-specify-end-reference-length = SWEEP حدد طول المرجع النهائي + .sweep-specify-second-point = SWEEP حدد النقطة الثانية: + .sweep-expression-invalid = الصيغة غير صحيحة أو أن متغيرًا غير معرّف. أعد إدخال التعبير أو القيمة. + .sweep-modeling-operation-error = خطأ في عملية النمذجة: + .sweep-error-code-number = رقم رمز الخطأ: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = تعذر مسح __ocs_fmt_0__ من الكائنات المحددة. + .sweep-scale-closed-path = لا يمكن استخدام خيار المقياس عندما يكون منحنى المسار مغلقًا. + .sweep-scale-smooth-path = يجب أن يكون منحنى المسار سلسًا عند استخدام خيار المقياس. + .sweep-path-curve-not-valid = منحنى المسار المحدد غير صالح. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = تُسمح المقاطع النقطية عند البداية أو النهاية فقط، مع وجود منحنى بين الطرفين النقطيين. .loft-requires-at-least-two-cross-sections = يتطلب LOFT مقطعين على الأقل. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = يتطلب التشكيل المغلق ثلاثة مقاطع منحنية على الأقل دون أطراف نقطية. diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index 1d0073369..67c205ccc 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Посочи базова точка: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Посочи втора референтна точка: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Въведете израз: + .sweep-specify-start-reference-length = SWEEP Задайте начална референтна дължина + .sweep-specify-end-reference-length = SWEEP Задайте крайна референтна дължина + .sweep-specify-second-point = SWEEP Задайте втора точка: + .sweep-expression-invalid = Синтаксисът е грешен или променлива не е дефинирана. Въведете отново израза или стойността. + .sweep-modeling-operation-error = Грешка при моделираща операция: + .sweep-error-code-number = Номер на кода на грешката: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = __ocs_fmt_0__ избрани обекта не могат да бъдат изтеглени. + .sweep-scale-closed-path = Опцията за мащаб не може да се използва при затворена крива на траекторията. + .sweep-scale-smooth-path = Кривата на траекторията трябва да е гладка при опцията за мащаб. + .sweep-path-curve-not-valid = Избраната крива на траекторията е невалидна. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Точкови сечения са разрешени само в началото или края, с крива между точковите краища. .loft-requires-at-least-two-cross-sections = LOFT изисква поне две сечения. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Затвореният лофт изисква поне три криви сечения и никакви точкови краища. diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index ff14acdee..7bc87fc95 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -3882,13 +3882,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Určete základní bod: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Zadejte druhý referenční bod: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Zadejte výraz: + .sweep-specify-start-reference-length = SWEEP Zadejte počáteční referenční délku + .sweep-specify-end-reference-length = SWEEP Zadejte koncovou referenční délku + .sweep-specify-second-point = SWEEP Zadejte druhý bod: + .sweep-expression-invalid = Syntaxe je nesprávná nebo proměnná není definována. Zadejte znovu výraz nebo hodnotu. + .sweep-modeling-operation-error = Chyba operace modelování: + .sweep-error-code-number = Číslo kódu chyby: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Nelze tažením vytvořit __ocs_fmt_0__ vybraných objektů. + .sweep-scale-closed-path = Volbu měřítka nelze použít, je-li křivka trajektorie uzavřená. + .sweep-scale-smooth-path = Při použití volby měřítka musí být křivka trajektorie hladká. + .sweep-path-curve-not-valid = Vybraná křivka trajektorie není platná. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Bodové průřezy jsou povoleny jen na začátku nebo konci, s křivkou mezi bodovými konci. .loft-requires-at-least-two-cross-sections = LOFT vyžaduje alespoň dva průřezy. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Uzavřené šablonování vyžaduje alespoň tři křivkové průřezy a žádné bodové konce. diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index f18f5edc7..f9b2c93dd 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -3883,13 +3883,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Basispunkt angeben: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Zweiter Bezugspunkt angeben: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Ausdruck eingeben: + .sweep-specify-start-reference-length = SWEEP Anfängliche Referenzlänge angeben + .sweep-specify-end-reference-length = SWEEP End-Referenzlänge angeben + .sweep-specify-second-point = SWEEP Zweiten Punkt angeben: + .sweep-expression-invalid = Die Syntax ist falsch oder eine Variable ist nicht definiert. Ausdruck oder Wert erneut eingeben. + .sweep-modeling-operation-error = Modellierungsfehler: + .sweep-error-code-number = Fehlercode-Nummer: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = __ocs_fmt_0__ gewählte Objekte konnten nicht gesweept werden. + .sweep-scale-closed-path = Die Skalierungsoption kann bei geschlossener Pfadkurve nicht verwendet werden. + .sweep-scale-smooth-path = Die Pfadkurve muss bei Verwendung der Skalierungsoption glatt sein. + .sweep-path-curve-not-valid = Die gewählte Pfadkurve ist ungültig. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Punktquerschnitte sind nur am Anfang oder Ende zulässig; zwischen Punktenden muss eine Kurve liegen. .loft-requires-at-least-two-cross-sections = LOFT erfordert mindestens zwei Querschnitte. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Ein geschlossener Loft erfordert mindestens drei Kurvenquerschnitte und keine Punktenden. diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index d2ab60b7d..5421c23c6 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -3894,13 +3894,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Ορίστε σημείο βάσης: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Ορίστε δεύτερο σημείο αναφοράς: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Εισαγάγετε έκφραση: + .sweep-specify-start-reference-length = SWEEP Καθορίστε το αρχικό μήκος αναφοράς + .sweep-specify-end-reference-length = SWEEP Καθορίστε το τελικό μήκος αναφοράς + .sweep-specify-second-point = SWEEP Καθορίστε το δεύτερο σημείο: + .sweep-expression-invalid = Η σύνταξη είναι λανθασμένη ή μια μεταβλητή δεν έχει οριστεί. Εισαγάγετε ξανά την έκφραση ή την τιμή. + .sweep-modeling-operation-error = Σφάλμα λειτουργίας μοντελοποίησης: + .sweep-error-code-number = Αριθμός κωδικού σφάλματος: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Δεν είναι δυνατή η σάρωση __ocs_fmt_0__ επιλεγμένων αντικειμένων. + .sweep-scale-closed-path = Η επιλογή κλίμακας δεν μπορεί να χρησιμοποιηθεί όταν η καμπύλη διαδρομής είναι κλειστή. + .sweep-scale-smooth-path = Η καμπύλη διαδρομής πρέπει να είναι ομαλή όταν χρησιμοποιείται η επιλογή κλίμακας. + .sweep-path-curve-not-valid = Η επιλεγμένη καμπύλη διαδρομής δεν είναι έγκυρη. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Οι σημειακές διατομές επιτρέπονται μόνο στα άκρα, με καμπύλη ανάμεσα σε σημειακά άκρα. .loft-requires-at-least-two-cross-sections = Το LOFT απαιτεί τουλάχιστον δύο διατομές. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Κλειστή διαμόρφωση απαιτεί τουλάχιστον τρεις καμπύλες διατομές και κανένα σημειακό άκρο. diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 1df12baa1..546979706 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -3895,13 +3895,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP Select sweep path or [Alignment/Base point/Scale/Twist]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP Align sweep object perpendicular to path [Yes/No] .sweep-specify-base-point = SWEEP Specify base point: - .sweep-enter-scale-factor-or-reference = SWEEP Enter scale factor or [Reference] + .sweep-enter-scale-factor-or-reference = SWEEP Enter scale factor or [Reference/Expression] .sweep-specify-reference-length-or-first-point = SWEEP Specify reference length or first point .sweep-specify-second-reference-point = SWEEP Specify second reference point: .sweep-specify-new-length-or-points = SWEEP Specify new length or [Points] .sweep-specify-first-point-of-new-length = SWEEP Specify first point of new length: .sweep-specify-second-point-of-new-length = SWEEP Specify second point of new length: - .sweep-specify-twist-angle-or-bank = SWEEP Specify twist angle or [Bank] + .sweep-specify-twist-angle-or-bank = SWEEP Enter twist angle or allow banking for a non-planar sweep path [Bank/EXpression] + .sweep-enter-expression = SWEEP Enter expression: + .sweep-specify-start-reference-length = SWEEP Specify start reference length + .sweep-specify-end-reference-length = SWEEP Specify end reference length + .sweep-specify-second-point = SWEEP Specify second point: + .sweep-expression-invalid = The syntax is incorrect or a variable is not defined. Reenter the expression or value. + .sweep-modeling-operation-error = Modeling Operation Error: + .sweep-error-code-number = Error Code Number is __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Unable to sweep __ocs_fmt_0__ selected objects. + .sweep-scale-closed-path = Cannot use scale option when path curve is closed. + .sweep-scale-smooth-path = Path curve must be smooth when using scale option. + .sweep-path-curve-not-valid = The selected path curve is not valid. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Point cross-sections are allowed only at the first or last end, with a curve between point ends. .loft-requires-at-least-two-cross-sections = LOFT requires at least two cross-sections. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = A closed loft requires at least three curve cross-sections and no point ends. diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index 8c6199d4d..51a2066a9 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -3885,13 +3885,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Especifique el punto base: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Precise el segundo punto de referencia: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Introduzca la expresión: + .sweep-specify-start-reference-length = SWEEP Precise la longitud de referencia inicial + .sweep-specify-end-reference-length = SWEEP Precise la longitud de referencia final + .sweep-specify-second-point = SWEEP Precise el segundo punto: + .sweep-expression-invalid = La sintaxis es incorrecta o una variable no está definida. Vuelva a introducir la expresión o el valor. + .sweep-modeling-operation-error = Error de operación de modelado: + .sweep-error-code-number = Número de código de error: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = No se pueden barrer __ocs_fmt_0__ objetos seleccionados. + .sweep-scale-closed-path = No se puede usar la opción de escala si la curva de trayectoria está cerrada. + .sweep-scale-smooth-path = La curva de trayectoria debe ser suave al usar la opción de escala. + .sweep-path-curve-not-valid = La curva de trayectoria seleccionada no es válida. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Las secciones de punto solo se permiten en los extremos, con una curva entre extremos de punto. .loft-requires-at-least-two-cross-sections = LOFT requiere al menos dos secciones. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Un solevado cerrado requiere al menos tres secciones de curva y ningún extremo de punto. diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index 777353a31..428d3eb07 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Määritä peruspiste: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Määritä toinen vertailupiste: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Anna lauseke: + .sweep-specify-start-reference-length = SWEEP Määritä alkuviitepituus + .sweep-specify-end-reference-length = SWEEP Määritä loppuviitepituus + .sweep-specify-second-point = SWEEP Määritä toinen piste: + .sweep-expression-invalid = Syntaksi on virheellinen tai muuttujaa ei ole määritetty. Anna lauseke tai arvo uudelleen. + .sweep-modeling-operation-error = Mallinnustoiminnon virhe: + .sweep-error-code-number = Virhekoodin numero: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = __ocs_fmt_0__ valittua objektia ei voitu pyyhkäistä. + .sweep-scale-closed-path = Skaalausasetusta ei voi käyttää, kun polkukäyrä on suljettu. + .sweep-scale-smooth-path = Polkukäyrän on oltava sileä skaalausasetusta käytettäessä. + .sweep-path-curve-not-valid = Valittu polkukäyrä ei kelpaa. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Pistepoikkileikkaukset sallitaan vain alku- tai loppupäässä, ja pistepäiden välissä on oltava käyrä. .loft-requires-at-least-two-cross-sections = LOFT vaatii vähintään kaksi poikkileikkausta. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Suljettu loft vaatii vähintään kolme käyräpoikkileikkausta ilman pistepäitä. diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index e9f4f0cb4..821ddf507 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -3885,13 +3885,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Spécifier le point de base: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Préciser le deuxième point de référence: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Entrez l'expression : + .sweep-specify-start-reference-length = SWEEP Spécifiez la longueur de référence de départ + .sweep-specify-end-reference-length = SWEEP Spécifiez la longueur de référence de fin + .sweep-specify-second-point = SWEEP Spécifiez le deuxième point : + .sweep-expression-invalid = La syntaxe est incorrecte ou une variable n'est pas définie. Entrez de nouveau l'expression ou la valeur. + .sweep-modeling-operation-error = Erreur d'opération de modélisation : + .sweep-error-code-number = Numéro du code d'erreur : __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Impossible de balayer __ocs_fmt_0__ objets sélectionnés. + .sweep-scale-closed-path = Impossible d'utiliser l'option d'échelle lorsque la courbe de trajectoire est fermée. + .sweep-scale-smooth-path = La courbe de trajectoire doit être lisse avec l'option d'échelle. + .sweep-path-curve-not-valid = La courbe de trajectoire sélectionnée n'est pas valide. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Les sections ponctuelles ne sont autorisées qu’aux extrémités, avec une courbe entre deux extrémités ponctuelles. .loft-requires-at-least-two-cross-sections = LOFT nécessite au moins deux sections. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Un lissage fermé nécessite au moins trois sections courbes et aucune extrémité ponctuelle. diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index e13ced65d..6f0b1ea31 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -3873,13 +3873,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP आधार बिंदु निर्दिष्ट करें: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP दूसरे संदर्भ बिंदु को निर्दिष्ट करें: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP व्यंजक दर्ज करें: + .sweep-specify-start-reference-length = SWEEP प्रारंभिक संदर्भ लंबाई निर्दिष्ट करें + .sweep-specify-end-reference-length = SWEEP अंतिम संदर्भ लंबाई निर्दिष्ट करें + .sweep-specify-second-point = SWEEP दूसरा बिंदु निर्दिष्ट करें: + .sweep-expression-invalid = सिंटैक्स गलत है या कोई चर परिभाषित नहीं है। व्यंजक या मान फिर से दर्ज करें। + .sweep-modeling-operation-error = मॉडलिंग ऑपरेशन त्रुटि: + .sweep-error-code-number = त्रुटि कोड संख्या: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = __ocs_fmt_0__ चयनित ऑब्जेक्ट स्वीप नहीं किए जा सके। + .sweep-scale-closed-path = पथ वक्र बंद होने पर स्केल विकल्प का उपयोग नहीं किया जा सकता। + .sweep-scale-smooth-path = स्केल विकल्प का उपयोग करते समय पथ वक्र चिकना होना चाहिए। + .sweep-path-curve-not-valid = चयनित पथ वक्र मान्य नहीं है। .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = बिंदु अनुप्रस्थ काट केवल पहले या अंतिम सिरे पर हो सकते हैं; बिंदु सिरों के बीच एक वक्र होना चाहिए। .loft-requires-at-least-two-cross-sections = LOFT के लिए कम से कम दो अनुप्रस्थ काट आवश्यक हैं। .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = बंद लॉफ्ट के लिए कम से कम तीन वक्र अनुप्रस्थ काट चाहिए और कोई बिंदु सिरा नहीं होना चाहिए। diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index ca1abb88d..c4b130d38 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Adja meg a bázispontot: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Második referenciapont megadása: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Adja meg a kifejezést: + .sweep-specify-start-reference-length = SWEEP Adja meg a kezdő referenciahosszt + .sweep-specify-end-reference-length = SWEEP Adja meg a záró referenciahosszt + .sweep-specify-second-point = SWEEP Adja meg a második pontot: + .sweep-expression-invalid = A szintaxis hibás, vagy egy változó nincs definiálva. Adja meg újra a kifejezést vagy az értéket. + .sweep-modeling-operation-error = Modellezési művelet hiba: + .sweep-error-code-number = Hibakód száma: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = __ocs_fmt_0__ kijelölt objektum nem söpörhető. + .sweep-scale-closed-path = A méretezés lehetőség nem használható zárt pályagörbénél. + .sweep-scale-smooth-path = A méretezés lehetőség használatakor a pályagörbének simának kell lennie. + .sweep-path-curve-not-valid = A kijelölt pályagörbe érvénytelen. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Pontkeresztmetszet csak a kezdő- vagy végponton lehet, a pontvégek között görbének kell lennie. .loft-requires-at-least-two-cross-sections = A LOFT legalább két keresztmetszetet igényel. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = A zárt pásztázás legalább három görbekeresztmetszetet igényel pontvégek nélkül. diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index b5cc454e9..79036c6a7 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Specificare il punto base: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Specificare il secondo punto di riferimento: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Immettere l'espressione: + .sweep-specify-start-reference-length = SWEEP Specificare la lunghezza di riferimento iniziale + .sweep-specify-end-reference-length = SWEEP Specificare la lunghezza di riferimento finale + .sweep-specify-second-point = SWEEP Specificare il secondo punto: + .sweep-expression-invalid = La sintassi non è corretta o una variabile non è definita. Immettere di nuovo l'espressione o il valore. + .sweep-modeling-operation-error = Errore operazione di modellazione: + .sweep-error-code-number = Numero codice errore: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Impossibile eseguire lo sweep di __ocs_fmt_0__ oggetti selezionati. + .sweep-scale-closed-path = Impossibile usare l'opzione di scala se la curva del percorso è chiusa. + .sweep-scale-smooth-path = La curva del percorso deve essere continua quando si usa l'opzione di scala. + .sweep-path-curve-not-valid = La curva del percorso selezionata non è valida. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Le sezioni puntiformi sono ammesse solo alle estremità, con una curva tra estremità puntiformi. .loft-requires-at-least-two-cross-sections = LOFT richiede almeno due sezioni. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Un loft chiuso richiede almeno tre sezioni curve e nessuna estremità puntiforme. diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index 7d02e9959..928c35788 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -3873,13 +3873,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP 基点を指定: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP 2 番目の参照点を指定: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP 式を入力: + .sweep-specify-start-reference-length = SWEEP 開始参照長さを指定 + .sweep-specify-end-reference-length = SWEEP 終了参照長さを指定 + .sweep-specify-second-point = SWEEP 2 点目を指定: + .sweep-expression-invalid = 構文が正しくないか、変数が定義されていません。 式または値を再入力してください。 + .sweep-modeling-operation-error = モデリング操作エラー: + .sweep-error-code-number = エラー コード番号: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = 選択した __ocs_fmt_0__ 個のオブジェクトをスイープできません。 + .sweep-scale-closed-path = パス曲線が閉じている場合、尺度オプションは使用できません。 + .sweep-scale-smooth-path = 尺度オプションを使用する場合、パス曲線は滑らかである必要があります。 + .sweep-path-curve-not-valid = 選択したパス曲線は無効です。 .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = 点の断面は始端または終端にのみ使用でき、点の端部の間には曲線が必要です。 .loft-requires-at-least-two-cross-sections = LOFTには少なくとも2つの断面が必要です。 .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = 閉じたロフトには少なくとも3つの曲線断面が必要で、点の端部は使用できません。 diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index 2a61aa614..ad920b2bd 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP 기준점을 지정하세요: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP 두 번째 참조점 지정: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP 식 입력: + .sweep-specify-start-reference-length = SWEEP 시작 참조 길이 지정 + .sweep-specify-end-reference-length = SWEEP 끝 참조 길이 지정 + .sweep-specify-second-point = SWEEP 두 번째 점 지정: + .sweep-expression-invalid = 구문이 잘못되었거나 변수가 정의되지 않았습니다. 식 또는 값을 다시 입력하십시오. + .sweep-modeling-operation-error = 모델링 작업 오류: + .sweep-error-code-number = 오류 코드 번호: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = 선택한 객체 __ocs_fmt_0__개를 스윕할 수 없습니다. + .sweep-scale-closed-path = 경로 곡선이 닫혀 있으면 축척 옵션을 사용할 수 없습니다. + .sweep-scale-smooth-path = 축척 옵션을 사용할 때 경로 곡선은 매끄러워야 합니다. + .sweep-path-curve-not-valid = 선택한 경로 곡선이 유효하지 않습니다. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = 점 단면은 시작 또는 끝에만 허용되며 점 끝 사이에 곡선이 있어야 합니다. .loft-requires-at-least-two-cross-sections = LOFT에는 두 개 이상의 단면이 필요합니다. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = 닫힌 로프트에는 곡선 단면이 세 개 이상 필요하며 점 끝은 사용할 수 없습니다. diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index da2f69ba4..a08a664b1 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -3883,13 +3883,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Basispunt specificeren: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Tweede referentiepunt opgeven: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Voer de expressie in: + .sweep-specify-start-reference-length = SWEEP Geef de begin-referentielengte op + .sweep-specify-end-reference-length = SWEEP Geef de eind-referentielengte op + .sweep-specify-second-point = SWEEP Geef het tweede punt op: + .sweep-expression-invalid = De syntaxis is onjuist of een variabele is niet gedefinieerd. Voer de expressie of waarde opnieuw in. + .sweep-modeling-operation-error = Fout bij modelleerbewerking: + .sweep-error-code-number = Foutcodenummer: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Kan __ocs_fmt_0__ geselecteerde objecten niet sweepen. + .sweep-scale-closed-path = De schaaloptie kan niet worden gebruikt als de padcurve gesloten is. + .sweep-scale-smooth-path = De padcurve moet vloeiend zijn bij gebruik van de schaaloptie. + .sweep-path-curve-not-valid = De geselecteerde padcurve is ongeldig. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Puntdoorsneden zijn alleen aan het begin of einde toegestaan, met een kromme tussen puntuiteinden. .loft-requires-at-least-two-cross-sections = LOFT vereist minstens twee doorsneden. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Een gesloten loft vereist minstens drie krommedoorsneden en geen puntuiteinden. diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index fc0c483bf..1e08c259e 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -3884,13 +3884,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Określ punkt bazowy: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Określ drugi punkt odniesienia: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Wprowadź wyrażenie: + .sweep-specify-start-reference-length = SWEEP Określ początkową długość odniesienia + .sweep-specify-end-reference-length = SWEEP Określ końcową długość odniesienia + .sweep-specify-second-point = SWEEP Określ drugi punkt: + .sweep-expression-invalid = Składnia jest niepoprawna lub zmienna nie jest zdefiniowana. Wprowadź ponownie wyrażenie lub wartość. + .sweep-modeling-operation-error = Błąd operacji modelowania: + .sweep-error-code-number = Numer kodu błędu: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Nie można przeciągnąć __ocs_fmt_0__ wybranych obiektów. + .sweep-scale-closed-path = Nie można użyć opcji skali, gdy krzywa ścieżki jest zamknięta. + .sweep-scale-smooth-path = Krzywa ścieżki musi być gładka przy użyciu opcji skali. + .sweep-path-curve-not-valid = Wybrana krzywa ścieżki jest nieprawidłowa. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Przekroje punktowe są dozwolone tylko na początku lub końcu, z krzywą między punktowymi końcami. .loft-requires-at-least-two-cross-sections = LOFT wymaga co najmniej dwóch przekrojów. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Zamknięte wyciągnięcie po przekrojach wymaga co najmniej trzech przekrojów krzywych i braku punktowych końców. diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index b2c2d9a73..2544962e4 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -3886,13 +3886,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Especifique o ponto base: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Especifique o segundo ponto de referência: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Insira a expressão: + .sweep-specify-start-reference-length = SWEEP Especifique o comprimento de referência inicial + .sweep-specify-end-reference-length = SWEEP Especifique o comprimento de referência final + .sweep-specify-second-point = SWEEP Especifique o segundo ponto: + .sweep-expression-invalid = A sintaxe está incorreta ou uma variável não está definida. Insira novamente a expressão ou o valor. + .sweep-modeling-operation-error = Erro de operação de modelagem: + .sweep-error-code-number = Número do código de erro: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Não foi possível varrer __ocs_fmt_0__ objetos selecionados. + .sweep-scale-closed-path = Não é possível usar a opção de escala quando a curva do caminho está fechada. + .sweep-scale-smooth-path = A curva do caminho deve ser suave ao usar a opção de escala. + .sweep-path-curve-not-valid = A curva do caminho selecionada não é válida. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Seções pontuais são permitidas apenas nas extremidades, com uma curva entre extremidades pontuais. .loft-requires-at-least-two-cross-sections = LOFT exige pelo menos duas seções. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Uma transição fechada exige pelo menos três seções de curva e nenhuma extremidade pontual. diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 86bc3212e..6e24f537d 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -3886,13 +3886,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Укажите базовую точку: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP Укажите вторую точку отсчета: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP Введите выражение: + .sweep-specify-start-reference-length = SWEEP Укажите начальную опорную длину + .sweep-specify-end-reference-length = SWEEP Укажите конечную опорную длину + .sweep-specify-second-point = SWEEP Укажите вторую точку: + .sweep-expression-invalid = Неверный синтаксис или переменная не определена. Повторите ввод выражения или значения. + .sweep-modeling-operation-error = Ошибка операции моделирования: + .sweep-error-code-number = Номер кода ошибки: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Невозможно выполнить сдвиг для выбранных объектов: __ocs_fmt_0__. + .sweep-scale-closed-path = Нельзя использовать масштаб, если кривая траектории замкнута. + .sweep-scale-smooth-path = При использовании масштаба кривая траектории должна быть гладкой. + .sweep-path-curve-not-valid = Выбранная кривая траектории недопустима. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Точечные сечения допустимы только в начале или конце; между точечными концами должна быть кривая. .loft-requires-at-least-two-cross-sections = LOFT требует не менее двух сечений. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Замкнутое тело по сечениям требует не менее трёх кривых сечений без точечных концов. diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index 436b5bebd..9c28c6560 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -3852,13 +3852,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP Temel noktayı belirtin: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP İkinci referans noktasını belirtin: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP İfadeyi girin: + .sweep-specify-start-reference-length = SWEEP Başlangıç referans uzunluğunu belirtin + .sweep-specify-end-reference-length = SWEEP Bitiş referans uzunluğunu belirtin + .sweep-specify-second-point = SWEEP İkinci noktayı belirtin: + .sweep-expression-invalid = Sözdizimi hatalı veya bir değişken tanımlı değil. İfadeyi veya değeri yeniden girin. + .sweep-modeling-operation-error = Modelleme İşlemi Hatası: + .sweep-error-code-number = Hata Kodu Numarası: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = Seçilen __ocs_fmt_0__ nesne süpürülemedi. + .sweep-scale-closed-path = Yol eğrisi kapalıyken ölçek seçeneği kullanılamaz. + .sweep-scale-smooth-path = Ölçek seçeneği kullanılırken yol eğrisi düzgün olmalıdır. + .sweep-path-curve-not-valid = Seçilen yol eğrisi geçerli değil. .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = Nokta kesitleri yalnızca ilk veya son uçta olabilir; nokta uçları arasında bir eğri bulunmalıdır. .loft-requires-at-least-two-cross-sections = LOFT en az iki kesit gerektirir. .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = Kapalı bir loft en az üç eğri kesiti gerektirir ve nokta ucu içeremez. diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index 5216b4d44..23813b25d 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -3868,13 +3868,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP 指定基点: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP 指定第二个参照点: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP 输入表达式: + .sweep-specify-start-reference-length = SWEEP 指定起点参照长度 + .sweep-specify-end-reference-length = SWEEP 指定端点参照长度 + .sweep-specify-second-point = SWEEP 指定第二点: + .sweep-expression-invalid = 语法不正确或变量未定义。 请重新输入表达式或值。 + .sweep-modeling-operation-error = 建模操作错误: + .sweep-error-code-number = 错误代码号: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = 无法扫掠 __ocs_fmt_0__ 个选定对象。 + .sweep-scale-closed-path = 路径曲线闭合时不能使用比例选项。 + .sweep-scale-smooth-path = 使用比例选项时路径曲线必须平滑。 + .sweep-path-curve-not-valid = 选定的路径曲线无效。 .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = 点截面仅允许位于起点或终点,点端之间必须有曲线。 .loft-requires-at-least-two-cross-sections = LOFT 至少需要两个截面。 .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = 闭合放样至少需要三个曲线截面,且不能包含点端。 diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index bf4254fed..54ac80614 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -3880,13 +3880,24 @@ insert = .sweep-select-sweep-path-or-alignment-base-point-scale-twist = SWEEP { draw.select }: { model.sweep } · { common.path } [{ common.alignment-title-case }/{ styles.basepoint }/{ common.scale }/{ properties.twist }]: .sweep-align-sweep-object-perpendicular-to-path-yes-no = SWEEP { common.alignment-title-case }: { model.sweep } ⟂ { common.path } [{ common.yes }/{ common.no }] .sweep-specify-base-point = SWEEP 指定基點: - .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }]: + .sweep-enter-scale-factor-or-reference = SWEEP { common.specify }: { style-manager.scale-factor } [{ common.reference }/{ common.expression }] .sweep-specify-reference-length-or-first-point = SWEEP { common.specify }: { common.reference-length } · { draw.first-point }: .sweep-specify-second-reference-point = SWEEP 指定第二個參照點: .sweep-specify-new-length-or-points = SWEEP { common.specify }: { common.new-length } [{ common.points }]: .sweep-specify-first-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { draw.first-point }: .sweep-specify-second-point-of-new-length = SWEEP { common.specify }: { common.new-length } · { model.second-point }: - .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }]: + .sweep-specify-twist-angle-or-bank = SWEEP { common.specify }: { properties.twist } · { common.angle } [{ common.bank }/{ common.expression }] + .sweep-enter-expression = SWEEP 輸入運算式: + .sweep-specify-start-reference-length = SWEEP 指定起點參考長度 + .sweep-specify-end-reference-length = SWEEP 指定終點參考長度 + .sweep-specify-second-point = SWEEP 指定第二點: + .sweep-expression-invalid = 語法不正確或變數未定義。 請重新輸入運算式或值。 + .sweep-modeling-operation-error = 塑型作業錯誤: + .sweep-error-code-number = 錯誤代碼編號: __ocs_fmt_0__ + .sweep-unable-to-sweep-selected-objects = 無法掃掠 __ocs_fmt_0__ 個選取的物件。 + .sweep-scale-closed-path = 路徑曲線封閉時無法使用比例選項。 + .sweep-scale-smooth-path = 使用比例選項時路徑曲線必須平滑。 + .sweep-path-curve-not-valid = 選取的路徑曲線無效。 .point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p = 點斷面僅允許位於起點或終點,點端之間必須有曲線。 .loft-requires-at-least-two-cross-sections = LOFT 至少需要兩個斷面。 .a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends = 封閉斷面混成至少需要三個曲線斷面,且不能包含點端。 diff --git a/src/app/command_driver/solid3d.rs b/src/app/command_driver/solid3d.rs index 958e8dea7..96999398d 100644 --- a/src/app/command_driver/solid3d.rs +++ b/src/app/command_driver/solid3d.rs @@ -519,8 +519,8 @@ impl OpenCADStudio { Ok(value) => value, Err(code) => { if let Some(code) = code { - self.command_line.push_output(&format!("Modeling Operation Error: -Error Code Number is {code}")); + self.command_line.push_output(crate::t!("Modeling Operation Error:").as_ref()); + self.command_line.push_output(crate::tf!("Error Code Number is {code}", code = code).as_ref()); } failed += 1; continue; @@ -564,7 +564,7 @@ Error Code Number is {code}")); self.tabs[i].dirty = true; } if failed > 0 { - self.command_line.push_output(&format!("Unable to sweep {failed} selected objects.")); + self.command_line.push_output(crate::tf!("Unable to sweep {failed} selected objects.", failed = failed).as_ref()); } if let Some(pending) = pending { self.commit_undo_delta(i, pending); diff --git a/src/app/commands/display.rs b/src/app/commands/display.rs index 0569f6079..b194a71f9 100644 --- a/src/app/commands/display.rs +++ b/src/app/commands/display.rs @@ -817,6 +817,7 @@ impl OpenCADStudio { let color = self.tabs[i].scene.layer_color(&self.tabs[i].active_layer); let isolines = crate::entities::solid3d::clamp_header_isolines(self.tabs[i].scene.document.header.isolines); let mut cmd = SweepCommand::new(color, isolines); + cmd.set_parameters(self.tabs[i].scene.named_parameters().clone()); let selected = self.tabs[i].scene.selected_handles_in_order() .into_iter() .filter_map(|handle| self.tabs[i].scene.document.get_entity(handle) diff --git a/src/app/update/command.rs b/src/app/update/command.rs index 2c85ace58..930f1ee1d 100644 --- a/src/app/update/command.rs +++ b/src/app/update/command.rs @@ -3947,10 +3947,10 @@ pub(super) fn on_tab_close(&mut self, idx: usize) -> Task { .scene .solid_history_property_refusal(handle, field, &val) { - self.command_line.push_output(&format!( - "Modeling Operation Error: -Error Code Number is {code}" - )); + self.command_line.push_output(crate::t!("Modeling Operation Error:").as_ref()); + self.command_line.push_output( + crate::tf!("Error Code Number is {code}", code = code).as_ref(), + ); } } } else if self.tabs[i] diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index f78d847b5..bbc4c6feb 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -4463,13 +4463,24 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "SWEEP Select sweep path or [Alignment/Base point/Scale/Twist]:" => Some(("insert", "sweep-select-sweep-path-or-alignment-base-point-scale-twist")), "SWEEP Align sweep object perpendicular to path [Yes/No]" => Some(("insert", "sweep-align-sweep-object-perpendicular-to-path-yes-no")), "SWEEP Specify base point:" => Some(("insert", "sweep-specify-base-point")), - "SWEEP Enter scale factor or [Reference]" => Some(("insert", "sweep-enter-scale-factor-or-reference")), + "SWEEP Enter scale factor or [Reference/Expression]" => Some(("insert", "sweep-enter-scale-factor-or-reference")), "SWEEP Specify reference length or first point" => Some(("insert", "sweep-specify-reference-length-or-first-point")), "SWEEP Specify second reference point:" => Some(("insert", "sweep-specify-second-reference-point")), "SWEEP Specify new length or [Points]" => Some(("insert", "sweep-specify-new-length-or-points")), "SWEEP Specify first point of new length:" => Some(("insert", "sweep-specify-first-point-of-new-length")), "SWEEP Specify second point of new length:" => Some(("insert", "sweep-specify-second-point-of-new-length")), - "SWEEP Specify twist angle or [Bank]" => Some(("insert", "sweep-specify-twist-angle-or-bank")), + "SWEEP Enter twist angle or allow banking for a non-planar sweep path [Bank/EXpression]" => Some(("insert", "sweep-specify-twist-angle-or-bank")), + "SWEEP Enter expression:" => Some(("insert", "sweep-enter-expression")), + "SWEEP Specify start reference length" => Some(("insert", "sweep-specify-start-reference-length")), + "SWEEP Specify end reference length" => Some(("insert", "sweep-specify-end-reference-length")), + "SWEEP Specify second point:" => Some(("insert", "sweep-specify-second-point")), + "The syntax is incorrect or a variable is not defined. Reenter the expression or value." => Some(("insert", "sweep-expression-invalid")), + "Modeling Operation Error:" => Some(("insert", "sweep-modeling-operation-error")), + "Error Code Number is {code}" => Some(("insert", "sweep-error-code-number")), + "Unable to sweep {failed} selected objects." => Some(("insert", "sweep-unable-to-sweep-selected-objects")), + "Cannot use scale option when path curve is closed." => Some(("insert", "sweep-scale-closed-path")), + "Path curve must be smooth when using scale option." => Some(("insert", "sweep-scale-smooth-path")), + "The selected path curve is not valid." => Some(("insert", "sweep-path-curve-not-valid")), "Point cross-sections are allowed only at the first or last end, with a curve between point ends." => Some(("insert", "point-cross-sections-are-allowed-only-at-the-first-or-last-end-with-a-curve-between-p")), "LOFT requires at least two cross-sections." => Some(("insert", "loft-requires-at-least-two-cross-sections")), "A closed loft requires at least three curve cross-sections and no point ends." => Some(("insert", "a-closed-loft-requires-at-least-three-curve-cross-sections-and-no-point-ends")), diff --git a/src/modules/insert/solid3d_cmds.rs b/src/modules/insert/solid3d_cmds.rs index d2aedee51..5c5b7b088 100644 --- a/src/modules/insert/solid3d_cmds.rs +++ b/src/modules/insert/solid3d_cmds.rs @@ -1623,6 +1623,8 @@ pub struct SweepCommand { reference_length: f64, new_length_start: Option, end_length: f64, + /// The drawing's named parameters, for Expression input. + parameters: crate::scene::named_parameters::ParameterTable, isolines: usize, color: [f32; 4], } @@ -1642,6 +1644,8 @@ enum SweepStep { NewLength, NewLengthEnd, Twist, + ScaleExpression, + TwistExpression, } impl SweepCommand { @@ -1662,11 +1666,23 @@ impl SweepCommand { reference_length: 1.0, new_length_start: None, end_length: 1.0, + parameters: Default::default(), isolines, color, } } + pub fn set_parameters(&mut self, parameters: crate::scene::named_parameters::ParameterTable) { + self.parameters = parameters; + } + + /// An Expression input, evaluated against the drawing's parameters. + fn evaluate(&self, text: &str) -> Option { + let mut table = self.parameters.clone(); + table.set("sweepExpression", text).ok()?; + table.resolve("sweepExpression").ok().filter(|value| value.is_finite()) + } + pub fn set_preselection(&mut self, profiles: Vec<(Handle, EntityType)>) { self.set_profiles(profiles); if !self.profiles.is_empty() { @@ -1755,8 +1771,9 @@ impl CadCommand for SweepCommand { ), SweepStep::BasePoint => t!("SWEEP Specify base point:").into_owned(), SweepStep::Scale => format!( - "{} <{}>:", t!("SWEEP Enter scale factor or [Reference]"), self.options.scale, + "{}<{:.4}>:", t!("SWEEP Enter scale factor or [Reference/Expression]"), self.options.scale, ), + SweepStep::ScaleExpression | SweepStep::TwistExpression => t!("SWEEP Enter expression:").into_owned(), SweepStep::ReferenceLength => format!( "{} <{}>:", t!("SWEEP Specify start reference length"), @@ -1769,12 +1786,12 @@ impl CadCommand for SweepCommand { crate::entities::common::format_length(self.end_length), ), SweepStep::Twist => format!( - "{} <{}>:", - t!("SWEEP Specify twist angle or [Bank]"), + "{}<{}>:", + t!("SWEEP Enter twist angle or allow banking for a non-planar sweep path [Bank/EXpression]"), if self.options.bank { "Bank".to_string() } else { - crate::entities::common::format_angle(self.options.twist_angle) + format!("{:.4}", self.options.twist_angle.to_degrees()) }, ), } @@ -1791,8 +1808,8 @@ impl CadCommand for SweepCommand { CmdOption::new("Twist", "TWIST"), ], SweepStep::Alignment => vec![CmdOption::new("Yes", "YES"), CmdOption::new("No", "NO")], - SweepStep::Scale => vec![CmdOption::new("Reference", "REFERENCE")], - SweepStep::Twist => vec![CmdOption::new("Bank", "BANK")], + SweepStep::Scale => vec![CmdOption::new("Reference", "REFERENCE"), CmdOption::new("Expression", "EXPRESSION")], + SweepStep::Twist => vec![CmdOption::new("Bank", "BANK"), CmdOption::new("EXpression", "EXPRESSION")], _ => Vec::new(), } } @@ -1820,7 +1837,10 @@ impl CadCommand for SweepCommand { }; if (self.options.scale - 1.0).abs() > 1e-12 { if let Some(message) = crate::scene::model::sweep_model::scaled_sweep_path_refusal(&path) { - return CmdResult::ReportMeasurement(message.to_string()); + return CmdResult::ReportMeasurement(format!( + "{} +{}", t!(message), t!("The selected path curve is not valid."), + )); } } self.finish(handle) @@ -1863,6 +1883,7 @@ impl CadCommand for SweepCommand { SweepStep::PickProfiles | SweepStep::Mode | SweepStep::PickPath | SweepStep::Alignment | SweepStep::Scale | SweepStep::ReferenceLength | SweepStep::NewLength | SweepStep::Twist + | SweepStep::ScaleExpression | SweepStep::TwistExpression ) } @@ -1915,7 +1936,9 @@ impl CadCommand for SweepCommand { self.step = SweepStep::PickPath; } SweepStep::Scale => { - if "REFERENCE".starts_with(&keyword) { + if "EXPRESSION".starts_with(&keyword) { + self.step = SweepStep::ScaleExpression; + } else if "REFERENCE".starts_with(&keyword) { self.reference_start = None; self.new_length_start = None; self.step = SweepStep::ReferenceLength; @@ -1937,8 +1960,25 @@ impl CadCommand for SweepCommand { return None; } } + SweepStep::ScaleExpression | SweepStep::TwistExpression => { + let Some(value) = self.evaluate(value) else { + return Some(CmdResult::ReportMeasurement(t!( + "The syntax is incorrect or a variable is not defined. Reenter the expression or value." + ).into_owned())); + }; + if self.step == SweepStep::ScaleExpression { + self.set_scale(value); + } else { + self.options.twist_angle = value.to_radians(); + self.options.bank = false; + SWEEP_BANK.store(false, std::sync::atomic::Ordering::Relaxed); + } + self.step = SweepStep::PickPath; + } SweepStep::Twist => { - if "BANK".starts_with(&keyword) { + if keyword.len() >= 2 && "EXPRESSION".starts_with(&keyword) { + self.step = SweepStep::TwistExpression; + } else if "BANK".starts_with(&keyword) { self.options.bank = true; SWEEP_BANK.store(true, std::sync::atomic::Ordering::Relaxed); self.step = SweepStep::PickPath; @@ -1963,6 +2003,7 @@ impl CadCommand for SweepCommand { } SweepStep::Mode => self.step = SweepStep::PickProfiles, SweepStep::Alignment | SweepStep::Scale | SweepStep::Twist => self.step = SweepStep::PickPath, + SweepStep::ScaleExpression | SweepStep::TwistExpression => {} SweepStep::ReferenceLength => self.step = SweepStep::NewLength, SweepStep::NewLength => { self.set_end_length(self.end_length); diff --git a/src/scene/model/sweep_command_model.rs b/src/scene/model/sweep_command_model.rs index f954561af..812dc6192 100644 --- a/src/scene/model/sweep_command_model.rs +++ b/src/scene/model/sweep_command_model.rs @@ -76,11 +76,9 @@ pub fn scaled_sweep_path_refusal(path: &EntityType) -> Option<&'static str> { }, }; if closed { - Some("Cannot use scale option when path curve is closed. -The selected path curve is not valid.") + Some("Cannot use scale option when path curve is closed.") } else if !smooth { - Some("Path curve must be smooth when using scale option. -The selected path curve is not valid.") + Some("Path curve must be smooth when using scale option.") } else { None }