From 35b79c2ec9bfb52978dae1dbacf0e6dbde14d823 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Fri, 27 May 2022 10:08:27 -0700 Subject: [PATCH] Make PCAD import case-insensitive According to the PCAD specification, all tags are case insensitive. Most exporters honor the defaults but there is always an outlier or two Fixes https://gitlab.com/kicad/code/kicad/issues/11652 --- pcbnew/plugins/pcad/pcad2kicad_common.cpp | 30 ++++++------- pcbnew/plugins/pcad/pcb.cpp | 52 ++++++++++------------- pcbnew/plugins/pcad/pcb_pad.cpp | 18 ++++---- pcbnew/plugins/pcad/pcb_text.cpp | 2 +- 4 files changed, 47 insertions(+), 55 deletions(-) diff --git a/pcbnew/plugins/pcad/pcad2kicad_common.cpp b/pcbnew/plugins/pcad/pcad2kicad_common.cpp index c0ca044a89..38491e1432 100644 --- a/pcbnew/plugins/pcad/pcad2kicad_common.cpp +++ b/pcbnew/plugins/pcad/pcad2kicad_common.cpp @@ -304,21 +304,21 @@ TTEXT_JUSTIFY GetJustifyIdentificator( const wxString& aJustify ) { TTEXT_JUSTIFY id; - if( aJustify == wxT( "LowerCenter" ) ) + if( aJustify.IsSameAs( wxT( "LowerCenter" ), false ) ) id = LowerCenter; - else if( aJustify == wxT( "LowerRight" ) ) + else if( aJustify.IsSameAs( wxT( "LowerRight" ), false ) ) id = LowerRight; - else if( aJustify == wxT( "UpperLeft" ) ) + else if( aJustify.IsSameAs( wxT( "UpperLeft" ), false ) ) id = UpperLeft; - else if( aJustify == wxT( "UpperCenter" ) ) + else if( aJustify.IsSameAs( wxT( "UpperCenter" ), false ) ) id = UpperCenter; - else if( aJustify == wxT( "UpperRight" ) ) + else if( aJustify.IsSameAs( wxT( "UpperRight" ), false ) ) id = UpperRight; - else if( aJustify == wxT( "Left" ) ) + else if( aJustify.IsSameAs( wxT( "Left" ), false ) ) id = Left; - else if( aJustify == wxT( "Center" ) ) + else if( aJustify.IsSameAs( wxT( "Center" ), false ) ) id = Center; - else if( aJustify == wxT( "Right" ) ) + else if( aJustify.IsSameAs( wxT( "Right" ), false ) ) id = Right; else id = LowerLeft; @@ -354,7 +354,7 @@ void SetTextParameters( XNODE* aNode, TTEXTVALUE* aTextValue, str = FindNodeGetContent( aNode, wxT( "isVisible" ) ); - if( str == wxT( "True" ) ) + if( str.IsSameAs( wxT( "True" ), false ) ) aTextValue->textIsVisible = 1; else aTextValue->textIsVisible = 0; @@ -364,7 +364,7 @@ void SetTextParameters( XNODE* aNode, TTEXTVALUE* aTextValue, str = FindNodeGetContent( aNode, wxT( "isFlipped" ) ); - if( str == wxT( "True" ) ) + if( str.IsSameAs( wxT( "True" ), false ) ) aTextValue->mirror = 1; else aTextValue->mirror = 0; @@ -408,13 +408,13 @@ void SetFontProperty( XNODE* aNode, TTEXTVALUE* aTextValue, const wxString& aDef wxString fontType; propValue = FindNodeGetContent( aNode, wxT( "textStyleDisplayTType" ) ); - aTextValue->isTrueType = ( propValue == wxT( "True" ) ); + aTextValue->isTrueType = ( propValue.IsSameAs( wxT( "True" ), false ) ); aNode = FindNode( aNode, wxT( "font" ) ); fontType = FindNodeGetContent( aNode, wxT( "fontType" ) ); - if( ( aTextValue->isTrueType && ( fontType != wxT( "TrueType" ) ) ) || - ( !aTextValue->isTrueType && ( fontType != wxT( "Stroke" ) ) ) ) + if( ( aTextValue->isTrueType && !fontType.IsSameAs( wxT( "TrueType" ), false ) ) || + ( !aTextValue->isTrueType && !fontType.IsSameAs( wxT( "Stroke" ), false ) ) ) aNode = aNode->GetNext(); if( aNode ) @@ -422,7 +422,7 @@ void SetFontProperty( XNODE* aNode, TTEXTVALUE* aTextValue, const wxString& aDef if( aTextValue->isTrueType ) { propValue = FindNodeGetContent( aNode, wxT( "fontItalic" ) ); - aTextValue->isItalic = ( propValue == wxT( "True" ) ); + aTextValue->isItalic = propValue.IsSameAs( wxT( "True" ), false ); propValue = FindNodeGetContent( aNode, wxT( "fontWeight" ) ); @@ -562,7 +562,7 @@ XNODE* FindNode( XNODE* aChild, const wxString& aTag ) while( aChild ) { - if( aChild->GetName() == aTag ) + if( aChild->GetName().IsSameAs( aTag, false ) ) return aChild; aChild = aChild->GetNext(); diff --git a/pcbnew/plugins/pcad/pcb.cpp b/pcbnew/plugins/pcad/pcb.cpp index 6127198bb9..2f7c296a2b 100644 --- a/pcbnew/plugins/pcad/pcb.cpp +++ b/pcbnew/plugins/pcad/pcb.cpp @@ -147,7 +147,7 @@ XNODE* PCB::FindCompDefName( XNODE* aNode, const wxString& aName ) const while( lNode ) { - if( lNode->GetName() == wxT( "compDef" ) ) + if( lNode->GetName().IsSameAs( wxT( "compDef" ), false ) ) { lNode->GetAttribute( wxT( "Name" ), &propValue ); @@ -189,7 +189,7 @@ void PCB::SetTextProperty( XNODE* aNode, TTEXTVALUE* aTextValue, const wxString& while( tNode ) { - if( tNode->GetName() == wxT( "patternGraphicsRef" ) ) + if( tNode->GetName().IsSameAs( wxT( "patternGraphicsRef" ), false ) ) { if( FindNode( tNode, wxT( "patternGraphicsNameRef" ) ) ) { @@ -251,7 +251,7 @@ void PCB::DoPCBComponents( XNODE* aNode, wxXmlDocument* aXmlDoc, const wxString& { fp = nullptr; - if( lNode->GetName() == wxT( "pattern" ) ) + if( lNode->GetName().IsSameAs( wxT( "pattern" ), false ) ) { FindNode( lNode, wxT( "patternRef" ) )->GetAttribute( wxT( "Name" ), &cn ); @@ -308,7 +308,7 @@ void PCB::DoPCBComponents( XNODE* aNode, wxXmlDocument* aXmlDoc, const wxString& str = FindNodeGetContent( lNode, wxT( "isFlipped" ) ); - if( str == wxT( "True" ) ) + if( str.IsSameAs( wxT( "True" ), false ) ) fp->m_Mirror = 1; tNode = aNode; @@ -369,7 +369,7 @@ void PCB::DoPCBComponents( XNODE* aNode, wxXmlDocument* aXmlDoc, const wxString& while( mNode ) { - if( mNode->GetName() == wxT( "padNum" ) ) + if( mNode->GetName().IsSameAs( wxT( "padNum" ), false ) ) { str = mNode->GetNodeContent(); mNode = mNode->GetNext(); @@ -397,19 +397,19 @@ void PCB::DoPCBComponents( XNODE* aNode, wxXmlDocument* aXmlDoc, const wxString& m_PcbComponents.Add( fp ); } } - else if( lNode->GetName() == wxT( "pad" ) ) + else if( lNode->GetName().IsSameAs( wxT( "pad" ), false ) ) { pad = new PCB_PAD( this, m_board ); pad->Parse( lNode, m_DefaultMeasurementUnit, aActualConversion ); m_PcbComponents.Add( pad ); } - else if( lNode->GetName() == wxT( "via" ) ) + else if( lNode->GetName().IsSameAs( wxT( "via" ), false ) ) { via = new PCB_VIA( this, m_board ); via->Parse( lNode, m_DefaultMeasurementUnit, aActualConversion ); m_PcbComponents.Add( via ); } - else if( lNode->GetName() == wxT( "polyKeepOut" ) ) + else if( lNode->GetName().IsSameAs( wxT( "polyKeepOut" ), false ) ) { keepOut = new PCB_KEEPOUT( m_callbacks, m_board, 0 ); @@ -544,13 +544,13 @@ void PCB::MapLayer( XNODE* aNode ) { layerType = FindNode( aNode, wxT( "layerType" ) )->GetNodeContent().Trim( false ); - if( layerType == wxT( "NonSignal" ) ) + if( layerType.IsSameAs( wxT( "NonSignal" ), false ) ) newlayer.layerType = LAYER_TYPE_NONSIGNAL; - if( layerType == wxT( "Signal" ) ) + if( layerType.IsSameAs( wxT( "Signal" ), false ) ) newlayer.layerType = LAYER_TYPE_SIGNAL; - if( layerType == wxT( "Plane" ) ) + if( layerType.IsSameAs( wxT( "Plane" ), false ) ) newlayer.layerType = LAYER_TYPE_PLANE; } @@ -577,15 +577,6 @@ int PCB::FindOutlinePoint( const VERTICES_ARRAY* aOutline, wxRealPoint aPoint ) } -/*int cmpFunc( wxRealPoint **first, wxRealPoint **second ) -{ - return sqrt( pow( (double) aPointA.x - (double) aPointB.x, 2 ) + - pow( (double) aPointA.y - (double) aPointB.y, 2 ) ); - - return 0; -}*/ - - double PCB::GetDistance( const wxRealPoint* aPoint1, const wxRealPoint* aPoint2 ) const { return sqrt( ( aPoint1->x - aPoint2->x ) * ( aPoint1->x - aPoint2->x ) + @@ -610,7 +601,7 @@ void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConver while( iNode ) { // objects - if( iNode->GetName() == wxT( "layerContents" ) ) + if( iNode->GetName().IsSameAs( wxT( "layerContents" ), false ) ) { if( FindNode( iNode, wxT( "layerNumRef" ) ) ) FindNode( iNode, wxT( "layerNumRef" ) )->GetNodeContent().ToLong( &PCadLayer ); @@ -621,7 +612,7 @@ void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConver while( lNode ) { - if( lNode->GetName() == wxT( "line" ) ) + if( lNode->GetName().IsSameAs( wxT( "line" ), false ) ) { pNode = FindNode( lNode, wxT( "pt" ) ); @@ -746,14 +737,15 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, while( aNode ) { - if( aNode->GetName() == wxT( "layerDef" ) ) + if( aNode->GetName().IsSameAs( wxT( "layerDef" ), false ) ) { if( FindNode( aNode, wxT( "layerType" ) ) ) { - layerType = FindNode( aNode, - wxT( "layerType" ) )->GetNodeContent().Trim( false ); + layerType = FindNode( aNode, wxT( "layerType" ) )->GetNodeContent().Trim( + false ); - if( layerType == wxT( "Signal" ) || layerType == wxT( "Plane" ) ) + if( layerType.IsSameAs( wxT( "Signal" ), false ) + || layerType.IsSameAs( wxT( "Plane" ), false ) ) { aNode->GetAttribute( wxT( "Name" ), &layerName ); layerName = layerName.MakeUpper(); @@ -778,7 +770,7 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, while( aNode ) { - if( aNode->GetName() == wxT( "layerDef" ) ) + if( aNode->GetName().IsSameAs( wxT( "layerDef" ), false ) ) MapLayer( aNode ); aNode = aNode->GetNext(); @@ -821,11 +813,11 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, while( aNode ) { // Components/footprints - if( aNode->GetName() == wxT( "multiLayer" ) ) + if( aNode->GetName().IsSameAs( wxT( "multiLayer" ), false ) ) DoPCBComponents( aNode, aXmlDoc, aActualConversion, aStatusBar ); // objects - if( aNode->GetName() == wxT( "layerContents" ) ) + if( aNode->GetName().IsSameAs( wxT( "layerContents" ), false ) ) DoLayerContentsObjects( aNode, nullptr, &m_PcbComponents, aStatusBar, m_DefaultMeasurementUnit, aActualConversion ); @@ -923,7 +915,7 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, { // aStatusBar->SetStatusText( wxT( "Processing COMPONENTS " ) ); - if( aNode->GetName() == wxT( "compDef" ) ) + if( aNode->GetName().IsSameAs( wxT( "compDef" ), false ) ) { footprint = new PCB_FOOTPRINT( this, m_board ); footprint->Parse( aNode, aStatusBar, m_DefaultMeasurementUnit, diff --git a/pcbnew/plugins/pcad/pcb_pad.cpp b/pcbnew/plugins/pcad/pcb_pad.cpp index 3127ccc0f8..c3aaa2758e 100644 --- a/pcbnew/plugins/pcad/pcb_pad.cpp +++ b/pcbnew/plugins/pcad/pcb_pad.cpp @@ -153,14 +153,14 @@ void PCB_PAD::Parse( XNODE* aNode, const wxString& aDefaultUnits, if( cNode ) SetWidth( cNode->GetNodeContent(), aDefaultUnits, &m_Hole, aActualConversion ); - if( FindNodeGetContent( lNode, wxT( "isHolePlated" ) ) == wxT( "False" ) ) + if( FindNodeGetContent( lNode, wxT( "isHolePlated" ) ).IsSameAs( wxT( "False" ), false ) ) m_IsHolePlated = false; cNode = FindNode( lNode, wxT( "padShape" ) ); while( cNode ) { - if( cNode->GetName() == wxT( "padShape" ) ) + if( cNode->GetName().IsSameAs( wxT( "padShape" ), false ) ) { // we support only Pads on specific layers...... // we do not support pads on "Plane", "NonSignal" , "Signal" ... layerr @@ -215,7 +215,7 @@ void PCB_PAD::AddToFootprint( FOOTPRINT* aFootprint, const EDA_ANGLE& aRotation, // Mounting Hole: Solder Mask Margin from Top Layer Width size. // Used the default zone clearance (simplify) - if( m_Shapes.GetCount() && m_Shapes[0]->m_Shape == wxT( "MtHole" ) ) + if( m_Shapes.GetCount() && m_Shapes[0]->m_Shape.IsSameAs( wxT( "MtHole" ), false ) ) { int sm_margin = ( m_Shapes[0]->m_Width - m_Hole ) / 2; pad->SetLocalSolderMaskMargin( sm_margin ); @@ -265,24 +265,24 @@ void PCB_PAD::AddToFootprint( FOOTPRINT* aFootprint, const EDA_ANGLE& aRotation, pad->SetNumber( m_name.text ); - if( padShapeName == wxT( "Oval" ) - || padShapeName == wxT( "Ellipse" ) - || padShapeName == wxT( "MtHole" ) ) + if( padShapeName.IsSameAs( wxT( "Oval" ), false ) + || padShapeName.IsSameAs( wxT( "Ellipse" ), false ) + || padShapeName.IsSameAs( wxT( "MtHole" ), false ) ) { if( width != height ) pad->SetShape( PAD_SHAPE::OVAL ); else pad->SetShape( PAD_SHAPE::CIRCLE ); } - else if( padShapeName == wxT( "Rect" ) ) + else if( padShapeName.IsSameAs( wxT( "Rect" ), false ) ) { pad->SetShape( PAD_SHAPE::RECT ); } - else if( padShapeName == wxT( "RndRect" ) ) + else if( padShapeName.IsSameAs( wxT( "RndRect" ), false ) ) { pad->SetShape( PAD_SHAPE::ROUNDRECT ); } - else if( padShapeName == wxT( "Polygon" ) ) + else if( padShapeName.IsSameAs( wxT( "Polygon" ), false ) ) { pad->SetShape( PAD_SHAPE::RECT ); // approximation } diff --git a/pcbnew/plugins/pcad/pcb_text.cpp b/pcbnew/plugins/pcad/pcb_text.cpp index 6b99ca639a..809e59f0fc 100644 --- a/pcbnew/plugins/pcad/pcb_text.cpp +++ b/pcbnew/plugins/pcad/pcb_text.cpp @@ -82,7 +82,7 @@ void PCB_TEXT::Parse( XNODE* aNode, int aLayer, const wxString& aDefaultUnits, str = FindNodeGetContent( aNode, wxT( "isFlipped" ) ); - if( str == wxT( "True" ) ) + if( str.IsSameAs( wxT( "True" ), false ) ) m_name.mirror = 1; lNode = FindNode( aNode, wxT( "textStyleRef" ) );