Pcbnew: Fix incorrect bounding box calculation of texts. Only noticeable with boards conveted from Eagle, which are using other text justification than center.

Eagle plugin: filter and replace not allowed chars in FPID(-':' and '/')  by _ or -, if they are used in Eagle footprint names (otherwise, boards converted and saved under kicad_pcb format are not readable by Pcbnew).
This commit is contained in:
jean-pierre charras 2013-11-05 18:12:27 +01:00
parent db5409dfc7
commit 44d9607461
9 changed files with 94 additions and 53 deletions

View File

@ -532,3 +532,40 @@ double EDA_RECT::GetArea() const
{
return (double) GetWidth() * (double) GetHeight();
}
/* Calculate the bounding box of this, when rotated
*/
EDA_RECT EDA_RECT::GetBoundingBoxRotated( wxPoint aRotCenter, double aAngle )
{
wxPoint corners[4];
// Build the corners list
corners[0] = GetOrigin();
corners[2] = GetEnd();
corners[1].x = corners[0].x;
corners[1].y = corners[2].y;
corners[3].x = corners[2].x;
corners[3].y = corners[0].y;
// Rotate all corners, to find the bounding box
for( int ii = 0; ii < 4; ii ++ )
RotatePoint( &corners[ii], aRotCenter, aAngle );
// Find the corners bounding box
wxPoint start = corners[0];
wxPoint end = corners[0];
for( int ii = 1; ii < 4; ii ++ )
{
start.x = std::min( start.x, corners[ii].x);
start.y = std::min( start.y, corners[ii].y);
end.x = std::max( end.x, corners[ii].x);
end.y = std::max( end.y, corners[ii].y);
}
EDA_RECT bbox;
bbox.SetOrigin( start );
bbox.SetEnd( end );
return bbox;
}

View File

@ -363,7 +363,7 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
DrawDanglingSymbol( panel, DC, m_Pos + aOffset, color );
// Enable these line to draw the bounding box (debug tests purposes only)
#if 0
#if 1
{
EDA_RECT BoundaryBox = GetBoundingBox();
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );

View File

@ -274,6 +274,16 @@ public:
* @return The area of the rectangle.
*/
double GetArea() const;
/**
* Function GetBoundingBoxRotated
* @return the bounding box of this, after rotation
* @param aAngle = the rotation angle in 0.1 deg.
* @param aRotCenter = the rotation point.
* useful to calculate bounding box of rotated items, when
* rotation if not k*90 degrees
*/
EDA_RECT GetBoundingBoxRotated( wxPoint aRotCenter, double aAngle );
};

View File

@ -229,7 +229,8 @@ public:
* useful in multiline texts to calculate the full text or a line area (for
* zones filling, locate functions....)
* @return the rect containing the line of text (i.e. the position and the
* size of one line) this rectangle is calculated for 0 orient text.
* size of one line)
* this rectangle is calculated for 0 orient text.
* If orientation is not 0 the rect must be rotated to match the
* physical area
* @param aLine The line of text to consider.

View File

@ -106,6 +106,14 @@ void TEXTE_PCB::Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
EDA_TEXT::Draw( clipbox, DC, offset, color,
DrawMode, fillmode, anchor_color );
// Enable these line to draw the bounding box (debug tests purposes only)
#if 0
{
EDA_RECT BoundaryBox = GetBoundingBox();
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );
}
#endif
}
@ -150,6 +158,16 @@ void TEXTE_PCB::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
aList.push_back( MSG_PANEL_ITEM( _( "Size Y" ), msg, RED ) );
}
EDA_RECT TEXTE_PCB::GetBoundingBox() const
{
EDA_RECT rect = GetTextBox( -1, -1 );
if( m_Orient )
rect = rect.GetBoundingBoxRotated( m_Pos, m_Orient );
return rect;
}
void TEXTE_PCB::Rotate( const wxPoint& aRotCentre, double aAngle )
{

View File

@ -130,7 +130,7 @@ public:
BITMAP_DEF GetMenuImage() const { return add_text_xpm; }
EDA_RECT GetBoundingBox() const { return GetTextBox(); };
EDA_RECT GetBoundingBox() const;
EDA_ITEM* Clone() const;

View File

@ -159,45 +159,14 @@ void TEXTE_MODULE::SetLocalCoord()
}
m_Pos0 = m_Pos - module->GetPosition();
double angle = module->GetOrientation();
RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle );
}
/**
* Function GetTextRect
* @return an EDA_RECT which gives the position and size of the text area
* (for the footprint orientation)
*/
EDA_RECT TEXTE_MODULE::GetTextRect( void ) const
{
EDA_RECT area;
int dx, dy;
dx = ( m_Size.x * GetLength() ) / 2;
dx = (dx * 10) / 9; /* letter size = 10/9 */
dx += m_Thickness / 2;
dy = ( m_Size.y + m_Thickness ) / 2;
wxPoint Org = m_Pos; // This is the position of the center of the area
Org.x -= dx;
Org.y -= dy;
area.SetOrigin( Org );
area.SetHeight( 2 * dy );
area.SetWidth( 2 * dx );
area.Normalize();
return area;
}
bool TEXTE_MODULE::HitTest( const wxPoint& aPosition )
{
wxPoint rel_pos;
EDA_RECT area = GetTextRect();
EDA_RECT area = GetTextBox( -1, -1 );
/* Rotate refPos to - angle
* to test if refPos is within area (which is relative to an horizontal
@ -220,20 +189,12 @@ bool TEXTE_MODULE::HitTest( const wxPoint& aPosition )
*/
EDA_RECT TEXTE_MODULE::GetBoundingBox() const
{
// Calculate area without text fields:
EDA_RECT text_area;
double angle = GetDrawRotation();
wxPoint textstart, textend;
EDA_RECT text_area = GetTextBox( -1, -1 );
text_area = GetTextRect();
textstart = text_area.GetOrigin();
textend = text_area.GetEnd();
RotatePoint( &textstart, m_Pos, angle );
RotatePoint( &textend, m_Pos, angle );
if( angle )
text_area = text_area.GetBoundingBoxRotated( m_Pos, m_Orient );
text_area.SetOrigin( textstart );
text_area.SetEnd( textend );
text_area.Normalize();
return text_area;
}
@ -319,6 +280,14 @@ void TEXTE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL;
DrawGraphicText( clipbox, DC, pos, color, m_Text, orient,
size, m_HJustify, m_VJustify, width, m_Italic, m_Bold );
// Enable these line to draw the bounding box (debug tests purposes only)
#if 0
{
EDA_RECT BoundaryBox = GetBoundingBox();
GRRect( clipbox, DC, BoundaryBox, 0, BROWN );
}
#endif
}
/* Draws a line from the TEXTE_MODULE origin to parent MODULE origin.

View File

@ -117,14 +117,11 @@ public:
int GetLength() const; // text length
double GetDrawRotation() const; // Return text rotation for drawings and plotting
/**
* Function GetTextRect
* @return an EDA_RECT which gives the position and size of the text area
* (for the 0 orient text and footprint)
* @return the text rotation for drawings and plotting
* the footprint rotation is taken in account
*/
EDA_RECT GetTextRect( void ) const;
double GetDrawRotation() const;
EDA_RECT GetBoundingBox() const;

View File

@ -1877,7 +1877,16 @@ MODULE* EAGLE_PLUGIN::makeModule( CPTREE& aPackage, const std::string& aPkgName
{
std::auto_ptr<MODULE> m( new MODULE( NULL ) );
m->SetFPID( FPID( aPkgName ) );
// Replace reserved chars in FPID by other chars
// ':' and '/' are used as separators in FPIDs
std::string fpid_str = aPkgName;
for( unsigned ii = 0; ii < fpid_str.size(); ii++ )
{
if( fpid_str[ii] == ':' ) fpid_str[ii] = '_';
if( fpid_str[ii] == '/' ) fpid_str[ii] = '-';
}
m->SetFPID( FPID( fpid_str ) );
opt_string description = aPackage.get_optional<std::string>( "description" );
if( description )