From 82ab04c1d606f9e169c80a9d2919c0afaed19a62 Mon Sep 17 00:00:00 2001 From: Thomas Pointhuber Date: Mon, 27 Dec 2021 16:50:30 +0100 Subject: [PATCH] altium: Use newly introduced RECT shape, apply fill and improve stroke handling (#8741) --- .../sch_plugins/altium/altium_parser_sch.h | 48 ++--- .../sch_plugins/altium/sch_altium_plugin.cpp | 174 ++++++++---------- 2 files changed, 89 insertions(+), 133 deletions(-) diff --git a/eeschema/sch_plugins/altium/altium_parser_sch.h b/eeschema/sch_plugins/altium/altium_parser_sch.h index b261645df7..5b1e48019a 100644 --- a/eeschema/sch_plugins/altium/altium_parser_sch.h +++ b/eeschema/sch_plugins/altium/altium_parser_sch.h @@ -107,6 +107,20 @@ enum class ASCH_RECORD_ORIENTATION }; +struct ASCH_SHAPE_INTERFACE +{ + int ownerindex; + int ownerpartid; + int ownerpartdisplaymode; + + int lineWidth; + bool isSolid; + + int color; + int areacolor; +}; + + struct ASCH_SYMBOL { int currentpartid; @@ -330,42 +344,23 @@ struct ASCH_POLYLINE }; -struct ASCH_POLYGON +struct ASCH_POLYGON : ASCH_SHAPE_INTERFACE { - int ownerindex; - int ownerpartid; - int ownerpartdisplaymode; - std::vector points; - int lineWidth; - bool isSolid; - - int color; - int areacolor; - explicit ASCH_POLYGON( const std::map& aProps ); }; -struct ASCH_ROUND_RECTANGLE +struct ASCH_ROUND_RECTANGLE : ASCH_SHAPE_INTERFACE { - int ownerindex; - int ownerpartid; - int ownerpartdisplaymode; - wxPoint bottomLeft; wxPoint topRight; wxSize cornerradius; - int lineWidth; - bool isSolid; bool isTransparent; - int color; - int areacolor; - explicit ASCH_ROUND_RECTANGLE( const std::map& aProps ); }; @@ -402,22 +397,13 @@ struct ASCH_LINE }; -struct ASCH_RECTANGLE +struct ASCH_RECTANGLE : ASCH_SHAPE_INTERFACE { - int ownerindex; - int ownerpartid; - int ownerpartdisplaymode; - wxPoint bottomLeft; wxPoint topRight; - int lineWidth; - bool isSolid; bool isTransparent; - int color; - int areacolor; - explicit ASCH_RECTANGLE( const std::map& aProps ); }; diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp index 6ba67cba55..024c7b2d8a 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp @@ -61,14 +61,14 @@ #include #include -const wxPoint GetRelativePosition( const wxPoint& aPosition, const SCH_SYMBOL* aSymbol ) +static const wxPoint GetRelativePosition( const wxPoint& aPosition, const SCH_SYMBOL* aSymbol ) { TRANSFORM t = aSymbol->GetTransform().InverseTransform(); return t.TransformCoordinate( aPosition - aSymbol->GetPosition() ); } -COLOR4D GetColorFromInt( int color ) +static COLOR4D GetColorFromInt( int color ) { int red = color & 0x0000FF; int green = ( color & 0x00FF00 ) >> 8; @@ -77,6 +77,53 @@ COLOR4D GetColorFromInt( int color ) return COLOR4D().FromCSSRGBA( red, green, blue, 1.0 ); } + +static PLOT_DASH_TYPE GetPlotDashType( const ASCH_POLYLINE_LINESTYLE linestyle ) +{ + switch( linestyle ) + { + case ASCH_POLYLINE_LINESTYLE::SOLID: return PLOT_DASH_TYPE::SOLID; + case ASCH_POLYLINE_LINESTYLE::DASHED: return PLOT_DASH_TYPE::DASH; + case ASCH_POLYLINE_LINESTYLE::DOTTED: return PLOT_DASH_TYPE::DOT; + case ASCH_POLYLINE_LINESTYLE::DASH_DOTTED: return PLOT_DASH_TYPE::DASHDOT; + default: return PLOT_DASH_TYPE::DEFAULT; + } +} + + +static void SetSchShapeFillAndColor( const ASCH_SHAPE_INTERFACE& elem, SCH_SHAPE* shape ) +{ + shape->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); + + if( !elem.isSolid ) + { + shape->SetFillMode( FILL_T::NO_FILL ); + } + else + { + shape->SetFillMode( FILL_T::FILLED_WITH_COLOR ); + shape->SetFillColor( GetColorFromInt( elem.areacolor ) ); + } +} + +static void SetLibShapeFillAndColor( const ASCH_SHAPE_INTERFACE& elem, LIB_SHAPE* shape ) +{ + shape->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); + + if( !elem.isSolid ) + { + shape->SetFillMode( FILL_T::NO_FILL ); + } + else if( elem.color == elem.areacolor ) + { + shape->SetFillMode( FILL_T::FILLED_SHAPE ); + } + else + { + shape->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR ); + } +} + SCH_ALTIUM_PLUGIN::SCH_ALTIUM_PLUGIN() { m_rootSheet = nullptr; @@ -994,8 +1041,7 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map& aProper SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( elem.points.at( i + 1 ) + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); - line->SetLineStyle( PLOT_DASH_TYPE::SOLID ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1007,7 +1053,7 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map& aProper std::vector polyPoints; for( size_t j = i; j < elem.points.size() && j < i + 4; j++ ) - bezierPoints.push_back( elem.points.at( j ) + m_sheetOffset ); + bezierPoints.push_back( elem.points.at( j ) ); BEZIER_POLY converter( bezierPoints ); converter.GetPoly( polyPoints ); @@ -1018,7 +1064,7 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map& aProper SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( polyPoints.at( k + 1 ) + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1116,24 +1162,13 @@ void SCH_ALTIUM_PLUGIN::ParsePolyline( const std::map& aProp if( elem.ownerpartid == ALTIUM_COMPONENT_NONE ) { - PLOT_DASH_TYPE dashType = PLOT_DASH_TYPE::DEFAULT; - switch( elem.linestyle ) - { - default: - case ASCH_POLYLINE_LINESTYLE::SOLID: dashType = PLOT_DASH_TYPE::SOLID; break; - case ASCH_POLYLINE_LINESTYLE::DASHED: dashType = PLOT_DASH_TYPE::DASH; break; - case ASCH_POLYLINE_LINESTYLE::DOTTED: dashType = PLOT_DASH_TYPE::DOT; break; - case ASCH_POLYLINE_LINESTYLE::DASH_DOTTED: dashType = PLOT_DASH_TYPE::DASHDOT; break; - } - for( size_t i = 0; i + 1 < elem.points.size(); i++ ) { SCH_LINE* line = new SCH_LINE( elem.points.at( i ) + m_sheetOffset, SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( elem.points.at( i + 1 ) + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); - line->SetLineStyle( dashType ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, GetPlotDashType( elem.linestyle ) ) ); line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1164,7 +1199,7 @@ void SCH_ALTIUM_PLUGIN::ParsePolyline( const std::map& aProp for( wxPoint& point : elem.points ) line->AddPoint( GetRelativePosition( point + m_sheetOffset, symbol ) ); - line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, GetPlotDashType( elem.linestyle ) ) ); } } @@ -1181,8 +1216,7 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map& aPrope SCH_LINE* line = new SCH_LINE( elem.points.at( i ) + m_sheetOffset, SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( elem.points.at( i + 1 ) + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); - line->SetLineStyle( PLOT_DASH_TYPE::SOLID ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1192,8 +1226,7 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map& aPrope SCH_LINE* line = new SCH_LINE( elem.points.front() + m_sheetOffset, SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( elem.points.back() + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); - line->SetLineStyle( PLOT_DASH_TYPE::SOLID ); + line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1224,15 +1257,7 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map& aPrope line->AddPoint( GetRelativePosition( point + m_sheetOffset, symbol ) ); line->AddPoint( GetRelativePosition( elem.points.front() + m_sheetOffset, symbol ) ); - - line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); - - if( !elem.isSolid ) - line->SetFillMode( FILL_T::NO_FILL ); - else if( elem.color == elem.areacolor ) - line->SetFillMode( FILL_T::FILLED_SHAPE ); - else - line->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR ); + SetLibShapeFillAndColor( elem, line ); } } @@ -1249,35 +1274,15 @@ void SCH_ALTIUM_PLUGIN::ParseRoundRectangle( const std::map& const wxPoint topLeft = { sheetBottomLeft.x, sheetTopRight.y }; const wxPoint bottomRight = { sheetTopRight.x, sheetBottomLeft.y }; - // TODO: we cannot fill this rectangle, only draw it for now // TODO: misses rounded edges - SCH_LINE* lineTop = new SCH_LINE( sheetTopRight, SCH_LAYER_ID::LAYER_NOTES ); - lineTop->SetEndPoint( topLeft ); - lineTop->SetLineWidth( elem.lineWidth ); - lineTop->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineTop->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineTop ); + SCH_SHAPE* rect = new SCH_SHAPE( SHAPE_T::RECT, SCH_LAYER_ID::LAYER_NOTES ); - SCH_LINE* lineBottom = new SCH_LINE( sheetBottomLeft, SCH_LAYER_ID::LAYER_NOTES ); - lineBottom->SetEndPoint( bottomRight ); - lineBottom->SetLineWidth( elem.lineWidth ); - lineBottom->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineBottom->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineBottom ); + rect->SetPosition( sheetTopRight ); + rect->SetEnd( sheetBottomLeft ); + SetSchShapeFillAndColor( elem, rect ); + rect->SetFlags( IS_NEW ); - SCH_LINE* lineRight = new SCH_LINE( sheetTopRight, SCH_LAYER_ID::LAYER_NOTES ); - lineRight->SetEndPoint( bottomRight ); - lineRight->SetLineWidth( elem.lineWidth ); - lineRight->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineRight->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineRight ); - - SCH_LINE* lineLeft = new SCH_LINE( sheetBottomLeft, SCH_LAYER_ID::LAYER_NOTES ); - lineLeft->SetEndPoint( topLeft ); - lineLeft->SetLineWidth( elem.lineWidth ); - lineLeft->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineLeft->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineLeft ); + m_currentSheet->GetScreen()->Append( rect ); } else { @@ -1304,14 +1309,7 @@ void SCH_ALTIUM_PLUGIN::ParseRoundRectangle( const std::map& rect->SetPosition( GetRelativePosition( elem.topRight + m_sheetOffset, symbol ) ); rect->SetEnd( GetRelativePosition( elem.bottomLeft + m_sheetOffset, symbol ) ); - rect->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); - - if( !elem.isSolid ) - rect->SetFillMode( FILL_T::NO_FILL ); - else if( elem.color == elem.areacolor ) - rect->SetFillMode( FILL_T::FILLED_SHAPE ); - else - rect->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR ); + SetLibShapeFillAndColor( elem, rect ); } } @@ -1413,8 +1411,7 @@ void SCH_ALTIUM_PLUGIN::ParseLine( const std::map& aProperti // close polygon SCH_LINE* line = new SCH_LINE( elem.point1 + m_sheetOffset, SCH_LAYER_ID::LAYER_NOTES ); line->SetEndPoint( elem.point2 + m_sheetOffset ); - line->SetLineWidth( elem.lineWidth ); - line->SetLineStyle( PLOT_DASH_TYPE::SOLID ); // TODO? + line->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); // TODO? line->SetFlags( IS_NEW ); m_currentSheet->GetScreen()->Append( line ); @@ -1461,34 +1458,14 @@ void SCH_ALTIUM_PLUGIN::ParseRectangle( const std::map& aPro const wxPoint topLeft = { sheetBottomLeft.x, sheetTopRight.y }; const wxPoint bottomRight = { sheetTopRight.x, sheetBottomLeft.y }; - // TODO: we cannot fill this rectangle, only draw it for now - SCH_LINE* lineTop = new SCH_LINE( sheetTopRight, SCH_LAYER_ID::LAYER_NOTES ); - lineTop->SetEndPoint( topLeft ); - lineTop->SetLineWidth( elem.lineWidth ); - lineTop->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineTop->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineTop ); + SCH_SHAPE* rect = new SCH_SHAPE( SHAPE_T::RECT, SCH_LAYER_ID::LAYER_NOTES ); - SCH_LINE* lineBottom = new SCH_LINE( sheetBottomLeft, SCH_LAYER_ID::LAYER_NOTES ); - lineBottom->SetEndPoint( bottomRight ); - lineBottom->SetLineWidth( elem.lineWidth ); - lineBottom->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineBottom->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineBottom ); + rect->SetPosition( sheetTopRight ); + rect->SetEnd( sheetBottomLeft ); + SetSchShapeFillAndColor( elem, rect ); + rect->SetFlags( IS_NEW ); - SCH_LINE* lineRight = new SCH_LINE( sheetTopRight, SCH_LAYER_ID::LAYER_NOTES ); - lineRight->SetEndPoint( bottomRight ); - lineRight->SetLineWidth( elem.lineWidth ); - lineRight->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineRight->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineRight ); - - SCH_LINE* lineLeft = new SCH_LINE( sheetBottomLeft, SCH_LAYER_ID::LAYER_NOTES ); - lineLeft->SetEndPoint( topLeft ); - lineLeft->SetLineWidth( elem.lineWidth ); - lineLeft->SetLineStyle( PLOT_DASH_TYPE::SOLID ); - lineLeft->SetFlags( IS_NEW ); - m_currentSheet->GetScreen()->Append( lineLeft ); + m_currentSheet->GetScreen()->Append( rect ); } else { @@ -1514,14 +1491,7 @@ void SCH_ALTIUM_PLUGIN::ParseRectangle( const std::map& aPro rect->SetPosition( GetRelativePosition( sheetTopRight, symbol ) ); rect->SetEnd( GetRelativePosition( sheetBottomLeft, symbol ) ); - rect->SetStroke( STROKE_PARAMS( elem.lineWidth, PLOT_DASH_TYPE::SOLID ) ); - - if( !elem.isSolid ) - rect->SetFillMode( FILL_T::NO_FILL ); - else if( elem.color == elem.areacolor ) - rect->SetFillMode( FILL_T::FILLED_SHAPE ); - else - rect->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR ); + SetLibShapeFillAndColor( elem, rect ); } }