From fee1d115a6479e89f39e6afefa86d1ef0cc09ebd Mon Sep 17 00:00:00 2001 From: John Beard Date: Wed, 27 Nov 2024 21:08:35 +0800 Subject: [PATCH] Fabmaster: unify text settings, adjust rotations. This is a little tricky, but this seems to be the simplest way to approximate the right text placement. There are still some minor offsets and text size adjustments, which might be possible to compensate for by experimentation. --- pcbnew/pcb_io/fabmaster/import_fabmaster.cpp | 165 +++++++++---------- pcbnew/pcb_io/fabmaster/import_fabmaster.h | 7 + 2 files changed, 83 insertions(+), 89 deletions(-) diff --git a/pcbnew/pcb_io/fabmaster/import_fabmaster.cpp b/pcbnew/pcb_io/fabmaster/import_fabmaster.cpp index 9339509909..5b7f453917 100644 --- a/pcbnew/pcb_io/fabmaster/import_fabmaster.cpp +++ b/pcbnew/pcb_io/fabmaster/import_fabmaster.cpp @@ -2298,6 +2298,47 @@ bool FABMASTER::loadZones( BOARD* aBoard ) } +void FABMASTER::setupText( const FABMASTER::GRAPHIC_TEXT& aGText, PCB_LAYER_ID aLayer, + PCB_TEXT& aText, const BOARD& aBoard, const OPT_VECTOR2I& aMirrorPoint ) +{ + aText.SetHorizJustify( aGText.orient ); + + aText.SetKeepUpright( false ); + + EDA_ANGLE angle = EDA_ANGLE( aGText.rotation ); + angle.Normalize180(); + + if( aMirrorPoint.has_value() ) + { + aText.SetLayer( aBoard.FlipLayer( aLayer ) ); + aText.SetTextPos( VECTOR2I( + aGText.start_x, 2 * aMirrorPoint->y - ( aGText.start_y - aGText.height / 2 ) ) ); + aText.SetMirrored( !aGText.mirror ); + + aText.SetTextAngle( -angle + ANGLE_180 ); + } + else + { + aText.SetLayer( aLayer ); + aText.SetTextPos( VECTOR2I( aGText.start_x, aGText.start_y - aGText.height / 2 ) ); + aText.SetMirrored( aGText.mirror ); + + aText.SetTextAngle( angle ); + } + + if( std::abs( angle ) >= ANGLE_90 ) + { + aText.SetVertJustify( GR_TEXT_V_ALIGN_BOTTOM ); + } + + aText.SetText( aGText.text ); + aText.SetItalic( aGText.ital ); + aText.SetTextThickness( aGText.thickness ); + aText.SetTextHeight( aGText.height ); + aText.SetTextWidth( aGText.width ); +} + + bool FABMASTER::loadFootprints( BOARD* aBoard ) { const NETNAMES_MAP& netinfo = aBoard->GetNetInfo().NetsByName(); @@ -2354,10 +2395,10 @@ bool FABMASTER::loadFootprints( BOARD* aBoard ) for( auto& ref : refdes ) { - const GRAPHIC_TEXT *lsrc = - static_cast( ( *( ref->segment.begin() ) ).get() ); + const GRAPHIC_TEXT& lsrc = + static_cast( **ref->segment.begin() ); - if( lsrc->text == src->refdes ) + if( lsrc.text == src->refdes ) { PCB_TEXT* txt = nullptr; PCB_LAYER_ID layer = getLayer( ref->layer ); @@ -2379,25 +2420,14 @@ bool FABMASTER::loadFootprints( BOARD* aBoard ) txt = new PCB_TEXT( fp ); } + OPT_VECTOR2I flip_point = std::nullopt; if( src->mirror ) - { - txt->SetLayer( aBoard->FlipLayer( layer ) ); - txt->SetTextPos( VECTOR2I( lsrc->start_x, - 2 * src->y - ( lsrc->start_y - lsrc->height / 2 ) ) ); - } - else - { - txt->SetLayer( layer ); - txt->SetTextPos( VECTOR2I( lsrc->start_x, - lsrc->start_y - lsrc->height / 2 ) ); - } + flip_point = VECTOR2I( src->x, src->y ); - txt->SetText( lsrc->text ); - txt->SetItalic( lsrc->ital ); - txt->SetTextThickness( lsrc->thickness ); - txt->SetTextHeight( lsrc->height ); - txt->SetTextWidth( lsrc->width ); - txt->SetHorizJustify( lsrc->orient ); + const EDA_ANGLE fp_angle = EDA_ANGLE( lsrc.rotation ).Normalized(); + txt->SetTextAngle( fp_angle ); + + setupText( lsrc, layer, *txt, *aBoard, flip_point ); if( txt != &fp->Reference() ) fp->Add( txt, ADD_MODE::APPEND ); @@ -2553,37 +2583,22 @@ bool FABMASTER::loadFootprints( BOARD* aBoard ) } case GR_SHAPE_TEXT: { - const GRAPHIC_TEXT *lsrc = - static_cast( seg.get() ); + const GRAPHIC_TEXT& lsrc = static_cast( *seg ); - PCB_TEXT* txt = new PCB_TEXT( fp ); + std::unique_ptr txt = std::make_unique( fp ); + OPT_VECTOR2I flip_point; if( src->mirror ) - { - txt->SetLayer( aBoard->FlipLayer( layer ) ); - txt->SetTextPos( VECTOR2I( lsrc->start_x, - 2 * src->y - ( lsrc->start_y - lsrc->height / 2 ) ) ); - } - else - { - txt->SetLayer( layer ); - txt->SetTextPos( VECTOR2I( lsrc->start_x, - lsrc->start_y - lsrc->height / 2 ) ); - } + flip_point = VECTOR2I( src->x, src->y ); - txt->SetText( lsrc->text ); - txt->SetItalic( lsrc->ital ); - txt->SetTextThickness( lsrc->thickness ); - txt->SetTextHeight( lsrc->height ); - txt->SetTextWidth( lsrc->width ); - txt->SetHorizJustify( lsrc->orient ); + setupText( lsrc, layer, *txt, *aBoard, flip_point ); // FABMASTER doesn't have visibility flags but layers that are not silk // should be hidden by default to prevent clutter. if( txt->GetLayer() != F_SilkS && txt->GetLayer() != B_SilkS ) txt->SetVisible( false ); - fp->Add( txt, ADD_MODE::APPEND ); + fp->Add( txt.release(), ADD_MODE::APPEND ); break; } default: @@ -2921,7 +2936,9 @@ bool FABMASTER::loadEtch( BOARD* aBoard, const std::unique_ptr if( IsCopperLayer( layer ) ) { - if( seg->shape == GR_SHAPE_LINE ) + switch( seg->shape ) + { + case GR_SHAPE_LINE: { const GRAPHIC_LINE* src = static_cast( seg.get() ); @@ -2936,8 +2953,9 @@ bool FABMASTER::loadEtch( BOARD* aBoard, const std::unique_ptr trk->SetNet( net_it->second ); aBoard->Add( trk, ADD_MODE::APPEND ); + break; } - else if( seg->shape == GR_SHAPE_ARC ) + case GR_SHAPE_ARC: { const GRAPHIC_ARC* src = static_cast( seg.get() ); @@ -2949,47 +2967,18 @@ bool FABMASTER::loadEtch( BOARD* aBoard, const std::unique_ptr trk->SetNet( net_it->second ); aBoard->Add( trk, ADD_MODE::APPEND ); + break; } - else if( seg->shape == GR_SHAPE_CIRCLE ) + default: { - const GRAPHIC_ARC* src = static_cast( seg.get() ); - - PCB_SHAPE* circle = new PCB_SHAPE( aBoard, SHAPE_T::CIRCLE ); - circle->SetLayer( layer ); - circle->SetCenter( VECTOR2I( src->center_x, src->center_y ) ); - circle->SetEnd( VECTOR2I( src->end_x, src->end_y ) ); - circle->SetWidth( src->width ); - - aBoard->Add( circle, ADD_MODE::APPEND ); + // Defer to the generic graphics factory + for( std::unique_ptr& new_item : + createBoardItems( *aBoard, layer, *seg ) ) + { + aBoard->Add( new_item.release(), ADD_MODE::APPEND ); + } + break; } - else if( seg->shape == GR_SHAPE_RECTANGLE ) - { - const GRAPHIC_RECTANGLE *src = - static_cast( seg.get() ); - - PCB_SHAPE* rect = new PCB_SHAPE( aBoard, SHAPE_T::RECTANGLE ); - rect->SetLayer( layer ); - rect->SetStart( VECTOR2I( src->start_x, src->start_y ) ); - rect->SetEnd( VECTOR2I( src->end_x, src->end_y ) ); - rect->SetStroke( STROKE_PARAMS( 0 ) ); - rect->SetFilled( true ); - aBoard->Add( rect, ADD_MODE::APPEND ); - } - else if( seg->shape == GR_SHAPE_TEXT ) - { - const GRAPHIC_TEXT *src = - static_cast( seg.get() ); - - PCB_TEXT* txt = new PCB_TEXT( aBoard ); - txt->SetLayer( layer ); - txt->SetTextPos( VECTOR2I( src->start_x, src->start_y - src->height / 2 ) ); - txt->SetText( src->text ); - txt->SetItalic( src->ital ); - txt->SetTextThickness( src->thickness ); - txt->SetTextHeight( src->height ); - txt->SetTextWidth( src->width ); - txt->SetHorizJustify( src->orient ); - aBoard->Add( txt, ADD_MODE::APPEND ); } } else @@ -3159,14 +3148,12 @@ FABMASTER::createBoardItems( BOARD& aBoard, PCB_LAYER_ID aLayer, FABMASTER::GRAP auto new_text = std::make_unique( &aBoard ); - new_text->SetLayer( aLayer ); - new_text->SetTextPos( VECTOR2I( src.start_x, src.start_y - src.height / 2 ) ); - new_text->SetText( src.text ); - new_text->SetItalic( src.ital ); - new_text->SetTextThickness( src.thickness ); - new_text->SetTextHeight( src.height ); - new_text->SetTextWidth( src.width ); - new_text->SetHorizJustify( src.orient ); + if( IsBackLayer( aLayer ) ) + { + new_text->SetMirrored( true ); + } + + setupText( src, aLayer, *new_text, aBoard, std::nullopt ); new_items.emplace_back( std::move( new_text ) ); break; diff --git a/pcbnew/pcb_io/fabmaster/import_fabmaster.h b/pcbnew/pcb_io/fabmaster/import_fabmaster.h index 63ce82df47..8f6f22ea89 100644 --- a/pcbnew/pcb_io/fabmaster/import_fabmaster.h +++ b/pcbnew/pcb_io/fabmaster/import_fabmaster.h @@ -45,6 +45,7 @@ enum PCB_LAYER_ID : int; class BOARD; class BOARD_ITEM; +class PCB_TEXT; class PROGRESS_REPORTER; class FABMASTER @@ -618,6 +619,12 @@ private: static bool traceIsOpen( const FABMASTER::TRACE& aLine ); + /** + * Set parameters for graphic text + */ + static void setupText( const FABMASTER::GRAPHIC_TEXT& aGraphicText, PCB_LAYER_ID aLayer, + PCB_TEXT& aText, const BOARD& aBoard, const OPT_VECTOR2I& aMirrorPoint ); + /** * Convert one Fabmaster graphic item to one or more PCB items */