2014-10-19 20:20:16 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
2016-09-19 11:01:36 +00:00
|
|
|
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
2022-01-28 17:06:47 +00:00
|
|
|
* Copyright (C) 2016-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
2014-10-19 20:20:16 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, you may find one here:
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
2009-01-19 19:08:42 +00:00
|
|
|
/**
|
2020-10-20 20:09:13 +00:00
|
|
|
* Plot settings, and plotting engines (PostScript, Gerber, HPGL and DXF)
|
2009-06-28 16:50:42 +00:00
|
|
|
*
|
2020-09-23 18:58:13 +00:00
|
|
|
* @file plotter.h
|
2009-01-19 19:08:42 +00:00
|
|
|
*/
|
2007-05-28 18:09:49 +00:00
|
|
|
|
2011-12-31 05:44:00 +00:00
|
|
|
#ifndef PLOT_COMMON_H_
|
|
|
|
#define PLOT_COMMON_H_
|
2007-05-28 18:09:49 +00:00
|
|
|
|
2021-07-18 23:08:54 +00:00
|
|
|
#include <eda_shape.h>
|
2009-06-28 16:50:42 +00:00
|
|
|
#include <vector>
|
2013-03-28 16:30:09 +00:00
|
|
|
#include <math/box2.h>
|
2019-05-31 12:15:25 +00:00
|
|
|
#include <gr_text.h>
|
2018-01-29 10:37:29 +00:00
|
|
|
#include <page_info.h>
|
2020-10-15 23:33:18 +00:00
|
|
|
#include <outline_mode.h>
|
2020-10-14 11:29:36 +00:00
|
|
|
#include <gal/color4d.h>
|
2021-07-17 19:56:18 +00:00
|
|
|
#include <stroke_params.h>
|
2020-10-14 23:40:18 +00:00
|
|
|
#include <render_settings.h>
|
2010-10-08 20:40:57 +00:00
|
|
|
|
2020-01-13 01:44:19 +00:00
|
|
|
class COLOR_SETTINGS;
|
2021-06-03 22:03:00 +00:00
|
|
|
class SHAPE_ARC;
|
2016-02-10 16:02:40 +00:00
|
|
|
class SHAPE_POLY_SET;
|
2017-11-16 11:09:24 +00:00
|
|
|
class SHAPE_LINE_CHAIN;
|
2016-09-19 11:01:36 +00:00
|
|
|
class GBR_NETLIST_METADATA;
|
2020-10-24 14:45:37 +00:00
|
|
|
class PROJECT;
|
2016-02-10 16:02:40 +00:00
|
|
|
|
2020-10-14 11:29:36 +00:00
|
|
|
using KIGFX::RENDER_SETTINGS;
|
|
|
|
|
2020-10-21 16:29:53 +00:00
|
|
|
|
|
|
|
// Must be in the same order as the drop-down list in the plot dialog inside pcbnew
|
|
|
|
// Units (inch/mm for DXF plotter
|
|
|
|
enum class DXF_UNITS
|
|
|
|
{
|
|
|
|
INCHES = 0,
|
|
|
|
MILLIMETERS = 1
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-22 05:55:06 +00:00
|
|
|
/**
|
2020-10-18 20:30:37 +00:00
|
|
|
* The set of supported output plot formats.
|
|
|
|
*
|
|
|
|
They should be kept in order of the radio buttons in the plot panel/windows.
|
2008-03-22 05:55:06 +00:00
|
|
|
*/
|
2019-12-28 00:55:11 +00:00
|
|
|
enum class PLOT_FORMAT
|
|
|
|
{
|
|
|
|
UNDEFINED = -1,
|
|
|
|
FIRST_FORMAT = 0,
|
|
|
|
HPGL = FIRST_FORMAT,
|
|
|
|
GERBER,
|
|
|
|
POST,
|
|
|
|
DXF,
|
|
|
|
PDF,
|
|
|
|
SVG,
|
|
|
|
LAST_FORMAT = SVG
|
2008-03-22 05:55:06 +00:00
|
|
|
};
|
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
2020-10-18 20:30:37 +00:00
|
|
|
* Which kind of text to output with the PSLIKE plotters.
|
|
|
|
*
|
|
|
|
* You can:
|
2012-05-03 18:37:56 +00:00
|
|
|
* 1) only use the internal vector font
|
|
|
|
* 2) only use native postscript fonts
|
|
|
|
* 3) use the internal vector font and add 'phantom' text to aid
|
|
|
|
* searching
|
2013-04-05 08:55:46 +00:00
|
|
|
* 4) keep the default for the plot driver
|
2012-08-29 16:59:50 +00:00
|
|
|
*
|
|
|
|
* This is recognized by the DXF driver too, where NATIVE emits
|
|
|
|
* TEXT entities instead of stroking the text
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
2019-12-28 00:55:11 +00:00
|
|
|
enum class PLOT_TEXT_MODE
|
|
|
|
{
|
|
|
|
STROKE,
|
|
|
|
NATIVE,
|
|
|
|
PHANTOM,
|
|
|
|
DEFAULT
|
2012-05-03 18:37:56 +00:00
|
|
|
};
|
2011-12-22 21:57:50 +00:00
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
|
|
|
* Base plotter engine class. General rule: all the interface with the caller
|
|
|
|
* is done in IU, the IU size is specified with SetViewport. Internal and
|
|
|
|
* output processing is usually done in decimils (or whatever unit the
|
|
|
|
* effective engine class need to use)
|
|
|
|
*/
|
2009-08-29 10:20:48 +00:00
|
|
|
class PLOTTER
|
2008-03-22 05:55:06 +00:00
|
|
|
{
|
2009-06-28 16:50:42 +00:00
|
|
|
public:
|
2016-09-19 11:01:36 +00:00
|
|
|
// These values are used as flag for pen or aperture selection
|
|
|
|
static const int DO_NOT_SET_LINE_WIDTH = -2; // Skip selection
|
|
|
|
static const int USE_DEFAULT_LINE_WIDTH = -1; // use the default pen
|
2012-08-29 16:59:50 +00:00
|
|
|
|
2013-02-06 15:21:37 +00:00
|
|
|
PLOTTER();
|
2007-05-28 18:09:49 +00:00
|
|
|
|
2013-02-06 11:54:51 +00:00
|
|
|
virtual ~PLOTTER();
|
2007-05-28 18:09:49 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
2012-05-03 18:37:56 +00:00
|
|
|
* Returns the effective plot engine in use. It's not very OO but for
|
|
|
|
* now is required since some things are only done with some output devices
|
|
|
|
* (like drill marks, emitted only for postscript
|
2009-08-29 10:20:48 +00:00
|
|
|
*/
|
2019-12-28 00:55:11 +00:00
|
|
|
virtual PLOT_FORMAT GetPlotterType() const = 0;
|
2009-08-29 10:20:48 +00:00
|
|
|
|
2022-08-27 18:14:57 +00:00
|
|
|
virtual bool StartPlot( const wxString& aPageNumber ) = 0;
|
2012-05-03 18:37:56 +00:00
|
|
|
virtual bool EndPlot() = 0;
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2021-12-28 22:13:54 +00:00
|
|
|
virtual void SetNegative( bool aNegative ) { m_negativeMode = aNegative; }
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2020-10-18 20:30:37 +00:00
|
|
|
/**
|
|
|
|
* Plot in B/W or color.
|
2021-06-07 18:31:53 +00:00
|
|
|
*
|
|
|
|
* @param aColorMode use true to plot in color, false to plot in black and white.
|
2018-11-02 08:23:16 +00:00
|
|
|
*/
|
2020-11-16 00:04:55 +00:00
|
|
|
virtual void SetColorMode( bool aColorMode ) { m_colorMode = aColorMode; }
|
|
|
|
bool GetColorMode() const { return m_colorMode; }
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2020-04-14 12:25:00 +00:00
|
|
|
void SetRenderSettings( RENDER_SETTINGS* aSettings ) { m_renderSettings = aSettings; }
|
|
|
|
RENDER_SETTINGS* RenderSettings() { return m_renderSettings; }
|
2020-01-13 01:44:19 +00:00
|
|
|
|
2020-11-16 00:04:55 +00:00
|
|
|
virtual void SetPageSettings( const PAGE_INFO& aPageSettings ) { m_pageInfo = aPageSettings; }
|
|
|
|
PAGE_INFO& PageSettings() { return m_pageInfo; }
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
|
|
|
* Set the line width for the next drawing.
|
2021-06-07 18:31:53 +00:00
|
|
|
*
|
|
|
|
* @param width is specified in IUs.
|
|
|
|
* @param aData is an auxiliary parameter, mainly used in gerber plotter.
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
2021-06-07 18:31:53 +00:00
|
|
|
virtual void SetCurrentLineWidth( int width, void* aData = nullptr ) = 0;
|
2020-11-16 00:04:55 +00:00
|
|
|
virtual int GetCurrentLineWidth() const { return m_currentPenWidth; }
|
2012-01-07 06:02:38 +00:00
|
|
|
|
2021-06-07 18:31:53 +00:00
|
|
|
virtual void SetColor( const COLOR4D& color ) = 0;
|
2012-05-03 18:37:56 +00:00
|
|
|
|
2022-06-28 18:06:17 +00:00
|
|
|
virtual void SetDash( int aLineWidth, PLOT_DASH_TYPE aLineStyle ) = 0;
|
2012-05-03 18:37:56 +00:00
|
|
|
|
2020-11-16 00:04:55 +00:00
|
|
|
virtual void SetCreator( const wxString& aCreator ) { m_creator = aCreator; }
|
2015-03-25 13:07:05 +00:00
|
|
|
|
2020-11-16 00:04:55 +00:00
|
|
|
virtual void SetTitle( const wxString& aTitle ) { m_title = aTitle; }
|
2017-01-20 21:00:20 +00:00
|
|
|
|
2015-03-25 13:07:05 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Add a line to the list of free lines to print at the beginning of the file.
|
|
|
|
*
|
2015-03-25 13:07:05 +00:00
|
|
|
* @param aExtraString is the string to print
|
|
|
|
*/
|
|
|
|
void AddLineToHeader( const wxString& aExtraString )
|
|
|
|
{
|
|
|
|
m_headerExtraLines.Add( aExtraString );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-10-18 20:30:37 +00:00
|
|
|
* Remove all lines from the list of free lines to print at the beginning of the file
|
2015-03-25 13:07:05 +00:00
|
|
|
*/
|
|
|
|
void ClearHeaderLinesList()
|
|
|
|
{
|
|
|
|
m_headerExtraLines.Clear();
|
2009-06-28 16:50:42 +00:00
|
|
|
}
|
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
|
|
|
* Set the plot offset and scaling for the current plot
|
2021-06-07 18:31:53 +00:00
|
|
|
*
|
|
|
|
* @param aOffset is the plot offset.
|
2012-09-12 17:28:55 +00:00
|
|
|
* @param aIusPerDecimil gives the scaling factor from IUs to device units
|
2012-05-03 18:37:56 +00:00
|
|
|
* @param aScale is the user set plot scaling factor (either explicitly
|
2021-06-07 18:31:53 +00:00
|
|
|
* or using 'fit to A4').
|
2012-05-03 18:37:56 +00:00
|
|
|
* @param aMirror flips the plot in the Y direction (useful for toner
|
2021-06-07 18:31:53 +00:00
|
|
|
* transfers or some kind of film).
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void SetViewport( const VECTOR2I& aOffset, double aIusPerDecimil,
|
2021-06-07 18:31:53 +00:00
|
|
|
double aScale, bool aMirror ) = 0;
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2012-10-13 18:54:33 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Open or create the plot file \a aFullFilename.
|
|
|
|
*
|
|
|
|
* @param aFullFilename is the full file name of the file to create.
|
|
|
|
* @return true if success, false if the file cannot be created/opened.
|
2012-10-13 18:54:33 +00:00
|
|
|
*
|
|
|
|
* Virtual because some plotters use ascii files, some others binary files (PDF)
|
|
|
|
* The base class open the file in text mode
|
|
|
|
*/
|
|
|
|
virtual bool OpenFile( const wxString& aFullFilename );
|
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
/**
|
|
|
|
* The IUs per decimil are an essential scaling factor when
|
|
|
|
* plotting; they are set and saved when establishing the viewport.
|
|
|
|
* Here they can be get back again
|
|
|
|
*/
|
|
|
|
double GetIUsPerDecimil() const { return m_IUsPerDecimil; }
|
|
|
|
|
2019-05-22 13:33:48 +00:00
|
|
|
int GetPlotterArcLowDef() const { return m_IUsPerDecimil * 8; }
|
|
|
|
int GetPlotterArcHighDef() const { return m_IUsPerDecimil * 2; }
|
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
// Low level primitives
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void Rect( const VECTOR2I& p1, const VECTOR2I& p2, FILL_T fill,
|
2015-05-21 09:04:47 +00:00
|
|
|
int width = USE_DEFAULT_LINE_WIDTH ) = 0;
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill,
|
2015-05-21 09:04:47 +00:00
|
|
|
int width = USE_DEFAULT_LINE_WIDTH ) = 0;
|
2014-10-19 20:20:16 +00:00
|
|
|
|
2022-01-25 22:33:37 +00:00
|
|
|
/**
|
|
|
|
* Generic fallback: arc rendered as a polyline.
|
|
|
|
*/
|
|
|
|
virtual void Arc( const VECTOR2I& aCenter, const VECTOR2I& aStart, const VECTOR2I& aEnd,
|
|
|
|
FILL_T aFill, int aWidth, int aMaxError );
|
|
|
|
|
2014-10-19 20:20:16 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Generic fallback: arc rendered as a polyline.
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void Arc( const VECTOR2I& aCentre, const EDA_ANGLE& aStartAngle,
|
|
|
|
const EDA_ANGLE& aEndAngle, int aRadius, FILL_T aFill,
|
|
|
|
int aWidth = USE_DEFAULT_LINE_WIDTH );
|
2011-04-20 08:13:21 +00:00
|
|
|
|
2019-11-05 13:27:07 +00:00
|
|
|
/**
|
|
|
|
* Generic fallback: Cubic Bezier curve rendered as a polyline
|
2020-10-18 20:30:37 +00:00
|
|
|
* In KiCad the bezier curves have 4 control points:
|
2019-11-05 13:27:07 +00:00
|
|
|
* start ctrl1 ctrl2 end
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void BezierCurve( const VECTOR2I& aStart, const VECTOR2I& aControl1,
|
|
|
|
const VECTOR2I& aControl2, const VECTOR2I& aEnd,
|
2021-06-07 18:31:53 +00:00
|
|
|
int aTolerance, int aLineThickness = USE_DEFAULT_LINE_WIDTH );
|
2019-11-05 13:27:07 +00:00
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Moveto/lineto primitive, moves the 'pen' to the specified direction.
|
|
|
|
*
|
|
|
|
* @param pos is the target position.
|
2012-05-03 18:37:56 +00:00
|
|
|
* @param plume specifies the kind of motion: 'U' only moves the pen,
|
2021-06-07 18:31:53 +00:00
|
|
|
* 'D' draw a line from the current position and 'Z' finish
|
|
|
|
* the drawing and returns the 'pen' to rest (flushes the trace).
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void PenTo( const VECTOR2I& pos, char plume ) = 0;
|
2012-05-03 18:37:56 +00:00
|
|
|
|
|
|
|
// Convenience functions for PenTo
|
2021-12-29 19:02:50 +00:00
|
|
|
void MoveTo( const VECTOR2I& pos )
|
2012-05-03 18:37:56 +00:00
|
|
|
{
|
|
|
|
PenTo( pos, 'U' );
|
|
|
|
}
|
|
|
|
|
2021-12-29 19:02:50 +00:00
|
|
|
void LineTo( const VECTOR2I& pos )
|
2012-05-03 18:37:56 +00:00
|
|
|
{
|
|
|
|
PenTo( pos, 'D' );
|
|
|
|
}
|
|
|
|
|
2021-12-29 19:02:50 +00:00
|
|
|
void FinishTo( const VECTOR2I& pos )
|
2012-05-03 18:37:56 +00:00
|
|
|
{
|
|
|
|
PenTo( pos, 'D' );
|
|
|
|
PenTo( pos, 'Z' );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PenFinish()
|
|
|
|
{
|
|
|
|
// The point is not important with Z motion
|
2021-12-29 19:02:50 +00:00
|
|
|
PenTo( VECTOR2I( 0, 0 ), 'Z' );
|
2012-05-03 18:37:56 +00:00
|
|
|
}
|
|
|
|
|
2011-04-20 08:13:21 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Draw a polygon ( filled or not ).
|
|
|
|
*
|
2021-12-29 19:02:50 +00:00
|
|
|
* @param aCornerList is the corners list (a std::vector< VECTOR2I >).
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aFill is the type of fill.
|
|
|
|
* @param aWidth is the line width.
|
|
|
|
* @param aData is an auxiliary info (mainly for gerber format).
|
2011-04-20 08:13:21 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void PlotPoly( const std::vector<VECTOR2I>& aCornerList, FILL_T aFill,
|
2021-06-07 18:31:53 +00:00
|
|
|
int aWidth = USE_DEFAULT_LINE_WIDTH, void* aData = nullptr ) = 0;
|
2011-04-20 08:13:21 +00:00
|
|
|
|
2017-11-16 11:09:24 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Draw a polygon ( filled or not ).
|
|
|
|
* @param aCornerList is the corners list (a SHAPE_LINE_CHAIN).
|
|
|
|
* must be closed (IsClosed() == true) for a polygon. Otherwise this is a polyline.
|
|
|
|
* @param aFill is the type of fill.
|
|
|
|
* @param aWidth is the line width.
|
|
|
|
* @param aData is an auxiliary info (mainly for gerber format).
|
2017-11-16 11:09:24 +00:00
|
|
|
*/
|
2021-07-18 23:08:54 +00:00
|
|
|
virtual void PlotPoly( const SHAPE_LINE_CHAIN& aCornerList, FILL_T aFill,
|
2021-06-07 18:31:53 +00:00
|
|
|
int aWidth = USE_DEFAULT_LINE_WIDTH, void* aData = nullptr );
|
2017-11-16 11:09:24 +00:00
|
|
|
|
2011-08-31 14:59:20 +00:00
|
|
|
/**
|
2020-10-20 20:09:13 +00:00
|
|
|
* Only PostScript plotters can plot bitmaps.
|
2020-10-18 20:30:37 +00:00
|
|
|
*
|
|
|
|
* A rectangle is plotted for plotters that cannot plot a bitmap.
|
|
|
|
*
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aImage is the bitmap.
|
|
|
|
* @param aPos is position of the center of the bitmap.
|
|
|
|
* @param aScaleFactor is the scale factor to apply to the bitmap size
|
|
|
|
* (this is not the plot scale factor).
|
2011-08-31 14:59:20 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void PlotImage( const wxImage& aImage, const VECTOR2I& aPos, double aScaleFactor );
|
2012-05-03 18:37:56 +00:00
|
|
|
|
|
|
|
// Higher level primitives -- can be drawn as line, sketch or 'filled'
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void ThickSegment( const VECTOR2I& start, const VECTOR2I& end, int width,
|
2020-10-15 23:33:18 +00:00
|
|
|
OUTLINE_MODE tracemode, void* aData );
|
2022-02-20 13:59:11 +00:00
|
|
|
|
|
|
|
virtual void ThickArc( const VECTOR2I& aCentre, const EDA_ANGLE& StAngle,
|
|
|
|
const EDA_ANGLE& EndAngle, int aRadius, int aWidth,
|
|
|
|
OUTLINE_MODE aTraceMode, void* aData );
|
|
|
|
|
|
|
|
virtual void ThickArc( const VECTOR2I& aCentre, const VECTOR2I& aStart,
|
|
|
|
const VECTOR2I& aEnd, int aWidth,
|
|
|
|
OUTLINE_MODE aTraceMode, void* aData );
|
|
|
|
|
|
|
|
virtual void ThickArc( const EDA_SHAPE& aArcShape,
|
|
|
|
OUTLINE_MODE aTraceMode, void* aData );
|
|
|
|
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void ThickRect( const VECTOR2I& p1, const VECTOR2I& p2, int width, OUTLINE_MODE tracemode,
|
2021-12-28 22:13:54 +00:00
|
|
|
void* aData );
|
2022-02-20 13:59:11 +00:00
|
|
|
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void ThickCircle( const VECTOR2I& pos, int diametre, int width, OUTLINE_MODE tracemode,
|
2021-12-28 22:13:54 +00:00
|
|
|
void* aData );
|
2022-02-20 13:59:11 +00:00
|
|
|
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void FilledCircle( const VECTOR2I& pos, int diametre, OUTLINE_MODE tracemode,
|
2021-12-28 22:13:54 +00:00
|
|
|
void* aData );
|
2020-10-12 09:30:43 +00:00
|
|
|
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2010-12-12 02:29:33 +00:00
|
|
|
// Flash primitives
|
2016-09-19 11:01:36 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aPadPos Position of the shape (center of the rectangle.
|
|
|
|
* @param aDiameter is the diameter of round pad.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData is an auxiliary info (mainly for gerber format attributes).
|
2016-09-19 11:01:36 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void FlashPadCircle( const VECTOR2I& aPadPos, int aDiameter, OUTLINE_MODE aTraceMode,
|
2021-12-28 22:13:54 +00:00
|
|
|
void* aData ) = 0;
|
2016-09-19 11:01:36 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aPadPos Position of the shape (center of the rectangle.
|
|
|
|
* @param aSize is the size of oblong shape.
|
|
|
|
* @param aPadOrient The rotation of the shape.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData an auxiliary info (mainly for gerber format attributes).
|
2016-09-19 11:01:36 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void FlashPadOval( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
|
|
|
|
const EDA_ANGLE& aPadOrient, OUTLINE_MODE aTraceMode,
|
|
|
|
void* aData ) = 0;
|
2016-09-19 11:01:36 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aPadPos Position of the shape (center of the rectangle).
|
|
|
|
* @param aSize is the size of rounded rect.
|
|
|
|
* @param aPadOrient The rotation of the shape.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData an auxiliary info (mainly for gerber format attributes).
|
2016-09-19 11:01:36 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void FlashPadRect( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
|
|
|
|
const EDA_ANGLE& aPadOrient, OUTLINE_MODE aTraceMode,
|
|
|
|
void* aData ) = 0;
|
2010-12-11 18:40:39 +00:00
|
|
|
|
2016-02-10 16:02:40 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aPadPos Position of the shape (center of the rectangle.
|
|
|
|
* @param aSize is the size of rounded rect.
|
|
|
|
* @param aCornerRadius Radius of the rounded corners.
|
|
|
|
* @param aOrient The rotation of the shape.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData an auxiliary info (mainly for gerber format attributes).
|
2016-02-10 16:02:40 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void FlashPadRoundRect( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
|
|
|
|
int aCornerRadius, const EDA_ANGLE& aOrient,
|
|
|
|
OUTLINE_MODE aTraceMode, void* aData ) = 0;
|
2016-02-10 16:02:40 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* @param aPadPos Position of the shape.
|
|
|
|
* @param aSize is the size of round reference pad.
|
|
|
|
* @param aPadOrient is the pad rotation, used only with aperture macros (Gerber plotter).
|
|
|
|
* @param aPolygons the shape as polygon set.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData an auxiliary info (mainly for gerber format attributes).
|
2016-02-10 16:02:40 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void FlashPadCustom( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
|
|
|
|
const EDA_ANGLE& aPadOrient, SHAPE_POLY_SET* aPolygons,
|
|
|
|
OUTLINE_MODE aTraceMode, void* aData ) = 0;
|
2016-02-10 16:02:40 +00:00
|
|
|
|
2020-10-18 20:30:37 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Flash a trapezoidal pad.
|
|
|
|
*
|
|
|
|
* @param aPadPos is the the position of the shape.
|
|
|
|
* @param aCorners is the list of 4 corners positions, relative to the shape position,
|
|
|
|
* pad orientation 0.
|
|
|
|
* @param aPadOrient is the rotation of the shape.
|
|
|
|
* @param aTraceMode is the drawing mode, FILLED or SKETCH.
|
|
|
|
* @param aData an auxiliary info (mainly for gerber format attributes).
|
2010-09-13 11:51:09 +00:00
|
|
|
*/
|
2022-01-16 01:06:25 +00:00
|
|
|
virtual void FlashPadTrapez( const VECTOR2I& aPadPos, const VECTOR2I* aCorners,
|
|
|
|
const EDA_ANGLE& aPadOrient, OUTLINE_MODE aTraceMode,
|
|
|
|
void* aData ) = 0;
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2020-10-18 20:30:37 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Flash a regular polygon. Useful only in Gerber files to flash a regular polygon.
|
|
|
|
*
|
|
|
|
* @param aShapePos is the center of the circle containing the polygon.
|
|
|
|
* @param aRadius is the radius of the circle containing the polygon.
|
|
|
|
* @param aCornerCount is the number of vertices.
|
2022-01-16 01:06:25 +00:00
|
|
|
* @param aOrient is the polygon rotation.
|
2019-10-02 15:16:27 +00:00
|
|
|
* @param aData is a auxiliary parameter used (if needed) to handle extra info
|
2021-06-07 18:31:53 +00:00
|
|
|
* specific to the plotter.
|
2019-10-02 15:16:27 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void FlashRegularPolygon( const VECTOR2I& aShapePos, int aDiameter, int aCornerCount,
|
2022-01-16 01:06:25 +00:00
|
|
|
const EDA_ANGLE& aOrient, OUTLINE_MODE aTraceMode,
|
|
|
|
void* aData ) = 0;
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Draw text with the plotter.
|
|
|
|
*
|
|
|
|
* For convenience it accept the color to use for specific plotters (GERBER) aData is used
|
|
|
|
* to pass extra parameters.
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
virtual void Text( const VECTOR2I& aPos,
|
|
|
|
const COLOR4D& aColor,
|
|
|
|
const wxString& aText,
|
|
|
|
const EDA_ANGLE& aOrient,
|
|
|
|
const VECTOR2I& aSize,
|
|
|
|
enum GR_TEXT_H_ALIGN_T aH_justify,
|
|
|
|
enum GR_TEXT_V_ALIGN_T aV_justify,
|
2022-01-10 01:53:01 +00:00
|
|
|
int aPenWidth,
|
2021-12-29 19:02:50 +00:00
|
|
|
bool aItalic,
|
|
|
|
bool aBold,
|
2022-02-10 20:32:02 +00:00
|
|
|
bool aMultilineAllowed,
|
|
|
|
KIFONT::FONT* aFont,
|
2021-12-29 19:02:50 +00:00
|
|
|
void* aData = nullptr );
|
2011-12-31 05:44:00 +00:00
|
|
|
|
2022-05-15 19:35:00 +00:00
|
|
|
/**
|
|
|
|
* Create a clickable hyperlink with a rectangular click area
|
|
|
|
*
|
|
|
|
* @aBox is the rectangular click target
|
2022-07-03 15:19:55 +00:00
|
|
|
* @aDestinationURL is the target URL
|
2022-05-15 19:35:00 +00:00
|
|
|
*/
|
2022-07-03 15:19:55 +00:00
|
|
|
virtual void HyperlinkBox( const BOX2I& aBox, const wxString& aDestinationURL )
|
2022-05-15 19:35:00 +00:00
|
|
|
{
|
|
|
|
// NOP for most plotters.
|
|
|
|
}
|
|
|
|
|
2022-08-27 22:28:31 +00:00
|
|
|
/**
|
|
|
|
* Create a clickable hyperlink menu with a rectangular click area
|
|
|
|
*
|
|
|
|
* @aBox is the rectangular click target
|
|
|
|
* @aDestURLs is the list of target URLs for the menu
|
|
|
|
*/
|
|
|
|
virtual void HyperlinkMenu( const BOX2I& aBox, const std::vector<wxString>& aDestURLs )
|
|
|
|
{
|
|
|
|
// NOP for most plotters.
|
|
|
|
}
|
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Draw a marker (used for the drill map).
|
2012-05-03 18:37:56 +00:00
|
|
|
*/
|
|
|
|
static const unsigned MARKER_COUNT = 58;
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
2017-06-15 09:28:36 +00:00
|
|
|
* Draw a pattern shape number aShapeId, to coord position.
|
2021-06-07 18:31:53 +00:00
|
|
|
*
|
|
|
|
* @param aPosition is the position of the marker.
|
|
|
|
* @param aDiameter is the diameter of the marker.
|
|
|
|
* @param aShapeId is the index (used to generate forms characters).
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void Marker( const VECTOR2I& position, int diametre, unsigned aShapeId );
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2010-12-06 22:18:39 +00:00
|
|
|
/**
|
2020-10-18 20:30:37 +00:00
|
|
|
* Set the current Gerber layer polarity to positive or negative
|
2010-12-06 22:05:12 +00:00
|
|
|
* by writing \%LPD*\% or \%LPC*\% to the Gerber file, respectively.
|
2012-05-03 18:37:56 +00:00
|
|
|
* (obviously starts a new Gerber layer, too)
|
2021-06-07 18:31:53 +00:00
|
|
|
*
|
2010-12-12 02:29:33 +00:00
|
|
|
* @param aPositive is the layer polarity and true for positive.
|
2012-05-03 18:37:56 +00:00
|
|
|
* It's not useful with most other plotter since they can't 'scratch'
|
|
|
|
* the film like photoplotter imagers do
|
2010-12-06 22:05:12 +00:00
|
|
|
*/
|
2012-05-03 18:37:56 +00:00
|
|
|
virtual void SetLayerPolarity( bool aPositive )
|
|
|
|
{
|
|
|
|
// NOP for most plotters
|
|
|
|
}
|
2010-12-06 22:05:12 +00:00
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
/**
|
|
|
|
* Change the current text mode. See the PlotTextMode
|
2021-06-07 18:31:53 +00:00
|
|
|
* explanation at the beginning of the file.
|
2012-08-29 16:59:50 +00:00
|
|
|
*/
|
2019-12-28 00:55:11 +00:00
|
|
|
virtual void SetTextMode( PLOT_TEXT_MODE mode )
|
2012-08-29 16:59:50 +00:00
|
|
|
{
|
2014-07-04 14:22:38 +00:00
|
|
|
// NOP for most plotters.
|
2014-06-19 06:26:53 +00:00
|
|
|
}
|
|
|
|
|
2014-07-04 14:22:38 +00:00
|
|
|
virtual void SetGerberCoordinatesFormat( int aResolution, bool aUseInches = false )
|
|
|
|
{
|
|
|
|
// NOP for most plotters. Only for Gerber plotter
|
2012-08-29 16:59:50 +00:00
|
|
|
}
|
|
|
|
|
2022-01-28 17:06:47 +00:00
|
|
|
/// Set the number of digits for mantissa in coordinates in mm for SVG plotter
|
|
|
|
virtual void SetSvgCoordinatesFormat( unsigned aPrecision )
|
2020-04-20 22:02:03 +00:00
|
|
|
{
|
|
|
|
// NOP for most plotters. Only for SVG plotter
|
|
|
|
}
|
|
|
|
|
2016-09-19 11:01:36 +00:00
|
|
|
/**
|
2018-07-08 12:12:38 +00:00
|
|
|
* calling this function allows one to define the beginning of a group
|
2016-09-19 11:01:36 +00:00
|
|
|
* of drawing items, for instance in SVG or Gerber format.
|
|
|
|
* (example: group all segments of a letter or a text)
|
|
|
|
* @param aData can define any parameter
|
|
|
|
* for most of plotters: do nothing
|
|
|
|
*/
|
|
|
|
virtual void StartBlock( void* aData ) {}
|
|
|
|
|
|
|
|
/**
|
2018-07-08 12:12:38 +00:00
|
|
|
* calling this function allows one to define the end of a group of drawing
|
|
|
|
* items for instance in SVG or Gerber format.
|
2016-09-19 11:01:36 +00:00
|
|
|
* the group is started by StartBlock()
|
|
|
|
* @param aData can define any parameter
|
|
|
|
* for most of plotters: do nothing
|
|
|
|
*/
|
|
|
|
virtual void EndBlock( void* aData ) {}
|
|
|
|
|
|
|
|
|
2009-06-28 16:50:42 +00:00
|
|
|
protected:
|
2010-12-12 02:29:33 +00:00
|
|
|
// These are marker subcomponents
|
2014-10-19 20:20:16 +00:00
|
|
|
/**
|
|
|
|
* Plot a circle centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerCircle( const VECTOR2I& pos, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a - bar centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerHBar( const VECTOR2I& pos, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a / bar centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerSlash( const VECTOR2I& pos, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a \ bar centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerBackSlash( const VECTOR2I& pos, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a | bar centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerVBar( const VECTOR2I& pos, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a square centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerSquare( const VECTOR2I& position, int radius );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Plot a lozenge centered on the position. Building block for markers
|
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void markerLozenge( const VECTOR2I& position, int radius );
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2010-12-12 02:29:33 +00:00
|
|
|
// Helper function for sketched filler segment
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
2020-10-18 20:30:37 +00:00
|
|
|
* Convert a thick segment and plot it as an oval
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2021-12-29 19:02:50 +00:00
|
|
|
void segmentAsOval( const VECTOR2I& start, const VECTOR2I& end, int width,
|
2020-10-15 23:33:18 +00:00
|
|
|
OUTLINE_MODE tracemode );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
2022-01-16 01:06:25 +00:00
|
|
|
void sketchOval( const VECTOR2I& aPos, const VECTOR2I& aSize, const EDA_ANGLE& aOrient,
|
|
|
|
int aWidth );
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2012-05-03 18:37:56 +00:00
|
|
|
// Coordinate and scaling conversion functions
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Modify coordinates according to the orientation, scale factor, and offsets trace. Also
|
2022-01-20 00:17:44 +00:00
|
|
|
* convert from a VECTOR2I to VECTOR2D, since some output engines needs floating point
|
2021-06-07 18:31:53 +00:00
|
|
|
* coordinates.
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2022-01-20 00:17:44 +00:00
|
|
|
virtual VECTOR2D userToDeviceCoordinates( const VECTOR2I& aCoordinate );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
2022-01-20 00:17:44 +00:00
|
|
|
* Modify size according to the plotter scale factors (VECTOR2I version, returns a VECTOR2D).
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2022-01-20 00:17:44 +00:00
|
|
|
virtual VECTOR2D userToDeviceSize( const VECTOR2I& size );
|
2014-10-19 20:20:16 +00:00
|
|
|
|
|
|
|
/**
|
2021-06-07 18:31:53 +00:00
|
|
|
* Modify size according to the plotter scale factors (simple double version).
|
2014-10-19 20:20:16 +00:00
|
|
|
*/
|
2015-03-10 20:00:50 +00:00
|
|
|
virtual double userToDeviceSize( double size ) const;
|
|
|
|
|
2022-06-28 18:06:17 +00:00
|
|
|
double GetDotMarkLenIU( int aLineWidth ) const;
|
2017-11-13 03:53:27 +00:00
|
|
|
|
2022-06-28 18:06:17 +00:00
|
|
|
double GetDashMarkLenIU( int aLineWidth ) const;
|
2015-03-10 20:00:50 +00:00
|
|
|
|
2022-06-28 18:06:17 +00:00
|
|
|
double GetDashGapLenIU( int aLineWidth ) const;
|
2009-06-28 16:50:42 +00:00
|
|
|
|
2015-03-25 13:07:05 +00:00
|
|
|
protected: // variables used in most of plotters:
|
2012-05-03 18:37:56 +00:00
|
|
|
/// Plot scale - chosen by the user (even implicitly with 'fit in a4')
|
2020-11-16 00:04:55 +00:00
|
|
|
double m_plotScale;
|
2011-12-31 05:44:00 +00:00
|
|
|
|
2014-06-30 10:00:21 +00:00
|
|
|
/* Caller scale (how many IUs in a decimil - always); it's a double
|
2020-10-18 20:30:37 +00:00
|
|
|
* because in Eeschema there are 0.1 IUs in a decimil (Eeschema
|
|
|
|
* always works in mils internally) while PcbNew can work in decimil
|
2012-08-29 16:59:50 +00:00
|
|
|
* or nanometers, so this value would be >= 1 */
|
2020-11-16 00:04:55 +00:00
|
|
|
double m_IUsPerDecimil;
|
2011-12-31 05:44:00 +00:00
|
|
|
|
2020-11-16 00:04:55 +00:00
|
|
|
double m_iuPerDeviceUnit; // Device scale (from IUs to plotter device units;
|
|
|
|
// usually decimils)
|
2021-12-29 19:02:50 +00:00
|
|
|
VECTOR2I m_plotOffset; // Plot offset (in IUs)
|
2020-11-16 00:04:55 +00:00
|
|
|
bool m_plotMirror; // X axis orientation (SVG)
|
|
|
|
// and plot mirrored (only for PS, PDF HPGL and SVG)
|
|
|
|
bool m_mirrorIsHorizontal; // true to mirror horizontally (else vertically)
|
|
|
|
bool m_yaxisReversed; // true if the Y axis is top to bottom (SVG)
|
2013-12-06 18:31:15 +00:00
|
|
|
|
2011-12-31 05:44:00 +00:00
|
|
|
/// Output file
|
2020-11-16 00:04:55 +00:00
|
|
|
FILE* m_outputFile;
|
2011-12-31 05:44:00 +00:00
|
|
|
|
2010-12-12 02:29:33 +00:00
|
|
|
// Pen handling
|
2020-11-16 00:04:55 +00:00
|
|
|
bool m_colorMode; // true to plot in color, otherwise black & white
|
|
|
|
bool m_negativeMode; // true to generate a negative image (PS mode mainly)
|
|
|
|
int m_currentPenWidth;
|
|
|
|
char m_penState; // current pen state: 'U', 'D' or 'Z' (see PenTo)
|
2021-12-29 19:02:50 +00:00
|
|
|
VECTOR2I m_penLastpos; // last pen position; -1,-1 when pen is at rest
|
2020-11-16 00:04:55 +00:00
|
|
|
|
|
|
|
wxString m_creator;
|
|
|
|
wxString m_filename;
|
|
|
|
wxString m_title;
|
|
|
|
PAGE_INFO m_pageInfo;
|
2021-12-29 19:02:50 +00:00
|
|
|
VECTOR2I m_paperSize; // Paper size in IU - not in mils
|
2020-11-16 00:04:55 +00:00
|
|
|
|
|
|
|
wxArrayString m_headerExtraLines; // a set of string to print in header file
|
2020-04-14 12:25:00 +00:00
|
|
|
|
|
|
|
RENDER_SETTINGS* m_renderSettings;
|
2009-06-28 16:50:42 +00:00
|
|
|
};
|
|
|
|
|
2011-12-31 05:44:00 +00:00
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
class TITLE_BLOCK;
|
2020-03-26 11:02:59 +00:00
|
|
|
|
2021-02-22 16:37:43 +00:00
|
|
|
void PlotDrawingSheet( PLOTTER* plotter, const PROJECT* aProject, const TITLE_BLOCK& aTitleBlock,
|
|
|
|
const PAGE_INFO& aPageInfo, const wxString& aSheetNumber, int aSheetCount,
|
2022-04-09 14:38:47 +00:00
|
|
|
const wxString& aSheetName, const wxString& aSheetPath,
|
|
|
|
const wxString& aFilename, COLOR4D aColor = COLOR4D::UNSPECIFIED,
|
|
|
|
bool aIsFirstPage = true );
|
2012-08-29 16:59:50 +00:00
|
|
|
|
|
|
|
/** Returns the default plot extension for a format
|
|
|
|
*/
|
2019-12-28 00:55:11 +00:00
|
|
|
wxString GetDefaultPlotExtension( PLOT_FORMAT aFormat );
|
2012-08-29 16:59:50 +00:00
|
|
|
|
|
|
|
|
2011-12-31 05:44:00 +00:00
|
|
|
#endif // PLOT_COMMON_H_
|