forked from 1b-agent/opencadstudio-upstream
fix: prevent interaction with hidden layers
This commit is contained in:
1 parent
1bf584a1c1
commit
7b7aa0d429
1 file changed
+47
-3
+47
-3
@@ -9652,12 +9652,28 @@ impl Scene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let block = self.interaction_block_handle();
|
||||||
|
let frozen: Option<HashSet<Handle>> = self
|
||||||
|
.interaction_viewport_frozen_layers()
|
||||||
|
.map(|layers| layers.iter().copied().collect());
|
||||||
|
let annotation_scale_handle = self.displayed_annotation_scale_handle();
|
||||||
|
let all_visible = self.annotation_all_visible();
|
||||||
|
|
||||||
let changed_live: Vec<Handle> = changes
|
let changed_live: Vec<Handle> = changes
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(handle, kind)| {
|
.filter_map(|(handle, kind)| {
|
||||||
(!matches!(kind, ChangeKind::Removed)
|
if matches!(kind, ChangeKind::Removed) {
|
||||||
&& !self.entity_temporarily_hidden(*handle)
|
return None;
|
||||||
&& self.document.get_entity(*handle).is_some())
|
}
|
||||||
|
|
||||||
|
let entity = self.document.get_entity(*handle)?;
|
||||||
|
self.resident_entity_visible(
|
||||||
|
entity,
|
||||||
|
block,
|
||||||
|
frozen.as_ref(),
|
||||||
|
annotation_scale_handle,
|
||||||
|
all_visible,
|
||||||
|
)
|
||||||
.then_some(*handle)
|
.then_some(*handle)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@@ -11957,6 +11973,34 @@ vis_index={:.1} visible_probe={:.1}",
|
|||||||
/// block users re-expand, since their definitions bake the children's
|
/// block users re-expand, since their definitions bake the children's
|
||||||
/// visibility. Nothing is recoloured.
|
/// visibility. Nothing is recoloured.
|
||||||
pub fn invalidate_layer_visibility(&mut self, names: &[String]) {
|
pub fn invalidate_layer_visibility(&mut self, names: &[String]) {
|
||||||
|
// Turning a layer off or freezing it removes its entities from the
|
||||||
|
// interactive scene as well as from rendering. Drop any entities that
|
||||||
|
// were already selected before the visibility change, otherwise a
|
||||||
|
// subsequent MOVE/ERASE/etc. could still modify invisible geometry.
|
||||||
|
let block = self.interaction_block_handle();
|
||||||
|
let frozen: Option<HashSet<Handle>> = self
|
||||||
|
.interaction_viewport_frozen_layers()
|
||||||
|
.map(|layers| layers.iter().copied().collect());
|
||||||
|
let annotation_scale_handle = self.displayed_annotation_scale_handle();
|
||||||
|
let all_visible = self.annotation_all_visible();
|
||||||
|
|
||||||
|
let visible_selection: Vec<Handle> = self
|
||||||
|
.selected_handles_in_order()
|
||||||
|
.into_iter()
|
||||||
|
.filter(|handle| {
|
||||||
|
self.document.get_entity(*handle).is_some_and(|entity| {
|
||||||
|
self.resident_entity_visible(
|
||||||
|
entity,
|
||||||
|
block,
|
||||||
|
frozen.as_ref(),
|
||||||
|
annotation_scale_handle,
|
||||||
|
all_visible,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
self.replace_selection_exact(&visible_selection);
|
||||||
|
|
||||||
let targets = self.dependency_targets(DependencyKind::Layer, names);
|
let targets = self.dependency_targets(DependencyKind::Layer, names);
|
||||||
if targets.render_handles.is_empty() {
|
if targets.render_handles.is_empty() {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in new issue
Block a user