kicad2step: Added minimum distance parameter
This commit is contained in:
parent
7ef97e0bca
commit
a08c0ac08c
|
@ -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 ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue