52 if(
pad->IsAperturePad() ||
pad->IsNPTHWithNoCopper() )
90 bool aUseClearanceEpsilon =
true )
override
108 for(
int layer = layers.
Start(); layer <= layers.
End(); ++layer )
163 return wxEmptyString;
186 default:
return false;
191 aConstraint->
m_Type = aType;
198 *aConstraint = it->second;
214 return a == other.
a &&
b == other.
b &&
type == other.
type;
223 else if (
a == other.
a )
227 else if (
b == other.
b )
238 const PNS::ITEM* aCollidingItem )
override
286 int aFlags = 0 )
override {};
328 obs.m_head, obs.m_head->KindStr().c_str(),
329 obs.m_item, obs.m_item->KindStr().c_str(),
339 std::unique_ptr<PNS::NODE> world (
new PNS::NODE );
344 world->SetMaxClearance( 10000000 );
345 world->SetRuleResolver( &m_ruleResolver );
353 int count = world->QueryColliding(
v1, obstacles );
362 m_ruleResolver.m_defaultClearance = 1000000;
363 world->QueryColliding(
v1, obstacles );
367 const auto& first = *obstacles.begin();
377 m_ruleResolver.m_defaultClearance = 200000;
378 m_ruleResolver.m_defaultHole2Hole = 1000000;
380 world->QueryColliding(
v1, obstacles );
384 auto iter = obstacles.begin();
385 const auto& first = *iter++;
395 m_ruleResolver.m_defaultHole2Hole = 220000;
396 m_ruleResolver.m_defaultHole2Copper = 1000000;
398 world->QueryColliding(
v1, obstacles );
402 auto iter = obstacles.begin();
403 const auto& first = *iter++;
406 BOOST_CHECK( ( first.m_head ==
v1 && first.m_item ==
v2->Hole() )
407 || ( first.m_head ==
v1->Hole() && first.m_item ==
v2 ) );
420 via.SetSecondaryDrill( std::optional<int>( 12000 ) );
425 std::unique_ptr<PNS::VIA> viaClone(
via.Clone() );
427 auto checkVia = [&](
const PNS::VIA& candidate )
431 BOOST_CHECK( candidate.HolePostMachining().has_value() );
433 BOOST_CHECK( candidate.SecondaryDrill().has_value() );
435 BOOST_CHECK( candidate.SecondaryHoleLayers().has_value() );
437 via.SecondaryHoleLayers()->Start() );
439 via.SecondaryHoleLayers()->End() );
440 BOOST_CHECK( candidate.SecondaryHolePostMachining().has_value() );
443 if( candidate.SecondaryHolePostMachining().has_value() )
444 BOOST_CHECK( candidate.SecondaryHolePostMachining().value() ==
via.SecondaryHolePostMachining().value() );
448 checkVia( *viaClone );
457 via.SetPrimaryDrillStartLayer(
F_Cu );
458 via.SetPrimaryDrillEndLayer(
B_Cu );
460 via.SetSecondaryDrillSize( std::optional<int>( 15000 ) );
461 via.SetSecondaryDrillStartLayer(
F_Cu );
465 via.SetTertiaryDrillSize( std::optional<int>( 8000 ) );
466 via.SetTertiaryDrillStartLayer(
B_Cu );
470 std::unique_ptr<PCB_VIA> viaClone(
static_cast<PCB_VIA*
>(
via.Clone() ) );
472 auto checkVia = [&](
const PCB_VIA& candidate )
476 BOOST_CHECK( candidate.GetFrontPostMachining().has_value() );
477 BOOST_CHECK_EQUAL(
static_cast<int>( candidate.GetFrontPostMachining().value() ),
478 static_cast<int>(
via.GetFrontPostMachining().value() ) );
479 BOOST_CHECK( candidate.GetSecondaryDrillSize().has_value() );
481 via.GetSecondaryDrillSize().value() );
483 via.GetSecondaryDrillStartLayer() );
485 via.GetSecondaryDrillEndLayer() );
487 BOOST_CHECK( candidate.GetBackPostMachining().has_value() );
489 static_cast<int>(
via.GetBackPostMachining().value() ) );
490 BOOST_CHECK( candidate.GetTertiaryDrillSize().has_value() );
492 via.GetTertiaryDrillSize().value() );
494 via.GetTertiaryDrillStartLayer() );
496 via.GetTertiaryDrillEndLayer() );
500 checkVia( *viaClone );
524 BOOST_CHECK( innerLayersRange2Layer.
Overlaps( 0 ) );
525 BOOST_CHECK( innerLayersRange2Layer.
Overlaps( 1 ) );
532 BOOST_CHECK( !innerLayersRange4Layer.
Overlaps( 0 ) );
533 BOOST_CHECK( innerLayersRange4Layer.
Overlaps( 1 ) );
534 BOOST_CHECK( innerLayersRange4Layer.
Overlaps( 2 ) );
535 BOOST_CHECK( !innerLayersRange4Layer.
Overlaps( 3 ) );
548 std::unique_ptr<PNS::NODE> world(
new PNS::NODE );
549 world->SetMaxClearance( 10000000 );
550 world->SetRuleResolver( &m_ruleResolver );
563 BOOST_CHECK( lockedSeg->
IsLocked() );
565 world->AddRaw( lockedSeg );
568 std::unique_ptr<PNS::SEGMENT> clone1(
PNS::Clone( *lockedSeg ) );
569 std::unique_ptr<PNS::SEGMENT> clone2(
PNS::Clone( *lockedSeg ) );
571 clone1->SetEnds( segStart, splitPt );
572 clone2->SetEnds( splitPt, segEnd );
574 BOOST_CHECK_MESSAGE( clone1->IsLocked(),
575 "First half of split locked segment must retain locked state" );
576 BOOST_CHECK_MESSAGE( clone2->IsLocked(),
577 "Second half of split locked segment must retain locked state" );
592 std::unique_ptr<PNS::NODE> world(
new PNS::NODE );
593 world->SetMaxClearance( 10000000 );
594 world->SetRuleResolver( &m_ruleResolver );
602 pad->SetPos( padPos );
605 world->AddRaw(
pad );
608 int narrowWidth = 250000;
612 world->AddRaw( narrowSeg );
615 int wideWidth = 500000;
619 world->AddRaw( wideSeg );
624 BOOST_CHECK( m_iface->TestInheritTrackWidth(
pad, &inherited ) );
629 BOOST_CHECK( m_iface->TestInheritTrackWidth(
pad, &inherited,
VECTOR2I( 2000000, 0 ) ) );
634 BOOST_CHECK( m_iface->TestInheritTrackWidth(
pad, &inherited,
VECTOR2I( 0, -2000000 ) ) );
639 BOOST_CHECK( m_iface->TestInheritTrackWidth(
pad, &inherited,
VECTOR2I( 100000, 50000 ) ) );
644 BOOST_CHECK( m_iface->TestInheritTrackWidth(
pad, &inherited,
VECTOR2I( 50000, -100000 ) ) );
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
Information pertinent to a Pcbnew printed circuit board.
KICAD_T Type() const
Returns the type of object.
PNS::RULE_RESOLVER * GetRuleResolver() override
void DisplayItem(const PNS::ITEM *aItem, int aClearance, bool aEdit=false, int aFlags=0) override
void HideItem(PNS::ITEM *aItem) override
~MOCK_PNS_KICAD_IFACE() override
MOCK_PNS_KICAD_IFACE(PNS_TEST_FIXTURE *aFixture)
PNS_TEST_FIXTURE * m_testFixture
bool TestInheritTrackWidth(PNS::ITEM *aItem, int *aInheritedWidth, const VECTOR2I &aStartPosition=VECTOR2I())
virtual int NetCode(PNS::NET_HANDLE aNet) override
bool IsNetTieExclusion(const PNS::ITEM *aItem, const VECTOR2I &aCollisionPos, const PNS::ITEM *aCollidingItem) override
bool IsKeepout(const PNS::ITEM *aObstacle, const PNS::ITEM *aItem, bool *aEnforce) override
virtual int Clearance(const PNS::ITEM *aA, const PNS::ITEM *aB, bool aUseClearanceEpsilon=true) override
virtual bool QueryConstraint(PNS::CONSTRAINT_TYPE aType, const PNS::ITEM *aItemA, const PNS::ITEM *aItemB, int aLayer, PNS::CONSTRAINT *aConstraint) override
bool IsInNetTie(const PNS::ITEM *aA) override
std::map< ITEM_KEY, PNS::CONSTRAINT > m_ruleMap
virtual PNS::NET_HANDLE DpCoupledNet(PNS::NET_HANDLE aNet) override
bool IsDrilledHole(const PNS::ITEM *aItem) override
void AddMockRule(PNS::CONSTRAINT_TYPE aType, const PNS::ITEM *aItemA, const PNS::ITEM *aItemB, PNS::CONSTRAINT &aConstraint)
bool IsNonPlatedSlot(const PNS::ITEM *aItem) override
virtual bool DpNetPair(const PNS::ITEM *aItem, PNS::NET_HANDLE &aNetP, PNS::NET_HANDLE &aNetN) override
virtual wxString NetName(PNS::NET_HANDLE aNet) override
virtual ~MOCK_RULE_RESOLVER()
int ClearanceEpsilon() const override
virtual int DpNetPolarity(PNS::NET_HANDLE aNet) override
Base class for PNS router board items.
BOARD_ITEM * Parent() const
void SetLayers(const PNS_LAYER_RANGE &aLayers)
const PNS_LAYER_RANGE & Layers() const
virtual int Layer() const
bool OfKind(int aKindMask) const
virtual void Mark(int aMarker) const
virtual BOARD_ITEM * BoardItem() const
Keep the router "world" - i.e.
std::set< OBSTACLE > OBSTACLES
int Width() const override
void SetWidth(int aWidth) override
bool inheritTrackWidth(PNS::ITEM *aItem, int *aInheritedWidth, const VECTOR2I &aStartPosition)
Represent a contiguous set of PCB layers.
bool Overlaps(const PNS_LAYER_RANGE &aOther) const
PNS_LAYER_RANGE Intersection(const PNS_LAYER_RANGE &aOther) const
Shortcut for comparisons/overlap tests.
constexpr PCB_LAYER_ID PCBNEW_LAYER_ID_START
std::unique_ptr< typename std::remove_const< T >::type > Clone(const T &aItem)
PNS::CONSTRAINT_TYPE type
bool operator<(const ITEM_KEY &other) const
bool operator==(const ITEM_KEY &other) const
An abstract function object, returning a design rule (clearance, diff pair gap, etc) required between...
Hold an object colliding with another object, along with some useful data about the collision.
SETTINGS_MANAGER m_settingsManager
MOCK_RULE_RESOLVER m_ruleResolver
MOCK_PNS_KICAD_IFACE * m_iface
static bool isEdge(const PNS::ITEM *aItem)
static bool isHole(const PNS::ITEM *aItem)
static void dumpObstacles(const PNS::NODE::OBSTACLES &obstacles)
BOOST_FIXTURE_TEST_CASE(PNSHoleCollisions, PNS_TEST_FIXTURE)
static bool isCopper(const PNS::ITEM *aItem)
BOOST_AUTO_TEST_CASE(PCBViaBackdrillCloneRetainsData)
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
BOOST_CHECK_EQUAL(result, "25.4")
@ PCB_PAD_T
class PAD, a pad in a footprint
VECTOR2< int32_t > VECTOR2I