Comments within postscript files now fully comply with Adobe's Document Structuring Convention, and beautification

This commit is contained in:
g_harland 2007-08-20 13:28:34 +00:00
parent 9f1f455b7a
commit 0421987b32
6 changed files with 643 additions and 481 deletions

View File

@ -4,6 +4,13 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2007-Aug-20 UPDATE Geoff Harland <gharlandau@yahoo.com.au>
================================================================================
+ eeschema & pcbnew
The comments provided within postscript files now fully comply with Adobe's
Document Structuring Convention.
2007-aug-20 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+ eeschema & pcbnew

View File

@ -11,6 +11,8 @@
#include "plot_common.h"
#include "macros.h"
#include "wx/defs.h"
// Variables partagees avec Common plot Postscript Routines
extern wxPoint LastPenPosition;
extern wxPoint PlotOffset;
@ -22,14 +24,16 @@ extern int PlotOrientOptions, etat_plume;
// Locales
static Ki_PageDescr * SheetPS;
/*************************************************************************************/
void InitPlotParametresPS(wxPoint offset, Ki_PageDescr * sheet,
double xscale, double yscale, int orient)
/*************************************************************************************/
/* Set the plot offset for the current plotting
xscale,yscale = coordinate scale (scale coefficient for coordinates)
device_xscale,device_yscale = device coordinate scale (i.e scale used by plot device)
*/
* xscale,yscale = coordinate scale (scale coefficient for coordinates)
* device_xscale,device_yscale = device coordinate scale (i.e scale used by plot device)
*/
{
PlotOrientOptions = orient;
PlotOffset = offset;
@ -39,55 +43,66 @@ void InitPlotParametresPS(wxPoint offset, Ki_PageDescr * sheet,
g_CurrentPenWidth = -1;
}
/*************************************************************************************/
void SetDefaultLineWidthPS( int width)
void SetDefaultLineWidthPS(int width)
/*************************************************************************************/
/* Set the default line width (in 1/1000 inch) for the current plotting
*/
*/
{
g_DefaultPenWidth = width; /* epaisseur du trait standard en 1/1000 pouce */
g_DefaultPenWidth = width; // epaisseur du trait standard en 1/1000 pouce
g_CurrentPenWidth = -1;
}
/***************************************/
void SetCurrentLineWidthPS( int width)
void SetCurrentLineWidthPS(int width)
/***************************************/
/* Set the Current line width (in 1/1000 inch) for the next plot
*/
*/
{
int pen_width;
if ( width > 0 ) pen_width = width;
else pen_width = g_DefaultPenWidth;
if ( pen_width != g_CurrentPenWidth )
fprintf(PlotOutputFile,"%d setlinewidth\n", (int)(XScale * pen_width));
if( width > 0 )
pen_width = width;
else
pen_width = g_DefaultPenWidth;
if( pen_width != g_CurrentPenWidth )
fprintf(PlotOutputFile, "%d setlinewidth\n", (int)(XScale * pen_width) );
g_CurrentPenWidth = pen_width;
}
/******************************/
void SetColorMapPS(int color)
/******************************/
/* Print the postscript set color command:
r g b setrgbcolor,
r, g, b = color values (= 0 .. 1.0 )
color = color index in ColorRefs[]
*/
/* Print the postscript set color command:
* r g b setrgbcolor,
* r, g, b = color values (= 0 .. 1.0 )
*
* color = color index in ColorRefs[]
*/
{
char Line[1024];
sprintf( Line,"%.3f %.3f %.3f setrgbcolor\n",
(float)ColorRefs[color].m_Red/255,
(float)ColorRefs[color].m_Green/255,
(float)ColorRefs[color].m_Blue/255
);
sprintf( Line, "%.3f %.3f %.3f setrgbcolor\n",
(float)ColorRefs[color].m_Red / 255,
(float)ColorRefs[color].m_Green / 255,
(float)ColorRefs[color].m_Blue / 255 );
to_point(Line);
fputs( Line, PlotOutputFile);
fputs( Line, PlotOutputFile );
}
/***************************************************************/
void PlotFilledSegmentPS(wxPoint start , wxPoint end, int width)
void PlotFilledSegmentPS(wxPoint start, wxPoint end, int width)
/***************************************************************/
/* Plot 1 segment like a track segment
*/
{
@ -109,104 +124,129 @@ char Line[256];
UserToDeviceCoordinate(pos);
rayon = (int)(XScale * diametre / 2);
if(rayon < 0 ) rayon = 0 ;
if( rayon < 0 )
rayon = 0;
SetCurrentLineWidthPS(width);
sprintf(Line,"newpath %d %d %d 0 360 arc stroke\n", pos.x, pos.y, rayon);
fputs(Line,PlotOutputFile) ;
sprintf(Line, "newpath %d %d %d 0 360 arc stroke\n", pos.x, pos.y, rayon);
fputs(Line, PlotOutputFile);
}
/**************************************************************************************/
void PlotArcPS(wxPoint centre, int StAngle, int EndAngle, int rayon, int width)
/**************************************************************************************/
/* Plot an arc:
StAngle, EndAngle = start and end arc in 0.1 degree
*/
* StAngle, EndAngle = start and end arc in 0.1 degree
*/
{
char Line[256];
if(rayon <= 0 ) return ;
if( rayon <= 0 )
return;
SetCurrentLineWidthPS(width);
/* Calcul des coord du point de depart : */
// Calcul des coord du point de depart :
UserToDeviceCoordinate(centre);
if( PlotOrientOptions == PLOT_MIROIR)
sprintf(Line, "newpath %d %d %d %f %f arc stroke\n", centre.x, centre.y,
(int)(rayon * XScale), (float)StAngle/10, (float)EndAngle/10 ) ;
if( PlotOrientOptions == PLOT_MIROIR )
sprintf( Line, "newpath %d %d %d %f %f arc stroke\n", centre.x, centre.y,
(int)(rayon * XScale), (float)StAngle / 10, (float)EndAngle / 10 );
else
sprintf(Line, "newpath %d %d %d %f %f arc stroke\n", centre.x, centre.y,
(int)(rayon * XScale), -(float)EndAngle/10, -(float)StAngle/10 ) ;
sprintf( Line, "newpath %d %d %d %f %f arc stroke\n", centre.x, centre.y,
(int)(rayon * XScale), -(float)EndAngle / 10, -(float)StAngle / 10 );
// Undo internationalization printf (float x.y printed x,y)
to_point(Line);
fputs(Line,PlotOutputFile) ;
fputs(Line, PlotOutputFile);
}
/****************************************************************/
void PlotPolyPS( int nb_segm, int * coord, int fill, int width)
/*****************************************************************/
void PlotPolyPS(int nb_segm, int * coord, int fill, int width)
/*****************************************************************/
/* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT
coord = tableau des coord des sommets
nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
fill : si != 0 polygone rempli
*/
* coord = tableau des coord des sommets
* nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
* fill : si != 0 polygone rempli
*/
{
int ii;
wxPoint pos;
if( nb_segm <= 1 ) return;
if( nb_segm <= 1 )
return;
SetCurrentLineWidthPS(width);
pos.x = coord[0]; pos.y = coord[1];
pos.x = coord[0];
pos.y = coord[1];
UserToDeviceCoordinate(pos);
fprintf(PlotOutputFile, "newpath %d %d moveto\n", pos.x, pos.y);
for( ii = 1; ii < nb_segm; ii ++ )
{
pos.x = coord[ii*2]; pos.y = coord[(ii*2)+1];
{
pos.x = coord[2 * ii];
pos.y = coord[2 * ii + 1];
UserToDeviceCoordinate(pos);
fprintf(PlotOutputFile, "%d %d lineto\n", pos.x, pos.y);
}
}
/* Fermeture du polygone */
if( fill ) fprintf(PlotOutputFile, "closepath ");
if( fill == 1 ) fprintf(PlotOutputFile, "fill ");
// Fermeture du polygone
if( fill )
fprintf(PlotOutputFile, "closepath ");
if( fill == 1 )
fprintf(PlotOutputFile, "fill ");
fprintf(PlotOutputFile, "stroke\n");
}
/*************************************/
/* Routine to draw to a new position */
/*************************************/
void LineTo_PS(wxPoint pos, int plume)
/*************************************/
/* Routine to draw to a new position
*/
{
if ( plume == 'Z') return;
if( plume == 'Z' )
return;
UserToDeviceCoordinate(pos);
if ( plume == 'D')
if( plume == 'D' )
{
char Line[256];
sprintf(Line,"%d %d %d %d line\n",
LastPenPosition.x, LastPenPosition.y, pos.x, pos.y);
fputs(Line,PlotOutputFile);
char Line[256];
sprintf(Line, "%d %d %d %d line\n",
LastPenPosition.x, LastPenPosition.y, pos.x, pos.y);
fputs(Line, PlotOutputFile);
}
LastPenPosition = pos;
}
/**********************************************************/
void PrintHeaderPS(FILE * file, const wxString & Creator,
const wxString & FileName, int BBox[4])
/***********************************************************/
/* BBox is the boundary box (position and size of the "client rectangle"
for drawings (page - margins) in mils (0.001 inch)
*/
void PrintHeaderPS(FILE * file, const wxString & Creator,
const wxString & FileName, int PageCount,
int BBox[4], int PaperOrientation)
/***********************************************************/
/* The code within this function (and the CloseFilePS function)
* creates postscript files whose contents comply with Adobe's
* Document Structuring Convention, as documented by assorted
* details described within the following URLs:
*
* http://en.wikipedia.org/wiki/Document_Structuring_Conventions
* http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf
*
*
* The PageCount and PaperOrientation parameters have been provided to
* respectively cater for the production of multiple-page postscript
* files, and postscript files having either a portrait orientation
* or a landscape orientation.
*
* BBox is the boundary box (position and size of the "client rectangle"
* for drawings (page - margins) in mils (0.001 inch)
*/
{
wxString msg;
char Line[1024];
@ -218,61 +258,112 @@ const char *PSMacro[] = {
" stroke\n",
"} def\n",
"gsave\n",
"72 72 scale\t\t\t%% Talk inches\n",
"72 72 scale\t\t\t% Talk inches\n",
"1 setlinecap\n",
"1 setlinejoin\n",
"1 setlinewidth\n",
NULL
};
#define MIL_TO_INCH 0.001
const double MIL_TO_INCH = 0.001;
int ii;
time_t time1970 = time(NULL);
PlotOutputFile = file;
fputs("%!PS-Adobe-3.0\n",PlotOutputFile); // Print header
fputs("%!PS-Adobe-3.0\n", PlotOutputFile); // Print header
/* Print boundary box en 1/72 pouce, box is in mils */
#define CONV_SCALE (MIL_TO_INCH * 72)
sprintf( Line, "%%%%BoundingBox: %d %d %d %d\n",
(int)(BBox[1]*CONV_SCALE), (int)(BBox[0]*CONV_SCALE),
(int)(BBox[3]*CONV_SCALE), (int)(BBox[2]*CONV_SCALE));
sprintf( Line, "%%%%Creator: %s\n", CONV_TO_UTF8(Creator) );
fputs(Line, PlotOutputFile);
// A "newline" character ("\n") is not included in the following string,
// because it is provided by the ctime() function.
sprintf( Line, "%%%%CreationDate: %s", ctime(&time1970) );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%Title: %s\n", CONV_TO_UTF8(FileName) );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%Creator: %s_n", CONV_TO_UTF8(Creator) );
sprintf( Line, "%%%%Pages: %d\n", PageCount );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%CreationDate: %s\n", ctime(&time1970) );
sprintf( Line, "%%%%PageOrder: Ascend\n" );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%DocumentPaperSizes: %s\n", CONV_TO_UTF8(SheetPS->m_Name) );
// Print boundary box en 1/72 pouce, box is in mils
const double CONV_SCALE = MIL_TO_INCH * 72;
// The coordinates of the lower left corner of the boundary
// box need to be "rounded down", but the coordinates of its
// upper right corner need to be "rounded up" instead.
sprintf( Line, "%%%%BoundingBox: %d %d %d %d\n",
(int)floor((BBox[1] * CONV_SCALE)), (int)floor((BBox[0] * CONV_SCALE)),
(int)ceil((BBox[3] * CONV_SCALE)), (int)ceil((BBox[2] * CONV_SCALE)) );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%Orientation: Landscape\n%%%%EndComments\n");
// Specify the size of the sheet and the name associated with that size.
// (If the "User size" option has been selected for the sheet size,
// identify the sheet size as "Custom" (rather than as "User"), but
// otherwise use the name assigned by KiCad for each sheet size.)
//
// (The Document Structuring Convention also supports sheet weight,
// sheet colour, and sheet type properties being specified within a
// %%DocumentMedia comment, but they are not being specified here;
// a zero and two null strings are subsequently provided instead.)
//
// (NOTE: m_Size.y is *supposed* to be listed before m_Size.x;
// the order in which they are specified is not wrong!)
if( SheetPS->m_Name.Cmp( wxT("User") ) == 0 )
sprintf( Line, "%%%%DocumentMedia: Custom %d %d 0 () ()\n",
(int)round( SheetPS->m_Size.y * CONV_SCALE ),
(int)round( SheetPS->m_Size.x * CONV_SCALE ) );
else // ( if SheetPS->m_Name does not equal "User" )
sprintf( Line, "%%%%DocumentMedia: %s %d %d 0 () ()\n",
CONV_TO_UTF8( SheetPS->m_Name ),
(int)round( SheetPS->m_Size.y * CONV_SCALE ),
(int)round( SheetPS->m_Size.x * CONV_SCALE ) );
fputs(Line, PlotOutputFile);
for (ii = 0; PSMacro[ii] != NULL; ii++)
if( PaperOrientation == wxPORTRAIT )
sprintf( Line, "%%%%Orientation: Portrait\n" );
else
sprintf( Line, "%%%%Orientation: Landscape\n" );
fputs(Line, PlotOutputFile);
sprintf( Line, "%%%%EndComments\n" );
fputs(Line, PlotOutputFile);
// Now specify various other details.
// The following string has been specified here (rather than within
// PSMacro[]) to highlight that it has been provided to ensure that the
// contents of the postscript file comply with the details specified
// within the Document Structuring Convention.
sprintf( Line, "%%%%Page: 1 1\n" );
fputs(Line, PlotOutputFile);
for ( ii = 0; PSMacro[ii] != NULL; ii++ )
{
fputs(PSMacro[ii],PlotOutputFile);
fputs(PSMacro[ii], PlotOutputFile);
}
sprintf(Line, "%f %f translate 90 rotate\n",
(float) BBox[3] * MIL_TO_INCH, (float)BBox[0] * MIL_TO_INCH );
if( PaperOrientation == wxLANDSCAPE )
sprintf(Line, "%f %f translate 90 rotate\n",
(float)BBox[3] * MIL_TO_INCH, (float)BBox[0] * MIL_TO_INCH);
// (If support for creating postscript files with a portrait orientation
// is ever provided, determine whether it would be necessary to provide
// an "else" command and then an appropriate "sprintf" command here.)
// compensation internationalisation printf (float x.y généré x,y)
to_point(Line);
fputs(Line,PlotOutputFile);
fputs(Line, PlotOutputFile);
sprintf(Line,"%f %f scale\t\t%% Move to User coordinates\n",
sprintf(Line, "%f %f scale\t\t%% Move to User coordinates\n",
XScale, YScale);
to_point(Line);
fputs(Line,PlotOutputFile);
fputs(Line, PlotOutputFile);
// Set default line width:
fprintf(PlotOutputFile,"%d setlinewidth\n", g_DefaultPenWidth ); //g_DefaultPenWidth in user units
// Set default line width ( g_DefaultPenWidth is in user units )
fprintf(PlotOutputFile, "%d setlinewidth\n", g_DefaultPenWidth);
}
@ -280,8 +371,9 @@ time_t time1970 = time(NULL);
bool CloseFilePS(FILE * plot_file)
/******************************************/
{
fputs("showpage\n",plot_file);
fputs("grestore\n",plot_file);
fputs("showpage\n", plot_file);
fputs("grestore\n", plot_file);
fputs("%%EOF\n", plot_file);
fclose(plot_file);

View File

@ -36,9 +36,10 @@
#include "plot_common.h"
#include "protos.h"
#include "wx/defs.h"
/* coeff de conversion dim en 1 mil -> dim en unite PS: */
#define SCALE_PS 0.001
// coeff de conversion dim en 1 mil -> dim en unite PS:
const double SCALE_PS = 0.001;
extern void Move_Plume( wxPoint pos, int plume );
extern void Plume( int plume );
@ -399,7 +400,7 @@ wxPoint StartPos, EndPos;
SetDefaultLineWidthPS( g_PlotPSMinimunLineWidth);
/* Init : */
PrintHeaderPS(PlotOutput, wxT("EESchema-PS"), FileName, BBox);
PrintHeaderPS( PlotOutput, wxT("EESchema-PS"), FileName, 1, BBox, wxLANDSCAPE );
InitPlotParametresPS(plot_offset, sheet, 1.0, 1.0);
if ( m_Plot_Sheet_Ref->GetValue() )
@ -513,4 +514,3 @@ wxPoint StartPos, EndPos;
m_MsgBox->AppendText( wxT("Ok\n"));
}

View File

@ -19,23 +19,23 @@ typedef enum {
PLOT_FORMAT_POST_A4
} PlotFormat;
#define PLOT_MIROIR 1
const int PLOT_MIROIR = 1;
/*******************************/
/* common_plot_functions.cpp */
/*******************************/
void SetPlotScale(double xscale, double yscale); /* Set the plot scale for the current plotting) */
void SetPlotOffset(wxPoint offset); /* Set the plot offset for the current plotting) */
void SetPlotScale(double xscale, double yscale); // Set the plot scale for the current plotting)
void SetPlotOffset(wxPoint offset); // Set the plot offset for the current plotting)
void InitPlotParametresGERBER(wxPoint offset, double xscale, double yscale);
void PlotWorkSheet(int format_plot, BASE_SCREEN * screen);
void UserToDeviceCoordinate(wxPoint & pos );
/* modifie les coord pos.x et pos.y pour le trace selon l'orientation, l'echelle, les offsets de trace */
// modifie les coord pos.x et pos.y pour le trace selon l'orientation, l'echelle, les offsets de trace
void UserToDeviceSize(wxSize & size );
/* modifie les dimension size.x et size.y pour le trace selon l'echelle */
// modifie les dimension size.x et size.y pour le trace selon l'echelle
void ForcePenReinit(void);
/* set the flag g_CurrentPenWidth to -1 in order to force a pen width redefinition
for the next draw command */
// set the flag g_CurrentPenWidth to -1 in order
// to force a pen width redefinition for the next draw command
/*******************************/
@ -46,16 +46,15 @@ void InitPlotParametresPS( wxPoint offset, Ki_PageDescr * sheet, double xscale,
void SetDefaultLineWidthPS( int width);
void PlotCircle_PS(wxPoint pos, int diametre, int width = -1);
void PlotArcPS(wxPoint centre, int StAngle, int EndAngle, int rayon, int width = -1);
/* Plot an arc: StAngle, EndAngle = start and end arc in 0.1 degree */
// Plot an arc: StAngle, EndAngle = start and end arc in 0.1 degree
void PlotPolyPS( int nb_segm, int * coord, int fill, int width = -1);
void PlotFilledSegmentPS(wxPoint start , wxPoint end, int width);
void LineTo_PS(wxPoint pos, int plume);
void PrintHeaderPS(FILE * file, const wxString & Creator, const wxString & FileName, int BBox[4]);
void PrintHeaderPS(FILE * file, const wxString & Creator, const wxString & FileName, int PageCount, int BBox[4], int PaperOrientation);
bool CloseFilePS(FILE * plot_file);
void SetColorMapPS(int color);
/*********************************/
/* common_plotHPGL_functions.cpp */
/*********************************/
@ -70,4 +69,3 @@ void Plume_HPGL( int plume );
#endif // PLOT_COMMON_H

View File

@ -15,6 +15,7 @@
#include "protos.h"
#include "wx/defs.h"
/*
Generation du fichier de percage en format EXCELLON
@ -89,8 +90,8 @@ enum id_drill {
ID_SEL_DRILL_UNITS,
ID_SEL_DRILL_SHEET,
ID_SEL_DRILL_REPORT,
ID_SEL_ZEROS_FMT,
ID_SEL_PRECISION
ID_SEL_ZEROS_FMT,
ID_SEL_PRECISION
};
class WinEDA_DrillFrame: public wxDialog
@ -958,7 +959,7 @@ wxString msg;
InitPlotParametresPS(g_PlotOffset, SheetPS,
(double) 1.0 / PCB_INTERNAL_UNIT, (double) 1.0 / PCB_INTERNAL_UNIT);
SetDefaultLineWidthPS(10); // Set line with to 10/1000 inch
PrintHeaderPS(dest, wxT("PCBNEW-PS"), FullFileName, BBox);
PrintHeaderPS(dest, wxT("PCBNEW-PS"), FullFileName, 1, BBox, wxLANDSCAPE);
InitPlotParametresPS(g_PlotOffset, SheetPS, scale_x, scale_y);
}
break;

File diff suppressed because it is too large Load Diff