/*****************/ /* am_param.h */ /*****************/ /* * This program source code file is part of KICAD, a free EDA CAD application. * * Copyright (C) 1992-2010 Jean-Pierre Charras * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 1992-2010 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 */ #ifndef _AM_PARAM_H_ #define _AM_PARAM_H_ /* An aperture macro defines a complex shape and is a list of aperture primitives. Each aperture primitive defines a simple shape (circle, rect, regular polygon...) Inside a given aperture primitive, a fixed list of parameters defines info about the shape: size, thickness, number of vertex ... Each parameter can be an immediate value or a defered value. When value is defered, it is defined when the aperture macro is instancied by an ADD macro command Actual values of a parmeter can also be the result of an arithmetic operation. Here is some examples: An immediate value: 3.5 A deferend value: $2 means: replace me by the second value given in the ADD command Actual value as arithmetic calculation: $2/2+1 Note also a defered parameter can be defined in aperture macro, but outside aperture primitives. Example %AMRECTHERM* $4=$3/2* parameter $4 is half value of parameter $3 21,1,$1-$3,$2-$3,0-$1/2-$4,0-$2/2-$4,0* For the aperture primitive, parameters $1 to $3 will be defined in ADD command, and $4 is defined inside the macro Some examples of aperture macro definition A simple definition, no parameters: %AMMOIRE10* 6,0,0,0.350000,0.005,0.050,3,0.005,0.400000,0.0*% Example of instanciation: %ADD19THERM19*% A simple definition, one parameter: %AMCIRCLE* 1,1,$1,0,0* Example of instanciation: %ADD11CIRCLE,.5*% A definition, with parameters and arithmetic operations: %AMVECTOR* 2,1,$1,0,0,$2+1,$3,-135*% Example of instanciation: %ADD12VECTOR,0.05X0X0*% A more complicated aperture macro definition, with parameters and arihmetic operations: %AMRNDREC* 0 this is a comment* 21,1,$1+$1,$2+$2-$3-$3,0,0,0* 21,1,$1+$1-$3-$3,$2+$2,0,0,0* 1,1,$3+$3,$1-$3,$2-$3* 1,1,$3+$3,$3-$1,$2-$3* 1,1,$3+$3,$1-$3,$3-$2* 1,1,$3+$3,$3-$1,$3-$2*% Example of instanciation: A more complicated sample of aperture macro definition: G04 Rectangular Thermal Macro, params: W/2, H/2, T/2 * %AMRECTHERM* $4=$3/2* 21,1,$1-$3,$2-$3,0-$1/2-$4,0-$2/2-$4,0* 21,1,$1-$3,$2-$3,0-$1/2-$4,$2/2+$4,0* 21,1,$1-$3,$2-$3,$1/2+$4,0-$2/2-$4,0* 21,1,$1-$3,$2-$3,$1/2+$4,$2/2+$4,0*% Example of instanciation: %ADD28RECTHERM,0.035591X0.041496X0.005000*% */ #include #include "dcode.h" /** * Class AM_PARAM * holds a parameter for an "aperture macro" as defined within * standard RS274X. The \a value field can be a constant, i.e. "immediate" * parameter or it may not be used if this param is going to defer to the * referencing aperture macro. In that case, the \a index field is an index * into the aperture macro's parameters. */ class AM_PARAM { public: AM_PARAM() : index( -1 ), value( 0.0 ) {} double GetValue( const D_CODE* aDcode ) const; void SetValue( double aValue ) { value = aValue; index = -1; } /** * Function IsImmediate * tests if this AM_PARAM holds an immediate parameter or is a pointer * into a parameter held by an owning D_CODE. */ bool IsImmediate() const { return index == -1; } unsigned GetIndex() const { return (unsigned) index; } void SetIndex( int aIndex ) { index = aIndex; } /** * Function ReadParam * Read one aperture macro parameter * a parameter can be: * a number * a reference to an aperture definition parameter value: $1 ot $3 ... * a parameter definition can be complex and have operators between numbers and/or other parameter * like $1+3 or $2x2.. * Parameters are separated by a comma ( of finish by *) * @param aText = pointer to the parameter to read. Will be modified to point to the next field * @return true if a param is read, or false */ bool ReadParam( char*& aText ); private: int index; ///< if -1, then \a value field is an immediate value, // else this is an index into parent's // D_CODE.m_am_params. double value; ///< if IsImmediate()==true then use the value, else // not used. }; typedef std::vector AM_PARAMS; #endif // _AM_PARAM_H_