|
|
|
@ -1,8 +1,8 @@ |
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application. |
|
|
|
* |
|
|
|
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr |
|
|
|
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors. |
|
|
|
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr |
|
|
|
* Copyright (C) 2018 KiCad Developers, see AUTHORS.txt for contributors. |
|
|
|
* |
|
|
|
* This program is free software; you can redistribute it and/or |
|
|
|
* modify it under the terms of the GNU General Public License |
|
|
|
@ -32,7 +32,8 @@ |
|
|
|
#include <gbr_metadata.h>
|
|
|
|
|
|
|
|
|
|
|
|
std::string GBR_APERTURE_METADATA::FormatAttribute( GBR_APERTURE_ATTRIB aAttribute ) |
|
|
|
std::string GBR_APERTURE_METADATA::FormatAttribute( GBR_APERTURE_ATTRIB aAttribute, |
|
|
|
bool aUseX1StructuredComment ) |
|
|
|
{ |
|
|
|
std::string attribute_string; |
|
|
|
|
|
|
|
@ -46,80 +47,99 @@ std::string GBR_APERTURE_METADATA::FormatAttribute( GBR_APERTURE_ATTRIB aAttribu |
|
|
|
case GBR_APERTURE_ATTRIB_ETCHEDCMP: // print info associated to an item
|
|
|
|
// which connects 2 different nets
|
|
|
|
// (Net tees, microwave component)
|
|
|
|
attribute_string = "%TA.AperFunction,EtchedComponent*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,EtchedComponent"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_CONDUCTOR: // print info associated to a track
|
|
|
|
attribute_string = "%TA.AperFunction,Conductor*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,Conductor"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_CUTOUT: // print info associated to a outline
|
|
|
|
attribute_string = "%TA.AperFunction,CutOut*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,CutOut"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_VIAPAD: // print info associated to a flashed via
|
|
|
|
attribute_string = "%TA.AperFunction,ViaPad*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,ViaPad"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_NONCONDUCTOR: // print info associated to a item on a copper layer
|
|
|
|
// which is not a track (for instance a text)
|
|
|
|
attribute_string = "%TA.AperFunction,NonConductor*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,NonConductor"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_COMPONENTPAD: // print info associated to a flashed
|
|
|
|
// through hole component on outer layer
|
|
|
|
attribute_string = "%TA.AperFunction,ComponentPad*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,ComponentPad"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_SMDPAD_SMDEF: // print info associated to a flashed for SMD pad.
|
|
|
|
// with solder mask defined from the copper shape
|
|
|
|
// Excluded BGA pads which have their own type
|
|
|
|
attribute_string = "%TA.AperFunction,SMDPad,SMDef*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,SMDPad,SMDef"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_SMDPAD_CUDEF: // print info associated to a flashed SMD pad with
|
|
|
|
// a solder mask defined by the solder mask
|
|
|
|
attribute_string = "%TA.AperFunction,SMDPad,CuDef*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,SMDPad,CuDef"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_BGAPAD_SMDEF: // print info associated to flashed BGA pads with
|
|
|
|
// a solder mask defined by the copper shape
|
|
|
|
attribute_string = "%TA.AperFunction,BGAPad,SMDef*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,BGAPad,SMDef"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_BGAPAD_CUDEF: // print info associated to a flashed BGA pad with
|
|
|
|
// a solder mask defined by the solder mask
|
|
|
|
attribute_string = "%TA.AperFunction,BGAPad,CuDef*%\n"; |
|
|
|
attribute_string = "%TA.AperFunction,BGAPad,CuDef"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_CONNECTORPAD: // print info associated to a flashed edge connector pad (outer layers)
|
|
|
|
attribute_string = "%TA.AperFunction,ConnectorPad*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,ConnectorPad"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_WASHERPAD: // print info associated to flashed mechanical pads (NPTH)
|
|
|
|
attribute_string = "%TA.AperFunction,WasherPad*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,WasherPad"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_HEATSINKPAD: // print info associated to a flashed heat sink pad
|
|
|
|
// (typically for SMDs)
|
|
|
|
attribute_string = "%TA.AperFunction,HeatsinkPad*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,HeatsinkPad"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_VIADRILL: // print info associated to a via hole in drill files
|
|
|
|
attribute_string = "%TA.AperFunction,ViaDrill*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,ViaDrill"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_COMPONENTDRILL: // print info associated to a component
|
|
|
|
// round hole in drill files
|
|
|
|
attribute_string = "%TA.AperFunction,ComponentDrill*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,ComponentDrill"; |
|
|
|
break; |
|
|
|
|
|
|
|
case GBR_APERTURE_ATTRIB_SLOTDRILL: // print info associated to a oblong hole in drill files
|
|
|
|
attribute_string = "%TA.AperFunction,Slot*%\n"; |
|
|
|
attribute_string = "TA.AperFunction,Slot"; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return attribute_string; |
|
|
|
std::string full_attribute_string; |
|
|
|
wxString eol_string; |
|
|
|
|
|
|
|
if( !attribute_string.empty() ) |
|
|
|
{ |
|
|
|
if( aUseX1StructuredComment ) |
|
|
|
{ |
|
|
|
full_attribute_string = "G04 #@! "; |
|
|
|
eol_string = "*\n"; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
full_attribute_string = "%"; |
|
|
|
eol_string = "*%\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
full_attribute_string += attribute_string + eol_string; |
|
|
|
|
|
|
|
return full_attribute_string; |
|
|
|
} |
|
|
|
|
|
|
|
wxString FormatStringFromGerber( const wxString& aString ) |
|
|
|
@ -209,9 +229,23 @@ std::string formatStringToGerber( const wxString& aString ) |
|
|
|
#define NO_PAD_NAME wxT( "" ) // pad name of pads without pad name/number (not normalized)
|
|
|
|
|
|
|
|
bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttributes, |
|
|
|
GBR_NETLIST_METADATA* aData, bool& aClearPreviousAttributes ) |
|
|
|
GBR_NETLIST_METADATA* aData, bool& aClearPreviousAttributes, |
|
|
|
bool aUseX1StructuredComment ) |
|
|
|
{ |
|
|
|
aClearPreviousAttributes = false; |
|
|
|
wxString prepend_string; |
|
|
|
wxString eol_string; |
|
|
|
|
|
|
|
if( aUseX1StructuredComment ) |
|
|
|
{ |
|
|
|
prepend_string = "G04 #@! "; |
|
|
|
eol_string = "*\n"; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
prepend_string = "%"; |
|
|
|
eol_string = "*%\n"; |
|
|
|
} |
|
|
|
|
|
|
|
// print a Gerber net attribute record.
|
|
|
|
// it is added to the object attributes dictionnary
|
|
|
|
@ -230,7 +264,7 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
{ |
|
|
|
// print info associated to a flashed pad (cmpref, pad name)
|
|
|
|
// example: %TO.P,R5,3*%
|
|
|
|
pad_attribute_string = "%TO.P,"; |
|
|
|
pad_attribute_string = prepend_string + "TO.P,"; |
|
|
|
pad_attribute_string += formatStringToGerber( aData->m_Cmpref ) + ","; |
|
|
|
|
|
|
|
if( aData->m_Padname.IsEmpty() ) |
|
|
|
@ -239,14 +273,14 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
else |
|
|
|
pad_attribute_string += formatStringToGerber( aData->m_Padname ); |
|
|
|
|
|
|
|
pad_attribute_string += "*%\n"; |
|
|
|
pad_attribute_string += eol_string; |
|
|
|
} |
|
|
|
|
|
|
|
if( ( aData->m_NetAttribType & GBR_NETLIST_METADATA::GBR_NETINFO_NET ) ) |
|
|
|
{ |
|
|
|
// print info associated to a net
|
|
|
|
// example: %TO.N,Clk3*%
|
|
|
|
net_attribute_string = "%TO.N,"; |
|
|
|
net_attribute_string = prepend_string + "TO.N,"; |
|
|
|
|
|
|
|
if( aData->m_Netname.IsEmpty() ) |
|
|
|
{ |
|
|
|
@ -266,7 +300,7 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
else |
|
|
|
net_attribute_string += formatStringToGerber( aData->m_Netname ); |
|
|
|
|
|
|
|
net_attribute_string += "*%\n"; |
|
|
|
net_attribute_string += eol_string; |
|
|
|
} |
|
|
|
|
|
|
|
if( ( aData->m_NetAttribType & GBR_NETLIST_METADATA::GBR_NETINFO_CMP ) && |
|
|
|
@ -276,8 +310,8 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
// example: %TO.C,R2*%
|
|
|
|
// Because GBR_NETINFO_PAD option already contains this info, it is not
|
|
|
|
// created here for a GBR_NETINFO_PAD attribute
|
|
|
|
cmp_attribute_string = "%TO.C,"; |
|
|
|
cmp_attribute_string += formatStringToGerber( aData->m_Cmpref ) + "*%\n"; |
|
|
|
cmp_attribute_string = prepend_string + "TO.C,"; |
|
|
|
cmp_attribute_string += formatStringToGerber( aData->m_Cmpref ) + eol_string; |
|
|
|
} |
|
|
|
|
|
|
|
// the full list of requested attributes:
|
|
|
|
@ -294,7 +328,7 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
// the entire dictionnary is cleared
|
|
|
|
bool clearDict = false; |
|
|
|
|
|
|
|
if( aLastNetAttributes.find( "%TO.P," ) != std::string::npos ) |
|
|
|
if( aLastNetAttributes.find( "TO.P," ) != std::string::npos ) |
|
|
|
{ |
|
|
|
if( pad_attribute_string.empty() ) // No more this attribute
|
|
|
|
clearDict = true; |
|
|
|
@ -305,7 +339,7 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
else // New attribute
|
|
|
|
short_attribute_string += pad_attribute_string; |
|
|
|
|
|
|
|
if( aLastNetAttributes.find( "%TO.N," ) != std::string::npos ) |
|
|
|
if( aLastNetAttributes.find( "TO.N," ) != std::string::npos ) |
|
|
|
{ |
|
|
|
if( net_attribute_string.empty() ) // No more this attribute
|
|
|
|
clearDict = true; |
|
|
|
@ -316,7 +350,7 @@ bool FormatNetAttribute( std::string& aPrintedText, std::string& aLastNetAttribu |
|
|
|
else // New attribute
|
|
|
|
short_attribute_string += net_attribute_string; |
|
|
|
|
|
|
|
if( aLastNetAttributes.find( "%TO.C," ) != std::string::npos ) |
|
|
|
if( aLastNetAttributes.find( "TO.C," ) != std::string::npos ) |
|
|
|
{ |
|
|
|
if( cmp_attribute_string.empty() ) // No more this attribute
|
|
|
|
clearDict = true; |
|
|
|
|