Draw pad holes when dragging.
Most of the time they're under the pad, but the provide needed info when the hole is larger than the pad. Fixes https://gitlab.com/kicad/code/kicad/issues/9786
This commit is contained in:
parent
9547c72e73
commit
6652e5acf4
|
@ -160,15 +160,14 @@ bool COMPONENT_DRAGGER::Drag( const VECTOR2I& aP )
|
|||
m_world->KillChildren();
|
||||
m_currentNode = m_world->Branch();
|
||||
|
||||
for( auto item : m_initialDraggedItems.Items() )
|
||||
for( const ITEM_SET::ENTRY& item : m_initialDraggedItems.Items() )
|
||||
m_currentNode->Remove( item );
|
||||
|
||||
m_draggedItems.Clear();
|
||||
|
||||
for( auto item : m_solids )
|
||||
for( SOLID* s : m_solids )
|
||||
{
|
||||
SOLID* s = static_cast<SOLID*>( item );
|
||||
auto p_next = aP - m_p0 + s->Pos();
|
||||
VECTOR2I p_next = aP - m_p0 + s->Pos();
|
||||
std::unique_ptr<SOLID> snew( static_cast<SOLID*>( s->Clone() ) );
|
||||
snew->SetPos( p_next );
|
||||
|
||||
|
@ -178,7 +177,7 @@ bool COMPONENT_DRAGGER::Drag( const VECTOR2I& aP )
|
|||
if( !s->IsRoutable() )
|
||||
continue;
|
||||
|
||||
for( auto& l : m_conns )
|
||||
for( DRAGGED_CONNECTION& l : m_conns )
|
||||
{
|
||||
if( l.attachedPad == s )
|
||||
{
|
||||
|
@ -226,9 +225,9 @@ bool COMPONENT_DRAGGER::Drag( const VECTOR2I& aP )
|
|||
}
|
||||
}
|
||||
|
||||
for( auto& cn : m_conns )
|
||||
for( COMPONENT_DRAGGER::DRAGGED_CONNECTION& cn : m_conns )
|
||||
{
|
||||
auto l_new( cn.origLine );
|
||||
LINE l_new( cn.origLine );
|
||||
l_new.Unmark();
|
||||
l_new.ClearLinks();
|
||||
l_new.DragCorner( cn.p_next, cn.origLine.CLine().Find( cn.p_orig ) );
|
||||
|
@ -236,7 +235,7 @@ bool COMPONENT_DRAGGER::Drag( const VECTOR2I& aP )
|
|||
PNS_DBG( Dbg(), AddLine, l_new.CLine(), BLUE, 100000, "cdrag-new-fanout" );
|
||||
m_draggedItems.Add( l_new );
|
||||
|
||||
auto l_orig( cn.origLine );
|
||||
LINE l_orig( cn.origLine );
|
||||
m_currentNode->Remove( l_orig );
|
||||
m_currentNode->Add( l_new );
|
||||
}
|
||||
|
@ -251,18 +250,11 @@ bool COMPONENT_DRAGGER::FixRoute()
|
|||
|
||||
if( node )
|
||||
{
|
||||
bool ok;
|
||||
|
||||
if( Settings().AllowDRCViolations() )
|
||||
ok = true;
|
||||
else
|
||||
ok = !node->CheckColliding( m_draggedItems );
|
||||
|
||||
if( !ok )
|
||||
return false;
|
||||
|
||||
Router()->CommitRouting( node );
|
||||
return true;
|
||||
if( Settings().AllowDRCViolations() || !node->CheckColliding( m_draggedItems ) )
|
||||
{
|
||||
Router()->CommitRouting( node );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -921,19 +921,6 @@ std::unique_ptr<PNS::SOLID> PNS_KICAD_IFACE_BASE::syncPad( PAD* aPad )
|
|||
|
||||
std::unique_ptr<PNS::SOLID> solid = std::make_unique<PNS::SOLID>();
|
||||
|
||||
if( aPad->GetDrillSize().x > 0 )
|
||||
{
|
||||
SHAPE_SEGMENT* slot = (SHAPE_SEGMENT*) aPad->GetEffectiveHoleShape()->Clone();
|
||||
|
||||
if( aPad->GetAttribute() != PAD_ATTRIB::NPTH )
|
||||
{
|
||||
BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings();
|
||||
slot->SetWidth( slot->GetWidth() + bds.GetHolePlatingThickness() * 2 );
|
||||
}
|
||||
|
||||
solid->SetHole( slot );
|
||||
}
|
||||
|
||||
if( aPad->GetAttribute() == PAD_ATTRIB::NPTH )
|
||||
solid->SetRoutable( false );
|
||||
|
||||
|
@ -953,6 +940,18 @@ std::unique_ptr<PNS::SOLID> PNS_KICAD_IFACE_BASE::syncPad( PAD* aPad )
|
|||
solid->SetPos( VECTOR2I( c.x - offset.x, c.y - offset.y ) );
|
||||
solid->SetOffset( VECTOR2I( offset.x, offset.y ) );
|
||||
|
||||
if( aPad->GetDrillSize().x > 0 )
|
||||
{
|
||||
SHAPE_SEGMENT* slot = (SHAPE_SEGMENT*) aPad->GetEffectiveHoleShape()->Clone();
|
||||
|
||||
if( aPad->GetAttribute() != PAD_ATTRIB::NPTH )
|
||||
{
|
||||
BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings();
|
||||
slot->SetWidth( slot->GetWidth() + bds.GetHolePlatingThickness() * 2 );
|
||||
}
|
||||
|
||||
solid->SetHole( slot );
|
||||
}
|
||||
|
||||
auto shapes = std::dynamic_pointer_cast<SHAPE_COMPOUND>( aPad->GetEffectiveShape() );
|
||||
|
||||
|
|
|
@ -200,6 +200,8 @@ void ROUTER_PREVIEW_ITEM::drawLineChain( const SHAPE_LINE_CHAIN_BASE* aL, KIGFX:
|
|||
|
||||
void ROUTER_PREVIEW_ITEM::drawShape( const SHAPE* aShape, KIGFX::GAL* gal ) const
|
||||
{
|
||||
bool holeDrawn = false;
|
||||
|
||||
switch( aShape->Type() )
|
||||
{
|
||||
case SH_POLY_SET_TRIANGLE:
|
||||
|
@ -281,6 +283,8 @@ void ROUTER_PREVIEW_ITEM::drawShape( const SHAPE* aShape, KIGFX::GAL* gal ) cons
|
|||
gal->SetIsFill( false );
|
||||
gal->SetLineWidth( halfWidth + c->GetRadius() - h->GetRadius() );
|
||||
gal->DrawCircle( c->GetCenter(), ( halfWidth + c->GetRadius() + h->GetRadius() ) / 2 );
|
||||
|
||||
holeDrawn = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -384,6 +388,23 @@ void ROUTER_PREVIEW_ITEM::drawShape( const SHAPE* aShape, KIGFX::GAL* gal ) cons
|
|||
case SH_NULL:
|
||||
break;
|
||||
}
|
||||
|
||||
if( m_hole && !holeDrawn )
|
||||
{
|
||||
gal->SetLayerDepth( m_depth );
|
||||
gal->SetIsStroke( true );
|
||||
gal->SetIsFill( false );
|
||||
gal->SetStrokeColor( m_color );
|
||||
gal->SetLineWidth( 1 );
|
||||
|
||||
SHAPE_CIRCLE* circle = dynamic_cast<SHAPE_CIRCLE*>( m_hole );
|
||||
SHAPE_SEGMENT* slot = dynamic_cast<SHAPE_SEGMENT*>( m_hole );
|
||||
|
||||
if( circle )
|
||||
gal->DrawCircle( circle->GetCenter(), circle->GetRadius() );
|
||||
else if( slot )
|
||||
gal->DrawSegment( slot->GetSeg().A, slot->GetSeg().B, slot->GetWidth() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue