diff --git a/include/eda_text.h b/include/eda_text.h index ad44c3e48e..26ad50f095 100644 --- a/include/eda_text.h +++ b/include/eda_text.h @@ -27,12 +27,13 @@ * @brief Definition of base KiCad text object. */ -#ifndef _EDA_TEXT_H_ -#define _EDA_TEXT_H_ +#ifndef EDA_TEXT_H_ +#define EDA_TEXT_H_ -#include // wxStringSplit -#include // EDA_DRAW_MODE_T -#include // EDA_RECT +#include // NORMALIZE_ANGLE_POS( angle ); +#include // wxStringSplit +#include // EDA_DRAW_MODE_T +#include // EDA_RECT // Graphic Text justify: @@ -50,6 +51,7 @@ enum EDA_TEXT_VJUSTIFY_T { GR_TEXT_VJUSTIFY_BOTTOM = 1 }; + /* Options to show solid segments (segments, texts...) */ enum EDA_DRAW_MODE_T { LINE = 0, // segments are drawn as lines @@ -105,25 +107,29 @@ public: * returns text thickness. * @return int - text thickness. */ - int GetThickness() const { return m_Thickness; }; + int GetThickness() const { return m_Thickness; }; - void SetOrientation( double aOrientation ) { m_Orient = aOrientation; } - double GetOrientation() const { return m_Orient; } + void SetOrientation( double aOrientation ) + { + NORMALIZE_ANGLE_POS( aOrientation ); + m_Orient = aOrientation; + } + double GetOrientation() const { return m_Orient; } - void SetItalic( bool isItalic ) { m_Italic = isItalic; } - bool IsItalic() const { return m_Italic; } + void SetItalic( bool isItalic ) { m_Italic = isItalic; } + bool IsItalic() const { return m_Italic; } - void SetBold( bool aBold ) { m_Bold = aBold; } - bool IsBold() const { return m_Bold; } + void SetBold( bool aBold ) { m_Bold = aBold; } + bool IsBold() const { return m_Bold; } void SetVisible( bool aVisible ) { ( aVisible ) ? m_Attributs &= ~TEXT_NO_VISIBLE : m_Attributs |= TEXT_NO_VISIBLE; } - bool IsVisible() const { return !( m_Attributs & TEXT_NO_VISIBLE ); } + bool IsVisible() const { return !( m_Attributs & TEXT_NO_VISIBLE ); } void SetMirrored( bool isMirrored ) { m_Mirror = isMirrored; } - bool IsMirrored() const { return m_Mirror; } + bool IsMirrored() const { return m_Mirror; } bool IsDefaultFormatting() const; @@ -139,7 +145,7 @@ public: * returns text size. * @return wxSize - text size. */ - const wxSize GetSize() const { return m_Size; }; + const wxSize GetSize() const { return m_Size; }; /// named differently than the ones using multiple inheritance and including this class void SetPos( const wxPoint& aPoint ) { m_Pos = aPoint; } @@ -260,10 +266,11 @@ public: */ virtual const wxString GetText() const { return m_Text; } - EDA_TEXT_HJUSTIFY_T GetHorizJustify() const { return m_HJustify; }; - EDA_TEXT_VJUSTIFY_T GetVertJustify() const { return m_VJustify; }; - void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; }; - void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; }; + EDA_TEXT_HJUSTIFY_T GetHorizJustify() const { return m_HJustify; }; + EDA_TEXT_VJUSTIFY_T GetVertJustify() const { return m_VJustify; }; + + void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; }; + void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; }; /** * Function Format @@ -280,4 +287,4 @@ public: }; -#endif // _EDA_TEXT_H_ +#endif // EDA_TEXT_H_ diff --git a/pcbnew/class_text_mod.cpp b/pcbnew/class_text_mod.cpp index 67837dcff6..08eba81dd3 100644 --- a/pcbnew/class_text_mod.cpp +++ b/pcbnew/class_text_mod.cpp @@ -129,7 +129,6 @@ void TEXTE_MODULE::SetDrawCoord() return; double angle = module->GetOrientation(); - NORMALIZE_ANGLE_POS( angle ); RotatePoint( &m_Pos.x, &m_Pos.y, angle ); m_Pos += module->GetPosition(); @@ -151,7 +150,6 @@ void TEXTE_MODULE::SetLocalCoord() m_Pos0 = m_Pos - module->m_Pos; int angle = module->m_Orient; - NORMALIZE_ANGLE_POS( angle ); RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle ); } diff --git a/pcbnew/eagle_plugin.cpp b/pcbnew/eagle_plugin.cpp index 8dadd38609..69ad4c9415 100644 --- a/pcbnew/eagle_plugin.cpp +++ b/pcbnew/eagle_plugin.cpp @@ -1688,10 +1688,7 @@ void EAGLE_PLUGIN::orientModuleText( MODULE* m, const EELEMENT& e, if( a.x && a.y ) // boost::optional { wxPoint pos( kicad_x( *a.x ), kicad_y( *a.y ) ); - wxPoint pos0 = pos - m->GetPosition(); - txt->SetPosition( pos ); - txt->SetPos0( pos0 ); } // Even though size and ratio are both optional, I am not seeing @@ -1786,6 +1783,8 @@ void EAGLE_PLUGIN::orientModuleText( MODULE* m, const EELEMENT& e, txt->SetVertJustify( GR_TEXT_VJUSTIFY_TOP ); } } + + txt->SetLocalCoord(); } diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp index 65ed37e26e..9ea21de65c 100644 --- a/pcbnew/legacy_plugin.cpp +++ b/pcbnew/legacy_plugin.cpp @@ -150,6 +150,52 @@ static inline unsigned ReadLine( LINE_READER* rdr, const char* caller ) using namespace std; // auto_ptr + +static inline const char* ShowVertJustify( EDA_TEXT_VJUSTIFY_T vertical ) +{ + const char* rs; + switch( vertical ) + { + case GR_TEXT_VJUSTIFY_TOP: rs = "T"; break; + case GR_TEXT_VJUSTIFY_CENTER: rs = "C"; break; + case GR_TEXT_VJUSTIFY_BOTTOM: rs = "B"; break; + default: rs = "?"; break; + } + return rs; +} + +static inline const char* ShowHorizJustify( EDA_TEXT_HJUSTIFY_T horizontal ) +{ + const char* rs; + switch( horizontal ) + { + case GR_TEXT_HJUSTIFY_LEFT: rs = "L"; break; + case GR_TEXT_HJUSTIFY_CENTER: rs = "C"; break; + case GR_TEXT_HJUSTIFY_RIGHT: rs = "R"; break; + default: rs = "?"; break; + } + return rs; +} + +static inline EDA_TEXT_HJUSTIFY_T HorizJustify( const char* horizontal ) +{ + if( !strcmp( "L", horizontal ) ) + return GR_TEXT_HJUSTIFY_LEFT; + if( !strcmp( "R", horizontal ) ) + return GR_TEXT_HJUSTIFY_RIGHT; + return GR_TEXT_HJUSTIFY_CENTER; +} + +static inline EDA_TEXT_VJUSTIFY_T VertJustify( const char* vertical ) +{ + if( !strcmp( "T", vertical ) ) + return GR_TEXT_VJUSTIFY_TOP; + if( !strcmp( "B", vertical ) ) + return GR_TEXT_VJUSTIFY_BOTTOM; + return GR_TEXT_VJUSTIFY_CENTER; +} + + /** * Function intParse * parses an ASCII integer string with possible leading whitespace into @@ -1457,10 +1503,12 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule ) void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText ) { const char* data; - char* line = m_reader->Line(); // current (old) line + const char* txt_end; + const char* line = m_reader->Line(); // current (old) line - // sscanf( line + 1, "%d %d %d %d %d %d %d %s %s %d %s", &type, &m_Pos0.x, &m_Pos0.y, &m_Size.y, &m_Size.x, - // &m_Orient, &m_Thickness, BufCar1, BufCar2, &layer, BufCar3 ) >= 10 ) + // sscanf( line + 1, "%d %d %d %d %d %d %d %s %s %d %s", + // &type, &m_Pos0.x, &m_Pos0.y, &m_Size.y, &m_Size.x, + // &m_Orient, &m_Thickness, BufCar1, BufCar2, &layer, BufCar3 ) >= 10 ) // e.g. "T1 6940 -16220 350 300 900 60 M I 20 N "CFCARD"\r\n" // or T1 0 500 600 400 900 80 M V 20 N"74LS245" @@ -1481,7 +1529,15 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText ) // convert the "quoted, escaped, UTF8, text" to a wxString, find it by skipping // as far forward as needed until the first double quote. - ReadDelimitedText( &m_field, data ); + txt_end = data + ReadDelimitedText( &m_field, data ); + +#if 1 && defined(DEBUG) + if( m_field == wxT( "ARM_C8" ) ) + { + int breakhere = 1; + (void) breakhere; + } +#endif aText->SetText( m_field ); @@ -1493,29 +1549,17 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText ) int layer = tmp ? intParse( tmp ) : SILKSCREEN_N_FRONT; char* italic = strtok( NULL, delims ); + char* hjust = strtok( (char*) txt_end, delims ); + char* vjust = strtok( NULL, delims ); + if( type != TEXT_is_REFERENCE && type != TEXT_is_VALUE ) type = TEXT_is_DIVERS; aText->SetType( type ); aText->SetPos0( wxPoint( pos0_x, pos0_y ) ); - - /* @todo move to accessor? cannot reach these defines from here - pcbnew.h off limit because of globals in there - // Test for a reasonable size: - if( size0_x < TEXTS_MIN_SIZE ) - size0_x = TEXTS_MIN_SIZE; - if( size0_y < TEXTS_MIN_SIZE ) - size0_y = TEXTS_MIN_SIZE; - */ - aText->SetSize( wxSize( size0_x, size0_y ) ); - // Due to the Pcbnew history, .m_Orient is saved in screen value - // but it is handled as relative to its parent footprint - - // @todo is there now an opportunity for a better way as we move to degrees and - // a new file format? orient -= ( (MODULE*) aText->GetParent() )->GetOrientation(); aText->SetOrientation( orient ); @@ -1537,11 +1581,17 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText ) aText->SetItalic( italic && *italic == 'I' ); + if( hjust ) + aText->SetHorizJustify( HorizJustify( hjust ) ); + + if( vjust ) + aText->SetVertJustify( VertJustify( vjust ) ); + if( layer < 0 ) layer = 0; - if( layer > LAST_NO_COPPER_LAYER ) + else if( layer > LAST_NO_COPPER_LAYER ) layer = LAST_NO_COPPER_LAYER; - if( layer == LAYER_N_BACK ) + else if( layer == LAYER_N_BACK ) layer = SILKSCREEN_N_BACK; else if( layer == LAYER_N_FRONT ) layer = SILKSCREEN_N_FRONT; @@ -1851,29 +1901,22 @@ void LEGACY_PLUGIN::loadPCB_TEXT() time_t timestamp = hexParse( data, &data ); char* style = strtok( (char*) data, delims ); char* hJustify = strtok( NULL, delims ); + char* vJustify = strtok( NULL, delims ); pcbtxt->SetMirrored( !notMirrored ); pcbtxt->SetTimeStamp( timestamp ); pcbtxt->SetItalic( !strcmp( style, "Italic" ) ); - EDA_TEXT_HJUSTIFY_T hj; - if( hJustify ) - { - switch( *hJustify ) - { - default: - case 'C': hj = GR_TEXT_HJUSTIFY_CENTER; break; - case 'L': hj = GR_TEXT_HJUSTIFY_LEFT; break; - case 'R': hj = GR_TEXT_HJUSTIFY_RIGHT; break; - } - } + pcbtxt->SetHorizJustify( HorizJustify( hJustify ) ); else { - hj = GR_TEXT_HJUSTIFY_CENTER; + // boom, somebody changed a constructor, I was relying on this: + wxASSERT( pcbtxt->GetHorizJustify() == GR_TEXT_HJUSTIFY_CENTER ); } - pcbtxt->SetHorizJustify( hj ); + if( vJustify ) + pcbtxt->SetVertJustify( VertJustify( vJustify ) ); if( layer < FIRST_COPPER_LAYER ) layer = FIRST_COPPER_LAYER; @@ -3133,14 +3176,13 @@ void LEGACY_PLUGIN::saveMODULE_TEXT( const TEXTE_MODULE* me ) const wxString txt = me->GetText(); - fprintf( m_fp, "T%d %s %s %s %s %c %c %d %c %s\n", + fprintf( m_fp, "T%d %s %s %s %s %c %c %d %c %s", me->GetType(), fmtBIUPoint( me->GetPos0() ).c_str(), // m_Pos0.x, m_Pos0.y, -#if 0 - fmtBIUSize( me->GetSize() ).c_str(), // m_Size.y, m_Size.x, -#else - fmtBIUPair( me->GetSize().y, me->GetSize().x ).c_str(), // m_Size.y, m_Size.x, -#endif + + // legacy has goofed reversed order: ( y, x ) + fmtBIUPair( me->GetSize().y, me->GetSize().x ).c_str(), + fmtDEG( orient ).c_str(), fmtBIU( me->GetThickness() ).c_str(), // m_Thickness, me->IsMirrored() ? 'M' : 'N', @@ -3150,6 +3192,17 @@ void LEGACY_PLUGIN::saveMODULE_TEXT( const TEXTE_MODULE* me ) const EscapedUTF8( txt ).c_str() ); + if( me->GetHorizJustify() != GR_TEXT_HJUSTIFY_CENTER || + me->GetVertJustify() != GR_TEXT_VJUSTIFY_CENTER ) + { + fprintf( m_fp, " %s %s\n", + ShowHorizJustify( me->GetHorizJustify() ), + ShowVertJustify( me->GetVertJustify() ) + ); + } + else + fprintf( m_fp, "\n" ); + CHECK_WRITE_ERROR(); } @@ -3751,22 +3804,22 @@ void LEGACY_PLUGIN::savePCB_TEXT( const TEXTE_PCB* me ) const fmtBIU( me->GetThickness() ).c_str(), fmtDEG( me->GetOrientation() ).c_str() ); - char hJustify; - - switch( me->GetHorizJustify() ) - { - default: - case GR_TEXT_HJUSTIFY_CENTER: hJustify = 'C'; break; - case GR_TEXT_HJUSTIFY_LEFT: hJustify = 'L'; break; - case GR_TEXT_HJUSTIFY_RIGHT: hJustify = 'R'; break; - } - - fprintf( m_fp, "De %d %d %lX %s %c\n", + fprintf( m_fp, "De %d %d %lX %s", me->GetLayer(), !me->IsMirrored(), me->GetTimeStamp(), - me->IsItalic() ? "Italic" : "Normal", - hJustify ); + me->IsItalic() ? "Italic" : "Normal" ); + + if( me->GetHorizJustify() != GR_TEXT_HJUSTIFY_CENTER || + me->GetVertJustify() != GR_TEXT_VJUSTIFY_CENTER ) + { + fprintf( m_fp, " %s %s\n", + ShowHorizJustify( me->GetHorizJustify() ), + ShowVertJustify( me->GetVertJustify() ) + ); + } + else + fprintf( m_fp, "\n" ); fprintf( m_fp, "$EndTEXTPCB\n" ); }