From ff9c4c56faed733eb6bd867e5ddc143fb243a926 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Wed, 29 Nov 2023 17:31:38 -0800 Subject: [PATCH] Clean 2581 output Remove negative floating point outputs Disambiguate reference ids between dictionaries Fixes https://gitlab.com/kicad/code/kicad/-/issues/16211 --- pcbnew/plugins/ipc2581/ipc2581_plugin.cpp | 36 +++++++++-------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/pcbnew/plugins/ipc2581/ipc2581_plugin.cpp b/pcbnew/plugins/ipc2581/ipc2581_plugin.cpp index f0682a01ce..ccc41f8fbc 100644 --- a/pcbnew/plugins/ipc2581/ipc2581_plugin.cpp +++ b/pcbnew/plugins/ipc2581/ipc2581_plugin.cpp @@ -168,6 +168,9 @@ wxString IPC2581_PLUGIN::genString( const wxString& aStr, const char* aPrefix ) } else { + if( aPrefix ) + str = wxString::Format( "%s_", aPrefix ); + for( wxString::const_iterator iter = aStr.begin(); iter != aStr.end(); ++iter ) { if( !m_acceptable_chars.count( *iter ) ) @@ -183,16 +186,16 @@ wxString IPC2581_PLUGIN::genString( const wxString& aStr, const char* aPrefix ) wxString IPC2581_PLUGIN::floatVal( double aVal ) { - // We don't want to output -0.0 as this value is just 0 for fabs - if( aVal == -0.0 ) - aVal = 0.0; - wxString str = wxString::FromCDouble( aVal, m_sigfig ); // Remove all but the last trailing zeros from str while( str.EndsWith( wxT( "00" ) ) ) str.RemoveLast(); + // We don't want to output -0.0 as this value is just 0 for fabs + if( str == wxT( "-0.0" ) ) + return wxT( "0.0" ); + return str; } @@ -834,7 +837,7 @@ void IPC2581_PLUGIN::addShape( wxXmlNode* aContentNode, const PCB_SHAPE& aShape { case SHAPE_T::CIRCLE: { - name = wxString::Format( "CIRCLE_%zu", m_user_shape_dict.size() + 1 ); + name = wxString::Format( "UCIRCLE_%zu", m_user_shape_dict.size() + 1 ); m_user_shape_dict.emplace( hash, name ); int diameter = aShape.GetRadius() * 2.0; int width = aShape.GetStroke().GetWidth(); @@ -865,7 +868,7 @@ void IPC2581_PLUGIN::addShape( wxXmlNode* aContentNode, const PCB_SHAPE& aShape case SHAPE_T::RECTANGLE: { - name = wxString::Format( "RECT_%zu", m_user_shape_dict.size() + 1 ); + name = wxString::Format( "URECT_%zu", m_user_shape_dict.size() + 1 ); m_user_shape_dict.emplace( hash, name ); wxXmlNode* entry_node = appendNode( m_shape_user_node, "EntryUser" ); @@ -908,7 +911,7 @@ void IPC2581_PLUGIN::addShape( wxXmlNode* aContentNode, const PCB_SHAPE& aShape case SHAPE_T::POLY: { - name = wxString::Format( "POLY_%zu", m_user_shape_dict.size() + 1 ); + name = wxString::Format( "UPOLY_%zu", m_user_shape_dict.size() + 1 ); m_user_shape_dict.emplace( hash, name ); wxXmlNode* entry_node = appendNode( m_shape_user_node, "EntryUser" ); @@ -2003,7 +2006,7 @@ wxXmlNode* IPC2581_PLUGIN::addPackage( wxXmlNode* aContentNode, FOOTPRINT* aFp ) case PCB_SHAPE_T: { if( !is_abs ) - addLocationNode( output_node, static_cast( item ) ); + addLocationNode( output_node, *static_cast( item ) ); addShape( output_node, *static_cast( item ) ); @@ -2134,7 +2137,7 @@ void IPC2581_PLUGIN::generateComponents( wxXmlNode* aStepNode ) if( !m_OEMRef_dict.emplace( fp, name ).second ) wxLogError( "Duplicate footprint pointers. Please report this bug." ); - addAttribute( componentNode, "part", name ); + addAttribute( componentNode, "part", genString( name, "REF" ) ); addAttribute( componentNode, "layerRef", m_layer_name_map[fp->GetLayer()] ); if( fp->GetAttributes() & FP_THROUGH_HOLE ) @@ -2241,17 +2244,8 @@ void IPC2581_PLUGIN::generateLayerFeatures( wxXmlNode* aStepNode ) elements[item->GetLayer()][0].push_back( item ); } - for( FOOTPRINT* it_fp : m_board->Footprints() ) + for( FOOTPRINT* fp : m_board->Footprints() ) { - std::unique_ptr fp( static_cast( it_fp->Clone() ) ); - fp->SetParentGroup( nullptr ); - fp->SetPosition( { 0, 0 } ); - - if( fp->GetLayer() != F_Cu ) - fp->Flip( fp->GetPosition(), false ); - - fp->SetOrientation( EDA_ANGLE::m_Angle0 ); - for( PCB_FIELD* field : fp->GetFields() ) elements[field->GetLayer()][0].push_back( field ); @@ -2271,8 +2265,6 @@ void IPC2581_PLUGIN::generateLayerFeatures( wxXmlNode* aStepNode ) elements[layer][pad->GetNetCode()].push_back( pad ); } } - - footprints.push_back( std::move( fp ) ); } for( PCB_LAYER_ID layer : layers ) @@ -2696,7 +2688,7 @@ wxXmlNode* IPC2581_PLUGIN::generateAvlSection() continue; wxXmlNode* part = appendNode( avl, "AvlItem" ); - addAttribute( part, "OEMDesignNumber", genString( name ) ); + addAttribute( part, "OEMDesignNumber", genString( name, "REF" ) ); PCB_FIELD* nums[2] = { fp->GetFieldByName( m_mpn ), fp->GetFieldByName( m_distpn ) }; PCB_FIELD* company[2] = { fp->GetFieldByName( m_mfg ), nullptr };