forked from 1b-agent/opencadstudio-upstream
Feat: VPLAYER ALL — freeze/thaw layer across all viewports in layout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
313e7226d2
commit
d66673a4fa
2 files changed
+56
-23
No files matched your search
+31
-13
@@ -286,7 +286,8 @@ impl H7CAD {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CmdResult::VpLayerUpdate { vp_handle, freeze, thaw } => {
|
CmdResult::VpLayerUpdate { vp_handle, freeze, thaw } => {
|
||||||
// Resolve layer names → handles, then update frozen_layers on the viewport.
|
// Resolve layer names → handles, then update frozen_layers on the viewport(s).
|
||||||
|
// vp_handle == Handle::NULL means "apply to all viewports in current layout".
|
||||||
let freeze_handles: Vec<Handle> = freeze.iter()
|
let freeze_handles: Vec<Handle> = freeze.iter()
|
||||||
.filter_map(|name| {
|
.filter_map(|name| {
|
||||||
self.tabs[i].scene.document.layers.iter()
|
self.tabs[i].scene.document.layers.iter()
|
||||||
@@ -305,19 +306,36 @@ impl H7CAD {
|
|||||||
let mut frozen_count = 0usize;
|
let mut frozen_count = 0usize;
|
||||||
let mut thawed_count = 0usize;
|
let mut thawed_count = 0usize;
|
||||||
|
|
||||||
if let Some(acadrust::EntityType::Viewport(vp)) =
|
// Collect target viewport handles
|
||||||
self.tabs[i].scene.document.get_entity_mut(vp_handle)
|
let target_handles: Vec<Handle> = if vp_handle == acadrust::Handle::NULL {
|
||||||
{
|
// All viewports in current layout block
|
||||||
for h in &freeze_handles {
|
let block_handle = self.tabs[i].scene.current_layout_block_handle_pub();
|
||||||
if !vp.frozen_layers.contains(h) {
|
self.tabs[i].scene.document.entities()
|
||||||
vp.frozen_layers.push(*h);
|
.filter(|e| {
|
||||||
frozen_count += 1;
|
e.common().owner_handle == block_handle
|
||||||
|
&& matches!(e, acadrust::EntityType::Viewport(_))
|
||||||
|
})
|
||||||
|
.map(|e| e.common().handle)
|
||||||
|
.collect()
|
||||||
|
} else {
|
||||||
|
vec![vp_handle]
|
||||||
|
};
|
||||||
|
|
||||||
|
for &target_handle in &target_handles {
|
||||||
|
if let Some(acadrust::EntityType::Viewport(vp)) =
|
||||||
|
self.tabs[i].scene.document.get_entity_mut(target_handle)
|
||||||
|
{
|
||||||
|
for h in &freeze_handles {
|
||||||
|
if !vp.frozen_layers.contains(h) {
|
||||||
|
vp.frozen_layers.push(*h);
|
||||||
|
frozen_count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for h in &thaw_handles {
|
||||||
|
let before = vp.frozen_layers.len();
|
||||||
|
vp.frozen_layers.retain(|fh| fh != h);
|
||||||
|
if vp.frozen_layers.len() < before { thawed_count += 1; }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
for h in &thaw_handles {
|
|
||||||
let before = vp.frozen_layers.len();
|
|
||||||
vp.frozen_layers.retain(|fh| fh != h);
|
|
||||||
if vp.frozen_layers.len() < before { thawed_count += 1; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
//
|
//
|
||||||
// Usage (command line):
|
// Usage (command line):
|
||||||
// VPLAYER
|
// VPLAYER
|
||||||
// > F <layer_name> → freeze layer in active viewport
|
// > F <layer_name> → freeze layer in active viewport
|
||||||
// > T <layer_name> → thaw layer in active viewport
|
// > T <layer_name> → thaw layer in active viewport
|
||||||
// > Enter → exit
|
// > F ALL <layer_name> → freeze layer in ALL viewports
|
||||||
|
// > T ALL <layer_name> → thaw layer in ALL viewports
|
||||||
|
// > Enter → exit
|
||||||
//
|
//
|
||||||
// Layer names are case-insensitive. Multiple space-separated names are accepted.
|
// Layer names are case-insensitive. Multiple space-separated names are accepted.
|
||||||
|
|
||||||
@@ -43,12 +45,22 @@ impl CadCommand for VplayerCommand {
|
|||||||
return Some(CmdResult::Cancel);
|
return Some(CmdResult::Cancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut parts = text.splitn(2, char::is_whitespace);
|
let tokens: Vec<&str> = text.split_whitespace().collect();
|
||||||
let op = parts.next().unwrap_or("").to_uppercase();
|
if tokens.is_empty() {
|
||||||
let rest = parts.next().unwrap_or("").trim();
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let layer_names: Vec<String> = rest
|
let op = tokens[0].to_uppercase();
|
||||||
.split_whitespace()
|
|
||||||
|
// Check for ALL keyword: "F ALL layer1 layer2" or "T ALL layer1"
|
||||||
|
let (all_viewports, layer_start) = if tokens.get(1).map(|s| s.to_uppercase().as_str() == "ALL").unwrap_or(false) {
|
||||||
|
(true, 2)
|
||||||
|
} else {
|
||||||
|
(false, 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
let layer_names: Vec<String> = tokens[layer_start..]
|
||||||
|
.iter()
|
||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
@@ -56,14 +68,17 @@ impl CadCommand for VplayerCommand {
|
|||||||
return None; // no layer name given — ignore and re-prompt
|
return None; // no layer name given — ignore and re-prompt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle::NULL signals "apply to all viewports" in cmd_result.rs
|
||||||
|
let vp_handle = if all_viewports { acadrust::Handle::NULL } else { self.vp_handle };
|
||||||
|
|
||||||
match op.as_str() {
|
match op.as_str() {
|
||||||
"F" | "FREEZE" => Some(CmdResult::VpLayerUpdate {
|
"F" | "FREEZE" => Some(CmdResult::VpLayerUpdate {
|
||||||
vp_handle: self.vp_handle,
|
vp_handle,
|
||||||
freeze: layer_names,
|
freeze: layer_names,
|
||||||
thaw: vec![],
|
thaw: vec![],
|
||||||
}),
|
}),
|
||||||
"T" | "THAW" => Some(CmdResult::VpLayerUpdate {
|
"T" | "THAW" => Some(CmdResult::VpLayerUpdate {
|
||||||
vp_handle: self.vp_handle,
|
vp_handle,
|
||||||
freeze: vec![],
|
freeze: vec![],
|
||||||
thaw: layer_names,
|
thaw: layer_names,
|
||||||
}),
|
}),
|
||||||
|
|||||||
Reference in new issue
Block a user