From 867e6858c8f53093346df000bbaf9749de84ed86 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand <seth@kipro-pcb.com> Date: Sun, 19 Jan 2025 17:45:40 -0800 Subject: [PATCH] Handle paste special case when converting bitmap Library export to file requires a library container but when pasting, we paste into an existing library, so we need to skip the library header. Long term solution would be to allow pasting library with multiple symbols into existing library Fixes https://gitlab.com/kicad/code/kicad/-/issues/19688 --- bitmap2component/bitmap2cmp_panel.cpp | 11 ++++++++--- bitmap2component/bitmap2component.cpp | 17 ++++++++++++++--- bitmap2component/bitmap2component.h | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/bitmap2component/bitmap2cmp_panel.cpp b/bitmap2component/bitmap2cmp_panel.cpp index 313b9c9f5d..0ef40a5028 100644 --- a/bitmap2component/bitmap2cmp_panel.cpp +++ b/bitmap2component/bitmap2cmp_panel.cpp @@ -84,7 +84,8 @@ void BITMAP2CMP_PANEL::LoadSettings( BITMAP2CMP_SETTINGS* cfg ) { default: case FOOTPRINT_FMT: m_rbFootprint->SetValue( true ); break; - case SYMBOL_FMT: m_rbSymbol->SetValue( true ); break; + case SYMBOL_FMT: + case SYMBOL_PASTE_FMT: m_rbSymbol->SetValue( true ); break; case POSTSCRIPT_FMT: m_rbPostscript->SetValue( true ); break; case DRAWING_SHEET_FMT: m_rbWorksheet->SetValue( true ); break; } @@ -459,7 +460,8 @@ void BITMAP2CMP_PANEL::OnExportToFile( wxCommandEvent& event ) { switch( getOutputFormat() ) { - case SYMBOL_FMT: m_parentFrame->ExportEeschemaFormat(); break; + case SYMBOL_FMT: + case SYMBOL_PASTE_FMT: m_parentFrame->ExportEeschemaFormat(); break; case FOOTPRINT_FMT: m_parentFrame->ExportPcbnewFormat(); break; case POSTSCRIPT_FMT: m_parentFrame->ExportPostScriptFormat(); break; case DRAWING_SHEET_FMT: m_parentFrame->ExportDrawingSheetFormat(); break; @@ -483,7 +485,8 @@ OUTPUT_FMT_ID BITMAP2CMP_PANEL::getOutputFormat() void BITMAP2CMP_PANEL::OnExportToClipboard( wxCommandEvent& event ) { std::string buffer; - ExportToBuffer( buffer, getOutputFormat() ); + OUTPUT_FMT_ID format = getOutputFormat() == SYMBOL_FMT ? SYMBOL_PASTE_FMT : getOutputFormat(); + ExportToBuffer( buffer, format ); wxLogNull doNotLog; // disable logging of failed clipboard actions @@ -541,6 +544,8 @@ void BITMAP2CMP_PANEL::ExportToBuffer( std::string& aOutput, OUTPUT_FMT_ID aForm } } + + WX_STRING_REPORTER reporter; BITMAPCONV_INFO converter( aOutput, reporter ); diff --git a/bitmap2component/bitmap2component.cpp b/bitmap2component/bitmap2component.cpp index 2e2c9474ae..4a419dca6a 100644 --- a/bitmap2component/bitmap2component.cpp +++ b/bitmap2component/bitmap2component.cpp @@ -34,6 +34,7 @@ #include <build_version.h> #include <locale_io.h> +#include <macros.h> #include <potracelib.h> #include <reporter.h> #include <fmt/format.h> @@ -127,6 +128,7 @@ int BITMAPCONV_INFO::ConvertBitmap( potrace_bitmap_t* aPotrace_bitmap, OUTPUT_FM break; case SYMBOL_FMT: + case SYMBOL_PASTE_FMT: m_ScaleX = SCH_IU_PER_MM * 25.4 / aDpi_X; // the conversion scale from PPI to eeschema iu m_ScaleY = -SCH_IU_PER_MM * 25.4 / aDpi_Y; // Y axis is bottom to Top for components in libs createOutputData(); @@ -192,12 +194,15 @@ void BITMAPCONV_INFO::outputDataHeader( const wxString& aBrdLayerName ) break; case SYMBOL_FMT: + m_Data += fmt::format( "(kicad_symbol_lib (version 20220914) (generator \"bitmap2component\") (generator_version \"{}\")\n", + GetMajorMinorVersion().ToStdString() ); + KI_FALLTHROUGH; + + case SYMBOL_PASTE_FMT: fieldSize = 1.27; // fields text size in mm (= 50 mils) Ypos /= SCH_IU_PER_MM; Ypos += fieldSize / 2; - m_Data += fmt::format( "(kicad_symbol_lib (version 20220914) (generator \"bitmap2component\") (generator_version \"{}\")\n" - " (symbol \"{}\" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)\n", - GetMajorMinorVersion().ToStdString(), + m_Data += fmt::format( " (symbol \"{}\" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)\n", m_CmpName.c_str() ); m_Data += fmt::format( " (property \"Reference\" \"#G\" (at 0 {:g} 0)\n" @@ -246,6 +251,11 @@ void BITMAPCONV_INFO::outputDataEnd() m_Data += " )\n)\n"; break; + case SYMBOL_PASTE_FMT: + m_Data += " )\n"; // end symbol_0_0 + m_Data += " )\n"; // end symbol + break; + case SYMBOL_FMT: m_Data += " )\n"; // end symbol_0_0 m_Data += " )\n"; // end symbol @@ -336,6 +346,7 @@ void BITMAPCONV_INFO::outputOnePolygon( SHAPE_LINE_CHAIN& aPolygon, const wxStri break; case SYMBOL_FMT: + case SYMBOL_PASTE_FMT: // The polygon outline thickness is fixed here to 0.01 ( 0.0 is the default thickness) #define SCH_LINE_THICKNESS_MM 0.01 //snprintf( strbuf, sizeof(strbuf), "P %d 0 0 %d", (int) aPolygon.PointCount() + 1, EE_LINE_THICKNESS ); diff --git a/bitmap2component/bitmap2component.h b/bitmap2component/bitmap2component.h index 9719467518..5318e20c7f 100644 --- a/bitmap2component/bitmap2component.h +++ b/bitmap2component/bitmap2component.h @@ -32,6 +32,7 @@ class REPORTER; enum OUTPUT_FMT_ID { SYMBOL_FMT, + SYMBOL_PASTE_FMT, // This does not include the header information FOOTPRINT_FMT, POSTSCRIPT_FMT, DRAWING_SHEET_FMT,