diff --git a/pcbnew/exporters/step/exporter_step.cpp b/pcbnew/exporters/step/exporter_step.cpp index 2d8e904728..0c8c0b0ddc 100644 --- a/pcbnew/exporters/step/exporter_step.cpp +++ b/pcbnew/exporters/step/exporter_step.cpp @@ -164,7 +164,7 @@ bool EXPORTER_STEP::composePCB( FOOTPRINT* aFootprint, VECTOR2D aOrigin ) // Dump the pad holes into the PCB for( PAD* pad : aFootprint->Pads() ) { - if( m_pcbModel->AddPadHole( pad ) ) + if( m_pcbModel->AddPadHole( pad, aOrigin ) ) hasdata = true; } @@ -266,7 +266,7 @@ bool EXPORTER_STEP::composePCB() ReportMessage( wxT( "Create PCB solid model\n" ) ); - if( !m_pcbModel->CreatePCB( pcbOutlines ) ) + if( !m_pcbModel->CreatePCB( pcbOutlines, origin ) ) { ReportMessage( wxT( "could not create PCB solid model\n" ) ); return false; diff --git a/pcbnew/exporters/step/step_pcb_model.cpp b/pcbnew/exporters/step/step_pcb_model.cpp index 4665132811..24fcb09785 100644 --- a/pcbnew/exporters/step/step_pcb_model.cpp +++ b/pcbnew/exporters/step/step_pcb_model.cpp @@ -208,7 +208,7 @@ STEP_PCB_MODEL::~STEP_PCB_MODEL() } -bool STEP_PCB_MODEL::AddPadHole( const PAD* aPad ) +bool STEP_PCB_MODEL::AddPadHole( const PAD* aPad, const VECTOR2D& aOrigin ) { if( NULL == aPad || !aPad->GetDrillSize().x ) return false; @@ -220,8 +220,9 @@ bool STEP_PCB_MODEL::AddPadHole( const PAD* aPad ) TopoDS_Shape s = BRepPrimAPI_MakeCylinder( pcbIUScale.IUTomm( aPad->GetDrillSize().x ) * 0.5, m_thickness * 2.0 ).Shape(); gp_Trsf shift; - shift.SetTranslation( gp_Vec( pcbIUScale.IUTomm( pos.x ), -pcbIUScale.IUTomm( pos.y ), - -m_thickness * 0.5 ) ); + shift.SetTranslation( gp_Vec( pcbIUScale.IUTomm( pos.x - aOrigin.x ), + -pcbIUScale.IUTomm( pos.y - aOrigin.y ), + -m_thickness * 0.5 ) ); BRepBuilderAPI_Transform hole( s, shift ); m_cutouts.push_back( hole.Shape() ); return true; @@ -238,7 +239,7 @@ bool STEP_PCB_MODEL::AddPadHole( const PAD* aPad ) if( holeOutlines.OutlineCount() > 0 ) { - if( MakeShape( hole, holeOutlines.COutline( 0 ), m_thickness ) ) + if( MakeShape( hole, holeOutlines.COutline( 0 ), m_thickness, aOrigin ) ) { m_cutouts.push_back( hole ); } @@ -337,7 +338,8 @@ void STEP_PCB_MODEL::SetMinDistance( double aDistance ) } -bool STEP_PCB_MODEL::MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& aChain, double aThickness ) +bool STEP_PCB_MODEL::MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& aChain, + double aThickness, const VECTOR2D& aOrigin ) { if( !aShape.IsNull() ) return false; // there is already data in the shape object @@ -351,16 +353,19 @@ bool STEP_PCB_MODEL::MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& aC for( int j = 0; j < aChain.PointCount(); j++ ) { - gp_Pnt start = gp_Pnt( pcbIUScale.IUTomm(aChain.CPoint( j ).x ), -pcbIUScale.IUTomm( aChain.CPoint( j ).y ), 0.0 ); + gp_Pnt start = gp_Pnt( pcbIUScale.IUTomm( aChain.CPoint( j ).x - aOrigin.x ), + -pcbIUScale.IUTomm( aChain.CPoint( j ).y - aOrigin.y ), 0.0 ); gp_Pnt end; if( j >= aChain.PointCount() ) { - end = gp_Pnt( pcbIUScale.IUTomm(aChain.CPoint( 0 ).x), -pcbIUScale.IUTomm(aChain.CPoint( 0 ).y ), 0.0 ); + end = gp_Pnt( pcbIUScale.IUTomm( aChain.CPoint( 0 ).x - aOrigin.x ), + -pcbIUScale.IUTomm( aChain.CPoint( 0 ).y - aOrigin.y ), 0.0 ); } else { - end = gp_Pnt( pcbIUScale.IUTomm(aChain.CPoint( j + 1 ).x), -pcbIUScale.IUTomm(aChain.CPoint( j + 1 ).y ), 0.0 ); + end = gp_Pnt( pcbIUScale.IUTomm( aChain.CPoint( j + 1 ).x - aOrigin.x ), + -pcbIUScale.IUTomm( aChain.CPoint( j + 1 ).y - aOrigin.y ), 0.0 ); } try @@ -403,7 +408,7 @@ bool STEP_PCB_MODEL::MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& aC } -bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline ) +bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin ) { if( m_hasPCB ) { @@ -420,7 +425,7 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline ) { const SHAPE_LINE_CHAIN& outline = aOutline.COutline( cnt ); - if( !MakeShape( board, outline, m_thickness ) ) + if( !MakeShape( board, outline, m_thickness, aOrigin ) ) { // error } @@ -431,7 +436,7 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline ) const SHAPE_LINE_CHAIN& holeOutline = aOutline.Hole( cnt, ii ); TopoDS_Shape hole; - if( MakeShape( hole, holeOutline, m_thickness ) ) + if( MakeShape( hole, holeOutline, m_thickness, aOrigin ) ) { m_cutouts.push_back( hole ); } diff --git a/pcbnew/exporters/step/step_pcb_model.h b/pcbnew/exporters/step/step_pcb_model.h index 8928c311e7..af46ad164a 100644 --- a/pcbnew/exporters/step/step_pcb_model.h +++ b/pcbnew/exporters/step/step_pcb_model.h @@ -60,7 +60,7 @@ public: virtual ~STEP_PCB_MODEL(); // add a pad hole or slot (must be in final position) - bool AddPadHole( const PAD* aPad ); + bool AddPadHole( const PAD* aPad, const VECTOR2D& aOrigin ); // add a component at the given position and orientation bool AddComponent( const std::string& aFileName, const std::string& aRefDes, bool aBottom, @@ -81,9 +81,10 @@ public: void SetMaxError( int aMaxError ) { m_maxError = aMaxError; } // create the PCB model using the current outlines and drill holes - bool CreatePCB( SHAPE_POLY_SET& aOutline ); + bool CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin ); - bool MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& chain, double aThickness ); + bool MakeShape( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& chain, double aThickness, + const VECTOR2D& aOrigin ); #ifdef SUPPORTS_IGES // write the assembly model in IGES format