kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #08049
Re: Plotting/fabricating in nanometers
Thank you very much for your time Lorenzo. This ended up being quite a bit of work, so
again thanks very much.
I don't know if you even want feedback. This nice work.
I do have some minor points here, and then search for my initials below "RHH".
1) Since it was such a significant revision, would have been nice to get the code more in
line with current coding standards, such as a) uppercase public function names, b) single
line comments C++ sytle, c) function comments in the header file, not in the C++ file.
Remember that function comments are inherited by Doxygen into a polymorphic derivative
function. So they only need to go into the base class within the header file unless there
is something different in a derivative. Doxygen scans for functions in header files as a
preference to C++, so that is our preference.
2) There were a couple of places where you removed KiROUND() when converting from double
to int. Maybe you wanted a different rounding algorith, but you also removed
overflow/underflow detection which KiROUND() provides.
3) I really do not like the API to user_to_device(). Either of these would be better:
a) void PLOTTER::user_to_device_coordinates( const wxPoint& pos, DPOINT* out )
b) DPOINT PLOTTER::user_to_device_coordinates( const wxPoint& pos )
Long ago I adopted a personal policy not using a reference to a parameter that was to be
modified. So a) above uses a pointer, and the reason is so that in the calling code, you
have a clue that the second parameter might be modified since you see the & in front of
the argument. user_to_device( wxpt, &dpt ); This tells you something that
user_to_device( wxpt, dpt ) does not.
Of the two, I like b) better, and of course even better yet would be upper case first
character function name.
4) It would be an improvement to provide a clue in the "scaling factor" type variables
what the conversion is, and best would be to include "per" in that variable name. eg.
du_per_iu or similar tells me "device units per internal units". "aScalingFactor" or
"device_scale" tells me nothing, other than that I need to go study somewhere else, a
nuisance.
5) I like the change to const reference for the wxPoint arguments. const references are
fine, because the const means you have no intention to modify, so the concerns I mentioned
in 3) do not apply.
Look for RHH below:
> dpoint-plotting.diff
>
>
> === modified file 'common/class_plotter.cpp'
> --- common/class_plotter.cpp 2012-04-27 10:52:50 +0000
> +++ common/class_plotter.cpp 2012-04-29 08:06:32 +0000
> @@ -21,9 +21,8 @@
> #include <class_base_screen.h>
> #include <drawtxt.h>
>
> -PLOTTER::PLOTTER( PlotFormat aPlotType )
> +PLOTTER::PLOTTER( )
> {
> - m_PlotType = aPlotType;
> plot_scale = 1;
> default_pen_width = 0;
> current_pen_width = -1; /* To-be-set marker */
> @@ -36,25 +35,23 @@
>
>
> /* Modifies coordinates pos.x and pos.y trace according to the orientation,
> - * scale factor, and offsets trace
> - * IMPORTANT: there is a special case for portrait handling in the
> - * Postscript specialization (more or less the same with the coordinates
> - * swapped), keep it in sync with this!
> + * scale factor, and offsets trace. Also convert from a wxPoint to DPOINT,
> + * since some output engines needs floating point coordinates.
> */
> -void PLOTTER::user_to_device_coordinates( wxPoint& pos )
> +void PLOTTER::user_to_device_coordinates( const wxPoint& pos, DPOINT& out )
> {
> - pos.x = (int) ( (pos.x - plot_offset.x) * plot_scale * device_scale );
> + out.x = (pos.x - plot_offset.x) * plot_scale * device_scale;
>
> if( plotMirror )
> - pos.y = (int) ( ( pos.y - plot_offset.y ) * plot_scale * device_scale );
> + out.y = ( pos.y - plot_offset.y ) * plot_scale * device_scale ;
> else
> - pos.y = (int) ( ( paper_size.y - ( pos.y - plot_offset.y )
> - * plot_scale ) * device_scale );
> + out.y = ( paper_size.y - ( pos.y - plot_offset.y )
> + * plot_scale ) * device_scale ;
> }
>
>
> /* Generic arc rendered as a polyline */
> -void PLOTTER::arc( wxPoint centre, int StAngle, int EndAngle, int radius,
> +void PLOTTER::arc( const wxPoint& centre, int StAngle, int EndAngle, int radius,
> FILL_T fill, int width )
> {
> wxPoint start, end;
> @@ -86,10 +83,10 @@
>
>
> /* Modifies size size.x and size.y trace according to the scale factor. */
> -void PLOTTER::user_to_device_size( wxSize& size )
> +void PLOTTER::user_to_device_size( const wxSize& size, DPOINT& out )
> {
> - size.x = (int) ( size.x * plot_scale * device_scale );
> - size.y = (int) ( size.y * plot_scale * device_scale );
> + out.x = size.x * plot_scale * device_scale;
> + out.y = size.y * plot_scale * device_scale;
> }
>
>
> @@ -254,7 +251,7 @@
>
>
> /* Convert a thick segment and plot it as an oval */
> -void PLOTTER::segment_as_oval( wxPoint start, wxPoint end, int width,
> +void PLOTTER::segment_as_oval( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode )
> {
> wxPoint center( (start.x + end.x) / 2, (start.y + end.y) / 2 );
> @@ -276,12 +273,13 @@
> }
>
>
> -void PLOTTER::sketch_oval( wxPoint pos, wxSize size, int orient,
> +void PLOTTER::sketch_oval( const wxPoint& pos, const wxSize& aSize, int orient,
> int width )
> {
> set_current_line_width( width );
> width = current_pen_width;
> int radius, deltaxy, cx, cy;
> + wxSize size( aSize );
>
> if( size.x > size.y )
> {
> @@ -328,7 +326,7 @@
>
> /* Plot 1 segment like a track segment
> */
> -void PLOTTER::thick_segment( wxPoint start, wxPoint end, int width,
> +void PLOTTER::thick_segment( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode )
> {
> switch( tracemode )
> @@ -348,7 +346,7 @@
> }
>
>
> -void PLOTTER::thick_arc( wxPoint centre, int StAngle, int EndAngle, int radius,
> +void PLOTTER::thick_arc( const wxPoint& centre, int StAngle, int EndAngle, int radius,
> int width, EDA_DRAW_MODE_T tracemode )
> {
> switch( tracemode )
> @@ -373,7 +371,7 @@
> }
>
>
> -void PLOTTER::thick_rect( wxPoint p1, wxPoint p2, int width,
> +void PLOTTER::thick_rect( const wxPoint& p1, const wxPoint& p2, int width,
> EDA_DRAW_MODE_T tracemode )
> {
> switch( tracemode )
> @@ -388,22 +386,22 @@
>
> case SKETCH:
> set_current_line_width( -1 );
> - p1.x -= (width - current_pen_width) / 2;
> - p1.y -= (width - current_pen_width) / 2;
> - p2.x += (width - current_pen_width) / 2;
> - p2.y += (width - current_pen_width) / 2;
> - rect( p1, p2, NO_FILL, -1 );
> - p1.x += (width - current_pen_width);
> - p1.y += (width - current_pen_width);
> - p2.x -= (width - current_pen_width);
> - p2.y -= (width - current_pen_width);
> - rect( p1, p2, NO_FILL, -1 );
> + wxPoint offsetp1( p1.x - (width - current_pen_width) / 2,
> + p1.y - (width - current_pen_width) / 2 );
> + wxPoint offsetp2( p2.x + (width - current_pen_width) / 2,
> + p2.y + (width - current_pen_width) / 2 );
> + rect( offsetp1, offsetp2, NO_FILL, -1 );
> + offsetp1.x += (width - current_pen_width);
> + offsetp1.y += (width - current_pen_width);
> + offsetp2.x -= (width - current_pen_width);
> + offsetp2.y -= (width - current_pen_width);
> + rect( offsetp1, offsetp2, NO_FILL, -1 );
> break;
> }
> }
>
>
> -void PLOTTER::thick_circle( wxPoint pos, int diametre, int width,
> +void PLOTTER::thick_circle( const wxPoint& pos, int diametre, int width,
> EDA_DRAW_MODE_T tracemode )
> {
> switch( tracemode )
>
> === modified file 'common/common_plotDXF_functions.cpp'
> --- common/common_plotDXF_functions.cpp 2012-04-27 10:52:50 +0000
> +++ common/common_plotDXF_functions.cpp 2012-04-28 19:57:44 +0000
> @@ -21,7 +21,7 @@
> * @param aScale = coordinate scale (scale coefficient for coordinates)
> * @param aMirror = Mirror plot if true.
> */
> -void DXF_PLOTTER::set_viewport( wxPoint aOffset, double aIusPerDecimil,
> +void DXF_PLOTTER::set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror )
> {
> wxASSERT( !output_file );
> @@ -90,7 +90,7 @@
> }
>
>
> -void DXF_PLOTTER::rect( wxPoint p1, wxPoint p2, FILL_T fill, int width )
> +void DXF_PLOTTER::rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width )
> {
> wxASSERT( output_file );
> move_to( p1 );
> @@ -101,30 +101,33 @@
> }
>
>
> -void DXF_PLOTTER::circle( wxPoint centre, int diameter, FILL_T fill, int width )
> +void DXF_PLOTTER::circle( const wxPoint& centre, int diameter, FILL_T fill, int width )
> {
> wxASSERT( output_file );
> double radius = user_to_device_size( diameter / 2 );
> - user_to_device_coordinates( centre );
> + DPOINT centre_dev;
> + user_to_device_coordinates( centre, centre_dev );
> if( radius > 0 )
> {
> wxString cname = ColorRefs[current_color].m_Name;
> if (!fill) {
> - fprintf( output_file, "0\nCIRCLE\n8\n%s\n10\n%d.0\n20\n%d.0\n40\n%g\n",
> + fprintf( output_file, "0\nCIRCLE\n8\n%s\n10\n%g\n20\n%g\n40\n%g\n",
> TO_UTF8( cname ),
> - centre.x, centre.y, radius );
> + centre_dev.x, centre_dev.y, radius );
> }
> if (fill == FILLED_SHAPE) {
> - int r = (int)(radius*0.5);
> + double r = radius*0.5;
> fprintf( output_file, "0\nPOLYLINE\n");
> fprintf( output_file, "8\n%s\n66\n1\n70\n1\n", TO_UTF8( cname ));
> - fprintf( output_file, "40\n%g\n41\n%g\n", radius,radius);
> - fprintf( output_file, "0\nVERTEX\n8\n%s\n", TO_UTF8( cname ));
> - fprintf( output_file, "10\n%d.0\n 20\n%d.0\n42\n1.0\n", centre.x-r,centre.y);
> - fprintf( output_file, "0\nVERTEX\n8\n%s\n", TO_UTF8( cname ));
> - fprintf( output_file, "10\n%d.0\n 20\n%d.0\n42\n1.0\n", centre.x+r,centre.y);
> + fprintf( output_file, "40\n%g\n41\n%g\n", radius, radius);
> + fprintf( output_file, "0\nVERTEX\n8\n%s\n", TO_UTF8( cname ));
> + fprintf( output_file, "10\n%g\n 20\n%g\n42\n1.0\n",
> + centre_dev.x-r, centre_dev.y );
> + fprintf( output_file, "0\nVERTEX\n8\n%s\n", TO_UTF8( cname ));
> + fprintf( output_file, "10\n%g\n 20\n%g\n42\n1.0\n",
> + centre_dev.x+r, centre_dev.y );
> fprintf( output_file, "0\nSEQEND\n");
> - }
> + }
> }
> }
>
> @@ -133,7 +136,8 @@
> * nb = number of coord (coord 1 = 2 elements: X and Y table)
> * aFill: if != 0 filled polygon
> */
> -void DXF_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth)
> +void DXF_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
> + FILL_T aFill, int aWidth)
> {
> if( aCornerList.size() <= 1 )
> return;
> @@ -162,14 +166,14 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
RHH aScalingFactor, see above
> -void DXF_PLOTTER::PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor )
> +void DXF_PLOTTER::PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor )
> {
> wxSize size;
> size.x = aImage.GetWidth();
> size.y = aImage.GetHeight();
>
RHH why remove KiROUND here?
> - size.x = KiROUND( size.x * aScaleFactor );
> - size.y = KiROUND( size.y * aScaleFactor );
> + size.x = size.x * aScaleFactor;
> + size.y = size.y * aScaleFactor;
>
> wxPoint start = aPos;
> start.x -= size.x / 2;
> @@ -190,22 +194,24 @@
> * Unit to unit DRAWING
> * If pen = 'Z' without lifting pen displacement
> */
> -void DXF_PLOTTER::pen_to( wxPoint pos, char plume )
> +void DXF_PLOTTER::pen_to( const wxPoint& pos, char plume )
> {
> wxASSERT( output_file );
> if( plume == 'Z' )
> {
> return;
> }
> - user_to_device_coordinates( pos );
> + DPOINT pos_dev, pen_lastpos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> + user_to_device_coordinates( pen_lastpos, pen_lastpos_dev );
>
> if( pen_lastpos != pos && plume == 'D' )
> {
> /* DXF LINE */
> wxString cname = ColorRefs[current_color].m_Name;
> - fprintf( output_file, "0\nLINE\n8\n%s\n10\n%d.0\n20\n%d.0\n11\n%d.0\n21\n%d.0\n",
> + fprintf( output_file, "0\nLINE\n8\n%s\n10\n%g\n20\n%g\n11\n%g\n21\n%g\n",
> TO_UTF8( cname ),
> - pen_lastpos.x, pen_lastpos.y, pos.x, pos.y );
> + pen_lastpos_dev.x, pen_lastpos_dev.y, pos_dev.x, pos_dev.y );
> }
> pen_lastpos = pos;
> }
> @@ -225,7 +231,7 @@
> * @param aWidth = segment width (thickness)
> * @param aPlotMode = FILLED, SKETCH ..
> */
> -void DXF_PLOTTER::thick_segment( wxPoint aStart, wxPoint aEnd, int aWidth,
> +void DXF_PLOTTER::thick_segment( const wxPoint& aStart, const wxPoint& aEnd, int aWidth,
> EDA_DRAW_MODE_T aPlotMode )
> {
> if( aPlotMode == LINE ) /* just a line is Ok */
> @@ -245,7 +251,7 @@
> * StAngle, EndAngle = angle of beginning and end
> * Radius = radius of the arc
> */
> -void DXF_PLOTTER::arc( wxPoint centre, int StAngle, int EndAngle, int radius,
> +void DXF_PLOTTER::arc( const wxPoint& centre, int StAngle, int EndAngle, int radius,
> FILL_T fill, int width )
> {
> wxASSERT( output_file );
> @@ -253,24 +259,26 @@
> if( radius <= 0 )
> return;
>
> - user_to_device_coordinates( centre );
> - radius = KiROUND( user_to_device_size( radius ) );
> + DPOINT centre_dev;
> + user_to_device_coordinates( centre, centre_dev );
> + double radius_dev = user_to_device_size( radius );
>
> /* DXF ARC */
> wxString cname = ColorRefs[current_color].m_Name;
> fprintf( output_file,
> - "0\nARC\n8\n%s\n10\n%d.0\n20\n%d.0\n40\n%d.0\n50\n%d.0\n51\n%d.0\n",
> + "0\nARC\n8\n%s\n10\n%g\n20\n%g\n40\n%g\n50\n%g\n51\n%g\n",
> TO_UTF8( cname ),
> - centre.x, centre.y, radius,
> - StAngle / 10, EndAngle / 10 );
> + centre_dev.x, centre_dev.y, radius_dev,
> + StAngle / 10.0, EndAngle / 10.0 );
> }
>
>
> /* Plot oval pad at position. */
> -void DXF_PLOTTER::flash_pad_oval( wxPoint pos, wxSize size, int orient,
> +void DXF_PLOTTER::flash_pad_oval( const wxPoint& pos, const wxSize& aSize, int orient,
> EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> + wxSize size( aSize );
>
> /* The chip is reduced to an oval tablet with size.y > size.x
> * (Oval vertical orientation 0) */
> @@ -286,7 +294,7 @@
>
>
> /* Plot round pad or via. */
> -void DXF_PLOTTER::flash_pad_circle( wxPoint pos, int diametre,
> +void DXF_PLOTTER::flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> @@ -297,7 +305,7 @@
> /*
> * Plot rectangular pad vertical or horizontal (rectangular Pad)
> */
> -void DXF_PLOTTER::flash_pad_rect( wxPoint pos, wxSize padsize,
> +void DXF_PLOTTER::flash_pad_rect( const wxPoint& pos, const wxSize& padsize,
> int orient, EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> @@ -367,7 +375,7 @@
> * Orientation aPadOrient in 0.1 degrees
> * Plot mode = FILLED, SKETCH (unused)
> */
> -void DXF_PLOTTER::flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> +void DXF_PLOTTER::flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode )
> {
> wxASSERT( output_file );
>
> === modified file 'common/common_plotGERBER_functions.cpp'
> --- common/common_plotGERBER_functions.cpp 2012-04-27 10:52:50 +0000
> +++ common/common_plotGERBER_functions.cpp 2012-04-29 06:48:31 +0000
> @@ -24,7 +24,7 @@
> * @param aScale = coordinate scale (scale coefficient for coordinates)
> * @param aMirror = Mirror plot if true.
> */
> -void GERBER_PLOTTER::set_viewport( wxPoint aOffset, double aIusPerDecimil,
> +void GERBER_PLOTTER::set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror )
> {
> wxASSERT( !output_file );
> @@ -41,6 +41,17 @@
> set_default_line_width( 100 * aIusPerDecimil ); // Arbitrary default
> }
>
> +/**
> + * Emit a D-Code record, using proper conversions
> + * to format a leading zero omitted gerber coordinate
> + * (for 4 decimal positions, see header generation in start_plot
> + */
> +void GERBER_PLOTTER::emit_dcode( const DPOINT& pt, int dcode )
> +{
> +
> + fprintf( output_file, "X%dY%dD%02d*\n",
> + int( pt.x ), int( pt.y ), dcode );
> +}
>
> /**
> * Function start_plot
> @@ -67,14 +78,15 @@
> fprintf( output_file, "G04 (created by %s) date %s*\n",
> TO_UTF8( Title ), TO_UTF8( DateAndTime() ) );
>
> - // Specify linear interpol (G01), unit = INCH (G70), abs format (G90):
> - fputs( "G01*\nG70*\nG90*\n", output_file );
> - fputs( "%MOIN*%\n", output_file ); // set unites = INCHES
> + /* Mass parameter: unit = INCHES */
> + fputs( "%MOIN*%\n", output_file );
>
> - /* Set gerber format to 3.4 */
> + /* Set coordinate format to 3.4 absolute, leading zero omitted */
> fputs( "G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n%FSLAX34Y34*%\n",
> output_file );
>
> + /* Specify linear interpol (G01), unit = INCH (G70), abs format (G90) */
> + fputs( "G01*\nG70*\nG90*\n", output_file );
> fputs( "G04 APERTURE LIST*\n", output_file );
> /* Select the default aperture */
> set_current_line_width( -1 );
> @@ -90,11 +102,10 @@
>
> wxASSERT( output_file );
>
RHH single line comments should be C++
> - /* Outfile is actually a temporary file! */
> + /* Outfile is actually a temporary file i.e. work_file */
> fputs( "M02*\n", output_file );
> fflush( output_file );
>
> -// rewind( work_file ); // work_file == output_file !!!
> fclose( work_file );
> work_file = wxFopen( m_workFilename, wxT( "rt" ));
> wxASSERT( work_file );
> @@ -211,20 +222,22 @@
> switch( tool->type )
> {
> case APERTURE::Circle:
> - sprintf( text, "C,%f*%%\n", tool->size.x * fscale );
> + sprintf( text, "C,%g*%%\n", tool->size.x * fscale );
> break;
>
> case APERTURE::Rect:
> - sprintf( text, "R,%fX%f*%%\n", tool->size.x * fscale,
> + sprintf( text, "R,%gX%g*%%\n",
> + tool->size.x * fscale,
> tool->size.y * fscale );
> break;
>
> case APERTURE::Plotting:
> - sprintf( text, "C,%f*%%\n", tool->size.x * fscale );
> + sprintf( text, "C,%g*%%\n", tool->size.x * fscale );
> break;
>
> case APERTURE::Oval:
> - sprintf( text, "O,%fX%f*%%\n", tool->size.x * fscale,
> + sprintf( text, "O,%gX%g*%%\n",
> + tool->size.x * fscale,
> tool->size.y * fscale );
> break;
> }
> @@ -234,10 +247,11 @@
> }
>
>
> -void GERBER_PLOTTER::pen_to( wxPoint aPos, char plume )
> +void GERBER_PLOTTER::pen_to( const wxPoint& aPos, char plume )
> {
> wxASSERT( output_file );
> - user_to_device_coordinates( aPos );
> + DPOINT pos_dev;
> + user_to_device_coordinates( aPos, pos_dev );
>
> switch( plume )
> {
> @@ -245,18 +259,18 @@
> break;
>
> case 'U':
> - fprintf( output_file, "X%5.5dY%5.5dD02*\n", aPos.x, aPos.y );
RHH indentation problem:
> + emit_dcode( pos_dev, 2 );
> break;
>
> case 'D':
> - fprintf( output_file, "X%5.5dY%5.5dD01*\n", aPos.x, aPos.y );
> + emit_dcode( pos_dev, 1 );
> }
>
> pen_state = plume;
> }
>
>
> -void GERBER_PLOTTER::rect( wxPoint p1, wxPoint p2, FILL_T fill, int width )
> +void GERBER_PLOTTER::rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width )
> {
> static std::vector< wxPoint > cornerList;
> cornerList.clear();
> @@ -285,7 +299,7 @@
> * not used here: circles are always not filled the gerber. Filled circles are flashed
> * @param aWidth = line width
> */
> -void GERBER_PLOTTER::circle( wxPoint aCentre, int aDiameter, FILL_T aFill, int aWidth )
> +void GERBER_PLOTTER::circle( const wxPoint& aCentre, int aDiameter, FILL_T aFill, int aWidth )
> {
> wxASSERT( output_file );
> wxPoint start, end;
> @@ -315,7 +329,8 @@
> * @param aFill = plot option (NO_FILL, FILLED_SHAPE, FILLED_WITH_BG_BODYCOLOR)
> * @param aWidth = Width of the line to plot.
> */
> -void GERBER_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth )
> +void GERBER_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
> + FILL_T aFill, int aWidth )
> {
> if( aCornerList.size() <= 1 )
> return;
> @@ -353,7 +368,7 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> -void GERBER_PLOTTER::PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor )
> +void GERBER_PLOTTER::PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor )
> {
> wxSize size;
> size.x = aImage.GetWidth();
> @@ -377,7 +392,7 @@
> /* Function flash_pad_circle
> * Plot a circular pad or via at the user position pos
> */
> -void GERBER_PLOTTER::flash_pad_circle( wxPoint pos, int diametre, EDA_DRAW_MODE_T trace_mode )
> +void GERBER_PLOTTER::flash_pad_circle( const wxPoint& pos, int diametre, EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> wxSize size( diametre, diametre );
> @@ -391,9 +406,10 @@
> break;
>
> case FILLED:
> - user_to_device_coordinates( pos );
RHH indentation problem
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> select_aperture( size, APERTURE::Circle );
> - fprintf( output_file, "X%5.5dY%5.5dD03*\n", pos.x, pos.y );
> + emit_dcode( pos_dev, 3 );
> break;
> }
> }
> @@ -405,11 +421,12 @@
> * For a vertical or horizontal orientation, the shape is flashed
> * For any orientation the shape is drawn as a segment
> */
> -void GERBER_PLOTTER::flash_pad_oval( wxPoint pos, wxSize size, int orient,
> +void GERBER_PLOTTER::flash_pad_oval( const wxPoint& pos, const wxSize& aSize, int orient,
> EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> int x0, y0, x1, y1, delta;
> + wxSize size( aSize );
>
> /* Plot a flashed shape. */
> if( ( orient == 0 || orient == 900 || orient == 1800 || orient == 2700 )
> @@ -417,10 +434,11 @@
> {
> if( orient == 900 || orient == 2700 ) /* orientation turned 90 deg. */
> EXCHG( size.x, size.y );
> -
> - user_to_device_coordinates( pos );
> +
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> select_aperture( size, APERTURE::Oval );
> - fprintf( output_file, "X%5.5dY%5.5dD03*\n", pos.x, pos.y );
> + emit_dcode( pos_dev, 3 );
> }
> else /* Plot pad as a segment. */
> {
> @@ -436,6 +454,7 @@
>
> if( trace_mode == FILLED )
> {
> + /* XXX to do: use an aperture macro to declare the rotated pad */
> /* The pad is reduced to an oval with dy > dx */
> delta = size.y - size.x;
> x0 = 0;
> @@ -462,17 +481,18 @@
> * it is flashed.
> * For others shape the direction is plotted as a polygon.
> */
> -void GERBER_PLOTTER::flash_pad_rect( wxPoint pos, wxSize size,
> +void GERBER_PLOTTER::flash_pad_rect( const wxPoint& pos, const wxSize& aSize,
> int orient, EDA_DRAW_MODE_T trace_mode )
>
> {
> wxASSERT( output_file );
> + wxSize size( aSize );
>
> /* Plot as flashed. */
> switch( orient )
> {
> case 900:
> - case 2700: /* rotation of 90 degrees or 270 returns dimensions */
> + case 2700: /* rotation of 90 degrees or 270 swaps dimensions */
> EXCHG( size.x, size.y );
>
> // Pass through
> @@ -491,9 +511,10 @@
> break;
>
> case FILLED:
> - user_to_device_coordinates( pos );
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> select_aperture( size, APERTURE::Rect );
> - fprintf( output_file, "X%5.5dY%5.5dD03*\n", pos.x, pos.y );
> + emit_dcode( pos_dev, 3 );
> break;
> }
>
> @@ -501,6 +522,7 @@
>
> default: /* plot pad shape as polygon */
> {
> + /* XXX to do: use an aperture macro to declare the rotated pad */
> wxPoint coord[4];
> // coord[0] is assumed the lower left
> // coord[1] is assumed the upper left
> @@ -529,10 +551,11 @@
> * Orientation aPadOrient in 0.1 degrees
> * Plot mode = FILLED or SKETCH
> */
> - void GERBER_PLOTTER::flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + void GERBER_PLOTTER::flash_pad_trapez( const wxPoint& aPadPos, const wxPoint* aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode )
>
> {
> + /* XXX to do: use an aperture macro to declare the pad */
> // polygon corners list
> static std::vector< wxPoint > cornerList;
> cornerList.clear();
> @@ -555,7 +578,10 @@
> PlotPoly( cornerList, aTrace_Mode==FILLED ? FILLED_SHAPE : NO_FILL );
> }
>
> -
> +/**
> + * Change the plot polarity and begin a new layer
> + * Used to 'scratch off' silk screen away from solder mask
> + */
> void GERBER_PLOTTER::SetLayerPolarity( bool aPositive )
> {
> if( aPositive )
>
> === modified file 'common/common_plotHPGL_functions.cpp'
> --- common/common_plotHPGL_functions.cpp 2012-04-27 10:52:50 +0000
> +++ common/common_plotHPGL_functions.cpp 2012-04-28 19:56:48 +0000
> @@ -24,7 +24,7 @@
> * @param aScale = coordinate scale (scale coefficient for coordinates)
> * @param aMirror = Mirror plot if true.
> */
> -void HPGL_PLOTTER::set_viewport( wxPoint aOffset, double aIusPerDecimil,
> +void HPGL_PLOTTER::set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror )
> {
> wxASSERT( !output_file );
> @@ -59,17 +59,18 @@
> }
>
>
> -void HPGL_PLOTTER::rect( wxPoint p1, wxPoint p2, FILL_T fill, int width )
> +void HPGL_PLOTTER::rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width )
> {
> wxASSERT( output_file );
> - user_to_device_coordinates( p2 );
> + DPOINT p2dev;
> + user_to_device_coordinates( p2, p2dev );
> move_to( p1 );
> - fprintf( output_file, "EA %d,%d;\n", p2.x, p2.y );
> + fprintf( output_file, "EA %.0f,%.0f;\n", p2dev.x, p2dev.y );
> pen_finish();
> }
>
>
> -void HPGL_PLOTTER::circle( wxPoint centre,
> +void HPGL_PLOTTER::circle( const wxPoint& centre,
> int diameter,
> FILL_T fill,
> int width )
> @@ -90,7 +91,8 @@
> * aCornerList = a wxPoint list of corner
> * aFill: if != 0 filled polygon
> */
> -void HPGL_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth)
> +void HPGL_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
> + FILL_T aFill, int aWidth)
> {
> if( aCornerList.size() <= 1 )
> return;
> @@ -119,7 +121,7 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> -void HPGL_PLOTTER::PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor )
> +void HPGL_PLOTTER::PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor )
> {
> wxSize size;
> size.x = aImage.GetWidth();
> @@ -180,7 +182,7 @@
> * Unit to unit DRAWING
> * If pen = 'Z' without changing pen during move.
> */
> -void HPGL_PLOTTER::pen_to( wxPoint pos, char plume )
> +void HPGL_PLOTTER::pen_to( const wxPoint& pos, char plume )
> {
> wxASSERT( output_file );
>
> @@ -191,10 +193,11 @@
> }
>
> pen_control( plume );
> - user_to_device_coordinates( pos );
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
>
> if( pen_lastpos != pos )
> - fprintf( output_file, "PA %d,%d;\n", pos.x, pos.y );
> + fprintf( output_file, "PA %.0f,%.0fd;\n", pos_dev.x, pos_dev.y );
>
> pen_lastpos = pos;
> }
> @@ -217,7 +220,7 @@
> * @param width = segment width (thickness)
> * @param tracemode = FILLED, SKETCH ..
> */
> -void HPGL_PLOTTER::thick_segment( wxPoint start, wxPoint end, int width, EDA_DRAW_MODE_T tracemode )
> +void HPGL_PLOTTER::thick_segment( const wxPoint& start, const wxPoint& end, int width, EDA_DRAW_MODE_T tracemode )
> {
> wxASSERT( output_file );
> wxPoint center;
> @@ -242,19 +245,18 @@
> * PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, NbSegm; PU;
> * Or PU PY x, y; PD start_arc_X AA, start_arc_Y, angle, PU;
> */
> -void HPGL_PLOTTER::arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> +void HPGL_PLOTTER::arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> FILL_T fill, int width )
> {
> wxASSERT( output_file );
> wxPoint cmap;
> - wxPoint cpos;
> + DPOINT centre_dev, cmap_dev;
> float angle;
>
> if( rayon <= 0 )
> return;
>
> - cpos = centre;
> - user_to_device_coordinates( cpos );
> + user_to_device_coordinates( centre, centre_dev );
>
> if( plotMirror )
> angle = (StAngle - EndAngle) / 10.0;
> @@ -263,15 +265,15 @@
> // Calculate start point,
> cmap.x = (int) ( centre.x + ( rayon * cos( StAngle * M_PI / 1800 ) ) );
> cmap.y = (int) ( centre.y - ( rayon * sin( StAngle * M_PI / 1800 ) ) );
> - user_to_device_coordinates( cmap );
> + user_to_device_coordinates( cmap, cmap_dev );
>
> fprintf( output_file,
> - "PU;PA %d,%d;PD;AA %d,%d, ",
> - cmap.x,
> - cmap.y,
> - cpos.x,
> - cpos.y );
> - fprintf( output_file, "%f", angle );
> + "PU;PA %.0f,%.0f;PD;AA %.0f,%.0f,",
> + cmap_dev.x,
> + cmap_dev.y,
> + centre_dev.x,
> + centre_dev.y );
> + fprintf( output_file, "%.0f", angle );
> fprintf( output_file, ";PU;\n" );
> pen_finish();
> }
> @@ -279,11 +281,12 @@
>
> /* Plot oval pad.
> */
> -void HPGL_PLOTTER::flash_pad_oval( wxPoint pos, wxSize size, int orient,
> +void HPGL_PLOTTER::flash_pad_oval( const wxPoint& pos, const wxSize& aSize, int orient,
> EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> int deltaxy, cx, cy;
> + wxSize size( aSize );
>
> /* The pad is reduced to an oval with size.y > size.x
> * (Oval vertical orientation 0)
> @@ -318,13 +321,14 @@
>
> /* Plot round pad or via.
> */
> -void HPGL_PLOTTER::flash_pad_circle( wxPoint pos, int diametre,
> +void HPGL_PLOTTER::flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> int rayon, delta;
>
> - user_to_device_coordinates( pos );
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
>
> delta = KiROUND( pen_diameter - pen_overlap );
> rayon = diametre / 2;
> @@ -338,11 +342,11 @@
> {
> rayon = 0;
> }
> - wxSize rsize( rayon, rayon );
> -
> - user_to_device_size( rsize );
> -
> - fprintf( output_file, "PA %d,%d;CI %d;\n", pos.x, pos.y, rsize.x );
> +
> + double rsize = user_to_device_size( rayon );
> +
> + fprintf( output_file, "PA %.0f,%.0fd;CI %.0f;\n",
> + pos_dev.x, pos_dev.y, rsize );
>
> if( trace_mode == FILLED ) // Plot in filled mode.
> {
> @@ -350,13 +354,12 @@
> {
> while( (rayon -= delta ) >= 0 )
> {
> - rsize.x = rsize.y = rayon;
> - user_to_device_size( rsize );
> + rsize = user_to_device_size( rayon );
> fprintf( output_file,
> - "PA %d,%d; CI %d;\n",
> - pos.x,
> - pos.y,
> - rsize.x );
> + "PA %.0f,%.0f;CI %.0f;\n",
> + pos_dev.x,
> + pos_dev.y,
> + rsize );
> }
> }
> }
> @@ -370,7 +373,7 @@
> * Gives its center and its dimensions X and Y
> * Units are user units
> */
> -void HPGL_PLOTTER::flash_pad_rect( wxPoint pos, wxSize padsize,
> +void HPGL_PLOTTER::flash_pad_rect( const wxPoint& pos, const wxSize& padsize,
> int orient, EDA_DRAW_MODE_T trace_mode )
> {
> wxASSERT( output_file );
> @@ -488,7 +491,7 @@
> * Orientation aPadOrient in 0.1 degrees
> * Plot mode FILLED or SKETCH
> */
> -void HPGL_PLOTTER::flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> +void HPGL_PLOTTER::flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode )
> {
> wxASSERT( output_file );
>
> === modified file 'common/common_plotPS_functions.cpp'
> --- common/common_plotPS_functions.cpp 2012-04-27 10:52:50 +0000
> +++ common/common_plotPS_functions.cpp 2012-04-29 08:08:14 +0000
> @@ -22,7 +22,7 @@
> * @param aScale = coordinate scale (scale coefficient for coordinates)
> * @param aMirror = Mirror plot if true.
> */
> -void PS_PLOTTER::set_viewport( wxPoint aOffset, double aIusPerDecimil,
> +void PS_PLOTTER::set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror )
> {
> wxASSERT( !output_file );
> @@ -131,35 +131,34 @@
> }
>
>
> -void PS_PLOTTER::rect( wxPoint p1, wxPoint p2, FILL_T fill, int width )
> +void PS_PLOTTER::rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width )
> {
> - user_to_device_coordinates( p1 );
> - user_to_device_coordinates( p2 );
> + DPOINT p1_dev, p2_dev;
> + user_to_device_coordinates( p1, p1_dev );
> + user_to_device_coordinates( p2, p2_dev );
>
> set_current_line_width( width );
> - fprintf( output_file, "%d %d %d %d rect%d\n", p1.x, p1.y,
> - p2.x - p1.x, p2.y - p1.y, fill );
> + fprintf( output_file, "%g %g %g %g rect%d\n", p1_dev.x, p1_dev.y,
> + p2_dev.x - p1_dev.x, p2_dev.y - p1_dev.y, fill );
> }
>
>
> -void PS_PLOTTER::circle( wxPoint pos, int diametre, FILL_T fill, int width )
> +void PS_PLOTTER::circle( const wxPoint& pos, int diametre, FILL_T fill, int width )
> {
> wxASSERT( output_file );
> - user_to_device_coordinates( pos );
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> double radius = user_to_device_size( diametre / 2.0 );
>
> - if( radius < 1 )
> - radius = 1;
> -
> set_current_line_width( width );
> - fprintf( output_file, "%d %d %g cir%d\n", pos.x, pos.y, radius, fill );
> + fprintf( output_file, "%g %g %g cir%d\n", pos_dev.x, pos_dev.y, radius, fill );
> }
>
>
> /* Plot an arc:
> * StAngle, EndAngle = start and end arc in 0.1 degree
> */
> -void PS_PLOTTER::arc( wxPoint centre, int StAngle, int EndAngle, int radius,
> +void PS_PLOTTER::arc( const wxPoint& centre, int StAngle, int EndAngle, int radius,
> FILL_T fill, int width )
> {
> wxASSERT( output_file );
> @@ -172,15 +171,16 @@
> set_current_line_width( width );
>
> // Calculate start point.
> - user_to_device_coordinates( centre );
> - radius = KiROUND( user_to_device_size( radius ) );
> + DPOINT centre_dev;
> + user_to_device_coordinates( centre, centre_dev );
> + double radius_dev = user_to_device_size( radius );
> if( plotMirror )
> - fprintf( output_file, "%d %d %d %g %g arc%d\n", centre.x, centre.y,
> - radius, (double) -EndAngle / 10, (double) -StAngle / 10,
> + fprintf( output_file, "%g %g %g %g %g arc%d\n", centre_dev.x, centre_dev.y,
> + radius_dev, -EndAngle / 10.0, -StAngle / 10.0,
> fill );
> else
> - fprintf( output_file, "%d %d %d %g %g arc%d\n", centre.x, centre.y,
> - radius, (double) StAngle / 10, (double) EndAngle / 10,
> + fprintf( output_file, "%g %g %g %g %g arc%d\n", centre_dev.x, centre_dev.y,
> + radius_dev, StAngle / 10.0, EndAngle / 10.0,
> fill );
> }
>
> @@ -192,22 +192,22 @@
> * param aFill :if true : filled polygon
> * param aWidth = line width
> */
> -void PS_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth )
> +void PS_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
> + FILL_T aFill, int aWidth )
> {
> if( aCornerList.size() <= 1 )
> return;
>
> set_current_line_width( aWidth );
>
> - wxPoint pos = aCornerList[0];
> - user_to_device_coordinates( pos );
> - fprintf( output_file, "newpath\n%d %d moveto\n", pos.x, pos.y );
> + DPOINT pos;
> + user_to_device_coordinates( aCornerList[0], pos );
> + fprintf( output_file, "newpath\n%g %g moveto\n", pos.x, pos.y );
>
> for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
> {
> - pos = aCornerList[ii];
> - user_to_device_coordinates( pos );
> - fprintf( output_file, "%d %d lineto\n", pos.x, pos.y );
> + user_to_device_coordinates( aCornerList[ii], pos );
> + fprintf( output_file, "%g %g lineto\n", pos.x, pos.y );
> }
>
> // Close path
> @@ -223,14 +223,13 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> -void PS_PLOTTER::PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor )
> +void PS_PLOTTER::PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor )
> {
> wxSize pix_size; // size of the bitmap in pixels
> pix_size.x = aImage.GetWidth();
> pix_size.y = aImage.GetHeight();
> - wxSize drawsize; // requested size of image
> - drawsize.x = KiROUND( aScaleFactor * pix_size.x );
> - drawsize.y = KiROUND( aScaleFactor * pix_size.y );
> + DPOINT drawsize( aScaleFactor * pix_size.x,
> + aScaleFactor * pix_size.y ); // requested size of image
>
> // calculate the bottom left corner position of bitmap
> wxPoint start = aPos;
> @@ -247,12 +246,13 @@
> fprintf( output_file, "/greys %d string def\n", pix_size.x );
>
> // Locate lower-left corner of image
> - user_to_device_coordinates( start );
> - fprintf( output_file, "%d %d translate\n", start.x, start.y );
> + DPOINT start_dev, end_dev;
> + user_to_device_coordinates( start, start_dev );
> + fprintf( output_file, "%g %g translate\n", start_dev.x, start_dev.y );
> // Map image size to device
> - user_to_device_coordinates( end );
> - fprintf( output_file, "%d %d scale\n",
> - ABS(end.x - start.x), ABS(end.y - start.y));
> + user_to_device_coordinates( end, end_dev );
> + fprintf( output_file, "%g %g scale\n",
> + ABS(end_dev.x - start_dev.x), ABS(end_dev.y - start_dev.y));
>
> // Dimensions of source image (in pixels
> fprintf( output_file, "%d %d 8", pix_size.x, pix_size.y );
> @@ -287,7 +287,7 @@
>
> /* Routine to draw to a new position
> */
> -void PS_PLOTTER::pen_to( wxPoint pos, char plume )
> +void PS_PLOTTER::pen_to( const wxPoint& pos, char plume )
> {
> wxASSERT( output_file );
> if( plume == 'Z' )
> @@ -302,17 +302,20 @@
> return;
> }
>
> - user_to_device_coordinates( pos );
> if( pen_state == 'Z' )
> {
> fputs( "newpath\n", output_file );
> }
> if( pen_state != plume || pos != pen_lastpos )
> + {
> + DPOINT pos_dev;
> + user_to_device_coordinates( pos, pos_dev );
> fprintf( output_file,
> - "%d %d %sto\n",
> - pos.x,
> - pos.y,
> + "%g %g %sto\n",
> + pos_dev.x,
> + pos_dev.y,
> ( plume=='D' ) ? "line" : "move" );
> + }
> pen_state = plume;
> pen_lastpos = pos;
> }
> @@ -442,12 +445,7 @@
> fputs( PSMacro[ii], output_file );
> }
>
> - // (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.)
> - // XXX indeed it would remove the ugly virtual override for
> - // user_to_device_coordinates
> -
> + /* Rototranslate the coordinate to achieve the landscape layout */
> if( !pageInfo.IsPortrait() )
> fprintf( output_file, "%d 0 translate 90 rotate\n", 10 * psPaperSize.x );
>
> @@ -481,11 +479,12 @@
> * Orient Orient
> * The shape is drawn as a segment
> */
> -void PS_PLOTTER::flash_pad_oval( wxPoint pos, wxSize size, int orient,
> +void PS_PLOTTER::flash_pad_oval( const wxPoint& pos, const wxSize& aSize, int orient,
> EDA_DRAW_MODE_T modetrace )
> {
> wxASSERT( output_file );
> int x0, y0, x1, y1, delta;
> + wxSize size( aSize );
>
> // The pad is reduced to an oval by dy > dx
> if( size.x > size.y )
> @@ -514,7 +513,7 @@
>
> /* Plot round pad or via.
> */
> -void PS_PLOTTER::flash_pad_circle( wxPoint pos, int diametre,
> +void PS_PLOTTER::flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T modetrace )
> {
> int current_line_width;
> @@ -536,10 +535,11 @@
>
> /* Plot rectangular pad in any orientation.
> */
> -void PS_PLOTTER::flash_pad_rect( wxPoint pos, wxSize size,
> +void PS_PLOTTER::flash_pad_rect( const wxPoint& pos, const wxSize& aSize,
> int orient, EDA_DRAW_MODE_T trace_mode )
> {
> static std::vector< wxPoint > cornerList;
> + wxSize size( aSize );
> cornerList.clear();
>
> set_current_line_width( -1 );
> @@ -584,7 +584,7 @@
> * Orientation aPadOrient in 0.1 degrees
> * Plot mode FILLED or SKETCH
> */
> -void PS_PLOTTER::flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> +void PS_PLOTTER::flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode )
> {
> static std::vector< wxPoint > cornerList;
> @@ -628,21 +628,3 @@
> PlotPoly( cornerList, ( aTrace_Mode == FILLED ) ? FILLED_SHAPE : NO_FILL );
> }
>
> -
> -void PS_PLOTTER::user_to_device_coordinates( wxPoint& pos )
> -{
> - if( pageInfo.IsPortrait() )
> - {
> - pos.y = (int) ( ( paper_size.y - ( pos.y - plot_offset.y )
> - * plot_scale ) * device_scale );
> -
> - if( plotMirror )
> - pos.x = (int) ( ( paper_size.x - ( pos.x - plot_offset.x )
> - * plot_scale ) * device_scale );
> - else
> - pos.x = (int) ( (pos.x - plot_offset.x) * plot_scale * device_scale );
> - }
> - else
> - PLOTTER::user_to_device_coordinates( pos );
> -}
> -
>
> === modified file 'include/plot_common.h'
> --- include/plot_common.h 2012-04-27 10:52:50 +0000
> +++ include/plot_common.h 2012-04-29 08:06:06 +0000
> @@ -1,6 +1,6 @@
> /**
> * Common plot library \n
> - * Plot settings, postscript plotting, gerber plotting.
> + * Plot settings, and plotting engines (Postscript, Gerber, HPGL and DXF)
> *
> * @file plot_common.h
> */
> @@ -9,6 +9,7 @@
> #define PLOT_COMMON_H_
>
> #include <vector>
> +#include <vector2d.h>
> #include <drawtxt.h>
> #include <common.h> // PAGE_INFO
> #include <eda_text.h> // FILL_T
> @@ -26,10 +27,16 @@
> };
>
>
> +/**
> + * Base plotter engine class. General rule: all the interface with the caller
> + * is done in IU, the IU size is specified with set_viewport. Internal and
> + * output processing is done in decimils (or whatever unit the effective engine
> + * need to use)
> + */
> class PLOTTER
> {
> public:
> - PLOTTER( PlotFormat aPlotType );
> + PLOTTER( );
>
> virtual ~PLOTTER()
> {
> @@ -40,12 +47,7 @@
> }
> }
>
> -
> - /**
> - * Function GetPlotterType
> - * @return the format of the plot file
> - */
> - PlotFormat GetPlotterType() { return m_PlotType; }
> + virtual PlotFormat GetPlotterType() const = 0;
>
> virtual bool start_plot( FILE* fout ) = 0;
> virtual bool end_plot() = 0;
> @@ -77,6 +79,12 @@
> return current_pen_width;
> }
>
> + /* PLEASE NOTE: the plot width adjustment is actually done by the
> + * pcbnew routines, the plotter class only carry it along!
> + * XXX In fact it's only used during postscript plot, I'd move this
> + * variable as a static in pcbnew/plot_rtn.cpp. Also: why it's double?
> + * it's added to pad/track size and it's specified in IU, so it should
> + * be an int */
> virtual void set_plot_width_adj( double width )
> {
> }
> @@ -97,25 +105,26 @@
> }
>
> /// Set the plot offset for the current plotting
> - virtual void set_viewport( wxPoint aOffset, double aIusPerDecimil,
> + virtual void set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror ) = 0;
>
> // Standard primitives
> - virtual void rect( wxPoint p1, wxPoint p2, FILL_T fill,
> + virtual void rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill,
> int width = -1 ) = 0;
> - virtual void circle( wxPoint pos, int diametre, FILL_T fill,
> + virtual void circle( const wxPoint& pos, int diametre, FILL_T fill,
> int width = -1 ) = 0;
> - virtual void arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> + virtual void arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> FILL_T fill, int width = -1 );
>
> /**
> * Function PlotPoly
> * @brief Draw a polygon ( filled or not )
> * @param aCornerList = corners list
> - * @param aFill :if true : filled polygon
> + * @param aFill = type of fill
> * @param aWidth = line width
> */
> - virtual void PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1 ) = 0;
> + virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill,
> + int aWidth = -1 ) = 0;
>
> /**
> * Function PlotImage
> @@ -127,24 +136,25 @@
> * @param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> - virtual void PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor ) = 0;
> + virtual void PlotImage( wxImage & aImage, const wxPoint& aPos,
> + double aScaleFactor ) = 0;
>
> - virtual void thick_segment( wxPoint start, wxPoint end, int width,
> + virtual void thick_segment( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode );
> - virtual void thick_arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> + virtual void thick_arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> int width, EDA_DRAW_MODE_T tracemode );
> - virtual void thick_rect( wxPoint p1, wxPoint p2, int width,
> + virtual void thick_rect( const wxPoint& p1, const wxPoint& p2, int width,
> EDA_DRAW_MODE_T tracemode );
> - virtual void thick_circle( wxPoint pos, int diametre, int width,
> + virtual void thick_circle( const wxPoint& pos, int diametre, int width,
> EDA_DRAW_MODE_T tracemode );
> - virtual void pen_to( wxPoint pos, char plume ) = 0;
> + virtual void pen_to( const wxPoint& pos, char plume ) = 0;
>
> // Flash primitives
> - virtual void flash_pad_circle( wxPoint pos, int diametre,
> + virtual void flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode ) = 0;
> - virtual void flash_pad_oval( wxPoint pos, wxSize size, int orient,
> + virtual void flash_pad_oval( const wxPoint& pos, const wxSize& size, int orient,
> EDA_DRAW_MODE_T trace_mode ) = 0;
> - virtual void flash_pad_rect( wxPoint pos, wxSize size,
> + virtual void flash_pad_rect( const wxPoint& pos, const wxSize& size,
> int orient, EDA_DRAW_MODE_T trace_mode ) = 0;
>
> /** virtual function flash_pad_trapez
> @@ -154,21 +164,21 @@
> * @param aPadOrient = the rotation of the shape
> * @param aTrace_Mode = FILLED or SKETCH
> */
> - virtual void flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + virtual void flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode ) = 0;
>
> // Convenience functions
> - void move_to( wxPoint pos )
> + void move_to( const wxPoint& pos )
> {
> pen_to( pos, 'U' );
> }
>
> - void line_to( wxPoint pos )
> + void line_to( const wxPoint& pos )
> {
> pen_to( pos, 'D' );
> }
>
> - void finish_to( wxPoint pos )
> + void finish_to( const wxPoint& pos )
> {
> pen_to( pos, 'D' );
> pen_to( pos, 'Z' );
> @@ -207,20 +217,19 @@
> void center_lozenge( const wxPoint& position, int diametre, FILL_T fill );
>
> // Helper function for sketched filler segment
> - void segment_as_oval( wxPoint start, wxPoint end, int width,
> + void segment_as_oval( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode );
> - void sketch_oval( wxPoint pos, wxSize size, int orient, int width );
> + void sketch_oval( const wxPoint& pos, const wxSize& size, int orient,
> + int width );
>
> - virtual void user_to_device_coordinates( wxPoint& pos );
> - virtual void user_to_device_size( wxSize& size );
> + virtual void user_to_device_coordinates( const wxPoint& pos, DPOINT& out );
> + virtual void user_to_device_size( const wxSize& size, DPOINT& out );
> virtual double user_to_device_size( double size );
>
> - PlotFormat m_PlotType;
> -
> /// Plot scale
> double plot_scale;
>
> - /// Device scale (from IUs to device units)
> + /// Device scale (from IUs to device units - usually decimils)
> double device_scale;
>
> /// Plot offset (in IUs)
> @@ -239,6 +248,7 @@
> wxString creator;
> wxString filename;
> PAGE_INFO pageInfo;
> + // Paper size in IU - not in mils
> wxSize paper_size;
> };
>
> @@ -246,9 +256,13 @@
> class HPGL_PLOTTER : public PLOTTER
> {
> public:
> - HPGL_PLOTTER() :
> - PLOTTER( PLOT_FORMAT_HPGL )
> - {
> + HPGL_PLOTTER()
> + {
> + }
> +
> + virtual PlotFormat GetPlotterType() const
> + {
> + return PLOT_FORMAT_HPGL;
> }
>
> virtual bool start_plot( FILE* fout );
> @@ -290,10 +304,10 @@
> pen_overlap = overlap;
> }
>
> - virtual void set_viewport( wxPoint aOffset, double aIusPerDecimil,
> + virtual void set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror );
> - virtual void rect( wxPoint p1, wxPoint p2, FILL_T fill, int width = -1 );
> - virtual void circle( wxPoint pos, int diametre, FILL_T fill, int width = -1 );
> + virtual void rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width = -1 );
> + virtual void circle( const wxPoint& pos, int diametre, FILL_T fill, int width = -1 );
>
> /*
> * Function PlotPoly
> @@ -302,7 +316,7 @@
> * param aFill :if true : filled polygon
> * param aWidth = line width
> */
> - virtual void PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
> + virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
>
> /*
> * Function PlotImage
> @@ -314,21 +328,21 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> - virtual void PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor );
> + virtual void PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor );
>
> - virtual void thick_segment( wxPoint start, wxPoint end, int width,
> + virtual void thick_segment( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode );
> - virtual void arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> + virtual void arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> FILL_T fill, int width = -1 );
> - virtual void pen_to( wxPoint pos, char plume );
> - virtual void flash_pad_circle( wxPoint pos, int diametre,
> + virtual void pen_to( const wxPoint& pos, char plume );
> + virtual void flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_oval( wxPoint pos, wxSize size, int orient,
> + virtual void flash_pad_oval( const wxPoint& pos, const wxSize& size, int orient,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_rect( wxPoint pos, wxSize size,
> + virtual void flash_pad_rect( const wxPoint& pos, const wxSize& size,
> int orient, EDA_DRAW_MODE_T trace_mode );
>
> - virtual void flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + virtual void flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode );
>
> virtual void SetLayerPolarity( bool aPositive ) {}
> @@ -346,13 +360,17 @@
> class PS_PLOTTER : public PLOTTER
> {
> public:
> - PS_PLOTTER() :
> - PLOTTER( PLOT_FORMAT_POST )
> + PS_PLOTTER()
> {
> plot_scale_adjX = 1;
> plot_scale_adjY = 1;
> }
>
> + virtual PlotFormat GetPlotterType() const
> + {
> + return PLOT_FORMAT_POST;
> + }
> +
> virtual bool start_plot( FILE* fout );
> virtual bool end_plot();
> virtual void set_current_line_width( int width );
> @@ -376,11 +394,11 @@
> return plot_width_adj;
> }
>
> - virtual void set_viewport( wxPoint aOffset, double aIusPerDecimil,
> + virtual void set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror );
> - virtual void rect( wxPoint p1, wxPoint p2, FILL_T fill, int width = -1 );
> - virtual void circle( wxPoint pos, int diametre, FILL_T fill, int width = -1 );
> - virtual void arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> + virtual void rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width = -1 );
> + virtual void circle( const wxPoint& pos, int diametre, FILL_T fill, int width = -1 );
> + virtual void arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> FILL_T fill, int width = -1 );
> /*
> * Function PlotPoly
> @@ -389,7 +407,7 @@
> * param aFill :if true : filled polygon
> * param aWidth = line width
> */
> - virtual void PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
> + virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
>
> /*
> * Function PlotImage
> @@ -401,23 +419,21 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> - virtual void PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor );
> + virtual void PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor );
>
> - virtual void pen_to( wxPoint pos, char plume );
> - virtual void flash_pad_circle( wxPoint pos, int diametre,
> + virtual void pen_to( const wxPoint& pos, char plume );
> + virtual void flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_oval( wxPoint pos, wxSize size, int orient,
> + virtual void flash_pad_oval( const wxPoint& pos, const wxSize& size, int orient,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_rect( wxPoint pos, wxSize size,
> + virtual void flash_pad_rect( const wxPoint& pos, const wxSize& size,
> int orient, EDA_DRAW_MODE_T trace_mode );
>
> - virtual void flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + virtual void flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode );
>
> virtual void SetLayerPolarity( bool aPositive ) {}
>
> - void user_to_device_coordinates( wxPoint& pos ); // overload
> -
> protected:
> double plot_scale_adjX, plot_scale_adjY;
> double plot_width_adj;
> @@ -447,14 +463,18 @@
> class GERBER_PLOTTER : public PLOTTER
> {
> public:
> - GERBER_PLOTTER() :
> - PLOTTER( PLOT_FORMAT_GERBER )
> + GERBER_PLOTTER()
> {
> work_file = 0;
> final_file = 0;
> current_aperture = apertures.end();
> }
>
> + virtual PlotFormat GetPlotterType() const
> + {
> + return PLOT_FORMAT_GERBER;
> + }
> +
> virtual bool start_plot( FILE* fout );
> virtual bool end_plot();
> virtual void set_current_line_width( int width );
> @@ -463,10 +483,10 @@
> // RS274X has no dashing, nor colours
> virtual void set_dash( bool dashed ) {};
> virtual void set_color( int color ) {};
> - virtual void set_viewport( wxPoint aOffset, double aIusPerDecimil,
> + virtual void set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror );
> - virtual void rect( wxPoint p1, wxPoint p2, FILL_T fill, int width = -1 );
> - virtual void circle( wxPoint pos, int diametre, FILL_T fill, int width = -1 );
> + virtual void rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width = -1 );
> + virtual void circle( const wxPoint& pos, int diametre, FILL_T fill, int width = -1 );
> /*
> * Function PlotPoly
> * Draw a polygon (filled or not) in GERBER format
> @@ -474,7 +494,7 @@
> * param aFill :if true : filled polygon
> * param aWidth = line width
> */
> - virtual void PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
> + virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1);
>
> /*
> * Function PlotImage
> @@ -486,23 +506,24 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> - virtual void PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor );
> + virtual void PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor );
>
> - virtual void pen_to( wxPoint pos, char plume );
> - virtual void flash_pad_circle( wxPoint pos, int diametre,
> + virtual void pen_to( const wxPoint& pos, char plume );
> + virtual void flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_oval( wxPoint pos, wxSize size, int orient,
> + virtual void flash_pad_oval( const wxPoint& pos, const wxSize& size, int orient,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_rect( wxPoint pos, wxSize size,
> + virtual void flash_pad_rect( const wxPoint& pos, const wxSize& size,
> int orient, EDA_DRAW_MODE_T trace_mode );
>
> - virtual void flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + virtual void flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode );
>
> virtual void SetLayerPolarity( bool aPositive );
>
> protected:
> - void select_aperture( const wxSize& size, APERTURE::Aperture_Type type );
> + void select_aperture( const wxSize& size, APERTURE::Aperture_Type type );
> + void emit_dcode( const DPOINT& pt, int dcode );
>
> std::vector<APERTURE>::iterator
> get_aperture( const wxSize& size, APERTURE::Aperture_Type type );
> @@ -520,9 +541,13 @@
> class DXF_PLOTTER : public PLOTTER
> {
> public:
> - DXF_PLOTTER() :
> - PLOTTER( PLOT_FORMAT_DXF )
> - {
> + DXF_PLOTTER()
> + {
> + }
> +
> + virtual PlotFormat GetPlotterType() const
> + {
> + return PLOT_FORMAT_DXF;
> }
>
>
> @@ -546,10 +571,10 @@
>
> virtual void set_color( int color );
>
> - virtual void set_viewport( wxPoint aOffset, double aIusPerDecimil,
> + virtual void set_viewport( const wxPoint& aOffset, double aIusPerDecimil,
> double aScale, bool aMirror );
> - virtual void rect( wxPoint p1, wxPoint p2, FILL_T fill, int width = -1 );
> - virtual void circle( wxPoint pos, int diametre, FILL_T fill, int width = -1 );
> + virtual void rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, int width = -1 );
> + virtual void circle( const wxPoint& pos, int diametre, FILL_T fill, int width = -1 );
> /*
> * Function PlotPoly
> * Draw a polygon (filled or not) in DXF format
> @@ -557,7 +582,7 @@
> * param aFill :if true : filled polygon
> * param aWidth = line width
> */
> - virtual void PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1 );
> + virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth = -1 );
>
> /*
> * Function PlotImage
> @@ -569,21 +594,21 @@
> * param aScaleFactor = the scale factor to apply to the bitmap size
> * (this is not the plot scale factor)
> */
> - virtual void PlotImage( wxImage & aImage, wxPoint aPos, double aScaleFactor );
> + virtual void PlotImage( wxImage & aImage, const wxPoint& aPos, double aScaleFactor );
>
> - virtual void thick_segment( wxPoint start, wxPoint end, int width,
> + virtual void thick_segment( const wxPoint& start, const wxPoint& end, int width,
> EDA_DRAW_MODE_T tracemode );
> - virtual void arc( wxPoint centre, int StAngle, int EndAngle, int rayon,
> + virtual void arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon,
> FILL_T fill, int width = -1 );
> - virtual void pen_to( wxPoint pos, char plume );
> - virtual void flash_pad_circle( wxPoint pos, int diametre,
> + virtual void pen_to( const wxPoint& pos, char plume );
> + virtual void flash_pad_circle( const wxPoint& pos, int diametre,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_oval( wxPoint pos, wxSize size, int orient,
> + virtual void flash_pad_oval( const wxPoint& pos, const wxSize& size, int orient,
> EDA_DRAW_MODE_T trace_mode );
> - virtual void flash_pad_rect( wxPoint pos, wxSize size,
> + virtual void flash_pad_rect( const wxPoint& pos, const wxSize& size,
> int orient, EDA_DRAW_MODE_T trace_mode );
>
> - virtual void flash_pad_trapez( wxPoint aPadPos, wxPoint aCorners[4],
> + virtual void flash_pad_trapez( const wxPoint& aPadPos, const wxPoint *aCorners,
> int aPadOrient, EDA_DRAW_MODE_T aTrace_Mode );
>
> virtual void SetLayerPolarity( bool aPositive ) {}
>
> === modified file 'pcbnew/gen_modules_placefile.cpp'
> --- pcbnew/gen_modules_placefile.cpp 2012-04-27 10:52:50 +0000
> +++ pcbnew/gen_modules_placefile.cpp 2012-04-29 07:26:27 +0000
> @@ -451,15 +451,17 @@
> fputs( line, file );
>
> sprintf( line,
> - "# Ref Val PosX PosY Rot Side\n" );
> + "# Ref Val Package PosX PosY Rot Side\n" );
> fputs( line, file );
>
> for( int ii = 0; ii < moduleCount; ii++ )
> {
> wxPoint module_pos;
> - wxString ref = list[ii].m_Reference;
> - wxString val = list[ii].m_Value;
> - sprintf( line, "%-8.8s %-16.16s ", TO_UTF8( ref ), TO_UTF8( val ) );
> + const wxString& ref = list[ii].m_Reference;
> + const wxString& val = list[ii].m_Value;
> + const wxString& pkg = list[ii].m_Module->m_LibRef;
> + sprintf( line, "%-8.8s %-16.16s %-16.16s",
> + TO_UTF8( ref ), TO_UTF8( val ), TO_UTF8( pkg ) );
>
> module_pos = list[ii].m_Module->m_Pos;
> module_pos -= File_Place_Offset;
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help : https://help.launchpad.net/ListHelp
Follow ups
References