summaryrefslogtreecommitdiff
path: root/gerbview/class_am_param.h
diff options
context:
space:
mode:
Diffstat (limited to 'gerbview/class_am_param.h')
-rw-r--r--gerbview/class_am_param.h268
1 files changed, 268 insertions, 0 deletions
diff --git a/gerbview/class_am_param.h b/gerbview/class_am_param.h
new file mode 100644
index 0000000..c60e311
--- /dev/null
+++ b/gerbview/class_am_param.h
@@ -0,0 +1,268 @@
+/**
+ * @file class_am_param.h
+ */
+
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 1992-2015 Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
+ * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
+ * Copyright (C) 1992-2015 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 parameter 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 <vector>
+
+#include <dcode.h>
+/*
+Values of a parameter can be the result of an arithmetic operation,
+between immediate values and defered value.
+From an idea found in Gerbv, here is the way to evaluate a parameter.
+a AM_PARAM_ITEM holds info about operands and operators in a parameter definition
+( a AM_PARAM ) like $2+$2-$3-$3/2
+
+There is no precedence defined in gerber RS274X, so actual value is calculated step to step.
+Parameter definition is described by a very primitive assembler.
+This "program "should describe how to calculate the parameter.
+The assembler consist of 8 instruction intended for a stackbased machine.
+The instructions are:
+NOP, PUSHVALUE, PUSHPARM, ADD, SUB, MUL, DIV, EQUATE
+
+The instructions
+----------------
+NOP : The no operation. This is the default instruction and are
+ added as a security measure.
+PUSHVALUE : Pushes an arithmetical value on the stack. This machine only works with floats
+ on the stack.
+PUSHPARM: Pushes a defered parameter onto the stack. Gerber aperture macros accepts
+ parameters to be set when later declared, so the same macro can
+ be used at several instances. Which parameter to be set is an integer
+ and starts with 1. definition is like $1 or $3
+ADD : The mathematical operation +. Takes the two uppermost values on the
+ the stack, adds them and pushes the result back onto the stack.
+SUB : Same as ADD, but with -.
+MUL : Same as ADD, but with *.
+DIV : Same as ADD, but with /.
+POPVALUE : used when evaluate the expression: store current calculated value
+*/
+
+enum parm_item_type
+{
+ NOP, PUSHVALUE, PUSHPARM, ADD, SUB, MUL, DIV, POPVALUE
+};
+
+/**
+ * Class AM_PARAM
+ * holds an operand for an AM_PARAM 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_ITEM
+{
+private:
+ parm_item_type m_type; // the type of item
+ double m_dvalue; // the value, for PUSHVALUE type item
+ int m_ivalue; // the integer value, for PUSHPARM type item
+
+public:
+ AM_PARAM_ITEM( parm_item_type aType, double aValue )
+ {
+ m_type = aType;
+ m_dvalue = aValue;
+ m_ivalue = 0;
+ }
+ AM_PARAM_ITEM( parm_item_type aType, int aValue )
+ {
+ m_type = aType;
+ m_dvalue = 0.0;
+ m_ivalue = aValue;
+ }
+
+ void SetValue( double aValue )
+ {
+ m_dvalue = aValue;
+ }
+ double GetValue( ) const
+ {
+ return m_dvalue;
+ }
+ parm_item_type GetType() const
+ {
+ return m_type;
+ }
+ unsigned GetIndex() const
+ {
+ return (unsigned) m_ivalue;
+ }
+ bool IsOperator() const
+ {
+ return m_type == ADD || m_type == SUB || m_type == MUL || m_type == DIV;
+ }
+ bool IsOperand() const
+ {
+ return m_type == PUSHVALUE || m_type == PUSHPARM;
+ }
+ bool IsDefered() const
+ {
+ return m_type == PUSHPARM;
+ }
+};
+
+/**
+ * Class AM_PARAM
+ * holds a parameter value for an "aperture macro" as defined within
+ * standard RS274X. The parameter can be a constant, i.e. "immediate" parameter,
+ * or depend on some defered values, defined in a D_CODE, by the ADD command.
+ * Note the actual value could need an evaluation from an arithmetical expression
+ * items in the expression are stored in .
+ * A simple definition is just a value stored in one item in m_paramStack
+ */
+class AM_PARAM
+{
+private:
+ int m_index; // has meaning to define parameter local to an aperture macro
+ std::vector<AM_PARAM_ITEM> m_paramStack; // list of operands/operators to evalutate the actual value
+ // if a par def is $3/2, there are 3 items in stack:
+ // 3 (type PUSHPARM) , / (type DIV), 2 (type PUSHVALUE)
+
+public:
+ AM_PARAM();
+
+ /**
+ * function PushOperator
+ * add an operator/operand to the current stack
+ * @param aType = the type of item (NOP, PUSHVALUE, PUSHPARM, ADD, SUB, MUL, DIV, EQUATE)
+ * @param aValue = the item value, double for PUSHVALUE or int for PUSHPARM type.
+ */
+ void PushOperator( parm_item_type aType, double aValue );
+ void PushOperator( parm_item_type aType, int aValue = 0);
+
+ double GetValue( const D_CODE* aDcode ) const;
+
+ /**
+ * Function IsImmediate
+ * tests if this AM_PARAM holds an immediate parameter or is a pointer
+ * into a parameter held by an owning D_CODE.
+ * @return true if the value is immediate, i.e. no defered value in operands used in its definition
+ */
+ bool IsImmediate() const;
+
+ unsigned GetIndex() const
+ {
+ return (unsigned) m_index;
+ }
+
+ void SetIndex( int aIndex )
+ {
+ m_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 );
+};
+
+typedef std::vector<AM_PARAM> AM_PARAMS;
+
+#endif // _AM_PARAM_H_