Loading pcbnew/automove.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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(); Loading pcbnew/autoplac.cpp +19 −22 Original line number Diff line number Diff line Loading @@ -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 ++; } Loading Loading @@ -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. */ Loading Loading @@ -277,7 +276,6 @@ end_of_tst: GetScreen()->SetCrossHairPosition( CurrPosition ); Module->Set_Rectangle_Encadrement(); Module->SetRectangleExinscrit(); GenModuleOnBoard( Module ); Module->m_ModuleStatus |= MODULE_is_PLACED; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 ); Loading @@ -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 ); Loading Loading @@ -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 ); Loading Loading @@ -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 ) Loading Loading @@ -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 ); Loading pcbnew/class_board.cpp +35 −122 Original line number Diff line number Diff line Loading @@ -761,136 +761,51 @@ 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() ) { switch( PtStruct->Type() ) { case TYPE_DRAWSEGMENT: for( BOARD_ITEM* item = m_Drawings; item != NULL; item = item->Next() ) { DRAWSEGMENT* ptr; ptr = (DRAWSEGMENT*) PtStruct; d = (ptr->m_Width / 2) + 1; if( aBoardEdgesOnly && ptr->GetLayer() != EDGE_N ) break; if( aBoardEdgesOnly && item->Type() != TYPE_DRAWSEGMENT && item->GetLayer() != EDGE_N ) continue; 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; } if( !hasItems ) area = item->GetBoundingBox(); 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 ); area.Merge( item->GetBoundingBox() ); 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( !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; } Loading @@ -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; } } Loading @@ -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; } Loading pcbnew/class_module.cpp +21 −157 Original line number Diff line number Diff line Loading @@ -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<wxPoint> 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() ); } Loading @@ -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; 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 Loading Loading @@ -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; } Loading pcbnew/class_module.h +13 −21 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading
pcbnew/automove.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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(); Loading
pcbnew/autoplac.cpp +19 −22 Original line number Diff line number Diff line Loading @@ -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 ++; } Loading Loading @@ -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. */ Loading Loading @@ -277,7 +276,6 @@ end_of_tst: GetScreen()->SetCrossHairPosition( CurrPosition ); Module->Set_Rectangle_Encadrement(); Module->SetRectangleExinscrit(); GenModuleOnBoard( Module ); Module->m_ModuleStatus |= MODULE_is_PLACED; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 ); Loading @@ -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 ); Loading Loading @@ -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 ); Loading Loading @@ -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 ) Loading Loading @@ -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 ); Loading
pcbnew/class_board.cpp +35 −122 Original line number Diff line number Diff line Loading @@ -761,136 +761,51 @@ 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() ) { switch( PtStruct->Type() ) { case TYPE_DRAWSEGMENT: for( BOARD_ITEM* item = m_Drawings; item != NULL; item = item->Next() ) { DRAWSEGMENT* ptr; ptr = (DRAWSEGMENT*) PtStruct; d = (ptr->m_Width / 2) + 1; if( aBoardEdgesOnly && ptr->GetLayer() != EDGE_N ) break; if( aBoardEdgesOnly && item->Type() != TYPE_DRAWSEGMENT && item->GetLayer() != EDGE_N ) continue; 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; } if( !hasItems ) area = item->GetBoundingBox(); 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 ); area.Merge( item->GetBoundingBox() ); 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( !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; } Loading @@ -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; } } Loading @@ -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; } Loading
pcbnew/class_module.cpp +21 −157 Original line number Diff line number Diff line Loading @@ -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<wxPoint> 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() ); } Loading @@ -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; 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 Loading Loading @@ -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; } Loading
pcbnew/class_module.h +13 −21 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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 Loading