mirror of https://codeberg.org/topola/topola.git
refactor(drawing,layout): move 'is_node_in_layer' from Layout to Drawing
This commit is contained in:
parent
59154c380f
commit
0cbd3c398a
|
|
@ -131,6 +131,7 @@ impl Overlay {
|
||||||
board.layout().node_shape(geom.data).contains_point(at)
|
board.layout().node_shape(geom.data).contains_point(at)
|
||||||
&& board
|
&& board
|
||||||
.layout()
|
.layout()
|
||||||
|
.drawing()
|
||||||
.is_node_in_layer(geom.data, self.active_layer)
|
.is_node_in_layer(geom.data, self.active_layer)
|
||||||
}) {
|
}) {
|
||||||
self.selection.toggle_at_node(board, geom.data);
|
self.selection.toggle_at_node(board, geom.data);
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,7 @@ impl Selection {
|
||||||
&AABB::<[f64; 3]>::from_corners([-INF, -INF, -INF], [INF, INF, INF]),
|
&AABB::<[f64; 3]>::from_corners([-INF, -INF, -INF], [INF, INF, INF]),
|
||||||
) {
|
) {
|
||||||
let node = geom.data;
|
let node = geom.data;
|
||||||
if layout.is_node_in_layer(node, active_layer) {
|
if layout.drawing().is_node_in_layer(node, active_layer) {
|
||||||
if let Some(rsel) = ResolvedSelector::try_from_node(board, node) {
|
if let Some(rsel) = ResolvedSelector::try_from_node(board, node) {
|
||||||
let rseli = selectors.entry(rsel).or_default();
|
let rseli = selectors.entry(rsel).or_default();
|
||||||
rseli.0.insert(node);
|
rseli.0.insert(node);
|
||||||
|
|
@ -236,7 +236,7 @@ impl Selection {
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
let node = geom.data;
|
let node = geom.data;
|
||||||
if layout.is_node_in_layer(node, active_layer)
|
if layout.drawing().is_node_in_layer(node, active_layer)
|
||||||
&& kind.matches(aabb, &layout.node_shape(node))
|
&& kind.matches(aabb, &layout.node_shape(node))
|
||||||
{
|
{
|
||||||
if let Some(rsel) = ResolvedSelector::try_from_node(board, node) {
|
if let Some(rsel) = ResolvedSelector::try_from_node(board, node) {
|
||||||
|
|
|
||||||
|
|
@ -1022,6 +1022,23 @@ impl<CW: Copy, R: AccessRules> Drawing<CW, R> {
|
||||||
self.recording_geometry_with_rtree.compounds(node)
|
self.recording_geometry_with_rtree.compounds(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_node_in_layer(
|
||||||
|
&self,
|
||||||
|
index: GenericNode<PrimitiveIndex, GenericIndex<CW>>,
|
||||||
|
active_layer: usize,
|
||||||
|
) -> bool
|
||||||
|
where
|
||||||
|
CW: super::graph::IsInLayer,
|
||||||
|
{
|
||||||
|
use super::graph::GetLayer;
|
||||||
|
match index {
|
||||||
|
GenericNode::Primitive(primitive) => primitive.primitive(self).layer() == active_layer,
|
||||||
|
GenericNode::Compound(compound) => {
|
||||||
|
self.compound_weight(compound).is_in_layer(active_layer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn are_connectable(&self, node1: PrimitiveIndex, node2: PrimitiveIndex) -> bool {
|
fn are_connectable(&self, node1: PrimitiveIndex, node2: PrimitiveIndex) -> bool {
|
||||||
if let (Some(node1_net_id), Some(node2_net_id)) = (
|
if let (Some(node1_net_id), Some(node2_net_id)) = (
|
||||||
node1.primitive(self).maybe_net(),
|
node1.primitive(self).maybe_net(),
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,18 @@ pub trait GetLayer {
|
||||||
fn layer(&self) -> usize;
|
fn layer(&self) -> usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[enum_dispatch]
|
||||||
|
pub trait IsInLayer {
|
||||||
|
fn is_in_layer(&self, layer: usize) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: GetLayer> IsInLayer for T {
|
||||||
|
#[inline]
|
||||||
|
fn is_in_layer(&self, layer: usize) -> bool {
|
||||||
|
self.layer() == layer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[enum_dispatch]
|
#[enum_dispatch]
|
||||||
pub trait GetMaybeNet {
|
pub trait GetMaybeNet {
|
||||||
fn maybe_net(&self) -> Option<usize>;
|
fn maybe_net(&self) -> Option<usize>;
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ use crate::{
|
||||||
cane::Cane,
|
cane::Cane,
|
||||||
dot::{DotIndex, DotWeight, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight},
|
dot::{DotIndex, DotWeight, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight},
|
||||||
gear::GearIndex,
|
gear::GearIndex,
|
||||||
graph::{GetMaybeNet, MakePrimitive, PrimitiveIndex, PrimitiveWeight},
|
graph::{GetMaybeNet, IsInLayer, MakePrimitive, PrimitiveIndex, PrimitiveWeight},
|
||||||
primitive::MakePrimitiveShape,
|
primitive::MakePrimitiveShape,
|
||||||
rules::AccessRules,
|
rules::AccessRules,
|
||||||
seg::{
|
seg::{
|
||||||
|
|
@ -34,7 +34,7 @@ use crate::{
|
||||||
|
|
||||||
/// Represents a weight for various compounds
|
/// Represents a weight for various compounds
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
#[enum_dispatch(GetMaybeNet)]
|
#[enum_dispatch(GetMaybeNet, IsInLayer)]
|
||||||
pub enum CompoundWeight {
|
pub enum CompoundWeight {
|
||||||
/// Represents the weight of a polygon compound, includes its basic [`Layout`] information
|
/// Represents the weight of a polygon compound, includes its basic [`Layout`] information
|
||||||
Poly(PolyWeight),
|
Poly(PolyWeight),
|
||||||
|
|
@ -318,25 +318,6 @@ impl<R: AccessRules> Layout<R> {
|
||||||
.compound_members(GenericIndex::new(poly.petgraph_index()))
|
.compound_members(GenericIndex::new(poly.petgraph_index()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_node_in_layer(&self, index: NodeIndex, active_layer: usize) -> bool {
|
|
||||||
use crate::drawing::graph::GetLayer;
|
|
||||||
match index {
|
|
||||||
NodeIndex::Primitive(primitive) => {
|
|
||||||
primitive.primitive(&self.drawing).layer() == active_layer
|
|
||||||
}
|
|
||||||
NodeIndex::Compound(compound) => match self.drawing.compound_weight(compound) {
|
|
||||||
CompoundWeight::Poly(_) => {
|
|
||||||
self.poly(GenericIndex::<PolyWeight>::new(compound.petgraph_index()))
|
|
||||||
.layer()
|
|
||||||
== active_layer
|
|
||||||
}
|
|
||||||
CompoundWeight::Via(weight) => {
|
|
||||||
weight.from_layer >= active_layer && weight.to_layer <= active_layer
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn node_shape(&self, index: NodeIndex) -> Shape {
|
pub fn node_shape(&self, index: NodeIndex) -> Shape {
|
||||||
match index {
|
match index {
|
||||||
NodeIndex::Primitive(primitive) => primitive.primitive(&self.drawing).shape().into(),
|
NodeIndex::Primitive(primitive) => primitive.primitive(&self.drawing).shape().into(),
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,11 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
drawing::{graph::GetMaybeNet, primitive::MakePrimitiveShape, rules::AccessRules},
|
drawing::{
|
||||||
|
graph::{GetMaybeNet, IsInLayer},
|
||||||
|
primitive::MakePrimitiveShape,
|
||||||
|
rules::AccessRules,
|
||||||
|
},
|
||||||
geometry::primitive::{DotShape, PrimitiveShape},
|
geometry::primitive::{DotShape, PrimitiveShape},
|
||||||
graph::{GenericIndex, GetPetgraphIndex},
|
graph::{GenericIndex, GetPetgraphIndex},
|
||||||
layout::{CompoundWeight, Layout},
|
layout::{CompoundWeight, Layout},
|
||||||
|
|
@ -67,6 +71,12 @@ impl GetMaybeNet for ViaWeight {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IsInLayer for ViaWeight {
|
||||||
|
fn is_in_layer(&self, layer: usize) -> bool {
|
||||||
|
self.from_layer >= layer && self.to_layer <= layer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl MakePrimitiveShape for ViaWeight {
|
impl MakePrimitiveShape for ViaWeight {
|
||||||
fn shape(&self) -> PrimitiveShape {
|
fn shape(&self) -> PrimitiveShape {
|
||||||
DotShape {
|
DotShape {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue