diff options
Diffstat (limited to 'gerbview/class_X2_gerber_attributes.cpp')
-rw-r--r-- | gerbview/class_X2_gerber_attributes.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/gerbview/class_X2_gerber_attributes.cpp b/gerbview/class_X2_gerber_attributes.cpp new file mode 100644 index 0000000..52d59b1 --- /dev/null +++ b/gerbview/class_X2_gerber_attributes.cpp @@ -0,0 +1,270 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2010-2014 Jean-Pierre Charras jp.charras at wanadoo.fr + * Copyright (C) 1992-2014 KiCad Developers, see change_log.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 + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file class_X2_gerber_attributes.cpp + */ + +/* + * Manage the gerber extensions (attributes) in the new X2 version + * only few extensions are handled + * See http://www.ucamco.com/files/downloads/file/81/the_gerber_file_format_specification.pdf + * + * gerber attributes in the new X2 version look like: + * %TF.FileFunction,Copper,L1,Top*% + * + * Currently: + * .FileFunction .FileFunction Identifies the file’s function in the PCB. + * Other Standard Attributes, not yet used in Gerbview: + * .Part Identifies the part the file represents, e.g. a single PCB + * .MD5 Sets the MD5 file signature or checksum. + */ + +#include <wx/log.h> +#include <class_X2_gerber_attributes.h> + +/* + * class X2_ATTRIBUTE + * The attribute value consists of a number of substrings separated by a “,” +*/ + +X2_ATTRIBUTE::X2_ATTRIBUTE() +{ +} + +X2_ATTRIBUTE::~X2_ATTRIBUTE() +{ +} + +/* return the attribute name (for instance .FileFunction) + * which is given by TF command. + */ +const wxString& X2_ATTRIBUTE::GetAttribute() +{ + return m_Prms.Item( 0 ); +} + +/* return a parameter + * aIdx = the index of the parameter + * aIdx = 0 is the parameter read after the TF function + * (the same as GetAttribute()) + */ +const wxString& X2_ATTRIBUTE::GetPrm( int aIdx) +{ + static const wxString dummy; + + if( GetPrmCount() < aIdx && aIdx >= 0 ) + return m_Prms.Item( aIdx ); + + return dummy; +} + +// Debug function: pring using wxLogMessage le list of parameters +void X2_ATTRIBUTE::DbgListPrms() +{ + wxLogMessage( wxT("prms count %d"), GetPrmCount() ); + + for( int ii = 0; ii < GetPrmCount(); ii++ ) + wxLogMessage( m_Prms.Item( ii ) ); +} + +/* + * parse a TF command and fill m_Prms by the parameters found. + * aFile = a FILE* ptr to the current Gerber file. + * buff = the buffer containing current Gerber data (GERBER_BUFZ size) + * text = a pointer to the first char to read in Gerber data + */ +bool X2_ATTRIBUTE::ParseAttribCmd( FILE* aFile, char *aBuffer, int aBuffSize, char* &aText ) +{ + bool ok = true; + wxString data; + + for( ; ; ) + { + while( *aText ) + { + switch( *aText ) + { + case '%': // end of command + return ok; // success completion + + case ' ': + case '\r': + case '\n': + aText++; + break; + + case '*': // End of block + m_Prms.Add( data ); + data.Empty(); + aText++; + break; + + case ',': // End of parameter + aText++; + m_Prms.Add( data ); + data.Empty(); + break; + + default: + data.Append( *aText ); + aText++; + break; + } + } + + // end of current line, read another one. + if( aBuffer ) + { + if( fgets( aBuffer, aBuffSize, aFile ) == NULL ) + { + // end of file + ok = false; + break; + } + + aText = aBuffer; + } + else + return ok; + } + + return ok; +} + +/* + * class X2_ATTRIBUTE_FILEFUNCTION ( from %TF.FileFunction in Gerber file) + * Example file function: + * %TF.FileFunction,Copper,L1,Top*% + * - Type. Such as copper, solder mask etc. + * - Position. Specifies where the file appears in the PCB layer structure. + * Corresponding position substring: + * Copper layer: L1, L2, L3...to indicate the layer position followed by Top, Inr or + * Bot. L1 is always the top copper layer. E.g. L2,Inr. + * Extra layer, e.g. solder mask: Top or Bot – defines the attachment of the layer. + * Drill/rout layer: E.g. 1,4 – where 1 is the start and 4 is the end copper layer. The + * pair 1,4 defines the span of the drill/rout file + * Optional index. This can be used in instances where for example there are two solder + * masks on the same side. The index counts from the PCB surface outwards. + */ +X2_ATTRIBUTE_FILEFUNCTION::X2_ATTRIBUTE_FILEFUNCTION( X2_ATTRIBUTE& aAttributeBase ) + : X2_ATTRIBUTE() +{ + m_Prms = aAttributeBase.GetPrms(); + m_z_order = 0; + + //ensure at least 5 parameters + while( GetPrmCount() < 5 ) + m_Prms.Add( wxEmptyString ); + + set_Z_Order(); +} + +const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetFileType() +{ + // the type of layer (Copper , Soldermask ... ) + return m_Prms.Item( 1 ); +} + +const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetBrdLayerId() +{ + // the brd layer identifier: Ln (for Copper type) or Top, Bot + return m_Prms.Item( 2 ); +} + +const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetBrdLayerSide() +{ + if( IsCopper() ) + // the brd layer identifier: Top, Bot, Inr + return m_Prms.Item( 3 ); + else + // the brd layer identifier: Top, Bot ( same as GetBrdLayerId() ) + return m_Prms.Item( 2 ); +} + +const wxString& X2_ATTRIBUTE_FILEFUNCTION::GetLabel() +{ + if( IsCopper() ) + return m_Prms.Item( 4 ); + else + return m_Prms.Item( 3 ); +} + + +bool X2_ATTRIBUTE_FILEFUNCTION::IsCopper() +{ + // the filefunction label, if any + return GetFileType().IsSameAs( wxT( "Copper" ), false ); +} + +// Initialize the z order priority of the current file, from its attributes +// this priority is the order of layers from top to bottom to draw/display gerber images +// Stack up is( from external copper layer to external) +// copper, then solder paste, then solder mask, then silk screen. +// and global stackup is Front (top) layers then internal copper layers then Back (bottom) layers +void X2_ATTRIBUTE_FILEFUNCTION::set_Z_Order() +{ + m_z_order = -100; // low level + m_z_sub_order = 0; + + if( IsCopper() ) + { + // Copper layer: the priority is the layer Id + m_z_order = 0; + wxString num = GetBrdLayerId().Mid( 1 ); + long lnum; + if( num.ToLong( &lnum ) ) + m_z_sub_order = -lnum; + } + + if( GetFileType().IsSameAs( wxT( "Paste" ), false ) ) + { + // solder paste layer: the priority is top then bottom + m_z_order = 1; // for top + + if( GetBrdLayerId().IsSameAs( wxT( "Bot" ), false ) ) + m_z_order = -m_z_order; + } + + if( GetFileType().IsSameAs( wxT( "Soldermask" ), false ) ) + { + // solder mask layer: the priority is top then bottom + m_z_order = 2; // for top + + if( GetBrdLayerId().IsSameAs( wxT( "Bot" ), false ) ) + m_z_order = -m_z_order; + } + + if( GetFileType().IsSameAs( wxT( "Legend" ), false ) ) + { + // Silk screen layer: the priority is top then bottom + m_z_order = 3; // for top + + if( GetFileType().IsSameAs( wxT( "Legend" ), false ) ) + + if( GetBrdLayerId().IsSameAs( wxT( "Bot" ), false ) ) + m_z_order = -m_z_order; + } +} + |