KiCad PCB EDA Suite
excellon_image.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2011-2016 Jean-Pierre Charras jp.charras at wanadoo.fr
5  * Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #ifndef EXCELLON_IMAGE_H
26 #define EXCELLON_IMAGE_H
27 
28 
32  DRILL_M_TOOL_DOWN, // tool down (starting a routed hole)
33  DRILL_M_TOOL_UP, // tool up (ending a routed hole)
58  DRILL_M_END_LIST // not used: sentinel
59 };
60 
61 
63  DRILL_G_UNKNOWN = DRILL_M_END_LIST+1, // Use next available value
74 };
75 
76 // Helper struct to analyse Excellon commands
78 {
79  std::string m_Name; // key string
80  int m_Code; // internal code, used as id in functions
81  int m_asParams; // 0 = no param, -1 = skip params, 1 = read params
82 };
83 
84 // Helper struct to store Excellon points in routing mode
85 #define ROUTE_CCW 1
86 #define ROUTE_CW -1
87 
89 {
90  int m_x; // X coordinate
91  int m_y; // y coordinate
92  int m_cx; // center X coordinate in circular routing mode
93  // (when the IJ commad is used)
94  int m_cy; // center y coordinate in circular routing mode
95  // (when the IJ commad is used)
96  int m_radius; // radius in circular routing mode (when the A## command is used)
97  int m_rmode; // routing mode: 0 = circular, ROUTE_CCW (1) = ccw, ROUTE_CW (-1) = cw
98  int m_arc_type_info; // arc using radius or center coordinates
99 
101  m_x( 0 ), m_y( 0 ), m_cx( 0 ), m_cy( 0 ), m_radius( 0 ),
102  m_rmode( 0 ), m_arc_type_info( 0 )
103  {}
104 
106  m_x( aPos.x ), m_y( aPos.y ),
107  m_cx( 0 ), m_cy( 0 ), m_radius( 0 ), m_rmode( 0 ),
108  m_arc_type_info( ARC_INFO_TYPE_NONE )
109  {}
110 
111  EXCELLON_ROUTE_COORD( const wxPoint& aPos, const wxPoint& aCenter, int aMode ):
112  m_x( aPos.x ), m_y( aPos.y ),
113  m_cx( aCenter.x ), m_cy( aCenter.y ), m_radius( 0 ), m_rmode( aMode ),
114  m_arc_type_info( ARC_INFO_TYPE_CENTER )
115  {}
116 
117  EXCELLON_ROUTE_COORD( const wxPoint& aPos, int aRadius, int aMode ):
118  m_x( aPos.x ), m_y( aPos.y ),
119  m_cx( 0 ), m_cy( 0 ), m_radius( aRadius ), m_rmode( aMode ),
120  m_arc_type_info( ARC_INFO_TYPE_RADIUS )
121  {}
122 
123  wxPoint GetPos() { return wxPoint( m_x, m_y ); }
124 };
125 
126 /* EXCELLON_IMAGE handle a drill image
127  * It is derived from GERBER_FILE_IMAGE because there is a lot of likeness
128  * between EXCELLON files and GERBER files
129  * DCode aperture are also similat to T Codes.
130  * So we can reuse GERBER_FILE_IMAGE to handle EXCELLON_IMAGE with very few new functions
131  */
132 
134 {
135 private:
137  READ_HEADER_STATE, // When we are in this state, we are reading header
138  READ_PROGRAM_STATE // When we are in this state, we are reading drill data
139  };
140 
141  excellon_state m_State; // state of excellon file analysis
142  bool m_SlotOn; // true during an oblong drill definition
143  // by G85 (canned slot) command
144  bool m_RouteModeOn; // true during a route mode (for instance a oval hole) or a cutout
145  std::vector<EXCELLON_ROUTE_COORD> m_RoutePositions; // The list of points in a route mode
146 
147 public: EXCELLON_IMAGE( int layer ) :
148  GERBER_FILE_IMAGE( layer )
149  {
150  m_State = READ_HEADER_STATE;
151  m_SlotOn = false;
152  m_RouteModeOn = false;
153  }
154 
155 
157 
158  virtual void ResetDefaultValues() override
159  {
161  SelectUnits( false );
162  }
163 
164 
172  bool LoadFile( const wxString& aFullFileName );
173 
174 private:
175  bool Execute_HEADER_And_M_Command( char*& text );
176  bool Select_Tool( char*& text );
177  bool Execute_EXCELLON_G_Command( char*& text );
178  bool Execute_Drill_Command( char*& text );
179 
183  bool readToolInformation( char*& aText );
184 
185  int TCodeNumber( char*& aText )
186  {
187  return DCodeNumber( aText );
188  }
189 
190 
191  void SelectUnits( bool aMetric );
192 };
193 
194 
195 /*
196  * EXCELLON commands are given here.
197  * Pcbnew uses only few excellon commands
198  */
199 
200 /*
201  * see http://www.excellon.com/manuals/program.htm
202  */
203 
204 /* coordintes units:
205  * Coordinates are measured either in inch or metric (millimeters).
206  * Inch coordinates are in six digits (00.0000) with increments as small as 0.0001 (1/10,000).
207  * Metric coordinates can be measured in microns (thousandths of a millimeter)
208  * in one of the following three ways:
209  * Five digit 10 micron resolution (000.00)
210  * Six digit 10 micron resolution (0000.00)
211  * Six digit micron resolution (000.000)
212  *
213  * Leading and trailing zeros:
214  * Excellon (CNC-7) uses inches in six digits and metric in five or six digits.
215  * The zeros to the left of the coordinate are called leading zeros (LZ).
216  * The zeros to right of the coordinate are called trailing zeros (TZ).
217  * The CNC-7 uses leading zeros unless you specify otherwise through a part program.
218  * You can do so with the INCH/METRIC command.
219  * With leading zeros, the leading zeros must always be included.
220  * Trailing zeros are unneeded and may be left off.
221  * For trailing zeros, the reverse of the above is true.
222  */
223 
224 /*
225  * EXCELLON Commands Used in a Header
226  * The following table provides you with a list of commands which
227  * are the most used in a part program header.
228  * COMMAND DESCRIPTION
229  * AFS Automatic Feeds and Speeds
230  * ATC Automatic Tool Change
231  * BLKD Delete all Blocks starting with a slash (/)
232  * CCW Clockwise or Counter-clockwise Routing
233  * CP Cutter Compensation
234  * DETECT Broken Tool Detection
235  * DN Down Limit Set
236  * DTMDIST Maximum Rout Distance Before Toolchange
237  * EXDA Extended Drill Area
238  * FMAT Format 1 or 2
239  * FSB Turns the Feed/Speed Buttons off
240  * HPCK Home Pulse Check
241  * ICI Incremental Input of Part Program Coordinates
242  * INCH Measure Everything in Inches
243  * METRIC Measure Everything in Metric
244  * M48 Beginning of Part Program Header
245  * M95 End of Header
246  * NCSL NC Slope Enable/Disable
247  * OM48 Override Part Program Header
248  * OSTOP Optional Stop Switch
249  * OTCLMP Override Table Clamp
250  * PCKPARAM Set up pecking tool,depth,infeed and retract parameters
251  * PF Floating Pressure Foot Switch
252  * PPR Programmable Plunge Rate Enable
253  * PVS Pre-vacuum Shut-off Switch
254  * R,C Reset Clocks
255  * R,CP Reset Program Clocks
256  * R,CR Reset Run Clocks
257  * R,D Reset All Cutter Distances
258  * R,H Reset All Hit Counters
259  * R,T Reset Tool Data
260  * SBK Single Block Mode Switch
261  * SG Spindle Group Mode
262  * SIXM Input From External Source
263  * T Tool Information
264  * TCST Tool Change Stop
265  * UP Upper Limit Set
266  * VER Selection of X and Y Axis Version
267  * Z Zero Set
268  * ZA Auxiliary Zero
269  * ZC Zero Correction
270  * ZS Zero Preset
271  * Z+# or Z-# Set Depth Offset
272  * % Rewind Stop
273  * #/#/# Link Tool for Automatic Tool Change
274  * / Clear Tool Linking
275  */
276 
277 /*
278  * Beyond The Header: The Part Program Body
279  * COMMAND DESCRIPTION
280  * A# Arc Radius
281  * B# Retract Rate
282  * C# Tool Diameter
283  * F# Table Feed Rate;Z Axis Infeed Rate
284  * G00X#Y# Route Mode; XY is the starting point
285  * G01X#Y# Linear (Straight Line) Route Mode YX is the ending point
286  * G02X#Y#... Circular CW Mode. Radius value (A#) or Center position (I#J#) follows
287  * G03X#Y#... Circular CCW Mode. Radius value (A#) or Center position (I#J#) follows
288  * G04 X# Variable Dwell
289  * G05 Drill Mode
290  * G07 Override current tool feed or speed
291  * G32X#Y#A# Routed Circle Canned Cycle
292  * CW G33X#Y#A# Routed Circle Canned Cycle
293  * CCW G34,#(,#) Select Vision Tool
294  * G35(X#Y#) Single Point Vision Offset (Relative to Work Zero)
295  * G36(X#Y#) Multipoint Vision Translation (Relative to Work Zero)
296  * G37 Cancel Vision Translation or Offset (From G35 or G36)
297  * G38(X#Y#) Vision Corrected Single Hole Drilling (Relative to Work Zero)
298  * G39(X#Y#) Vision System Autocalibration
299  * G40 Cutter Compensation Off
300  * G41 Cutter Compensation Left
301  * G42 Cutter Compensation Right
302  * G45(X#Y#) Single Point Vision Offset (Relative to G35 or G36)
303  * G46(X#Y#) Multipoint Vision Translation (Relative to G35 or G36)
304  * G47 Cancel Vision Translation or Offset (From G45 or G46)
305  * G48(X#Y#) Vision Corrected Single Hole Drilling (Relative to G35 or G36)
306  * G82(G81) Dual In Line Package
307  * G83 Eight Pin L Pack
308  * G84 Circle
309  * G85 Slot
310  * G87 Routed Step Slot Canned Cycle
311  * G90 Absolute Mode
312  * G91 Incremental Input Mode
313  * G93X#Y# Zero Set
314  * H# Maximum hit count
315  * I#J# Arc Center Offset
316  * M00(X#Y#) End of Program - No Rewind
317  * M01 End of Pattern
318  * M02X#Y# Repeat Pattern Offset
319  * M06(X#Y#) Optional Stop
320  * M08 End of Step and Repeat
321  * M09(X#Y#) Stop for Inspection
322  * M14 Z Axis Route Position With Depth Controlled Contouring
323  * M15 Z Axis Route Position
324  * M16 Retract With Clamping
325  * M17 Retract Without Clamping
326  * M18 Command tool tip check
327  * M25 Beginning of Pattern
328  * M30(X#Y#) End of Program Rewind
329  * M45,long message\ Long Operator message on multiple\ part program lines
330  * M47,text Operator Message
331  * M50,# Vision Step and Repeat Pattern Start
332  * M51,# Vision Step and Repeat Rewind
333  * M52(#) Vision Step and Repeat Offset Counter Control
334  * M02XYM70 Swap Axes
335  * M60 Reference Scaling enable
336  * M61 Reference Scaling disable
337  * M62 Turn on peck drilling
338  * M63 Turn off peck drilling
339  * M71 Metric Measuring Mode
340  * M72 Inch Measuring Mode
341  * M02XYM80 Mirror Image X Axis
342  * M02XYM90 Mirror Image Y Axis
343  * M97,text Canned Text
344  * M98,text Canned Text
345  * M99,subprogram User Defined Stored Pattern
346  * P#X#(Y#) Repeat Stored Pattern
347  * R#M02X#Y# Repeat Pattern (S&R)
348  * R#(X#Y#) Repeat Hole
349  * S# Spindle RPM
350  * T# Tool Selection; Cutter Index
351  * Z+# or Z-# Depth Offset
352  * % Beginning of Pattern (see M25 command)
353  * / Block Delete
354  */
355 
356 /*
357  * Example of a Header
358  * COMMAND PURPOSE
359  * M48 The beginning of a header
360  * INCH,LZ Use the inch measuring system with leading zeros
361  * VER,1 Use Version 1 X and Y axis layout
362  * FMAT,2 Use Format 2 commands
363  * 1/2/3 Link tools 1, 2, and 3
364  * T1C.04F200S65 Set Tool 1 for 0.040" with infeed rate of 200 inch/min Speed of 65,000 RPM
365  * DETECT,ON Detect broken tools
366  * M95 End of the header
367  */
368 
369 #endif // EXCELLON_IMAGE_H
EXCELLON_ROUTE_COORD(const wxPoint &aPos, const wxPoint &aCenter, int aMode)
virtual void ResetDefaultValues() override
Class GERBER_FILE_IMAGE holds the Image data and parameters for one gerber file and layer parameters ...
EXCELLON_ROUTE_COORD(const wxPoint &aPos, int aRadius, int aMode)
std::string m_Name
EXCELLON_IMAGE(int layer)
excellon_state m_State
int TCodeNumber(char *&aText)
EXCELLON_ROUTE_COORD(const wxPoint &aPos)
drill_M_code_t
std::vector< EXCELLON_ROUTE_COORD > m_RoutePositions
drill_G_code_t
virtual void ResetDefaultValues()