From b8c2e4dd6c2d7670138b6d24dfca0187e33600e1 Mon Sep 17 00:00:00 2001 From: Marco Mattila Date: Fri, 2 Sep 2011 00:39:38 +0300 Subject: [PATCH] Remove redundant bounding box calculation code from pcbnew. --- pcbnew/automove.cpp | 7 +- pcbnew/autoplac.cpp | 41 +++++---- pcbnew/class_board.cpp | 157 ++++++++--------------------------- pcbnew/class_module.cpp | 178 +++++----------------------------------- pcbnew/class_module.h | 34 +++----- pcbnew/class_pcb_text.h | 2 + pcbnew/locate.cpp | 10 +-- 7 files changed, 96 insertions(+), 333 deletions(-) diff --git a/pcbnew/automove.cpp b/pcbnew/automove.cpp index b4a1535f9f..407839b52f 100644 --- a/pcbnew/automove.cpp +++ b/pcbnew/automove.cpp @@ -198,7 +198,6 @@ void PCB_EDIT_FRAME::AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb ) for( ; Module != NULL; Module = Module->Next() ) { Module->Set_Rectangle_Encadrement(); - Module->SetRectangleExinscrit(); moduleList.push_back(Module); } sort( moduleList.begin(), moduleList.end(), sortModulesbySize ); @@ -254,12 +253,12 @@ void PCB_EDIT_FRAME::AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb ) } GetScreen()->SetCrossHairPosition( current + Module->m_Pos - - Module->m_RealBoundaryBox.GetPosition() ); - Ymax_size = MAX( Ymax_size, Module->m_RealBoundaryBox.GetHeight() ); + Module->m_BoundaryBox.GetPosition() ); + Ymax_size = MAX( Ymax_size, Module->m_BoundaryBox.GetHeight() ); Place_Module( Module, NULL, true ); - current.x += Module->m_RealBoundaryBox.GetWidth() + pas_grille; + current.x += Module->m_BoundaryBox.GetWidth() + pas_grille; } DrawPanel->Refresh(); diff --git a/pcbnew/autoplac.cpp b/pcbnew/autoplac.cpp index bd46d6ff05..8a65421826 100644 --- a/pcbnew/autoplac.cpp +++ b/pcbnew/autoplac.cpp @@ -122,7 +122,6 @@ void PCB_EDIT_FRAME::AutoPlaceModule( MODULE* Module, int place_mode, wxDC* DC ) for( ; Module != NULL; Module = Module->Next() ) { Module->Set_Rectangle_Encadrement(); - Module->SetRectangleExinscrit(); NbTotalModules ++; } @@ -204,7 +203,7 @@ void PCB_EDIT_FRAME::AutoPlaceModule( MODULE* Module, int place_mode, wxDC* DC ) { int Angle_Rot_Module = 1800; Rotate_Module( DC, Module, Angle_Rot_Module, false ); - Module->SetRectangleExinscrit(); + Module->Set_Rectangle_Encadrement(); error = RecherchePlacementModule( Module, DC ); MinCout *= OrientPenality[ii]; if( BestScore > MinCout ) /* This orientation is best. */ @@ -277,7 +276,6 @@ end_of_tst: GetScreen()->SetCrossHairPosition( CurrPosition ); Module->Set_Rectangle_Encadrement(); - Module->SetRectangleExinscrit(); GenModuleOnBoard( Module ); Module->m_ModuleStatus |= MODULE_is_PLACED; @@ -491,10 +489,10 @@ void PCB_EDIT_FRAME::GenModuleOnBoard( MODULE* Module ) int masque_layer; D_PAD* Pad; - ox = Module->m_RealBoundaryBox.m_Pos.x - marge; - fx = Module->m_RealBoundaryBox.GetRight() + marge; - oy = Module->m_RealBoundaryBox.m_Pos.y - marge; - fy = Module->m_RealBoundaryBox.GetBottom() + marge; + ox = Module->m_BoundaryBox.m_Pos.x - marge; + fx = Module->m_BoundaryBox.GetRight() + marge; + oy = Module->m_BoundaryBox.m_Pos.y - marge; + fy = Module->m_BoundaryBox.GetBottom() + marge; if( ox < GetBoard()->m_BoundaryBox.m_Pos.x ) ox = GetBoard()->m_BoundaryBox.m_Pos.x; @@ -571,10 +569,10 @@ int PCB_EDIT_FRAME::RecherchePlacementModule( MODULE* Module, wxDC* DC ) LastPosOK.y = GetBoard()->m_BoundaryBox.m_Pos.y; cx = Module->m_Pos.x; cy = Module->m_Pos.y; - ox = Module->m_RealBoundaryBox.m_Pos.x - cx; - fx = Module->m_RealBoundaryBox.m_Size.x + ox; - oy = Module->m_RealBoundaryBox.m_Pos.y - cy; - fy = Module->m_RealBoundaryBox.m_Size.y + oy; + ox = Module->m_BoundaryBox.m_Pos.x - cx; + fx = Module->m_BoundaryBox.m_Size.x + ox; + oy = Module->m_BoundaryBox.m_Pos.y - cy; + fy = Module->m_BoundaryBox.m_Size.y + oy; CurrPosition.x = GetBoard()->m_BoundaryBox.m_Pos.x - ox; CurrPosition.y = GetBoard()->m_BoundaryBox.m_Pos.y - oy; @@ -626,8 +624,8 @@ int PCB_EDIT_FRAME::RecherchePlacementModule( MODULE* Module, wxDC* DC ) } cx = Module->m_Pos.x; cy = Module->m_Pos.y; - Module->m_RealBoundaryBox.m_Pos.x = ox + CurrPosition.x; - Module->m_RealBoundaryBox.m_Pos.y = oy + CurrPosition.y; + Module->m_BoundaryBox.m_Pos.x = ox + CurrPosition.x; + Module->m_BoundaryBox.m_Pos.y = oy + CurrPosition.y; DrawModuleOutlines( DrawPanel, DC, Module ); @@ -646,8 +644,8 @@ int PCB_EDIT_FRAME::RecherchePlacementModule( MODULE* Module, wxDC* DC ) if( DisplayChevelu ) Compute_Ratsnest_PlaceModule( DC ); DisplayChevelu = 0; - Module->m_RealBoundaryBox.m_Pos.x = ox + CurrPosition.x; - Module->m_RealBoundaryBox.m_Pos.y = oy + CurrPosition.y; + Module->m_BoundaryBox.m_Pos.x = ox + CurrPosition.x; + Module->m_BoundaryBox.m_Pos.y = oy + CurrPosition.y; g_Offset_Module.y = cy - CurrPosition.y; DrawModuleOutlines( DrawPanel, DC, Module ); @@ -683,8 +681,8 @@ int PCB_EDIT_FRAME::RecherchePlacementModule( MODULE* Module, wxDC* DC ) Compute_Ratsnest_PlaceModule( DC ); /* Regeneration of the modified variable. */ - Module->m_RealBoundaryBox.m_Pos.x = ox + cx; - Module->m_RealBoundaryBox.m_Pos.y = oy + cy; + Module->m_BoundaryBox.m_Pos.x = ox + cx; + Module->m_BoundaryBox.m_Pos.y = oy + cy; CurrPosition = LastPosOK; GetBoard()->m_Status_Pcb &= ~( RATSNEST_ITEM_LOCAL_OK | LISTE_PAD_OK ); @@ -807,10 +805,10 @@ int TstModuleOnBoard( BOARD* Pcb, MODULE* Module, bool TstOtherSide ) side = BOTTOM; otherside = TOP; } - ox = Module->m_RealBoundaryBox.m_Pos.x; - fx = Module->m_RealBoundaryBox.GetRight(); - oy = Module->m_RealBoundaryBox.m_Pos.y; - fy = Module->m_RealBoundaryBox.GetBottom(); + ox = Module->m_BoundaryBox.m_Pos.x; + fx = Module->m_BoundaryBox.GetRight(); + oy = Module->m_BoundaryBox.m_Pos.y; + fy = Module->m_BoundaryBox.GetBottom(); error = TstRectangle( Pcb, ox, oy, fx, fy, side ); if( error < 0 ) @@ -1031,7 +1029,6 @@ static MODULE* PickModule( PCB_EDIT_FRAME* pcbframe, wxDC* DC ) for( ; Module != NULL; Module = Module->Next() ) { Module->Set_Rectangle_Encadrement(); - Module->SetRectangleExinscrit(); moduleList.push_back(Module); } sort( moduleList.begin(), moduleList.end(), Tri_PlaceModules ); diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 564951a126..85624fba8d 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -761,94 +761,20 @@ unsigned BOARD::GetNodesCount() bool BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) { - int rayon, cx, cy, d, xmin, ymin, xmax, ymax; bool hasItems = false; - - xmin = ymin = INT_MAX; - xmax = ymax = INT_MIN; + EDA_RECT area; // Check segments, dimensions, texts, and fiducials - for( EDA_ITEM* PtStruct = m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Next() ) + for( BOARD_ITEM* item = m_Drawings; item != NULL; item = item->Next() ) { - switch( PtStruct->Type() ) - { - case TYPE_DRAWSEGMENT: - { - DRAWSEGMENT* ptr; - ptr = (DRAWSEGMENT*) PtStruct; - d = (ptr->m_Width / 2) + 1; + if( aBoardEdgesOnly && item->Type() != TYPE_DRAWSEGMENT && item->GetLayer() != EDGE_N ) + continue; - if( aBoardEdgesOnly && ptr->GetLayer() != EDGE_N ) - break; - - if( ptr->m_Shape == S_CIRCLE ) - { - cx = ptr->m_Start.x; cy = ptr->m_Start.y; - rayon = (int) hypot( (double) ( ptr->m_End.x - cx ), - (double) ( ptr->m_End.y - cy ) ); - rayon += d; - xmin = MIN( xmin, cx - rayon ); - ymin = MIN( ymin, cy - rayon ); - xmax = MAX( xmax, cx + rayon ); - ymax = MAX( ymax, cy + rayon ); - hasItems = true; - } - else - { - cx = MIN( ptr->m_Start.x, ptr->m_End.x ); - cy = MIN( ptr->m_Start.y, ptr->m_End.y ); - xmin = MIN( xmin, cx - d ); - ymin = MIN( ymin, cy - d ); - cx = MAX( ptr->m_Start.x, ptr->m_End.x ); - cy = MAX( ptr->m_Start.y, ptr->m_End.y ); - xmax = MAX( xmax, cx + d ); - ymax = MAX( ymax, cy + d ); - hasItems = true; - } - break; - } - case TYPE_DIMENSION: - { - if( aBoardEdgesOnly ) - break; - - EDA_RECT rect = ((DIMENSION*) PtStruct)->GetBoundingBox(); - xmin = MIN( xmin, rect.GetX() ); - ymin = MIN( ymin, rect.GetY() ); - xmax = MAX( xmax, rect.GetRight() ); - ymax = MAX( ymax, rect.GetBottom() ); - hasItems = true; - break; - } - case TYPE_TEXTE: - { - if( aBoardEdgesOnly ) - break; - - EDA_RECT rect = ((TEXTE_PCB*) PtStruct)->GetTextBox( -1 ); - xmin = MIN( xmin, rect.GetX() ); - ymin = MIN( ymin, rect.GetY() ); - xmax = MAX( xmax, rect.GetRight() ); - ymax = MAX( ymax, rect.GetBottom() ); - hasItems = true; - break; - } - case TYPE_MIRE: - { - if( aBoardEdgesOnly ) - break; - - EDA_RECT rect = ((DIMENSION*) PtStruct)->GetBoundingBox(); - xmin = MIN( xmin, rect.GetX() ); - ymin = MIN( ymin, rect.GetY() ); - xmax = MAX( xmax, rect.GetRight() ); - ymax = MAX( ymax, rect.GetBottom() ); - hasItems = true; - break; - } - default: - break; - } + if( !hasItems ) + area = item->GetBoundingBox(); + else + area.Merge( item->GetBoundingBox() ); + hasItems = true; } if( !aBoardEdgesOnly ) @@ -856,41 +782,30 @@ bool BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) // Check modules for( MODULE* module = m_Modules; module; module = module->Next() ) { - EDA_RECT bBox = module->GetBoundingBox(); - xmin = MIN( xmin, bBox.GetX() ); - ymin = MIN( ymin, bBox.GetY() ); - xmax = MAX( xmax, bBox.GetRight() ); - ymax = MAX( ymax, bBox.GetBottom() ); + if( !hasItems ) + area = module->GetBoundingBox(); + else + area.Merge( module->GetBoundingBox() ); hasItems = true; } // Check tracks for( TRACK* track = m_Track; track; track = track->Next() ) { - d = ( track->m_Width / 2 ) + 1; - cx = MIN( track->m_Start.x, track->m_End.x ); - cy = MIN( track->m_Start.y, track->m_End.y ); - xmin = MIN( xmin, cx - d ); - ymin = MIN( ymin, cy - d ); - cx = MAX( track->m_Start.x, track->m_End.x ); - cy = MAX( track->m_Start.y, track->m_End.y ); - xmax = MAX( xmax, cx + d ); - ymax = MAX( ymax, cy + d ); + if( !hasItems ) + area = track->GetBoundingBox(); + else + area.Merge( track->GetBoundingBox() ); hasItems = true; } // Check segment zones for( TRACK* track = m_Zone; track; track = track->Next() ) { - d = ( track->m_Width / 2 ) + 1; - cx = MIN( track->m_Start.x, track->m_End.x ); - cy = MIN( track->m_Start.y, track->m_End.y ); - xmin = MIN( xmin, cx - d ); - ymin = MIN( ymin, cy - d ); - cx = MAX( track->m_Start.x, track->m_End.x ); - cy = MAX( track->m_Start.y, track->m_End.y ); - xmax = MAX( xmax, cx + d ); - ymax = MAX( ymax, cy + d ); + if( !hasItems ) + area = track->GetBoundingBox(); + else + area.Merge( track->GetBoundingBox() ); hasItems = true; } @@ -898,11 +813,12 @@ bool BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) for( unsigned int i = 0; i < m_ZoneDescriptorList.size(); i++ ) { ZONE_CONTAINER* aZone = m_ZoneDescriptorList[i]; - EDA_RECT bBox = aZone->GetBoundingBox(); - xmin = MIN( xmin, bBox.GetX() ); - ymin = MIN( ymin, bBox.GetY() ); - xmax = MAX( xmax, bBox.GetRight() ); - ymax = MAX( ymax, bBox.GetBottom() ); + + if( !hasItems ) + area = aZone->GetBoundingBox(); + else + area.Merge( aZone->GetBoundingBox() ); + area.Merge( aZone->GetBoundingBox() ); hasItems = true; } } @@ -911,23 +827,20 @@ bool BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) { if( m_PcbFrame->m_Draw_Sheet_Ref ) { - xmin = ymin = 0; - xmax = m_PcbFrame->GetScreen()->ReturnPageSize().x; - ymax = m_PcbFrame->GetScreen()->ReturnPageSize().y; + area.SetOrigin( 0, 0 ); + area.SetEnd( m_PcbFrame->GetScreen()->ReturnPageSize().x, + m_PcbFrame->GetScreen()->ReturnPageSize().y ); } else { - xmin = -m_PcbFrame->GetScreen()->ReturnPageSize().x / 2; - ymin = -m_PcbFrame->GetScreen()->ReturnPageSize().y / 2; - xmax = m_PcbFrame->GetScreen()->ReturnPageSize().x / 2; - ymax = m_PcbFrame->GetScreen()->ReturnPageSize().y / 2; + area.SetOrigin( -m_PcbFrame->GetScreen()->ReturnPageSize().x / 2, + -m_PcbFrame->GetScreen()->ReturnPageSize().y / 2 ); + area.SetEnd( m_PcbFrame->GetScreen()->ReturnPageSize().x / 2, + m_PcbFrame->GetScreen()->ReturnPageSize().y / 2 ); } } - m_BoundaryBox.SetX( xmin ); - m_BoundaryBox.SetY( ymin ); - m_BoundaryBox.SetWidth( xmax - xmin ); - m_BoundaryBox.SetHeight( ymax - ymin ); + m_BoundaryBox = area; return hasItems; } diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 44e004468d..9fc72cfd55 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -623,94 +623,10 @@ int MODULE::ReadDescr( LINE_READER* aReader ) } -/* Update the bounding rectangle of the module - * - * The bounding box includes outlines and pads, but not the fields. - * The rectangle is: - * for orientation 0 - * coordinates relative to the module anchor. - */ void MODULE::Set_Rectangle_Encadrement() { - int width; - int cx, cy, uxf, uyf, rayon; - int xmax, ymax; - int xmin, ymin; - - /* Initial coordinates of the module has a nonzero limit value. */ - xmin = ymin = -250; - xmax = ymax = 250; - - for( EDGE_MODULE* edge = (EDGE_MODULE*) m_Drawings.GetFirst(); - edge; edge = edge->Next() ) - { - if( edge->Type() != TYPE_EDGE_MODULE ) - continue; - - width = edge->m_Width / 2; - - switch( edge->m_Shape ) - { - case S_ARC: - case S_CIRCLE: - { - cx = edge->m_Start0.x; - cy = edge->m_Start0.y; // center - uxf = edge->m_End0.x; - uyf = edge->m_End0.y; - rayon = (int) hypot( (double) ( cx - uxf ), (double) ( cy - uyf ) ); - rayon += width; - xmin = MIN( xmin, cx - rayon ); - ymin = MIN( ymin, cy - rayon ); - xmax = MAX( xmax, cx + rayon ); - ymax = MAX( ymax, cy + rayon ); - break; - } - - case S_SEGMENT: - xmin = MIN( xmin, edge->m_Start0.x - width ); - xmin = MIN( xmin, edge->m_End0.x - width ); - ymin = MIN( ymin, edge->m_Start0.y - width ); - ymin = MIN( ymin, edge->m_End0.y - width ); - xmax = MAX( xmax, edge->m_Start0.x + width ); - xmax = MAX( xmax, edge->m_End0.x + width ); - ymax = MAX( ymax, edge->m_Start0.y + width ); - ymax = MAX( ymax, edge->m_End0.y + width ); - break; - - case S_POLYGON: - { - std::vector polyPoints = edge->GetPolyPoints(); - for( unsigned ii = 0; ii < polyPoints.size(); ii++ ) - { - wxPoint pt = polyPoints[ii]; - xmin = MIN( xmin, (pt.x - width) ); - ymin = MIN( ymin, (pt.y - width) ); - xmax = MAX( xmax, (pt.x + width) ); - ymax = MAX( ymax, (pt.y + width) ); - } - break; - } - } - } - - /* Pads: find the min and max coordinates and update the bounding box. - */ - for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) - { - rayon = pad->m_ShapeMaxRadius; - cx = pad->m_Pos0.x; - cy = pad->m_Pos0.y; - xmin = MIN( xmin, cx - rayon ); - ymin = MIN( ymin, cy - rayon ); - xmax = MAX( xmax, cx + rayon ); - ymax = MAX( ymax, cy + rayon ); - } - - m_BoundaryBox.m_Pos.x = xmin; - m_BoundaryBox.m_Pos.y = ymin; - m_BoundaryBox.SetWidth( xmax - xmin ); - m_BoundaryBox.SetHeight( ymax - ymin ); + m_BoundaryBox = GetFootPrintRect(); + m_Surface = ABS( (double) m_BoundaryBox.GetWidth() * m_BoundaryBox.GetHeight() ); } @@ -723,60 +639,27 @@ EDA_RECT MODULE::GetFootPrintRect() const area.Inflate( 500 ); // Give a min size for( EDGE_MODULE* edge = (EDGE_MODULE*) m_Drawings.GetFirst(); edge; edge = edge->Next() ) - { - if( edge->Type() != TYPE_EDGE_MODULE ) // Should not occur - continue; - - area.Merge( edge->GetBoundingBox() ); - } + if( edge->Type() == TYPE_TEXTE_MODULE ) + area.Merge( edge->GetBoundingBox() ); for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) - { area.Merge( pad->GetBoundingBox() ); - } return area; } -/* Equivalent to Module::Set_Rectangle_Encadrement() but in board coordinates: - * Updates the module bounding box on the board - * The rectangle is the rectangle with outlines and pads, but not the fields - * Also updates the surface (.M_Surface) module. - */ -void MODULE::SetRectangleExinscrit() -{ - m_RealBoundaryBox = GetFootPrintRect(); - - m_Surface = ABS( (double) m_RealBoundaryBox.GetWidth() * m_RealBoundaryBox.GetHeight() ); -} - - -/** - * Function GetBoundingBox - * returns the full bounding box of this Footprint, including fields - * Mainly used to redraw the screen area occupied by the footprint - */ EDA_RECT MODULE::GetBoundingBox() const { EDA_RECT area = GetFootPrintRect(); // Calculate extended area including text field: - EDA_RECT text_area; - text_area = m_Reference->GetBoundingBox(); - area.Merge( text_area ); - - text_area = m_Value->GetBoundingBox(); - area.Merge( text_area ); + area.Merge( m_Reference->GetBoundingBox() ); + area.Merge( m_Value->GetBoundingBox() ); for( EDGE_MODULE* edge = (EDGE_MODULE*) m_Drawings.GetFirst(); edge; edge = edge->Next() ) - { - if( edge->Type() != TYPE_TEXTE_MODULE ) - continue; - - text_area = ( (TEXTE_MODULE*) edge )->GetBoundingBox(); - area.Merge( text_area ); - } + if( edge->Type() == TYPE_TEXTE_MODULE ) + area.Merge( edge->GetBoundingBox() ); // Add the Clearance shape size: (shape around the pads when the // clearance is shown. Not optimized, but the draw cost is small @@ -866,49 +749,30 @@ void MODULE::DisplayInfo( EDA_DRAW_FRAME* frame ) } -/** - * Function HitTest - * tests if the given wxPoint is within the bounds of this object. - * @param refPos A wxPoint to test - * @return bool - true if a hit, else false - */ -bool MODULE::HitTest( const wxPoint& refPos ) +bool MODULE::HitTest( const wxPoint& aRefPos ) { - /* Calculation of the cursor coordinate relative to module */ - wxPoint pos = refPos - m_Pos; - - RotatePoint( &pos, -m_Orient ); - - /* Check if cursor is in the rectangle. */ - if( m_BoundaryBox.Contains( pos ) ) + if( m_BoundaryBox.Contains( aRefPos ) ) return true; return false; } -/** - * Function HitTest (overlaid) - * tests if the given EDA_RECT intersect the bounds of this object. - * @param refArea : the given EDA_RECT - * @return bool - true if a hit, else false - */ -bool MODULE::HitTest( EDA_RECT& refArea ) +bool MODULE::HitTest( EDA_RECT& aRefArea ) { - bool is_out_of_box = false; + if( m_BoundaryBox.m_Pos.x < aRefArea.GetX() ) + return false; - SetRectangleExinscrit(); + if( m_BoundaryBox.m_Pos.y < aRefArea.GetY() ) + return false; - if( m_RealBoundaryBox.m_Pos.x < refArea.GetX() ) - is_out_of_box = true; - if( m_RealBoundaryBox.m_Pos.y < refArea.GetY() ) - is_out_of_box = true; - if( m_RealBoundaryBox.GetRight() > refArea.GetRight() ) - is_out_of_box = true; - if( m_RealBoundaryBox.GetBottom() > refArea.GetBottom() ) - is_out_of_box = true; + if( m_BoundaryBox.GetRight() > aRefArea.GetRight() ) + return false; - return is_out_of_box ? false : true; + if( m_BoundaryBox.GetBottom() > aRefArea.GetBottom() ) + return false; + + return true; } diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h index cf20f2f90a..7baa8cbc46 100644 --- a/pcbnew/class_module.h +++ b/pcbnew/class_module.h @@ -58,9 +58,7 @@ public: * routing. */ int m_ModuleStatus; /* For autoplace: flags (LOCKED, * AUTOPLACED) */ - EDA_RECT m_BoundaryBox; /* Bounding box coordinates relatives - * to the anchor, orient 0*/ - EDA_RECT m_RealBoundaryBox; /* Bounding box : coordinates on board, + EDA_RECT m_BoundaryBox; /* Bounding box : coordinates on board, * real orientation */ int m_PadNum; // Pad count int m_AltPadNum; /* Pad with netcode > 0 (active pads) @@ -115,31 +113,25 @@ public: * void Add( BOARD_ITEM* aBoardItem, bool doInsert = true ); */ - /** * Function Set_Rectangle_Encadrement - * calculates the bounding box for orient 0 at origin = module anchor) + * calculates the bounding box in board coordinates. */ void Set_Rectangle_Encadrement(); - /** - * Function SetRectangleExinscrit - * Calculates the real bounding box according to the board position, - * and real orientation and also calculates the area value (used in - * automatic placement) - */ - void SetRectangleExinscrit(); - /** * Function GetFootPrintRect() * Returns the area of the module footprint excluding any text. + * @return EDA_RECT - The rectangle containing the footprint. */ EDA_RECT GetFootPrintRect() const; /** * Function GetBoundingBox - * returns the bounding box of this Footprint - * Mainly used to redraw the screen area occupied by the footprint + * returns the bounding box of this + * tootprint. Mainly used to redraw the screen area occupied by + * the footprint. + * @return EDA_RECT - The rectangle containing the footprint and texts. */ EDA_RECT GetBoundingBox() const; @@ -261,19 +253,19 @@ public: /** * Function HitTest * tests if the given wxPoint is within the bounds of this object. - * @param refPos A wxPoint to test - * @return bool - true if a hit, else false + * @param aRefPos is a wxPoint to test. + * @return bool - true if a hit, else false. */ - bool HitTest( const wxPoint& refPos ); + bool HitTest( const wxPoint& aRefPos ); /** * Function HitTest (overlaid) * tests if the given EDA_RECT intersect the bounds of this object. - * @param refArea : the given EDA_RECT - * @return bool - true if a hit, else false + * @param aRefArea is the given EDA_RECT. + * @return bool - true if a hit, else false. */ - bool HitTest( EDA_RECT& refArea ); + bool HitTest( EDA_RECT& aRefArea ); /** * Function GetReference diff --git a/pcbnew/class_pcb_text.h b/pcbnew/class_pcb_text.h index 1239b7e150..a4357733ab 100644 --- a/pcbnew/class_pcb_text.h +++ b/pcbnew/class_pcb_text.h @@ -135,6 +135,8 @@ public: virtual BITMAP_DEF GetMenuImage() const { return add_text_xpm; } + virtual EDA_RECT GetBoundingBox() const { return GetTextBox(); }; + #if defined(DEBUG) /** * Function Show diff --git a/pcbnew/locate.cpp b/pcbnew/locate.cpp index 6c1573cc07..0359c19f1c 100644 --- a/pcbnew/locate.cpp +++ b/pcbnew/locate.cpp @@ -209,13 +209,9 @@ MODULE* Locate_Prefered_Module( BOARD* aPcb, const wxPoint& aPosition, int aActi /* Test of minimum size to choosing the best candidate. */ - int offx = pt_module->m_BoundaryBox.m_Size.x / 2 + - pt_module->m_BoundaryBox.m_Pos.x + - pt_module->m_Pos.x; - - int offy = pt_module->m_BoundaryBox.m_Size.y / 2 - + pt_module->m_BoundaryBox.m_Pos.y - + pt_module->m_Pos.y; + EDA_RECT bb = pt_module->GetFootPrintRect(); + int offx = bb.GetX() + bb.GetWidth() / 2; + int offy = bb.GetY() + bb.GetHeight() / 2; //off x & offy point to the middle of the box. int dist = abs( aPosition.x - offx ) + abs( aPosition.y - offy );