203 lines
6.3 KiB
C++
203 lines
6.3 KiB
C++
/******************************************/
|
|
/* Kicad: Common plot GERBER Routines */
|
|
/******************************************/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
#include "trigo.h"
|
|
#include "wxstruct.h"
|
|
#include "base_struct.h"
|
|
#include "common.h"
|
|
#include "plot_common.h"
|
|
#include "macros.h"
|
|
#include "kicad_string.h"
|
|
|
|
|
|
/***************************************************************************/
|
|
void InitPlotParametresGERBER( wxPoint aOffset, double aXScale, double aYScale )
|
|
/***************************************************************************/
|
|
|
|
/** function InitPlotParametresGERBER
|
|
* Set the plot offset for the current plotting
|
|
* @param aOffset = plot offset
|
|
* @param aXScale,aYScale = coordinate scale (scale coefficient for coordinates)
|
|
*/
|
|
{
|
|
g_Plot_PlotOrientOptions = 0;
|
|
g_Plot_PlotOffset = aOffset;
|
|
g_Plot_XScale = aXScale;
|
|
g_Plot_YScale = aYScale;
|
|
g_Plot_DefaultPenWidth = 120; /* epaisseur du trait standard en 1/1000 pouce */
|
|
g_Plot_CurrentPenWidth = -1;
|
|
}
|
|
|
|
|
|
/******************************************************************/
|
|
void Write_Header_GERBER( const wxString aTitle, FILE* aFile )
|
|
/******************************************************************/
|
|
/** Function Write_Header_GERBER
|
|
* Write GERBER header to file
|
|
* initialize global variable g_Plot_PlotOutputFile
|
|
* @param aTitle: the name of creator (comment)
|
|
* @param aFile: an opened file to write to
|
|
*/
|
|
{
|
|
char Line[1024];
|
|
g_Plot_PlotOutputFile = aFile;
|
|
|
|
DateAndTime( Line );
|
|
wxString Title = aTitle + wxT( " " ) + GetBuildVersion();
|
|
fprintf( g_Plot_PlotOutputFile, "G04 (created by %s) date %s*\n", CONV_TO_UTF8( Title ), Line );
|
|
|
|
// Specify linear interpol (G01), unit = INCH (G70), abs format (G90):
|
|
fputs( "G01*\nG70*\nG90*\n", g_Plot_PlotOutputFile );
|
|
fputs( "%MOIN*%\n", g_Plot_PlotOutputFile ); // set unites = INCHES
|
|
|
|
/* Set gerber format to 3.4 */
|
|
fputs( "G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n%FSLAX34Y34*%\n",
|
|
g_Plot_PlotOutputFile);
|
|
|
|
fputs( "G04 APERTURE LIST*\n", g_Plot_PlotOutputFile );
|
|
}
|
|
|
|
|
|
/**********************************************/
|
|
void LineTo_GERBER( wxPoint aPos, int aCommand )
|
|
/**********************************************/
|
|
/** Function LineTo_GERBER
|
|
* if aCommand = 'U' initialise the starting point of a line
|
|
* if aCommand = 'D' draw a line from the starting point, or last point to aPos
|
|
* @param aPos = end of the current line.
|
|
* @param aCommand = 'U' or 'D' or 'Z' (Pen up , no moving )
|
|
*/
|
|
{
|
|
static wxPoint LastPoint;
|
|
switch ( aCommand )
|
|
{
|
|
case 'Z':
|
|
return;
|
|
|
|
case 'U':
|
|
break;
|
|
|
|
case 'D':
|
|
PlotGERBERLine( LastPoint, aPos, g_Plot_CurrentPenWidth );
|
|
}
|
|
LastPoint = aPos;
|
|
}
|
|
|
|
/** Function PlotGERBERLine
|
|
* Plot a line
|
|
* the D_CODE **MUST** have already selected (this is just the line plot)
|
|
* @param aStartPos = starting point of the line
|
|
* @param aEndPos = ending point of the line
|
|
* @param aThickness = line thickness (not used here)
|
|
*/
|
|
void PlotGERBERLine( wxPoint aStartPos, wxPoint aEndPos, int aThickness )
|
|
{
|
|
UserToDeviceCoordinate( aStartPos );
|
|
UserToDeviceCoordinate( aEndPos );
|
|
fprintf( g_Plot_PlotOutputFile, "X%5.5dY%5.5dD02*\n", aStartPos.x, aStartPos.y );
|
|
fprintf( g_Plot_PlotOutputFile, "X%5.5dY%5.5dD01*\n", aEndPos.x, aEndPos.y );
|
|
}
|
|
|
|
|
|
/********************************************************************/
|
|
void PlotCircle_GERBER( wxPoint aCentre, int aRadius, int aWidth )
|
|
/********************************************************************/
|
|
/** Function PlotCircle_GERBER
|
|
* writes a non filled circle to output file
|
|
* Plot one circle as segments (6 to 16 depending on its radius
|
|
* @param aCentre = centre coordintes
|
|
* @param aRadius = radius of the circle
|
|
* @param aWidth = line width (noc currently used, D_CODEs must be selected before)
|
|
*/
|
|
{
|
|
int ii;
|
|
wxPoint start, end;
|
|
int delta; /* increment (in 0.1 degrees) to draw circles */
|
|
|
|
delta = 3600/32; /* there are delta segments for draw a circle */
|
|
|
|
start.x = aCentre.x + aRadius;
|
|
start.y = aCentre.y;
|
|
for( ii = delta; ii < 3600; ii += delta )
|
|
{
|
|
end.x = aCentre.x + (int) (aRadius * fcosinus[ii]);
|
|
end.y = aCentre.y + (int) (aRadius * fsinus[ii]);
|
|
PlotGERBERLine( start, end, aWidth );
|
|
start = end;
|
|
}
|
|
|
|
end.x = aCentre.x + aRadius;
|
|
end.y = aCentre.y;
|
|
PlotGERBERLine( start, end, aWidth );
|
|
}
|
|
|
|
|
|
/***************************************************************/
|
|
void PlotFilledPolygon_GERBER( int aCornersCount, int* aCoord )
|
|
/***************************************************************/
|
|
/** Function PlotFilledPolygon_GERBER
|
|
* writes a filled polyline to output file
|
|
* @param aCornersCount = numer of corners
|
|
* @param aCoord = buffer of corners coordinates
|
|
*/
|
|
{
|
|
int ii;
|
|
wxPoint pos, startpos;
|
|
|
|
fputs( "G36*\n", g_Plot_PlotOutputFile );
|
|
pos.x = *aCoord;
|
|
aCoord++;
|
|
pos.y = *aCoord;
|
|
aCoord++;
|
|
UserToDeviceCoordinate( pos );
|
|
startpos = pos;
|
|
fprintf( g_Plot_PlotOutputFile, "X%5.5dY%5.5dD02*\n", pos.x, pos.y );
|
|
for( ii = 1; ii < aCornersCount; ii++ )
|
|
{
|
|
pos.x = *aCoord;
|
|
aCoord++;
|
|
pos.y = *aCoord;
|
|
aCoord++;
|
|
UserToDeviceCoordinate( pos );
|
|
fprintf( g_Plot_PlotOutputFile, "X%5.5dY%5.5dD01*\n", pos.x, pos.y );
|
|
}
|
|
|
|
fprintf( g_Plot_PlotOutputFile, "X%5.5dY%5.5dD01*\n", startpos.x, startpos.y );
|
|
fputs( "G37*\n", g_Plot_PlotOutputFile );
|
|
}
|
|
|
|
|
|
/*******************************************************************/
|
|
void PlotPolygon_GERBER( int aCornersCount, int* aCoord, int aWidth )
|
|
/*******************************************************************/
|
|
/** Function PlotPolygon_GERBER
|
|
* writes a closed polyline (not a filled polygon) to output file
|
|
* @param aCornersCount = numer of corners
|
|
* @param aCoord = buffer of corners coordinates
|
|
* @param aWidth = line width (not currently used, D_CODEs must be selected before)
|
|
*/
|
|
{
|
|
wxPoint start, end, startpoint;
|
|
startpoint.x = *aCoord++;
|
|
startpoint.y = *aCoord++;
|
|
start = startpoint;
|
|
for( int ii = 0; ii < aCornersCount-1; ii++ )
|
|
{
|
|
end.x = *aCoord;
|
|
aCoord++;
|
|
end.y = *aCoord;
|
|
aCoord++;
|
|
PlotGERBERLine(start, end, aWidth );
|
|
start = end;
|
|
}
|
|
|
|
if ( startpoint != end ) // Close poly
|
|
PlotGERBERLine(end, startpoint, aWidth );
|
|
|
|
}
|
|
|
|
|