fix bug 692240: a subtle bug in LIB_COMPONENT::LocateDrawItem() that destroys DefaultTransform matrix.

This commit is contained in:
jean-pierre charras 2010-12-23 11:00:55 +01:00
parent 263e5c2413
commit b700f7c248
3 changed files with 12 additions and 26 deletions

View File

@ -1361,27 +1361,12 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert, KICAD_T a
* we temporary copy aTransMat in DefaultTransformMatrix
*/
LIB_DRAW_ITEM* item;
TRANSFORM transform;
for ( int ii = 0; ii < 2; ii++ )
{
for ( int jj = 0; jj < 2; jj++ )
{
transform = DefaultTransform;
DefaultTransform = aTransform;
}
}
TRANSFORM transform = DefaultTransform;
item = LocateDrawItem( aUnit, aConvert, aType, aPoint );
//Restore matrix
for ( int ii = 0; ii < 2; ii++ )
{
for ( int jj = 0; jj < 2; jj++ )
{
DefaultTransform = transform;
}
}
DefaultTransform = transform;
return item;
}

View File

@ -685,40 +685,41 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheet )
void SCH_COMPONENT::SetOrientation( int aOrientation )
{
TRANSFORM temp = TRANSFORM();
bool Transform = false;
switch( aOrientation )
{
case CMP_ORIENT_0:
case CMP_NORMAL: /* Position Initiale */
case CMP_NORMAL: // default transform matrix
m_transform.x1 = 1;
m_transform.y2 = -1;
m_transform.x2 = m_transform.y1 = 0;
break;
case CMP_ROTATE_CLOCKWISE: /* Rotate + */
case CMP_ROTATE_CLOCKWISE: // Rotate + (incremental rotation)
temp.x1 = temp.y2 = 0;
temp.y1 = 1;
temp.x2 = -1;
Transform = true;
break;
case CMP_ROTATE_COUNTERCLOCKWISE: /* Rotate - */
case CMP_ROTATE_COUNTERCLOCKWISE: // Rotate - (incremental rotation)
temp.x1 = temp.y2 = 0;
temp.y1 = -1;
temp.x2 = 1;
Transform = true;
break;
case CMP_MIRROR_Y: /* MirrorY */
case CMP_MIRROR_Y: // Mirror Y (incremental rotation)
temp.x1 = -1;
temp.y2 = 1;
temp.y1 = temp.x2 = 0;
Transform = true;
break;
case CMP_MIRROR_X: /* MirrorX */
case CMP_MIRROR_X: // Mirror X (incremental rotation)
temp.x1 = 1;
temp.y2 = -1;
temp.y1 = temp.x2 = 0;
@ -790,14 +791,14 @@ void SCH_COMPONENT::SetOrientation( int aOrientation )
if( Transform )
{
/* The new matrix transform is the old matrix transform modified by the
* requested transformation, which is the TempMat transform (rot,
* requested transformation, which is the temp transform (rot,
* mirror ..) in order to have (in term of matrix transform):
* transform coord = new_m_transform * coord
* where transform coord is the coord modified by new_m_transform from
* the initial value coord.
* new_m_transform is computed (from old_m_transform and TempMat) to
* new_m_transform is computed (from old_m_transform and temp) to
* have:
* transform coord = old_m_transform * coord * TempMat
* transform coord = old_m_transform * temp
*/
TRANSFORM newTransform;

View File

@ -381,7 +381,7 @@ void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_IMPORT_GLABEL:
if( screen->GetCurItem() && screen->GetCurItem()->Type() == SCH_SHEET_T )
GetScreen()->SetCurItem( Import_PinSheet( (SCH_SHEET*) screen->GetCurItem(), &dc ) );
screen->SetCurItem( Import_PinSheet( (SCH_SHEET*) screen->GetCurItem(), &dc ) );
break;
case ID_POPUP_SCH_CLEANUP_SHEET: