Loading common/eda_text.cpp +49 −36 Original line number Diff line number Diff line Loading @@ -265,8 +265,38 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, { if( m_MultilineAllowed ) { std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( m_Text, '\n' ); positions.reserve( list->Count() ); GetPositionsOfLinesOfMultilineText(positions, list->Count() ); for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString& txt = list->Item( ii ); drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, txt, positions[ii] ); } delete (list); } else drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, m_Text, m_Pos ); // Draw text anchor, if requested if( aAnchor_color != UNSPECIFIED_COLOR ) { GRDrawAnchor( aClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y, DIM_ANCRE_TEXTE, aAnchor_color ); } } void EDA_TEXT::GetPositionsOfLinesOfMultilineText( std::vector<wxPoint>& aPositions, int aLineCount ) { wxPoint pos = m_Pos; // Position of first line of the // multiline text according to // the center of the multiline text block Loading @@ -276,7 +306,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, offset.y = GetInterline(); #ifdef FIX_MULTILINE_VERT_JUSTIF if( list->Count() > 1 ) if( aLineCount > 1 ) { switch( m_VJustify ) { Loading @@ -284,11 +314,11 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, break; case GR_TEXT_VJUSTIFY_CENTER: pos.y -= ( list->Count() - 1 ) * offset.y / 2; pos.y -= ( aLineCount - 1 ) * offset.y / 2; break; case GR_TEXT_VJUSTIFY_BOTTOM: pos.y -= ( list->Count() - 1 ) * offset.y; pos.y -= ( aLineCount - 1 ) * offset.y; break; } } Loading @@ -300,29 +330,12 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, // Rotate the offset lines to increase happened in the right direction RotatePoint( &offset, m_Orient ); for( unsigned i = 0; i<list->Count(); i++ ) for( int ii = 0; ii < aLineCount; ii++ ) { wxString txt = list->Item( i ); drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, txt, pos ); aPositions.push_back( pos ); pos += offset; } delete (list); } else drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, m_Text, m_Pos ); // Draw text anchor, if requested if( aAnchor_color != UNSPECIFIED_COLOR ) { GRDrawAnchor( aClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y, DIM_ANCRE_TEXTE, aAnchor_color ); } } void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, EDA_COLOR_T aColor, Loading eeschema/sch_text.cpp +6 −9 Original line number Diff line number Diff line Loading @@ -673,20 +673,17 @@ void SCH_TEXT::Plot( PLOTTER* aPlotter ) if( m_MultilineAllowed ) { wxPoint pos = textpos; std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( m_Text, '\n' ); wxPoint offset; positions.reserve( list->Count() ); offset.y = GetInterline(); GetPositionsOfLinesOfMultilineText(positions, list->Count() ); RotatePoint( &offset, m_Orient ); for( unsigned i = 0; i<list->Count(); i++ ) for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( i ); aPlotter->Text( pos, color, txt, m_Orient, m_Size, m_HJustify, wxString& txt = list->Item( ii ); aPlotter->Text( positions[ii], color, txt, m_Orient, m_Size, m_HJustify, m_VJustify, thickness, m_Italic, m_Bold ); pos += offset; } delete (list); Loading include/eda_text.h +11 −0 Original line number Diff line number Diff line Loading @@ -265,6 +265,17 @@ public: void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; }; void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; }; /** * Function GetPositionsOfLinesOfMultilineText * Populates aPositions with the position of each line of * a multiline text, according to the vertical justification and the * rotation of the whole text * @param aPositions is the list to populate by the wxPoint positions * @param aLineCount is the number of lines (not recalculated here * for efficiency reasons */ void GetPositionsOfLinesOfMultilineText( std::vector<wxPoint>& aPositions, int aLineCount ); /** * Function Format * outputs the object to \a aFormatter in s-expression form. Loading pcbnew/plot_brditems_plotter.cpp +6 −8 Original line number Diff line number Diff line Loading @@ -477,20 +477,18 @@ void BRDITEMS_PLOTTER::PlotTextePcb( TEXTE_PCB* pt_texte ) if( pt_texte->IsMultilineAllowed() ) { std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( pt_texte->GetText(), '\n' ); wxPoint offset; positions.reserve( list->Count() ); offset.y = pt_texte->GetInterline(); pt_texte->GetPositionsOfLinesOfMultilineText( positions, list->Count() ); RotatePoint( &offset, orient ); for( unsigned i = 0; i < list->Count(); i++ ) for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( i ); m_plotter->Text( pos, UNSPECIFIED_COLOR, txt, orient, size, wxString& txt = list->Item( ii ); m_plotter->Text( positions[ii], UNSPECIFIED_COLOR, txt, orient, size, pt_texte->GetHorizJustify(), pt_texte->GetVertJustify(), thickness, pt_texte->IsItalic(), allow_bold ); pos += offset; } delete list; Loading Loading
common/eda_text.cpp +49 −36 Original line number Diff line number Diff line Loading @@ -265,8 +265,38 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, { if( m_MultilineAllowed ) { std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( m_Text, '\n' ); positions.reserve( list->Count() ); GetPositionsOfLinesOfMultilineText(positions, list->Count() ); for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString& txt = list->Item( ii ); drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, txt, positions[ii] ); } delete (list); } else drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, m_Text, m_Pos ); // Draw text anchor, if requested if( aAnchor_color != UNSPECIFIED_COLOR ) { GRDrawAnchor( aClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y, DIM_ANCRE_TEXTE, aAnchor_color ); } } void EDA_TEXT::GetPositionsOfLinesOfMultilineText( std::vector<wxPoint>& aPositions, int aLineCount ) { wxPoint pos = m_Pos; // Position of first line of the // multiline text according to // the center of the multiline text block Loading @@ -276,7 +306,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, offset.y = GetInterline(); #ifdef FIX_MULTILINE_VERT_JUSTIF if( list->Count() > 1 ) if( aLineCount > 1 ) { switch( m_VJustify ) { Loading @@ -284,11 +314,11 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, break; case GR_TEXT_VJUSTIFY_CENTER: pos.y -= ( list->Count() - 1 ) * offset.y / 2; pos.y -= ( aLineCount - 1 ) * offset.y / 2; break; case GR_TEXT_VJUSTIFY_BOTTOM: pos.y -= ( list->Count() - 1 ) * offset.y; pos.y -= ( aLineCount - 1 ) * offset.y; break; } } Loading @@ -300,29 +330,12 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, // Rotate the offset lines to increase happened in the right direction RotatePoint( &offset, m_Orient ); for( unsigned i = 0; i<list->Count(); i++ ) for( int ii = 0; ii < aLineCount; ii++ ) { wxString txt = list->Item( i ); drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, txt, pos ); aPositions.push_back( pos ); pos += offset; } delete (list); } else drawOneLineOfText( aClipBox, aDC, aOffset, aColor, aDrawMode, aFillMode, m_Text, m_Pos ); // Draw text anchor, if requested if( aAnchor_color != UNSPECIFIED_COLOR ) { GRDrawAnchor( aClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y, DIM_ANCRE_TEXTE, aAnchor_color ); } } void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset, EDA_COLOR_T aColor, Loading
eeschema/sch_text.cpp +6 −9 Original line number Diff line number Diff line Loading @@ -673,20 +673,17 @@ void SCH_TEXT::Plot( PLOTTER* aPlotter ) if( m_MultilineAllowed ) { wxPoint pos = textpos; std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( m_Text, '\n' ); wxPoint offset; positions.reserve( list->Count() ); offset.y = GetInterline(); GetPositionsOfLinesOfMultilineText(positions, list->Count() ); RotatePoint( &offset, m_Orient ); for( unsigned i = 0; i<list->Count(); i++ ) for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( i ); aPlotter->Text( pos, color, txt, m_Orient, m_Size, m_HJustify, wxString& txt = list->Item( ii ); aPlotter->Text( positions[ii], color, txt, m_Orient, m_Size, m_HJustify, m_VJustify, thickness, m_Italic, m_Bold ); pos += offset; } delete (list); Loading
include/eda_text.h +11 −0 Original line number Diff line number Diff line Loading @@ -265,6 +265,17 @@ public: void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; }; void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; }; /** * Function GetPositionsOfLinesOfMultilineText * Populates aPositions with the position of each line of * a multiline text, according to the vertical justification and the * rotation of the whole text * @param aPositions is the list to populate by the wxPoint positions * @param aLineCount is the number of lines (not recalculated here * for efficiency reasons */ void GetPositionsOfLinesOfMultilineText( std::vector<wxPoint>& aPositions, int aLineCount ); /** * Function Format * outputs the object to \a aFormatter in s-expression form. Loading
pcbnew/plot_brditems_plotter.cpp +6 −8 Original line number Diff line number Diff line Loading @@ -477,20 +477,18 @@ void BRDITEMS_PLOTTER::PlotTextePcb( TEXTE_PCB* pt_texte ) if( pt_texte->IsMultilineAllowed() ) { std::vector<wxPoint> positions; wxArrayString* list = wxStringSplit( pt_texte->GetText(), '\n' ); wxPoint offset; positions.reserve( list->Count() ); offset.y = pt_texte->GetInterline(); pt_texte->GetPositionsOfLinesOfMultilineText( positions, list->Count() ); RotatePoint( &offset, orient ); for( unsigned i = 0; i < list->Count(); i++ ) for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( i ); m_plotter->Text( pos, UNSPECIFIED_COLOR, txt, orient, size, wxString& txt = list->Item( ii ); m_plotter->Text( positions[ii], UNSPECIFIED_COLOR, txt, orient, size, pt_texte->GetHorizJustify(), pt_texte->GetVertJustify(), thickness, pt_texte->IsItalic(), allow_bold ); pos += offset; } delete list; Loading