EasyEDA Pro: support SVG images in schematic; support bitmap rotation/flip.

This commit is contained in:
Alex Shvartzkop 2023-10-30 11:34:42 +03:00
parent 847ab093c8
commit 4b083fc342
4 changed files with 54 additions and 29 deletions

View File

@ -102,7 +102,7 @@ DIALOG_IMPORT_GFX_SCH::DIALOG_IMPORT_GFX_SCH( SCH_BASE_FRAME* aParent ) :
} }
else if( SCH_EDIT_FRAME* schFrame = dynamic_cast<SCH_EDIT_FRAME*>( aParent ) ) else if( SCH_EDIT_FRAME* schFrame = dynamic_cast<SCH_EDIT_FRAME*>( aParent ) )
{ {
m_importer = std::make_unique<GRAPHICS_IMPORTER_SCH>( schFrame->GetScreen() ); m_importer = std::make_unique<GRAPHICS_IMPORTER_SCH>();
EESCHEMA_SETTINGS* cfg = m_parent->eeconfig(); EESCHEMA_SETTINGS* cfg = m_parent->eeconfig();
initWidgetsFromSettings( cfg ); initWidgetsFromSettings( cfg );

View File

@ -33,7 +33,7 @@
#include <sch_text.h> #include <sch_text.h>
GRAPHICS_IMPORTER_SCH::GRAPHICS_IMPORTER_SCH( SCH_SCREEN* aScreen ) : m_screen( aScreen ) GRAPHICS_IMPORTER_SCH::GRAPHICS_IMPORTER_SCH()
{ {
m_millimeterToIu = schIUScale.mmToIU( 1.0 ); m_millimeterToIu = schIUScale.mmToIU( 1.0 );
} }

View File

@ -35,7 +35,7 @@ class SCH_SCREEN;
class GRAPHICS_IMPORTER_SCH : public GRAPHICS_IMPORTER class GRAPHICS_IMPORTER_SCH : public GRAPHICS_IMPORTER
{ {
public: public:
GRAPHICS_IMPORTER_SCH( SCH_SCREEN* aScreen ); GRAPHICS_IMPORTER_SCH();
void AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd, void AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd,
const IMPORTED_STROKE& aStroke ) override; const IMPORTED_STROKE& aStroke ) override;
@ -75,8 +75,6 @@ public:
int MapLineWidth( double aLineWidth ); int MapLineWidth( double aLineWidth );
STROKE_PARAMS MapStrokeParams( const IMPORTED_STROKE& aStroke ); STROKE_PARAMS MapStrokeParams( const IMPORTED_STROKE& aStroke );
SCH_SCREEN* m_screen;
}; };
#endif /* GRAPHICS_IMPORTER_SCH_H_ */ #endif /* GRAPHICS_IMPORTER_SCH_H_ */

View File

@ -25,6 +25,8 @@
#include "sch_easyedapro_parser.h" #include "sch_easyedapro_parser.h"
#include <plugins/easyedapro/easyedapro_import_utils.h> #include <plugins/easyedapro/easyedapro_import_utils.h>
#include <core/map_helpers.h>
#include <sch_io_mgr.h> #include <sch_io_mgr.h>
#include <schematic.h> #include <schematic.h>
#include <sch_sheet.h> #include <sch_sheet.h>
@ -47,7 +49,7 @@
#include <gfx_import_utils.h> #include <gfx_import_utils.h>
#include <import_gfx/svg_import_plugin.h> #include <import_gfx/svg_import_plugin.h>
#include <import_gfx/graphics_importer_lib_symbol.h> #include <import_gfx/graphics_importer_lib_symbol.h>
#include <core/map_helpers.h> #include <import_gfx/graphics_importer_sch.h>
SCH_EASYEDAPRO_PARSER::SCH_EASYEDAPRO_PARSER( SCHEMATIC* aSchematic, SCH_EASYEDAPRO_PARSER::SCH_EASYEDAPRO_PARSER( SCHEMATIC* aSchematic,
@ -849,14 +851,14 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
VECTOR2D start, size; VECTOR2D start, size;
wxString mimeType, base64Data; wxString mimeType, base64Data;
double angle = 0; double angle = 0;
int upsideDown = 0; int flipped = 0;
if( line.at( 3 ).is_number() ) if( line.at( 3 ).is_number() )
{ {
start = VECTOR2D( line.at( 3 ), line.at( 4 ) ); start = VECTOR2D( line.at( 3 ), line.at( 4 ) );
size = VECTOR2D( line.at( 5 ), line.at( 6 ) ); size = VECTOR2D( line.at( 5 ), line.at( 6 ) );
angle = line.at( 7 ); angle = line.at( 7 );
upsideDown = line.at( 8 ); flipped = line.at( 8 );
wxString imageUrl = line.at( 9 ); wxString imageUrl = line.at( 9 );
@ -908,34 +910,56 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
if( mimeType == wxS( "image/svg+xml" ) ) if( mimeType == wxS( "image/svg+xml" ) )
{ {
// VECTOR2D offset = ScalePosSym( start ); VECTOR2D offset = ScalePos( start );
//SVG_IMPORT_PLUGIN svgImportPlugin; SVG_IMPORT_PLUGIN svgImportPlugin;
//GRAPHICS_IMPORTER_LIB_SYMBOL libsymImporter( ksymbol, 0 ); GRAPHICS_IMPORTER_SCH schImporter;
//svgImportPlugin.SetImporter( &libsymImporter ); svgImportPlugin.SetImporter( &schImporter );
//svgImportPlugin.LoadFromMemory( buf ); svgImportPlugin.LoadFromMemory( buf );
//VECTOR2D imSize( svgImportPlugin.GetImageWidth(), VECTOR2D imSize( svgImportPlugin.GetImageWidth(),
// svgImportPlugin.GetImageHeight() ); svgImportPlugin.GetImageHeight() );
//VECTOR2D pixelScale( schIUScale.IUTomm( ScaleSizeUnit( size.x ) ) / imSize.x, VECTOR2D pixelScale( schIUScale.IUTomm( ScaleSize( size.x ) ) / imSize.x,
// schIUScale.IUTomm( -ScaleSizeUnit( size.y ) ) / imSize.y ); schIUScale.IUTomm( ScaleSize( size.y ) ) / imSize.y );
//if( upsideDown ) if( flipped )
// pixelScale.y *= -1; pixelScale.x *= -1;
//libsymImporter.SetScale( pixelScale ); schImporter.SetScale( pixelScale );
//VECTOR2D offsetMM( schIUScale.IUTomm( offset.x ), schIUScale.IUTomm( offset.y ) ); VECTOR2D offsetMM( schIUScale.IUTomm( offset.x ), schIUScale.IUTomm( offset.y ) );
//libsymImporter.SetImportOffsetMM( offsetMM ); schImporter.SetImportOffsetMM( offsetMM );
//svgImportPlugin.Import(); svgImportPlugin.Import();
//// TODO: rotation for( std::unique_ptr<EDA_ITEM>& item : schImporter.GetItems() )
//for( std::unique_ptr<EDA_ITEM>& item : libsymImporter.GetItems() ) {
// ksymbol->AddDrawItem( static_cast<LIB_ITEM*>( item.release() ) ); SCH_ITEM* schItem = static_cast<SCH_ITEM*>( item.release() );
for( double i = angle; i > 0; i -= 90 )
{
if( schItem->Type() == SCH_LINE_T )
{
// Lines need special handling for some reason
schItem->SetFlags( STARTPOINT );
schItem->Rotate( offset );
schItem->ClearFlags( STARTPOINT );
schItem->SetFlags( ENDPOINT );
schItem->Rotate( offset );
schItem->ClearFlags( ENDPOINT );
}
else
{
schItem->Rotate( offset );
}
}
createdItems.emplace_back( schItem );
}
} }
else else
{ {
@ -950,13 +974,16 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
VECTOR2D ksize = ScaleSize( size ); VECTOR2D ksize = ScaleSize( size );
VECTOR2D kcenter = kstart + ksize / 2; VECTOR2D kcenter = kstart + ksize / 2;
RotatePoint( kcenter, kstart, -EDA_ANGLE( angle, DEGREES_T ) );
// TODO: rotation
double scaleFactor = ScaleSize( size.x ) / bitmap->GetSize().x; double scaleFactor = ScaleSize( size.x ) / bitmap->GetSize().x;
bitmap->SetImageScale( scaleFactor ); bitmap->SetImageScale( scaleFactor );
bitmap->SetPosition( kcenter ); bitmap->SetPosition( kcenter );
for( double i = angle; i > 0; i -= 90 )
bitmap->Rotate( kstart );
if( flipped )
bitmap->MirrorHorizontally( kstart.x );
createdItems.push_back( std::move( bitmap ) ); createdItems.push_back( std::move( bitmap ) );
} }
} }