Allow multiple top output wires to come from layers (#2049)

* Allow multiple outputs from layer

* Stable Ids for Flatten Vector Elements

* Clippy
This commit is contained in:
adamgerhant 2024-10-25 15:32:31 -07:00 committed by GitHub
parent 9d13a8f73b
commit 6b1356fe13
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 121 additions and 109 deletions

View file

@ -758,17 +758,27 @@ impl bezier_rs::Identifier for PointId {
}
impl crate::vector::ConcatElement for super::VectorData {
fn concat(&mut self, other: &Self, transform: glam::DAffine2) {
let new_ids = other.point_domain.id.iter().filter(|id| self.point_domain.id.contains(id)).map(|&old| (old, PointId::generate()));
fn concat(&mut self, other: &Self, transform: glam::DAffine2, node_id: u64) {
let new_ids = other
.point_domain
.id
.iter()
.filter(|id| self.point_domain.id.contains(id))
.map(|&old| (old, old.generate_from_hash(node_id)));
let point_map = new_ids.collect::<HashMap<_, _>>();
let new_ids = other
.segment_domain
.ids
.iter()
.filter(|id| self.segment_domain.ids.contains(id))
.map(|&old| (old, SegmentId::generate()));
.map(|&old| (old, old.generate_from_hash(node_id)));
let segment_map = new_ids.collect::<HashMap<_, _>>();
let new_ids = other.region_domain.ids.iter().filter(|id| self.region_domain.ids.contains(id)).map(|&old| (old, RegionId::generate()));
let new_ids = other
.region_domain
.ids
.iter()
.filter(|id| self.region_domain.ids.contains(id))
.map(|&old| (old, old.generate_from_hash(node_id)));
let region_map = new_ids.collect::<HashMap<_, _>>();
let id_map = IdMap {
point_offset: self.point_domain.ids().len(),

View file

@ -178,11 +178,11 @@ impl SegmentModification {
let Some(&stroke) = self.stroke.get(&add_id) else { continue };
let Some(start_index) = point_domain.resolve_id(start) else {
warn!("invalid start id");
warn!("invalid start id: {:#?}", start);
continue;
};
let Some(end_index) = point_domain.resolve_id(end) else {
warn!("invalid end id");
warn!("invalid end id: {:#?}", end);
continue;
};

View file

@ -548,10 +548,10 @@ async fn flatten_vector_elements<F: 'n + Send>(
let graphic_group = graphic_group_input.eval(footprint).await;
fn concat_group(graphic_group: &GraphicGroup, current_transform: DAffine2, result: &mut VectorData) {
for (element, _) in graphic_group.iter() {
for (element, reference) in graphic_group.iter() {
match element {
GraphicElement::VectorData(vector_data) => {
result.concat(vector_data, current_transform);
result.concat(vector_data, current_transform, reference.map(|node_id| node_id.0).unwrap_or_default());
}
GraphicElement::GraphicGroup(graphic_group) => {
concat_group(graphic_group, current_transform * graphic_group.transform, result);
@ -565,15 +565,16 @@ async fn flatten_vector_elements<F: 'n + Send>(
concat_group(&graphic_group, DAffine2::IDENTITY, &mut result);
// TODO: This leads to incorrect stroke widths when flattening groups with different transforms.
result.style.set_stroke_transform(DAffine2::IDENTITY);
result
}
pub trait ConcatElement {
fn concat(&mut self, other: &Self, transform: DAffine2);
fn concat(&mut self, other: &Self, transform: DAffine2, node_id: u64);
}
impl ConcatElement for GraphicGroup {
fn concat(&mut self, other: &Self, transform: DAffine2) {
fn concat(&mut self, other: &Self, transform: DAffine2, _node_id: u64) {
// TODO: Decide if we want to keep this behavior whereby the layers are flattened
for (mut element, footprint_mapping) in other.iter().cloned() {
*element.transform_mut() = transform * element.transform() * other.transform();