EasyEDA Std/Pro: import (some) component metadata for symbols.
Also fixes Reference numbering. Fixes https://gitlab.com/kicad/code/kicad/-/issues/17806
This commit is contained in:
parent
f8b02f99dd
commit
17175fe71e
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
||||||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -246,7 +246,7 @@ EASYEDA_PARSER_BASE::ParseLineChains( const wxString& data, int aArcMinSegLen, b
|
||||||
arc.ConstructFromStartEndCenter( RelPos( start ), RelPos( end ), RelPos( arcCenter ),
|
arc.ConstructFromStartEndCenter( RelPos( start ), RelPos( end ), RelPos( arcCenter ),
|
||||||
!cw );
|
!cw );
|
||||||
|
|
||||||
chain.Append( arc );
|
chain.Append( arc, aArcMinSegLen );
|
||||||
|
|
||||||
prevPt = end;
|
prevPt = end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
||||||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -43,12 +43,27 @@
|
||||||
#include <wx/base64.h>
|
#include <wx/base64.h>
|
||||||
#include <wx/url.h>
|
#include <wx/url.h>
|
||||||
#include <wx/mstream.h>
|
#include <wx/mstream.h>
|
||||||
|
#include <core/map_helpers.h>
|
||||||
#include <gfx_import_utils.h>
|
#include <gfx_import_utils.h>
|
||||||
#include <import_gfx/svg_import_plugin.h>
|
#include <import_gfx/svg_import_plugin.h>
|
||||||
#include <import_gfx/graphics_importer_lib_symbol.h>
|
#include <import_gfx/graphics_importer_lib_symbol.h>
|
||||||
#include <import_gfx/graphics_importer_sch.h>
|
#include <import_gfx/graphics_importer_sch.h>
|
||||||
|
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
static const std::vector<wxString> c_attributesWhitelist = { "Datasheet",
|
||||||
|
"Manufacturer Part",
|
||||||
|
"Manufacturer",
|
||||||
|
"BOM_Manufacturer Part",
|
||||||
|
"BOM_Manufacturer",
|
||||||
|
"Supplier Part",
|
||||||
|
"Supplier",
|
||||||
|
"BOM_Supplier Part",
|
||||||
|
"BOM_Supplier",
|
||||||
|
"LCSC Part Name" };
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
|
||||||
SCH_EASYEDA_PARSER::SCH_EASYEDA_PARSER( SCHEMATIC* aSchematic,
|
SCH_EASYEDA_PARSER::SCH_EASYEDA_PARSER( SCHEMATIC* aSchematic,
|
||||||
PROGRESS_REPORTER* aProgressReporter )
|
PROGRESS_REPORTER* aProgressReporter )
|
||||||
{
|
{
|
||||||
|
@ -561,97 +576,61 @@ void SCH_EASYEDA_PARSER::ParseSymbolShapes( LIB_SYMBOL* aSymbol
|
||||||
wxString fillColor = arr[6].Lower();
|
wxString fillColor = arr[6].Lower();
|
||||||
//bool locked = arr[8] != wxS( "0" );
|
//bool locked = arr[8] != wxS( "0" );
|
||||||
|
|
||||||
VECTOR2D start, end;
|
std::vector<SHAPE_LINE_CHAIN> chains =
|
||||||
VECTOR2D rad( 10, 10 );
|
ParseLineChains( data, schIUScale.MilsToIU( 10 ), false );
|
||||||
bool isFar = false;
|
|
||||||
bool cw = false;
|
|
||||||
|
|
||||||
size_t pos = 0;
|
auto transform = []( VECTOR2I aVec )
|
||||||
auto readNumber = [&]( wxString& aOut )
|
|
||||||
{
|
{
|
||||||
wxUniChar ch = data[pos];
|
return VECTOR2I( aVec.x, -aVec.y );
|
||||||
|
|
||||||
while( ch == ' ' || ch == ',' )
|
|
||||||
ch = data[++pos];
|
|
||||||
|
|
||||||
while( isdigit( ch ) || ch == '.' || ch == '-' )
|
|
||||||
{
|
|
||||||
aOut += ch;
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
if( pos == data.size() )
|
|
||||||
break;
|
|
||||||
|
|
||||||
ch = data[pos];
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
do
|
for( const SHAPE_LINE_CHAIN& chain : chains )
|
||||||
{
|
{
|
||||||
wxUniChar sym = data[pos++];
|
for( int i = 0; i <= chain.PointCount() && i != -1; i = chain.NextShape( i ) )
|
||||||
|
|
||||||
if( sym == 'M' )
|
|
||||||
{
|
{
|
||||||
wxString xStr, yStr;
|
if( chain.IsArcStart( i ) )
|
||||||
readNumber( xStr );
|
{
|
||||||
readNumber( yStr );
|
SHAPE_ARC arc = chain.Arc( chain.ArcIndex( i ) );
|
||||||
|
|
||||||
start = VECTOR2D( Convert( xStr ), Convert( yStr ) );
|
std::unique_ptr<LIB_SHAPE> shape =
|
||||||
|
std::make_unique<LIB_SHAPE>( aSymbol, SHAPE_T::ARC );
|
||||||
|
|
||||||
|
shape->SetArcGeometry( transform( arc.GetP0() ),
|
||||||
|
transform( arc.GetArcMid() ),
|
||||||
|
transform( arc.GetP1() ) );
|
||||||
|
|
||||||
|
shape->SetUnit( 0 );
|
||||||
|
shape->SetStroke( STROKE_PARAMS( ScaleSize( lineWidth ), strokeStyle ) );
|
||||||
|
|
||||||
|
if( fillColor != wxS( "none" ) )
|
||||||
|
{
|
||||||
|
shape->SetFilled( true );
|
||||||
|
|
||||||
|
if( fillColor == strokeColor )
|
||||||
|
shape->SetFillMode( FILL_T::FILLED_SHAPE );
|
||||||
|
else
|
||||||
|
shape->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR );
|
||||||
|
}
|
||||||
|
|
||||||
|
aSymbol->AddDrawItem( shape.release() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SEG seg = chain.CSegment( i );
|
||||||
|
|
||||||
|
std::unique_ptr<LIB_SHAPE> shape =
|
||||||
|
std::make_unique<LIB_SHAPE>( aSymbol, SHAPE_T::POLY );
|
||||||
|
|
||||||
|
shape->AddPoint( transform( seg.A ) );
|
||||||
|
shape->AddPoint( transform( seg.B ) );
|
||||||
|
|
||||||
|
shape->SetUnit( 0 );
|
||||||
|
shape->SetStroke( STROKE_PARAMS( ScaleSize( lineWidth ), strokeStyle ) );
|
||||||
|
|
||||||
|
aSymbol->AddDrawItem( shape.release() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( sym == 'A' )
|
|
||||||
{
|
|
||||||
wxString radX, radY, unknown, farFlag, cwFlag, endX, endY;
|
|
||||||
readNumber( radX );
|
|
||||||
readNumber( radY );
|
|
||||||
readNumber( unknown );
|
|
||||||
readNumber( farFlag );
|
|
||||||
readNumber( cwFlag );
|
|
||||||
readNumber( endX );
|
|
||||||
readNumber( endY );
|
|
||||||
|
|
||||||
isFar = farFlag == wxS( "1" );
|
|
||||||
cw = cwFlag == wxS( "1" );
|
|
||||||
rad = VECTOR2D( Convert( radX ), Convert( radY ) );
|
|
||||||
end = VECTOR2D( Convert( endX ), Convert( endY ) );
|
|
||||||
}
|
|
||||||
} while( pos < data.size() );
|
|
||||||
|
|
||||||
VECTOR2D delta = end - start;
|
|
||||||
|
|
||||||
double avgRad = ( rad.x + rad.y ) / 2;
|
|
||||||
double d = delta.EuclideanNorm();
|
|
||||||
double h = sqrt( std::max( 0.0, avgRad * avgRad - d * d / 4 ) );
|
|
||||||
|
|
||||||
//( !far && cw ) => h
|
|
||||||
//( far && cw ) => -h
|
|
||||||
//( !far && !cw ) => -h
|
|
||||||
//( far && !cw ) => h
|
|
||||||
VECTOR2D arcCenter =
|
|
||||||
start + delta / 2 + delta.Perpendicular().Resize( ( isFar ^ cw ) ? h : -h );
|
|
||||||
|
|
||||||
if( cw )
|
|
||||||
std::swap( start, end );
|
|
||||||
|
|
||||||
std::unique_ptr<LIB_SHAPE> shape = std::make_unique<LIB_SHAPE>( aSymbol, SHAPE_T::ARC );
|
|
||||||
|
|
||||||
shape->SetStart( RelPosSym( start ) );
|
|
||||||
shape->SetEnd( RelPosSym( end ) );
|
|
||||||
shape->SetCenter( RelPosSym( arcCenter ) );
|
|
||||||
|
|
||||||
shape->SetUnit( 0 );
|
|
||||||
shape->SetStroke( STROKE_PARAMS( ScaleSize( lineWidth ), strokeStyle ) );
|
|
||||||
|
|
||||||
if( fillColor != wxS( "none" ) )
|
|
||||||
{
|
|
||||||
shape->SetFilled( true );
|
|
||||||
|
|
||||||
if( fillColor == strokeColor )
|
|
||||||
shape->SetFillMode( FILL_T::FILLED_SHAPE );
|
|
||||||
else
|
|
||||||
shape->SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aSymbol->AddDrawItem( shape.release() );
|
|
||||||
}
|
}
|
||||||
else if( elType == wxS( "R" ) )
|
else if( elType == wxS( "R" ) )
|
||||||
{
|
{
|
||||||
|
@ -962,22 +941,20 @@ LIB_SYMBOL* SCH_EASYEDA_PARSER::ParseSymbol( const VECTOR2D& aOrigi
|
||||||
|
|
||||||
m_relOrigin = aOrigin;
|
m_relOrigin = aOrigin;
|
||||||
|
|
||||||
wxString symbolName = wxS( "Unknown" );
|
std::optional<wxString> valOpt;
|
||||||
|
wxString symbolName = wxS( "Unknown" );
|
||||||
|
|
||||||
if( aParams.find( wxS( "name" ) ) != aParams.end() )
|
if( valOpt = get_opt( aParams, wxS( "name" ) ) )
|
||||||
symbolName = aParams.at( wxS( "name" ) );
|
symbolName = *valOpt;
|
||||||
else if( aParams.find( wxS( "spiceSymbolName" ) ) != aParams.end() )
|
else if( valOpt = get_opt( aParams, wxS( "spiceSymbolName" ) ) )
|
||||||
symbolName = aParams.at( wxS( "spiceSymbolName" ) );
|
symbolName = *valOpt;
|
||||||
|
|
||||||
wxString symbolPrefix;
|
wxString symbolPrefix;
|
||||||
|
|
||||||
if( aParams.find( wxS( "pre" ) ) != aParams.end() )
|
if( valOpt = get_opt( aParams, wxS( "pre" ) ) )
|
||||||
symbolPrefix = aParams.at( wxS( "pre" ) );
|
symbolPrefix = *valOpt;
|
||||||
else if( aParams.find( wxS( "spicePre" ) ) != aParams.end() )
|
else if( valOpt = get_opt( aParams, wxS( "spicePre" ) ) )
|
||||||
symbolPrefix = aParams.at( wxS( "spicePre" ) );
|
symbolPrefix = *valOpt;
|
||||||
|
|
||||||
if( !symbolPrefix.EndsWith( wxS( "?" ) ) )
|
|
||||||
symbolPrefix += wxS( "?" );
|
|
||||||
|
|
||||||
LIB_ID libId = EasyEdaToKiCadLibID( wxEmptyString, symbolName );
|
LIB_ID libId = EasyEdaToKiCadLibID( wxEmptyString, symbolName );
|
||||||
|
|
||||||
|
@ -987,6 +964,31 @@ LIB_SYMBOL* SCH_EASYEDA_PARSER::ParseSymbol( const VECTOR2D& aOrigi
|
||||||
ksymbol->GetReferenceField().SetText( symbolPrefix );
|
ksymbol->GetReferenceField().SetText( symbolPrefix );
|
||||||
ksymbol->GetValueField().SetText( symbolName );
|
ksymbol->GetValueField().SetText( symbolName );
|
||||||
|
|
||||||
|
for( wxString attrName : c_attributesWhitelist )
|
||||||
|
{
|
||||||
|
wxString srcName = attrName;
|
||||||
|
|
||||||
|
if( srcName == wxS( "Datasheet" ) )
|
||||||
|
srcName = wxS( "link" );
|
||||||
|
|
||||||
|
if( valOpt = get_opt( aParams, srcName ) )
|
||||||
|
{
|
||||||
|
if( valOpt->empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LIB_FIELD* fd = ksymbol->FindField( attrName, true );
|
||||||
|
|
||||||
|
if( !fd )
|
||||||
|
{
|
||||||
|
fd = new LIB_FIELD( ksymbol->GetNextAvailableFieldId(), attrName );
|
||||||
|
ksymbol->AddField( fd );
|
||||||
|
}
|
||||||
|
|
||||||
|
fd->SetText( *valOpt );
|
||||||
|
fd->SetVisible( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ParseSymbolShapes( ksymbol.get(), aParams, aShapes );
|
ParseSymbolShapes( ksymbol.get(), aParams, aShapes );
|
||||||
|
|
||||||
return ksymbol.release();
|
return ksymbol.release();
|
||||||
|
|
|
@ -225,7 +225,19 @@ LIB_SYMBOL* loadSymbol( const wxString& aLibraryPath, nlohmann::json aFileData,
|
||||||
{
|
{
|
||||||
parts.RemoveAt( 0 );
|
parts.RemoveAt( 0 );
|
||||||
|
|
||||||
return parser.ParseSymbol( origin, paramMap, parts );
|
LIB_SYMBOL* ksymbol = parser.ParseSymbol( origin, paramMap, parts );
|
||||||
|
|
||||||
|
// Clear reference numbers
|
||||||
|
LIB_FIELD& refField = ksymbol->GetReferenceField();
|
||||||
|
wxString origRef = refField.GetText();
|
||||||
|
wxString reference;
|
||||||
|
|
||||||
|
for( size_t i = 0; i < origRef.size() && !wxIsdigit( origRef[i] ); i++ )
|
||||||
|
reference << origRef[i];
|
||||||
|
|
||||||
|
refField.SetText( reference );
|
||||||
|
|
||||||
|
return ksymbol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,7 +273,19 @@ LIB_SYMBOL* loadSymbol( const wxString& aLibraryPath, nlohmann::json aFileData,
|
||||||
|
|
||||||
VECTOR2D origin( topDoc.head.x, topDoc.head.y );
|
VECTOR2D origin( topDoc.head.x, topDoc.head.y );
|
||||||
|
|
||||||
return parser.ParseSymbol( origin, *c_para, topDoc.shape );
|
LIB_SYMBOL* ksymbol = parser.ParseSymbol( origin, *c_para, topDoc.shape );
|
||||||
|
|
||||||
|
// Clear reference numbers
|
||||||
|
LIB_FIELD& refField = ksymbol->GetReferenceField();
|
||||||
|
wxString origRef = refField.GetText();
|
||||||
|
wxString reference;
|
||||||
|
|
||||||
|
for( size_t i = 0; i < origRef.size() && !wxIsdigit( origRef[i] ); i++ )
|
||||||
|
reference << origRef[i];
|
||||||
|
|
||||||
|
refField.SetText( reference );
|
||||||
|
|
||||||
|
return ksymbol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( nlohmann::json::exception& e )
|
catch( nlohmann::json::exception& e )
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
||||||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -52,6 +52,21 @@
|
||||||
#include <import_gfx/graphics_importer_sch.h>
|
#include <import_gfx/graphics_importer_sch.h>
|
||||||
|
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
static const std::vector<wxString> c_attributesWhitelist = { "Value",
|
||||||
|
"Datasheet",
|
||||||
|
"Manufacturer Part",
|
||||||
|
"Manufacturer",
|
||||||
|
"BOM_Manufacturer Part",
|
||||||
|
"BOM_Manufacturer",
|
||||||
|
"Supplier Part",
|
||||||
|
"Supplier",
|
||||||
|
"BOM_Supplier Part",
|
||||||
|
"BOM_Supplier",
|
||||||
|
"LCSC Part Name" };
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
|
||||||
SCH_EASYEDAPRO_PARSER::SCH_EASYEDAPRO_PARSER( SCHEMATIC* aSchematic,
|
SCH_EASYEDAPRO_PARSER::SCH_EASYEDAPRO_PARSER( SCHEMATIC* aSchematic,
|
||||||
PROGRESS_REPORTER* aProgressReporter )
|
PROGRESS_REPORTER* aProgressReporter )
|
||||||
{
|
{
|
||||||
|
@ -383,7 +398,9 @@ void SCH_EASYEDAPRO_PARSER::ApplyAttrToField( const std::map<wxString, nlohmann:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EASYEDAPRO::SYM_INFO SCH_EASYEDAPRO_PARSER::ParseSymbol( const std::vector<nlohmann::json>& aLines )
|
EASYEDAPRO::SYM_INFO
|
||||||
|
SCH_EASYEDAPRO_PARSER::ParseSymbol( const std::vector<nlohmann::json>& aLines,
|
||||||
|
const std::map<wxString, wxString>& aDeviceAttributes )
|
||||||
{
|
{
|
||||||
EASYEDAPRO::SYM_INFO symInfo;
|
EASYEDAPRO::SYM_INFO symInfo;
|
||||||
|
|
||||||
|
@ -686,11 +703,35 @@ EASYEDAPRO::SYM_INFO SCH_EASYEDAPRO_PARSER::ParseSymbol( const std::vector<nlohm
|
||||||
{
|
{
|
||||||
wxString symbolPrefix = designatorAttr->value;
|
wxString symbolPrefix = designatorAttr->value;
|
||||||
|
|
||||||
if( !symbolPrefix.EndsWith( wxS( "?" ) ) )
|
if( symbolPrefix.EndsWith( wxS( "?" ) ) )
|
||||||
symbolPrefix += wxS( "?" );
|
symbolPrefix.RemoveLast();
|
||||||
|
|
||||||
ksymbol->GetReferenceField().SetText( symbolPrefix );
|
ksymbol->GetReferenceField().SetText( symbolPrefix );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for( const wxString& attrName : c_attributesWhitelist )
|
||||||
|
{
|
||||||
|
if( auto valOpt = get_opt( aDeviceAttributes, attrName ) )
|
||||||
|
{
|
||||||
|
if( valOpt->empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LIB_FIELD* fd = ksymbol->FindField( attrName, true );
|
||||||
|
|
||||||
|
if( !fd )
|
||||||
|
{
|
||||||
|
fd = new LIB_FIELD( ksymbol->GetNextAvailableFieldId(), attrName );
|
||||||
|
ksymbol->AddField( fd );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString value = *valOpt;
|
||||||
|
|
||||||
|
value.Replace( wxS( "\u2103" ), wxS( "\u00B0C" ), true ); // ℃ -> °C
|
||||||
|
|
||||||
|
fd->SetText( value );
|
||||||
|
fd->SetVisible( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for( auto& [unitId, parentedLines] : unitParentedLines )
|
for( auto& [unitId, parentedLines] : unitParentedLines )
|
||||||
|
@ -1107,7 +1148,7 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||||
if( !deviceAttr )
|
if( !deviceAttr )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
nlohmann::json compAttrs =
|
std::map<wxString, wxString> compAttrs =
|
||||||
aProject.at( "devices" ).at( deviceAttr->value ).at( "attributes" );
|
aProject.at( "devices" ).at( deviceAttr->value ).at( "attributes" );
|
||||||
|
|
||||||
wxString symbolId;
|
wxString symbolId;
|
||||||
|
@ -1115,7 +1156,7 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||||
if( symbolAttr && !symbolAttr->value.IsEmpty() )
|
if( symbolAttr && !symbolAttr->value.IsEmpty() )
|
||||||
symbolId = symbolAttr->value;
|
symbolId = symbolAttr->value;
|
||||||
else
|
else
|
||||||
symbolId = compAttrs.at( "Symbol" ).get<wxString>();
|
symbolId = compAttrs.at( "Symbol" );
|
||||||
|
|
||||||
auto it = aSymbolMap.find( symbolId );
|
auto it = aSymbolMap.find( symbolId );
|
||||||
if( it == aSymbolMap.end() )
|
if( it == aSymbolMap.end() )
|
||||||
|
@ -1217,6 +1258,30 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
for( const wxString& attrKey : c_attributesWhitelist )
|
||||||
|
{
|
||||||
|
if( auto valOpt = get_opt( compAttrs, attrKey ) )
|
||||||
|
{
|
||||||
|
if( valOpt->empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_FIELD* text = schSym->FindField( attrKey, true );
|
||||||
|
|
||||||
|
if( !text )
|
||||||
|
{
|
||||||
|
text = schSym->AddField(
|
||||||
|
SCH_FIELD( schSym.get(), schSym->GetFieldCount(), attrKey ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString value = *valOpt;
|
||||||
|
|
||||||
|
value.Replace( wxS( "\u2103" ), wxS( "\u00B0C" ), true ); // ℃ -> °C
|
||||||
|
|
||||||
|
text->SetText( value );
|
||||||
|
text->SetVisible( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto nameAttr = get_opt( attributes, "Name" );
|
auto nameAttr = get_opt( attributes, "Name" );
|
||||||
auto valueAttr = get_opt( attributes, "Value" );
|
auto valueAttr = get_opt( attributes, "Value" );
|
||||||
|
|
||||||
|
@ -1265,15 +1330,18 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||||
if( attr.value.IsEmpty() )
|
if( attr.value.IsEmpty() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SCH_FIELD* text =
|
SCH_FIELD* text = schSym->FindField( attrKey, true );
|
||||||
new SCH_FIELD( schSym.get(), schSym->GetFieldCount(), attrKey );
|
|
||||||
|
if( !text )
|
||||||
|
{
|
||||||
|
text = schSym->AddField(
|
||||||
|
SCH_FIELD( schSym.get(), schSym->GetFieldCount(), attrKey ) );
|
||||||
|
}
|
||||||
|
|
||||||
text->SetPosition( schSym->GetPosition() );
|
text->SetPosition( schSym->GetPosition() );
|
||||||
|
|
||||||
ApplyAttrToField( fontStyles, text, attr, false, true, compAttrs,
|
ApplyAttrToField( fontStyles, text, attr, false, true, compAttrs,
|
||||||
schSym.get() );
|
schSym.get() );
|
||||||
|
|
||||||
schSym->AddField( *text );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
||||||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -101,7 +101,8 @@ public:
|
||||||
|
|
||||||
double SizeToKi( wxString units );
|
double SizeToKi( wxString units );
|
||||||
|
|
||||||
EASYEDAPRO::SYM_INFO ParseSymbol( const std::vector<nlohmann::json>& aLines );
|
EASYEDAPRO::SYM_INFO ParseSymbol( const std::vector<nlohmann::json>& aLines,
|
||||||
|
const std::map<wxString, wxString>& aDeviceAttributes );
|
||||||
|
|
||||||
void ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet,
|
void ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet,
|
||||||
const nlohmann::json& aProject,
|
const nlohmann::json& aProject,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
* Copyright (C) 2023 Alex Shvartzkop <dudesuchamazing@gmail.com>
|
||||||
|
@ -156,7 +156,11 @@ static LIB_SYMBOL* loadSymbol( nlohmann::json project, const wxString& aLibraryP
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
wxString prjSymUuid = prjSymIt->first;
|
wxString prjSymUuid = prjSymIt->first;
|
||||||
wxString fpTitle;
|
|
||||||
|
wxString description;
|
||||||
|
wxString customTags;
|
||||||
|
std::map<wxString, wxString> deviceAttributes;
|
||||||
|
wxString fpTitle;
|
||||||
|
|
||||||
for( auto& [key, device] : prjDevices )
|
for( auto& [key, device] : prjDevices )
|
||||||
{
|
{
|
||||||
|
@ -164,6 +168,12 @@ static LIB_SYMBOL* loadSymbol( nlohmann::json project, const wxString& aLibraryP
|
||||||
|
|
||||||
if( val && *val == prjSymUuid )
|
if( val && *val == prjSymUuid )
|
||||||
{
|
{
|
||||||
|
description = device.description;
|
||||||
|
deviceAttributes = device.attributes;
|
||||||
|
|
||||||
|
if( device.custom_tags.is_string() )
|
||||||
|
customTags = device.custom_tags.get<wxString>();
|
||||||
|
|
||||||
if( auto fpUuid = get_opt( device.attributes, "Footprint" ) )
|
if( auto fpUuid = get_opt( device.attributes, "Footprint" ) )
|
||||||
{
|
{
|
||||||
if( auto prjFp = get_opt( prjFootprints, *fpUuid ) )
|
if( auto prjFp = get_opt( prjFootprints, *fpUuid ) )
|
||||||
|
@ -192,7 +202,7 @@ static LIB_SYMBOL* loadSymbol( nlohmann::json project, const wxString& aLibraryP
|
||||||
lines.emplace_back( js );
|
lines.emplace_back( js );
|
||||||
}
|
}
|
||||||
|
|
||||||
EASYEDAPRO::SYM_INFO symInfo = parser.ParseSymbol( lines );
|
EASYEDAPRO::SYM_INFO symInfo = parser.ParseSymbol( lines, deviceAttributes );
|
||||||
|
|
||||||
if( !symInfo.libSymbol )
|
if( !symInfo.libSymbol )
|
||||||
EASY_IT_CONTINUE;
|
EASY_IT_CONTINUE;
|
||||||
|
@ -202,6 +212,15 @@ static LIB_SYMBOL* loadSymbol( nlohmann::json project, const wxString& aLibraryP
|
||||||
symInfo.libSymbol->SetName( aAliasName );
|
symInfo.libSymbol->SetName( aAliasName );
|
||||||
symInfo.libSymbol->GetFootprintField().SetText( symLibName + wxS( ":" ) + fpTitle );
|
symInfo.libSymbol->GetFootprintField().SetText( symLibName + wxS( ":" ) + fpTitle );
|
||||||
|
|
||||||
|
wxString keywords = customTags;
|
||||||
|
keywords.Replace( wxS( ":" ), wxS( " " ), true );
|
||||||
|
|
||||||
|
symInfo.libSymbol->SetKeyWords( keywords );
|
||||||
|
|
||||||
|
description.Replace( wxS( "\u2103" ), wxS( "\u00B0C" ), true ); // ℃ -> °C
|
||||||
|
|
||||||
|
symInfo.libSymbol->SetDescription( description );
|
||||||
|
|
||||||
symbol = symInfo.libSymbol.release();
|
symbol = symInfo.libSymbol.release();
|
||||||
|
|
||||||
EASY_IT_BREAK;
|
EASY_IT_BREAK;
|
||||||
|
@ -314,13 +333,10 @@ void SCH_IO_EASYEDAPRO::LoadAllDataFromProject( const wxString& aProjectPath )
|
||||||
|
|
||||||
if( name.EndsWith( wxS( ".esym" ) ) )
|
if( name.EndsWith( wxS( ".esym" ) ) )
|
||||||
{
|
{
|
||||||
EASYEDAPRO::PRJ_SYMBOL symData = prjSymbols.at( baseName );
|
wxString description;
|
||||||
EASYEDAPRO::SYM_INFO symInfo = parser.ParseSymbol( lines );
|
wxString customTags;
|
||||||
|
std::map<wxString, wxString> deviceAttributes;
|
||||||
if( !symInfo.libSymbol )
|
wxString fpTitle;
|
||||||
EASY_IT_CONTINUE;
|
|
||||||
|
|
||||||
wxString fpTitle;
|
|
||||||
|
|
||||||
for( auto& [key, device] : prjDevices )
|
for( auto& [key, device] : prjDevices )
|
||||||
{
|
{
|
||||||
|
@ -328,6 +344,12 @@ void SCH_IO_EASYEDAPRO::LoadAllDataFromProject( const wxString& aProjectPath )
|
||||||
|
|
||||||
if( val && *val == baseName )
|
if( val && *val == baseName )
|
||||||
{
|
{
|
||||||
|
description = device.description;
|
||||||
|
deviceAttributes = device.attributes;
|
||||||
|
|
||||||
|
if( device.custom_tags.is_string() )
|
||||||
|
customTags = device.custom_tags.get<wxString>();
|
||||||
|
|
||||||
if( auto fpUuid = get_opt( device.attributes, "Footprint" ) )
|
if( auto fpUuid = get_opt( device.attributes, "Footprint" ) )
|
||||||
{
|
{
|
||||||
if( auto prjFp = get_opt( prjFootprints, *fpUuid ) )
|
if( auto prjFp = get_opt( prjFootprints, *fpUuid ) )
|
||||||
|
@ -339,11 +361,26 @@ void SCH_IO_EASYEDAPRO::LoadAllDataFromProject( const wxString& aProjectPath )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EASYEDAPRO::PRJ_SYMBOL symData = prjSymbols.at( baseName );
|
||||||
|
EASYEDAPRO::SYM_INFO symInfo = parser.ParseSymbol( lines, deviceAttributes );
|
||||||
|
|
||||||
|
if( !symInfo.libSymbol )
|
||||||
|
EASY_IT_CONTINUE;
|
||||||
|
|
||||||
LIB_ID libID = EASYEDAPRO::ToKiCadLibID( symLibName, symData.title );
|
LIB_ID libID = EASYEDAPRO::ToKiCadLibID( symLibName, symData.title );
|
||||||
symInfo.libSymbol->SetLibId( libID );
|
symInfo.libSymbol->SetLibId( libID );
|
||||||
symInfo.libSymbol->SetName( symData.title );
|
symInfo.libSymbol->SetName( symData.title );
|
||||||
symInfo.libSymbol->GetFootprintField().SetText( symLibName + wxS( ":" ) + fpTitle );
|
symInfo.libSymbol->GetFootprintField().SetText( symLibName + wxS( ":" ) + fpTitle );
|
||||||
|
|
||||||
|
wxString keywords = customTags;
|
||||||
|
keywords.Replace( wxS( ":" ), wxS( " " ), true );
|
||||||
|
|
||||||
|
symInfo.libSymbol->SetKeyWords( keywords );
|
||||||
|
|
||||||
|
description.Replace( wxS( "\u2103" ), wxS( "\u00B0C" ), true ); // ℃ -> °C
|
||||||
|
|
||||||
|
symInfo.libSymbol->SetDescription( description );
|
||||||
|
|
||||||
m_projectData->m_Symbols.emplace( baseName, std::move( symInfo ) );
|
m_projectData->m_Symbols.emplace( baseName, std::move( symInfo ) );
|
||||||
}
|
}
|
||||||
else if( name.EndsWith( wxS( ".eblob" ) ) )
|
else if( name.EndsWith( wxS( ".eblob" ) ) )
|
||||||
|
|
Loading…
Reference in New Issue