board_items_to_polygon_shape_transform.cpp: remove full duplicate code between DRAWSEGMENT and EDGE_MODULE, and fix incorrect conversion of DRAWSEGMENT polygon type to its polygonal shape.

Gerbview: better info from X2 filefunction attribute displayed in layer manager about copper layers
This commit is contained in:
jean-pierre charras 2015-04-09 20:53:36 +02:00
parent 4274f2d5d5
commit ec17455d35
6 changed files with 120 additions and 65 deletions

View File

@ -54,6 +54,7 @@ const wxString DrillFileExtension( wxT( "drl" ) );
const wxString SVGFileExtension( wxT( "svg" ) ); const wxString SVGFileExtension( wxT( "svg" ) );
const wxString ReportFileExtension( wxT( "rpt" ) ); const wxString ReportFileExtension( wxT( "rpt" ) );
const wxString FootprintPlaceFileExtension( wxT( "pos" ) ); const wxString FootprintPlaceFileExtension( wxT( "pos" ) );
const wxString KiCadLib3DShapesPathExtension( wxT( "3dshapes" ) ); ///< 3D shapes default libpath
const wxString KiCadFootprintLibPathExtension( wxT( "pretty" ) ); ///< KICAD PLUGIN libpath const wxString KiCadFootprintLibPathExtension( wxT( "pretty" ) ); ///< KICAD PLUGIN libpath
const wxString LegacyFootprintLibPathExtension( wxT( "mod" ) ); const wxString LegacyFootprintLibPathExtension( wxT( "mod" ) );

View File

@ -463,9 +463,21 @@ const wxString GERBER_IMAGE_LIST::GetDisplayName( int aIdx )
if( gerber && IsUsed(aIdx ) ) if( gerber && IsUsed(aIdx ) )
{ {
if( gerber->m_FileFunction ) if( gerber->m_FileFunction )
{
if( gerber->m_FileFunction->IsCopper() )
{
name.Printf( _( "Layer %d (%s, %s, %s)" ), aIdx + 1,
GetChars( gerber->m_FileFunction->GetFileType() ),
GetChars( gerber->m_FileFunction->GetBrdLayerId() ),
GetChars( gerber->m_FileFunction->GetBrdLayerSide() ) );
}
else
{
name.Printf( _( "Layer %d (%s, %s)" ), aIdx + 1, name.Printf( _( "Layer %d (%s, %s)" ), aIdx + 1,
GetChars( gerber->m_FileFunction->GetFileType() ), GetChars( gerber->m_FileFunction->GetFileType() ),
GetChars( gerber->m_FileFunction->GetBrdLayerId() ) ); GetChars( gerber->m_FileFunction->GetBrdLayerId() ) );
}
}
else else
name.Printf( _( "Layer %d *" ), aIdx + 1 ); name.Printf( _( "Layer %d *" ), aIdx + 1 );
} }

View File

@ -189,18 +189,35 @@ const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetFileType()
const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetBrdLayerId() const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetBrdLayerId()
{ {
// the brd layer identifier: Top, Bot, Ln // the brd layer identifier: Ln (for Copper type) or Top, Bot
return m_Prms.Item( 2 ); return m_Prms.Item( 2 );
} }
const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetBrdLayerSide()
{
if( IsCopper() )
// the brd layer identifier: Top, Bot, Inr
return m_Prms.Item( 3 );
else
// the brd layer identifier: Top, Bot ( same as GetBrdLayerId() )
return m_Prms.Item( 2 );
}
const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetLabel() const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetLabel()
{ {
// the filefunction label, if any if( IsCopper() )
return m_Prms.Item( 4 );
else
return m_Prms.Item( 3 ); return m_Prms.Item( 3 );
} }
bool X2_ATTRIBUTE_FILEFUNCTION::IsCopper()
{
// the filefunction label, if any
return GetFileType().IsSameAs( wxT( "Copper" ), false );
}
// Initialize the z order priority of the current file, from its attributes // Initialize the z order priority of the current file, from its attributes
// this priority is the order of layers from top to bottom to draw/display gerber images // this priority is the order of layers from top to bottom to draw/display gerber images
// Stack up is( from external copper layer to external) // Stack up is( from external copper layer to external)
@ -211,7 +228,7 @@ void X2_ATTRIBUTE_FILEFUNCTION::set_Z_Order()
m_z_order = -100; // low level m_z_order = -100; // low level
m_z_sub_order = 0; m_z_sub_order = 0;
if( GetFileType().IsSameAs( wxT( "Copper" ), false ) ) if( IsCopper() )
{ {
// Copper layer: the priority is the layer Id // Copper layer: the priority is the layer Id
m_z_order = 0; m_z_order = 0;

View File

@ -153,12 +153,19 @@ class X2_ATTRIBUTE_FILEFUNCTION : public X2_ATTRIBUTE
public: public:
X2_ATTRIBUTE_FILEFUNCTION( X2_ATTRIBUTE& aAttributeBase ); X2_ATTRIBUTE_FILEFUNCTION( X2_ATTRIBUTE& aAttributeBase );
bool IsCopper(); ///< return true if the filefunction type is "Copper"
const wxString& GetFileType(); ///< the type of layer (Copper, Soldermask ... ) const wxString& GetFileType(); ///< the type of layer (Copper, Soldermask ... )
const wxString& GetBrdLayerId(); ///< the brd layer identifier: Top, Bot, Ln const wxString& GetBrdLayerId(); ///< the brd layer identifier: Ln, only for Copper type
///< or Top, Bot for other types
const wxString& GetBrdLayerSide(); ///< the brd layer Pos: Top, Bot, Inr
///< same as GetBrdLayerId() for non copper type
const wxString& GetLabel(); ///< the filefunction label, if any const wxString& GetLabel(); ///< the filefunction label, if any
int GetZOrder() { return m_z_order; } ///< the Order of the bdr layer, from front (Top side) to back side int GetZOrder() { return m_z_order; } ///< the Order of the board layer,
int GetZSubOrder() { return m_z_sub_order; } ///< the Order of the bdr copper layer, from front (Top side) to back side ///< from front (Top) side to back (Bot) side
int GetZSubOrder() { return m_z_sub_order; } ///< the Order of the bdr copper layer,
///< from front (Top) side to back (Bot) side
private: private:

View File

@ -71,6 +71,7 @@ extern const wxString GedaPcbFootprintLibFileExtension;
extern const wxString EagleFootprintLibPathExtension; extern const wxString EagleFootprintLibPathExtension;
extern const wxString ComponentFileExtensionWildcard; extern const wxString ComponentFileExtensionWildcard;
extern const wxString PageLayoutDescrFileWildcard; extern const wxString PageLayoutDescrFileWildcard;
extern const wxString KiCadLib3DShapesPathExtension;
/// Proper wxFileDialog wild card definitions. /// Proper wxFileDialog wild card definitions.
extern const wxString SchematicSymbolFileWildcard; extern const wxString SchematicSymbolFileWildcard;

View File

@ -227,52 +227,13 @@ void MODULE::TransformGraphicShapesWithClearanceToPolygonSet(
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
outline = (EDGE_MODULE*) item; outline = (EDGE_MODULE*) item;
if( outline->GetLayer() != aLayer ) if( outline->GetLayer() != aLayer )
break; break;
outline->TransformShapeWithClearanceToPolygon( aCornerBuffer,
switch( outline->GetShape() ) 0,
{
case S_SEGMENT:
TransformRoundedEndsSegmentToPolygon( aCornerBuffer,
outline->GetStart(),
outline->GetEnd(),
aCircleToSegmentsCount, aCircleToSegmentsCount,
outline->GetWidth() ); aCorrectionFactor );
break;
case S_CIRCLE:
TransformRingToPolygon( aCornerBuffer, outline->GetCenter(),
outline->GetRadius(), aCircleToSegmentsCount,
outline->GetWidth() );
break;
case S_ARC:
TransformArcToPolygon( aCornerBuffer,
outline->GetCenter(), outline->GetArcStart(),
outline->GetAngle(),
aCircleToSegmentsCount, outline->GetWidth() );
break;
case S_POLYGON:
// for outline shape = S_POLYGON:
// We must compute true coordinates from m_PolyPoints
// which are relative to module position and module orientation = 0
for( unsigned ii = 0; ii < outline->GetPolyPoints().size(); ii++ )
{
CPolyPt corner( outline->GetPolyPoints()[ii] );
RotatePoint( &corner.x, &corner.y, GetOrientation() );
corner.x += GetPosition().x;
corner.y += GetPosition().y;
aCornerBuffer.Append( corner );
}
aCornerBuffer.CloseLastContour();
break;
default:
DBG( printf( "Error: Shape %d not implemented!\n",
outline->GetShape() ); )
break;
}
break; break;
default: default:
@ -332,7 +293,7 @@ void ZONE_CONTAINER::TransformSolidAreasShapesToPolygonSet(
// add filled areas polygons // add filled areas polygons
aCornerBuffer.Append( m_FilledPolysList ); aCornerBuffer.Append( m_FilledPolysList );
// add filled areas outlines, which are drawn with thich lines // add filled areas outlines, which are drawn with thick lines
wxPoint seg_start, seg_end; wxPoint seg_start, seg_end;
int i_start_contour = 0; int i_start_contour = 0;
for( unsigned ic = 0; ic < cornerscount; ic++ ) for( unsigned ic = 0; ic < cornerscount; ic++ )
@ -473,25 +434,81 @@ void DRAWSEGMENT::TransformShapeWithClearanceToPolygon( CPOLYGONS_LIST& aCornerB
int aCircleToSegmentsCount, int aCircleToSegmentsCount,
double aCorrectionFactor ) const double aCorrectionFactor ) const
{ {
// The full width of the lines to create:
int linewidth = m_Width + (2 * aClearanceValue);
switch( m_Shape ) switch( m_Shape )
{ {
case S_CIRCLE: case S_CIRCLE:
TransformRingToPolygon( aCornerBuffer, GetCenter(), GetRadius(), TransformRingToPolygon( aCornerBuffer, GetCenter(), GetRadius(),
aCircleToSegmentsCount, aCircleToSegmentsCount, linewidth ) ;
m_Width + (2 * aClearanceValue) ) ;
break; break;
case S_ARC: case S_ARC:
TransformArcToPolygon( aCornerBuffer, GetCenter(), TransformArcToPolygon( aCornerBuffer, GetCenter(),
GetArcStart(), m_Angle, GetArcStart(), m_Angle,
aCircleToSegmentsCount, aCircleToSegmentsCount, linewidth );
m_Width + (2 * aClearanceValue) ); break;
case S_SEGMENT:
TransformRoundedEndsSegmentToPolygon( aCornerBuffer, m_Start, m_End,
aCircleToSegmentsCount, linewidth );
break;
case S_POLYGON:
if ( GetPolyPoints().size() < 2 )
break; // Malformed polygon.
{
// The polygon is expected to be a simple polygon
// not self intersecting, no hole.
MODULE* module = GetParentModule(); // NULL for items not in footprints
double orientation = module ? module->GetOrientation() : 0.0;
// Build the polygon with the actual position and orientation:
std::vector< wxPoint> poly;
poly = GetPolyPoints();
for( unsigned ii = 0; ii < poly.size(); ii++ )
{
RotatePoint( &poly[ii], orientation );
poly[ii] += GetPosition();
}
// Generate polygons for the outline + clearance
// This code is compatible with a polygon with holes linked to external outline
// by overlapping segments.
if( linewidth ) // Add thick outlines
{
CPolyPt corner1( poly[poly.size()-1] );
for( unsigned ii = 0; ii < poly.size(); ii++ )
{
CPolyPt corner2( poly[ii] );
if( corner2 != corner1 )
{
TransformRoundedEndsSegmentToPolygon( aCornerBuffer,
corner1, corner2, aCircleToSegmentsCount, linewidth );
}
corner1 = corner2;
}
}
// Polygon for the inside
for( unsigned ii = 0; ii < poly.size(); ii++ )
{
CPolyPt corner( poly[ii] );
aCornerBuffer.Append( corner );
}
aCornerBuffer.CloseLastContour();
}
break;
case S_CURVE: // Bezier curve (TODO: not yet in use)
break; break;
default: default:
TransformRoundedEndsSegmentToPolygon( aCornerBuffer, m_Start, m_End,
aCircleToSegmentsCount,
m_Width + (2 * aClearanceValue) );
break; break;
} }
} }