kicad2step: scale models
Fixes: lp:1784257
* https://bugs.launchpad.net/kicad/+bug/1784257
(cherry picked from commit a0ed40876d
)
This commit is contained in:
parent
469c31da97
commit
5064df4ba2
|
@ -376,7 +376,7 @@ bool KICADMODULE::ComposePCB( class PCBMODEL* aPCB, S3D_RESOLVER* resolver,
|
||||||
wxString::FromUTF8Unchecked( i->m_modelname.c_str() ) ).ToUTF8() );
|
wxString::FromUTF8Unchecked( i->m_modelname.c_str() ) ).ToUTF8() );
|
||||||
|
|
||||||
if( aPCB->AddComponent( fname, m_refdes, LAYER_BOTTOM == m_side ? true : false,
|
if( aPCB->AddComponent( fname, m_refdes, LAYER_BOTTOM == m_side ? true : false,
|
||||||
newpos, m_rotation, i->m_offset, i->m_rotation ) )
|
newpos, m_rotation, i->m_offset, i->m_rotation, i->m_scale ) )
|
||||||
hasdata = true;
|
hasdata = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
#include <BRepBuilderAPI.hxx>
|
#include <BRepBuilderAPI.hxx>
|
||||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||||
#include <BRepBuilderAPI_Transform.hxx>
|
#include <BRepBuilderAPI_Transform.hxx>
|
||||||
|
#include <BRepBuilderAPI_GTransform.hxx>
|
||||||
#include <BRepBuilderAPI_MakeFace.hxx>
|
#include <BRepBuilderAPI_MakeFace.hxx>
|
||||||
#include <BRepPrimAPI_MakePrism.hxx>
|
#include <BRepPrimAPI_MakePrism.hxx>
|
||||||
#include <BRepPrimAPI_MakeCylinder.hxx>
|
#include <BRepPrimAPI_MakeCylinder.hxx>
|
||||||
|
@ -579,7 +580,7 @@ bool PCBMODEL::AddPadHole( KICADPAD* aPad )
|
||||||
// add a component at the given position and orientation
|
// add a component at the given position and orientation
|
||||||
bool PCBMODEL::AddComponent( const std::string& aFileName, const std::string& aRefDes,
|
bool PCBMODEL::AddComponent( const std::string& aFileName, const std::string& aRefDes,
|
||||||
bool aBottom, DOUBLET aPosition, double aRotation,
|
bool aBottom, DOUBLET aPosition, double aRotation,
|
||||||
TRIPLET aOffset, TRIPLET aOrientation )
|
TRIPLET aOffset, TRIPLET aOrientation, TRIPLET aScale )
|
||||||
{
|
{
|
||||||
if( aFileName.empty() )
|
if( aFileName.empty() )
|
||||||
{
|
{
|
||||||
|
@ -595,7 +596,7 @@ bool PCBMODEL::AddComponent( const std::string& aFileName, const std::string& aR
|
||||||
// first retrieve a label
|
// first retrieve a label
|
||||||
TDF_Label lmodel;
|
TDF_Label lmodel;
|
||||||
|
|
||||||
if( !getModelLabel( aFileName, lmodel ) )
|
if( !getModelLabel( aFileName, aScale, lmodel ) )
|
||||||
{
|
{
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
#ifdef __WXDEBUG__
|
#ifdef __WXDEBUG__
|
||||||
|
@ -908,9 +909,11 @@ bool PCBMODEL::WriteSTEP( const std::string& aFileName )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel )
|
bool PCBMODEL::getModelLabel( const std::string aFileName, TRIPLET aScale, TDF_Label& aLabel )
|
||||||
{
|
{
|
||||||
MODEL_MAP::const_iterator mm = m_models.find( aFileName );
|
std::string model_key = aFileName + "_" + std::to_string( aScale.x ) + "_" + std::to_string( aScale.y ) + "_" + std::to_string( aScale.z );
|
||||||
|
|
||||||
|
MODEL_MAP::const_iterator mm = m_models.find( model_key );
|
||||||
|
|
||||||
if( mm != m_models.end() )
|
if( mm != m_models.end() )
|
||||||
{
|
{
|
||||||
|
@ -1000,7 +1003,7 @@ bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel )
|
||||||
{
|
{
|
||||||
std::string altFileName = altFile.GetFullPath().ToStdString();
|
std::string altFileName = altFile.GetFullPath().ToStdString();
|
||||||
|
|
||||||
if( getModelLabel( altFileName, aLabel ) )
|
if( getModelLabel( altFileName, aScale, aLabel ) )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1016,7 +1019,7 @@ bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
aLabel = transferModel( doc, m_doc );
|
aLabel = transferModel( doc, m_doc, aScale );
|
||||||
|
|
||||||
if( aLabel.IsNull() )
|
if( aLabel.IsNull() )
|
||||||
{
|
{
|
||||||
|
@ -1036,7 +1039,7 @@ bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel )
|
||||||
TCollection_ExtendedString partname( pname.c_str() );
|
TCollection_ExtendedString partname( pname.c_str() );
|
||||||
TDataStd_Name::Set( aLabel, partname );
|
TDataStd_Name::Set( aLabel, partname );
|
||||||
|
|
||||||
m_models.insert( MODEL_DATUM( aFileName, aLabel ) );
|
m_models.insert( MODEL_DATUM( model_key, aLabel ) );
|
||||||
++m_components;
|
++m_components;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1176,10 +1179,17 @@ bool PCBMODEL::readSTEP( Handle(TDocStd_Document)& doc, const char* fname )
|
||||||
|
|
||||||
|
|
||||||
TDF_Label PCBMODEL::transferModel( Handle( TDocStd_Document )& source,
|
TDF_Label PCBMODEL::transferModel( Handle( TDocStd_Document )& source,
|
||||||
Handle( TDocStd_Document )& dest )
|
Handle( TDocStd_Document )& dest, TRIPLET aScale )
|
||||||
{
|
{
|
||||||
// transfer data from Source into a top level component of Dest
|
// transfer data from Source into a top level component of Dest
|
||||||
|
|
||||||
|
gp_GTrsf scale_transform;
|
||||||
|
scale_transform.SetVectorialPart( gp_Mat( aScale.x, 0, 0,
|
||||||
|
0, aScale.y, 0,
|
||||||
|
0, 0, aScale.z ) );
|
||||||
|
BRepBuilderAPI_GTransform brep( scale_transform );
|
||||||
|
|
||||||
|
|
||||||
// s_assy = shape tool for the source
|
// s_assy = shape tool for the source
|
||||||
Handle(XCAFDoc_ShapeTool) s_assy = XCAFDoc_DocumentTool::ShapeTool ( source->Main() );
|
Handle(XCAFDoc_ShapeTool) s_assy = XCAFDoc_DocumentTool::ShapeTool ( source->Main() );
|
||||||
|
|
||||||
|
@ -1206,7 +1216,22 @@ TDF_Label PCBMODEL::transferModel( Handle( TDocStd_Document )& source,
|
||||||
|
|
||||||
if ( !shape.IsNull() )
|
if ( !shape.IsNull() )
|
||||||
{
|
{
|
||||||
TDF_Label niulab = d_assy->AddComponent( component, shape, Standard_False );
|
brep.Perform( shape, Standard_False );
|
||||||
|
TopoDS_Shape scaled_shape;
|
||||||
|
|
||||||
|
if ( brep.IsDone() ) {
|
||||||
|
scaled_shape = brep.Shape();
|
||||||
|
} else {
|
||||||
|
std::ostringstream ostr;
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
|
||||||
|
#endif /* __WXDEBUG */
|
||||||
|
ostr << " * failed to scale model\n";
|
||||||
|
wxLogMessage( "%s", ostr.str().c_str() );
|
||||||
|
scaled_shape = shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
TDF_Label niulab = d_assy->AddComponent( component, scaled_shape, Standard_False );
|
||||||
|
|
||||||
// check for per-surface colors
|
// check for per-surface colors
|
||||||
stop.Init( shape, TopAbs_FACE );
|
stop.Init( shape, TopAbs_FACE );
|
||||||
|
|
|
@ -99,7 +99,7 @@ class PCBMODEL
|
||||||
std::list< KICADCURVE > m_curves;
|
std::list< KICADCURVE > m_curves;
|
||||||
std::vector< TopoDS_Shape > m_cutouts;
|
std::vector< TopoDS_Shape > m_cutouts;
|
||||||
|
|
||||||
bool getModelLabel( const std::string aFileName, TDF_Label& aLabel );
|
bool getModelLabel( const std::string aFileName, TRIPLET aScale, TDF_Label& aLabel );
|
||||||
|
|
||||||
bool getModelLocation( bool aBottom, DOUBLET aPosition, double aRotation,
|
bool getModelLocation( bool aBottom, DOUBLET aPosition, double aRotation,
|
||||||
TRIPLET aOffset, TRIPLET aOrientation, TopLoc_Location& aLocation );
|
TRIPLET aOffset, TRIPLET aOrientation, TopLoc_Location& aLocation );
|
||||||
|
@ -108,7 +108,7 @@ class PCBMODEL
|
||||||
bool readSTEP( Handle( TDocStd_Document )& m_doc, const char* fname );
|
bool readSTEP( Handle( TDocStd_Document )& m_doc, const char* fname );
|
||||||
|
|
||||||
TDF_Label transferModel( Handle( TDocStd_Document )& source,
|
TDF_Label transferModel( Handle( TDocStd_Document )& source,
|
||||||
Handle( TDocStd_Document )& dest );
|
Handle( TDocStd_Document )& dest, TRIPLET aScale );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PCBMODEL();
|
PCBMODEL();
|
||||||
|
@ -123,7 +123,7 @@ public:
|
||||||
// add a component at the given position and orientation
|
// add a component at the given position and orientation
|
||||||
bool AddComponent( const std::string& aFileName, const std::string& aRefDes,
|
bool AddComponent( const std::string& aFileName, const std::string& aRefDes,
|
||||||
bool aBottom, DOUBLET aPosition, double aRotation,
|
bool aBottom, DOUBLET aPosition, double aRotation,
|
||||||
TRIPLET aOffset, TRIPLET aOrientation );
|
TRIPLET aOffset, TRIPLET aOrientation, TRIPLET aScale );
|
||||||
|
|
||||||
// set the thickness of the PCB (mm); the top of the PCB shall be at Z = aThickness
|
// set the thickness of the PCB (mm); the top of the PCB shall be at Z = aThickness
|
||||||
// aThickness < 0.0 == use default thickness
|
// aThickness < 0.0 == use default thickness
|
||||||
|
|
Loading…
Reference in New Issue