Eeschema Eagle Import: Parse instance attributes for value and refererence positions and alignment.

This commit is contained in:
Russell Oliver 2017-07-17 02:12:05 +10:00 committed by Maciej Suminski
parent ef880f57a2
commit bb754b33d0
3 changed files with 132 additions and 116 deletions

View File

@ -192,6 +192,32 @@ wxPoint kicad_arc_center( const wxPoint& aStart, const wxPoint& aEnd, double aAn
return center;
}
int parseAlignment(wxString alignment)
{
// (bottom-left | bottom-center | bottom-right | center-left |
// center | center-right | top-left | top-center | top-right)
if( alignment == "center" )
return ETEXT::CENTER;
else if( alignment == "center-right" )
return ETEXT::CENTER_RIGHT;
else if( alignment == "top-left" )
return ETEXT::TOP_LEFT;
else if( alignment == "top-center" )
return ETEXT::TOP_CENTER;
else if( alignment == "top-right" )
return ETEXT::TOP_RIGHT;
else if( alignment == "bottom-left" )
return ETEXT::BOTTOM_LEFT;
else if( alignment == "bottom-center" )
return ETEXT::BOTTOM_CENTER;
else if( alignment == "bottom-right" )
return ETEXT::BOTTOM_RIGHT;
else if( alignment == "center-left" )
return ETEXT::CENTER_LEFT;
return ETEXT::BOTTOM_LEFT;
}
EWIRE::EWIRE( wxXmlNode* aWire )
{
@ -395,6 +421,12 @@ EATTR::EATTR( wxXmlNode* aTree )
display = EATTR::NAME;
else if( stemp == "both" )
display = EATTR::BOTH;
stemp = parseOptionalAttribute<string>( aTree, "align" );
align = parseAlignment(*stemp);
}
@ -459,26 +491,8 @@ ETEXT::ETEXT( wxXmlNode* aText )
opt_string stemp = parseOptionalAttribute<string>( aText, "align" );
// (bottom-left | bottom-center | bottom-right | center-left |
// center | center-right | top-left | top-center | top-right)
if( stemp == "center" )
align = ETEXT::CENTER;
else if( stemp == "center-right" )
align = ETEXT::CENTER_RIGHT;
else if( stemp == "top-left" )
align = ETEXT::TOP_LEFT;
else if( stemp == "top-center" )
align = ETEXT::TOP_CENTER;
else if( stemp == "top-right" )
align = ETEXT::TOP_RIGHT;
else if( stemp == "bottom-left" )
align = ETEXT::BOTTOM_LEFT;
else if( stemp == "bottom-center" )
align = ETEXT::BOTTOM_CENTER;
else if( stemp == "bottom-right" )
align = ETEXT::BOTTOM_RIGHT;
else if( stemp == "center-left" )
align = ETEXT::CENTER_LEFT;
align = parseAlignment(*stemp);
}
@ -744,7 +758,7 @@ EPART::EPART( wxXmlNode* aPart )
device = parseRequiredAttribute<string>( aPart, "device" );
technology = parseOptionalAttribute<string>( aPart, "technology" );
value = parseOptionalAttribute<string>( aPart, "value" );
}

View File

@ -184,6 +184,59 @@ static COMPONENT_ORIENTATION_T kicadComponentRotation( float eagleDegrees )
}
void eagleToKicadAlignment(EDA_TEXT* aText, int aEagleAlignment)
{
switch( aEagleAlignment )
{
case ETEXT::CENTER:
// this was the default in eda_text's constructor
break;
case ETEXT::CENTER_LEFT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
break;
case ETEXT::CENTER_RIGHT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
break;
case ETEXT::TOP_CENTER:
aText->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_LEFT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
aText->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_RIGHT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
aText->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::BOTTOM_CENTER:
aText->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_LEFT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
aText->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_RIGHT:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
aText->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
default:
aText->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
aText->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
}
}
SCH_EAGLE_PLUGIN::SCH_EAGLE_PLUGIN()
{
m_rootSheet = nullptr;
@ -668,10 +721,12 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n
if(labelled == false && wire != NULL )
{
wxString netname = netName;
netname.Replace("!", "~");
if(m_NetCounts[netName.ToStdString()]>1){
std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL );
glabel->SetPosition( wire->GetStartPoint() );
glabel->SetText( netName);
glabel->SetText( netname);
glabel->SetTextSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) );
screen->Append( glabel.release() );
}
@ -679,7 +734,7 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n
{
std::unique_ptr<SCH_LABEL> label( new SCH_LABEL );
label->SetPosition( wire->GetStartPoint() );
label->SetText( netName );
label->SetText( netname );
label->SetTextSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) );
screen->Append( label.release() );
}
@ -742,11 +797,14 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode, const wxString& aN
wxPoint elabelpos( elabel.x * EUNIT_TO_MIL, -elabel.y * EUNIT_TO_MIL );
wxString netname = elabel.netname;
netname.Replace("!", "~");
if(m_NetCounts[aNetName.ToStdString()]>1){
std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL );
glabel->SetPosition( elabelpos );
glabel->SetText( elabel.netname );
glabel->SetTextSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) );
glabel->SetText( netname );
glabel->SetTextSize( wxSize( elabel.size*EUNIT_TO_MIL, elabel.size*EUNIT_TO_MIL ) );
glabel->SetLabelSpinStyle(0);
if( elabel.rot )
@ -787,8 +845,8 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode, const wxString& aN
{
std::unique_ptr<SCH_LABEL> label( new SCH_LABEL );
label->SetPosition(elabelpos);
label->SetText( elabel.netname );
label->SetTextSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) );
label->SetText( netname );
label->SetTextSize( wxSize( elabel.size*EUNIT_TO_MIL, elabel.size*EUNIT_TO_MIL ) );
label->SetLabelSpinStyle(0);
if( elabel.rot )
@ -825,8 +883,6 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode, const wxString& aN
}
return label.release();
}
@ -942,6 +998,33 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
}
component->GetField( REFERENCE )->SetVisible( true );
wxXmlNode* attributeNode = aInstanceNode->GetChildren();
while(attributeNode)
{
if(attributeNode->GetName() == "attribute")
{
auto attr = EATTR(attributeNode);
SCH_FIELD* field;
if(attr.name == "NAME"){
field = component->GetField( REFERENCE );
field->SetPosition( wxPoint(*attr.x* EUNIT_TO_MIL, *attr.y*-EUNIT_TO_MIL) );
int align = attr.align ? *attr.align : ETEXT::BOTTOM_LEFT;
eagleToKicadAlignment((EDA_TEXT*)field, align);
}
else if (attr.name == "VALUE"){
field = component->GetField( VALUE );
field->SetPosition( wxPoint(*attr.x* EUNIT_TO_MIL, *attr.y*-EUNIT_TO_MIL) );
int align = attr.align ? *attr.align : ETEXT::BOTTOM_LEFT;
eagleToKicadAlignment((EDA_TEXT*)field, align);
}
}
attributeNode = attributeNode->GetNext();
}
component->ClearFlags();
screen->Append( component.release() );
@ -1332,8 +1415,8 @@ LIB_TEXT* SCH_EAGLE_PLUGIN::loadSymboltext( LIB_PART* aPart, wxXmlNode* aLibText
libtext->SetPosition( wxPoint( etext.x * EUNIT_TO_MIL, etext.y * EUNIT_TO_MIL ) );
libtext->SetText( aLibText->GetNodeContent() );
libtext->SetTextSize( wxSize( int(etext.size * EUNIT_TO_MIL),
int(etext.size * EUNIT_TO_MIL) ) );
libtext->SetTextSize( wxSize( int(etext.size * EUNIT_TO_MIL*0.95),
int(etext.size * EUNIT_TO_MIL*0.95) ) );
if( etext.ratio )
{
@ -1346,50 +1429,8 @@ LIB_TEXT* SCH_EAGLE_PLUGIN::loadSymboltext( LIB_PART* aPart, wxXmlNode* aLibText
int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT;
switch( align )
{
case ETEXT::CENTER:
// this was the default in eda_text's constructor
break;
eagleToKicadAlignment((EDA_TEXT*)libtext.get(), align);
case ETEXT::CENTER_LEFT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
break;
case ETEXT::CENTER_RIGHT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
break;
case ETEXT::TOP_CENTER:
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_LEFT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_RIGHT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::BOTTOM_CENTER:
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_LEFT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_RIGHT:
libtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
libtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
}
libtext->SetItalic( false );
return libtext.release();
}
@ -1420,48 +1461,7 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadplaintext( wxXmlNode* aSchText )
int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT;
switch( align )
{
case ETEXT::CENTER:
// this was the default in eda_text's constructor
break;
case ETEXT::CENTER_LEFT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
break;
case ETEXT::CENTER_RIGHT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
break;
case ETEXT::TOP_CENTER:
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_LEFT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::TOP_RIGHT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
break;
case ETEXT::BOTTOM_CENTER:
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_LEFT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
case ETEXT::BOTTOM_RIGHT:
schtext->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
schtext->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
break;
}
eagleToKicadAlignment((EDA_TEXT*)schtext.get(), align);
return schtext.release();
@ -1482,6 +1482,7 @@ bool SCH_EAGLE_PLUGIN::CheckHeader( const wxString& aFileName )
return firstline.StartsWith( "<?xml" );
}
void SCH_EAGLE_PLUGIN::addBusEntries()
{
// Add bus entry symbols

View File

@ -545,6 +545,7 @@ struct EATTR
BOTH,
};
opt_int display;
opt_int align;
EATTR( wxXmlNode* aTree );
EATTR() {}