double LIB_EDIT_FRAME::BestZoom() { /* Please, note: wxMSW before version 2.9 seems have * problems with zoom values < 1 ( i.e. userscale > 1) and needs to be patched: * edit file <wxWidgets>/src/msw/dc.cpp * search for line static const int VIEWPORT_EXTENT = 1000; * and replace by static const int VIEWPORT_EXTENT = 10000; */ int dx, dy; LIB_PART* part = GetCurPart(); if( part ) { EDA_RECT boundingBox = part->GetBoundingBox( m_unit, m_convert ); dx = boundingBox.GetWidth(); dy = boundingBox.GetHeight(); SetScrollCenterPosition( wxPoint( 0, 0 ) ); } else { const PAGE_INFO& pageInfo = GetScreen()->GetPageSettings(); dx = pageInfo.GetSizeIU().x; dy = pageInfo.GetSizeIU().y; SetScrollCenterPosition( wxPoint( 0, 0 ) ); } wxSize size = m_canvas->GetClientSize(); // Reserve a 10% margin around component bounding box. double margin_scale_factor = 0.8; double zx =(double) dx / ( margin_scale_factor * (double)size.x ); double zy = (double) dy / ( margin_scale_factor * (double)size.y ); double bestzoom = std::max( zx, zy ); // keep it >= minimal existing zoom (can happen for very small components // for instance when starting a new component if( bestzoom < GetScreen()->m_ZoomList[0] ) bestzoom = GetScreen()->m_ZoomList[0]; return bestzoom; }
double LIB_VIEW_FRAME::BestZoom() { /* Please, note: wxMSW before version 2.9 seems have * problems with zoom values < 1 ( i.e. userscale > 1) and needs to be patched: * edit file <wxWidgets>/src/msw/dc.cpp * search for line static const int VIEWPORT_EXTENT = 1000; * and replace by static const int VIEWPORT_EXTENT = 10000; */ LIB_COMPONENT* component = NULL; double bestzoom = 16.0; // default value for bestzoom CMP_LIBRARY* lib = CMP_LIBRARY::FindLibrary( m_libraryName ); if( lib ) component = lib->FindComponent( m_entryName ); if( component == NULL ) { SetScrollCenterPosition( wxPoint( 0, 0 ) ); return bestzoom; } wxSize size = m_canvas->GetClientSize(); EDA_RECT BoundaryBox = component->GetBoundingBox( m_unit, m_convert ); // Reserve a 10% margin around component bounding box. double margin_scale_factor = 0.8; double zx =(double) BoundaryBox.GetWidth() / ( margin_scale_factor * (double)size.x ); double zy = (double) BoundaryBox.GetHeight() / ( margin_scale_factor * (double)size.y); // Calculates the best zoom bestzoom = std::max( zx, zy ); // keep it >= minimal existing zoom (can happen for very small components // like small power symbols if( bestzoom < GetScreen()->m_ZoomList[0] ) bestzoom = GetScreen()->m_ZoomList[0]; SetScrollCenterPosition( BoundaryBox.Centre() ); return bestzoom; }
double LIB_VIEW_FRAME::BestZoom() { LIB_PART* part = NULL; double defaultLibraryZoom = 7.33; if( m_libraryName.IsEmpty() || m_entryName.IsEmpty() ) { SetScrollCenterPosition( wxPoint( 0, 0 ) ); return defaultLibraryZoom; } LIB_ALIAS* alias = nullptr; try { alias = Prj().SchSymbolLibTable()->LoadSymbol( m_libraryName, m_entryName ); } catch( ... ) { } if( alias ) part = alias->GetPart(); if( !part ) { SetScrollCenterPosition( wxPoint( 0, 0 ) ); return defaultLibraryZoom; } EDA_RECT boundingBox = part->GetUnitBoundingBox( m_unit, m_convert ); double sizeX = (double) boundingBox.GetWidth(); double sizeY = (double) boundingBox.GetHeight(); wxPoint centre = boundingBox.Centre(); // Reserve a 20% margin around component bounding box. double margin_scale_factor = 1.2; return bestZoom( sizeX, sizeY, margin_scale_factor, centre ); }
// Factor out the calculation portion of the various BestZoom() implementations. // // Note that like it's forerunners this routine has an intentional side-effect: it // sets the scroll centre position. While I'm not happy about that, it's probably // not worth fixing as its days are numbered (GAL canvases use a different method). double EDA_DRAW_FRAME::bestZoom( double sizeX, double sizeY, double scaleFactor, wxPoint centre ) { double bestzoom = std::max( sizeX * scaleFactor / (double) m_canvas->GetClientSize().x, sizeY * scaleFactor / (double) m_canvas->GetClientSize().y ); // Take scrollbars into account DSIZE scrollbarSize = m_canvas->GetSize() - m_canvas->GetClientSize(); centre.x -= int( bestzoom * scrollbarSize.x / 2.0 ); centre.y -= int( bestzoom * scrollbarSize.y / 2.0 ); SetScrollCenterPosition( centre ); return bestzoom; }
double PCB_BASE_FRAME::BestZoom() { if( m_Pcb == NULL ) return 1.0; EDA_RECT ibbbox = GetBoardBoundingBox(); DSIZE clientz = m_canvas->GetClientSize(); DSIZE boardz( ibbbox.GetWidth(), ibbbox.GetHeight() ); double iu_per_du_X = clientz.x ? boardz.x / clientz.x : 1.0; double iu_per_du_Y = clientz.y ? boardz.y / clientz.y : 1.0; double bestzoom = std::max( iu_per_du_X, iu_per_du_Y ); SetScrollCenterPosition( ibbbox.Centre() ); return bestzoom; }
double GERBVIEW_FRAME::BestZoom() { GERBER_DRAW_ITEM* item = GetGerberLayout()->m_Drawings; // gives a minimal value to zoom, if no item in list if( item == NULL ) return ZOOM_FACTOR( 350.0 ); EDA_RECT bbox = GetGerberLayout()->ComputeBoundingBox(); wxSize size = m_canvas->GetClientSize(); double x = (double) bbox.GetWidth() / (double) size.x; double y = (double) bbox.GetHeight() / (double) size.y; SetScrollCenterPosition( bbox.Centre() ); double best_zoom = std::max( x, y ); return best_zoom; }
double GERBVIEW_FRAME::BestZoom() { EDA_RECT bbox = GetGerberLayout()->ComputeBoundingBox(); // gives a size to bbox (current page size), if no item in list if( bbox.GetWidth() == 0 || bbox.GetHeight() == 0 ) { wxSize pagesize = GetPageSettings().GetSizeMils(); bbox.SetSize( wxSize( Mils2iu( pagesize.x ), Mils2iu( pagesize.y ) ) ); } // Compute best zoom: wxSize size = m_canvas->GetClientSize(); double x = (double) bbox.GetWidth() / (double) size.x; double y = (double) bbox.GetHeight() / (double) size.y; double best_zoom = std::max( x, y ) * 1.1; SetScrollCenterPosition( bbox.Centre() ); return best_zoom; }
double LIB_EDIT_FRAME::BestZoom() { LIB_PART* part = GetCurPart(); double defaultLibraryZoom = 7.33; if( !part ) { SetScrollCenterPosition( wxPoint( 0, 0 ) ); return defaultLibraryZoom; } EDA_RECT boundingBox = part->GetUnitBoundingBox( m_unit, m_convert ); double sizeX = (double) boundingBox.GetWidth(); double sizeY = (double) boundingBox.GetHeight(); wxPoint centre = boundingBox.Centre(); // Reserve a 20% margin around component bounding box. double margin_scale_factor = 1.2; return bestZoom( sizeX, sizeY, margin_scale_factor, centre); }
double PL_EDITOR_FRAME::BestZoom() { int dx, dy; wxSize size; dx = GetPageLayout().GetPageSettings().GetWidthIU(); dy = GetPageLayout().GetPageSettings().GetHeightIU(); size = m_canvas->GetClientSize(); // Reserve no margin because best zoom shows the full page // and margins are already included in function that draws the sheet refernces double margin_scale_factor = 1.0; double zx =(double) dx / ( margin_scale_factor * (double)size.x ); double zy = (double) dy / ( margin_scale_factor * (double)size.y ); double bestzoom = std::max( zx, zy ); SetScrollCenterPosition( wxPoint( dx / 2, dy / 2 ) ); return bestzoom; }
void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPositionIU ) { BASE_SCREEN* screen = GetScreen(); if( !screen || !m_canvas ) return; double scale = screen->GetScalingFactor(); wxLogTrace( traceScrollSettings, wxT( "Center Position = ( %d, %d ), scale = %.10g" ), aCenterPositionIU.x, aCenterPositionIU.y, scale ); // Calculate the portion of the drawing that can be displayed in the // client area at the current zoom level. // visible viewport in device units ~ pixels wxSize clientSizeDU = m_canvas->GetClientSize(); // Size of the client window in IU DSIZE clientSizeIU( clientSizeDU.x / scale, clientSizeDU.y / scale ); // Full drawing or "page" rectangle in internal units DBOX pageRectIU( wxPoint( 0, 0 ), wxSize( GetPageSizeIU().x, GetPageSizeIU().y ) ); // The upper left corner of the client rectangle in internal units. double xIU = aCenterPositionIU.x - clientSizeIU.x / 2.0; double yIU = aCenterPositionIU.y - clientSizeIU.y / 2.0; // If drawn around the center, adjust the client rectangle accordingly. if( screen->m_Center ) { // half page offset. xIU += pageRectIU.GetWidth() / 2.0; yIU += pageRectIU.GetHeight() / 2.0; } DBOX clientRectIU( wxPoint( xIU, yIU ), wxSize( clientSizeIU.x, clientSizeIU.y ) ); wxPoint centerPositionIU; // put "int" limits on the clientRect if( clientRectIU.GetLeft() < VIRT_MIN ) clientRectIU.MoveLeftTo( VIRT_MIN ); if( clientRectIU.GetTop() < VIRT_MIN ) clientRectIU.MoveTopTo( VIRT_MIN ); if( clientRectIU.GetRight() > VIRT_MAX ) clientRectIU.MoveRightTo( VIRT_MAX ); if( clientRectIU.GetBottom() > VIRT_MAX ) clientRectIU.MoveBottomTo( VIRT_MAX ); centerPositionIU.x = KiROUND( clientRectIU.GetX() + clientRectIU.GetWidth() / 2 ); centerPositionIU.y = KiROUND( clientRectIU.GetY() + clientRectIU.GetHeight() / 2 ); if( screen->m_Center ) { centerPositionIU.x -= KiROUND( pageRectIU.GetWidth() / 2.0 ); centerPositionIU.y -= KiROUND( pageRectIU.GetHeight() / 2.0 ); } DSIZE virtualSizeIU; if( pageRectIU.GetLeft() < clientRectIU.GetLeft() && pageRectIU.GetRight() > clientRectIU.GetRight() ) { virtualSizeIU.x = pageRectIU.GetSize().x; } else { double pageCenterX = pageRectIU.GetX() + ( pageRectIU.GetWidth() / 2 ); double clientCenterX = clientRectIU.GetX() + ( clientRectIU.GetWidth() / 2 ); if( clientRectIU.GetWidth() > pageRectIU.GetWidth() ) { if( pageCenterX > clientCenterX ) virtualSizeIU.x = ( pageCenterX - clientRectIU.GetLeft() ) * 2; else if( pageCenterX < clientCenterX ) virtualSizeIU.x = ( clientRectIU.GetRight() - pageCenterX ) * 2; else virtualSizeIU.x = clientRectIU.GetWidth(); } else { if( pageCenterX > clientCenterX ) virtualSizeIU.x = pageRectIU.GetWidth() + ( (pageRectIU.GetLeft() - clientRectIU.GetLeft() ) * 2 ); else if( pageCenterX < clientCenterX ) virtualSizeIU.x = pageRectIU.GetWidth() + ( (clientRectIU.GetRight() - pageRectIU.GetRight() ) * 2 ); else virtualSizeIU.x = pageRectIU.GetWidth(); } } if( pageRectIU.GetTop() < clientRectIU.GetTop() && pageRectIU.GetBottom() > clientRectIU.GetBottom() ) { virtualSizeIU.y = pageRectIU.GetSize().y; } else { double pageCenterY = pageRectIU.GetY() + ( pageRectIU.GetHeight() / 2 ); double clientCenterY = clientRectIU.GetY() + ( clientRectIU.GetHeight() / 2 ); if( clientRectIU.GetHeight() > pageRectIU.GetHeight() ) { if( pageCenterY > clientCenterY ) virtualSizeIU.y = ( pageCenterY - clientRectIU.GetTop() ) * 2; else if( pageCenterY < clientCenterY ) virtualSizeIU.y = ( clientRectIU.GetBottom() - pageCenterY ) * 2; else virtualSizeIU.y = clientRectIU.GetHeight(); } else { if( pageCenterY > clientCenterY ) virtualSizeIU.y = pageRectIU.GetHeight() + ( ( pageRectIU.GetTop() - clientRectIU.GetTop() ) * 2 ); else if( pageCenterY < clientCenterY ) virtualSizeIU.y = pageRectIU.GetHeight() + ( ( clientRectIU.GetBottom() - pageRectIU.GetBottom() ) * 2 ); else virtualSizeIU.y = pageRectIU.GetHeight(); } } // put "int" limits on the virtualSizeIU virtualSizeIU.x = std::min( virtualSizeIU.x, MAX_AXIS ); virtualSizeIU.y = std::min( virtualSizeIU.y, MAX_AXIS ); if( screen->m_Center ) { screen->m_DrawOrg.x = -KiROUND( virtualSizeIU.x / 2.0 ); screen->m_DrawOrg.y = -KiROUND( virtualSizeIU.y / 2.0 ); } else { screen->m_DrawOrg.x = -KiROUND( ( virtualSizeIU.x - pageRectIU.GetWidth() ) / 2.0 ); screen->m_DrawOrg.y = -KiROUND( ( virtualSizeIU.y - pageRectIU.GetHeight() ) / 2.0 ); } /* Always set scrollbar pixels per unit to 1 unless you want the zoom * around cursor to jump around. This reported problem occurs when the * zoom point is not on a pixel per unit increment. If you set the * pixels per unit to 10, you have potential for the zoom point to * jump around +/-5 pixels from the nearest grid point. */ screen->m_ScrollPixelsPerUnitX = screen->m_ScrollPixelsPerUnitY = 1; // Number of scroll bar units for the given zoom level in device units. double unitsX = virtualSizeIU.x * scale; double unitsY = virtualSizeIU.y * scale; // Calculate the scroll bar position in internal units to place the // center position at the center of client rectangle. SetScrollCenterPosition( centerPositionIU ); double posX = centerPositionIU.x - clientRectIU.GetWidth() / 2.0 - screen->m_DrawOrg.x; double posY = centerPositionIU.y - clientRectIU.GetHeight() / 2.0 - screen->m_DrawOrg.y; // Convert scroll bar position to device units. posX = KiROUND( posX * scale ); posY = KiROUND( posY * scale ); if( posX < 0 ) { wxLogTrace( traceScrollSettings, wxT( "Required scroll bar X position %.10g" ), posX ); posX = 0; } if( posX > unitsX ) { wxLogTrace( traceScrollSettings, wxT( "Required scroll bar X position %.10g" ), posX ); posX = unitsX; } if( posY < 0 ) { wxLogTrace( traceScrollSettings, wxT( "Required scroll bar Y position %.10g" ), posY ); posY = 0; } if( posY > unitsY ) { wxLogTrace( traceScrollSettings, wxT( "Required scroll bar Y position %.10g" ), posY ); posY = unitsY; } screen->m_ScrollbarPos = wxPoint( KiROUND( posX ), KiROUND( posY ) ); screen->m_ScrollbarNumber = wxSize( KiROUND( unitsX ), KiROUND( unitsY ) ); wxLogTrace( traceScrollSettings, wxT( "Drawing = (%.10g, %.10g), Client = (%.10g, %.10g), Offset = (%d, %d), SetScrollbars(%d, %d, %d, %d, %d, %d)" ), virtualSizeIU.x, virtualSizeIU.y, clientSizeIU.x, clientSizeIU.y, screen->m_DrawOrg.x, screen->m_DrawOrg.y, screen->m_ScrollPixelsPerUnitX, screen->m_ScrollPixelsPerUnitY, screen->m_ScrollbarNumber.x, screen->m_ScrollbarNumber.y, screen->m_ScrollbarPos.x, screen->m_ScrollbarPos.y ); bool noRefresh = true; m_canvas->SetScrollbars( screen->m_ScrollPixelsPerUnitX, screen->m_ScrollPixelsPerUnitY, screen->m_ScrollbarNumber.x, screen->m_ScrollbarNumber.y, screen->m_ScrollbarPos.x, screen->m_ScrollbarPos.y, noRefresh ); }