| 1 |  | /*    This is a component of LinuxCNC | 
    
    | 2 |  |  *    Copyright 2011, 2012, 2013 Michael Haberler <git@mah.priv.at>, | 
    
    | 3 |  |  *    Sebastian Kuzminsky <seb@highlab.com> | 
    
    | 4 |  |  * | 
    
    | 5 |  |  *    This program is free software; you can redistribute it and/or modify | 
    
    | 6 |  |  *    it under the terms of the GNU General Public License as published by | 
    
    | 7 |  |  *    the Free Software Foundation; either version 2 of the License, or | 
    
    | 8 |  |  *    (at your option) any later version. | 
    
    | 9 |  |  * | 
    
    | 10 |  |  *    This program is distributed in the hope that it will be useful, | 
    
    | 11 |  |  *    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
    
    | 12 |  |  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
    
    | 13 |  |  *    GNU General Public License for more details. | 
    
    | 14 |  |  * | 
    
    | 15 |  |  *    You should have received a copy of the GNU General Public License | 
    
    | 16 |  |  *    along with this program; if not, write to the Free Software | 
    
    | 17 |  |  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
    
    | 18 |  |  */ | 
    
    | 19 |  | // Interpreter internals - Python bindings | 
    
    | 20 |  | // Michael Haberler 7/2011 | 
    
    | 21 |  | // | 
    
    | 22 |  |  | 
    
    | 23 |  | #include <boost/python/class.hpp> | 
    
    | 24 |  | #include <boost/python/def.hpp> | 
    
    | 25 |  | #include <boost/python/exception_translator.hpp> | 
    
    | 26 |  | #include <boost/python/module.hpp> | 
    
    | 27 |  | #include <boost/python/suite/indexing/map_indexing_suite.hpp> | 
    
    | 28 |  | #include <map> | 
    
    | 29 |  |  | 
    
    | 30 |  | namespace bp = boost::python; | 
    
    | 31 |  | extern int _task;  // zero in gcodemodule, 1 in milltask | 
    
    | 32 |  |  | 
    
    | 33 |  | #include <stdio.h> | 
    
    | 34 |  | #include <string.h> | 
    
    | 35 |  | #include <assert.h> | 
    
    | 36 |  |  | 
    
    | 37 |  | #include "rs274ngc.hh" | 
    
    | 38 |  | #include "interp_return.hh" | 
    
    | 39 |  | #include "interp_internal.hh" | 
    
    | 40 |  | #include "rs274ngc_interp.hh" | 
    
    | 41 |  | #include "units.h" | 
    
    | 42 |  | #include "array1.hh" | 
    
    | 43 |  |  | 
    
    | 44 |  | extern void export_Internals(); | 
    
    | 45 |  | extern void export_Arrays(); | 
    
    | 46 |  | extern void export_Block(); | 
    
    | 47 |  | extern void export_EmcTypes(); | 
    
    | 48 |  | #include "paramclass.hh" | 
    
    | 49 |  |  | 
    
    | 50 |  | namespace pp = pyplusplus::containers::static_sized; | 
    
    | 51 |  | #include "interp_array_types.hh" | 
    
    | 52 |  |  | 
    
    | 53 |  | #define IS_STRING(x) (PyObject_IsInstance(x.ptr(), (PyObject*)&PyString_Type)) | 
    
    | 54 |  | #define IS_INT(x) (PyObject_IsInstance(x.ptr(), (PyObject*)&PyInt_Type)) | 
    
    | 55 |  |  | 
    
    | 56 |  | static  active_g_codes_array active_g_codes_wrapper ( Interp & inst) { | 
    
    | 57 |  |     return active_g_codes_array(inst._setup.active_g_codes); | 
    
    | 58 |  | } | 
    
    | 59 |  | static  active_m_codes_array active_m_codes_wrapper ( Interp & inst) { | 
    
    | 60 |  |     return active_m_codes_array(inst._setup.active_m_codes); | 
    
    | 61 |  | } | 
    
    | 62 |  |  | 
    
    | 63 |  | static  active_settings_array active_settings_wrapper ( Interp & inst) { | 
    
    | 64 |  |     return active_settings_array(inst._setup.active_settings); | 
    
    | 65 |  | } | 
    
    | 66 |  |  | 
    
    | 67 |  | static  blocks_array blocks_wrapper ( Interp & inst) { | 
    
    | 68 |  |     return blocks_array(inst._setup.blocks); | 
    
    | 69 |  | } | 
    
    | 70 |  |  | 
    
    | 71 |  | static  parameters_array parameters_wrapper ( Interp & inst) { | 
    
    | 72 |  |     return parameters_array(inst._setup.parameters); | 
    
    | 73 |  | } | 
    
    | 74 |  |  | 
    
    | 75 |  | static  tool_table_array tool_table_wrapper ( Interp & inst) { | 
    
    | 76 |  |     return tool_table_array(inst._setup.tool_table); | 
    
    | 77 |  | } | 
    
    | 78 |  |  | 
    
    | 79 |  | static  sub_context_array sub_context_wrapper ( Interp & inst) { | 
    
    | 80 |  |     return sub_context_array(inst._setup.sub_context); | 
    
    | 81 |  | } | 
    
    | 82 |  |  | 
    
    | 83 |  |  | 
    
    | 84 |  | #pragma GCC diagnostic ignored "-Wformat-security" | 
    
    | 85 |  | static void setErrorMsg(Interp &interp, const char *s) | 
    
    | 86 |  | { | 
    
    | 87 |  |     setup *settings  = &interp._setup; | 
    
    | 88 |  |  | 
    
    | 89 |  |     if ((s == NULL) || (strlen(s) == 0)) | 
    
    | 90 |  | 	s = "###"; | 
    
    | 91 |  |     interp.setError (s); | 
    
    | 92 |  |     settings->stack_index = 0; | 
    
    | 93 |  |     strncpy(settings->stack[settings->stack_index], | 
    
    | 94 |  | 	    "Python", STACK_ENTRY_LEN); | 
    
    | 95 |  |     settings->stack[settings->stack_index][STACK_ENTRY_LEN-1] = 0; | 
    
    | 96 |  |     settings->stack_index++; | 
    
    | 97 |  |     settings->stack[settings->stack_index][0] = 0; | 
    
    | 98 |  | } | 
    
    | 99 |  |  | 
    
    | 100 |  | #pragma GCC diagnostic warning "-Wformat-security" | 
    
    | 101 |  |  | 
    
    | 102 |  | static bp::object errorStack(Interp &interp) | 
    
    | 103 |  | { | 
    
    | 104 |  |     setup *settings  = &interp._setup; | 
    
    | 105 |  |     bp::list msgs; | 
    
    | 106 |  |  | 
    
    | 107 |  |     for (int i = 0; i < settings->stack_index; i++) | 
    
    | 108 |  | 	msgs.append(bp::object( (const char *) settings->stack[i])); | 
    
    | 109 |  |     return msgs; | 
    
    | 110 |  | } | 
    
    | 111 |  |  | 
    
    | 112 |  | static bp::object wrap_find_tool_pocket(Interp &interp, int toolno) | 
    
    | 113 |  | { | 
    
    | 114 |  |     int status, pocket; | 
    
    | 115 |  |     setup *settings  =  &interp._setup; | 
    
    | 116 |  |  | 
    
    | 117 |  |     status = interp.find_tool_pocket(settings, toolno, &pocket); | 
    
    | 118 |  |     return bp::make_tuple(status, pocket); | 
    
    | 119 |  | } | 
    
    | 120 |  |  | 
    
    | 121 |  |  | 
    
    | 122 |  | // FIXME not sure if this is really needed | 
    
    | 123 | 3 | static  ParamClass param_wrapper ( Interp & inst) { | 
    
    | 124 | 3 |     return ParamClass(inst); | 
    
    | 125 |  | } | 
    
    | 126 |  |  | 
    
    | 127 |  | static int get_task(Interp &i) { return _task; }; | 
    
    | 128 |  | static const char *get_filename(Interp &i) { return i._setup.filename; }; | 
    
    | 129 |  | static const char *get_linetext(Interp &i) { return i._setup.linetext; }; | 
    
    | 130 |  |  | 
    
    | 131 |  | // those are exposed here because they look useful for regression testing | 
    
    | 132 | 8 | static bool __equal(double a, double b) { return fabs(a - b) < TOLERANCE_EQUAL; } | 
    
    | 133 |  | // see interp_convert.cc | 
    
    | 134 |  | static bool is_near_int(double value) { | 
    
    | 135 |  |     int i = (int)(value + .5); | 
    
    | 136 |  |     return fabs(i - value) < .0001; | 
    
    | 137 |  | } | 
    
    | 138 |  | static int nearest_int(double value) { return (int)(value + .5); } | 
    
    | 139 |  |  | 
    
    | 140 |  | int (Interp::*execute_1)(const char *command) = &Interp::execute; | 
    
    | 141 |  | int (Interp::*execute_2)(const char *command, int line_number) = &Interp::execute; | 
    
    | 142 |  |  | 
    
    | 143 |  | // lifted from http://stackoverflow.com/questions/2261858/boostpython-export-custom-exception | 
    
    | 144 |  |  | 
    
    | 145 |  |  | 
    
    | 146 |  | class InterpreterException : public std::exception { | 
    
    | 147 |  | private: | 
    
    | 148 |  |     std::string error_message; | 
    
    | 149 |  |     int line_number; | 
    
    | 150 |  |     std::string line_text; | 
    
    | 151 |  | public: | 
    
    | 152 |  |     InterpreterException(std::string error_message, int line_number, std::string line_text)  { | 
    
    | 153 |  | 	this->error_message = error_message; | 
    
    | 154 |  | 	this->line_number = line_number; | 
    
    | 155 |  | 	this->line_text = line_text; | 
    
    | 156 |  |     } | 
    
    | 157 |  |     const char *what() const throw() { return this->error_message.c_str();  } | 
    
    | 158 |  |  | 
    
    | 159 |  |     ~InterpreterException() throw()  {} | 
    
    | 160 |  |     std::string get_error_message()  { return this->error_message;  } | 
    
    | 161 |  |     int get_line_number()    { return this->line_number;  } | 
    
    | 162 |  |     std::string get_line_text()      { return this->line_text; } | 
    
    | 163 |  | }; | 
    
    | 164 |  |  | 
    
    | 165 |  | static PyObject *InterpreterExceptionType = NULL; | 
    
    | 166 |  |  | 
    
    | 167 |  | void translateInterpreterException(InterpreterException const &e) | 
    
    | 168 |  | { | 
    
    | 169 |  |   assert(InterpreterExceptionType != NULL); | 
    
    | 170 |  |   bp::object pythonExceptionInstance(e); | 
    
    | 171 |  |   PyErr_SetObject(InterpreterExceptionType, pythonExceptionInstance.ptr()); | 
    
    | 172 |  | } | 
    
    | 173 |  |  | 
    
    | 174 |  | static int throw_exceptions = 1; | 
    
    | 175 |  |  | 
    
    | 176 |  | static int wrap_interp_execute_1(Interp &interp, const char *command) | 
    
    | 177 |  | { | 
    
    | 178 |  |     setup &_setup = interp._setup; | 
    
    | 179 |  |     block saved_block = _setup.blocks[0]; | 
    
    | 180 |  |     int saved_call_state = _setup.call_state; | 
    
    | 181 |  |  | 
    
    | 182 |  |     // Temporarily set the call state to CS_NORMAL | 
    
    | 183 |  |     _setup.call_state = CS_NORMAL; | 
    
    | 184 |  |     int status = interp.execute(command); | 
    
    | 185 |  |     _setup.call_state = saved_call_state; | 
    
    | 186 |  |     _setup.blocks[0] = saved_block; | 
    
    | 187 |  |  | 
    
    | 188 |  |     // printf("ie1: tc=%d if=%d pf=%d\n", _setup.toolchange_flag,_setup.input_flag,_setup.probe_flag); | 
    
    | 189 |  |  | 
    
    | 190 |  |     if ((status > INTERP_MIN_ERROR) && throw_exceptions) { | 
    
    | 191 |  | 	throw InterpreterException(interp.getSavedError(), | 
    
    | 192 |  | 				   _setup.blocks[0].line_number, // not sure | 
    
    | 193 |  | 				   _setup.linetext); | 
    
    | 194 |  |     } | 
    
    | 195 |  |     return status; | 
    
    | 196 |  | } | 
    
    | 197 |  |  | 
    
    | 198 |  | static int wrap_interp_execute_2(Interp &interp, const char *command, int lineno) | 
    
    | 199 |  | { | 
    
    | 200 |  |     setup &_setup = interp._setup; | 
    
    | 201 |  |     block saved_block = _setup.blocks[0]; | 
    
    | 202 |  |  | 
    
    | 203 |  |     // use the remap stack to save/restore the current block | 
    
    | 204 |  |     CHP(interp.enter_remap()); | 
    
    | 205 |  |     int status = interp.execute(command, lineno); | 
    
    | 206 |  |     CHP(interp.leave_remap()); | 
    
    | 207 |  |     _setup.blocks[0] = saved_block; | 
    
    | 208 |  |  | 
    
    | 209 |  |     //printf("ie2: tc=%d if=%d pf=%d\n", _setup.toolchange_flag,_setup.input_flag,_setup.probe_flag); | 
    
    | 210 |  |     if ((status > INTERP_MIN_ERROR) && throw_exceptions) { | 
    
    | 211 |  | 	throw InterpreterException(interp.getSavedError(), | 
    
    | 212 |  | 				   lineno, // not sure | 
    
    | 213 |  | 				   _setup.linetext); | 
    
    | 214 |  |     } | 
    
    | 215 |  |     return status; | 
    
    | 216 |  | } | 
    
    | 217 |  |  | 
    
    | 218 |  | // this might not be a good idea - it destroys the block which has a 'o<ngcbody> call' parsed in it | 
    
    | 219 |  | static int wrap_interp_read(Interp &interp, const char *command) | 
    
    | 220 |  | { | 
    
    | 221 |  |     setup &_setup = interp._setup; | 
    
    | 222 |  |     block saved_block = _setup.blocks[0]; | 
    
    | 223 |  |  | 
    
    | 224 |  |     int status = interp.read(command); | 
    
    | 225 |  |     if ((status > INTERP_MIN_ERROR) && throw_exceptions) { | 
    
    | 226 |  | 	throw InterpreterException(interp.getSavedError(), | 
    
    | 227 |  | 				   _setup.blocks[0].line_number, // not sure | 
    
    | 228 |  | 				   _setup.linetext); | 
    
    | 229 |  |     } | 
    
    | 230 |  |     return status; | 
    
    | 231 |  | } | 
    
    | 232 |  |  | 
    
    | 233 |  | // static inline remap_map wrap_remaps(Interp &interp)  { | 
    
    | 234 |  | //     return interp._setup.remaps; | 
    
    | 235 |  | // } | 
    
    | 236 |  |  | 
    
    | 237 |  | // what a barren desert | 
    
    | 238 |  | static inline EmcPose get_tool_offset (Interp &interp)  { | 
    
    | 239 |  |     return interp._setup.tool_offset; | 
    
    | 240 |  | } | 
    
    | 241 |  | static inline void set_tool_offset(Interp &interp, EmcPose value)  { | 
    
    | 242 |  |     interp._setup.tool_offset = value; | 
    
    | 243 |  | } | 
    
    | 244 |  | static inline bool get_arc_not_allowed (Interp &interp)  { | 
    
    | 245 |  |     return interp._setup.arc_not_allowed; | 
    
    | 246 |  | } | 
    
    | 247 |  | static inline void set_arc_not_allowed(Interp &interp, bool value)  { | 
    
    | 248 |  |     interp._setup.arc_not_allowed = value; | 
    
    | 249 |  | } | 
    
    | 250 |  | static inline bool get_cutter_comp_firstmove (Interp &interp)  { | 
    
    | 251 |  |     return interp._setup.cutter_comp_firstmove; | 
    
    | 252 |  | } | 
    
    | 253 |  | static inline void set_cutter_comp_firstmove(Interp &interp, bool value)  { | 
    
    | 254 |  |     interp._setup.cutter_comp_firstmove = value; | 
    
    | 255 |  | } | 
    
    | 256 |  | static inline bool get_feed_override (Interp &interp)  { | 
    
    | 257 |  |     return interp._setup.feed_override; | 
    
    | 258 |  | } | 
    
    | 259 |  | static inline void set_feed_override(Interp &interp, bool value)  { | 
    
    | 260 |  |     interp._setup.feed_override = value; | 
    
    | 261 |  | } | 
    
    | 262 |  | static inline bool get_input_digital (Interp &interp)  { | 
    
    | 263 |  |     return interp._setup.input_digital; | 
    
    | 264 |  | } | 
    
    | 265 |  | static inline void set_input_digital(Interp &interp, bool value)  { | 
    
    | 266 |  |     interp._setup.input_digital = value; | 
    
    | 267 |  | } | 
    
    | 268 |  | static inline bool get_input_flag (Interp &interp)  { | 
    
    | 269 |  |     return interp._setup.input_flag; | 
    
    | 270 |  | } | 
    
    | 271 |  | static inline void set_input_flag(Interp &interp, bool value)  { | 
    
    | 272 |  |     interp._setup.input_flag = value; | 
    
    | 273 |  | } | 
    
    | 274 |  | static inline bool get_mdi_interrupt (Interp &interp)  { | 
    
    | 275 |  |     return interp._setup.mdi_interrupt; | 
    
    | 276 |  | } | 
    
    | 277 |  | static inline void set_mdi_interrupt(Interp &interp, bool value)  { | 
    
    | 278 |  |     interp._setup.mdi_interrupt = value; | 
    
    | 279 |  | } | 
    
    | 280 |  | static inline bool get_mist (Interp &interp)  { | 
    
    | 281 |  |     return interp._setup.mist; | 
    
    | 282 |  | } | 
    
    | 283 |  | static inline void set_mist(Interp &interp, bool value)  { | 
    
    | 284 |  |     interp._setup.mist = value; | 
    
    | 285 |  | } | 
    
    | 286 |  | static inline bool get_percent_flag (Interp &interp)  { | 
    
    | 287 |  |     return interp._setup.percent_flag; | 
    
    | 288 |  | } | 
    
    | 289 |  | static inline void set_percent_flag(Interp &interp, bool value)  { | 
    
    | 290 |  |     interp._setup.percent_flag = value; | 
    
    | 291 |  | } | 
    
    | 292 |  | static inline bool get_probe_flag (Interp &interp)  { | 
    
    | 293 |  |     return interp._setup.probe_flag; | 
    
    | 294 |  | } | 
    
    | 295 |  | static inline void set_probe_flag(Interp &interp, bool value)  { | 
    
    | 296 |  |     interp._setup.probe_flag = value; | 
    
    | 297 |  | } | 
    
    | 298 |  | static inline bool get_speed_override (Interp &interp)  { | 
    
    | 299 |  |     return interp._setup.speed_override; | 
    
    | 300 |  | } | 
    
    | 301 |  | static inline void set_speed_override(Interp &interp, bool value)  { | 
    
    | 302 |  |     interp._setup.speed_override = value; | 
    
    | 303 |  | } | 
    
    | 304 |  | static inline bool get_toolchange_flag (Interp &interp)  { | 
    
    | 305 |  |     return interp._setup.toolchange_flag; | 
    
    | 306 |  | } | 
    
    | 307 |  | static inline void set_toolchange_flag(Interp &interp, bool value)  { | 
    
    | 308 |  |     interp._setup.toolchange_flag = value; | 
    
    | 309 |  | } | 
    
    | 310 |  | static inline double get_u_current (Interp &interp)  { | 
    
    | 311 |  |     return interp._setup.u_current; | 
    
    | 312 |  | } | 
    
    | 313 |  | static inline void set_u_current(Interp &interp, double value)  { | 
    
    | 314 |  |     interp._setup.u_current = value; | 
    
    | 315 |  | } | 
    
    | 316 |  | static inline double get_AA_axis_offset (Interp &interp)  { | 
    
    | 317 |  |     return interp._setup.AA_axis_offset; | 
    
    | 318 |  | } | 
    
    | 319 |  | static inline void set_AA_axis_offset(Interp &interp, double value)  { | 
    
    | 320 |  |     interp._setup.AA_axis_offset = value; | 
    
    | 321 |  | } | 
    
    | 322 |  | static inline double get_AA_current (Interp &interp)  { | 
    
    | 323 |  |     return interp._setup.AA_current; | 
    
    | 324 |  | } | 
    
    | 325 |  | static inline void set_AA_current(Interp &interp, double value)  { | 
    
    | 326 |  |     interp._setup.AA_current = value; | 
    
    | 327 |  | } | 
    
    | 328 |  | static inline double get_AA_origin_offset (Interp &interp)  { | 
    
    | 329 |  |     return interp._setup.AA_origin_offset; | 
    
    | 330 |  | } | 
    
    | 331 |  | static inline void set_AA_origin_offset(Interp &interp, double value)  { | 
    
    | 332 |  |     interp._setup.AA_origin_offset = value; | 
    
    | 333 |  | } | 
    
    | 334 |  | static inline double get_BB_axis_offset (Interp &interp)  { | 
    
    | 335 |  |     return interp._setup.BB_axis_offset; | 
    
    | 336 |  | } | 
    
    | 337 |  | static inline void set_BB_axis_offset(Interp &interp, double value)  { | 
    
    | 338 |  |     interp._setup.BB_axis_offset = value; | 
    
    | 339 |  | } | 
    
    | 340 |  | static inline double get_BB_current (Interp &interp)  { | 
    
    | 341 |  |     return interp._setup.BB_current; | 
    
    | 342 |  | } | 
    
    | 343 |  | static inline void set_BB_current(Interp &interp, double value)  { | 
    
    | 344 |  |     interp._setup.BB_current = value; | 
    
    | 345 |  | } | 
    
    | 346 |  | static inline double get_BB_origin_offset (Interp &interp)  { | 
    
    | 347 |  |     return interp._setup.BB_origin_offset; | 
    
    | 348 |  | } | 
    
    | 349 |  | static inline void set_BB_origin_offset(Interp &interp, double value)  { | 
    
    | 350 |  |     interp._setup.BB_origin_offset = value; | 
    
    | 351 |  | } | 
    
    | 352 |  | static inline double get_CC_axis_offset (Interp &interp)  { | 
    
    | 353 |  |     return interp._setup.CC_axis_offset; | 
    
    | 354 |  | } | 
    
    | 355 |  | static inline void set_CC_axis_offset(Interp &interp, double value)  { | 
    
    | 356 |  |     interp._setup.CC_axis_offset = value; | 
    
    | 357 |  | } | 
    
    | 358 |  | static inline double get_CC_current (Interp &interp)  { | 
    
    | 359 |  |     return interp._setup.CC_current; | 
    
    | 360 |  | } | 
    
    | 361 |  | static inline void set_CC_current(Interp &interp, double value)  { | 
    
    | 362 |  |     interp._setup.CC_current = value; | 
    
    | 363 |  | } | 
    
    | 364 |  | static inline double get_CC_origin_offset (Interp &interp)  { | 
    
    | 365 |  |     return interp._setup.CC_origin_offset; | 
    
    | 366 |  | } | 
    
    | 367 |  | static inline void set_CC_origin_offset(Interp &interp, double value)  { | 
    
    | 368 |  |     interp._setup.CC_origin_offset = value; | 
    
    | 369 |  | } | 
    
    | 370 |  | static inline double get_axis_offset_x (Interp &interp)  { | 
    
    | 371 |  |     return interp._setup.axis_offset_x; | 
    
    | 372 |  | } | 
    
    | 373 |  | static inline void set_axis_offset_x(Interp &interp, double value)  { | 
    
    | 374 |  |     interp._setup.axis_offset_x = value; | 
    
    | 375 |  | } | 
    
    | 376 |  | static inline double get_axis_offset_y (Interp &interp)  { | 
    
    | 377 |  |     return interp._setup.axis_offset_y; | 
    
    | 378 |  | } | 
    
    | 379 |  | static inline void set_axis_offset_y(Interp &interp, double value)  { | 
    
    | 380 |  |     interp._setup.axis_offset_y = value; | 
    
    | 381 |  | } | 
    
    | 382 |  | static inline double get_axis_offset_z (Interp &interp)  { | 
    
    | 383 |  |     return interp._setup.axis_offset_z; | 
    
    | 384 |  | } | 
    
    | 385 |  | static inline void set_axis_offset_z(Interp &interp, double value)  { | 
    
    | 386 |  |     interp._setup.axis_offset_z = value; | 
    
    | 387 |  | } | 
    
    | 388 |  | static inline double get_current_x (Interp &interp)  { | 
    
    | 389 |  |     return interp._setup.current_x; | 
    
    | 390 |  | } | 
    
    | 391 |  | static inline void set_current_x(Interp &interp, double value)  { | 
    
    | 392 |  |     interp._setup.current_x = value; | 
    
    | 393 |  | } | 
    
    | 394 |  | static inline double get_current_y (Interp &interp)  { | 
    
    | 395 |  |     return interp._setup.current_y; | 
    
    | 396 |  | } | 
    
    | 397 |  | static inline void set_current_y(Interp &interp, double value)  { | 
    
    | 398 |  |     interp._setup.current_y = value; | 
    
    | 399 |  | } | 
    
    | 400 |  | static inline double get_current_z (Interp &interp)  { | 
    
    | 401 |  |     return interp._setup.current_z; | 
    
    | 402 |  | } | 
    
    | 403 |  | static inline void set_current_z(Interp &interp, double value)  { | 
    
    | 404 |  |     interp._setup.current_z = value; | 
    
    | 405 |  | } | 
    
    | 406 |  | static inline double get_cutter_comp_radius (Interp &interp)  { | 
    
    | 407 |  |     return interp._setup.cutter_comp_radius; | 
    
    | 408 |  | } | 
    
    | 409 |  | static inline void set_cutter_comp_radius(Interp &interp, double value)  { | 
    
    | 410 |  |     interp._setup.cutter_comp_radius = value; | 
    
    | 411 |  | } | 
    
    | 412 |  | static inline double get_cycle_cc (Interp &interp)  { | 
    
    | 413 |  |     return interp._setup.cycle_cc; | 
    
    | 414 |  | } | 
    
    | 415 |  | static inline void set_cycle_cc(Interp &interp, double value)  { | 
    
    | 416 |  |     interp._setup.cycle_cc = value; | 
    
    | 417 |  | } | 
    
    | 418 |  | static inline double get_cycle_i (Interp &interp)  { | 
    
    | 419 |  |     return interp._setup.cycle_i; | 
    
    | 420 |  | } | 
    
    | 421 |  | static inline void set_cycle_i(Interp &interp, double value)  { | 
    
    | 422 |  |     interp._setup.cycle_i = value; | 
    
    | 423 |  | } | 
    
    | 424 |  | static inline double get_cycle_il (Interp &interp)  { | 
    
    | 425 |  |     return interp._setup.cycle_il; | 
    
    | 426 |  | } | 
    
    | 427 |  | static inline void set_cycle_il(Interp &interp, double value)  { | 
    
    | 428 |  |     interp._setup.cycle_il = value; | 
    
    | 429 |  | } | 
    
    | 430 |  | static inline double get_cycle_j (Interp &interp)  { | 
    
    | 431 |  |     return interp._setup.cycle_j; | 
    
    | 432 |  | } | 
    
    | 433 |  | static inline void set_cycle_j(Interp &interp, double value)  { | 
    
    | 434 |  |     interp._setup.cycle_j = value; | 
    
    | 435 |  | } | 
    
    | 436 |  | static inline double get_cycle_k (Interp &interp)  { | 
    
    | 437 |  |     return interp._setup.cycle_k; | 
    
    | 438 |  | } | 
    
    | 439 |  | static inline void set_cycle_k(Interp &interp, double value)  { | 
    
    | 440 |  |     interp._setup.cycle_k = value; | 
    
    | 441 |  | } | 
    
    | 442 |  | static inline double get_cycle_p (Interp &interp)  { | 
    
    | 443 |  |     return interp._setup.cycle_p; | 
    
    | 444 |  | } | 
    
    | 445 |  | static inline void set_cycle_p(Interp &interp, double value)  { | 
    
    | 446 |  |     interp._setup.cycle_p = value; | 
    
    | 447 |  | } | 
    
    | 448 |  | static inline double get_cycle_q (Interp &interp)  { | 
    
    | 449 |  |     return interp._setup.cycle_q; | 
    
    | 450 |  | } | 
    
    | 451 |  | static inline void set_cycle_q(Interp &interp, double value)  { | 
    
    | 452 |  |     interp._setup.cycle_q = value; | 
    
    | 453 |  | } | 
    
    | 454 |  | static inline double get_cycle_r (Interp &interp)  { | 
    
    | 455 |  |     return interp._setup.cycle_r; | 
    
    | 456 |  | } | 
    
    | 457 |  | static inline void set_cycle_r(Interp &interp, double value)  { | 
    
    | 458 |  |     interp._setup.cycle_r = value; | 
    
    | 459 |  | } | 
    
    | 460 |  | static inline double get_feed_rate (Interp &interp)  { | 
    
    | 461 |  |     return interp._setup.feed_rate; | 
    
    | 462 |  | } | 
    
    | 463 |  | static inline void set_feed_rate(Interp &interp, double value)  { | 
    
    | 464 |  |     interp._setup.feed_rate = value; | 
    
    | 465 |  | } | 
    
    | 466 |  | static inline double get_origin_offset_x (Interp &interp)  { | 
    
    | 467 |  |     return interp._setup.origin_offset_x; | 
    
    | 468 |  | } | 
    
    | 469 |  | static inline void set_origin_offset_x(Interp &interp, double value)  { | 
    
    | 470 |  |     interp._setup.origin_offset_x = value; | 
    
    | 471 |  | } | 
    
    | 472 |  | static inline double get_origin_offset_y (Interp &interp)  { | 
    
    | 473 |  |     return interp._setup.origin_offset_y; | 
    
    | 474 |  | } | 
    
    | 475 |  | static inline void set_origin_offset_y(Interp &interp, double value)  { | 
    
    | 476 |  |     interp._setup.origin_offset_y = value; | 
    
    | 477 |  | } | 
    
    | 478 |  | static inline double get_origin_offset_z (Interp &interp)  { | 
    
    | 479 |  |     return interp._setup.origin_offset_z; | 
    
    | 480 |  | } | 
    
    | 481 |  | static inline void set_origin_offset_z(Interp &interp, double value)  { | 
    
    | 482 |  |     interp._setup.origin_offset_z = value; | 
    
    | 483 |  | } | 
    
    | 484 |  | static inline double get_program_x (Interp &interp)  { | 
    
    | 485 |  |     return interp._setup.program_x; | 
    
    | 486 |  | } | 
    
    | 487 |  | static inline void set_program_x(Interp &interp, double value)  { | 
    
    | 488 |  |     interp._setup.program_x = value; | 
    
    | 489 |  | } | 
    
    | 490 |  | static inline double get_program_y (Interp &interp)  { | 
    
    | 491 |  |     return interp._setup.program_y; | 
    
    | 492 |  | } | 
    
    | 493 |  | static inline void set_program_y(Interp &interp, double value)  { | 
    
    | 494 |  |     interp._setup.program_y = value; | 
    
    | 495 |  | } | 
    
    | 496 |  | static inline double get_program_z (Interp &interp)  { | 
    
    | 497 |  |     return interp._setup.program_z; | 
    
    | 498 |  | } | 
    
    | 499 |  | static inline void set_program_z(Interp &interp, double value)  { | 
    
    | 500 |  |     interp._setup.program_z = value; | 
    
    | 501 |  | } | 
    
    | 502 | 8 | static inline double get_return_value (Interp &interp)  { | 
    
    | 503 | 8 |     return interp._setup.return_value; | 
    
    | 504 |  | } | 
    
    | 505 |  | static inline void set_return_value(Interp &interp, double value)  { | 
    
    | 506 |  |     interp._setup.return_value = value; | 
    
    | 507 |  | } | 
    
    | 508 |  | static inline double get_rotation_xy (Interp &interp)  { | 
    
    | 509 |  |     return interp._setup.rotation_xy; | 
    
    | 510 |  | } | 
    
    | 511 |  | static inline void set_rotation_xy(Interp &interp, double value)  { | 
    
    | 512 |  |     interp._setup.rotation_xy = value; | 
    
    | 513 |  | } | 
    
    | 514 |  | static inline double get_speed (Interp &interp)  { | 
    
    | 515 |  |     return interp._setup.speed; | 
    
    | 516 |  | } | 
    
    | 517 |  | static inline void set_speed(Interp &interp, double value)  { | 
    
    | 518 |  |     interp._setup.speed = value; | 
    
    | 519 |  | } | 
    
    | 520 |  | static inline double get_traverse_rate (Interp &interp)  { | 
    
    | 521 |  |     return interp._setup.traverse_rate; | 
    
    | 522 |  | } | 
    
    | 523 |  | static inline void set_traverse_rate(Interp &interp, double value)  { | 
    
    | 524 |  |     interp._setup.traverse_rate = value; | 
    
    | 525 |  | } | 
    
    | 526 |  | static inline double get_u_axis_offset (Interp &interp)  { | 
    
    | 527 |  |     return interp._setup.u_axis_offset; | 
    
    | 528 |  | } | 
    
    | 529 |  | static inline void set_u_axis_offset(Interp &interp, double value)  { | 
    
    | 530 |  |     interp._setup.u_axis_offset = value; | 
    
    | 531 |  | } | 
    
    | 532 |  | static inline double get_u_origin_offset (Interp &interp)  { | 
    
    | 533 |  |     return interp._setup.u_origin_offset; | 
    
    | 534 |  | } | 
    
    | 535 |  | static inline void set_u_origin_offset(Interp &interp, double value)  { | 
    
    | 536 |  |     interp._setup.u_origin_offset = value; | 
    
    | 537 |  | } | 
    
    | 538 |  | static inline double get_v_axis_offset (Interp &interp)  { | 
    
    | 539 |  |     return interp._setup.v_axis_offset; | 
    
    | 540 |  | } | 
    
    | 541 |  | static inline void set_v_axis_offset(Interp &interp, double value)  { | 
    
    | 542 |  |     interp._setup.v_axis_offset = value; | 
    
    | 543 |  | } | 
    
    | 544 |  | static inline double get_v_current(Interp &interp)  { | 
    
    | 545 |  |     return interp._setup.v_current; | 
    
    | 546 |  | } | 
    
    | 547 |  | static inline void set_v_current(Interp &interp, double value)  { | 
    
    | 548 |  |     interp._setup.v_current = value; | 
    
    | 549 |  | } | 
    
    | 550 |  | static inline double get_v_origin_offset (Interp &interp)  { | 
    
    | 551 |  |     return interp._setup.v_origin_offset; | 
    
    | 552 |  | } | 
    
    | 553 |  | static inline void set_v_origin_offset(Interp &interp, double value)  { | 
    
    | 554 |  |     interp._setup.v_origin_offset = value; | 
    
    | 555 |  | } | 
    
    | 556 |  | static inline double get_w_axis_offset (Interp &interp)  { | 
    
    | 557 |  |     return interp._setup.w_axis_offset; | 
    
    | 558 |  | } | 
    
    | 559 |  | static inline void set_w_axis_offset(Interp &interp, double value)  { | 
    
    | 560 |  |     interp._setup.w_axis_offset = value; | 
    
    | 561 |  | } | 
    
    | 562 |  | static inline double get_w_current (Interp &interp)  { | 
    
    | 563 |  |     return interp._setup.w_current; | 
    
    | 564 |  | } | 
    
    | 565 |  | static inline void set_w_current(Interp &interp, double value)  { | 
    
    | 566 |  |     interp._setup.w_current = value; | 
    
    | 567 |  | } | 
    
    | 568 |  | static inline double get_w_origin_offset (Interp &interp)  { | 
    
    | 569 |  |     return interp._setup.w_origin_offset; | 
    
    | 570 |  | } | 
    
    | 571 |  | static inline void set_w_origin_offset(Interp &interp, double value)  { | 
    
    | 572 |  |     interp._setup.w_origin_offset = value; | 
    
    | 573 |  | } | 
    
    | 574 |  | static inline int get_a_axis_wrapped (Interp &interp)  { | 
    
    | 575 |  |     return interp._setup.a_axis_wrapped; | 
    
    | 576 |  | } | 
    
    | 577 |  | static inline void set_a_axis_wrapped(Interp &interp, int value)  { | 
    
    | 578 |  |     interp._setup.a_axis_wrapped = value; | 
    
    | 579 |  | } | 
    
    | 580 |  | static inline int get_a_indexer (Interp &interp)  { | 
    
    | 581 |  |     return interp._setup.a_indexer_jnum; | 
    
    | 582 |  | } | 
    
    | 583 |  | static inline void set_a_indexer(Interp &interp, int value)  { | 
    
    | 584 |  |     interp._setup.a_indexer_jnum = value; | 
    
    | 585 |  | } | 
    
    | 586 |  | static inline int get_b_axis_wrapped (Interp &interp)  { | 
    
    | 587 |  |     return interp._setup.b_axis_wrapped; | 
    
    | 588 |  | } | 
    
    | 589 |  | static inline void set_b_axis_wrapped(Interp &interp, int value)  { | 
    
    | 590 |  |     interp._setup.b_axis_wrapped = value; | 
    
    | 591 |  | } | 
    
    | 592 |  | static inline int get_b_indexer (Interp &interp)  { | 
    
    | 593 |  |     return interp._setup.b_indexer_jnum; | 
    
    | 594 |  | } | 
    
    | 595 |  | static inline void set_b_indexer(Interp &interp, int value)  { | 
    
    | 596 |  |     interp._setup.b_indexer_jnum = value; | 
    
    | 597 |  | } | 
    
    | 598 |  | static inline int get_c_axis_wrapped (Interp &interp)  { | 
    
    | 599 |  |     return interp._setup.c_axis_wrapped; | 
    
    | 600 |  | } | 
    
    | 601 |  | static inline void set_c_axis_wrapped(Interp &interp, int value)  { | 
    
    | 602 |  |     interp._setup.c_axis_wrapped = value; | 
    
    | 603 |  | } | 
    
    | 604 |  | static inline int get_c_indexer (Interp &interp)  { | 
    
    | 605 |  |     return interp._setup.c_indexer_jnum; | 
    
    | 606 |  | } | 
    
    | 607 |  | static inline void set_c_indexer(Interp &interp, int value)  { | 
    
    | 608 |  |     interp._setup.c_indexer_jnum = value; | 
    
    | 609 |  | } | 
    
    | 610 |  | static inline int get_call_level (Interp &interp)  { | 
    
    | 611 |  |     return interp._setup.call_level; | 
    
    | 612 |  | } | 
    
    | 613 |  | static inline void set_call_level(Interp &interp, int value)  { | 
    
    | 614 |  |     interp._setup.call_level = value; | 
    
    | 615 |  | } | 
    
    | 616 |  | static inline int get_current_pocket (Interp &interp)  { | 
    
    | 617 |  |     return interp._setup.current_pocket; | 
    
    | 618 |  | } | 
    
    | 619 |  | static inline void set_current_pocket(Interp &interp, int value)  { | 
    
    | 620 |  |     interp._setup.current_pocket = value; | 
    
    | 621 |  | } | 
    
    | 622 |  | static inline int get_cutter_comp_orientation (Interp &interp)  { | 
    
    | 623 |  |     return interp._setup.cutter_comp_orientation; | 
    
    | 624 |  | } | 
    
    | 625 |  | static inline void set_cutter_comp_orientation(Interp &interp, int value)  { | 
    
    | 626 |  |     interp._setup.cutter_comp_orientation = value; | 
    
    | 627 |  | } | 
    
    | 628 |  | static inline int get_cutter_comp_side (Interp &interp)  { | 
    
    | 629 |  |     return interp._setup.cutter_comp_side; | 
    
    | 630 |  | } | 
    
    | 631 |  | static inline void set_cutter_comp_side(Interp &interp, int value)  { | 
    
    | 632 |  |     interp._setup.cutter_comp_side = value; | 
    
    | 633 |  | } | 
    
    | 634 |  | static inline int get_cycle_il_flag (Interp &interp)  { | 
    
    | 635 |  |     return interp._setup.cycle_il_flag; | 
    
    | 636 |  | } | 
    
    | 637 |  | static inline void set_cycle_il_flag(Interp &interp, int value)  { | 
    
    | 638 |  |     interp._setup.cycle_il_flag = value; | 
    
    | 639 |  | } | 
    
    | 640 |  | static inline int get_cycle_l (Interp &interp)  { | 
    
    | 641 |  |     return interp._setup.cycle_l; | 
    
    | 642 |  | } | 
    
    | 643 |  | static inline void set_cycle_l(Interp &interp, int value)  { | 
    
    | 644 |  |     interp._setup.cycle_l = value; | 
    
    | 645 |  | } | 
    
    | 646 |  | static inline int get_debugmask (Interp &interp)  { | 
    
    | 647 |  |     return interp._setup.debugmask; | 
    
    | 648 |  | } | 
    
    | 649 |  | static inline void set_debugmask(Interp &interp, int value)  { | 
    
    | 650 |  |     interp._setup.debugmask = value; | 
    
    | 651 |  | } | 
    
    | 652 |  | static inline int get_distance_mode (Interp &interp)  { | 
    
    | 653 |  |     return interp._setup.distance_mode; | 
    
    | 654 |  | } | 
    
    | 655 |  | static inline void set_distance_mode(Interp &interp, DISTANCE_MODE value)  { | 
    
    | 656 |  |     interp._setup.distance_mode = value; | 
    
    | 657 |  | } | 
    
    | 658 |  | static inline int get_feed_mode (Interp &interp)  { | 
    
    | 659 |  |     return interp._setup.feed_mode; | 
    
    | 660 |  | } | 
    
    | 661 |  | static inline void set_feed_mode(Interp &interp, int value)  { | 
    
    | 662 |  |     interp._setup.feed_mode = value; | 
    
    | 663 |  | } | 
    
    | 664 |  | static inline int get_ijk_distance_mode (Interp &interp)  { | 
    
    | 665 |  |     return interp._setup.ijk_distance_mode; | 
    
    | 666 |  | } | 
    
    | 667 |  | static inline void set_ijk_distance_mode(Interp &interp, DISTANCE_MODE value)  { | 
    
    | 668 |  |     interp._setup.ijk_distance_mode = value; | 
    
    | 669 |  | } | 
    
    | 670 |  | static inline int get_input_index (Interp &interp)  { | 
    
    | 671 |  |     return interp._setup.input_index; | 
    
    | 672 |  | } | 
    
    | 673 |  | static inline void set_input_index(Interp &interp, int value)  { | 
    
    | 674 |  |     interp._setup.input_index = value; | 
    
    | 675 |  | } | 
    
    | 676 |  | static inline int get_length_units (Interp &interp)  { | 
    
    | 677 |  |     return interp._setup.length_units; | 
    
    | 678 |  | } | 
    
    | 679 |  | static inline void set_length_units(Interp &interp, int value)  { | 
    
    | 680 |  |     interp._setup.length_units = value; | 
    
    | 681 |  | } | 
    
    | 682 |  | static inline int get_loggingLevel (Interp &interp)  { | 
    
    | 683 |  |     return interp._setup.loggingLevel; | 
    
    | 684 |  | } | 
    
    | 685 |  | static inline void set_loggingLevel(Interp &interp, int value)  { | 
    
    | 686 |  |     interp._setup.loggingLevel = value; | 
    
    | 687 |  | } | 
    
    | 688 |  | static inline int get_motion_mode (Interp &interp)  { | 
    
    | 689 |  |     return interp._setup.motion_mode; | 
    
    | 690 |  | } | 
    
    | 691 |  | static inline void set_motion_mode(Interp &interp, int value)  { | 
    
    | 692 |  |     interp._setup.motion_mode = value; | 
    
    | 693 |  | } | 
    
    | 694 |  | static inline int get_origin_index (Interp &interp)  { | 
    
    | 695 |  |     return interp._setup.origin_index; | 
    
    | 696 |  | } | 
    
    | 697 |  | static inline void set_origin_index(Interp &interp, int value)  { | 
    
    | 698 |  |     interp._setup.origin_index = value; | 
    
    | 699 |  | } | 
    
    | 700 |  | static inline int get_plane (Interp &interp)  { | 
    
    | 701 |  |     return interp._setup.plane; | 
    
    | 702 |  | } | 
    
    | 703 |  | static inline void set_plane(Interp &interp, int value)  { | 
    
    | 704 |  |     interp._setup.plane = value; | 
    
    | 705 |  | } | 
    
    | 706 |  | static inline int get_pockets_max (Interp &interp)  { | 
    
    | 707 |  |     return interp._setup.pockets_max; | 
    
    | 708 |  | } | 
    
    | 709 |  | static inline void set_pockets_max(Interp &interp, int value)  { | 
    
    | 710 |  |     interp._setup.pockets_max = value; | 
    
    | 711 |  | } | 
    
    | 712 |  | static inline int get_random_toolchanger (Interp &interp)  { | 
    
    | 713 |  |     return interp._setup.random_toolchanger; | 
    
    | 714 |  | } | 
    
    | 715 |  | static inline void set_random_toolchanger(Interp &interp, int value)  { | 
    
    | 716 |  |     interp._setup.random_toolchanger = value; | 
    
    | 717 |  | } | 
    
    | 718 |  | static inline int get_remap_level (Interp &interp)  { | 
    
    | 719 |  |     return interp._setup.remap_level; | 
    
    | 720 |  | } | 
    
    | 721 |  | static inline void set_remap_level(Interp &interp, int value)  { | 
    
    | 722 |  |     interp._setup.remap_level = value; | 
    
    | 723 |  | } | 
    
    | 724 |  | static inline int get_retract_mode (Interp &interp)  { | 
    
    | 725 |  |     return interp._setup.retract_mode; | 
    
    | 726 |  | } | 
    
    | 727 |  | static inline void set_retract_mode(Interp &interp, RETRACT_MODE value)  { | 
    
    | 728 |  |     interp._setup.retract_mode = value; | 
    
    | 729 |  | } | 
    
    | 730 |  | static inline int get_selected_pocket (Interp &interp)  { | 
    
    | 731 |  |     return interp._setup.selected_pocket; | 
    
    | 732 |  | } | 
    
    | 733 |  | static inline void set_selected_pocket(Interp &interp, int value)  { | 
    
    | 734 |  |     interp._setup.selected_pocket = value; | 
    
    | 735 |  | } | 
    
    | 736 |  | static inline int get_selected_tool (Interp &interp)  { | 
    
    | 737 |  |     return interp._setup.selected_tool; | 
    
    | 738 |  | } | 
    
    | 739 |  | static inline void set_selected_tool(Interp &interp, int value)  { | 
    
    | 740 |  |     interp._setup.selected_tool = value; | 
    
    | 741 |  | } | 
    
    | 742 |  | static inline int get_sequence_number (Interp &interp)  { | 
    
    | 743 |  |     return interp._setup.sequence_number; | 
    
    | 744 |  | } | 
    
    | 745 |  | static inline void set_sequence_number(Interp &interp, int value)  { | 
    
    | 746 |  |     interp._setup.sequence_number = value; | 
    
    | 747 |  | } | 
    
    | 748 |  | static inline int get_speed_feed_mode (Interp &interp)  { | 
    
    | 749 |  |     return interp._setup.speed_feed_mode; | 
    
    | 750 |  | } | 
    
    | 751 |  | static inline void set_speed_feed_mode(Interp &interp, int value)  { | 
    
    | 752 |  |     interp._setup.speed_feed_mode = value; | 
    
    | 753 |  | } | 
    
    | 754 |  | static inline int get_spindle_mode (Interp &interp)  { | 
    
    | 755 |  |     return interp._setup.spindle_mode; | 
    
    | 756 |  | } | 
    
    | 757 |  | static inline void set_spindle_mode(Interp &interp, SPINDLE_MODE value)  { | 
    
    | 758 |  |     interp._setup.spindle_mode = value; | 
    
    | 759 |  | } | 
    
    | 760 |  | static inline int get_spindle_turning (Interp &interp)  { | 
    
    | 761 |  |     return interp._setup.spindle_turning; | 
    
    | 762 |  | } | 
    
    | 763 |  | static inline void set_spindle_turning(Interp &interp, int value)  { | 
    
    | 764 |  |     interp._setup.spindle_turning = value; | 
    
    | 765 |  | } | 
    
    | 766 |  | static inline int get_stack_index (Interp &interp)  { | 
    
    | 767 |  |     return interp._setup.stack_index; | 
    
    | 768 |  | } | 
    
    | 769 |  | static inline void set_stack_index(Interp &interp, int value)  { | 
    
    | 770 |  |     interp._setup.stack_index = value; | 
    
    | 771 |  | } | 
    
    | 772 | 8 | static inline int get_value_returned (Interp &interp)  { | 
    
    | 773 | 8 |     return interp._setup.value_returned; | 
    
    | 774 |  | } | 
    
    | 775 |  | static inline void set_value_returned(Interp &interp, int value)  { | 
    
    | 776 |  |     interp._setup.value_returned = value; | 
    
    | 777 |  | } | 
    
    | 778 |  | static inline int get_current_tool(Interp &interp)  { | 
    
    | 779 |  |     return interp._setup.tool_table[0].toolno; | 
    
    | 780 |  | } | 
    
    | 781 |  | static inline void set_current_tool(Interp &interp, int value)  { | 
    
    | 782 |  |     interp._setup.tool_table[0].toolno = value; | 
    
    | 783 |  | } | 
    
    | 784 |  |  | 
    
    | 785 |  |  | 
    
    | 786 | 136 | BOOST_PYTHON_MODULE(interpreter) { | 
    
    | 787 |  |     using namespace boost::python; | 
    
    | 788 |  |     using namespace boost; | 
    
    | 789 |  |  | 
    
    | 790 | 136 |     scope().attr("__doc__") = | 
    
    | 791 |  |         "Interpreter introspection\n" | 
    
    | 792 | 68 |         ; | 
    
    | 793 | 204 |     scope().attr("throw_exceptions") = throw_exceptions; | 
    
    | 794 |  |  | 
    
    | 795 | 204 |     scope().attr("INTERP_OK") = INTERP_OK; | 
    
    | 796 | 204 |     scope().attr("INTERP_EXIT") = INTERP_EXIT; | 
    
    | 797 | 204 |     scope().attr("INTERP_EXECUTE_FINISH") = INTERP_EXECUTE_FINISH; | 
    
    | 798 | 204 |     scope().attr("INTERP_ENDFILE") = INTERP_ENDFILE; | 
    
    | 799 | 204 |     scope().attr("INTERP_FILE_NOT_OPEN") = INTERP_FILE_NOT_OPEN; | 
    
    | 800 | 204 |     scope().attr("INTERP_ERROR") = INTERP_ERROR; | 
    
    | 801 | 204 |     scope().attr("INTERP_MIN_ERROR") = INTERP_MIN_ERROR; | 
    
    | 802 | 204 |     scope().attr("TOLERANCE_EQUAL") = TOLERANCE_EQUAL; | 
    
    | 803 |  |  | 
    
    | 804 | 204 |     scope().attr("MODE_ABSOLUTE") = (int) MODE_ABSOLUTE; | 
    
    | 805 | 204 |     scope().attr("MODE_INCREMENTAL") = (int) MODE_INCREMENTAL; | 
    
    | 806 | 204 |     scope().attr("R_PLANE") =  (int) R_PLANE; | 
    
    | 807 | 204 |     scope().attr("OLD_Z") =  (int) OLD_Z; | 
    
    | 808 |  |  | 
    
    | 809 | 204 |     scope().attr("UNITS_PER_MINUTE") =  (int) UNITS_PER_MINUTE; | 
    
    | 810 | 204 |     scope().attr("INVERSE_TIME") =  (int) INVERSE_TIME; | 
    
    | 811 | 204 |     scope().attr("UNITS_PER_REVOLUTION") =  (int) UNITS_PER_REVOLUTION; | 
    
    | 812 |  |  | 
    
    | 813 | 204 |     scope().attr("RIGHT") = RIGHT; | 
    
    | 814 | 204 |     scope().attr("LEFT") = LEFT; | 
    
    | 815 | 204 |     scope().attr("CONSTANT_RPM") =  (int) CONSTANT_RPM; | 
    
    | 816 | 204 |     scope().attr("CONSTANT_SURFACE") =  (int) CONSTANT_SURFACE; | 
    
    | 817 |  |  | 
    
    | 818 | 68 |     def("equal", &__equal);  // EMC's perception of equality of doubles | 
    
    | 819 | 68 |     def("is_near_int", &is_near_int);  // EMC's perception of closeness to an int | 
    
    | 820 | 68 |     def("nearest_int", &nearest_int); | 
    
    | 821 |  |  | 
    
    | 822 | 68 |     export_EmcTypes(); | 
    
    | 823 | 68 |     export_ParamClass(); | 
    
    | 824 | 68 |     export_Internals(); | 
    
    | 825 | 68 |     export_Block(); | 
    
    | 826 | 68 |     class_<InterpreterException>InterpreterExceptionClass("InterpreterException",							bp::init<std::string, int, std::string>()); | 
    
    | 827 |  |     InterpreterExceptionClass | 
    
    | 828 | 68 | 	.add_property("error_message", &InterpreterException::get_error_message) | 
    
    | 829 | 136 | 	.add_property("line_number", &InterpreterException::get_line_number) | 
    
    | 830 | 68 | 	.add_property("line_text", &InterpreterException::get_line_text) | 
    
    | 831 | 136 | 	; | 
    
    | 832 |  |  | 
    
    | 833 | 68 |     InterpreterExceptionType = InterpreterExceptionClass.ptr(); | 
    
    | 834 |  |  | 
    
    | 835 |  |     bp::register_exception_translator<InterpreterException> | 
    
    | 836 | 68 | 	(&translateInterpreterException); | 
    
    | 837 |  |  | 
    
    | 838 |  |     class_< Interp, noncopyable >("Interp",no_init) | 
    
    | 839 |  |  | 
    
    | 840 | 136 | 	.def("find_tool_pocket", &wrap_find_tool_pocket) | 
    
    | 841 | 68 | 	.def("load_tool_table", &Interp::load_tool_table) | 
    
    | 842 | 136 | 	.def("set_tool_parameters", &Interp::set_tool_parameters) | 
    
    | 843 |  |  | 
    
    | 844 |  |  | 
    
    | 845 | 136 | 	.def("set_errormsg", &setErrorMsg) | 
    
    | 846 | 68 | 	.def("get_errormsg", &Interp::getSavedError) | 
    
    | 847 | 136 | 	.def("stack", &errorStack) | 
    
    | 848 | 68 | 	.def("synch", &Interp::synch) | 
    
    | 849 |  |  | 
    
    | 850 |  | 	// those will raise exceptions on return value < INTERP_MIN_ERROR  if throw_exceptions is set. | 
    
    | 851 | 136 | 	.def("execute", &wrap_interp_execute_1) | 
    
    | 852 | 68 | 	.def("execute",  &wrap_interp_execute_2) | 
    
    | 853 | 68 | 	.def("read", &wrap_interp_read) | 
    
    | 854 |  |  | 
    
    | 855 |  | 	// until I know better | 
    
    | 856 |  | 	//.def_readwrite("remaps",  &wrap_remaps) | 
    
    | 857 |  |  | 
    
    | 858 | 68 | 	.add_property("task", &get_task) // R/O | 
    
    | 859 | 68 | 	.add_property("filename", &get_filename) // R/O | 
    
    | 860 | 68 | 	.add_property("linetext", &get_linetext) // R/O | 
    
    | 861 | 68 | 	.add_property("tool_offset", &get_tool_offset, &set_tool_offset) | 
    
    | 862 | 68 | 	.add_property("arc_not_allowed", &get_arc_not_allowed, &set_arc_not_allowed) | 
    
    | 863 |  | 	.add_property("cutter_comp_firstmove", | 
    
    | 864 |  | 		      &get_cutter_comp_firstmove, | 
    
    | 865 | 68 | 		      &set_cutter_comp_firstmove) | 
    
    | 866 | 68 | 	.add_property("feed_override", &get_feed_override, &set_feed_override) | 
    
    | 867 | 68 | 	.add_property("input_digital", &get_input_digital, &set_input_digital) | 
    
    | 868 | 68 | 	.add_property("input_flag", &get_input_flag, &set_input_flag) | 
    
    | 869 | 68 | 	.add_property("mdi_interrupt", &get_mdi_interrupt, &set_mdi_interrupt) | 
    
    | 870 | 68 | 	.add_property("mist", &get_mist, &set_mist) | 
    
    | 871 | 68 | 	.add_property("percent_flag", &get_percent_flag, &set_percent_flag) | 
    
    | 872 | 68 | 	.add_property("probe_flag", &get_probe_flag, &set_probe_flag) | 
    
    | 873 | 68 | 	.add_property("speed_override", &get_speed_override, &set_speed_override) | 
    
    | 874 | 68 | 	.add_property("toolchange_flag", &get_toolchange_flag, &set_toolchange_flag) | 
    
    | 875 | 68 | 	.add_property("u_current", &get_u_current, &set_u_current) | 
    
    | 876 | 68 | 	.add_property("AA_axis_offset", &get_AA_axis_offset, &set_AA_axis_offset) | 
    
    | 877 | 68 | 	.add_property("AA_current", &get_AA_current, &set_AA_current) | 
    
    | 878 | 68 | 	.add_property("AA_origin_offset", &get_AA_origin_offset, &set_AA_origin_offset) | 
    
    | 879 | 68 | 	.add_property("BB_axis_offset", &get_BB_axis_offset, &set_BB_axis_offset) | 
    
    | 880 | 68 | 	.add_property("BB_current", &get_BB_current, &set_BB_current) | 
    
    | 881 | 68 | 	.add_property("BB_origin_offset", &get_BB_origin_offset, &set_BB_origin_offset) | 
    
    | 882 | 68 | 	.add_property("CC_axis_offset", &get_CC_axis_offset, &set_CC_axis_offset) | 
    
    | 883 | 68 | 	.add_property("CC_current", &get_CC_current, &set_CC_current) | 
    
    | 884 | 68 | 	.add_property("CC_origin_offset", &get_CC_origin_offset, &set_CC_origin_offset) | 
    
    | 885 | 68 | 	.add_property("axis_offset_x", &get_axis_offset_x, &set_axis_offset_x) | 
    
    | 886 | 68 | 	.add_property("axis_offset_y", &get_axis_offset_y, &set_axis_offset_y) | 
    
    | 887 | 68 | 	.add_property("axis_offset_z", &get_axis_offset_z, &set_axis_offset_z) | 
    
    | 888 | 68 | 	.add_property("current_x", &get_current_x, &set_current_x) | 
    
    | 889 | 68 | 	.add_property("current_y", &get_current_y, &set_current_y) | 
    
    | 890 | 68 | 	.add_property("current_z", &get_current_z, &set_current_z) | 
    
    | 891 | 68 | 	.add_property("cutter_comp_radius", &get_cutter_comp_radius, &set_cutter_comp_radius) | 
    
    | 892 | 68 | 	.add_property("cycle_cc", &get_cycle_cc, &set_cycle_cc) | 
    
    | 893 | 68 | 	.add_property("cycle_i", &get_cycle_i, &set_cycle_i) | 
    
    | 894 | 68 | 	.add_property("cycle_il", &get_cycle_il, &set_cycle_il) | 
    
    | 895 | 68 | 	.add_property("cycle_j", &get_cycle_j, &set_cycle_j) | 
    
    | 896 | 68 | 	.add_property("cycle_k", &get_cycle_k, &set_cycle_k) | 
    
    | 897 | 68 | 	.add_property("cycle_p", &get_cycle_p, &set_cycle_p) | 
    
    | 898 | 68 | 	.add_property("cycle_q", &get_cycle_q, &set_cycle_q) | 
    
    | 899 | 68 | 	.add_property("cycle_r", &get_cycle_r, &set_cycle_r) | 
    
    | 900 | 68 | 	.add_property("feed_rate", &get_feed_rate, &set_feed_rate) | 
    
    | 901 | 68 | 	.add_property("origin_offset_x", &get_origin_offset_x, &set_origin_offset_x) | 
    
    | 902 | 68 | 	.add_property("origin_offset_y", &get_origin_offset_y, &set_origin_offset_y) | 
    
    | 903 | 68 | 	.add_property("origin_offset_z", &get_origin_offset_z, &set_origin_offset_z) | 
    
    | 904 | 68 | 	.add_property("program_x", &get_program_x, &set_program_x) | 
    
    | 905 | 68 | 	.add_property("program_y", &get_program_y, &set_program_y) | 
    
    | 906 | 68 | 	.add_property("program_z", &get_program_z, &set_program_z) | 
    
    | 907 | 68 | 	.add_property("return_value", &get_return_value, &set_return_value) | 
    
    | 908 | 68 | 	.add_property("rotation_xy", &get_rotation_xy, &set_rotation_xy) | 
    
    | 909 | 68 | 	.add_property("speed", &get_speed, &set_speed) | 
    
    | 910 | 68 | 	.add_property("traverse_rate", &get_traverse_rate, &set_traverse_rate) | 
    
    | 911 | 68 | 	.add_property("u_axis_offset", &get_u_axis_offset, &set_u_axis_offset) | 
    
    | 912 | 68 | 	.add_property("u_origin_offset", &get_u_origin_offset, &set_u_origin_offset) | 
    
    | 913 | 68 | 	.add_property("v_axis_offset", &get_v_axis_offset, &set_v_axis_offset) | 
    
    | 914 | 68 | 	.add_property("v_current", &get_v_current, &set_v_current) | 
    
    | 915 | 68 | 	.add_property("v_origin_offset", &get_v_origin_offset, &set_v_origin_offset) | 
    
    | 916 | 68 | 	.add_property("w_axis_offset", &get_w_axis_offset, &set_w_axis_offset) | 
    
    | 917 | 68 | 	.add_property("w_current", &get_w_current, &set_w_current) | 
    
    | 918 | 68 | 	.add_property("w_origin_offset", &get_w_origin_offset, &set_w_origin_offset) | 
    
    | 919 | 68 | 	.add_property("a_axis_wrapped", &get_a_axis_wrapped, &set_a_axis_wrapped) | 
    
    | 920 | 68 | 	.add_property("a_indexer_jnum", &get_a_indexer, &set_a_indexer) | 
    
    | 921 | 68 | 	.add_property("b_axis_wrapped", &get_b_axis_wrapped, &set_b_axis_wrapped) | 
    
    | 922 | 68 | 	.add_property("b_indexer_jnum", &get_b_indexer, &set_b_indexer) | 
    
    | 923 | 68 | 	.add_property("c_axis_wrapped", &get_c_axis_wrapped, &set_c_axis_wrapped) | 
    
    | 924 | 68 | 	.add_property("c_indexer_jnum", &get_c_indexer, &set_c_indexer) | 
    
    | 925 | 68 | 	.add_property("call_level", &get_call_level, &set_call_level) | 
    
    | 926 | 68 | 	.add_property("current_pocket", &get_current_pocket, &set_current_pocket) | 
    
    | 927 |  | 	.add_property("cutter_comp_orientation", | 
    
    | 928 | 68 | 		      &get_cutter_comp_orientation, &set_cutter_comp_orientation) | 
    
    | 929 | 68 | 	.add_property("cutter_comp_side", &get_cutter_comp_side, &set_cutter_comp_side) | 
    
    | 930 | 68 | 	.add_property("cycle_il_flag", &get_cycle_il_flag, &set_cycle_il_flag) | 
    
    | 931 | 68 | 	.add_property("cycle_l", &get_cycle_l, &set_cycle_l) | 
    
    | 932 | 68 | 	.add_property("debugmask", &get_debugmask, &set_debugmask) | 
    
    | 933 | 68 | 	.add_property("distance_mode", &get_distance_mode, &set_distance_mode) | 
    
    | 934 | 68 | 	.add_property("feed_mode", &get_feed_mode, &set_feed_mode) | 
    
    | 935 | 68 | 	.add_property("ijk_distance_mode", &get_ijk_distance_mode, &set_ijk_distance_mode) | 
    
    | 936 | 68 | 	.add_property("input_index", &get_input_index, &set_input_index) | 
    
    | 937 | 68 | 	.add_property("length_units", &get_length_units, &set_length_units) | 
    
    | 938 | 68 | 	.add_property("loggingLevel", &get_loggingLevel, &set_loggingLevel) | 
    
    | 939 | 68 | 	.add_property("motion_mode", &get_motion_mode, &set_motion_mode) | 
    
    | 940 | 68 | 	.add_property("origin_index", &get_origin_index, &set_origin_index) | 
    
    | 941 | 68 | 	.add_property("plane", &get_plane, &set_plane) | 
    
    | 942 | 68 | 	.add_property("pockets_max", &get_pockets_max, &set_pockets_max) | 
    
    | 943 | 68 | 	.add_property("random_toolchanger", &get_random_toolchanger, &set_random_toolchanger) | 
    
    | 944 | 68 | 	.add_property("remap_level", &get_remap_level, &set_remap_level) | 
    
    | 945 | 68 | 	.add_property("retract_mode", &get_retract_mode, &set_retract_mode) | 
    
    | 946 | 68 | 	.add_property("selected_pocket", &get_selected_pocket, &set_selected_pocket) | 
    
    | 947 | 68 | 	.add_property("selected_tool", &get_selected_tool, &set_selected_tool) | 
    
    | 948 | 68 | 	.add_property("sequence_number", &get_sequence_number, &set_sequence_number) | 
    
    | 949 | 68 | 	.add_property("speed_feed_mode", &get_speed_feed_mode, &set_speed_feed_mode) | 
    
    | 950 | 68 | 	.add_property("spindle_mode", &get_spindle_mode, &set_spindle_mode) | 
    
    | 951 | 68 | 	.add_property("spindle_turning", &get_spindle_turning, &set_spindle_turning) | 
    
    | 952 | 68 | 	.add_property("stack_index", &get_stack_index, &set_stack_index) | 
    
    | 953 | 68 | 	.add_property("value_returned", &get_value_returned, &set_value_returned) | 
    
    | 954 |  |  | 
    
    | 955 | 68 | 	.add_property("current_tool", &get_current_tool, &set_current_tool) | 
    
    | 956 |  |  | 
    
    | 957 |  | 	.add_property( "params", | 
    
    | 958 |  | 		       bp::make_function( ¶m_wrapper, | 
    
    | 959 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 960 |  |  | 
    
    | 961 |  |  | 
    
    | 962 |  | 	// _setup arrays | 
    
    | 963 |  | 	.add_property( "active_g_codes", | 
    
    | 964 |  | 		       bp::make_function( active_g_codes_w(&active_g_codes_wrapper), | 
    
    | 965 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 966 |  | 	.add_property( "active_m_codes", | 
    
    | 967 |  | 		       bp::make_function( active_m_codes_w(&active_m_codes_wrapper), | 
    
    | 968 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 969 |  | 	.add_property( "active_settings", | 
    
    | 970 |  | 		       bp::make_function( active_settings_w(&active_settings_wrapper), | 
    
    | 971 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 972 |  | 	.add_property( "blocks", | 
    
    | 973 |  | 		       bp::make_function( blocks_w(&blocks_wrapper), | 
    
    | 974 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 975 |  | 	.add_property( "parameters", | 
    
    | 976 |  | 		       bp::make_function( parameters_w(¶meters_wrapper), | 
    
    | 977 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 978 |  | 	.add_property( "tool_table", | 
    
    | 979 |  | 		       bp::make_function( tool_table_w(&tool_table_wrapper), | 
    
    | 980 | 204 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 981 |  | 	.add_property( "sub_context", | 
    
    | 982 |  | 		       bp::make_function( sub_context_w(&sub_context_wrapper), | 
    
    | 983 | 136 | 					  bp::with_custodian_and_ward_postcall< 0, 1 >())) | 
    
    | 984 | 68 | 	; | 
    
    | 985 |  |  | 
    
    | 986 | 68 |     export_Arrays(); | 
    
    | 987 | 413 | } |