From bd0fbea044bdb8d9501ae65fe7b9a9b25422abad Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Sat, 18 Dec 2021 07:55:08 -0800 Subject: [PATCH] =?UTF-8?q?Handle=20360=C2=B0=20arcs=20on=20import=20as=20?= =?UTF-8?q?circles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KiCad breaks a bit when dealing with 360° arcs, so convert them to circles on import. The break happens when converting to polygons for viewing, the arc is passed from start->mid->end format to center->start->angle format. At 360°, the angle is normalized to 0 --- pcbnew/plugins/fabmaster/import_fabmaster.cpp | 56 +++++++++++++++++++ pcbnew/plugins/fabmaster/import_fabmaster.h | 3 +- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/pcbnew/plugins/fabmaster/import_fabmaster.cpp b/pcbnew/plugins/fabmaster/import_fabmaster.cpp index 8a1efec4ea..ae00d7d699 100644 --- a/pcbnew/plugins/fabmaster/import_fabmaster.cpp +++ b/pcbnew/plugins/fabmaster/import_fabmaster.cpp @@ -1076,6 +1076,9 @@ FABMASTER::GRAPHIC_ARC* FABMASTER::processArc( const FABMASTER::GRAPHIC_DATA& aD RotatePoint( mid, center, -angle / 2.0 ); + if( start == end ) + new_arc->shape = GR_SHAPE_CIRCLE; + new_arc->result = SHAPE_ARC( start, mid, end, 0 ); return new_arc; @@ -2111,6 +2114,27 @@ bool FABMASTER::loadFootprints( BOARD* aBoard ) fp->Add( line, ADD_MODE::APPEND ); break; } + case GR_SHAPE_CIRCLE: + { + const GRAPHIC_ARC* lsrc = static_cast( seg.get() ); + + FP_SHAPE* circle = new FP_SHAPE( fp, SHAPE_T::CIRCLE ); + + circle->SetLayer( layer ); + circle->SetCenter( wxPoint( lsrc->center_x, lsrc->center_y ) ); + circle->SetEnd( wxPoint( lsrc->end_x, lsrc->end_y ) ); + circle->SetWidth( lsrc->width ); + circle->SetLocalCoord(); + + if( lsrc->width == 0 ) + circle->SetWidth( ds.GetLineThickness( circle->GetLayer() ) ); + + if( src->mirror ) + circle->Flip( circle->GetCenter(), false ); + + fp->Add( circle, ADD_MODE::APPEND ); + break; + } case GR_SHAPE_ARC: { const GRAPHIC_ARC* lsrc = static_cast( seg.get() ); @@ -2762,6 +2786,23 @@ bool FABMASTER::loadOutline( BOARD* aBoard, const std::unique_ptrAdd( line, ADD_MODE::APPEND ); break; } + case GR_SHAPE_CIRCLE: + { + const GRAPHIC_ARC* lsrc = static_cast( seg.get() ); + + PCB_SHAPE* circle = new PCB_SHAPE( aBoard, SHAPE_T::CIRCLE ); + + circle->SetLayer( layer ); + circle->SetCenter( wxPoint( lsrc->center_x, lsrc->center_y ) ); + circle->SetEnd( wxPoint( lsrc->end_x, lsrc->end_y ) ); + circle->SetWidth( lsrc->width ); + + if( lsrc->width == 0 ) + circle->SetWidth( aBoard->GetDesignSettings().GetLineThickness( circle->GetLayer() ) ); + + aBoard->Add( circle, ADD_MODE::APPEND ); + break; + } case GR_SHAPE_ARC: { const GRAPHIC_ARC* src = static_cast( seg.get() ); @@ -2877,6 +2918,20 @@ bool FABMASTER::loadGraphics( BOARD* aBoard ) aBoard->Add( line, ADD_MODE::APPEND ); break; } + case GR_SHAPE_CIRCLE: + { + const GRAPHIC_ARC* src = static_cast( seg.get() ); + + PCB_SHAPE* circle = new PCB_SHAPE( aBoard, SHAPE_T::CIRCLE ); + + circle->SetLayer( layer ); + circle->SetCenter( wxPoint( src->center_x, src->center_y ) ); + circle->SetEnd( wxPoint( src->end_x, src->end_y ) ); + circle->SetWidth( src->width ); + + aBoard->Add( circle, ADD_MODE::APPEND ); + break; + } case GR_SHAPE_ARC: { const GRAPHIC_ARC* src = static_cast( seg.get() ); @@ -2901,6 +2956,7 @@ bool FABMASTER::loadGraphics( BOARD* aBoard ) rect->SetStart( wxPoint( src->start_x, src->start_y ) ); rect->SetEnd( wxPoint( src->end_x, src->end_y ) ); rect->SetWidth( 0 ); + rect->SetFilled( true ); aBoard->Add( rect, ADD_MODE::APPEND ); break; } diff --git a/pcbnew/plugins/fabmaster/import_fabmaster.h b/pcbnew/plugins/fabmaster/import_fabmaster.h index 2a46e33524..371c4c4f76 100644 --- a/pcbnew/plugins/fabmaster/import_fabmaster.h +++ b/pcbnew/plugins/fabmaster/import_fabmaster.h @@ -191,7 +191,8 @@ private: GR_SHAPE_LINE, GR_SHAPE_TEXT, GR_SHAPE_RECTANGLE, - GR_SHAPE_ARC + GR_SHAPE_ARC, + GR_SHAPE_CIRCLE ///! Not actually in Fabmaster but we use for 360° arcs }; enum GRAPHIC_TYPE