Skip to content

Segment IDs are wrong when no Path node exists, causing Path tool to fail before Path node is added #3481

@0HyperCube

Description

@0HyperCube

pub fn compute_modified_vector(&self, layer: LayerNodeIdentifier) -> Option<Vector> {
let graph_layer = graph_modification_utils::NodeGraphLayer::new(layer, self);
if let Some(path_node) = graph_layer.upstream_visible_node_id_from_name_in_layer("Path")
&& let Some(vector) = self.document_metadata.vector_modify.get(&path_node)
{
let mut modified = vector.clone();
let path_node = self.document_network().nodes.get(&path_node);
let modification_input = path_node.and_then(|node: &DocumentNode| node.inputs.get(1)).and_then(|input| input.as_value());
if let Some(TaggedValue::VectorModification(modification)) = modification_input {
modification.apply(&mut modified);
}
return Some(modified);
}
self.document_metadata
.click_targets
.get(&layer)
.map(|click| click.iter().map(ClickTarget::target_type))
.map(|target_types| Vector::from_target_types(target_types, true))
}

It tries to get a path node and then falls back on the document_metadata.click_targets. SegmentIds are not stored in the click targets. Therefore this code will just incorrectly assume incremental SegmentIds (the actual generation of SegmentIds occurs inside Vector::from_target_types in vector.append_subpath).

This means that trying to delete a segment or modify a handle when the SegmentIds are not contiguous (e.g. after a boolean operation) will result in confusing results (targeting the wrong segment or no segment at all). From this Discord report.

See reproduction steps: #3481 (comment)

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No fields configured for Bug.

Projects

Status

Completed This Milestone

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions