CADSTAR PCB Archive Importer: Parse VARIANT data + add missing "REFPLANE" flag to layers

This commit is contained in:
Roberto Fernandez Bautista 2020-09-07 23:40:33 +01:00 committed by Seth Hillbrand
parent 349ac06ee2
commit 05e5740504
2 changed files with 73 additions and 11 deletions

View File

@ -585,6 +585,14 @@ void CADSTAR_PCB_ARCHIVE_PARSER::LAYER::Parse( XNODE* aNode )
{
Description = GetXmlAttributeIDString( cNode, 0 );
}
else if( cNodeName == wxT( "REFPLANE" ) )
{
ReferencePlane = true;
}
else if( cNodeName == wxT( "VLAYER" ) )
{
VariantLayer = true;
}
else if( cNodeName == wxT( "LASUBTYP" ) )
{
//Process subtype
@ -2771,6 +2779,11 @@ void CADSTAR_PCB_ARCHIVE_PARSER::COMPONENT::Parse( XNODE* aNode )
{
OrientAngle = GetXmlAttributeIDLong( cNode, 0 );
}
else if( cNodeName == wxT( "VCOMPMASTER" ) )
{
VariantParentComponentID = GetXmlAttributeIDString( aNode, 0 );
VariantID = GetXmlAttributeIDString( aNode, 1 );
}
else if( cNodeName == wxT( "TEXTLOC" ) )
{
TEXT_LOCATION textloc;
@ -3201,7 +3214,6 @@ void CADSTAR_PCB_ARCHIVE_PARSER::TEMPLATE::POURING::Parse( XNODE* aNode )
MinDisjointCopper = GetXmlAttributeIDLong( aNode, 8 );
XNODE* cNode = aNode->GetChildren();
bool fillTypeParsed = false;
for( ; cNode; cNode = cNode->GetNext() )
{
@ -3221,23 +3233,18 @@ void CADSTAR_PCB_ARCHIVE_PARSER::TEMPLATE::POURING::Parse( XNODE* aNode )
TargetForAutorouting = true;
else if( cNodeName == wxT( "THERMALCUTOUT" ) )
ReliefType = RELIEF_TYPE::CUTOUTS;
else if( !fillTypeParsed && cNodeName == wxT( "FILLED" ) )
else if( cNodeName == wxT( "FILLED" ) )
{
FillType = COPPER_FILL_TYPE::FILLED;
fillTypeParsed = true;
}
else if( !fillTypeParsed && cNodeName == wxT( "HATCHCODEREF" ) )
else if( cNodeName == wxT( "HATCHCODEREF" ) )
{
FillType = COPPER_FILL_TYPE::HATCHED;
HatchCodeID = GetXmlAttributeIDString( cNode, 0 );
fillTypeParsed = true;
}
else
THROW_UNKNOWN_NODE_IO_ERROR( cNodeName, wxT( "POURING" ) );
}
if( !fillTypeParsed )
THROW_MISSING_NODE_IO_ERROR( wxT( "FILLED" ), wxT( "POURING" ) );
}
@ -3492,6 +3499,26 @@ void CADSTAR_PCB_ARCHIVE_PARSER::DRILL_TABLE::Parse( XNODE* aNode )
}
void CADSTAR_PCB_ARCHIVE_PARSER::VARIANT::Parse( XNODE* aNode )
{
wxASSERT( aNode->GetName() == wxT( "VMASTER" ) || aNode->GetName() == wxT( "VARIANT" ) );
ID = GetXmlAttributeIDString( aNode, 0 );
if( aNode->GetName() == wxT( "VMASTER" ) )
{
Name = GetXmlAttributeIDString( aNode, 1 );
Description = GetXmlAttributeIDString( aNode, 2 );
}
else
{
ParentID = GetXmlAttributeIDString( aNode, 1 );
Name = GetXmlAttributeIDString( aNode, 2 );
Description = GetXmlAttributeIDString( aNode, 3 );
}
}
void CADSTAR_PCB_ARCHIVE_PARSER::LAYOUT::Parse( XNODE* aNode )
{
wxASSERT( aNode->GetName() == wxT( "LAYOUT" ) );
@ -3609,6 +3636,25 @@ void CADSTAR_PCB_ARCHIVE_PARSER::LAYOUT::Parse( XNODE* aNode )
drilltable.Parse( cNode );
DrillTables.insert( std::make_pair( drilltable.ID, drilltable ) );
}
else if( cNodeName == wxT( "VHIERARCHY" ) )
{
XNODE* subNode = cNode->GetChildren();
for( ; subNode; subNode = subNode->GetNext() )
{
if( subNode->GetName() == wxT( "VMASTER" )
|| subNode->GetName() == wxT( "VARIANT" ) )
{
VARIANT variant;
variant.Parse( subNode );
VariantHierarchy.insert( std::make_pair( variant.ID, variant ) );
}
else
{
THROW_UNKNOWN_NODE_IO_ERROR( subNode->GetName(), cNode->GetName() );
}
}
}
else if( cNodeName == wxT( "ERRORMARK" ) )
{
//ignore (this is a DRC error marker in cadstar)

View File

@ -104,6 +104,7 @@ public:
typedef wxString AREA_ID;
typedef wxString NET_ID;
typedef wxString COMPONENT_ID;
typedef wxString VARIANT_ID;
typedef wxString DOCUMENTATION_SYMBOL_ID;
typedef wxString NETELEMENT_ID;
typedef wxString TEMPLATE_ID;
@ -253,6 +254,8 @@ public:
long Thickness = 0; ///< Note: Units of length are defined in file header
MATERIAL_ID MaterialId;
EMBEDDING Embedding = EMBEDDING::NONE;
bool ReferencePlane = false;
bool VariantLayer = false;
void Parse( XNODE* aNode );
};
@ -1691,6 +1694,8 @@ public:
GROUP_ID GroupID = wxEmptyString; ///< If not empty, this component is part of a group
REUSEBLOCKREF ReuseBlockRef;
COMPONENT_ID VariantParentComponentID = wxEmptyString;
VARIANT_ID VariantID = wxEmptyString; ///< TODO: find out what this represents
long OrientAngle = 0;
bool TestPoint = false; ///< Indicates whether this component should be treated
///< as a testpoint. See SYMDEF_TYPE::TESTPOINT
@ -1881,7 +1886,6 @@ public:
{
enum class COPPER_FILL_TYPE
{
UNDEFINED,
FILLED,
HATCHED ///< This is a user defined HATCHCODE_ID
};
@ -1936,8 +1940,8 @@ public:
bool AutomaticRepour = false; ///< true when subnode "REGENERATE" is present
bool TargetForAutorouting = false; ///< true when subnode "AUTOROUTETARGET" is present
RELIEF_TYPE ReliefType = RELIEF_TYPE::CROSS; ///< See RELIEF_TYPE
COPPER_FILL_TYPE FillType = COPPER_FILL_TYPE::UNDEFINED;
RELIEF_TYPE ReliefType = RELIEF_TYPE::CROSS; ///< See RELIEF_TYPE
COPPER_FILL_TYPE FillType = COPPER_FILL_TYPE::FILLED; ///< Assume solid fill
HATCHCODE_ID HatchCodeID = wxEmptyString; ///< Only for FillType = HATCHED
void Parse( XNODE* aNode );
@ -2021,6 +2025,17 @@ public:
void Parse( XNODE* aNode );
};
struct VARIANT ///< Nodename = "VARIANT" or "VMASTER" (master variant
{
VARIANT_ID ID = wxEmptyString;
VARIANT_ID ParentID = wxEmptyString; ///< if empty, then this one is the master
wxString Name = wxEmptyString;
wxString Description = wxEmptyString;
void Parse( XNODE* aNode );
};
struct LAYOUT
{
@ -2041,6 +2056,7 @@ public:
std::map<TEXT_ID, TEXT> Texts;
std::map<DIMENSION_ID, DIMENSION> Dimensions;
std::map<DRILL_TABLE_ID, DRILL_TABLE> DrillTables;
std::map<VARIANT_ID, VARIANT> VariantHierarchy;
void Parse( XNODE* aNode );
};