From b0dddb6d95a80e052df84ea9050ecbf43c3c6dfd Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sat, 25 May 2024 22:03:59 +0100 Subject: [PATCH] Formatting. --- pcbnew/files.cpp | 43 +-- pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp | 438 ++++++++++++----------- pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.h | 30 +- 3 files changed, 256 insertions(+), 255 deletions(-) diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 9a0ef47f72..c377dadb02 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -1304,30 +1304,31 @@ void PCB_EDIT_FRAME::GenIPC2581File( wxCommandEvent& event ) props["dist"] = dlg.GetDist(); props["distpn"] = dlg.GetDistPN(); - auto saveFile = [&]() -> bool - { - try - { - IO_RELEASER pi( PCB_IO_MGR::PluginFind( PCB_IO_MGR::IPC2581 ) ); - pi->SetProgressReporter( &reporter ); - pi->SaveBoard( tempFile, GetBoard(), &props ); - return true; - } - catch( const IO_ERROR& ioe ) - { - DisplayError( this, wxString::Format( _( "Error generating IPC2581 file '%s'.\n%s" ), - pcbFileName.GetFullPath(), ioe.What() ) ); + auto saveFile = + [&]() -> bool + { + try + { + IO_RELEASER pi( PCB_IO_MGR::PluginFind( PCB_IO_MGR::IPC2581 ) ); + pi->SetProgressReporter( &reporter ); + pi->SaveBoard( tempFile, GetBoard(), &props ); + return true; + } + catch( const IO_ERROR& ioe ) + { + DisplayError( this, wxString::Format( _( "Error generating IPC2581 file '%s'.\n%s" ), + pcbFileName.GetFullPath(), ioe.What() ) ); - lowerTxt.Printf( _( "Failed to create temporary file '%s'." ), tempFile ); + lowerTxt.Printf( _( "Failed to create temporary file '%s'." ), tempFile ); - SetMsgPanel( upperTxt, lowerTxt ); + SetMsgPanel( upperTxt, lowerTxt ); - // In case we started a file but didn't fully write it, clean up - wxRemoveFile( tempFile ); + // In case we started a file but didn't fully write it, clean up + wxRemoveFile( tempFile ); - return false; - } - }; + return false; + } + }; thread_pool& tp = GetKiCadThreadPool(); auto ret = tp.submit( saveFile ); @@ -1346,7 +1347,7 @@ void PCB_EDIT_FRAME::GenIPC2581File( wxCommandEvent& event ) if( !ret.get() ) return; } - catch(const std::exception& e) + catch( const std::exception& e ) { wxLogError( "Exception in IPC2581 generation: %s", e.what() ); GetScreen()->SetContentModified( false ); diff --git a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp index 9bf30b2741..5d5705877d 100644 --- a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp +++ b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp @@ -602,7 +602,7 @@ void PCB_IO_IPC2581::addText( wxXmlNode* aContentNode, EDA_TEXT* aText, const KIFONT::METRICS& aFontMetrics ) { if( !aText->IsVisible() ) - return; + return; KIGFX::GAL_DISPLAY_OPTIONS empty_opts; KIFONT::FONT* font = aText->GetFont(); @@ -619,40 +619,41 @@ void PCB_IO_IPC2581::addText( wxXmlNode* aContentNode, EDA_TEXT* aText, std::list pts; - auto push_pts = [&]() - { - if( pts.size() < 2 ) - return; - - wxXmlNode* line_node = nullptr; - - // Polylines are only allowed for more than 3 points (in version B). - // Otherwise, we have to use a line - if( pts.size() < 3 ) - { - line_node = appendNode( text_node, "Line" ); - addXY( line_node, pts.front(), "startX", "startY" ); - addXY( line_node, pts.back(), "endX", "endY" ); - } - else - { - line_node = appendNode( text_node, "Polyline" ); - wxXmlNode* point_node = appendNode( line_node, "PolyBegin" ); - addXY( point_node, pts.front() ); - - auto iter = pts.begin(); - - for( ++iter; iter != pts.end(); ++iter ) + auto push_pts = + [&]() { - wxXmlNode* point_node = appendNode( line_node, "PolyStepSegment" ); - addXY( point_node, *iter ); - } + if( pts.size() < 2 ) + return; - } + wxXmlNode* line_node = nullptr; - addLineDesc( line_node, attrs.m_StrokeWidth, LINE_STYLE::SOLID ); - pts.clear(); - }; + // Polylines are only allowed for more than 3 points (in version B). + // Otherwise, we have to use a line + if( pts.size() < 3 ) + { + line_node = appendNode( text_node, "Line" ); + addXY( line_node, pts.front(), "startX", "startY" ); + addXY( line_node, pts.back(), "endX", "endY" ); + } + else + { + line_node = appendNode( text_node, "Polyline" ); + wxXmlNode* point_node = appendNode( line_node, "PolyBegin" ); + addXY( point_node, pts.front() ); + + auto iter = pts.begin(); + + for( ++iter; iter != pts.end(); ++iter ) + { + wxXmlNode* point_node = appendNode( line_node, "PolyStepSegment" ); + addXY( point_node, *iter ); + } + + } + + addLineDesc( line_node, attrs.m_StrokeWidth, LINE_STYLE::SOLID ); + pts.clear(); + }; CALLBACK_GAL callback_gal( empty_opts, // Stroke callback @@ -1949,7 +1950,7 @@ wxXmlNode* PCB_IO_IPC2581::addPackage( wxXmlNode* aContentNode, FOOTPRINT* aFp ) size_t hash = hash_fp_item( fp.get(), HASH_POS | REL_COORD ); wxString name = genString( wxString::Format( "%s_%zu", fp->GetFPID().GetLibItemName().wx_str(), - m_footprint_dict.size() + 1 ) ); + m_footprint_dict.size() + 1 ) ); auto [ iter, success ] = m_footprint_dict.emplace( hash, name ); addAttribute( aContentNode, "packageRef", iter->second ); @@ -2035,38 +2036,40 @@ wxXmlNode* PCB_IO_IPC2581::addPackage( wxXmlNode* aContentNode, FOOTPRINT* aFp ) elements[item->GetLayer()][is_abs].push_back( item ); } - auto add_base_node = [&]( PCB_LAYER_ID aLayer ) -> wxXmlNode* - { - wxXmlNode* parent = packageNode; - bool is_back = aLayer == B_SilkS || aLayer == B_Fab; + auto add_base_node = + [&]( PCB_LAYER_ID aLayer ) -> wxXmlNode* + { + wxXmlNode* parent = packageNode; + bool is_back = aLayer == B_SilkS || aLayer == B_Fab; - if( is_back ) - { - if( !otherSideViewNode ) - otherSideViewNode = new wxXmlNode( wxXML_ELEMENT_NODE, "OtherSideView" ); + if( is_back ) + { + if( !otherSideViewNode ) + otherSideViewNode = new wxXmlNode( wxXML_ELEMENT_NODE, "OtherSideView" ); - parent = otherSideViewNode; - } + parent = otherSideViewNode; + } - wxString name; + wxString name; - if( aLayer == F_SilkS || aLayer == B_SilkS ) - name = "SilkScreen"; - else if( aLayer == F_Fab || aLayer == B_Fab ) - name = "AssemblyDrawing"; - else - wxASSERT( false ); + if( aLayer == F_SilkS || aLayer == B_SilkS ) + name = "SilkScreen"; + else if( aLayer == F_Fab || aLayer == B_Fab ) + name = "AssemblyDrawing"; + else + wxASSERT( false ); - wxXmlNode* new_node = appendNode( parent, name ); - return new_node; - }; + wxXmlNode* new_node = appendNode( parent, name ); + return new_node; + }; - auto add_marking_node = [&]( wxXmlNode* aNode ) -> wxXmlNode* - { - wxXmlNode* marking_node = appendNode( aNode, "Marking" ); - addAttribute( marking_node, "markingUsage", "NONE" ); - return marking_node; - }; + auto add_marking_node = + [&]( wxXmlNode* aNode ) -> wxXmlNode* + { + wxXmlNode* marking_node = appendNode( aNode, "Marking" ); + addAttribute( marking_node, "markingUsage", "NONE" ); + return marking_node; + }; std::map layer_nodes; std::map layer_bbox; @@ -2554,189 +2557,194 @@ void PCB_IO_IPC2581::generateLayerSetNet( wxXmlNode* aLayerNode, PCB_LAYER_ID aL addAttribute( layerSetNode, "net", genString( item->GetNetname(), "NET" ) ); } - auto add_track = [&]( PCB_TRACK* track ) - { - if( track->Type() == PCB_TRACE_T ) - { - PCB_SHAPE shape( nullptr, SHAPE_T::SEGMENT ); - shape.SetStart( track->GetStart() ); - shape.SetEnd( track->GetEnd() ); - shape.SetWidth( track->GetWidth() ); - addShape( specialNode, shape ); - } - else if( track->Type() == PCB_ARC_T ) - { - PCB_ARC* arc = static_cast( track ); - PCB_SHAPE shape( nullptr, SHAPE_T::ARC ); - shape.SetArcGeometry( arc->GetStart(), arc->GetMid(), arc->GetEnd() ); - shape.SetWidth( arc->GetWidth() ); - addShape( specialNode, shape ); - } - else - { - if( !viaSetNode ) + auto add_track = + [&]( PCB_TRACK* track ) { - if( !has_pad ) + if( track->Type() == PCB_TRACE_T ) { - viaSetNode = layerSetNode; - has_via = true; + PCB_SHAPE shape( nullptr, SHAPE_T::SEGMENT ); + shape.SetStart( track->GetStart() ); + shape.SetEnd( track->GetEnd() ); + shape.SetWidth( track->GetWidth() ); + addShape( specialNode, shape ); + } + else if( track->Type() == PCB_ARC_T ) + { + PCB_ARC* arc = static_cast( track ); + PCB_SHAPE shape( nullptr, SHAPE_T::ARC ); + shape.SetArcGeometry( arc->GetStart(), arc->GetMid(), arc->GetEnd() ); + shape.SetWidth( arc->GetWidth() ); + addShape( specialNode, shape ); } else { - viaSetNode = appendNode( layerSetNode, "Set" ); + if( !viaSetNode ) + { + if( !has_pad ) + { + viaSetNode = layerSetNode; + has_via = true; + } + else + { + viaSetNode = appendNode( layerSetNode, "Set" ); - if( track->GetNetCode() > 0 ) - addAttribute( viaSetNode, "net", genString( track->GetNetname(), "NET" ) ); + if( track->GetNetCode() > 0 ) + addAttribute( viaSetNode, "net", genString( track->GetNetname(), "NET" ) ); + } + + addAttribute( viaSetNode, "padUsage", "VIA" ); + } + + addVia( viaSetNode, static_cast( track ), aLayer ); + } + }; + + auto add_zone = + [&]( ZONE* zone ) + { + wxXmlNode* zoneFeatureNode = specialNode; + + if( zone->IsTeardropArea() && m_version > 'B' ) + { + if( !teardropFeatureSetNode ) + { + teardropLayerSetNode = appendNode( aLayerNode, "Set" ); + addAttribute( teardropLayerSetNode, "geometryUsage", "TEARDROP" ); + + if( zone->GetNetCode() > 0 ) + addAttribute( teardropLayerSetNode, "net", + genString( zone->GetNetname(), "NET" ) ); + + wxXmlNode* new_teardrops = appendNode( teardropLayerSetNode, "Features" ); + addLocationNode( new_teardrops, 0.0, 0.0 ); + teardropFeatureSetNode = appendNode( new_teardrops, "UserSpecial" ); + } + + zoneFeatureNode = teardropFeatureSetNode; + } + else + { + if( FOOTPRINT* fp = zone->GetParentFootprint() ) + { + wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); + wxString refDes = componentName( zone->GetParentFootprint() ); + addAttribute( tempSetNode, "componentRef", refDes ); + wxXmlNode* newFeatures = appendNode( tempSetNode, "Features" ); + addLocationNode( newFeatures, 0.0, 0.0 ); + zoneFeatureNode = appendNode( newFeatures, "UserSpecial" ); + } } - addAttribute( viaSetNode, "padUsage", "VIA" ); - } + SHAPE_POLY_SET& zone_shape = *zone->GetFilledPolysList( aLayer ); - addVia( viaSetNode, static_cast( track ), aLayer ); - } - }; + for( int ii = 0; ii < zone_shape.OutlineCount(); ++ii ) + addContourNode( zoneFeatureNode, zone_shape, ii ); + }; - auto add_zone = [&]( ZONE* zone ) - { - wxXmlNode* zoneFeatureNode = specialNode; - - if( zone->IsTeardropArea() && m_version > 'B' ) - { - if( !teardropFeatureSetNode ) + auto add_shape = + [&] ( PCB_SHAPE* shape ) { - teardropLayerSetNode = appendNode( aLayerNode, "Set" ); - addAttribute( teardropLayerSetNode, "geometryUsage", "TEARDROP" ); + FOOTPRINT* fp = shape->GetParentFootprint(); - if( zone->GetNetCode() > 0 ) - addAttribute( teardropLayerSetNode, "net", - genString( zone->GetNetname(), "NET" ) ); + if( fp ) + { + wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); - wxXmlNode* new_teardrops = appendNode( teardropLayerSetNode, "Features" ); - addLocationNode( new_teardrops, 0.0, 0.0 ); - teardropFeatureSetNode = appendNode( new_teardrops, "UserSpecial" ); - } + if( m_version > 'B' ) + addAttribute( tempSetNode, "geometryUsage", "GRAPHIC" ); - zoneFeatureNode = teardropFeatureSetNode; - } - else - { - if( FOOTPRINT* fp = zone->GetParentFootprint() ) + addAttribute( tempSetNode, "componentRef", componentName( fp ) ); + + wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); + addLocationNode( tempFeature, *shape ); + + addShape( tempFeature, *shape ); + } + else if( shape->GetShape() == SHAPE_T::CIRCLE || shape->GetShape() == SHAPE_T::RECTANGLE + || shape->GetShape() == SHAPE_T::POLY ) + { + wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); + + if( shape->GetNetCode() > 0 ) + addAttribute( tempSetNode, "net", genString( shape->GetNetname(), "NET" ) ); + + wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); + addLocationNode( tempFeature, *shape ); + addShape( tempFeature, *shape ); + } + else + { + addShape( specialNode, *shape ); + } + }; + + auto add_text = + [&] ( BOARD_ITEM* text ) { + EDA_TEXT* text_item; + FOOTPRINT* fp = text->GetParentFootprint(); + + if( PCB_TEXT* tmp_text = dynamic_cast( text ) ) + text_item = static_cast( tmp_text ); + else if( PCB_TEXTBOX* tmp_text = dynamic_cast( text ) ) + text_item = static_cast( tmp_text ); + + if( !text_item->IsVisible() || text_item->GetShownText( false ).empty() ) + return; + wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); - wxString refDes = componentName( zone->GetParentFootprint() ); - addAttribute( tempSetNode, "componentRef", refDes ); - wxXmlNode* newFeatures = appendNode( tempSetNode, "Features" ); - addLocationNode( newFeatures, 0.0, 0.0 ); - zoneFeatureNode = appendNode( newFeatures, "UserSpecial" ); - } - } - SHAPE_POLY_SET& zone_shape = *zone->GetFilledPolysList( aLayer ); + if( m_version > 'B' ) + addAttribute( tempSetNode, "geometryUsage", "TEXT" ); - for( int ii = 0; ii < zone_shape.OutlineCount(); ++ii ) - addContourNode( zoneFeatureNode, zone_shape, ii ); - }; + if( fp ) + addAttribute( tempSetNode, "componentRef", componentName( fp ) ); - auto add_shape = [&] ( PCB_SHAPE* shape ) - { - FOOTPRINT* fp = shape->GetParentFootprint(); + wxXmlNode* nonStandardAttributeNode = appendNode( tempSetNode, "NonstandardAttribute" ); + addAttribute( nonStandardAttributeNode, "name", "TEXT" ); + addAttribute( nonStandardAttributeNode, "value", text_item->GetShownText( false ) ); + addAttribute( nonStandardAttributeNode, "type", "STRING" ); - if( fp ) - { - wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); + wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); + addLocationNode( tempFeature, 0.0, 0.0 ); + addText( tempFeature, text_item, text->GetFontMetrics() ); - if( m_version > 'B' ) - addAttribute( tempSetNode, "geometryUsage", "GRAPHIC" ); + if( text->Type() == PCB_TEXTBOX_T ) + { + PCB_TEXTBOX* textbox = static_cast( text ); - addAttribute( tempSetNode, "componentRef", componentName( fp ) ); + if( textbox->IsBorderEnabled() ) + addShape( tempFeature, *static_cast( textbox ) ); + } + }; - wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); - addLocationNode( tempFeature, *shape ); - - addShape( tempFeature, *shape ); - } - else if( shape->GetShape() == SHAPE_T::CIRCLE || shape->GetShape() == SHAPE_T::RECTANGLE - || shape->GetShape() == SHAPE_T::POLY ) - { - wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); - - if( shape->GetNetCode() > 0 ) - addAttribute( tempSetNode, "net", genString( shape->GetNetname(), "NET" ) ); - - wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); - addLocationNode( tempFeature, *shape ); - addShape( tempFeature, *shape ); - } - else - { - addShape( specialNode, *shape ); - } - }; - - auto add_text = [&] ( BOARD_ITEM* text ) - { - EDA_TEXT* text_item; - FOOTPRINT* fp = text->GetParentFootprint(); - - if( PCB_TEXT* tmp_text = dynamic_cast( text ) ) - text_item = static_cast( tmp_text ); - else if( PCB_TEXTBOX* tmp_text = dynamic_cast( text ) ) - text_item = static_cast( tmp_text ); - - if( !text_item->IsVisible() || text_item->GetShownText( false ).empty() ) - return; - - wxXmlNode* tempSetNode = appendNode( aLayerNode, "Set" ); - - if( m_version > 'B' ) - addAttribute( tempSetNode, "geometryUsage", "TEXT" ); - - if( fp ) - addAttribute( tempSetNode, "componentRef", componentName( fp ) ); - - wxXmlNode* nonStandardAttributeNode = appendNode( tempSetNode, "NonstandardAttribute" ); - addAttribute( nonStandardAttributeNode, "name", "TEXT" ); - addAttribute( nonStandardAttributeNode, "value", text_item->GetShownText( false ) ); - addAttribute( nonStandardAttributeNode, "type", "STRING" ); - - wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); - addLocationNode( tempFeature, 0.0, 0.0 ); - addText( tempFeature, text_item, text->GetFontMetrics() ); - - if( text->Type() == PCB_TEXTBOX_T ) - { - PCB_TEXTBOX* textbox = static_cast( text ); - - if( textbox->IsBorderEnabled() ) - addShape( tempFeature, *static_cast( textbox ) ); - } - }; - - auto add_pad = [&]( PAD* pad ) - { - if( !padSetNode ) - { - if( !has_via ) + auto add_pad = + [&]( PAD* pad ) { - padSetNode = layerSetNode; - has_pad = true; - } - else - { - padSetNode = appendNode( aLayerNode, "Set" ); + if( !padSetNode ) + { + if( !has_via ) + { + padSetNode = layerSetNode; + has_pad = true; + } + else + { + padSetNode = appendNode( aLayerNode, "Set" ); - if( pad->GetNetCode() > 0 ) - addAttribute( padSetNode, "net", genString( pad->GetNetname(), "NET" ) ); - } - } + if( pad->GetNetCode() > 0 ) + addAttribute( padSetNode, "net", genString( pad->GetNetname(), "NET" ) ); + } + } - FOOTPRINT* fp = pad->GetParentFootprint(); + FOOTPRINT* fp = pad->GetParentFootprint(); - if( fp && fp->IsFlipped() ) - addPad( padSetNode, pad, FlipLayer( aLayer ) ); - else - addPad( padSetNode, pad, aLayer ); - }; + if( fp && fp->IsFlipped() ) + addPad( padSetNode, pad, FlipLayer( aLayer ) ); + else + addPad( padSetNode, pad, aLayer ); + }; for( BOARD_ITEM* item : aItems ) { diff --git a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.h b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.h index 16ed525b17..51ea3591db 100644 --- a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.h +++ b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.h @@ -49,10 +49,6 @@ class SHAPE_SEGMENT; class PCB_IO_IPC2581 : public PCB_IO { public: - /** - * @brief PCB_IO_IPC2581 - * - */ PCB_IO_IPC2581() : PCB_IO( wxS( "IPC-2581" ) ) { m_total_bytes = 0; @@ -73,14 +69,12 @@ public: ~PCB_IO_IPC2581() override; - /** - * - */ // BOARD* LoadBoard( const wxString& aFileName, BOARD* aAppendToMe, - // const STRING_UTF8_MAP* aProperties = nullptr, PROJECT* aProject = nullptr ) override; + // const STRING_UTF8_MAP* aProperties = nullptr, + // PROJECT* aProject = nullptr ) override; void SaveBoard( const wxString& aFileName, BOARD* aBoard, - const STRING_UTF8_MAP* aProperties = nullptr ) override; + const STRING_UTF8_MAP* aProperties = nullptr ) override; const IO_BASE::IO_FILE_DESC GetBoardFileDesc() const override { @@ -123,52 +117,50 @@ private: /** * Frees the memory allocated for the loaded footprints in #m_loaded_footprints. - * - */ + */ void clearLoadedFootprints(); /** * Creates the XML header for IPC-2581 - * - */ + */ wxXmlNode* generateXmlHeader(); /** * Creates the Content section of the XML file. This holds the overview of * the rest of the board data. Includes references to the step, bom, and layers * as well as the content dictionaries - */ + */ wxXmlNode* generateContentSection(); /** * Creates the logistical data header. This section defines the organization and person * creating the file. Can be used for contact information and config management - */ + */ wxXmlNode* generateLogisticSection(); /** * Creates the history section. This section defines the history of the file, the revision * number, and the date of the revision as well as software used to create the file. Optionally, * the data could include information about the git revision and tag - */ + */ wxXmlNode* generateHistorySection(); /** * Creates the BOM section. This section defines the BOM data for the board. This includes * the part number, manufacturer, and distributor information for each component on the board. - */ + */ wxXmlNode* generateBOMSection( wxXmlNode* aEcadNode ); /** * Creates the ECAD section. This describes the layout, layers, and design as well as * component placement and netlist information - */ + */ wxXmlNode* generateEcadSection(); /** * Creates the Approved Vendor List section. If the user chooses, this will associate * BOM items with vendor numbers and names. - */ + */ wxXmlNode* generateAvlSection(); void generateCadLayers( wxXmlNode* aCadLayerNode );