bitmap2component: minor enhancements and fixes.
This commit is contained in:
parent
9d97c053b4
commit
8e2d82ebdb
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue