kicad2step: Added minimum distance parameter

This commit is contained in:
Maciej Suminski 2018-06-19 10:14:10 +02:00
parent 7ef97e0bca
commit a08c0ac08c
6 changed files with 68 additions and 13 deletions

View File

@ -54,6 +54,7 @@ private:
wxString m_outputFile; wxString m_outputFile;
double m_xOrigin; double m_xOrigin;
double m_yOrigin; double m_yOrigin;
double m_minDistance;
}; };
static const wxCmdLineEntryDesc cmdLineDesc[] = static const wxCmdLineEntryDesc cmdLineDesc[] =
@ -78,6 +79,9 @@ static const wxCmdLineEntryDesc cmdLineDesc[] =
{ wxCMD_LINE_SWITCH, NULL, "no-virtual", { wxCMD_LINE_SWITCH, NULL, "no-virtual",
_( "exclude 3D models for components with 'virtual' attribute" ).mb_str(), _( "exclude 3D models for components with 'virtual' attribute" ).mb_str(),
wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_OPTION, NULL, "min-distance",
_( "Minimum distance between points to treat them as separate ones (default 0.01 mm)" ).mb_str(),
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_SWITCH, "h", NULL, _( "display this message" ).mb_str(), { wxCMD_LINE_SWITCH, "h", NULL, _( "display this message" ).mb_str(),
wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
{ wxCMD_LINE_NONE } { wxCMD_LINE_NONE }
@ -98,6 +102,7 @@ bool KICAD2MCAD::OnInit()
m_includeVirtual = true; m_includeVirtual = true;
m_xOrigin = 0.0; m_xOrigin = 0.0;
m_yOrigin = 0.0; m_yOrigin = 0.0;
m_minDistance = MIN_DISTANCE;
if( !wxAppConsole::OnInit() ) if( !wxAppConsole::OnInit() )
return false; return false;
@ -181,6 +186,28 @@ bool KICAD2MCAD::OnCmdLineParsed( wxCmdLineParser& parser )
} }
} }
} }
if( parser.Found( "min-distance", &tstr ) )
{
std::istringstream istr;
istr.str( std::string( tstr.ToUTF8() ) );
istr >> m_minDistance;
if( istr.fail() )
{
parser.Usage();
return false;
}
if( !istr.eof() )
{
std::string tunit;
istr >> tunit;
if( !tunit.compare( "in" ) || !tunit.compare( "inch" ) )
{
m_minDistance *= 25.4;
} }
else if( tunit.compare( "mm" ) ) else if( tunit.compare( "mm" ) )
{ {
@ -243,6 +270,7 @@ int KICAD2MCAD::OnRun()
KICADPCB pcb; KICADPCB pcb;
pcb.SetOrigin( m_xOrigin, m_yOrigin ); pcb.SetOrigin( m_xOrigin, m_yOrigin );
pcb.SetMinDistance( m_minDistance );
if( pcb.ReadFile( m_filename ) ) if( pcb.ReadFile( m_filename ) )
{ {

View File

@ -30,6 +30,9 @@
#ifndef KICADBASE_H #ifndef KICADBASE_H
#define KICADBASE_H #define KICADBASE_H
///> Minimum distance between points to treat them as separate ones (mm)
static constexpr double MIN_DISTANCE = 0.01;
namespace SEXPR namespace SEXPR
{ {
class SEXPR; class SEXPR;

View File

@ -87,12 +87,11 @@ KICADPCB::KICADPCB()
m_resolver.Set3DConfigDir( cfgdir.GetPath() ); m_resolver.Set3DConfigDir( cfgdir.GetPath() );
m_thickness = 1.6; m_thickness = 1.6;
m_pcb = NULL; m_pcb = NULL;
m_minDistance = MIN_DISTANCE;
m_useGridOrigin = false; m_useGridOrigin = false;
m_useDrillOrigin = false; m_useDrillOrigin = false;
m_hasGridOrigin = false; m_hasGridOrigin = false;
m_hasDrillOrigin = false; m_hasDrillOrigin = false;
return;
} }
@ -477,6 +476,7 @@ bool KICADPCB::ComposePCB( bool aComposeVirtual )
m_pcb = new PCBMODEL(); m_pcb = new PCBMODEL();
m_pcb->SetPCBThickness( m_thickness ); m_pcb->SetPCBThickness( m_thickness );
m_pcb->SetMinDistance( m_minDistance );
for( auto i : m_curves ) for( auto i : m_curves )
{ {

View File

@ -62,6 +62,8 @@ private:
// set to TRUE if the origin was actually parsed // set to TRUE if the origin was actually parsed
bool m_hasGridOrigin; bool m_hasGridOrigin;
bool m_hasDrillOrigin; bool m_hasDrillOrigin;
// minimum distance between points to treat them as separate entities (mm)
double m_minDistance;
// the names of layers in use, and the internal layer ID // the names of layers in use, and the internal layer ID
std::map<std::string, int> m_layersNames; std::map<std::string, int> m_layersNames;
@ -99,6 +101,11 @@ public:
m_useDrillOrigin = aUseOrigin; m_useDrillOrigin = aUseOrigin;
} }
void SetMinDistance( double aDistance )
{
m_minDistance = aDistance;
}
bool ReadFile( const wxString& aFileName ); bool ReadFile( const wxString& aFileName );
bool ComposePCB( bool aComposeVirtual = true ); bool ComposePCB( bool aComposeVirtual = true );
bool WriteSTEP( const wxString& aFileName, bool aOverwrite ); bool WriteSTEP( const wxString& aFileName, bool aOverwrite );

View File

@ -84,7 +84,7 @@ static constexpr double THICKNESS_DEFAULT = 1.6;
// nominal offset from the board // nominal offset from the board
static constexpr double BOARD_OFFSET = 0.05; static constexpr double BOARD_OFFSET = 0.05;
// min. length**2 below which 2 points are considered coincident // min. length**2 below which 2 points are considered coincident
static constexpr double MIN_LENGTH2 = 0.0001; // = 0.01*0.01 static constexpr double MIN_LENGTH2 = MIN_DISTANCE * MIN_DISTANCE;
static void getEndPoints( const KICADCURVE& aCurve, double& spx0, double& spy0, static void getEndPoints( const KICADCURVE& aCurve, double& spx0, double& spy0,
double& epx0, double& epy0 ) double& epx0, double& epy0 )
@ -226,6 +226,7 @@ PCBMODEL::PCBMODEL()
m_precision = USER_PREC; m_precision = USER_PREC;
m_angleprec = USER_ANGLE_PREC; m_angleprec = USER_ANGLE_PREC;
m_thickness = THICKNESS_DEFAULT; m_thickness = THICKNESS_DEFAULT;
m_minDistance2 = MIN_LENGTH2;
m_minx = 1.0e10; // absurdly large number; any valid PCB X value will be smaller m_minx = 1.0e10; // absurdly large number; any valid PCB X value will be smaller
m_mincurve = m_curves.end(); m_mincurve = m_curves.end();
BRepBuilderAPI::Precision( 1.0e-6 ); BRepBuilderAPI::Precision( 1.0e-6 );
@ -252,7 +253,7 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
double dy = aCurve->m_end.y - aCurve->m_start.y; double dy = aCurve->m_end.y - aCurve->m_start.y;
double distance = dx * dx + dy * dy; double distance = dx * dx + dy * dy;
if( distance < MIN_LENGTH2 ) if( distance < m_minDistance2 )
{ {
std::ostringstream ostr; std::ostringstream ostr;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
@ -271,7 +272,7 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
double dy = aCurve->m_end.y - aCurve->m_start.y; double dy = aCurve->m_end.y - aCurve->m_start.y;
double rad = dx * dx + dy * dy; double rad = dx * dx + dy * dy;
if( rad < MIN_LENGTH2 ) if( rad < m_minDistance2 )
{ {
std::ostringstream ostr; std::ostringstream ostr;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
@ -311,7 +312,7 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
dy = aCurve->m_ep.y - aCurve->m_end.y; dy = aCurve->m_ep.y - aCurve->m_end.y;
rad = dx * dx + dy * dy; rad = dx * dx + dy * dy;
if( rad < MIN_LENGTH2 ) if( rad < m_minDistance2 )
{ {
std::ostringstream ostr; std::ostringstream ostr;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
@ -528,6 +529,7 @@ bool PCBMODEL::AddPadHole( KICADPAD* aPad )
p3.y += aPad->m_position.y; p3.y += aPad->m_position.y;
OUTLINE oln; OUTLINE oln;
oln.SetMinSqDistance( m_minDistance2 );
KICADCURVE crv0, crv1, crv2, crv3; KICADCURVE crv0, crv1, crv2, crv3;
// crv0 = arc // crv0 = arc
@ -679,6 +681,7 @@ bool PCBMODEL::CreatePCB()
m_hasPCB = true; // whether or not operations fail we note that CreatePCB has been invoked m_hasPCB = true; // whether or not operations fail we note that CreatePCB has been invoked
TopoDS_Shape board; TopoDS_Shape board;
OUTLINE oln; // loop to assemble (represents PCB outline and cutouts) OUTLINE oln; // loop to assemble (represents PCB outline and cutouts)
oln.SetMinSqDistance( m_minDistance2 );
oln.AddSegment( *m_mincurve ); oln.AddSegment( *m_mincurve );
m_curves.erase( m_mincurve ); m_curves.erase( m_mincurve );
@ -1279,6 +1282,7 @@ TDF_Label PCBMODEL::transferModel( Handle( TDocStd_Document )& source,
OUTLINE::OUTLINE() OUTLINE::OUTLINE()
{ {
m_closed = false; m_closed = false;
m_minDistance2 = MIN_LENGTH2;
return; return;
} }
@ -1330,7 +1334,7 @@ bool OUTLINE::AddSegment( const KICADCURVE& aCurve )
dx = epx1 - spx0; dx = epx1 - spx0;
dy = epy1 - spy0; dy = epy1 - spy0;
if( dx * dx + dy * dy < MIN_LENGTH2 ) if( dx * dx + dy * dy < m_minDistance2 )
{ {
m_curves.push_front( aCurve ); m_curves.push_front( aCurve );
m_closed = testClosed( m_curves.front(), m_curves.back() ); m_closed = testClosed( m_curves.front(), m_curves.back() );
@ -1341,7 +1345,7 @@ bool OUTLINE::AddSegment( const KICADCURVE& aCurve )
dx = spx1 - spx0; dx = spx1 - spx0;
dy = spy1 - spy0; dy = spy1 - spy0;
if( dx * dx + dy * dy < MIN_LENGTH2 ) if( dx * dx + dy * dy < m_minDistance2 )
{ {
KICADCURVE curve = aCurve; KICADCURVE curve = aCurve;
reverseCurve( curve ); reverseCurve( curve );
@ -1356,7 +1360,7 @@ bool OUTLINE::AddSegment( const KICADCURVE& aCurve )
dx = spx1 - epx0; dx = spx1 - epx0;
dy = spy1 - epy0; dy = spy1 - epy0;
if( dx * dx + dy * dy < MIN_LENGTH2 ) if( dx * dx + dy * dy < m_minDistance2 )
{ {
m_curves.push_back( aCurve ); m_curves.push_back( aCurve );
m_closed = testClosed( m_curves.front(), m_curves.back() ); m_closed = testClosed( m_curves.front(), m_curves.back() );
@ -1367,7 +1371,7 @@ bool OUTLINE::AddSegment( const KICADCURVE& aCurve )
dx = epx1 - epx0; dx = epx1 - epx0;
dy = epy1 - epy0; dy = epy1 - epy0;
if( dx * dx + dy * dy < MIN_LENGTH2 ) if( dx * dx + dy * dy < m_minDistance2 )
{ {
KICADCURVE curve = aCurve; KICADCURVE curve = aCurve;
reverseCurve( curve ); reverseCurve( curve );
@ -1470,7 +1474,7 @@ bool OUTLINE::addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBL
double dy = aLastPoint.y - aCurve.m_end.y; double dy = aLastPoint.y - aCurve.m_end.y;
double distance = dx * dx + dy * dy; double distance = dx * dx + dy * dy;
if( distance > 0 && distance < MIN_LENGTH2 ) if( distance > 0 && distance < m_minDistance2 )
{ {
std::ostringstream ostr; std::ostringstream ostr;
@ -1551,7 +1555,7 @@ bool OUTLINE::testClosed( KICADCURVE& aFrontCurve, KICADCURVE& aBackCurve )
double dy = epy1 - spy0; double dy = epy1 - spy0;
double r = dx * dx + dy * dy; double r = dx * dx + dy * dy;
if( r < MIN_LENGTH2 ) if( r < m_minDistance2 )
return true; return true;
return false; return false;

View File

@ -49,7 +49,8 @@ class KICADPAD;
class OUTLINE class OUTLINE
{ {
private: private:
bool m_closed; // set true if the loop is closed bool m_closed; // set true if the loop is closed
double m_minDistance2; // min squared distance to treat points as separate entities (mm)
bool addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBLET& aLastPoint ); bool addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBLET& aLastPoint );
bool testClosed( KICADCURVE& aFrontCurve, KICADCURVE& aBackCurve ); bool testClosed( KICADCURVE& aFrontCurve, KICADCURVE& aBackCurve );
@ -69,6 +70,11 @@ public:
return m_closed; return m_closed;
} }
void SetMinSqDistance( double aDistance )
{
m_minDistance2 = aDistance;
}
bool MakeShape( TopoDS_Shape& aShape, double aThickness ); bool MakeShape( TopoDS_Shape& aShape, double aThickness );
}; };
@ -87,6 +93,7 @@ class PCBMODEL
double m_angleprec; // angle numeric precision double m_angleprec; // angle numeric precision
double m_thickness; // PCB thickness, mm double m_thickness; // PCB thickness, mm
double m_minx; // minimum X value in curves (leftmost curve feature) double m_minx; // minimum X value in curves (leftmost curve feature)
double m_minDistance2; // minimum squared distance between items (mm)
std::list< KICADCURVE >::iterator m_mincurve; // iterator to the leftmost curve std::list< KICADCURVE >::iterator m_mincurve; // iterator to the leftmost curve
std::list< KICADCURVE > m_curves; std::list< KICADCURVE > m_curves;
@ -124,6 +131,12 @@ public:
// aThickness > THICKNESS_MIN == use aThickness // aThickness > THICKNESS_MIN == use aThickness
void SetPCBThickness( double aThickness ); void SetPCBThickness( double aThickness );
void SetMinDistance( double aDistance )
{
// m_minDistance2 keeps a squared distance value
m_minDistance2 = aDistance * aDistance;
}
// create the PCB model using the current outlines and drill holes // create the PCB model using the current outlines and drill holes
bool CreatePCB(); bool CreatePCB();