bitmap2component: minor enhancements and fixes.

This commit is contained in:
jean-pierre charras 2019-04-01 12:51:27 +02:00
parent 9d97c053b4
commit 8e2d82ebdb
1 changed files with 32 additions and 26 deletions

View File

@ -1,8 +1,8 @@
/* /*
* This program source code file is part of KICAD, a free EDA CAD application. * This program source code file is part of KICAD, a free EDA CAD application.
* *
* Copyright (C) 1992-2013 jean-pierre.charras * Copyright (C) 1992-2019 jean-pierre.charras
* Copyright (C) 1992-2019 Kicad Developers, see change_log.txt for contributors. * Copyright (C) 1992-2019 Kicad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -38,6 +38,9 @@
#include "bitmap2component.h" #include "bitmap2component.h"
// Unit conversion. Coord unit from potrace is mm
#define MM2MICRON 1e3 // For pl_editor
#define MM2NANOMETER 1e6 // For pcbew
/* free a potrace bitmap */ /* free a potrace bitmap */
static void bm_free( potrace_bitmap_t* bm ) static void bm_free( potrace_bitmap_t* bm )
@ -99,7 +102,7 @@ private:
/** /**
* Function OuputOnePolygon * Function OuputOnePolygon
* write one polygon to output file. * write one polygon to output file.
* Polygon coordinates are expected scaled by the polugon extraction function * Polygon coordinates are expected scaled by the polygon extraction function
*/ */
void OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char* aBrdLayerName ); void OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char* aBrdLayerName );
@ -166,8 +169,8 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
{ {
case KICAD_LOGO: case KICAD_LOGO:
info.m_Format = KICAD_LOGO; info.m_Format = KICAD_LOGO;
info.m_ScaleX = 1e3 * 25.4 / aDpi_X; // the conversion scale from PPI to micro info.m_ScaleX = MM2MICRON * 25.4 / aDpi_X; // the conversion scale from PPI to micron
info.m_ScaleY = 1e3 * 25.4 / aDpi_Y; // Y axis is top to bottom info.m_ScaleY = MM2MICRON * 25.4 / aDpi_Y; // Y axis is top to bottom
info.CreateOutputFile(); info.CreateOutputFile();
break; break;
@ -181,15 +184,15 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
case EESCHEMA_FMT: case EESCHEMA_FMT:
info.m_Format = EESCHEMA_FMT; info.m_Format = EESCHEMA_FMT;
info.m_ScaleX = 1000.0 / aDpi_X; // the conversion scale from PPI to UI info.m_ScaleX = 1000.0 / aDpi_X; // the conversion scale from PPI to UI (mil)
info.m_ScaleY = -1000.0 / aDpi_Y; // Y axis is bottom to Top for components in libs info.m_ScaleY = -1000.0 / aDpi_Y; // Y axis is bottom to Top for components in libs
info.CreateOutputFile(); info.CreateOutputFile();
break; break;
case PCBNEW_KICAD_MOD: case PCBNEW_KICAD_MOD:
info.m_Format = PCBNEW_KICAD_MOD; info.m_Format = PCBNEW_KICAD_MOD;
info.m_ScaleX = 1e6 * 25.4 / aDpi_X; // the conversion scale from PPI to UI info.m_ScaleX = MM2NANOMETER * 25.4 / aDpi_X; // the conversion scale from PPI to UI
info.m_ScaleY = 1e6 * 25.4 / aDpi_Y; // Y axis is top to bottom in modedit info.m_ScaleY = MM2NANOMETER * 25.4 / aDpi_Y; // Y axis is top to bottom in modedit
info.CreateOutputFile( aModLayer ); info.CreateOutputFile( aModLayer );
break; break;
@ -205,6 +208,7 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
return 0; return 0;
} }
const char* BITMAPCONV_INFO::getBrdLayerName( BMP2CMP_MOD_LAYER aChoice ) const char* BITMAPCONV_INFO::getBrdLayerName( BMP2CMP_MOD_LAYER aChoice )
{ {
const char * layerName = "F.SilkS"; const char * layerName = "F.SilkS";
@ -231,6 +235,7 @@ const char* BITMAPCONV_INFO::getBrdLayerName( BMP2CMP_MOD_LAYER aChoice )
return layerName; return layerName;
} }
void BITMAPCONV_INFO::OuputFileHeader( const char * aBrdLayerName ) void BITMAPCONV_INFO::OuputFileHeader( const char * aBrdLayerName )
{ {
int Ypos = (int) ( m_PixmapHeight / 2 * m_ScaleY ); int Ypos = (int) ( m_PixmapHeight / 2 * m_ScaleY );
@ -303,13 +308,11 @@ void BITMAPCONV_INFO::OuputFileEnd()
} }
} }
/**
* Function OuputOnePolygon
* write one polygon to output file.
* Polygon coordinates are expected scaled by the polygon extraction function
*/
void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char* aBrdLayerName ) void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char* aBrdLayerName )
{ {
// write one polygon to output file.
// coordinates are expected in target unit.
int ii, jj; int ii, jj;
VECTOR2I currpoint; VECTOR2I currpoint;
@ -351,8 +354,8 @@ void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char*
{ {
currpoint = aPolygon.CPoint( ii ); currpoint = aPolygon.CPoint( ii );
fprintf( m_Outfile, " (xy %f %f)", fprintf( m_Outfile, " (xy %f %f)",
( currpoint.x - offsetX ) / 1e6, ( currpoint.x - offsetX ) / MM2NANOMETER,
( currpoint.y - offsetY ) / 1e6 ); ( currpoint.y - offsetY ) / MM2NANOMETER );
if( jj++ > 6 ) if( jj++ > 6 )
{ {
@ -360,10 +363,8 @@ void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char*
fprintf( m_Outfile, ("\n ") ); fprintf( m_Outfile, ("\n ") );
} }
} }
// Close polygon // No need to close polygon
fprintf( m_Outfile, " (xy %f %f) )", fprintf( m_Outfile, " )" );
( startpoint.x - offsetX ) / 1e6, ( startpoint.y - offsetY ) / 1e6 );
fprintf( m_Outfile, "(layer %s) (width %f)\n )\n", aBrdLayerName, width ); fprintf( m_Outfile, "(layer %s) (width %f)\n )\n", aBrdLayerName, width );
} }
@ -377,8 +378,8 @@ void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char*
{ {
currpoint = aPolygon.CPoint( ii ); currpoint = aPolygon.CPoint( ii );
fprintf( m_Outfile, " (xy %.3f %.3f)", fprintf( m_Outfile, " (xy %.3f %.3f)",
( currpoint.x - offsetX ) / 1e3, ( currpoint.x - offsetX ) / MM2MICRON,
( currpoint.y - offsetY ) / 1e3 ); ( currpoint.y - offsetY ) / MM2MICRON );
if( jj++ > 4 ) if( jj++ > 4 )
{ {
@ -388,7 +389,8 @@ void BITMAPCONV_INFO::OuputOnePolygon( SHAPE_LINE_CHAIN & aPolygon, const char*
} }
// Close polygon // Close polygon
fprintf( m_Outfile, " (xy %.3f %.3f) )\n", fprintf( m_Outfile, " (xy %.3f %.3f) )\n",
( startpoint.x - offsetX ) / 1e3, ( startpoint.y - offsetY ) / 1e3 ); ( startpoint.x - offsetX ) / MM2MICRON,
( startpoint.y - offsetY ) / MM2MICRON );
break; break;
case EESCHEMA_FMT: case EESCHEMA_FMT:
@ -490,10 +492,14 @@ void BITMAPCONV_INFO::CreateOutputFile( BMP2CMP_MOD_LAYER aModLayer )
*/ */
if( paths->next == NULL || paths->next->sign == '+' ) if( paths->next == NULL || paths->next->sign == '+' )
{ {
// Substract holes to main polygon: polyset_areas.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
polyset_areas.Simplify( SHAPE_POLY_SET::PM_FAST ); polyset_holes.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
polyset_holes.Simplify( SHAPE_POLY_SET::PM_FAST ); polyset_areas.BooleanSubtract( polyset_holes, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
polyset_areas.BooleanSubtract( polyset_holes, SHAPE_POLY_SET::PM_FAST );
// Ensure there are no self intersecting polygons
polyset_areas.NormalizeAreaOutlines();
// Convert polygon with holes to a unique polygon
polyset_areas.Fracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); polyset_areas.Fracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
// Output current resulting polygon(s) // Output current resulting polygon(s)