Block Definition dialog: preview, empty-block band, open in editor

The name card draws the selected objects, or the existing definition the
name picks. OK with no objects shows an in-window band offering to select
objects or to define an empty block. A switch opens the new block in the
block editor once it is defined; it is remembered with the other dialog
choices. Automation gains block_def_dialog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ramox81andClaude Opus 5.5 committed 2026-10-15 09:50:35 +03:00
1 parent 39c3e9af58
commit d69a5f0ac4
30 files changed
+329 -13

No files matched your search

+19 -8
View File
@@ -5686,6 +5686,7 @@ impl OpenCADStudio {
state.error_message = None;
state.confirm_redefine = None;
}
self.refresh_block_definition_preview();
Task::none()
}
Message::BlockDefNameSelect(chosen) => {
@@ -5701,6 +5702,7 @@ impl OpenCADStudio {
);
state.set_base_point(glam::DVec3::new(base.x, base.y, base.z));
}
self.refresh_block_definition_preview();
Task::none()
}
Message::BlockDefBaseOnScreen(val) => {
@@ -5821,6 +5823,12 @@ impl OpenCADStudio {
}
Task::none()
}
Message::BlockDefOpenInEditor(on) => {
if let Some(state) = self.block_definition.as_mut() {
state.open_in_editor = on;
}
Task::none()
}
Message::BlockDefHelp => {
self.command_line.push_info(
crate::t!("BLOCK creates a block definition from objects you select.").as_ref(),
@@ -5836,7 +5844,8 @@ impl OpenCADStudio {
}
self.commit_block_definition(true)
}
Message::BlockDefApply => {
m @ (Message::BlockDefApply | Message::BlockDefCreateEmpty) => {
let create_empty = matches!(m, Message::BlockDefCreateEmpty);
let Some(state) = self.block_definition.as_mut() else {
return Task::none();
};
@@ -5859,15 +5868,16 @@ impl OpenCADStudio {
Some(crate::t!("Block name cannot start with '*'.").into_owned());
return Task::none();
}
if !state.objects_specify_onscreen && state.selected_handles.is_empty() {
state.error_message = Some(
crate::t!(
"No objects selected. You must select objects to define a block."
)
.into_owned(),
);
// No objects: the band offers to select some or to define
// an empty block.
if !state.objects_specify_onscreen
&& state.selected_handles.is_empty()
&& !create_empty
{
state.empty_prompt = true;
return Task::none();
}
state.empty_prompt = false;
let i = self.active_tab;
if self.tabs[i]
.scene
@@ -7394,6 +7404,7 @@ impl OpenCADStudio {
.collect();
block_def.error_message = None;
self.active_modal = Some(super::ModalKind::BlockDefinition);
self.refresh_block_definition_preview();
} else if let Some(ref mut wblock) = self.wblock {
wblock.selected_handles = self.tabs[i]
.scene