forked from 1b-agent/opencadstudio-upstream
Sync current main and companion codec changes before preserving unsupported frame rows, rendering in the entity plane, and sharing final layout metrics with placement preview.
109 lines
3.8 KiB
Rust
109 lines
3.8 KiB
Rust
use acadrust::{EntityType, Handle};
|
|
|
|
impl super::OpenCADStudio {
|
|
pub(super) fn open_tolerance_dialog(&mut self, editing: Option<Handle>) {
|
|
let i = self.active_tab;
|
|
if editing.is_some_and(|handle| self.tabs[i].scene.is_layer_locked(handle)) {
|
|
return;
|
|
}
|
|
let text = editing
|
|
.and_then(|handle| self.tabs[i].scene.document.get_entity(handle))
|
|
.and_then(|entity| match entity {
|
|
EntityType::Tolerance(tolerance) => Some(tolerance.text.as_str()),
|
|
_ => None,
|
|
})
|
|
.unwrap_or_default();
|
|
self.geometric_tolerance = Some(
|
|
crate::ui::window::geometric_tolerance::State::from_text(editing, text),
|
|
);
|
|
self.active_modal = Some(super::ModalKind::GeometricTolerance);
|
|
self.modal_offset = iced::Vector::ZERO;
|
|
self.modal_resize = iced::Vector::ZERO;
|
|
self.modal_content_size = None;
|
|
self.modal_drag_last = None;
|
|
self.modal_dragging = false;
|
|
self.modal_resizing = false;
|
|
}
|
|
|
|
pub(super) fn apply_tolerance_dialog_edit(&mut self) -> bool {
|
|
let Some(state) = self.geometric_tolerance.as_ref() else {
|
|
return false;
|
|
};
|
|
let Some(handle) = state.editing else {
|
|
return false;
|
|
};
|
|
if !state.is_valid() || self.tabs[self.active_tab].scene.is_layer_locked(handle) {
|
|
return false;
|
|
}
|
|
let text = state.to_text();
|
|
let i = self.active_tab;
|
|
let unchanged = self.tabs[i]
|
|
.scene
|
|
.document
|
|
.get_entity(handle)
|
|
.is_some_and(|entity| {
|
|
matches!(entity, EntityType::Tolerance(tolerance) if tolerance.text == text)
|
|
});
|
|
if unchanged {
|
|
return true;
|
|
}
|
|
self.push_undo_snapshot(i, "TOLERANCE");
|
|
let Some(EntityType::Tolerance(tolerance)) =
|
|
self.tabs[i].scene.document.get_entity_mut(handle)
|
|
else {
|
|
return false;
|
|
};
|
|
tolerance.text = text;
|
|
self.tabs[i]
|
|
.scene
|
|
.bump_entities(&[(handle, crate::scene::ChangeKind::Modified)]);
|
|
self.tabs[i].dirty = true;
|
|
self.refresh_properties();
|
|
true
|
|
}
|
|
|
|
pub(super) fn begin_tolerance_placement(&mut self) -> bool {
|
|
let Some(state) = self.geometric_tolerance.take() else {
|
|
return false;
|
|
};
|
|
if !state.is_valid() || state.editing.is_some() {
|
|
self.geometric_tolerance = Some(state);
|
|
return false;
|
|
}
|
|
let i = self.active_tab;
|
|
let text = state.to_text();
|
|
let mut preview_entity = EntityType::Tolerance(
|
|
acadrust::entities::Tolerance::with_text(
|
|
acadrust::types::Vector3::ZERO,
|
|
text.clone(),
|
|
),
|
|
);
|
|
crate::scene::creation_style::apply_current_creation_styles(
|
|
&self.tabs[i].scene.document,
|
|
&mut preview_entity,
|
|
);
|
|
let preview_strokes = match &preview_entity {
|
|
EntityType::Tolerance(tolerance) => crate::entities::tolerance::preview_strokes(
|
|
tolerance,
|
|
&self.tabs[i].scene.document,
|
|
),
|
|
_ => Vec::new(),
|
|
};
|
|
let mut command = crate::modules::annotate::tolerance_cmd::ToleranceCommand::with_text(
|
|
text,
|
|
preview_strokes,
|
|
);
|
|
use crate::command::CadCommand;
|
|
let plane = if self.tabs[i].editing_model_space() {
|
|
self.tabs[i].ucs_xform().working_plane()
|
|
} else {
|
|
crate::command::WorkingPlane::default()
|
|
};
|
|
command.set_working_plane(plane);
|
|
self.command_line.push_info(&command.prompt());
|
|
self.tabs[i].active_cmd = Some(Box::new(command));
|
|
self.active_modal = None;
|
|
true
|
|
}
|
|
}
|