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-2021 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
29
30
34 DRILL_M_TOOL_DOWN, // tool down (starting a routed hole)
35 DRILL_M_TOOL_UP, // tool up (ending a routed hole)
62 DRILL_M_END_LIST // not used: sentinel
63};
64
65
67 DRILL_G_UNKNOWN = DRILL_M_END_LIST+1, // Use next available value
78};
79
80// Helper struct to analyze Excellon commands
82{
83 std::string m_Name; // key string
84 int m_Code; // internal code, used as id in functions
85 int m_asParams; // 0 = no param, -1 = skip params, 1 = read params
86};
87
88// Helper struct to store Excellon points in routing mode
89#define ROUTE_CCW 1
90#define ROUTE_CW -1
91
93{
94 int m_x; // X coordinate
95 int m_y; // y coordinate
96 int m_cx; // center X coordinate in circular routing mode
97 // (when the IJ command is used)
98 int m_cy; // center y coordinate in circular routing mode
99 // (when the IJ command is used)
100 int m_radius; // radius in circular routing mode (when the A## command is used)
101 int m_rmode; // routing mode: 0 = circular, ROUTE_CCW (1) = ccw, ROUTE_CW (-1) = cw
102 int m_arc_type_info; // arc using radius or center coordinates
103
105 m_x( 0 ), m_y( 0 ), m_cx( 0 ), m_cy( 0 ), m_radius( 0 ),
106 m_rmode( 0 ), m_arc_type_info( 0 )
107 {}
108
110 m_x( aPos.x ), m_y( aPos.y ),
111 m_cx( 0 ), m_cy( 0 ), m_radius( 0 ), m_rmode( 0 ),
113 {}
114
115 EXCELLON_ROUTE_COORD( const VECTOR2I& aPos, const VECTOR2I& aCenter, int aMode ) :
116 m_x( aPos.x ), m_y( aPos.y ),
117 m_cx( aCenter.x ), m_cy( aCenter.y ), m_radius( 0 ), m_rmode( aMode ),
119 {}
120
121 EXCELLON_ROUTE_COORD( const VECTOR2I& aPos, int aRadius, int aMode ) :
122 m_x( aPos.x ), m_y( aPos.y ),
123 m_cx( 0 ), m_cy( 0 ), m_radius( aRadius ), m_rmode( aMode ),
125 {}
126
127 VECTOR2I GetPos() { return VECTOR2I( m_x, m_y ); }
128};
129
138{
139public: EXCELLON_IMAGE( int layer ) :
140 GERBER_FILE_IMAGE( layer )
141 {
143 m_SlotOn = false;
144 m_RouteModeOn = false;
145 m_hasFormat = false;
146 }
147
148
150
154 virtual void ResetDefaultValues() override;
155
156
165 static bool TestFileIsExcellon( const wxString& aFullFileName );
166
176 bool LoadFile( const wxString& aFullFileName, EXCELLON_DEFAULTS* aDefaults );
177
178private:
179 bool Execute_HEADER_And_M_Command( char*& text );
180 bool Select_Tool( char*& text );
181 bool Execute_EXCELLON_G_Command( char*& text );
182 bool Execute_Drill_Command( char*& text );
183
190 void readFileFormat( char*& aText );
191
196 bool readToolInformation( char*& aText );
197
201 void FinishRouteCommand();
202
206 void SelectUnits( bool aMetric, EXCELLON_DEFAULTS* aDefaults );
207
208private:
210 READ_HEADER_STATE, // When we are in this state, we are reading header
211 READ_PROGRAM_STATE // When we are in this state, we are reading drill data
212 };
213
214 EXCELLON_STATE m_State; // state of excellon file analysis
215 bool m_SlotOn; // true during an oblong drill definition
216 // by G85 (canned slot) command
217 bool m_RouteModeOn; // true during a route mode (for instance a oval hole) or
218 // a cutout.
219 std::vector<EXCELLON_ROUTE_COORD> m_RoutePositions; // The list of points in a route mode
220
226};
227
228
229/*
230 * EXCELLON commands are given here.
231 * Pcbnew uses only few excellon commands
232 */
233
234/*
235 * see http://www.excellon.com/manuals/program.htm
236 */
237
238/* coordinates units:
239 * Coordinates are measured either in inch or metric (millimeters).
240 * Inch coordinates are in six digits (00.0000) with increments as small as 0.0001 (1/10,000).
241 * Metric coordinates can be measured in microns (thousandths of a millimeter)
242 * in one of the following three ways:
243 * Five digit 10 micron resolution (000.00)
244 * Six digit 10 micron resolution (0000.00)
245 * Six digit micron resolution (000.000)
246 *
247 * Leading and trailing zeros:
248 * Excellon (CNC-7) uses inches in six digits and metric in five or six digits.
249 * The zeros to the left of the coordinate are called leading zeros (LZ).
250 * The zeros to right of the coordinate are called trailing zeros (TZ).
251 * The CNC-7 uses leading zeros unless you specify otherwise through a part program.
252 * You can do so with the INCH/METRIC command.
253 * With leading zeros, the leading zeros must always be included.
254 * Trailing zeros are unneeded and may be left off.
255 * For trailing zeros, the reverse of the above is true.
256 */
257
258/*
259 * EXCELLON Commands Used in a Header
260 * The following table provides you with a list of commands which
261 * are the most used in a part program header.
262 * COMMAND DESCRIPTION
263 * AFS Automatic Feeds and Speeds
264 * ATC Automatic Tool Change
265 * BLKD Delete all Blocks starting with a slash (/)
266 * CCW Clockwise or Counter-clockwise Routing
267 * CP Cutter Compensation
268 * DETECT Broken Tool Detection
269 * DN Down Limit Set
270 * DTMDIST Maximum Rout Distance Before Toolchange
271 * EXDA Extended Drill Area
272 * FMAT Format 1 or 2
273 * FSB Turns the Feed/Speed Buttons off
274 * HPCK Home Pulse Check
275 * ICI Incremental Input of Part Program Coordinates
276 * INCH Measure Everything in Inches
277 * METRIC Measure Everything in Metric
278 * M48 Beginning of Part Program Header
279 * M95 End of Header
280 * NCSL NC Slope Enable/Disable
281 * OM48 Override Part Program Header
282 * OSTOP Optional Stop Switch
283 * OTCLMP Override Table Clamp
284 * PCKPARAM Set up pecking tool,depth,infeed and retract parameters
285 * PF Floating Pressure Foot Switch
286 * PPR Programmable Plunge Rate Enable
287 * PVS Pre-vacuum Shut-off Switch
288 * R,C Reset Clocks
289 * R,CP Reset Program Clocks
290 * R,CR Reset Run Clocks
291 * R,D Reset All Cutter Distances
292 * R,H Reset All Hit Counters
293 * R,T Reset Tool Data
294 * SBK Single Block Mode Switch
295 * SG Spindle Group Mode
296 * SIXM Input From External Source
297 * T Tool Information
298 * TCST Tool Change Stop
299 * UP Upper Limit Set
300 * VER Selection of X and Y Axis Version
301 * Z Zero Set
302 * ZA Auxiliary Zero
303 * ZC Zero Correction
304 * ZS Zero Preset
305 * Z+# or Z-# Set Depth Offset
306 * % Rewind Stop
307 * #/#/# Link Tool for Automatic Tool Change
308 * / Clear Tool Linking
309 */
310
311/*
312 * Beyond The Header: The Part Program Body
313 * COMMAND DESCRIPTION
314 * A# Arc Radius
315 * B# Retract Rate
316 * C# Tool Diameter
317 * F# Table Feed Rate;Z Axis Infeed Rate
318 * G00X#Y# Route Mode; XY is the starting point
319 * G01X#Y# Linear (Straight Line) Route Mode YX is the ending point
320 * G02X#Y#... Circular CW Mode. Radius value (A#) or Center position (I#J#) follows
321 * G03X#Y#... Circular CCW Mode. Radius value (A#) or Center position (I#J#) follows
322 * G04X# Variable Dwell
323 * G05 Drill Mode
324 * G07 Override current tool feed or speed
325 * G32X#Y#A# Routed Circle Canned Cycle
326 * CW G33X#Y#A# Routed Circle Canned Cycle
327 * CCW G34,#(,#) Select Vision Tool
328 * G35(X#Y#) Single Point Vision Offset (Relative to Work Zero)
329 * G36(X#Y#) Multipoint Vision Translation (Relative to Work Zero)
330 * G37 Cancel Vision Translation or Offset (From G35 or G36)
331 * G38(X#Y#) Vision Corrected Single Hole Drilling (Relative to Work Zero)
332 * G39(X#Y#) Vision System Autocalibration
333 * G40 Cutter Compensation Off
334 * G41 Cutter Compensation Left
335 * G42 Cutter Compensation Right
336 * G45(X#Y#) Single Point Vision Offset (Relative to G35 or G36)
337 * G46(X#Y#) Multipoint Vision Translation (Relative to G35 or G36)
338 * G47 Cancel Vision Translation or Offset (From G45 or G46)
339 * G48(X#Y#) Vision Corrected Single Hole Drilling (Relative to G35 or G36)
340 * G82(G81) Dual In Line Package
341 * G83 Eight Pin L Pack
342 * G84 Circle
343 * G85 Slot
344 * G87 Routed Step Slot Canned Cycle
345 * G90 Absolute Mode
346 * G91 Incremental Input Mode
347 * G93X#Y# Zero Set
348 * H# Maximum hit count
349 * I#J# Arc Center Offset
350 * M00(X#Y#) End of Program - No Rewind
351 * M01 End of Pattern
352 * M02X#Y# Repeat Pattern Offset
353 * M06(X#Y#) Optional Stop
354 * M08 End of Step and Repeat
355 * M09(X#Y#) Stop for Inspection
356 * M14 Z Axis Route Position With Depth Controlled Contouring
357 * M15 Z Axis Route Position
358 * M16 Retract With Clamping
359 * M17 Retract Without Clamping
360 * M18 Command tool tip check
361 * M25 Beginning of Pattern
362 * M30(X#Y#) End of Program Rewind
363 * M45,long message\ Long Operator message on multiple\ part program lines
364 * M47,text Operator Message
365 * M50,# Vision Step and Repeat Pattern Start
366 * M51,# Vision Step and Repeat Rewind
367 * M52(#) Vision Step and Repeat Offset Counter Control
368 * M02XYM70 Swap Axes
369 * M60 Reference Scaling enable
370 * M61 Reference Scaling disable
371 * M62 Turn on peck drilling
372 * M63 Turn off peck drilling
373 * M71 Metric Measuring Mode
374 * M72 Inch Measuring Mode
375 * M02XYM80 Mirror Image X Axis
376 * M02XYM90 Mirror Image Y Axis
377 * M97,text Canned Text
378 * M98,text Canned Text
379 * M99,subprogram User Defined Stored Pattern
380 * P#X#(Y#) Repeat Stored Pattern
381 * R#M02X#Y# Repeat Pattern (S&R)
382 * R#(X#Y#) Repeat Hole
383 * S# Spindle RPM
384 * T# Tool Selection; Cutter Index
385 * Z+# or Z-# Depth Offset
386 * % Beginning of Pattern (see M25 command)
387 * / Block Delete
388 */
389
390/*
391 * Example of a Header
392 * COMMAND PURPOSE
393 * M48 The beginning of a header
394 * INCH,LZ Use the inch measuring system with leading zeros
395 * VER,1 Use Version 1 X and Y axis layout
396 * FMAT,2 Use Format 2 commands
397 * 1/2/3 Link tools 1, 2, and 3
398 * T1C.04F200S65 Set Tool 1 for 0.040" with infeed rate of 200 inch/min Speed of 65,000 RPM
399 * DETECT,ON Detect broken tools
400 * M95 End of the header
401 */
402
403#endif // EXCELLON_IMAGE_H
Handle a drill image.
void readFileFormat(char *&aText)
Read an Altium-specific FILE_FORMAT=X:X attribute that specifies the length and mantissa of the numbe...
static bool TestFileIsExcellon(const wxString &aFullFileName)
Performs a heuristics-based check of whether the file is an Excellon drill file.
bool LoadFile(const wxString &aFullFileName, EXCELLON_DEFAULTS *aDefaults)
Read and load a drill (EXCELLON format) file.
bool Execute_Drill_Command(char *&text)
void FinishRouteCommand()
End a route command started by M15 ot G01, G02 or G03 command.
EXCELLON_STATE m_State
bool Execute_HEADER_And_M_Command(char *&text)
bool Execute_EXCELLON_G_Command(char *&text)
bool m_hasFormat
Excellon file do not have a format statement to specify the coordinate format like nn:mm.
bool readToolInformation(char *&aText)
Read a tool definition like T1C0.02 or T1F00S00C0.02 or T1C0.02F00S00 and enter params in TCODE list.
virtual void ResetDefaultValues() override
Set all parameters to a default value, before reading a file.
std::vector< EXCELLON_ROUTE_COORD > m_RoutePositions
bool Select_Tool(char *&text)
void SelectUnits(bool aMetric, EXCELLON_DEFAULTS *aDefaults)
Switch unit selection, and the coordinate format (nn:mm) if not yet set.
EXCELLON_IMAGE(int layer)
Hold the image data and parameters for one gerber file and layer parameters.
drill_G_code_t
@ DRILL_G_CWMOVE
@ DRILL_G_ZERO_SET
@ DRILL_G_INCREMENTAL
@ DRILL_G_ZEROSET
@ DRILL_G_DRILL
@ DRILL_G_LINEARMOVE
@ DRILL_G_ABSOLUTE
@ DRILL_G_SLOT
@ DRILL_G_ROUT
@ DRILL_G_UNKNOWN
@ DRILL_G_CCWMOVE
drill_M_code_t
@ DRILL_M_UNKNOWN
@ DRILL_M_TOOL_UP
@ DRILL_SKIP
@ DRILL_M_ENDPATTERN
@ DRILL_M_TOOL_DOWN
@ DRILL_AUTOMATIC_SPEED
@ DRILL_M_END
@ DRILL_TOOL_CHANGE_STOP
@ DRILL_TOOL_INFORMATION
@ DRILL_AUTOMATIC_TOOL_CHANGE
@ DRILL_M_ENDHEADER
@ DRILL_M_HEADER
@ DRILL_FORMAT_ALTIUM
@ DRILL_M_METRIC
@ DRILL_DETECT_BROKEN
@ DRILL_HEADER_SKIP
@ DRILL_REWIND_STOP
@ DRILL_M_TIPCHECK
@ DRILL_M_LONGMESSAGE
@ DRILL_INCREMENTALHEADER
@ DRILL_AXIS_VERSION
@ DRILL_RESET_CMD
@ DRILL_M_MESSAGE
@ DRILL_METRIC_HEADER
@ DRILL_M_END_LIST
@ DRILL_M_BEGINPATTERN
@ DRILL_IMPERIAL_HEADER
@ DRILL_M_ENDFILE
@ DRILL_FMT
@ DRILL_M_CANNEDTEXT
@ DRILL_M_IMPERIAL
@ ARC_INFO_TYPE_NONE
@ ARC_INFO_TYPE_RADIUS
@ ARC_INFO_TYPE_CENTER
std::string m_Name
management of default values used to read a Excellon (.nc) drill file Some important parameters are n...
EXCELLON_ROUTE_COORD(const VECTOR2I &aPos, const VECTOR2I &aCenter, int aMode)
EXCELLON_ROUTE_COORD(const VECTOR2I &aPos)
EXCELLON_ROUTE_COORD(const VECTOR2I &aPos, int aRadius, int aMode)
VECTOR2< int > VECTOR2I
Definition: vector2d.h:607