Commit dea07b0f authored by charras's avatar charras

broken SCH_COMPONENT::GetRotationMiroir() rewritten (problem when editing a...

broken SCH_COMPONENT::GetRotationMiroir() rewritten (problem when editing a mirrored and rotated component fixed)
parent 4b212810
......@@ -820,69 +820,46 @@ void SCH_COMPONENT::SetRotationMiroir( int type_rotate )
int SCH_COMPONENT::GetRotationMiroir()
/** function GetRotationMiroir()
* Used to display component orientation (in dialog editor or info)
* @return the orientation and mirror
* Note: Because there are different ways to have a given orientation/mirror,
* the orientation/mirror is not necessary wht the used does
* (example : a mirrorX then a mirrorY give no mirror but rotate the component).
* So this function find a rotation and a mirror value
* ( CMP_MIROIR_X because this is the first mirror option tested)
* but can differs from the orientation made by an user
* ( a CMP_MIROIR_Y is find as a CMP_MIROIR_X + orientation 180, because they are equivalent)
*
*/
{
int type_rotate = CMP_ORIENT_0;
int TempMat[2][2], MatNormal[2][2];
int ComponentMatOrient[2][2];
int ii;
bool found = FALSE;
memcpy( TempMat, m_Transform, sizeof( TempMat ) );
SetRotationMiroir( CMP_ORIENT_0 );
memcpy( MatNormal, m_Transform, sizeof( MatNormal ) );
for( ii = 0; ii < 4; ii++ )
#define ROTATE_VALUES_COUNT 12
int rotate_value[ROTATE_VALUES_COUNT] = // list of all possibilities, but only the first 8 are actually used
{
if( memcmp( TempMat, m_Transform, sizeof(MatNormal) ) == 0 )
{
found = TRUE;
break;
}
SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE );
}
CMP_ORIENT_0, CMP_ORIENT_90, CMP_ORIENT_180, CMP_ORIENT_270,
CMP_MIROIR_X + CMP_ORIENT_0, CMP_MIROIR_X + CMP_ORIENT_90, CMP_MIROIR_X + CMP_ORIENT_180, CMP_MIROIR_X + CMP_ORIENT_270,
CMP_MIROIR_Y + CMP_ORIENT_0, CMP_MIROIR_Y + CMP_ORIENT_90, CMP_MIROIR_Y + CMP_ORIENT_180, CMP_MIROIR_Y + CMP_ORIENT_270
};
if( !found )
{
type_rotate = CMP_MIROIR_X + CMP_ORIENT_0;
SetRotationMiroir( CMP_NORMAL );
SetRotationMiroir( CMP_MIROIR_X );
for( ii = 0; ii < 4; ii++ )
{
if( memcmp( TempMat, m_Transform, sizeof( MatNormal ) ) == 0 )
{
found = TRUE;
break;
}
SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE );
}
}
// Try to find the current transform option:
memcpy( ComponentMatOrient, m_Transform, sizeof( ComponentMatOrient ) );
if( !found )
{
type_rotate = CMP_MIROIR_Y + CMP_ORIENT_0;
SetRotationMiroir( CMP_NORMAL );
SetRotationMiroir( CMP_MIROIR_Y );
for( ii = 0; ii < 4; ii++ )
{
if( memcmp( TempMat, m_Transform, sizeof( MatNormal ) ) == 0 )
for( ii = 0; ii < ROTATE_VALUES_COUNT; ii++ )
{
found = TRUE;
break;
}
SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE );
type_rotate = rotate_value[ii];
SetRotationMiroir( type_rotate );
if( memcmp( ComponentMatOrient, m_Transform, sizeof(ComponentMatOrient) ) == 0 )
return type_rotate;
}
}
memcpy( m_Transform, TempMat, sizeof( m_Transform ) );
if( found )
{
return type_rotate + ii;
}
else
{
wxBell();
// Error: orientation not found in list (should not happen)
DisplayError(NULL, wxT("Component orientation matrix internal error") );
memcpy( m_Transform, ComponentMatOrient, sizeof( ComponentMatOrient ) );
return CMP_NORMAL;
}
}
......
......@@ -170,7 +170,19 @@ public:
}
void SetRotationMiroir( int type );
/** function GetRotationMiroir()
* Used to display component orientation (in dialog editor or info)
* @return the orientation and mirror
* Note: Because there are different ways to have a given orientation/mirror,
* the orientation/mirror is not necessary wht the used does
* (example : a mirrorX then a mirrorY give no mirror but rotate the component).
* So this function find a rotation and a mirror value
* ( CMP_MIROIR_X because this is the first mirror option tested)
* but can differs from the orientation made by an user
* ( a CMP_MIROIR_Y is find as a CMP_MIROIR_X + orientation 180, because they are equivalent)
*/
int GetRotationMiroir();
wxPoint GetScreenCoord( const wxPoint& coord );
void Display_Infos( WinEDA_DrawFrame* frame );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment