Commit 5759f734 authored by charras's avatar charras

Rework on TEXTE_PCB, SCH_TEXT and EDA_TextStruct classes.

Code seriously cleaned, obscure and duplicated code removed, and some oddities removed.
Better support of multiline texts.
parent 804e5397
......@@ -4,6 +4,17 @@ KiCad ChangeLog 2009
Please add newer entries at the top, list the date and your name with
email address.
2009-may-12 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++All:
Rework on TEXTE_PCB, SCH_TEXT and EDA_TextStruct classes.
Code seriously cleaned, obscure and duplicated code removed,
and some oddities removed ( like different .m_Orient values in eeschema and
pcbnew, for the same text orientation )
Multiline texts (in comments and Pcb texts) are now supported.
In pcbnew text justifications could work (but not yet used and tested)
2009-may-01 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++pcbnew:
......
......@@ -254,8 +254,8 @@ EDA_Rect EDA_TextStruct::GetTextBox( int aLine )
rect.SetSize( textsize );
/* Now, calculate the rect origin, according to text justification
* At this point the area origin is the text origin.
* This is true only for left and top text justified.
* At this point the area origin is the text origin (m_Pos).
* This is true only for left and top text justified texts.
* and must be recalculated for others justifications
* also, note the V justification is relative to the first line
*/
......@@ -284,7 +284,7 @@ EDA_Rect EDA_TextStruct::GetTextBox( int aLine )
break;
case GR_TEXT_VJUSTIFY_BOTTOM:
rect.SetY( rect.GetY() + (dy / 2) );
rect.SetY( rect.GetY() - dy );
break;
}
......
......@@ -20,6 +20,14 @@
#define EDA_DRAWBASE
#include "grfonte.h"
/* Functions to draw / plot a string.
* texts have only one line.
* They can be in italic.
* Horizontal and Vertical justification are handled.
* Texts can be rotated
* substrings between ~ markers can be "negated" (i.e. with an over bar
*/
/** Function NegableTextLength
* Return the text length of a negable string, excluding the ~ markers */
int NegableTextLength( const wxString& aText )
......@@ -48,7 +56,7 @@ static void DrawGraphicTextPline(
bool sketch_mode,
int point_count,
wxPoint* coord,
void (* aCallback)(int x0, int y0, int xf, int yf) )
void (*aCallback)( int x0, int y0, int xf, int yf ) )
{
if( aCallback )
{
......@@ -107,7 +115,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
int aWidth,
bool aItalic,
bool aNegable,
void (* aCallback)(int x0, int y0, int xf, int yf) )
void (*aCallback)( int x0, int y0, int xf, int yf ) )
/****************************************************************************************************/
{
int char_count, AsciiCode;
......@@ -116,10 +124,9 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
SH_CODE f_cod, plume = 'U';
const SH_CODE* ptcar;
int ptr;
int ux0, uy0, dx, dy; // Draw coordinate for segments to draw. also used in some other calculation
int cX, cY; // Texte center
int ox, oy; // Draw coordinates for the current char
int overbar_x, overbar_y; // Start point for the current overbar
int dx, dy; // Draw coordinate for segments to draw. also used in some other calculation
wxPoint current_char_pos; // Draw coordinates for the current char
wxPoint overbar_pos; // Start point for the current overbar
int overbars; // Number of ~ seen
#define BUF_SIZE 100
......@@ -156,8 +163,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
else
pitch -= thickness;
ox = cX = aPos.x;
oy = cY = aPos.y;
current_char_pos = aPos;
/* Do not draw the text if out of draw area! */
if( aPanel )
......@@ -166,8 +172,8 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
int textsize = ABS( pitch );
ll = aPanel->GetScreen()->Scale( textsize * char_count );
xc = GRMapX( cX );
yc = GRMapY( cY );
xc = GRMapX( current_char_pos.x );
yc = GRMapY( current_char_pos.y );
x0 = aPanel->m_ClipBox.GetX() - ll;
y0 = aPanel->m_ClipBox.GetY() - ll;
......@@ -185,81 +191,60 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
}
/* Compute the position ux0, uy0 of the first letter , next */
dx = (pitch * char_count) / 2;
dy = size_v / 2; /* dx, dy = draw offset between first letter and text center */
ux0 = uy0 = 0; /* for ux0 = uy0 = 0, the text is centered */
wxPoint offset_org( dx, dy );
int irot = aOrient;
while( irot >= 1800 )
irot -= 1800;
while( irot < 0 )
irot += 1800;
if( irot != 0 )
EXCHG( offset_org.x, offset_org.y );
/* Compute the position of the first letter of the text
* this position is the position of the left bottom point of the letter
* this is the same as the text position only for a left and bottom justified text
* In others cases, this position must be calculated from the text position ans size
*/
dx = pitch * char_count;
dy = size_v; /* dx, dy = draw offset between first letter and text center */
switch( aH_justify )
{
case GR_TEXT_HJUSTIFY_CENTER:
current_char_pos.x -= dx / 2;
break;
case GR_TEXT_HJUSTIFY_RIGHT:
ux0 = -offset_org.x;
current_char_pos.x -= dx;
break;
case GR_TEXT_HJUSTIFY_LEFT:
ux0 = offset_org.x;
break;
}
switch( aV_justify )
{
case GR_TEXT_VJUSTIFY_CENTER:
current_char_pos.y += dy/2;
break;
case GR_TEXT_VJUSTIFY_TOP:
uy0 = offset_org.y;
current_char_pos.y += dy;
break;
case GR_TEXT_VJUSTIFY_BOTTOM:
uy0 = -offset_org.y;
break;
}
cX += ux0;
cY += uy0;
ox = cX - dx;
oy = cY + dy;
// Note: if aPanel == NULL, we are using a GL Canvas that handle scaling
if( aPanel && aPanel->GetScreen()->Scale( aSize.x ) == 0 )
return;
if( aPanel && ABS( ( aPanel->GetScreen()->Scale( aSize.x ) ) ) < 3 ) /* shapes are too small: connot be drawn */
/* if a text size is too small, the text cannot be drawn, and it is drawn as a single graphic line */
if( aPanel && ABS( ( aPanel->GetScreen()->Scale( aSize.x ) ) ) < 3 )
{
/* insteed the text is drawn as a line */
dx = (pitch * char_count) / 2;
dy = size_v / 2; /* line is always centered */
ux0 = cX - dx;
uy0 = cY;
dx += cX;
dy = cY;
/* draw the text as a line always vertically centered */
wxPoint end( current_char_pos.x + dx, current_char_pos.y);
RotatePoint( &ux0, &uy0, cX, cY, aOrient );
RotatePoint( &dx, &dy, cX, cY, aOrient );
RotatePoint( &current_char_pos, aPos, aOrient );
RotatePoint( &end, aPos, aOrient );
if( aCallback )
aCallback( ux0, uy0, dx, dy );
aCallback( current_char_pos.x, current_char_pos.y, end.x, end.y );
else
GRLine( &aPanel->m_ClipBox, aDC, ux0, uy0, dx, dy, aWidth, aColor );
GRLine( &aPanel->m_ClipBox, aDC,
current_char_pos.x, current_char_pos.y, end.x, end.y , aWidth, aColor );
return;
}
......@@ -278,20 +263,18 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
if( overbars % 2 )
{
/* Starting the overbar */
overbar_x = ox;
overbar_y = oy - overbar_position( size_v, thickness );
RotatePoint( &overbar_x, &overbar_y, cX, cY, aOrient );
overbar_pos = current_char_pos;
overbar_pos.y -= overbar_position( size_v, thickness );
RotatePoint( &overbar_pos, aPos, aOrient );
}
else
{
/* Ending the overbar */
coord[0].x = overbar_x;
coord[0].y = overbar_y;
overbar_x = ox;
overbar_y = oy - overbar_position( size_v, thickness );
RotatePoint( &overbar_x, &overbar_y, cX, cY, aOrient );
coord[1].x = overbar_x;
coord[1].y = overbar_y;
coord[0] = overbar_pos;
overbar_pos = current_char_pos;
overbar_pos.y -= overbar_position( size_v, thickness );
RotatePoint( &overbar_pos, aPos, aOrient );
coord[1] = overbar_pos;
/* Plot the overbar segment */
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth,
sketch_mode, 2, coord, aCallback );
......@@ -345,6 +328,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
default:
{
int y, k1, k2;
wxPoint currpoint;
y = k1 = f_cod; /* trace sur axe V */
k1 = -( (k1 * size_v) / 9 );
......@@ -357,12 +341,12 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
// To simulate an italic font, add a x offset depending on the y offset
if( aItalic )
k2 -= italic_reverse ? -k1 / 8 : k1 / 8;
dx = k2 + ox; dy = k1 + oy;
currpoint.x = k2 + current_char_pos.x;
currpoint.y = k1 + current_char_pos.y;
RotatePoint( &dx, &dy, cX, cY, aOrient );
coord[point_count].x = dx;
coord[point_count].y = dy;
if( point_count < BUF_SIZE - 1 )
RotatePoint( &currpoint, aPos, aOrient );
coord[point_count] = currpoint;
if( point_count < BUF_SIZE - 1 )
point_count++;
break;
}
......@@ -373,19 +357,18 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
/* end draw 1 char */
ptr++; ox += pitch;
ptr++;
current_char_pos.x += pitch; // current_char_pos is now the next position
}
if( overbars % 2 )
{
/* Close the last overbar */
coord[0].x = overbar_x;
coord[0].y = overbar_y;
overbar_x = ox;
overbar_y = oy - overbar_position( size_v, thickness );
RotatePoint( &overbar_x, &overbar_y, cX, cY, aOrient );
coord[1].x = overbar_x;
coord[1].y = overbar_y;
coord[0] = overbar_pos;
overbar_pos = current_char_pos;
overbar_pos.y -= overbar_position( size_v, thickness );
RotatePoint( &overbar_pos, aPos, aOrient );
coord[1] = overbar_pos;
/* Plot the overbar segment */
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth,
sketch_mode, 2, coord, aCallback );
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -21,21 +21,8 @@
int DialogLabelEditor::ShowModally( WinEDA_SchematicFrame* parent, SCH_TEXT * CurrentText )
{
int ret;
bool multiline;
bool multiline = CurrentText->m_MultilineAllowed;
switch( CurrentText->Type() )
{
case TYPE_SCH_GLOBALLABEL:
case TYPE_SCH_HIERLABEL:
case TYPE_SCH_LABEL:
multiline = false;
break;
default:
multiline = true;
break;
}
DialogLabelEditor* dialog = new DialogLabelEditor( parent, CurrentText, multiline );
// doing any post construction resizing is better done here than in
......@@ -97,7 +84,7 @@ void DialogLabelEditor::init()
EnsureTextCtrlWidth( m_TextLabel );
// Set validators
m_TextOrient->SetSelection( m_CurrentText->m_Orient );
m_TextOrient->SetSelection( m_CurrentText->GetSchematicTextOrientation() );
m_TextShape->SetSelection( m_CurrentText->m_Shape );
int style = 0;
......
......@@ -525,6 +525,13 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copySelectedFieldToPanel()
else
m_FieldHJustifyCtrl->SetSelection(1);
if( field.m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM )
m_FieldVJustifyCtrl->SetSelection(0);
else if( field.m_VJustify == GR_TEXT_VJUSTIFY_TOP )
m_FieldVJustifyCtrl->SetSelection(2);
else
m_FieldVJustifyCtrl->SetSelection(1);
fieldNameTextCtrl->SetValue( field.m_Name );
// if fieldNdx == REFERENCE, VALUE, FOOTPRINT, or DATASHEET, then disable filed name editing
......@@ -605,16 +612,7 @@ bool DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copyPanelToSelectedField()
field.m_HJustify = hjustify[m_FieldHJustifyCtrl->GetSelection()];
field.m_VJustify = vjustify[m_FieldVJustifyCtrl->GetSelection()];
if( field.m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM )
m_FieldVJustifyCtrl->SetSelection(0);
else if( field.m_VJustify == GR_TEXT_VJUSTIFY_TOP )
m_FieldVJustifyCtrl->SetSelection(2);
else
m_FieldVJustifyCtrl->SetSelection(1);
rotateCheckBox->SetValue( field.m_Orient == TEXT_ORIENT_VERT );
/* Void fields texts for REFERENCE and VALUE (value is the name of the compinent in lib ! ) are not allowed
/* Void fields texts for REFERENCE and VALUE (value is the name of the component in lib ! ) are not allowed
* change them only for a new non void value
*/
if( !fieldValueTextCtrl->GetValue().IsEmpty() || fieldNdx > VALUE )
......
......@@ -47,7 +47,7 @@ void DialogLabelEditor::TextPropertiesAccept( wxCommandEvent& event )
else if( (m_CurrentText->m_Flags & IS_NEW) == 0 )
DisplayError( this, _( "Empty Text!" ) );
m_CurrentText->m_Orient = m_TextOrient->GetSelection();
m_CurrentText->SetSchematicTextOrientation( m_TextOrient->GetSelection() );
text = m_TextSize->GetValue();
value = ReturnValueFromString( g_UnitMetric, text, m_Parent->m_InternalUnits );
m_CurrentText->m_Size.x = m_CurrentText->m_Size.y = value;
......@@ -101,7 +101,7 @@ void WinEDA_SchematicFrame::StartMoveTexte( SCH_TEXT* TextStruct, wxDC* DC )
case TYPE_SCH_TEXT:
ItemInitialPosition = TextStruct->m_Pos;
OldSize = TextStruct->m_Size;
OldOrient = TextStruct->m_Orient;
OldOrient = TextStruct->GetSchematicTextOrientation();
break;
default:
......@@ -163,14 +163,16 @@ void WinEDA_SchematicFrame::ChangeTextOrient( SCH_TEXT* TextStruct, wxDC* DC )
RedrawOneStruct( DrawPanel, DC, TextStruct, g_XorMode );
/* Rotation du texte */
int orient;
switch( TextStruct->Type() )
{
case TYPE_SCH_LABEL:
case TYPE_SCH_GLOBALLABEL:
case TYPE_SCH_HIERLABEL:
case TYPE_SCH_TEXT:
TextStruct->m_Orient++;
TextStruct->m_Orient &= 3;
orient = TextStruct->GetSchematicTextOrientation() + 1;
orient &= 3;
TextStruct->SetSchematicTextOrientation( orient );
break;
default:
......@@ -209,13 +211,13 @@ SCH_TEXT* WinEDA_SchematicFrame::CreateNewText( wxDC* DC, int type )
case LAYER_HIERLABEL:
NewText = new SCH_HIERLABEL( GetScreen()->m_Curseur );
NewText->m_Shape = s_DefaultShapeGLabel;
NewText->m_Orient = s_DefaultOrientGLabel;
NewText->SetSchematicTextOrientation( s_DefaultOrientGLabel );
break;
case LAYER_GLOBLABEL:
NewText = new SCH_GLOBALLABEL( GetScreen()->m_Curseur );
NewText->m_Shape = s_DefaultShapeGLabel;
NewText->m_Orient = s_DefaultOrientGLabel;
NewText->SetSchematicTextOrientation( s_DefaultOrientGLabel );
break;
default:
......@@ -238,7 +240,7 @@ SCH_TEXT* WinEDA_SchematicFrame::CreateNewText( wxDC* DC, int type )
if( type == LAYER_GLOBLABEL || type == LAYER_HIERLABEL )
{
s_DefaultShapeGLabel = NewText->m_Shape;
s_DefaultOrientGLabel = NewText->m_Orient;
s_DefaultOrientGLabel = NewText->GetSchematicTextOrientation();
}
RedrawOneStruct( DrawPanel, DC, NewText, GR_DEFAULT_DRAWMODE );
......@@ -317,7 +319,7 @@ static void ExitMoveTexte( WinEDA_DrawPanel* Panel, wxDC* DC )
SCH_TEXT* Text = (SCH_TEXT*) Struct;
Text->m_Pos = ItemInitialPosition;
Text->m_Size = OldSize;
Text->m_Orient = OldOrient;
Text->SetSchematicTextOrientation( OldOrient );
}
break;
......@@ -372,11 +374,9 @@ void WinEDA_SchematicFrame::ConvertTextType( SCH_TEXT* Text,
/* copy the old text settings */
newtext->m_Shape = Text->m_Shape;
newtext->m_Orient = Text->m_Orient;
newtext->SetSchematicTextOrientation( Text->GetSchematicTextOrientation() );
newtext->m_Size = Text->m_Size;
newtext->m_Width = Text->m_Width;
newtext->m_HJustify = Text->m_HJustify;
newtext->m_VJustify = Text->m_VJustify;
newtext->m_IsDangling = Text->m_IsDangling;
// save current text flag:
......
......@@ -311,11 +311,10 @@ bool SnapPoint2( const wxPoint& aPosRef, int SearchMask,
break;
}
case TYPE_SCH_LABEL:
case TYPE_SCH_TEXT:
#undef STRUCT
#define STRUCT ( (SCH_TEXT*) DrawList )
if( !( SearchMask & (TEXTITEM | LABELITEM) ) )
if( !( SearchMask & TEXTITEM) )
break;
if( STRUCT->HitTest( aPosRef ) )
{
......@@ -325,21 +324,11 @@ bool SnapPoint2( const wxPoint& aPosRef, int SearchMask,
break;
case TYPE_SCH_LABEL:
case TYPE_SCH_GLOBALLABEL:
#undef STRUCT
#define STRUCT ( (SCH_GLOBALLABEL*) DrawList )
if( !(SearchMask & LABELITEM) )
break;
if( STRUCT->HitTest( aPosRef ) )
{
LastSnappedStruct = DrawList;
return TRUE;
}
break;
case TYPE_SCH_HIERLABEL:
#undef STRUCT
#define STRUCT ( (SCH_HIERLABEL*) DrawList )
#define STRUCT ( (SCH_TEXT*) DrawList ) // SCH_TEXT is the base class of these labels
if( !(SearchMask & LABELITEM) )
break;
if( STRUCT->HitTest( aPosRef ) )
......
This diff is collapsed.
......@@ -75,7 +75,7 @@ SCH_ITEM* ReadTextDescr( FILE* aFile,
new SCH_LABEL( pos, CONV_FROM_UTF8( text ) );
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
TextStruct->m_Orient = orient;
TextStruct->SetSchematicTextOrientation( orient );
if( isdigit( Name3[0] ) )
{
thickness = atol( Name3 );
......@@ -92,7 +92,7 @@ SCH_ITEM* ReadTextDescr( FILE* aFile,
Struct = TextStruct;
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
TextStruct->m_Orient = orient;
TextStruct->SetSchematicTextOrientation( orient );
TextStruct->m_Shape = NET_INPUT;
TextStruct->m_Width = thickness;
......@@ -115,7 +115,7 @@ SCH_ITEM* ReadTextDescr( FILE* aFile,
Struct = TextStruct;
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
TextStruct->m_Orient = orient;
TextStruct->SetSchematicTextOrientation( orient );
TextStruct->m_Shape = NET_INPUT;
TextStruct->m_Width = thickness;
......@@ -138,14 +138,14 @@ SCH_ITEM* ReadTextDescr( FILE* aFile,
int i=val.find(_("\\n"));
if (i==wxNOT_FOUND)
break;
val.erase(i,2);
val.insert(i,_("\n"));
}
SCH_TEXT* TextStruct = new SCH_TEXT( pos, val );
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
TextStruct->m_Orient = orient;
TextStruct->SetSchematicTextOrientation( orient );
if( isdigit( Name3[0] ) )
{
thickness = atol( Name3 );
......
......@@ -353,7 +353,7 @@ static void PlotTextModule( TEXTE_MODULE* pt_texte, int format_plot )
pt_texte->m_Text,
orient, size,
pt_texte->m_HJustify, pt_texte->m_VJustify,
thickness, pt_texte->m_Italic );
thickness, pt_texte->m_Italic, true );
}
......@@ -620,11 +620,34 @@ void PlotTextePcb( TEXTE_PCB* pt_texte, int format_plot, int masque_layer )
break;
}
PlotGraphicText( format_plot, pos, BLACK,
if( pt_texte->m_MultilineAllowed )
{
wxArrayString* list = wxStringSplit( pt_texte->m_Text, '\n' );
wxPoint offset;
offset.y = pt_texte->GetInterline();
RotatePoint( &offset, orient );
for( unsigned i = 0; i<list->Count(); i++ )
{
wxString txt = list->Item( i );
PlotGraphicText( format_plot, pos, BLACK,
txt,
orient, size,
pt_texte->m_HJustify, pt_texte->m_VJustify,
thickness, pt_texte->m_Italic, true );
pos += offset;
}
delete (list);
}
else
PlotGraphicText( format_plot, pos, BLACK,
pt_texte->m_Text,
orient, size,
pt_texte->m_HJustify, pt_texte->m_VJustify,
thickness, pt_texte->m_Italic );
thickness, pt_texte->m_Italic, true );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment