kicad2step: More diagnostic messages to determine export issues

This commit is contained in:
Maciej Suminski 2018-06-18 14:20:25 +02:00
parent 03fa645743
commit ba3f2b30ee
5 changed files with 75 additions and 10 deletions

View File

@ -31,6 +31,20 @@
static const char bad_position[] = "* corrupt module in PCB file; invalid position"; static const char bad_position[] = "* corrupt module in PCB file; invalid position";
std::ostream& operator<<( std::ostream& aStream, const DOUBLET& aDoublet )
{
aStream << aDoublet.x << "," << aDoublet.y;
return aStream;
}
std::ostream& operator<<( std::ostream& aStream, const TRIPLET& aTriplet )
{
aStream << aTriplet.x << "," << aTriplet.y << "," << aTriplet.z;
return aStream;
}
bool Get2DPositionAndRotation( SEXPR::SEXPR* data, DOUBLET& aPosition, double& aRotation ) bool Get2DPositionAndRotation( SEXPR::SEXPR* data, DOUBLET& aPosition, double& aRotation )
{ {
// form: (at X Y {rot}) // form: (at X Y {rot})

View File

@ -66,6 +66,8 @@ struct DOUBLET
DOUBLET( double aX, double aY ) : x( aX ), y( aY ) { return; } DOUBLET( double aX, double aY ) : x( aX ), y( aY ) { return; }
}; };
std::ostream& operator<<( std::ostream& aStream, const DOUBLET& aDoublet );
struct TRIPLET struct TRIPLET
{ {
double x; double x;
@ -81,6 +83,8 @@ struct TRIPLET
TRIPLET( double aX, double aY, double aZ ) : x( aX ), y( aY ), z( aZ ) { return; } TRIPLET( double aX, double aY, double aZ ) : x( aX ), y( aY ), z( aZ ) { return; }
}; };
std::ostream& operator<<( std::ostream& aStream, const TRIPLET& aTriplet );
bool Get2DPositionAndRotation( SEXPR::SEXPR* data, DOUBLET& aPosition, double& aRotation ); bool Get2DPositionAndRotation( SEXPR::SEXPR* data, DOUBLET& aPosition, double& aRotation );
bool Get2DCoordinate( SEXPR::SEXPR* data, DOUBLET& aCoordinate ); bool Get2DCoordinate( SEXPR::SEXPR* data, DOUBLET& aCoordinate );
bool Get3DCoordinate( SEXPR::SEXPR* data, TRIPLET& aCoordinate ); bool Get3DCoordinate( SEXPR::SEXPR* data, TRIPLET& aCoordinate );

View File

@ -134,3 +134,28 @@ bool KICADCURVE::Read( SEXPR::SEXPR* aEntry, CURVE_TYPE aCurveType )
return true; return true;
} }
std::string KICADCURVE::Describe() const
{
std::ostringstream desc;
switch( m_form )
{
case CURVE_LINE:
desc << "line start: " << m_start << " end: " << m_end;
break;
case CURVE_ARC:
desc << "arc center: " << m_start << " radius: " << m_radius
<< " angle: " << 180.0 * m_angle / M_PI;
break;
case CURVE_CIRCLE:
desc << "circle center: " << m_start << " radius: " << m_radius;
break;
default:
desc << "<invalid curve type>";
break;
}
return desc.str();
}

View File

@ -47,6 +47,9 @@ public:
return m_layer; return m_layer;
} }
///> Returns human-readable description of the curve.
std::string Describe() const;
CURVE_TYPE m_form; // form of curve: line, arc, circle CURVE_TYPE m_form; // form of curve: line, arc, circle
LAYERS m_layer; // layer of the glyph LAYERS m_layer; // layer of the glyph
DOUBLET m_start; // start point of line or center for arc and circle DOUBLET m_start; // start point of line or center for arc and circle

View File

@ -68,6 +68,8 @@
#include <TopoDS_Compound.hxx> #include <TopoDS_Compound.hxx>
#include <TopoDS_Builder.hxx> #include <TopoDS_Builder.hxx>
#include <Standard_Failure.hxx>
#include <gp_Ax2.hxx> #include <gp_Ax2.hxx>
#include <gp_Circ.hxx> #include <gp_Circ.hxx>
#include <gp_Dir.hxx> #include <gp_Dir.hxx>
@ -256,7 +258,7 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
#endif /* __WXDEBUG */ #endif /* __WXDEBUG */
ostr << " * rejected a zero-length line\n"; ostr << " * rejected a zero-length " << aCurve->Describe() << "\n";
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
return false; return false;
} }
@ -275,7 +277,7 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
#endif /* __WXDEBUG */ #endif /* __WXDEBUG */
ostr << " * rejected a zero-radius arc or circle\n"; ostr << " * rejected a zero-radius " << aCurve->Describe() << "\n";
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
return false; return false;
} }
@ -315,7 +317,8 @@ bool PCBMODEL::AddOutlineSegment( KICADCURVE* aCurve )
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
#endif /* __WXDEBUG */ #endif /* __WXDEBUG */
ostr << " * rejected an arc with equivalent end points\n"; ostr << " * rejected an arc with equivalent end points, "
<< aCurve->Describe() << "\n";
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
return false; return false;
} }
@ -748,6 +751,10 @@ bool PCBMODEL::CreatePCB()
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
#endif /* __WXDEBUG */ #endif /* __WXDEBUG */
ostr << " * could not close outline (dropping outline data with " << oln.m_curves.size() << " segments)\n"; ostr << " * could not close outline (dropping outline data with " << oln.m_curves.size() << " segments)\n";
for( const auto& c : oln.m_curves )
ostr << " + " << c.Describe() << "\n";
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
oln.Clear(); oln.Clear();
@ -1392,13 +1399,28 @@ bool OUTLINE::MakeShape( TopoDS_Shape& aShape, double aThickness )
for( auto i : m_curves ) for( auto i : m_curves )
{ {
if( !addEdge( &wire, i, lastPoint ) ) bool success = false;
try
{
success = addEdge( &wire, i, lastPoint );
}
catch( const Standard_Failure& e )
{
#ifdef __WXDEBUG__
wxLogMessage( "Exception caught: %s", e.GetMessageString() );
#endif /* __WXDEBUG */
success = false;
}
if( !success )
{ {
std::ostringstream ostr; std::ostringstream ostr;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
#endif /* __WXDEBUG */ #endif /* __WXDEBUG */
ostr << " * failed to add an edge\n"; ostr << " * failed to add an edge: " << i.Describe() << "\n";
ostr << " * last valid outline point: " << lastPoint << "\n";
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
return false; return false;
} }
@ -1437,7 +1459,6 @@ bool OUTLINE::addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBL
break; break;
case CURVE_ARC: case CURVE_ARC:
do
{ {
gp_Circ arc( gp_Ax2( gp_Pnt( aCurve.m_start.x, aCurve.m_start.y, 0.0 ), gp_Circ arc( gp_Ax2( gp_Pnt( aCurve.m_start.x, aCurve.m_start.y, 0.0 ),
gp_Dir( 0.0, 0.0, 1.0 ) ), aCurve.m_radius ); gp_Dir( 0.0, 0.0, 1.0 ) ), aCurve.m_radius );
@ -1449,8 +1470,7 @@ bool OUTLINE::addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBL
edge = BRepBuilderAPI_MakeEdge( arc, ea, sa ); edge = BRepBuilderAPI_MakeEdge( arc, ea, sa );
else else
edge = BRepBuilderAPI_MakeEdge( arc, sa, ea ); edge = BRepBuilderAPI_MakeEdge( arc, sa, ea );
}
} while( 0 );
break; break;
case CURVE_CIRCLE: case CURVE_CIRCLE:
@ -1459,7 +1479,6 @@ bool OUTLINE::addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBL
break; break;
default: default:
do
{ {
std::ostringstream ostr; std::ostringstream ostr;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
@ -1469,7 +1488,7 @@ bool OUTLINE::addEdge( BRepBuilderAPI_MakeWire* aWire, KICADCURVE& aCurve, DOUBL
wxLogMessage( "%s", ostr.str().c_str() ); wxLogMessage( "%s", ostr.str().c_str() );
return false; return false;
} while( 0 ); }
} }
if( edge.IsNull() ) if( edge.IsNull() )