EasyEDA import: force close some line chains.

This commit is contained in:
Alex 2024-02-11 23:46:24 +03:00
parent bf9d085c15
commit b5982f7319
4 changed files with 27 additions and 13 deletions

View File

@ -66,8 +66,8 @@ double EASYEDA_PARSER_BASE::RelPosY( const wxString& aValue )
}
std::vector<SHAPE_LINE_CHAIN> EASYEDA_PARSER_BASE::ParseLineChains( const wxString& data,
int aArcMinSegLen )
std::vector<SHAPE_LINE_CHAIN>
EASYEDA_PARSER_BASE::ParseLineChains( const wxString& data, int aArcMinSegLen, bool aForceClosed )
{
std::vector<SHAPE_LINE_CHAIN> result;
@ -109,7 +109,12 @@ std::vector<SHAPE_LINE_CHAIN> EASYEDA_PARSER_BASE::ParseLineChains( const wxStri
readNumber( yStr );
if( chain.PointCount() > 1 )
{
if( aForceClosed )
chain.SetClosed( true );
result.emplace_back( chain );
}
chain.Clear();
@ -229,7 +234,12 @@ std::vector<SHAPE_LINE_CHAIN> EASYEDA_PARSER_BASE::ParseLineChains( const wxStri
} while( pos < data.size() );
if( chain.PointCount() > 1 )
{
if( aForceClosed )
chain.SetClosed( true );
result.emplace_back( chain );
}
return result;
}

View File

@ -58,7 +58,8 @@ public:
return ScalePos( aVec - m_relOrigin );
}
std::vector<SHAPE_LINE_CHAIN> ParseLineChains( const wxString& aData, int aArcMinSegLen );
std::vector<SHAPE_LINE_CHAIN> ParseLineChains( const wxString& aData, int aArcMinSegLen,
bool aForceClosed );
protected:
VECTOR2D m_relOrigin;

View File

@ -478,7 +478,7 @@ void SCH_EASYEDA_PARSER::ParseSymbolShapes( LIB_SYMBOL* aSymbol
aSymbol->AddDrawItem( line.release() );
}
else if( elType == wxS( "PT" ) )
else if( elType == wxS( "PT" ) ) // Freedraw
{
wxString pointsData = arr[1];
wxString strokeColor = arr[2];
@ -488,7 +488,7 @@ void SCH_EASYEDA_PARSER::ParseSymbolShapes( LIB_SYMBOL* aSymbol
//bool locked = arr[7] != wxS( "0" );
std::vector<SHAPE_LINE_CHAIN> lineChains =
ParseLineChains( pointsData, schIUScale.MilsToIU( 10 ) );
ParseLineChains( pointsData, schIUScale.MilsToIU( 10 ), false );
for( SHAPE_LINE_CHAIN outline : lineChains )
{

View File

@ -438,7 +438,7 @@ void PCB_IO_EASYEDA_PARSER::ParseToBoardItemContainer(
//double textHeight = !arr[4].IsEmpty() ? ConvertSize( arr[4] ) : 0;
std::vector<SHAPE_LINE_CHAIN> lineChains =
ParseLineChains( shapeData, pcbIUScale.mmToIU( 0.01 ) );
ParseLineChains( shapeData, pcbIUScale.mmToIU( 0.01 ), false );
std::unique_ptr<PCB_GROUP> group = std::make_unique<PCB_GROUP>( aContainer );
group->SetName( wxS( "Dimension" ) );
@ -469,7 +469,8 @@ void PCB_IO_EASYEDA_PARSER::ParseToBoardItemContainer(
{
wxString layer = arr[1];
SHAPE_POLY_SET polySet = ParseLineChains( arr[3].Trim(), pcbIUScale.mmToIU( 0.01 ) );
SHAPE_POLY_SET polySet =
ParseLineChains( arr[3].Trim(), pcbIUScale.mmToIU( 0.01 ), true );
if( layer == wxS( "11" ) ) // Multi-layer (board cutout)
{
@ -543,7 +544,8 @@ void PCB_IO_EASYEDA_PARSER::ParseToBoardItemContainer(
// Do not fill?
}
SHAPE_POLY_SET polySet = ParseLineChains( arr[4].Trim(), pcbIUScale.mmToIU( 0.01 ) );
SHAPE_POLY_SET polySet =
ParseLineChains( arr[4].Trim(), pcbIUScale.mmToIU( 0.01 ), true );
for( const SHAPE_POLY_SET::POLYGON& poly : polySet.CPolygons() )
zone->Outline()->AddPolygon( poly );
@ -564,8 +566,8 @@ void PCB_IO_EASYEDA_PARSER::ParseToBoardItemContainer(
{
for( const nlohmann::json& contourData : polyData )
{
SHAPE_POLY_SET contourPolySet = ParseLineChains( contourData.get<wxString>(),
pcbIUScale.mmToIU( 0.01 ) );
SHAPE_POLY_SET contourPolySet = ParseLineChains(
contourData.get<wxString>(), pcbIUScale.mmToIU( 0.01 ), true );
SHAPE_POLY_SET currentOutline( contourPolySet.COutline( 0 ) );
@ -742,10 +744,11 @@ void PCB_IO_EASYEDA_PARSER::ParseToBoardItemContainer(
{
if( auto dataStr = get_opt( attributes, "d" ) )
{
int minSegLen = dataStr->size() < 8000 ? pcbIUScale.mmToIU( 0.005 )
: pcbIUScale.mmToIU( 0.05 );
SHAPE_POLY_SET polySet =
ParseLineChains( dataStr->Trim(),
dataStr->size() < 8000 ? pcbIUScale.mmToIU( 0.005 )
: pcbIUScale.mmToIU( 0.05 ) );
ParseLineChains( dataStr->Trim(), minSegLen, true );
polySet.RebuildHolesFromContours();