Gerbview: add refinements to option to set offset and rotation of layers.

Fix incorrect calculation of bounding boxes when the rotation is not n*90 deg.
This commit is contained in:
jean-pierre charras 2023-09-08 10:43:59 +02:00
parent 3cd60007c5
commit 72984c5c40
4 changed files with 43 additions and 22 deletions

View File

@ -54,9 +54,9 @@ bool DIALOG_DRAW_LAYERS_SETTINGS::TransferDataToWindow()
wxFileName filename( gbrImage->m_FileName ); wxFileName filename( gbrImage->m_FileName );
m_stLayerName->SetLabel( filename.GetFullName() ); m_stLayerName->SetLabel( filename.GetFullName() );
m_offsetX.SetValue( gbrImage->m_DrawOffset.x ); m_offsetX.SetValue( gbrImage->m_DisplayOffset.x );
m_offsetY.SetValue( gbrImage->m_DrawOffset.y ); m_offsetY.SetValue( gbrImage->m_DisplayOffset.y );
m_rotation.SetValue( gbrImage->m_DrawRotation.AsDegrees() ); m_rotation.SetValue( gbrImage->m_DisplayRotation.AsDegrees() );
return true; return true;
} }

View File

@ -161,11 +161,11 @@ VECTOR2I GERBER_DRAW_ITEM::GetABPosition( const VECTOR2I& aXYPosition ) const
abPos.y = -abPos.y; abPos.y = -abPos.y;
// Now generate the draw transform // Now generate the draw transform
if( !m_GerberImageFile->m_DrawRotation.IsZero() ) if( !m_GerberImageFile->m_DisplayRotation.IsZero() )
RotatePoint( abPos, m_GerberImageFile->m_DrawRotation ); RotatePoint( abPos, m_GerberImageFile->m_DisplayRotation );
abPos.x += KiROUND( m_GerberImageFile->m_DrawOffset.x * m_drawScale.x ); abPos.x += KiROUND( m_GerberImageFile->m_DisplayOffset.x * m_drawScale.x );
abPos.y += KiROUND( m_GerberImageFile->m_DrawOffset.y * m_drawScale.y ); abPos.y += KiROUND( m_GerberImageFile->m_DisplayOffset.y * m_drawScale.y );
return abPos; return abPos;
} }
@ -177,11 +177,11 @@ VECTOR2I GERBER_DRAW_ITEM::GetXYPosition( const VECTOR2I& aABPosition ) const
VECTOR2I xyPos = aABPosition; VECTOR2I xyPos = aABPosition;
// First, undo the draw transform // First, undo the draw transform
xyPos.x -= KiROUND( m_GerberImageFile->m_DrawOffset.x * m_drawScale.x ); xyPos.x -= KiROUND( m_GerberImageFile->m_DisplayOffset.x * m_drawScale.x );
xyPos.y -= KiROUND( m_GerberImageFile->m_DrawOffset.y * m_drawScale.y ); xyPos.y -= KiROUND( m_GerberImageFile->m_DisplayOffset.y * m_drawScale.y );
if( !m_GerberImageFile->m_DrawRotation.IsZero() ) if( !m_GerberImageFile->m_DisplayRotation.IsZero() )
RotatePoint( xyPos, -m_GerberImageFile->m_DrawRotation ); RotatePoint( xyPos, -m_GerberImageFile->m_DisplayRotation );
if( m_mirrorA ) if( m_mirrorA )
xyPos.x = -xyPos.x; xyPos.x = -xyPos.x;
@ -387,8 +387,29 @@ const BOX2I GERBER_DRAW_ITEM::GetBoundingBox() const
} }
// calculate the corners coordinates in current Gerber axis orientations // calculate the corners coordinates in current Gerber axis orientations
VECTOR2I org = GetABPosition( bbox.GetOrigin() ); // because the initial bbox is a horizontal rect, but the bbox in AB position
VECTOR2I end = GetABPosition( bbox.GetEnd() ); // is the bbox image with perhaps a rotation, we need to calculate the coords of the
// corners of the bbox rotated, and then calculate the final bounding box
VECTOR2I corners[4];
corners[0] = bbox.GetOrigin(); // top left
corners[2] = bbox.GetEnd(); // bottom right
corners[1] = VECTOR2I( corners[2].x, corners[0].y ); // top right
corners[3] = VECTOR2I( corners[0].x, corners[2].y ); // bottom left
VECTOR2I org;
VECTOR2I end;
for( int ii = 0; ii < 4; ii++ )
{
corners[ii] = GetABPosition( corners[ii] );
org.x = std::min( org.x, corners[ii].x );
org.y = std::min( org.y, corners[ii].y );
end.x = std::max( end.x, corners[ii].x );
end.y = std::max( end.y, corners[ii].y );
}
// Set the corners position: // Set the corners position:
bbox.SetOrigin( org ); bbox.SetOrigin( org );

View File

@ -111,9 +111,9 @@ GERBER_FILE_IMAGE::~GERBER_FILE_IMAGE()
void GERBER_FILE_IMAGE::SetDrawOffetAndRotation( VECTOR2D aOffsetMM, EDA_ANGLE aRotation ) void GERBER_FILE_IMAGE::SetDrawOffetAndRotation( VECTOR2D aOffsetMM, EDA_ANGLE aRotation )
{ {
m_DrawOffset.x = KiROUND( aOffsetMM.x * gerbIUScale.IU_PER_MM ); m_DisplayOffset.x = KiROUND( aOffsetMM.x * gerbIUScale.IU_PER_MM );
m_DrawOffset.y = KiROUND( aOffsetMM.y * gerbIUScale.IU_PER_MM ); m_DisplayOffset.y = KiROUND( aOffsetMM.y * gerbIUScale.IU_PER_MM );
m_DrawRotation = aRotation; m_DisplayRotation = aRotation;
// Clear m_AbsolutePolygon member of Gerber items, because draw coordinates // Clear m_AbsolutePolygon member of Gerber items, because draw coordinates
// are now outdated // are now outdated
@ -226,8 +226,8 @@ void GERBER_FILE_IMAGE::ResetDefaultValues()
m_Last_Pen_Command = 0; m_Last_Pen_Command = 0;
m_Exposure = false; m_Exposure = false;
m_DrawOffset.x = m_DrawOffset.y = 0; m_DisplayOffset.x = m_DisplayOffset.y = 0;
m_DrawRotation = ANGLE_0; m_DisplayRotation = ANGLE_0;
} }

View File

@ -464,10 +464,10 @@ public:
GERBER_LAYER m_GBRLayerParams; // hold params for the current gerber layer GERBER_LAYER m_GBRLayerParams; // hold params for the current gerber layer
GERBER_DRAW_ITEMS m_drawings; // linked list of Gerber Items to draw GERBER_DRAW_ITEMS m_drawings; // linked list of Gerber Items to draw
///< Parameters used only to draw items on this layer. ///< Parameters used only to draw (display) items on this layer.
///< Not not change actual coordinates/orientation ///< Do not change actual coordinates/orientation
VECTOR2I m_DrawOffset; VECTOR2I m_DisplayOffset;
EDA_ANGLE m_DrawRotation; EDA_ANGLE m_DisplayRotation;
private: private:
wxArrayString m_messagesList; // A list of messages created when reading a file wxArrayString m_messagesList; // A list of messages created when reading a file