Handle block insert scaling a little better but incompletely
https://gitlab.com/kicad/code/kicad/-/issues/11614
This commit is contained in:
parent
0e42cb19f2
commit
fa7205ebbc
|
@ -487,18 +487,24 @@ void DXF_IMPORT_PLUGIN::addInsert( const DL_InsertData& aData )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MATRIX3x3D arbAxis = getArbitraryAxis( getExtrusion() );
|
MATRIX3x3D arbAxis = getArbitraryAxis( getExtrusion() );
|
||||||
|
|
||||||
|
MATRIX3x3D rot;
|
||||||
|
rot.SetRotation( aData.angle );
|
||||||
|
|
||||||
|
MATRIX3x3D scale;
|
||||||
|
scale.SetScale( VECTOR2D( aData.sx, aData.sy ) );
|
||||||
|
|
||||||
|
MATRIX3x3D trans = ( arbAxis * rot ) * scale;
|
||||||
VECTOR3D insertCoords = ocsToWcs( arbAxis, VECTOR3D( aData.ipx, aData.ipy, aData.ipz ) );
|
VECTOR3D insertCoords = ocsToWcs( arbAxis, VECTOR3D( aData.ipx, aData.ipy, aData.ipz ) );
|
||||||
|
|
||||||
VECTOR2D translation( mapX( insertCoords.x ), mapY( insertCoords.y ) );
|
VECTOR2D translation( mapX( insertCoords.x ), mapY( insertCoords.y ) );
|
||||||
translation -= VECTOR2D( mapX( block->m_baseX ), mapY( block->m_baseY ) );
|
translation -= VECTOR2D( mapX( block->m_baseX ), mapY( block->m_baseY ) );
|
||||||
|
|
||||||
|
|
||||||
for( auto& shape : block->m_buffer.GetShapes() )
|
for( auto& shape : block->m_buffer.GetShapes() )
|
||||||
{
|
{
|
||||||
std::unique_ptr<IMPORTED_SHAPE> newShape = shape->clone();
|
std::unique_ptr<IMPORTED_SHAPE> newShape = shape->clone();
|
||||||
|
|
||||||
newShape->Translate( translation );
|
newShape->Transform( trans, translation );
|
||||||
newShape->Scale( aData.sx, aData.sy );
|
|
||||||
|
|
||||||
m_internalImporter.AddShape( newShape );
|
m_internalImporter.AddShape( newShape );
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "graphics_importer.h"
|
#include "graphics_importer.h"
|
||||||
|
|
||||||
|
#include <math/matrix3x3.h>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
class IMPORTED_SHAPE
|
class IMPORTED_SHAPE
|
||||||
|
@ -39,8 +40,7 @@ public:
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const = 0;
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const = 0;
|
||||||
|
|
||||||
virtual void Translate( const VECTOR2D& aVec ) = 0;
|
virtual void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) = 0;
|
||||||
virtual void Scale( double scaleX, double scaleY ) = 0;
|
|
||||||
|
|
||||||
void SetParentShapeIndex( int aIndex ) { m_parentShapeIndex = aIndex; }
|
void SetParentShapeIndex( int aIndex ) { m_parentShapeIndex = aIndex; }
|
||||||
int GetParentShapeIndex() const { return m_parentShapeIndex; }
|
int GetParentShapeIndex() const { return m_parentShapeIndex; }
|
||||||
|
@ -70,18 +70,10 @@ public:
|
||||||
return std::make_unique<IMPORTED_LINE>( *this );
|
return std::make_unique<IMPORTED_LINE>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform(const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation) override
|
||||||
{
|
{
|
||||||
m_start += aVec;
|
m_start = aTransform * m_start + aTranslation;
|
||||||
m_end += aVec;
|
m_end = aTransform * m_end + aTranslation;
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
|
||||||
{
|
|
||||||
m_start.x *= scaleX;
|
|
||||||
m_start.y *= scaleY;
|
|
||||||
m_end.x *= scaleX;
|
|
||||||
m_end.y *= scaleY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -112,18 +104,15 @@ public:
|
||||||
return std::make_unique<IMPORTED_CIRCLE>( *this );
|
return std::make_unique<IMPORTED_CIRCLE>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
|
||||||
{
|
{
|
||||||
m_center += aVec;
|
VECTOR2D newCenter = ( aTransform * m_center ) + aTranslation;
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
VECTOR2D newRadius = VECTOR2D( m_radius, 0 );
|
||||||
{
|
newRadius = aTransform * newRadius;
|
||||||
m_center.x *= scaleX;
|
|
||||||
m_center.y *= scaleY;
|
|
||||||
|
|
||||||
// we really can't handle scalex != scaleY cleanly...it would be an ellipse
|
m_center = newCenter;
|
||||||
m_radius *= scaleX;
|
m_radius = newRadius.EuclideanNorm();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -156,19 +145,10 @@ public:
|
||||||
return std::make_unique<IMPORTED_ARC>( *this );
|
return std::make_unique<IMPORTED_ARC>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
|
||||||
{
|
{
|
||||||
m_center += aVec;
|
m_start = aTransform * m_start + aTranslation;
|
||||||
m_start += aVec;
|
m_center = aTransform * m_center + aTranslation;
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
|
||||||
{
|
|
||||||
m_center.x *= scaleX;
|
|
||||||
m_center.y *= scaleY;
|
|
||||||
|
|
||||||
m_start.x *= scaleX;
|
|
||||||
m_start.y *= scaleY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -198,20 +178,11 @@ public:
|
||||||
return std::make_unique<IMPORTED_POLYGON>( *this );
|
return std::make_unique<IMPORTED_POLYGON>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
|
||||||
{
|
{
|
||||||
for( auto& vertex : m_vertices )
|
for(VECTOR2D& vert : m_vertices )
|
||||||
{
|
{
|
||||||
vertex += aVec;
|
vert = aTransform * vert + aTranslation;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
|
||||||
{
|
|
||||||
for( auto& vertex : m_vertices )
|
|
||||||
{
|
|
||||||
vertex.x *= scaleX;
|
|
||||||
vertex.y *= scaleY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +192,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<VECTOR2D> m_vertices;
|
std::vector<VECTOR2D> m_vertices;
|
||||||
double m_width;
|
double m_width;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -253,15 +224,9 @@ public:
|
||||||
return std::make_unique<IMPORTED_TEXT>( *this );
|
return std::make_unique<IMPORTED_TEXT>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
|
||||||
{
|
{
|
||||||
m_origin += aVec;
|
m_origin = aTransform * m_origin + aTranslation;
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
|
||||||
{
|
|
||||||
m_origin.x *= scaleX;
|
|
||||||
m_origin.y *= scaleY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -299,24 +264,12 @@ public:
|
||||||
return std::make_unique<IMPORTED_SPLINE>( *this );
|
return std::make_unique<IMPORTED_SPLINE>( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translate( const VECTOR2D& aVec ) override
|
void Transform( const MATRIX3x3D& aTransform, const VECTOR2D& aTranslation ) override
|
||||||
{
|
{
|
||||||
m_start += aVec;
|
m_start = aTransform * m_start + aTranslation;
|
||||||
m_bezierControl1 += aVec;
|
m_bezierControl1 = aTransform * m_bezierControl1 + aTranslation;
|
||||||
m_bezierControl2 += aVec;
|
m_bezierControl2 = aTransform * m_bezierControl2 + aTranslation;
|
||||||
m_end += aVec;
|
m_end = aTransform * m_end + aTranslation;
|
||||||
}
|
|
||||||
|
|
||||||
void Scale( double scaleX, double scaleY ) override
|
|
||||||
{
|
|
||||||
m_start.x *= scaleX;
|
|
||||||
m_start.y *= scaleY;
|
|
||||||
m_bezierControl1.x *= scaleX;
|
|
||||||
m_bezierControl1.y *= scaleY;
|
|
||||||
m_bezierControl2.x *= scaleX;
|
|
||||||
m_bezierControl2.y *= scaleY;
|
|
||||||
m_end.x *= scaleX;
|
|
||||||
m_end.y *= scaleY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue