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 ) ...@@ -820,69 +820,46 @@ void SCH_COMPONENT::SetRotationMiroir( int type_rotate )
int SCH_COMPONENT::GetRotationMiroir() 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 type_rotate = CMP_ORIENT_0;
int TempMat[2][2], MatNormal[2][2]; int ComponentMatOrient[2][2];
int ii; int ii;
bool found = FALSE;
#define ROTATE_VALUES_COUNT 12
memcpy( TempMat, m_Transform, sizeof( TempMat ) ); int rotate_value[ROTATE_VALUES_COUNT] = // list of all possibilities, but only the first 8 are actually used
SetRotationMiroir( CMP_ORIENT_0 );
memcpy( MatNormal, m_Transform, sizeof( MatNormal ) );
for( ii = 0; ii < 4; ii++ )
{ {
if( memcmp( TempMat, m_Transform, sizeof(MatNormal) ) == 0 ) 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,
found = TRUE; CMP_MIROIR_Y + CMP_ORIENT_0, CMP_MIROIR_Y + CMP_ORIENT_90, CMP_MIROIR_Y + CMP_ORIENT_180, CMP_MIROIR_Y + CMP_ORIENT_270
break; };
}
SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE );
}
if( !found ) // Try to find the current transform option:
{ memcpy( ComponentMatOrient, m_Transform, sizeof( ComponentMatOrient ) );
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 );
}
}
if( !found ) for( ii = 0; ii < ROTATE_VALUES_COUNT; ii++ )
{ {
type_rotate = CMP_MIROIR_Y + CMP_ORIENT_0; type_rotate = rotate_value[ii];
SetRotationMiroir( CMP_NORMAL ); SetRotationMiroir( type_rotate );
SetRotationMiroir( CMP_MIROIR_Y ); if( memcmp( ComponentMatOrient, m_Transform, sizeof(ComponentMatOrient) ) == 0 )
for( ii = 0; ii < 4; ii++ ) return type_rotate;
{
if( memcmp( TempMat, m_Transform, sizeof( MatNormal ) ) == 0 )
{
found = TRUE;
break;
}
SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE );
}
} }
memcpy( m_Transform, TempMat, sizeof( m_Transform ) ); // Error: orientation not found in list (should not happen)
DisplayError(NULL, wxT("Component orientation matrix internal error") );
if( found ) memcpy( m_Transform, ComponentMatOrient, sizeof( ComponentMatOrient ) );
{ return CMP_NORMAL;
return type_rotate + ii;
}
else
{
wxBell();
return CMP_NORMAL;
}
} }
......
...@@ -170,7 +170,19 @@ public: ...@@ -170,7 +170,19 @@ public:
} }
void SetRotationMiroir( int type ); 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(); int GetRotationMiroir();
wxPoint GetScreenCoord( const wxPoint& coord ); wxPoint GetScreenCoord( const wxPoint& coord );
void Display_Infos( WinEDA_DrawFrame* frame ); 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