Naming conventions.

This commit is contained in:
Jeff Young 2021-07-05 10:51:15 +01:00
parent a92d337905
commit 26df39e71a
2 changed files with 159 additions and 213 deletions

View File

@ -41,7 +41,6 @@
#include <lib_rectangle.h>
#include <lib_text.h>
#include <bus_alias.h>
#include <sch_bitmap.h>
#include <sch_bus_entry.h>
#include <sch_symbol.h>
@ -489,17 +488,17 @@ void SCH_ALTIUM_PLUGIN::ParseFileHeader( const CFB::CompoundFileReader& aReader
THROW_IO_ERROR( "stream is not fully parsed" );
// assign LIB_SYMBOL -> COMPONENT
for( auto component : m_components )
for( std::pair<const int, SCH_SYMBOL*>& symbol : m_symbols )
{
auto ksymbol = m_symbols.find( component.first );
auto libSymbolIt = m_libSymbols.find( symbol.first );
if( ksymbol == m_symbols.end() )
THROW_IO_ERROR( "every component should have a symbol attached" );
if( libSymbolIt == m_libSymbols.end() )
THROW_IO_ERROR( "every symbol should have a symbol attached" );
m_pi->SaveSymbol( getLibFileName().GetFullPath(), new LIB_SYMBOL( *( ksymbol->second ) ),
m_properties.get() );
m_pi->SaveSymbol( getLibFileName().GetFullPath(),
new LIB_SYMBOL( *( libSymbolIt->second ) ), m_properties.get() );
component.second->SetLibSymbol( ksymbol->second );
symbol.second->SetLibSymbol( libSymbolIt->second );
}
// Handle title blocks
@ -512,8 +511,8 @@ void SCH_ALTIUM_PLUGIN::ParseFileHeader( const CFB::CompoundFileReader& aReader
m_altiumPortsCurrentSheet.clear();
m_components.clear();
m_symbols.clear();
m_libSymbols.clear();
// Otherwise we cannot save the imported sheet?
m_currentSheet->SetModified();
@ -538,14 +537,10 @@ const ASCH_STORAGE_FILE* SCH_ALTIUM_PLUGIN::GetFileFromStorage( const wxString&
for( const ASCH_STORAGE_FILE& file : m_altiumStorage )
{
if( file.filename.IsSameAs( aFilename ) )
{
return &file;
}
if( file.filename.EndsWith( aFilename ) )
{
nonExactMatch = &file;
}
}
return nonExactMatch;
@ -569,7 +564,7 @@ void SCH_ALTIUM_PLUGIN::ParseComponent( int aIndex,
ksymbol->SetName( name );
ksymbol->SetDescription( elem.componentdescription );
ksymbol->SetLibId( libId );
m_symbols.insert( { aIndex, ksymbol } );
m_libSymbols.insert( { aIndex, ksymbol } );
// each component has its own symbol for now
SCH_SYMBOL* symbol = new SCH_SYMBOL();
@ -583,7 +578,7 @@ void SCH_ALTIUM_PLUGIN::ParseComponent( int aIndex,
m_currentSheet->GetScreen()->Append( symbol );
m_components.insert( { aIndex, symbol } );
m_symbols.insert( { aIndex, symbol } );
}
@ -591,9 +586,9 @@ void SCH_ALTIUM_PLUGIN::ParsePin( const std::map<wxString, wxString>& aPropertie
{
ASCH_PIN elem( aProperties );
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Pin has non-existent ownerindex %d." ),
@ -605,10 +600,9 @@ void SCH_ALTIUM_PLUGIN::ParsePin( const std::map<wxString, wxString>& aPropertie
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
LIB_PIN* pin = new LIB_PIN( symbol->second );
symbol->second->AddDrawItem( pin );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_PIN* pin = new LIB_PIN( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( pin );
pin->SetUnit( elem.ownerpartid );
@ -648,9 +642,9 @@ void SCH_ALTIUM_PLUGIN::ParsePin( const std::map<wxString, wxString>& aPropertie
}
// TODO: position can be sometimes off a little bit!
pin->SetPosition( GetRelativePosition( pinLocation + m_sheetOffset, component ) );
pin->SetPosition( GetRelativePosition( pinLocation + m_sheetOffset, symbol ) );
// TODO: the following fix is even worse for now?
// pin->SetPosition( GetRelativePosition( elem.kicadLocation, component ) );
// pin->SetPosition( GetRelativePosition( elem.kicadLocation, symbol ) );
switch( elem.electrical )
{
@ -806,9 +800,9 @@ void SCH_ALTIUM_PLUGIN::ParseLabel( const std::map<wxString, wxString>& aPropert
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Label has non-existent ownerindex %d." ),
@ -817,14 +811,13 @@ void SCH_ALTIUM_PLUGIN::ParseLabel( const std::map<wxString, wxString>& aPropert
return;
}
const auto& component = m_components.at( symbol->first );
LIB_TEXT* text = new LIB_TEXT( symbol->second );
symbol->second->AddDrawItem( text );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_TEXT* text = new LIB_TEXT( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( text );
text->SetUnit( elem.ownerpartid );
text->SetPosition( GetRelativePosition( elem.location + m_sheetOffset, component ) );
text->SetPosition( GetRelativePosition( elem.location + m_sheetOffset, symbol ) );
text->SetText( elem.text );
SetEdaTextJustification( text, elem.justification );
@ -876,10 +869,9 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map<wxString, wxString>& aProper
// simulate bezier using line segments
std::vector<wxPoint> bezierPoints;
std::vector<wxPoint> polyPoints;
for( size_t j = i; j < elem.points.size() && j < i + 4; j++ )
{
bezierPoints.push_back( elem.points.at( j ) + m_sheetOffset );
}
BEZIER_POLY converter( bezierPoints );
converter.GetPoly( polyPoints );
@ -900,9 +892,9 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map<wxString, wxString>& aProper
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Bezier has non-existent ownerindex %d." ),
@ -914,22 +906,22 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map<wxString, wxString>& aProper
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
for( size_t i = 0; i + 1 < elem.points.size(); i += 3 )
{
if( i + 2 == elem.points.size() )
{
// special case: single line
LIB_POLYLINE* line = new LIB_POLYLINE( symbol->second );
symbol->second->AddDrawItem( line );
LIB_POLYLINE* line = new LIB_POLYLINE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( line );
line->SetUnit( elem.ownerpartid );
for( size_t j = i; j < elem.points.size() && j < i + 2; j++ )
{
line->AddPoint( GetRelativePosition( elem.points.at( j ) + m_sheetOffset,
component ) );
symbol ) );
}
line->SetWidth( elem.lineWidth );
@ -937,15 +929,15 @@ void SCH_ALTIUM_PLUGIN::ParseBezier( const std::map<wxString, wxString>& aProper
else
{
// bezier always has maximum of 4 control points
LIB_BEZIER* bezier = new LIB_BEZIER( symbol->second );
symbol->second->AddDrawItem( bezier );
LIB_BEZIER* bezier = new LIB_BEZIER( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( bezier );
bezier->SetUnit( elem.ownerpartid );
for( size_t j = i; j < elem.points.size() && j < i + 4; j++ )
{
bezier->AddPoint( GetRelativePosition( elem.points.at( j ) + m_sheetOffset,
component ) );
symbol ) );
}
bezier->SetWidth( elem.lineWidth );
@ -986,8 +978,9 @@ void SCH_ALTIUM_PLUGIN::ParsePolyline( const std::map<wxString, wxString>& aProp
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Polyline has non-existent ownerindex %d." ),
@ -999,16 +992,15 @@ void SCH_ALTIUM_PLUGIN::ParsePolyline( const std::map<wxString, wxString>& aProp
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
LIB_POLYLINE* line = new LIB_POLYLINE( symbol->second );
symbol->second->AddDrawItem( line );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_POLYLINE* line = new LIB_POLYLINE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( line );
line->SetUnit( elem.ownerpartid );
for( wxPoint& point : elem.points )
{
line->AddPoint( GetRelativePosition( point + m_sheetOffset, component ) );
line->AddPoint( GetRelativePosition( point + m_sheetOffset, symbol ) );
}
line->SetWidth( elem.lineWidth );
@ -1025,8 +1017,8 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map<wxString, wxString>& aPrope
// TODO: we cannot fill this polygon, only draw it for now
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 );
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 );
@ -1036,8 +1028,8 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map<wxString, wxString>& aPrope
}
// close polygon
SCH_LINE* line =
new SCH_LINE( elem.points.front() + m_sheetOffset, SCH_LAYER_ID::LAYER_NOTES );
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 );
@ -1047,9 +1039,9 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map<wxString, wxString>& aPrope
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Polygon has non-existent ownerindex %d." ),
@ -1061,17 +1053,16 @@ void SCH_ALTIUM_PLUGIN::ParsePolygon( const std::map<wxString, wxString>& aPrope
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
LIB_POLYLINE* line = new LIB_POLYLINE( symbol->second );
symbol->second->AddDrawItem( line );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_POLYLINE* line = new LIB_POLYLINE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( line );
line->SetUnit( elem.ownerpartid );
for( wxPoint& point : elem.points )
line->AddPoint( GetRelativePosition( point + m_sheetOffset, component ) );
line->AddPoint( GetRelativePosition( point + m_sheetOffset, symbol ) );
line->AddPoint( GetRelativePosition( elem.points.front() + m_sheetOffset, component ) );
line->AddPoint( GetRelativePosition( elem.points.front() + m_sheetOffset, symbol ) );
line->SetWidth( elem.lineWidth );
@ -1129,9 +1120,9 @@ void SCH_ALTIUM_PLUGIN::ParseRoundRectangle( const std::map<wxString, wxString>&
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Rounded rectangle has non-existent "
@ -1144,16 +1135,15 @@ void SCH_ALTIUM_PLUGIN::ParseRoundRectangle( const std::map<wxString, wxString>&
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
// TODO: misses rounded edges
LIB_RECTANGLE* rect = new LIB_RECTANGLE( symbol->second );
symbol->second->AddDrawItem( rect );
LIB_RECTANGLE* rect = new LIB_RECTANGLE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( rect );
rect->SetUnit( elem.ownerpartid );
rect->SetPosition( GetRelativePosition( elem.topRight + m_sheetOffset, component ) );
rect->SetEnd( GetRelativePosition( elem.bottomLeft + m_sheetOffset, component ) );
rect->SetPosition( GetRelativePosition( elem.topRight + m_sheetOffset, symbol ) );
rect->SetEnd( GetRelativePosition( elem.bottomLeft + m_sheetOffset, symbol ) );
rect->SetWidth( elem.lineWidth );
if( !elem.isSolid )
@ -1177,8 +1167,8 @@ void SCH_ALTIUM_PLUGIN::ParseArc( const std::map<wxString, wxString>& aPropertie
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Arc has non-existent ownerindex %d." ),
@ -1190,28 +1180,28 @@ void SCH_ALTIUM_PLUGIN::ParseArc( const std::map<wxString, wxString>& aPropertie
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
if( elem.startAngle == 0 && ( elem.endAngle == 0 || elem.endAngle == 360 ) )
{
LIB_CIRCLE* circle = new LIB_CIRCLE( symbol->second );
symbol->second->AddDrawItem( circle );
LIB_CIRCLE* circle = new LIB_CIRCLE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( circle );
circle->SetUnit( elem.ownerpartid );
circle->SetPosition( GetRelativePosition( elem.center + m_sheetOffset, component ) );
circle->SetPosition( GetRelativePosition( elem.center + m_sheetOffset, symbol ) );
circle->SetRadius( elem.radius );
circle->SetWidth( elem.lineWidth );
}
else
{
LIB_ARC* arc = new LIB_ARC( symbol->second );
symbol->second->AddDrawItem( arc );
LIB_ARC* arc = new LIB_ARC( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( arc );
arc->SetUnit( elem.ownerpartid );
// TODO: correct?
arc->SetPosition( GetRelativePosition( elem.center + m_sheetOffset, component ) );
arc->SetPosition( GetRelativePosition( elem.center + m_sheetOffset, symbol ) );
arc->SetRadius( elem.radius );
arc->SetFirstRadiusAngle( elem.startAngle * 10. );
arc->SetSecondRadiusAngle( elem.endAngle * 10. );
@ -1237,9 +1227,9 @@ void SCH_ALTIUM_PLUGIN::ParseLine( const std::map<wxString, wxString>& aProperti
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Line has non-existent ownerindex %d." ),
@ -1251,15 +1241,14 @@ void SCH_ALTIUM_PLUGIN::ParseLine( const std::map<wxString, wxString>& aProperti
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
LIB_POLYLINE* line = new LIB_POLYLINE( symbol->second );
symbol->second->AddDrawItem( line );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_POLYLINE* line = new LIB_POLYLINE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( line );
line->SetUnit( elem.ownerpartid );
line->AddPoint( GetRelativePosition( elem.point1 + m_sheetOffset, component ) );
line->AddPoint( GetRelativePosition( elem.point2 + m_sheetOffset, component ) );
line->AddPoint( GetRelativePosition( elem.point1 + m_sheetOffset, symbol ) );
line->AddPoint( GetRelativePosition( elem.point2 + m_sheetOffset, symbol ) );
line->SetWidth( elem.lineWidth );
}
@ -1309,9 +1298,9 @@ void SCH_ALTIUM_PLUGIN::ParseRectangle( const std::map<wxString, wxString>& aPro
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Rectangle has non-existent ownerindex %d." ),
@ -1323,15 +1312,14 @@ void SCH_ALTIUM_PLUGIN::ParseRectangle( const std::map<wxString, wxString>& aPro
if( !IsComponentPartVisible( elem.ownerindex, elem.ownerpartdisplaymode ) )
return;
const auto& component = m_components.at( symbol->first );
LIB_RECTANGLE* rect = new LIB_RECTANGLE( symbol->second );
symbol->second->AddDrawItem( rect );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
LIB_RECTANGLE* rect = new LIB_RECTANGLE( libSymbolIt->second );
libSymbolIt->second->AddDrawItem( rect );
rect->SetUnit( elem.ownerpartid );
rect->SetPosition( GetRelativePosition( sheetTopRight, component ) );
rect->SetEnd( GetRelativePosition( sheetBottomLeft, component ) );
rect->SetPosition( GetRelativePosition( sheetTopRight, symbol ) );
rect->SetEnd( GetRelativePosition( sheetBottomLeft, symbol ) );
rect->SetWidth( elem.lineWidth );
if( !elem.isSolid )
@ -1344,8 +1332,8 @@ void SCH_ALTIUM_PLUGIN::ParseRectangle( const std::map<wxString, wxString>& aPro
}
void SCH_ALTIUM_PLUGIN::ParseSheetSymbol(
int aIndex, const std::map<wxString, wxString>& aProperties )
void SCH_ALTIUM_PLUGIN::ParseSheetSymbol( int aIndex, const std::map<wxString,
wxString>& aProperties )
{
ASCH_SHEET_SYMBOL elem( aProperties );
@ -1643,33 +1631,31 @@ wxPoint HelperGeneratePowerPortGraphics( LIB_SYMBOL* aKsymbol, ASCH_POWER_PORT_S
void SCH_ALTIUM_PLUGIN::ParsePowerPort( const std::map<wxString, wxString>& aProperties )
{
ASCH_POWER_PORT elem( aProperties );
LIB_ID libId = AltiumToKiCadLibID( getLibName(), elem.text );
LIB_SYMBOL* libSymbol = nullptr;
LIB_ID libId = AltiumToKiCadLibID( getLibName(), elem.text );
const auto& powerSymbolIt = m_powerSymbols.find( elem.text );
LIB_SYMBOL* ksymbol = nullptr;
const auto& symbol = m_powerSymbols.find( elem.text );
if( symbol != m_powerSymbols.end() )
if( powerSymbolIt != m_powerSymbols.end() )
{
ksymbol = symbol->second; // cache hit
libSymbol = powerSymbolIt->second; // cache hit
}
else
{
ksymbol = new LIB_SYMBOL( wxEmptyString );
ksymbol->SetPower();
ksymbol->SetName( elem.text );
ksymbol->GetReferenceField().SetText( "#PWR" );
ksymbol->GetValueField().SetText( elem.text );
ksymbol->GetValueField().SetVisible( true ); // TODO: why does this not work?
ksymbol->SetDescription(
wxString::Format( _( "Power symbol creates a global label with name '%s'" ),
elem.text ) );
ksymbol->SetKeyWords( "power-flag" );
ksymbol->SetLibId( libId );
libSymbol = new LIB_SYMBOL( wxEmptyString );
libSymbol->SetPower();
libSymbol->SetName( elem.text );
libSymbol->GetReferenceField().SetText( "#PWR" );
libSymbol->GetValueField().SetText( elem.text );
libSymbol->GetValueField().SetVisible( true ); // TODO: why does this not work?
libSymbol->SetDescription( wxString::Format( _( "Power powerSymbolIt creates a global "
"label with name '%s'" ), elem.text ) );
libSymbol->SetKeyWords( "power-flag" );
libSymbol->SetLibId( libId );
// generate graphic
LIB_PIN* pin = new LIB_PIN( ksymbol );
ksymbol->AddDrawItem( pin );
LIB_PIN* pin = new LIB_PIN( libSymbol );
libSymbol->AddDrawItem( pin );
pin->SetName( elem.text );
pin->SetPosition( { 0, 0 } );
@ -1679,52 +1665,52 @@ void SCH_ALTIUM_PLUGIN::ParsePowerPort( const std::map<wxString, wxString>& aPro
pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
pin->SetVisible( false );
wxPoint valueFieldPos = HelperGeneratePowerPortGraphics( ksymbol, elem.style, m_reporter );
wxPoint valueFieldPos = HelperGeneratePowerPortGraphics( libSymbol, elem.style, m_reporter );
ksymbol->GetValueField().SetPosition( valueFieldPos );
libSymbol->GetValueField().SetPosition( valueFieldPos );
// this has to be done after parsing the LIB_SYMBOL!
m_pi->SaveSymbol( getLibFileName().GetFullPath(), ksymbol, m_properties.get() );
m_powerSymbols.insert( { elem.text, ksymbol } );
m_pi->SaveSymbol( getLibFileName().GetFullPath(), libSymbol, m_properties.get() );
m_powerSymbols.insert( { elem.text, libSymbol } );
}
SCH_SHEET_PATH sheetpath;
m_rootSheet->LocatePathOfScreen( m_currentSheet->GetScreen(), &sheetpath );
// each component has its own symbol for now
SCH_SYMBOL* component = new SCH_SYMBOL();
component->SetRef( &sheetpath, "#PWR?" );
component->SetValue( elem.text );
component->SetLibId( libId );
component->SetLibSymbol( new LIB_SYMBOL( *ksymbol ) );
// each symbol has its own powerSymbolIt for now
SCH_SYMBOL* symbol = new SCH_SYMBOL();
symbol->SetRef( &sheetpath, "#PWR?" );
symbol->SetValue( elem.text );
symbol->SetLibId( libId );
symbol->SetLibSymbol( new LIB_SYMBOL( *libSymbol ) );
SCH_FIELD* valueField = component->GetField( VALUE_FIELD );
SCH_FIELD* valueField = symbol->GetField( VALUE_FIELD );
// TODO: Why do I need to set those a second time?
valueField->SetVisible( true );
valueField->SetPosition( ksymbol->GetValueField().GetPosition() );
valueField->SetPosition( libSymbol->GetValueField().GetPosition() );
component->SetPosition( elem.location + m_sheetOffset );
symbol->SetPosition( elem.location + m_sheetOffset );
switch( elem.orientation )
{
case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
component->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_90 );
symbol->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_90 );
valueField->SetTextAngle( -900. );
valueField->SetHorizJustify( EDA_TEXT_HJUSTIFY_T::GR_TEXT_HJUSTIFY_LEFT );
break;
case ASCH_RECORD_ORIENTATION::UPWARDS:
component->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_180 );
symbol->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_180 );
valueField->SetTextAngle( -1800. );
valueField->SetHorizJustify( EDA_TEXT_HJUSTIFY_T::GR_TEXT_HJUSTIFY_CENTER );
break;
case ASCH_RECORD_ORIENTATION::LEFTWARDS:
component->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_270 );
symbol->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_270 );
valueField->SetTextAngle( -2700. );
valueField->SetHorizJustify( EDA_TEXT_HJUSTIFY_T::GR_TEXT_HJUSTIFY_RIGHT );
break;
case ASCH_RECORD_ORIENTATION::DOWNWARDS:
component->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_0 );
symbol->SetOrientation( SYMBOL_ORIENTATION_T::SYM_ORIENT_0 );
valueField->SetTextAngle( 0. );
valueField->SetHorizJustify( EDA_TEXT_HJUSTIFY_T::GR_TEXT_HJUSTIFY_CENTER );
break;
@ -1733,7 +1719,7 @@ void SCH_ALTIUM_PLUGIN::ParsePowerPort( const std::map<wxString, wxString>& aPro
break;
}
m_currentSheet->GetScreen()->Append( component );
m_currentSheet->GetScreen()->Append( symbol );
}
@ -2006,63 +1992,28 @@ void SCH_ALTIUM_PLUGIN::ParseSheet( const std::map<wxString, wxString>& aPropert
PAGE_INFO pageInfo;
bool isPortrait = m_altiumSheet->sheetOrientation == ASCH_SHEET_WORKSPACEORIENTATION::PORTRAIT;
switch( m_altiumSheet->sheetSize )
{
default:
case ASCH_SHEET_SIZE::A4:
pageInfo.SetType( "A4", isPortrait );
break;
case ASCH_SHEET_SIZE::A3:
pageInfo.SetType( "A3", isPortrait );
break;
case ASCH_SHEET_SIZE::A2:
pageInfo.SetType( "A2", isPortrait );
break;
case ASCH_SHEET_SIZE::A1:
pageInfo.SetType( "A1", isPortrait );
break;
case ASCH_SHEET_SIZE::A0:
pageInfo.SetType( "A0", isPortrait );
break;
case ASCH_SHEET_SIZE::A:
pageInfo.SetType( "A", isPortrait );
break;
case ASCH_SHEET_SIZE::B:
pageInfo.SetType( "B", isPortrait );
break;
case ASCH_SHEET_SIZE::C:
pageInfo.SetType( "C", isPortrait );
break;
case ASCH_SHEET_SIZE::D:
pageInfo.SetType( "D", isPortrait );
break;
case ASCH_SHEET_SIZE::E:
pageInfo.SetType( "E", isPortrait );
break;
case ASCH_SHEET_SIZE::LETTER:
pageInfo.SetType( "USLetter", isPortrait );
break;
case ASCH_SHEET_SIZE::LEGAL:
pageInfo.SetType( "USLegal", isPortrait );
break;
case ASCH_SHEET_SIZE::TABLOID:
pageInfo.SetType( "A3", isPortrait ); // TODO: use User
break;
case ASCH_SHEET_SIZE::ORCAD_A:
pageInfo.SetType( "A", isPortrait );
break;
case ASCH_SHEET_SIZE::ORCAD_B:
pageInfo.SetType( "B", isPortrait );
break;
case ASCH_SHEET_SIZE::ORCAD_C:
pageInfo.SetType( "C", isPortrait );
break;
case ASCH_SHEET_SIZE::ORCAD_D:
pageInfo.SetType( "D", isPortrait );
break;
case ASCH_SHEET_SIZE::ORCAD_E:
pageInfo.SetType( "E", isPortrait );
break;
case ASCH_SHEET_SIZE::A4: pageInfo.SetType( "A4", isPortrait ); break;
case ASCH_SHEET_SIZE::A3: pageInfo.SetType( "A3", isPortrait ); break;
case ASCH_SHEET_SIZE::A2: pageInfo.SetType( "A2", isPortrait ); break;
case ASCH_SHEET_SIZE::A1: pageInfo.SetType( "A1", isPortrait ); break;
case ASCH_SHEET_SIZE::A0: pageInfo.SetType( "A0", isPortrait ); break;
case ASCH_SHEET_SIZE::A: pageInfo.SetType( "A", isPortrait ); break;
case ASCH_SHEET_SIZE::B: pageInfo.SetType( "B", isPortrait ); break;
case ASCH_SHEET_SIZE::C: pageInfo.SetType( "C", isPortrait ); break;
case ASCH_SHEET_SIZE::D: pageInfo.SetType( "D", isPortrait ); break;
case ASCH_SHEET_SIZE::E: pageInfo.SetType( "E", isPortrait ); break;
case ASCH_SHEET_SIZE::LETTER: pageInfo.SetType( "USLetter", isPortrait ); break;
case ASCH_SHEET_SIZE::LEGAL: pageInfo.SetType( "USLegal", isPortrait ); break;
case ASCH_SHEET_SIZE::TABLOID: pageInfo.SetType( "A3", isPortrait ); break;
case ASCH_SHEET_SIZE::ORCAD_A: pageInfo.SetType( "A", isPortrait ); break;
case ASCH_SHEET_SIZE::ORCAD_B: pageInfo.SetType( "B", isPortrait ); break;
case ASCH_SHEET_SIZE::ORCAD_C: pageInfo.SetType( "C", isPortrait ); break;
case ASCH_SHEET_SIZE::ORCAD_D: pageInfo.SetType( "D", isPortrait ); break;
case ASCH_SHEET_SIZE::ORCAD_E: pageInfo.SetType( "E", isPortrait ); break;
}
m_currentSheet->GetScreen()->SetPageSettings( pageInfo );
@ -2076,18 +2027,10 @@ void SetFieldOrientation( SCH_FIELD& aField, ASCH_RECORD_ORIENTATION aOrientatio
switch( aOrientation )
{
default:
case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
aField.SetTextAngle( 0 );
break;
case ASCH_RECORD_ORIENTATION::UPWARDS:
aField.SetTextAngle( 900 );
break;
case ASCH_RECORD_ORIENTATION::LEFTWARDS:
aField.SetTextAngle( 1800 );
break;
case ASCH_RECORD_ORIENTATION::DOWNWARDS:
aField.SetTextAngle( 2700 );
break;
case ASCH_RECORD_ORIENTATION::RIGHTWARDS: aField.SetTextAngle( 0 ); break;
case ASCH_RECORD_ORIENTATION::UPWARDS: aField.SetTextAngle( 900 ); break;
case ASCH_RECORD_ORIENTATION::LEFTWARDS: aField.SetTextAngle( 1800 ); break;
case ASCH_RECORD_ORIENTATION::DOWNWARDS: aField.SetTextAngle( 2700 ); break;
}
}
@ -2132,7 +2075,8 @@ void SCH_ALTIUM_PLUGIN::ParseFileName( const std::map<wxString, wxString>& aProp
filenameField.SetPosition( elem.location + m_sheetOffset );
// If last symbols are ".sChDoC", change them to ".kicad_sch"
if( ( elem.text.Right( GetFileExtension().length() + 1 ).Lower() ) == ( "." + GetFileExtension().Lower() ))
if( ( elem.text.Right( GetFileExtension().length() + 1 ).Lower() )
== ( "." + GetFileExtension().Lower() ) )
{
elem.text.RemoveLast( GetFileExtension().length() );
elem.text += KiCadSchematicFileExtension;
@ -2153,8 +2097,9 @@ void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map<wxString, wxString>& aPr
{
ASCH_DESIGNATOR elem( aProperties );
const auto& symbol = m_symbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
m_reporter->Report( wxString::Format( _( "Designator has non-existent ownerindex %d." ),
@ -2163,14 +2108,13 @@ void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map<wxString, wxString>& aPr
return;
}
const auto& component = m_components.at( symbol->first );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
SCH_SHEET_PATH sheetpath;
m_rootSheet->LocatePathOfScreen( m_currentSheet->GetScreen(), &sheetpath );
component->SetRef( &sheetpath, elem.text );
symbol->SetRef( &sheetpath, elem.text );
SCH_FIELD* refField = component->GetField( REFERENCE_FIELD );
SCH_FIELD* refField = symbol->GetField( REFERENCE_FIELD );
refField->SetPosition( elem.location + m_sheetOffset );
refField->SetVisible( true );
@ -2230,29 +2174,31 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map<wxString, wxString>& aPro
}
else
{
const auto& symbol = m_symbols.find( elem.ownerindex );
if( symbol == m_symbols.end() )
const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex );
if( libSymbolIt == m_libSymbols.end() )
{
// TODO: e.g. can depend on Template (RECORD=39
return;
}
const auto& component = m_components.at( symbol->first );
SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first );
// TODO: location not correct?
const wxPoint position = elem.location + m_sheetOffset;
SCH_FIELD* field = nullptr;
if( elem.name == "Comment" )
{
field = component->GetField( VALUE_FIELD );
field = symbol->GetField( VALUE_FIELD );
field->SetPosition( position );
}
else
{
int fieldIdx = component->GetFieldCount();
int fieldIdx = symbol->GetFieldCount();
wxString fieldName = elem.name.IsSameAs( "Value", false ) ? "Altium_Value" : elem.name;
field = component->AddField( { position, fieldIdx, component, fieldName } );
field = symbol->AddField( { position, fieldIdx, symbol, fieldName } );
}
wxString kicadText = AltiumSpecialStringsToKiCadVariables( elem.text, stringReplacement );

View File

@ -155,9 +155,9 @@ private:
wxPoint m_sheetOffset;
std::unique_ptr<ASCH_SHEET> m_altiumSheet;
std::map<int, SCH_SYMBOL*> m_components;
std::map<int, SCH_SYMBOL*> m_symbols;
std::map<int, SCH_SHEET*> m_sheets;
std::map<int, LIB_SYMBOL*> m_symbols; // every component has its unique symbol
std::map<int, LIB_SYMBOL*> m_libSymbols; // every symbol has its unique lib_symbol
std::map<wxString, LIB_SYMBOL*> m_powerSymbols;
std::vector<ASCH_STORAGE_FILE> m_altiumStorage;