CADSTAR Schematic Archive Importer: Fix orientation of components

- Fix the logic for the orientation of mirrored components
- Fix loading of angles/orientations from earlier versions of CADSTAR
This commit is contained in:
Roberto Fernandez Bautista 2020-11-22 01:50:04 +00:00 committed by jean-pierre charras
parent 49a2926a34
commit cba45ea257
2 changed files with 35 additions and 9 deletions

View File

@ -964,11 +964,26 @@ SCH_COMPONENT* CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbol(
component->SetPosition( getKiCadPoint( aCadstarSymbol.Origin ) ); component->SetPosition( getKiCadPoint( aCadstarSymbol.Origin ) );
int compOrientation = double compAngleDeciDeg = getAngleTenthDegree( aCadstarSymbol.OrientAngle );
getComponentOrientation( aCadstarSymbol.OrientAngle, aComponentOrientationDeciDeg ); int compOrientation = 0;
if( aCadstarSymbol.Mirror ) if( aCadstarSymbol.Mirror )
{
compAngleDeciDeg = -compAngleDeciDeg;
compOrientation += COMPONENT_ORIENTATION_T::CMP_MIRROR_Y; compOrientation += COMPONENT_ORIENTATION_T::CMP_MIRROR_Y;
}
compOrientation += getComponentOrientation( compAngleDeciDeg, aComponentOrientationDeciDeg );
if( NormalizeAngle180( compAngleDeciDeg ) != NormalizeAngle180( aComponentOrientationDeciDeg ) )
{
wxLogError(
wxString::Format( _( "Symbol '%s' is rotated by an angle of %.1f degrees in the "
"original CADSTAR design but KiCad only supports rotation "
"angles multiples of 90 degrees. The connecting wires will "
"need manual fixing." ),
aCadstarSymbol.ComponentRef.Designator, compAngleDeciDeg / 10.0 ) );
}
component->SetOrientation( compOrientation ); component->SetOrientation( compOrientation );
LIB_ID libId( mLibraryFileName.GetName(), aKiCadPart->GetName() ); LIB_ID libId( mLibraryFileName.GetName(), aKiCadPart->GetName() );
@ -1023,11 +1038,11 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSymbolFieldAttribute(
int CADSTAR_SCH_ARCHIVE_LOADER::getComponentOrientation( int CADSTAR_SCH_ARCHIVE_LOADER::getComponentOrientation(
long long aCadstarOrientAngle, double& aReturnedOrientationDeciDeg ) double aOrientAngleDeciDeg, double& aReturnedOrientationDeciDeg )
{ {
int compOrientation = COMPONENT_ORIENTATION_T::CMP_ORIENT_0; int compOrientation = COMPONENT_ORIENTATION_T::CMP_ORIENT_0;
int oDeg = (int) NormalizeAngle180( getAngleTenthDegree( aCadstarOrientAngle ) ); int oDeg = (int) NormalizeAngle180( aOrientAngleDeciDeg );
if( oDeg >= -450 && oDeg <= 450 ) if( oDeg >= -450 && oDeg <= 450 )
{ {
@ -1101,11 +1116,13 @@ CADSTAR_SCH_ARCHIVE_LOADER::POINT CADSTAR_SCH_ARCHIVE_LOADER::getLocationOfNetEl
wxPoint pinOffset = libpinPosition - libOrigin; wxPoint pinOffset = libpinPosition - libOrigin;
wxPoint pinPosition = symbolOrigin + pinOffset; wxPoint pinPosition = symbolOrigin + pinOffset;
double compAngleDeciDeg = getAngleTenthDegree( sym.OrientAngle );
if( sym.Mirror ) if( sym.Mirror )
pinPosition.x = ( 2 * symbolOrigin.x ) - pinPosition.x; pinPosition.x = ( 2 * symbolOrigin.x ) - pinPosition.x;
double adjustedOrientationDecideg; double adjustedOrientationDecideg;
getComponentOrientation( sym.OrientAngle, adjustedOrientationDecideg ); getComponentOrientation( compAngleDeciDeg, adjustedOrientationDecideg );
RotatePoint( &pinPosition, symbolOrigin, -adjustedOrientationDecideg ); RotatePoint( &pinPosition, symbolOrigin, -adjustedOrientationDecideg );

View File

@ -135,8 +135,7 @@ private:
void loadSymbolFieldAttribute( const ATTRIBUTE_LOCATION& aCadstarAttrLoc, void loadSymbolFieldAttribute( const ATTRIBUTE_LOCATION& aCadstarAttrLoc,
const double& aComponentOrientationDeciDeg, SCH_FIELD* aKiCadField ); const double& aComponentOrientationDeciDeg, SCH_FIELD* aKiCadField );
int getComponentOrientation( int getComponentOrientation( double aOrientAngleDeciDeg, double& aReturnedOrientationDeciDeg );
long long aCadstarOrientAngle, double& aReturnedOrientationDeciDeg );
//Helper functions for loading nets //Helper functions for loading nets
POINT getLocationOfNetElement( const NET_SCH& aNet, const NETELEMENT_ID& aNetElementID ); POINT getLocationOfNetElement( const NET_SCH& aNet, const NETELEMENT_ID& aNetElementID );
@ -213,7 +212,17 @@ private:
*/ */
double getAngleTenthDegree( const long long& aCadstarAngle ) double getAngleTenthDegree( const long long& aCadstarAngle )
{ {
return (double) aCadstarAngle / 100.0; // CADSTAR v6 (which outputted Schematic Format Version 8) and earlier used 1/10 degree
// as the unit for angles/orientations. It is assumed that CADSTAR version 7 (i.e. Schematic
// Format Version 9 and later) is the version that introduced 1/1000 degree for angles.
if( Header.Format.Version > 8 )
{
return (double) aCadstarAngle / 100.0;
}
else
{
return (double) aCadstarAngle;
}
} }
/** /**
@ -223,7 +232,7 @@ private:
*/ */
double getAngleDegrees( const long long& aCadstarAngle ) double getAngleDegrees( const long long& aCadstarAngle )
{ {
return (double) aCadstarAngle / 1000.0; return getAngleTenthDegree( aCadstarAngle ) / 10.0;
} }
/** /**