diff --git a/common/wxwineda.cpp b/common/wxwineda.cpp index 71720bfeb1..ea1e549d72 100644 --- a/common/wxwineda.cpp +++ b/common/wxwineda.cpp @@ -97,7 +97,7 @@ void EDA_GRAPHIC_TEXT_CTRL::SetValue( int textSize ) } -wxString EDA_GRAPHIC_TEXT_CTRL::GetText() +const wxString EDA_GRAPHIC_TEXT_CTRL::GetText() const { wxString text = m_FrameText->GetValue(); return text; diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index 74939c149e..78731d9e60 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -87,7 +87,7 @@ EDA_ITEM* SCH_FIELD::doClone() const } -wxString SCH_FIELD::GetText() const +const wxString SCH_FIELD::GetText() const { wxString text = m_Text; diff --git a/eeschema/sch_field.h b/eeschema/sch_field.h index b94c53e0fb..cf3a071adc 100644 --- a/eeschema/sch_field.h +++ b/eeschema/sch_field.h @@ -88,9 +88,9 @@ public: * overrides the default implementation to allow for the part suffix to be added * to the reference designator field if the component has multiple parts. * - * @return a wxString object containing the field's string. + * @return a const wxString object containing the field's string. */ - virtual wxString GetText() const; + virtual const wxString GetText() const; void Place( SCH_EDIT_FRAME* frame, wxDC* DC ); diff --git a/include/base_struct.h b/include/base_struct.h index e7b3286538..c81d803424 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -3,8 +3,8 @@ * @brief Basic classes for most KiCad items. */ -#ifndef BASE_STRUCT_H -#define BASE_STRUCT_H +#ifndef BASE_STRUCT_H_ +#define BASE_STRUCT_H_ #include "colors.h" #include "bitmaps.h" @@ -725,8 +725,8 @@ enum FILL_T { /** * Class EDA_TEXT * is a basic class to handle texts (labels, texts on components or footprints - * ..) not used directly. - * The text classes are derived from EDA_ITEM and EDA_TEXT + * ..) not used directly. The "used" text classes are derived from EDA_ITEM and + * EDA_TEXT using multiple inheritance. */ class EDA_TEXT { @@ -772,24 +772,25 @@ public: int GetOrientation() const { return m_Orient; } void SetItalic( bool isItalic ) { m_Italic = isItalic; } - bool GetItalic() const { return m_Italic; } + bool IsItalic() const { return m_Italic; } /** * Function SetSize * sets text size. * @param aNewSize is the new text size. */ - void SetSize( wxSize aNewSize ) { m_Size = aNewSize; }; + void SetSize( const wxSize& aNewSize ) { m_Size = aNewSize; }; /** * Function GetSize * returns text size. * @return wxSize - text size. */ - wxSize GetSize() const { return m_Size; }; + const wxSize GetSize() const { return m_Size; }; - //void SetPosition( const wxPoint& aPoint ) { m_Pos = aPoint; } - //wxPoint GetPosition() const { return m_Pos; } + /// named differently than the ones using multiple inheritance and including this class + void SetPos( const wxPoint& aPoint ) { m_Pos = aPoint; } + const wxPoint GetPos() const { return m_Pos; } int GetLength() const { return m_Text.Length(); }; @@ -904,9 +905,9 @@ public: * string to provide a way for modifying the base string by adding a suffix or * prefix to the base string. *

- * @return a wxString object containing the string of the item. + * @return a const wxString object containing the string of the item. */ - virtual wxString GetText() const { return m_Text; } + virtual const wxString GetText() const { return m_Text; } GRTextHorizJustifyType GetHorizJustify() const { return m_HJustify; }; GRTextVertJustifyType GetVertJustify() const { return m_VJustify; }; @@ -914,4 +915,4 @@ public: void SetVertJustify( GRTextVertJustifyType aType ) { m_VJustify = aType; }; }; -#endif /* BASE_STRUCT_H */ +#endif // BASE_STRUCT_H_ diff --git a/include/dialog_helpers.h b/include/dialog_helpers.h index 120a3a77b7..2c025bcba2 100644 --- a/include/dialog_helpers.h +++ b/include/dialog_helpers.h @@ -81,7 +81,7 @@ public: ~EDA_GRAPHIC_TEXT_CTRL(); - wxString GetText(); + const wxString GetText() const; int GetTextSize(); void Enable( bool state ); void SetTitle( const wxString& title ); diff --git a/pcbnew/class_dimension.cpp b/pcbnew/class_dimension.cpp index 47a13745b8..26189379b6 100644 --- a/pcbnew/class_dimension.cpp +++ b/pcbnew/class_dimension.cpp @@ -37,19 +37,26 @@ DIMENSION::~DIMENSION() } -void DIMENSION::SetText( const wxString& NewText ) +void DIMENSION::SetPosition( const wxPoint& aPos ) { - m_Text->m_Text = NewText; + m_Pos = aPos; + m_Text->SetPos( aPos ); } -wxString DIMENSION::GetText( void ) const +void DIMENSION::SetText( const wxString& aNewText ) { - return m_Text->m_Text; + m_Text->SetText( aNewText ); } -void DIMENSION::SetLayer( int aLayer ) +const wxString DIMENSION::GetText() const +{ + return m_Text->GetText(); +} + + +void DIMENSION::SetLayer( int aLayer ) { m_Layer = aLayer; m_Text->SetLayer( aLayer); diff --git a/pcbnew/class_dimension.h b/pcbnew/class_dimension.h index e1b2ffa8f5..2afde9618a 100644 --- a/pcbnew/class_dimension.h +++ b/pcbnew/class_dimension.h @@ -37,12 +37,14 @@ public: DIMENSION( BOARD_ITEM* aParent ); ~DIMENSION(); - const wxPoint GetPosition() const - { - return m_Pos; - } + const wxPoint GetPosition() const { return m_Pos; } - void SetPosition( const wxPoint& aPos ) { m_Pos = aPos; } + void SetPosition( const wxPoint& aPos ); // override, sets m_Text's position too + + void SetTextSize( const wxSize& aTextSize ) + { + m_Text->SetSize( aTextSize ); + } /** * Function SetLayer @@ -69,7 +71,7 @@ public: bool Save( FILE* aFile ) const; void SetText( const wxString& NewText ); - wxString GetText( void ) const; + const wxString GetText() const; void Copy( DIMENSION* source ); @@ -80,7 +82,7 @@ public: * Function Move * @param offset : moving vector */ - void Move(const wxPoint& offset); + void Move( const wxPoint& offset ); /** * Function Rotate @@ -132,7 +134,6 @@ public: */ bool HitTest( EDA_RECT& refArea ); - /** * Function GetClass * returns the class name. diff --git a/pcbnew/class_netclass.cpp b/pcbnew/class_netclass.cpp index 2f10f27553..d507724915 100644 --- a/pcbnew/class_netclass.cpp +++ b/pcbnew/class_netclass.cpp @@ -288,7 +288,7 @@ bool NETCLASS::Save( FILE* aFile ) const { bool result = true; - fprintf( aFile, "$" BRD_NETCLASS "\n" ); + fprintf( aFile, "$NCLASS\n" ); fprintf( aFile, "Name %s\n", EscapedUTF8( m_Name ).c_str() ); fprintf( aFile, "Desc %s\n", EscapedUTF8( GetDescription() ).c_str() ); @@ -307,7 +307,7 @@ bool NETCLASS::Save( FILE* aFile ) const for( const_iterator i = begin(); i!=end(); ++i ) fprintf( aFile, "AddNet %s\n", EscapedUTF8( *i ).c_str() ); - fprintf( aFile, "$End" BRD_NETCLASS "\n" ); + fprintf( aFile, "$EndNCLASS\n" ); return result; } @@ -334,74 +334,72 @@ void NETCLASS::Show( int nestLevel, std::ostream& os ) #endif - - bool NETCLASS::ReadDescr( LINE_READER* aReader ) { bool result = false; - char* Line; - char Buffer[1024]; + char* line; + char buf[1024]; wxString netname; while( aReader->ReadLine() ) { - Line = aReader->Line(); - if( strnicmp( Line, "AddNet", 6 ) == 0 ) + line = aReader->Line(); + if( strnicmp( line, "AddNet", 6 ) == 0 ) { - ReadDelimitedText( Buffer, Line + 6, sizeof(Buffer) ); - netname = FROM_UTF8( Buffer ); + ReadDelimitedText( buf, line + 6, sizeof(buf) ); + netname = FROM_UTF8( buf ); Add( netname ); continue; } - if( strnicmp( Line, "$end" BRD_NETCLASS, sizeof( "$end" BRD_NETCLASS)-1) == 0 ) + if( strnicmp( line, "$endNCLASS", sizeof( "$endNCLASS" ) - 1 ) == 0 ) { result = true; break; } - if( strnicmp( Line, "Clearance", 9 ) == 0 ) + if( strnicmp( line, "Clearance", 9 ) == 0 ) { - SetClearance( atoi( Line + 9 ) ); + SetClearance( atoi( line + 9 ) ); continue; } - if( strnicmp( Line, "TrackWidth", 10 ) == 0 ) + if( strnicmp( line, "TrackWidth", 10 ) == 0 ) { - SetTrackWidth( atoi( Line + 10 ) ); + SetTrackWidth( atoi( line + 10 ) ); continue; } - if( strnicmp( Line, "ViaDia", 6 ) == 0 ) + if( strnicmp( line, "ViaDia", 6 ) == 0 ) { - SetViaDiameter( atoi( Line + 6 ) ); + SetViaDiameter( atoi( line + 6 ) ); continue; } - if( strnicmp( Line, "ViaDrill", 8 ) == 0 ) + if( strnicmp( line, "ViaDrill", 8 ) == 0 ) { - SetViaDrill( atoi( Line + 8 ) ); + SetViaDrill( atoi( line + 8 ) ); continue; } - if( strnicmp( Line, "uViaDia", 7 ) == 0 ) + if( strnicmp( line, "uViaDia", 7 ) == 0 ) { - SetuViaDiameter( atoi( Line + 7 ) ); + SetuViaDiameter( atoi( line + 7 ) ); continue; } - if( strnicmp( Line, "uViaDrill", 9 ) == 0 ) + if( strnicmp( line, "uViaDrill", 9 ) == 0 ) { - SetuViaDrill( atoi( Line + 9 ) ); + SetuViaDrill( atoi( line + 9 ) ); continue; } - if( strnicmp( Line, "Name", 4 ) == 0 ) + if( strnicmp( line, "Name", 4 ) == 0 ) { - ReadDelimitedText( Buffer, Line + 4, sizeof(Buffer) ); - m_Name = FROM_UTF8( Buffer ); + ReadDelimitedText( buf, line + 4, sizeof(buf) ); + m_Name = FROM_UTF8( buf ); continue; } - if( strnicmp( Line, "Desc", 4 ) == 0 ) + if( strnicmp( line, "Desc", 4 ) == 0 ) { - ReadDelimitedText( Buffer, Line + 4, sizeof(Buffer) ); - SetDescription( FROM_UTF8( Buffer ) ); + ReadDelimitedText( buf, line + 4, sizeof(buf) ); + SetDescription( FROM_UTF8( buf ) ); continue; } } diff --git a/pcbnew/class_netclass.h b/pcbnew/class_netclass.h index e11cbd9e77..6a45c5a27d 100644 --- a/pcbnew/class_netclass.h +++ b/pcbnew/class_netclass.h @@ -80,16 +80,6 @@ public: static const wxString Default; ///< the name of the default NETCLASS - /** - * Name of identifier within BOARD file. - * 08-Sept-2009: changed the name from "NETCLASS" to this so we can - * toss any previous NETCLASSes in migratory BOARD files which will not have - * the proper parameters in the default netclass - * (from m_Parent->m_designSettings) in them. - * Spare the user from having to enter those defaults manually. - */ -#define BRD_NETCLASS "NCLASS" - /** * Constructor * stuffs a NETCLASS instance with aParent, aName, and optionally the initialParameters diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp index a23ba7975e..60a1cd7dec 100644 --- a/pcbnew/class_zone.cpp +++ b/pcbnew/class_zone.cpp @@ -196,8 +196,8 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const m_FillMode, m_ArcToSegmentsCount, m_IsFilled ? 'S' : 'F', - m_ThermalReliefGapValue, - m_ThermalReliefCopperBridgeValue ); + m_ThermalReliefGap, + m_ThermalReliefCopperBridge ); if( ret < 3 ) return false; @@ -398,7 +398,7 @@ int ZONE_CONTAINER::ReadDescr( LINE_READER* aReader ) char fillstate = 'F'; text = Line + 8; ret = sscanf( text, "%d %d %c %d %d", &fillmode, &arcsegmentcount, &fillstate, - &m_ThermalReliefGapValue, &m_ThermalReliefCopperBridgeValue ); + &m_ThermalReliefGap, &m_ThermalReliefCopperBridge ); if( ret < 1 ) // Must find 1 or more args. return false; @@ -1213,8 +1213,8 @@ void ZONE_CONTAINER::Copy( ZONE_CONTAINER* src ) m_FillMode = src->m_FillMode; // Filling mode (segments/polygons) m_ArcToSegmentsCount = src->m_ArcToSegmentsCount; m_PadOption = src->m_PadOption; - m_ThermalReliefGapValue = src->m_ThermalReliefGapValue; - m_ThermalReliefCopperBridgeValue = src->m_ThermalReliefCopperBridgeValue; + m_ThermalReliefGap = src->m_ThermalReliefGap; + m_ThermalReliefCopperBridge = src->m_ThermalReliefCopperBridge; m_Poly->m_HatchStyle = src->m_Poly->GetHatchStyle(); m_Poly->m_HatchLines = src->m_Poly->m_HatchLines; // Copy vector m_FilledPolysList.clear(); diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h index fd9fadca70..89b82dd48b 100644 --- a/pcbnew/class_zone.h +++ b/pcbnew/class_zone.h @@ -24,17 +24,18 @@ class BOARD; class ZONE_CONTAINER; -/* a small class used when filling areas with segments */ -class SEGMENT +/** + * Struct SEGMENT + * is a simple container used when filling areas with segments + */ +struct SEGMENT { -public: wxPoint m_Start; // starting point of a segment wxPoint m_End; // ending point of a segment -public: SEGMENT() {} - SEGMENT( const wxPoint& aStart, const wxPoint& aEnd) + SEGMENT( const wxPoint& aStart, const wxPoint& aEnd ) { m_Start = aStart; m_End = aEnd; @@ -69,10 +70,10 @@ public: int m_PadOption; // thickness of the gap in thermal reliefs. - int m_ThermalReliefGapValue; + int m_ThermalReliefGap; // thickness of the copper bridge in thermal reliefs - int m_ThermalReliefCopperBridgeValue; + int m_ThermalReliefCopperBridge; int utility, utility2; // flags used in polygon calculations // true when a zone was filled, false after deleting the filled areas @@ -167,7 +168,6 @@ public: */ void DrawWhileCreateOutline( EDA_DRAW_PANEL* panel, wxDC* DC, int draw_mode = GR_OR ); - /* Function GetBoundingBox * @return an EDA_RECT that is the bounding box of the zone outline */ @@ -204,8 +204,8 @@ public: } /** - * Functio SetNet - * set the netcode and the netname. + * Function SetNet + * sets the netcode and the netname. * * @param aNetCode The net code of the zone container if greater than or equal to * zero. Otherwise the current net code is kept and set the net @@ -226,6 +226,31 @@ public: * @return wxString - The net name. */ wxString GetNetName() const { return m_Netname; }; + void SetNetName( const wxString& aName ) { m_Netname = aName; } + + void SetFillMode( int aFillMode ) { m_FillMode = aFillMode; } + int GetFillMode() const { return m_FillMode; } + + void SetThermalReliefGap( int aThermalReliefGap ) { m_ThermalReliefGap = aThermalReliefGap; } + int GetThermalReliefGap() const { return m_ThermalReliefGap; } + + void SetThermalReliefCopperBridge( int aThermalReliefCopperBridge ) { m_ThermalReliefCopperBridge = aThermalReliefCopperBridge; } + int GetThermalReliefCopperBridge() const { return m_ThermalReliefCopperBridge; } + + void SetArcSegCount( int aArcSegCount ) { m_ArcToSegmentsCount = aArcSegCount; } + int GetArcSegCount() const { return m_ArcToSegmentsCount; } + + bool IsFilled() const { return m_IsFilled; } + void SetIsFilled( bool isFilled ) { m_IsFilled = isFilled; } + + int GetZoneClearance() const { return m_ZoneClearance; } + void SetZoneClearance( int aZoneClearance ) { m_ZoneClearance = aZoneClearance; } + + int GetPadOption() const { return m_PadOption; } + void SetPadOption( int aPadOption ) { m_PadOption = aPadOption; } + + int GetMinThickness() const { return m_ZoneMinThickness; } + void SetMinThickness( int aMinThickness ) { m_ZoneMinThickness = aMinThickness; } /** * Function HitTest @@ -403,32 +428,27 @@ public: return m_Poly->GetNumCorners(); } - void RemoveAllContours( void ) { m_Poly->RemoveAllContours(); } - wxPoint GetCornerPosition( int aCornerIndex ) const { return wxPoint( m_Poly->GetX( aCornerIndex ), m_Poly->GetY( aCornerIndex ) ); } - void SetCornerPosition( int aCornerIndex, wxPoint new_pos ) { m_Poly->SetX( aCornerIndex, new_pos.x ); m_Poly->SetY( aCornerIndex, new_pos.y ); } - void AppendCorner( wxPoint position ) { m_Poly->AppendCorner( position.x, position.y ); } - int GetHatchStyle() const { return m_Poly->GetHatchStyle(); @@ -436,12 +456,12 @@ public: /** * Function IsSame - * test is 2 zones are equivalent: + * tests if 2 zones are equivalent: * 2 zones are equivalent if they have same parameters and same outlines - * info relative to filling is not take in account + * info, filling is not taken into account * @param aZoneToCompare = zone to compare with "this" */ - bool IsSame( const ZONE_CONTAINER &aZoneToCompare); + bool IsSame( const ZONE_CONTAINER &aZoneToCompare ); /** * Function GetSmoothedPoly diff --git a/pcbnew/class_zone_setting.cpp b/pcbnew/class_zone_setting.cpp index 672f6bdd88..6d6ac21583 100644 --- a/pcbnew/class_zone_setting.cpp +++ b/pcbnew/class_zone_setting.cpp @@ -33,8 +33,8 @@ ZONE_SETTING::ZONE_SETTING( void ) m_ArcToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF; /* Option to select number of segments to approximate a circle * ARC_APPROX_SEGMENTS_COUNT_LOW_DEF * or ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF segments */ - m_ThermalReliefGapValue = 200; // tickness of the gap in thermal reliefs - m_ThermalReliefCopperBridgeValue = 200; // tickness of the copper bridge in thermal reliefs + m_ThermalReliefGap = 200; // tickness of the gap in thermal reliefs + m_ThermalReliefCopperBridge = 200; // tickness of the copper bridge in thermal reliefs m_Zone_Pad_Options = THERMAL_PAD; // How pads are covered by copper in zone @@ -57,8 +57,8 @@ void ZONE_SETTING::ImportSetting( const ZONE_CONTAINER& aSource ) m_CurrentZone_Layer = aSource.GetLayer(); m_Zone_HatchingStyle = aSource.GetHatchStyle(); m_ArcToSegmentsCount = aSource.m_ArcToSegmentsCount; - m_ThermalReliefGapValue = aSource.m_ThermalReliefGapValue; - m_ThermalReliefCopperBridgeValue = aSource.m_ThermalReliefCopperBridgeValue; + m_ThermalReliefGap = aSource.m_ThermalReliefGap; + m_ThermalReliefCopperBridge = aSource.m_ThermalReliefCopperBridge; m_Zone_Pad_Options = aSource.m_PadOption; cornerSmoothingType = aSource.GetCornerSmoothingType(); cornerRadius = aSource.GetCornerRadius(); @@ -81,8 +81,8 @@ void ZONE_SETTING::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) aTarget.m_ZoneMinThickness = m_ZoneMinThickness; aTarget.m_Poly->SetHatch( m_Zone_HatchingStyle ); aTarget.m_ArcToSegmentsCount = m_ArcToSegmentsCount; - aTarget.m_ThermalReliefGapValue = m_ThermalReliefGapValue; - aTarget.m_ThermalReliefCopperBridgeValue = m_ThermalReliefCopperBridgeValue; + aTarget.m_ThermalReliefGap = m_ThermalReliefGap; + aTarget.m_ThermalReliefCopperBridge = m_ThermalReliefCopperBridge; aTarget.m_PadOption = m_Zone_Pad_Options; aTarget.SetCornerSmoothingType( cornerSmoothingType ); aTarget.SetCornerRadius( cornerRadius ); diff --git a/pcbnew/class_zone_setting.h b/pcbnew/class_zone_setting.h index 2db900a7ec..5b257e7c02 100644 --- a/pcbnew/class_zone_setting.h +++ b/pcbnew/class_zone_setting.h @@ -41,8 +41,8 @@ public: // Option to select number of segments to approximate a circle 16 or 32 segments. int m_ArcToSegmentsCount; - long m_ThermalReliefGapValue; // thickness of the gap in thermal reliefs - long m_ThermalReliefCopperBridgeValue; // thickness of the copper bridge in thermal reliefs + long m_ThermalReliefGap; // thickness of the gap in thermal reliefs + long m_ThermalReliefCopperBridge; // thickness of the copper bridge in thermal reliefs int m_Zone_Pad_Options; // How pads are covered by copper in zone private: diff --git a/pcbnew/dialogs/dialog_copper_zones.cpp b/pcbnew/dialogs/dialog_copper_zones.cpp index 35ce0d4fb4..9d08478969 100644 --- a/pcbnew/dialogs/dialog_copper_zones.cpp +++ b/pcbnew/dialogs/dialog_copper_zones.cpp @@ -122,10 +122,10 @@ void DIALOG_COPPER_ZONE::initDialog() AddUnitSymbol( *m_AntipadSizeText, g_UserUnit ); AddUnitSymbol( *m_CopperBridgeWidthText, g_UserUnit ); PutValueInLocalUnits( *m_AntipadSizeValue, - m_Zone_Setting->m_ThermalReliefGapValue, + m_Zone_Setting->m_ThermalReliefGap, PCB_INTERNAL_UNIT ); PutValueInLocalUnits( *m_CopperWidthValue, - m_Zone_Setting->m_ThermalReliefCopperBridgeValue, + m_Zone_Setting->m_ThermalReliefCopperBridge, PCB_INTERNAL_UNIT ); m_cornerSmoothingChoice->SetSelection( m_Zone_Setting->GetCornerSmoothingType() ); @@ -328,19 +328,19 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab else g_Zone_45_Only = TRUE; - m_Zone_Setting->m_ThermalReliefGapValue = ReturnValueFromTextCtrl( *m_AntipadSizeValue, + m_Zone_Setting->m_ThermalReliefGap = ReturnValueFromTextCtrl( *m_AntipadSizeValue, PCB_INTERNAL_UNIT ); - m_Zone_Setting->m_ThermalReliefCopperBridgeValue = ReturnValueFromTextCtrl( + m_Zone_Setting->m_ThermalReliefCopperBridge = ReturnValueFromTextCtrl( *m_CopperWidthValue, PCB_INTERNAL_UNIT ); m_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, - (long) m_Zone_Setting->m_ThermalReliefGapValue ); + (long) m_Zone_Setting->m_ThermalReliefGap ); m_Config->Write( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, - (long) m_Zone_Setting->m_ThermalReliefCopperBridgeValue ); + (long) m_Zone_Setting->m_ThermalReliefCopperBridge ); - if( m_Zone_Setting->m_ThermalReliefCopperBridgeValue <= m_Zone_Setting->m_ZoneMinThickness ) + if( m_Zone_Setting->m_ThermalReliefCopperBridge <= m_Zone_Setting->m_ZoneMinThickness ) { DisplayError( this, _( "Thermal relief spoke width is larger than the minimum width." ) ); diff --git a/pcbnew/ioascii.cpp b/pcbnew/ioascii.cpp index 7d90c55537..eb26811b36 100644 --- a/pcbnew/ioascii.cpp +++ b/pcbnew/ioascii.cpp @@ -1030,7 +1030,7 @@ int PCB_EDIT_FRAME::ReadPcbFile( LINE_READER* aReader, bool Append ) continue; } - if( TESTLINE( BRD_NETCLASS ) ) + if( TESTLINE( "NCLASS" ) ) { // create an empty NETCLASS without a name. NETCLASS* netclass = new NETCLASS( board, wxEmptyString ); diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index b51b27795a..558b01d9ed 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -22,16 +22,27 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + This implements loading and saving a BOARD, behind the PLUGIN interface. -/* This implements loading and saving a BOARD, behind the PLUGIN interface. + The philosophy on loading: + *) BIUs should be typed as such to distinguish them from ints. + *) Do not assume that BIUs will always be int, doing a sscanf() into a BIU + does not make sense in case the size of the BUI changes. + *) variable are put onto the stack in an automatic, even when it might look + more efficient to do otherwise. This is so we can seem them with a debugger. + *) Global variable should not be touched from within a PLUGIN, since it will eventuall + be in a DLL/DSO. This includes window information too. The PLUGIN API knows + nothing of wxFrame. */ + #include #include #include #include -#include // I implement this +#include // implement this here #include #include @@ -121,21 +132,49 @@ #define MM_PER_BIU 1e-6 #define UM_PER_BIU 1e-3 -/// Test for a specific length of characters. +/// C string compare test for a specific length of characters. /// The -1 is to omit the trailing \0 which is included in sizeof() on a -/// string. +/// string constant. #define TESTLINE( x ) (strncmp( line, x, sizeof(x) - 1 ) == 0) -/// Get the length of a constant string, at compile time +/// Get the length of a string constant, at compile time #define SZ( x ) (sizeof(x)-1) using namespace std; // auto_ptr + +/** + * Function intParse + * parses an ASCII integer string with possible leading whitespace into + * an integers and updates the pointer at \a out if it is not NULL, just + * like "man strtol()". I can use this without casting, and its name says + * what I am doing. + */ +static inline int intParse( const char* next, const char** out = NULL ) +{ + // please just compile this and be quiet, hide casting ugliness: + return (int) strtol( next, (char**) out, 10 ); +} + + +/** + * Function hexParse + * parses an ASCII hex integer string with possible leading whitespace into + * a long integer and updates the pointer at \a out if it is not NULL, just + * like "man strtol()". I can use this without casting, and its name says + * what I am doing. + */ +static inline long hexParse( const char* next, const char** out = NULL ) +{ + // please just compile this and be quiet, hide casting ugliness: + return strtol( next, (char**) out, 16 ); +} + + BOARD* KICAD_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPERTIES* aProperties ) { - LOCALE_IO toggle; // toggles on then off the C locale. - wxString msg; + LOCALE_IO toggle; // toggles on, then off, the C locale. m_board = aAppendToMe ? aAppendToMe : new BOARD( NULL ); @@ -201,35 +240,25 @@ void KICAD_PLUGIN::loadAllSections( bool doAppend ) else if( TESTLINE( "$TRACK" ) ) { TRACK* insertBeforeMe = doAppend ? NULL : m_board->m_Track.GetFirst(); - loadTrackList( insertBeforeMe, PCB_TRACE_T, NbTrack ); + loadTrackList( insertBeforeMe, PCB_TRACE_T ); } - else if( TESTLINE( "$" BRD_NETCLASS ) ) + else if( TESTLINE( "$NCLASS" ) ) { loadNETCLASS(); } -#if 0 else if( TESTLINE( "$CZONE_OUTLINE" ) ) { - auto_ptr zone_descr( new ZONE_CONTAINER( m_board ) ); - - load( zone_descr.get() ); - - if( zone_descr->GetNumCorners() > 2 ) // should always occur - m_board->Add( zone_descr.release() ); - - // else delete zone_descr; done by auto_ptr + loadZONE_CONTAINER(); } else if( TESTLINE( "$COTATION" ) ) { - DIMENSION* dim = new DIMENSION( m_board ); - m_board->Add( dim, ADD_APPEND ); - load( dim ); - + loadDIMENSION(); } +#if 0 else if( TESTLINE( "$PCB_TARGET" ) ) { PCB_TARGET* t = new PCB_TARGET( m_board ); @@ -299,23 +328,19 @@ void KICAD_PLUGIN::loadGENERAL() // what are the engineering units of the dimensions in the BOARD? data = strtok( line + SZ("Units"), delims ); - if( strcmp( data, "mm" ) == 0 ) + if( !strcmp( data, "mm" ) ) { #if defined(KICAD_NANOMETRE) diskToBiu = 1000000.0; #else - m_error = wxT( "May not load new *.brd file into 'PCBNew compiled for deci-mils'" ); - THROW_IO_ERROR( m_error ); + THROW_IO_ERROR( _( "May not load new *.brd file into 'PCBNew compiled for deci-mils'" ) ); #endif } } else if( TESTLINE( "EnabledLayers" ) ) { - int enabledLayers = 0; - - data = strtok( line + SZ( "EnabledLayers" ), delims ); - sscanf( data, "%X", &enabledLayers ); + int enabledLayers = hexParse( line + SZ( "EnabledLayers" ) ); // Setup layer visibility m_board->SetEnabledLayers( enabledLayers ); @@ -323,10 +348,7 @@ void KICAD_PLUGIN::loadGENERAL() else if( TESTLINE( "Ly" ) ) // Old format for Layer count { - int layer_mask = 1; - - data = strtok( line + SZ( "Ly" ), delims ); - sscanf( data, "%X", &layer_mask ); + int layer_mask = hexParse( line + SZ( "Ly" ) ); int layer_count = 0; @@ -341,24 +363,25 @@ void KICAD_PLUGIN::loadGENERAL() else if( TESTLINE( "BoardThickness" ) ) { - data = strtok( line + SZ( "BoardThickness" ), delims ); + data = line + SZ( "BoardThickness" ); m_board->GetBoardDesignSettings()->m_BoardThickness = atoi( data ); } + /* else if( TESTLINE( "Links" ) ) { // Info only, do nothing, but only for a short while. } + */ else if( TESTLINE( "NoConn" ) ) { - data = strtok( line + SZ( "NoConn" ), delims ); + data = line + SZ( "NoConn" ); m_board->m_NbNoconnect = atoi( data ); } else if( TESTLINE( "Di" ) ) { - // skip the first token "Di". // no use of strtok() in this one, don't want the nuls data = line + SZ( "Di" ); @@ -377,31 +400,31 @@ void KICAD_PLUGIN::loadGENERAL() // Read the number of segments of type DRAW, TRACK, ZONE else if( TESTLINE( "Ndraw" ) ) { - data = strtok( line + SZ( "Ndraw" ), delims ); + data = line + SZ( "Ndraw" ); NbDraw = atoi( data ); } else if( TESTLINE( "Ntrack" ) ) { - data = strtok( line + SZ( "Ntrack" ), delims ); + data = line + SZ( "Ntrack" ); NbTrack = atoi( data ); } else if( TESTLINE( "Nzone" ) ) { - data = strtok( line + SZ( "Nzone" ), delims ); + data = line + SZ( "Nzone" ); NbZone = atoi( data ); } else if( TESTLINE( "Nmodule" ) ) { - data = strtok( line + SZ( "Nmodule" ), delims ); + data = line + SZ( "Nmodule" ); NbMod = atoi( data ); } else if( TESTLINE( "Nnets" ) ) { - data = strtok( line + SZ( "Nnets" ), delims ); + data = line + SZ( "Nnets" ); NbNets = atoi( data ); } } @@ -437,7 +460,7 @@ void KICAD_PLUGIN::loadSHEET() { if( stricmp( TO_UTF8( sheet->m_Name ), text ) == 0 ) { -// screen->m_CurrentSheetDesc = sheet; +// @todo screen->m_CurrentSheetDesc = sheet; if( sheet == &g_Sheet_user ) { @@ -521,17 +544,19 @@ void KICAD_PLUGIN::loadSETUP() while( aReader->ReadLine() ) { - char* line = aReader->Line(); const char* data; + char* line = aReader->Line(); + if( TESTLINE( "PcbPlotParams" ) ) { - PCB_PLOT_PARAMS_PARSER parser( &line[13], aReader->GetSource() ); + PCB_PLOT_PARAMS_PARSER parser( line + SZ( "PcbPlotParams" ), aReader->GetSource() ); - try +// try { g_PcbPlotOptions.Parse( &parser ); } +/* move this higher up catch( IO_ERROR& e ) { wxString msg; @@ -541,13 +566,10 @@ void KICAD_PLUGIN::loadSETUP() e.errorText.GetData() ); wxMessageBox( msg, _( "Open Board File" ), wxICON_ERROR ); } - continue; +*/ } - strtok( line, delims ); - data = strtok( NULL, delims ); - - if( TESTLINE( "$EndSETUP" ) ) + else if( TESTLINE( "$EndSETUP" ) ) { // Until such time as the *.brd file does not have the // global parameters: @@ -571,7 +593,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "AuxiliaryAxisOrg" ) ) { - BIU gx = biuParse( data, &data ); + BIU gx = biuParse( line + SZ( "AuxiliaryAxisOrg" ), &data ); BIU gy = biuParse( data ); /* @todo @@ -584,20 +606,17 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "Layers" ) == 0 ) { - int tmp = atoi( data ); + int tmp = atoi( line + SZ( "Layers" ) ); m_board->SetCopperLayerCount( tmp ); } else if( TESTLINE( "Layer[" ) ) { - const int LAYERKEYZ = sizeof("Layer[") - 1; + // eg: "Layer[n] " - // parse: - // Layer[n] - - char* cp = line + LAYERKEYZ; - int layer = atoi( cp ); + int layer = intParse( line + SZ( "Layer[" ), &data ); + data = strtok( (char*) data+1, delims ); // +1 for ']' if( data ) { wxString layerName = FROM_UTF8( data ); @@ -626,49 +645,49 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "TrackWidthList" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "TrackWidthList" ) ); m_board->m_TrackWidthList.push_back( tmp ); } else if( TESTLINE( "TrackClearence" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "TrackClearence" ) ); netclass_default->SetClearance( tmp ); } else if( TESTLINE( "TrackMinWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "TrackMinWidth" ) ); m_board->GetBoardDesignSettings()->m_TrackMinWidth = tmp; } else if( TESTLINE( "ZoneClearence" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "ZoneClearence" ) ); g_Zone_Default_Setting.m_ZoneClearance = tmp; } else if( TESTLINE( "DrawSegmWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "DrawSegmWidth" ) ); m_board->GetBoardDesignSettings()->m_DrawSegmentWidth = tmp; } else if( TESTLINE( "EdgeSegmWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "EdgeSegmWidth" ) ); m_board->GetBoardDesignSettings()->m_EdgeSegmentWidth = tmp; } else if( TESTLINE( "ViaMinSize" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "ViaMinSize" ) ); m_board->GetBoardDesignSettings()->m_ViasMinSize = tmp; } else if( TESTLINE( "MicroViaMinSize" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "MicroViaMinSize" ) ); m_board->GetBoardDesignSettings()->m_MicroViasMinSize = tmp; } @@ -677,11 +696,10 @@ void KICAD_PLUGIN::loadSETUP() // e.g. "ViaSizeList DIAMETER [DRILL]" BIU drill = 0; - BIU diameter = biuParse( data ); + BIU diameter = biuParse( line + SZ( "ViaSizeList" ), &data ); - data = strtok( NULL, delims ); - - if( data ) // DRILL may not be present + data = strtok( (char*) data, delims ); + if( data ) // DRILL may not be present ? drill = biuParse( data ); m_board->m_ViasDimensionsList.push_back( VIA_DIMENSION( diameter, drill ) ); @@ -689,42 +707,43 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "ViaDrill" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "ViaDrill" ) ); netclass_default->SetViaDrill( tmp ); } else if( TESTLINE( "ViaMinDrill" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "ViaMinDrill" ) ); m_board->GetBoardDesignSettings()->m_ViasMinDrill = tmp; } else if( TESTLINE( "MicroViaDrill" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "MicroViaDrill" ) ); netclass_default->SetuViaDrill( tmp ); } else if( TESTLINE( "MicroViaMinDrill" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "MicroViaMinDrill" ) ); m_board->GetBoardDesignSettings()->m_MicroViasMinDrill = tmp; } else if( TESTLINE( "MicroViasAllowed" ) ) { - m_board->GetBoardDesignSettings()->m_MicroViasAllowed = atoi( data ); + int tmp = atoi( line + SZ( "MicroViasAllowed" ) ); + m_board->GetBoardDesignSettings()->m_MicroViasAllowed = tmp; } else if( TESTLINE( "TextPcbWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "TextPcbWidth" ) ); m_board->GetBoardDesignSettings()->m_PcbTextWidth = tmp; } else if( TESTLINE( "TextPcbSize" ) ) { - BIU x = biuParse( data, &data ); + BIU x = biuParse( line + SZ( "TextPcbSize" ), &data ); BIU y = biuParse( data ); m_board->GetBoardDesignSettings()->m_PcbTextSize = wxSize( x, y ); @@ -732,7 +751,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "EdgeModWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "EdgeModWidth" ) ); /* @todo g_ModuleSegmentWidth = tmp; */ @@ -740,7 +759,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "TextModWidth" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "TextModWidth" ) ); /* @todo g_ModuleTextWidth = tmp; */ @@ -748,7 +767,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "TextModSize" ) ) { - BIU x = biuParse( data, &data ); + BIU x = biuParse( line + SZ( "TextModSize" ), &data ); BIU y = biuParse( data ); /* @todo g_ModuleTextSize = wxSize( x, y ); @@ -757,7 +776,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "PadSize" ) ) { - BIU x = biuParse( data, &data ); + BIU x = biuParse( line + SZ( "PadSize" ), &data ); BIU y = biuParse( data ); /* @todo g_Pad_Master.m_Size = wxSize( x, y ); @@ -766,7 +785,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "PadDrill" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "PadDrill" ) ); /* @todo g_Pad_Master.m_Drill.x( tmp ); g_Pad_Master.m_Drill.y( tmp ); @@ -775,25 +794,25 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "Pad2MaskClearance" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "Pad2MaskClearance" ) ); m_board->GetBoardDesignSettings()->m_SolderMaskMargin = tmp; } else if( TESTLINE( "Pad2PasteClearance" ) ) { - BIU tmp = biuParse( data ); + BIU tmp = biuParse( line + SZ( "Pad2PasteClearance" ) ); m_board->GetBoardDesignSettings()->m_SolderPasteMargin = tmp; } else if( TESTLINE( "Pad2PasteClearanceRatio" ) ) { - double ratio = atof( data ); + double ratio = atof( line + SZ( "Pad2PasteClearanceRatio" ) ); m_board->GetBoardDesignSettings()->m_SolderPasteMarginRatio = ratio; } else if( TESTLINE( "GridOrigin" ) ) { - BIU gx = biuParse( data, &data ); + BIU gx = biuParse( line + SZ( "GridOrigin" ), &data ); BIU gy = biuParse( data ); /* @todo @@ -872,8 +891,7 @@ void KICAD_PLUGIN::loadMODULE() case 'N': // Shape File Name { char buf[512]; - ReadDelimitedText( buf, text, 512 ); - + ReadDelimitedText( buf, text, sizeof(buf) ); t3D->m_Shape3DName = FROM_UTF8( buf ); } break; @@ -926,20 +944,20 @@ void KICAD_PLUGIN::loadDRAWSEGMENT() { char* line = aReader->Line(); - if( strnicmp( line, "$End", 4 ) == 0 ) - return; // Normal end matches here, because it's: $EndDRAWSEGMENT + if( TESTLINE( "$EndDRAWSEGMENT" ) ) + return; // preferred exit - if( line[0] == 'P' ) + else if( TESTLINE( "Po" ) ) { // sscanf( line + 2, " %d %d %d %d %d %d", &m_Shape, &m_Start.x, &m_Start.y, &m_End.x, &m_End.y, &m_Width ); - const char* next = line + 2; + const char* data = line + SZ( "Po" ); - BIU shape = biuParse( next, &next ); - BIU start_x = biuParse( next, &next ); - BIU start_y = biuParse( next, &next ); - BIU end_x = biuParse( next, &next ); - BIU end_y = biuParse( next, &next ); - BIU width = biuParse( next ); + BIU shape = biuParse( data, &data ); + BIU start_x = biuParse( data, &data ); + BIU start_y = biuParse( data, &data ); + BIU end_x = biuParse( data, &data ); + BIU end_y = biuParse( data, &data ); + BIU width = biuParse( data ); if( width < 0 ) width = 0; @@ -950,19 +968,20 @@ void KICAD_PLUGIN::loadDRAWSEGMENT() dseg->SetEnd( wxPoint( end_x, end_y ) ); } - else if( line[0] == 'D' ) + else if( TESTLINE( "De" ) ) { - BIU x = 0; - BIU y = 0; - int val; - char* token = strtok( line, " " ); // "De", skip it + const char* data = strtok( line, " " ); // "De", skip it - for( int i = 0; (token = strtok( NULL," " )) != NULL; ++i ) + BIU x = 0; + BIU y; + int val; + + for( int i = 0; (data = strtok( NULL, " " )) != NULL; ++i ) { switch( i ) { case 0: - sscanf( token, "%d", &val ); + val = atoi( data ); if( val < FIRST_NO_COPPER_LAYER ) val = FIRST_NO_COPPER_LAYER; @@ -973,35 +992,37 @@ void KICAD_PLUGIN::loadDRAWSEGMENT() dseg->SetLayer( val ); break; case 1: - sscanf( token, "%d", &val ); + val = atoi( data ); dseg->SetType( val ); // m_Type break; case 2: - sscanf( token, "%d", &val ); + val = atoi( data ); dseg->SetAngle( val ); // m_Angle break; case 3: - sscanf( token, "%lX", &dseg->m_TimeStamp ); + long timestamp; + timestamp = hexParse( data ); + dseg->SetTimeStamp( timestamp ); break; case 4: - sscanf( token, "%X", &val ); + val = hexParse( data ); dseg->SetState( val, ON ); break; // Bezier Control Points case 5: - x = biuParse( token ); + x = biuParse( data ); break; case 6: - y = biuParse( token ); + y = biuParse( data ); dseg->SetBezControl1( wxPoint( x, y ) ); break; case 7: - x = biuParse( token ); + x = biuParse( data ); break; case 8: - y = biuParse( token ); + y = biuParse( data ); dseg->SetBezControl2( wxPoint( x, y ) ); break; @@ -1190,7 +1211,7 @@ void KICAD_PLUGIN::loadPCB_TEXTE() } -void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType, int aSegCount ) +void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType ) { static const char delims[] = " \t\n\r"; // for this function only. @@ -1202,16 +1223,17 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType, int a char* line = aReader->Line(); BIU drill = -1; // SetDefault() if -1 - TRACK* newTrack; if( line[0] == '$' ) // $EndTRACK return; // preferred exit // int arg_count = sscanf( line + 2, " %d %d %d %d %d %d %d", &shape, &tempStartX, &tempStartY, &tempEndX, &tempEndY, &width, &drill ); + assert( TESTLINE( "Po" ) ); + const char* data = line + SZ( "Po" ); - int shape = (int) strtol( data, (char**) &data, 10 ); + int shape = intParse( data, &data ); BIU startX = biuParse( data, &data ); BIU startY = biuParse( data, &data ); BIU endX = biuParse( data, &data ); @@ -1238,7 +1260,7 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType, int a // example second line: // "De 0 0 463 0 800000\r\n" - if( line[0] == '$' ) + if( !TESTLINE( "De" ) ) { // mandatory 2nd line is missing THROW_IO_ERROR( wxT( "Missing 2nd line of a TRACK def" ) ); @@ -1256,6 +1278,8 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType, int a else makeType = aStructType; + TRACK* newTrack; // BOARD insert this new one immediately after instantiation + switch( makeType ) { default: @@ -1326,7 +1350,7 @@ void KICAD_PLUGIN::loadNETCLASS() netclass->Add( netname ); } - else if( TESTLINE( "$end" BRD_NETCLASS ) ) + else if( TESTLINE( "$endNCLASS" ) ) { if( m_board->m_NetClasses.Add( netclass.get() ) ) { @@ -1343,7 +1367,7 @@ void KICAD_PLUGIN::loadNETCLASS() THROW_IO_ERROR( m_error ); } - return; // prefered exit + return; // preferred exit } else if( TESTLINE( "Clearance" ) ) @@ -1395,7 +1419,462 @@ void KICAD_PLUGIN::loadNETCLASS() } } - THROW_IO_ERROR( wxT( "Missing '$End" BRD_NETCLASS ) ); + THROW_IO_ERROR( wxT( "Missing '$EndNCLASS'" ) ); +} + + +void KICAD_PLUGIN::loadZONE_CONTAINER() +{ + auto_ptr zc( new ZONE_CONTAINER( m_board ) ); + + int outline_hatch = CPolyLine::NO_HATCH; + bool sawCorner = false; + int layer = 0; + + while( aReader->ReadLine() ) + { + char* line = aReader->Line(); + + if( TESTLINE( "ZCorner" ) ) // new corner found + { + // e.g. "ZCorner 25650 49500 0" + + const char* data = line + SZ( "ZCorner" ); + + BIU x = biuParse( data, &data ); + BIU y = biuParse( data, &data ); + int flag = atoi( data ); + + if( !sawCorner ) + zc->m_Poly->Start( layer, x, y, outline_hatch ); + else + zc->AppendCorner( wxPoint( x, y ) ); + + sawCorner = true; + + if( flag ) + zc->m_Poly->Close(); + } + + else if( TESTLINE( "ZInfo" ) ) // general info found + { + // e.g. 'ZInfo 479194B1 310 "COMMON"' + + const char* data = line + SZ( "ZInfo" ); + + char buf[1024]; + long timestamp = hexParse( data, &data ); + int netcode = intParse( data, &data ); + + if( ReadDelimitedText( buf, data, sizeof(buf) ) > (int) sizeof(buf) ) + { + THROW_IO_ERROR( wxT( "ZInfo netname too long" ) ); + } + + zc->SetTimeStamp( timestamp ); + zc->SetNet( netcode ); + zc->SetNetName( FROM_UTF8( buf ) ); + } + + else if( TESTLINE( "ZLayer" ) ) // layer found + { + char* data = line + SZ( "ZLayer" ); + + layer = atoi( data ); + } + + else if( TESTLINE( "ZAux" ) ) // aux info found + { + // e.g. "ZAux 7 E" + + char* data = line + SZ( "ZAux" ); + int x; + char hopt[10]; + int ret = sscanf( data, "%d %c", &x, hopt ); + + if( ret < 2 ) + { + m_error.Printf( wxT( "Bad ZAux for CZONE_CONTAINER '%s'" ), zc->GetNetName().GetData() ); + THROW_IO_ERROR( m_error ); + } + + switch( hopt[0] ) // upper case required + { + case 'N': + outline_hatch = CPolyLine::NO_HATCH; + break; + + case 'E': + outline_hatch = CPolyLine::DIAGONAL_EDGE; + break; + + case 'F': + outline_hatch = CPolyLine::DIAGONAL_FULL; + break; + + default: + m_error.Printf( wxT( "Bad ZAux for CZONE_CONTAINER '%s'" ), zc->GetNetName().GetData() ); + THROW_IO_ERROR( m_error ); + } + + // Set hatch mode later, after reading corner outline data + } + + else if( TESTLINE( "ZSmoothing" ) ) + { + // e.g. "ZSmoothing 0 0" + + const char* data = line + SZ( "ZSmoothing" ); + + int smoothing = intParse( data, &data ); + BIU cornerRadius = biuParse( data ); + + if( smoothing >= ZONE_SETTING::SMOOTHING_LAST || smoothing < 0 ) + { + m_error.Printf( wxT( "Bad ZSmoothing for CZONE_CONTAINER '%s'" ), zc->GetNetName().GetData() ); + THROW_IO_ERROR( m_error ); + } + + zc->SetCornerSmoothingType( smoothing ); + zc->SetCornerRadius( cornerRadius ); + } + + else if( TESTLINE( "ZOptions" ) ) + { + // e.g. "ZOptions 0 32 F 200 200" + + const char* data = line + SZ( "ZOptions" ); + + int fillmode = intParse( data, &data ); + int arcsegcount = intParse( data, &data ); + char fillstate = data[1]; // here e.g. " F" + BIU thermalReliefGap = biuParse( data += 2 , &data ); // +=2 for " F" + BIU thermalReliefCopperBridge = biuParse( data ); + + zc->SetFillMode( fillmode ? 1 : 0 ); + + if( arcsegcount >= 32 /* ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF: don't really want pcbnew.h in here, after all, its a PLUGIN and global data is evil. */ ) + arcsegcount = 32; + + zc->SetArcSegCount( arcsegcount ); + zc->SetIsFilled( fillstate == 'S' ? true : false ); + zc->SetThermalReliefGap( thermalReliefGap ); + zc->SetThermalReliefCopperBridge( thermalReliefCopperBridge ); + } + + else if( TESTLINE( "ZClearance" ) ) // Clearance and pad options info found + { + // e.g. "ZClearance 40 I" + + const char* data = line + SZ( "ZClearance" ); + + BIU clearance = biuParse( data, &data ); + int padoption = data[1]; // e.g. " I" + + zc->SetZoneClearance( clearance ); + + switch( padoption ) + { + case 'I': + padoption = PAD_IN_ZONE; + break; + + case 'T': + padoption = THERMAL_PAD; + break; + + case 'X': + padoption = PAD_NOT_IN_ZONE; + break; + + default: + m_error.Printf( wxT( "Bad ZClearance padoption for CZONE_CONTAINER '%s'" ), zc->GetNetName().GetData() ); + THROW_IO_ERROR( m_error ); + } + + zc->SetPadOption( padoption ); + } + + else if( TESTLINE( "ZMinThickness" ) ) + { + char* data = line + SZ( "ZMinThickness" ); + BIU thickness = biuParse( data ); + + zc->SetMinThickness( thickness ); + } + + else if( TESTLINE( "$POLYSCORNERS" ) ) + { + // Read the PolysList (polygons used for fill areas in the zone) + + while( aReader->ReadLine() ) + { + line = aReader->Line(); + + if( TESTLINE( "$endPOLYSCORNERS" ) ) + break; + + // e.g. "39610 43440 0 0" + + const char* data = line; + + BIU x = biuParse( data, &data ); + BIU y = biuParse( data, &data ); + + bool end_contour = (data[1] == '1'); // end_countour was a bool when file saved, so '0' or '1' here + int utility = atoi( data + 3 ); + + zc->m_FilledPolysList.push_back( CPolyPt( x, y, end_contour, utility ) ); + } + } + + else if( TESTLINE( "$FILLSEGMENTS" ) ) + { + while( aReader->ReadLine() ) + { + line = aReader->Line(); + + if( TESTLINE( "$endFILLSEGMENTS" ) ) + break; + + const char* data = line; + + BIU sx = biuParse( data, &data ); + BIU sy = biuParse( data, &data ); + BIU ex = biuParse( data, &data ); + BIU ey = biuParse( data ); + + zc->m_FillSegmList.push_back( SEGMENT( + wxPoint( sx, sy ), + wxPoint( ex, ey ) ) ); + } + } + + else if( TESTLINE( "$endCZONE_OUTLINE" ) ) + { + // should always occur, but who knows, a zone without two corners + // is no zone at all, it's a spot? + + if( zc->GetNumCorners() > 2 ) + { + if( !zc->IsOnCopperLayer() ) + { + zc->SetFillMode( 0 ); + zc->SetNet( 0 ); + } + + // Set hatch here, when outlines corners are read + zc->m_Poly->SetHatch( outline_hatch ); + + m_board->Add( zc.release() ); + } + + return; // preferred exit + } + } + + THROW_IO_ERROR( wxT( "Missing '$endCZONE_OUTLINE'" ) ); +} + + +void KICAD_PLUGIN::loadDIMENSION() +{ + auto_ptr dim( new DIMENSION( m_board ) ); + + while( aReader->ReadLine() ) + { + const char* data; + char* line = aReader->Line(); + + if( TESTLINE( "$EndDIMENSION" ) ) + { + m_board->Add( dim.release(), ADD_APPEND ); + return; // preferred exit + } + + else if( TESTLINE( "Va" ) ) + { + BIU value = biuParse( line + SZ( "Va" ) ); + dim->m_Value = value; + } + + else if( TESTLINE( "Ge" ) ) + { + int layer; + long timestamp; + int shape; + + sscanf( line + SZ( "Ge" ), " %d %d %lX", &shape, &layer, ×tamp ); + + if( layer < FIRST_NO_COPPER_LAYER ) + layer = FIRST_NO_COPPER_LAYER; + + else if( layer > LAST_NO_COPPER_LAYER ) + layer = LAST_NO_COPPER_LAYER; + + dim->SetLayer( layer ); + dim->SetTimeStamp( timestamp ); + dim->m_Shape = shape; + } + + else if( TESTLINE( "Te" ) ) + { + char buf[2048]; + + ReadDelimitedText( buf, line + SZ( "Te" ), sizeof(buf) ); + dim->m_Text->SetText( FROM_UTF8( buf ) ); + } + + else if( TESTLINE( "Po" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d %d", &m_Text->m_Pos.x, &m_Text->m_Pos.y, + // &m_Text->m_Size.x, &m_Text->m_Size.y, &thickness, &orientation, &normal_display ); + + int normal_display = 1; + + BIU pos_x = biuParse( line + SZ( "Po" ), &data ); + BIU pos_y = biuParse( data, &data ); + BIU width = biuParse( data, &data ); + BIU height = biuParse( data, &data ); + BIU thickn = biuParse( data, &data ); + int orient = intParse( data, &data ); + + data = strtok( (char*) data, " \t\r\n" ); + if( data ) // optional from old days? + normal_display = intParse( data ); + + // This sets both DIMENSION's position and internal m_Text's. + // @todo: But why do we even know about internal m_Text? + dim->SetPosition( wxPoint( pos_x, pos_y ) ); + dim->SetTextSize( wxSize( width, height ) ); + + dim->m_Text->m_Mirror = normal_display ? false : true; + + dim->m_Text->SetThickness( thickn ); + dim->m_Text->SetOrientation( orient ); + } + + else if( TESTLINE( "Sb" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_crossBarOx, &m_crossBarOy, &m_crossBarFx, &m_crossBarFy, &m_Width ); + + int ignore = biuParse( line + SZ( "Sb" ), &data ); + BIU crossBarOx = biuParse( data, &data ); + BIU crossBarOy = biuParse( data, &data ); + BIU crossBarFx = biuParse( data, &data ); + BIU crossBarFy = biuParse( data, &data ); + BIU width = biuParse( data ); + + dim->m_crossBarOx = crossBarOx; + dim->m_crossBarOy = crossBarOy; + dim->m_crossBarFx = crossBarFx; + dim->m_crossBarFy = crossBarFy; + dim->m_Width = width; + (void) ignore; + } + + else if( TESTLINE( "Sd" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_featureLineDOx, &m_featureLineDOy, &m_featureLineDFx, &m_featureLineDFy, &Dummy ); + + int ignore = intParse( line + SZ( "Sd" ), &data ); + BIU featureLineDOx = biuParse( data, &data ); + BIU featureLineDOy = biuParse( data, &data ); + BIU featureLineDFx = biuParse( data, &data ); + BIU featureLineDFy = biuParse( data ); + + dim->m_featureLineDOx = featureLineDOx; + dim->m_featureLineDOy = featureLineDOy; + dim->m_featureLineDFx = featureLineDFx; + dim->m_featureLineDFy = featureLineDFy; + (void) ignore; + } + + else if( TESTLINE( "Sg" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_featureLineGOx, &m_featureLineGOy, &m_featureLineGFx, &m_featureLineGFy, &Dummy ); + + int ignore = intParse( line + SZ( "Sg" ), &data ); + BIU featureLineGOx = biuParse( data, &data ); + BIU featureLineGOy = biuParse( data, &data ); + BIU featureLineGFx = biuParse( data, &data ); + BIU featureLineGFy = biuParse( data ); + + dim->m_featureLineGOx = featureLineGOx; + dim->m_featureLineGOy = featureLineGOy; + dim->m_featureLineGFx = featureLineGFx; + dim->m_featureLineGFy = featureLineGFy; + (void) ignore; + } + + else if( TESTLINE( "S1" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_arrowD1Ox, &m_arrowD1Oy, &m_arrowD1Fx, &m_arrowD1Fy, &Dummy ); + + int ignore = intParse( line + SZ( "S1" ), &data ); + BIU arrowD10x = biuParse( data, &data ); + BIU arrowD10y = biuParse( data, &data ); + BIU arrowD1Fx = biuParse( data, &data ); + BIU arrowD1Fy = biuParse( data ); + + dim->m_arrowD1Ox = arrowD10x; + dim->m_arrowD1Oy = arrowD10y; + dim->m_arrowD1Fx = arrowD1Fx; + dim->m_arrowD1Fy = arrowD1Fy; + (void) ignore; + } + + else if( TESTLINE( "S2" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_arrowD2Ox, &m_arrowD2Oy, &m_arrowD2Fx, &m_arrowD2Fy, &Dummy ); + + int ignore = intParse( line + SZ( "S2" ), &data ); + BIU arrowD2Ox = biuParse( data, &data ); + BIU arrowD2Oy = biuParse( data, &data ); + BIU arrowD2Fx = biuParse( data, &data ); + BIU arrowD2Fy = biuParse( data, &data ); + + dim->m_arrowD2Ox = arrowD2Ox; + dim->m_arrowD2Oy = arrowD2Oy; + dim->m_arrowD2Fx = arrowD2Fx; + dim->m_arrowD2Fy = arrowD2Fy; + (void) ignore; + } + + else if( TESTLINE( "S3" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d\n", &Dummy, &m_arrowG1Ox, &m_arrowG1Oy, &m_arrowG1Fx, &m_arrowG1Fy, &Dummy ); + int ignore = intParse( line + SZ( "S3" ), &data ); + BIU arrowG1Ox = biuParse( data, &data ); + BIU arrowG1Oy = biuParse( data, &data ); + BIU arrowG1Fx = biuParse( data, &data ); + BIU arrowG1Fy = biuParse( data, &data ); + + dim->m_arrowG1Ox = arrowG1Ox; + dim->m_arrowG1Oy = arrowG1Oy; + dim->m_arrowG1Fx = arrowG1Fx; + dim->m_arrowG1Fy = arrowG1Fy; + (void) ignore; + } + + else if( TESTLINE( "S4" ) ) + { + // sscanf( Line + 2, " %d %d %d %d %d %d", &Dummy, &m_arrowG2Ox, &m_arrowG2Oy, &m_arrowG2Fx, &m_arrowG2Fy, &Dummy ); + int ignore = intParse( line + SZ( "S4" ), &data ); + BIU arrowG2Ox = biuParse( data, &data ); + BIU arrowG2Oy = biuParse( data, &data ); + BIU arrowG2Fx = biuParse( data, &data ); + BIU arrowG2Fy = biuParse( data, &data ); + + dim->m_arrowG2Ox = arrowG2Ox; + dim->m_arrowG2Oy = arrowG2Oy; + dim->m_arrowG2Fx = arrowG2Fx; + dim->m_arrowG2Fy = arrowG2Fy; + (void) ignore; + } + } + + THROW_IO_ERROR( wxT( "Missing '$EndDIMENSION'" ) ); } @@ -1430,9 +1909,17 @@ BIU KICAD_PLUGIN::biuParse( const char* aValue, const char** nptrptr ) double fval = strtod( aValue, &nptr ); - if( errno || aValue == nptr ) + if( errno ) { - m_error.Printf( _( "invalid float number in file: '%s' line: %d" ), + m_error.Printf( _( "invalid float number in file: '%s' on line: %d" ), + aReader->GetSource().GetData(), aReader->LineNumber() ); + + THROW_IO_ERROR( m_error ); + } + + if( aValue == nptr ) + { + m_error.Printf( _( "missing float number in file: '%s' on line: %d" ), aReader->GetSource().GetData(), aReader->LineNumber() ); THROW_IO_ERROR( m_error ); diff --git a/pcbnew/kicad_plugin.h b/pcbnew/kicad_plugin.h index b9f8bb2887..bdc65344c8 100644 --- a/pcbnew/kicad_plugin.h +++ b/pcbnew/kicad_plugin.h @@ -112,17 +112,25 @@ protected: /** * Function loadTrackList - * reads a list of segments (Tracks and Vias) + * reads a list of segments (Tracks and Vias, or Segzones) + * + * @param aInsertBeforeMe may be either NULL indicating append, or it may + * be an insertion point before which all the segments are inserted. + * + * @param aStructType is either PCB_TRACE_T to indicate tracks and vias, or + * PCB_ZONE_T to indicate oldschool zone segments (before polygons came to be). */ - void loadTrackList( TRACK* aInsertBeforeMe, int aStructType, int aSegCount ); + void loadTrackList( TRACK* aInsertBeforeMe, int aStructType ); + + void loadZONE_CONTAINER(); // "$CZONE_OUTLINE" + + void loadDIMENSION(); // "$COTATION" /* @todo void load( PCB_TARGET* me ); void load( NETINFO* me ); void load( TRACK* me ); - void load( ZONE_CONTAINER* me ); - void load( DIMENSION* me ); */ // void load( SEGZONE* me ); diff --git a/pcbnew/zones_by_polygon.cpp b/pcbnew/zones_by_polygon.cpp index fcd367fc91..6bf1b47102 100644 --- a/pcbnew/zones_by_polygon.cpp +++ b/pcbnew/zones_by_polygon.cpp @@ -480,9 +480,9 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC ) } wxGetApp().m_EDA_Config->Read( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, - &g_Zone_Default_Setting.m_ThermalReliefGapValue ); + &g_Zone_Default_Setting.m_ThermalReliefGap ); wxGetApp().m_EDA_Config->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, - &g_Zone_Default_Setting.m_ThermalReliefCopperBridgeValue ); + &g_Zone_Default_Setting.m_ThermalReliefCopperBridge ); g_Zone_Default_Setting.m_CurrentZone_Layer = zone->GetLayer(); DIALOG_COPPER_ZONE* frame = new DIALOG_COPPER_ZONE( this, &g_Zone_Default_Setting ); diff --git a/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp b/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp index 459d67885b..dc436ba952 100644 --- a/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp +++ b/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp @@ -342,13 +342,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) if( pad->GetNet() != GetNet() ) continue; item_boundingbox = pad->GetBoundingBox(); - item_boundingbox.Inflate( m_ThermalReliefGapValue, m_ThermalReliefGapValue ); + item_boundingbox.Inflate( m_ThermalReliefGap, m_ThermalReliefGap ); if( item_boundingbox.Intersects( zone_boundingbox ) ) { CreateThermalReliefPadPolygon( cornerBufferPolysToSubstract, - *pad, m_ThermalReliefGapValue, - m_ThermalReliefCopperBridgeValue, + *pad, m_ThermalReliefGap, + m_ThermalReliefCopperBridge, m_ZoneMinThickness, s_CircleToSegmentsCount, s_Correction, s_thermalRot ); diff --git a/pcbnew/zones_convert_to_polygons_aux_functions.cpp b/pcbnew/zones_convert_to_polygons_aux_functions.cpp index e23707786f..c90065532f 100644 --- a/pcbnew/zones_convert_to_polygons_aux_functions.cpp +++ b/pcbnew/zones_convert_to_polygons_aux_functions.cpp @@ -49,7 +49,7 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector& aCornerBuffe int pen_radius = aZone->m_ZoneMinThickness / 2; // Calculate thermal bridge half width - int thermbridgeWidth = aZone->m_ThermalReliefCopperBridgeValue / 2; + int thermbridgeWidth = aZone->m_ThermalReliefCopperBridge / 2; for( MODULE* module = aPcb->m_Modules; module; module = module->Next() ) { for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() ) @@ -61,17 +61,17 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector& aCornerBuffe continue; item_boundingbox = pad->GetBoundingBox(); - item_boundingbox.Inflate( aZone->m_ThermalReliefGapValue ); + item_boundingbox.Inflate( aZone->m_ThermalReliefGap ); if( !( item_boundingbox.Intersects( zone_boundingbox ) ) ) continue; // Thermal bridges are like a segment from a starting point inside the pad // to an ending point outside the pad wxPoint startpoint, endpoint; - endpoint.x = ( pad->m_Size.x / 2 ) + aZone->m_ThermalReliefGapValue; - endpoint.y = ( pad->m_Size.y / 2 ) + aZone->m_ThermalReliefGapValue; + endpoint.x = ( pad->m_Size.x / 2 ) + aZone->m_ThermalReliefGap; + endpoint.y = ( pad->m_Size.y / 2 ) + aZone->m_ThermalReliefGap; - int copperThickness = aZone->m_ThermalReliefCopperBridgeValue - aZone->m_ZoneMinThickness; + int copperThickness = aZone->m_ThermalReliefCopperBridge - aZone->m_ZoneMinThickness; if( copperThickness < 0 ) copperThickness = 0; diff --git a/pcbnew/zones_functions_for_undo_redo.cpp b/pcbnew/zones_functions_for_undo_redo.cpp index b836664759..c47d71ca7b 100644 --- a/pcbnew/zones_functions_for_undo_redo.cpp +++ b/pcbnew/zones_functions_for_undo_redo.cpp @@ -86,10 +86,10 @@ bool ZONE_CONTAINER::IsSame( const ZONE_CONTAINER& aZoneToCompare ) if( m_PadOption != aZoneToCompare.m_PadOption ) return false; - if( m_ThermalReliefGapValue != aZoneToCompare.m_ThermalReliefGapValue ) + if( m_ThermalReliefGap != aZoneToCompare.m_ThermalReliefGap ) return false; - if( m_ThermalReliefCopperBridgeValue != aZoneToCompare.m_ThermalReliefCopperBridgeValue ) + if( m_ThermalReliefCopperBridge != aZoneToCompare.m_ThermalReliefCopperBridge ) return false; // Compare outlines diff --git a/polygon/PolyLine.h b/polygon/PolyLine.h index 62c3f777ee..73b2bb9cc3 100644 --- a/polygon/PolyLine.h +++ b/polygon/PolyLine.h @@ -97,8 +97,9 @@ public: class CPolyPt { public: - CPolyPt( int qx = 0, int qy = 0, bool qf = false ) - { x = qx; y = qy; end_contour = qf; utility = 0; }; + CPolyPt( int qx = 0, int qy = 0, bool qf = false, int aUtility = 0 ) + { x = qx; y = qy; end_contour = qf; utility = aUtility; }; + int x; int y; bool end_contour;