CADSTAR Schematic Archive Importer: Fix Coordinate Rounding error
Rewrite of the calculation to convert CADSTAR to KiCad coordinates, rounding half way cases away from zero. Use integer division instead of double, to ensure precision.
This commit is contained in:
parent
842a930ced
commit
ccbc0f73cc
|
@ -54,8 +54,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSh
|
||||||
LONGPOINT designLimit = Assignments.Settings.DesignLimit;
|
LONGPOINT designLimit = Assignments.Settings.DesignLimit;
|
||||||
|
|
||||||
//Note: can't use getKiCadPoint() due wxPoint being int - need long long to make the check
|
//Note: can't use getKiCadPoint() due wxPoint being int - need long long to make the check
|
||||||
long long designSizeXkicad = (long long) designLimit.x * KiCadUnitMultiplier;
|
long long designSizeXkicad = (long long) designLimit.x / KiCadUnitDivider;
|
||||||
long long designSizeYkicad = (long long) designLimit.y * KiCadUnitMultiplier;
|
long long designSizeYkicad = (long long) designLimit.y / KiCadUnitDivider;
|
||||||
|
|
||||||
// Max size limited by the positive dimension of wxPoint (which is an int)
|
// Max size limited by the positive dimension of wxPoint (which is an int)
|
||||||
constexpr long long maxDesignSizekicad = std::numeric_limits<int>::max();
|
constexpr long long maxDesignSizekicad = std::numeric_limits<int>::max();
|
||||||
|
@ -2408,8 +2408,8 @@ wxPoint CADSTAR_SCH_ARCHIVE_LOADER::getKiCadPoint( wxPoint aCadstarPoint )
|
||||||
{
|
{
|
||||||
wxPoint retval;
|
wxPoint retval;
|
||||||
|
|
||||||
retval.x = ( aCadstarPoint.x - m_designCenter.x ) * KiCadUnitMultiplier;
|
retval.x = getKiCadLength( aCadstarPoint.x - m_designCenter.x );
|
||||||
retval.y = -( aCadstarPoint.y - m_designCenter.y ) * KiCadUnitMultiplier;
|
retval.y = -getKiCadLength( aCadstarPoint.y - m_designCenter.y );
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -2420,8 +2420,8 @@ wxPoint CADSTAR_SCH_ARCHIVE_LOADER::getKiCadLibraryPoint(
|
||||||
{
|
{
|
||||||
wxPoint retval;
|
wxPoint retval;
|
||||||
|
|
||||||
retval.x = ( aCadstarPoint.x - aCadstarCentre.x ) * KiCadUnitMultiplier;
|
retval.x = getKiCadLength( aCadstarPoint.x - aCadstarCentre.x );
|
||||||
retval.y = ( aCadstarPoint.y - aCadstarCentre.y ) * KiCadUnitMultiplier;
|
retval.y = getKiCadLength( aCadstarPoint.y - aCadstarCentre.y );
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,7 +214,15 @@ private:
|
||||||
|
|
||||||
int getKiCadLength( long long aCadstarLength )
|
int getKiCadLength( long long aCadstarLength )
|
||||||
{
|
{
|
||||||
return aCadstarLength * KiCadUnitMultiplier;
|
int mod = aCadstarLength % KiCadUnitDivider;
|
||||||
|
int absmod = sign( mod ) * mod;
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
// Round half-way cases away from zero
|
||||||
|
if( absmod >= KiCadUnitDivider / 2 )
|
||||||
|
offset = sign( aCadstarLength );
|
||||||
|
|
||||||
|
return ( aCadstarLength / KiCadUnitDivider ) + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,7 +46,7 @@ void CADSTAR_SCH_ARCHIVE_PARSER::Parse()
|
||||||
switch( Header.Resolution )
|
switch( Header.Resolution )
|
||||||
{
|
{
|
||||||
case RESOLUTION::HUNDREDTH_MICRON:
|
case RESOLUTION::HUNDREDTH_MICRON:
|
||||||
KiCadUnitMultiplier = SCH_IU_PER_MM / 1e5;
|
KiCadUnitDivider = (long) 1e5 / (long) SCH_IU_PER_MM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -36,7 +36,7 @@ class CADSTAR_SCH_ARCHIVE_PARSER : public CADSTAR_ARCHIVE_PARSER
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit CADSTAR_SCH_ARCHIVE_PARSER( wxString aFilename )
|
explicit CADSTAR_SCH_ARCHIVE_PARSER( wxString aFilename )
|
||||||
: CADSTAR_ARCHIVE_PARSER(), Filename( aFilename ), KiCadUnitMultiplier( 0.1 )
|
: CADSTAR_ARCHIVE_PARSER(), Filename( aFilename ), KiCadUnitDivider( 10 )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,7 +452,7 @@ public:
|
||||||
ATTRCOLORS AttrColors;
|
ATTRCOLORS AttrColors;
|
||||||
PARTNAMECOL SymbolPartNameColor;
|
PARTNAMECOL SymbolPartNameColor;
|
||||||
|
|
||||||
double KiCadUnitMultiplier; ///<Use this value to convert units in this CSA file to KiCad units
|
int KiCadUnitDivider; ///<Use this value to convert units in this CSA file to KiCad units
|
||||||
|
|
||||||
}; //CADSTAR_SCH_ARCHIVE_PARSER
|
}; //CADSTAR_SCH_ARCHIVE_PARSER
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue