eagle: add support for tRestrict, bRestrict and vRestrict on circle
Fixes #1869 https://gitlab.com/kicad/code/kicad/-/issues/1869
This commit is contained in:
parent
22860b6e7a
commit
23cc51a53f
|
@ -644,6 +644,58 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
|
||||||
m_xpath->push( "circle" );
|
m_xpath->push( "circle" );
|
||||||
|
|
||||||
ECIRCLE c( gr );
|
ECIRCLE c( gr );
|
||||||
|
|
||||||
|
int width = c.width.ToPcbUnits();
|
||||||
|
int radius = c.radius.ToPcbUnits();
|
||||||
|
|
||||||
|
if( c.layer == EAGLE_LAYER::TRESTRICT || c.layer == EAGLE_LAYER::BRESTRICT
|
||||||
|
|| c.layer == EAGLE_LAYER::VRESTRICT )
|
||||||
|
{
|
||||||
|
ZONE_CONTAINER* zone = new ZONE_CONTAINER( m_board );
|
||||||
|
m_board->Add( zone, ADD_MODE::APPEND );
|
||||||
|
|
||||||
|
if( c.layer == EAGLE_LAYER::TRESTRICT ) // front layer keepout
|
||||||
|
zone->SetLayer( F_Cu );
|
||||||
|
else if( c.layer == EAGLE_LAYER::BRESTRICT ) // bottom layer keepout
|
||||||
|
zone->SetLayer( B_Cu );
|
||||||
|
else if( c.layer == EAGLE_LAYER::VRESTRICT ) // all layers
|
||||||
|
zone->SetLayerSet( LSET::AllCuMask() );
|
||||||
|
|
||||||
|
zone->SetIsKeepout( true );
|
||||||
|
zone->SetDoNotAllowVias( true );
|
||||||
|
if( c.layer == EAGLE_LAYER::TRESTRICT || c.layer == EAGLE_LAYER::BRESTRICT )
|
||||||
|
{
|
||||||
|
zone->SetDoNotAllowTracks( true );
|
||||||
|
zone->SetDoNotAllowCopperPour( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
// approximate circle as polygon with a edge every 10 degree
|
||||||
|
wxPoint center( kicad_x( c.x ), kicad_y( c.y ) );
|
||||||
|
int outlineRadius = radius + ( width / 2 );
|
||||||
|
for( int angle = 0; angle < 360; angle += 10 )
|
||||||
|
{
|
||||||
|
wxPoint rotatedPoint( outlineRadius, 0 );
|
||||||
|
RotatePoint( &rotatedPoint, angle * 10. );
|
||||||
|
zone->AppendCorner( center + rotatedPoint, -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( width > 0 )
|
||||||
|
{
|
||||||
|
zone->NewHole();
|
||||||
|
int innerRadius = radius - ( width / 2 );
|
||||||
|
for( int angle = 0; angle < 360; angle += 10 )
|
||||||
|
{
|
||||||
|
wxPoint rotatedPoint( innerRadius, 0 );
|
||||||
|
RotatePoint( &rotatedPoint, angle * 10. );
|
||||||
|
zone->AppendCorner( center + rotatedPoint, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zone->SetHatch( ZONE_HATCH_STYLE::DIAGONAL_EDGE,
|
||||||
|
ZONE_CONTAINER::GetDefaultHatchPitch(), true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
PCB_LAYER_ID layer = kicad_layer( c.layer );
|
PCB_LAYER_ID layer = kicad_layer( c.layer );
|
||||||
|
|
||||||
if( layer != UNDEFINED_LAYER ) // unsupported layer
|
if( layer != UNDEFINED_LAYER ) // unsupported layer
|
||||||
|
@ -651,9 +703,6 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
|
||||||
DRAWSEGMENT* dseg = new DRAWSEGMENT( m_board );
|
DRAWSEGMENT* dseg = new DRAWSEGMENT( m_board );
|
||||||
m_board->Add( dseg, ADD_MODE::APPEND );
|
m_board->Add( dseg, ADD_MODE::APPEND );
|
||||||
|
|
||||||
int width = c.width.ToPcbUnits();
|
|
||||||
int radius = c.radius.ToPcbUnits();
|
|
||||||
|
|
||||||
// with == 0 means filled circle
|
// with == 0 means filled circle
|
||||||
if( width <= 0 )
|
if( width <= 0 )
|
||||||
{
|
{
|
||||||
|
@ -667,6 +716,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
|
||||||
dseg->SetEnd( wxPoint( kicad_x( c.x ) + radius, kicad_y( c.y ) ) );
|
dseg->SetEnd( wxPoint( kicad_x( c.x ) + radius, kicad_y( c.y ) ) );
|
||||||
dseg->SetWidth( width );
|
dseg->SetWidth( width );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
m_xpath->pop();
|
m_xpath->pop();
|
||||||
}
|
}
|
||||||
else if( grName == "rectangle" )
|
else if( grName == "rectangle" )
|
||||||
|
@ -1923,11 +1973,61 @@ void EAGLE_PLUGIN::packagePolygon( MODULE* aModule, wxXmlNode* aTree ) const
|
||||||
void EAGLE_PLUGIN::packageCircle( MODULE* aModule, wxXmlNode* aTree ) const
|
void EAGLE_PLUGIN::packageCircle( MODULE* aModule, wxXmlNode* aTree ) const
|
||||||
{
|
{
|
||||||
ECIRCLE e( aTree );
|
ECIRCLE e( aTree );
|
||||||
PCB_LAYER_ID layer = kicad_layer( e.layer );
|
|
||||||
EDGE_MODULE* gr = new EDGE_MODULE( aModule, S_CIRCLE );
|
|
||||||
int width = e.width.ToPcbUnits();
|
int width = e.width.ToPcbUnits();
|
||||||
int radius = e.radius.ToPcbUnits();
|
int radius = e.radius.ToPcbUnits();
|
||||||
|
|
||||||
|
if( e.layer == EAGLE_LAYER::TRESTRICT || e.layer == EAGLE_LAYER::BRESTRICT
|
||||||
|
|| e.layer == EAGLE_LAYER::VRESTRICT )
|
||||||
|
{
|
||||||
|
MODULE_ZONE_CONTAINER* zone = new MODULE_ZONE_CONTAINER( aModule );
|
||||||
|
aModule->Add( zone, ADD_MODE::APPEND );
|
||||||
|
|
||||||
|
if( e.layer == EAGLE_LAYER::TRESTRICT ) // front layer keepout
|
||||||
|
zone->SetLayer( F_Cu );
|
||||||
|
else if( e.layer == EAGLE_LAYER::BRESTRICT ) // bottom layer keepout
|
||||||
|
zone->SetLayer( B_Cu );
|
||||||
|
else if( e.layer == EAGLE_LAYER::VRESTRICT ) // all layers
|
||||||
|
zone->SetLayerSet( LSET::AllCuMask() );
|
||||||
|
|
||||||
|
zone->SetIsKeepout( true );
|
||||||
|
zone->SetDoNotAllowVias( true );
|
||||||
|
if( e.layer == EAGLE_LAYER::TRESTRICT || e.layer == EAGLE_LAYER::BRESTRICT )
|
||||||
|
{
|
||||||
|
zone->SetDoNotAllowTracks( true );
|
||||||
|
zone->SetDoNotAllowCopperPour( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
// approximate circle as polygon with a edge every 10 degree
|
||||||
|
wxPoint center( kicad_x( e.x ), kicad_y( e.y ) );
|
||||||
|
int outlineRadius = radius + ( width / 2 );
|
||||||
|
for( int angle = 0; angle < 360; angle += 10 )
|
||||||
|
{
|
||||||
|
wxPoint rotatedPoint( outlineRadius, 0 );
|
||||||
|
RotatePoint( &rotatedPoint, angle * 10. );
|
||||||
|
zone->AppendCorner( center + rotatedPoint, -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( width > 0 )
|
||||||
|
{
|
||||||
|
zone->NewHole();
|
||||||
|
int innerRadius = radius - ( width / 2 );
|
||||||
|
for( int angle = 0; angle < 360; angle += 10 )
|
||||||
|
{
|
||||||
|
wxPoint rotatedPoint( innerRadius, 0 );
|
||||||
|
RotatePoint( &rotatedPoint, angle * 10. );
|
||||||
|
zone->AppendCorner( center + rotatedPoint, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zone->SetHatch(
|
||||||
|
ZONE_HATCH_STYLE::DIAGONAL_EDGE, ZONE_CONTAINER::GetDefaultHatchPitch(), true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PCB_LAYER_ID layer = kicad_layer( e.layer );
|
||||||
|
EDGE_MODULE* gr = new EDGE_MODULE( aModule, S_CIRCLE );
|
||||||
|
|
||||||
// with == 0 means filled circle
|
// with == 0 means filled circle
|
||||||
if( width <= 0 )
|
if( width <= 0 )
|
||||||
{
|
{
|
||||||
|
@ -1938,7 +2038,7 @@ void EAGLE_PLUGIN::packageCircle( MODULE* aModule, wxXmlNode* aTree ) const
|
||||||
aModule->Add( gr );
|
aModule->Add( gr );
|
||||||
gr->SetWidth( width );
|
gr->SetWidth( width );
|
||||||
|
|
||||||
switch ( (int) layer )
|
switch( (int) layer )
|
||||||
{
|
{
|
||||||
case UNDEFINED_LAYER:
|
case UNDEFINED_LAYER:
|
||||||
layer = Cmts_User;
|
layer = Cmts_User;
|
||||||
|
@ -1951,6 +2051,7 @@ void EAGLE_PLUGIN::packageCircle( MODULE* aModule, wxXmlNode* aTree ) const
|
||||||
gr->SetStart0( wxPoint( kicad_x( e.x ), kicad_y( e.y ) ) );
|
gr->SetStart0( wxPoint( kicad_x( e.x ), kicad_y( e.y ) ) );
|
||||||
gr->SetEnd0( wxPoint( kicad_x( e.x ) + radius, kicad_y( e.y ) ) );
|
gr->SetEnd0( wxPoint( kicad_x( e.x ) + radius, kicad_y( e.y ) ) );
|
||||||
gr->SetDrawCoord();
|
gr->SetDrawCoord();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue