1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2013-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
23  */
24 
25 #ifndef  DS_DRAW_ITEM_H
26 #define  DS_DRAW_ITEM_H
27 
28 #include <core/typeinfo.h>
29 #include <math/vector2d.h>
30 #include <eda_text.h>
31 #include "widgets/msgpanel.h"
32 #include <geometry/shape_poly_set.h>
33 #include <eda_item.h>
34 #include <eda_units.h>
35 
36 #include <algorithm>
37 #include <vector>
38 
39 class DS_DATA_ITEM;
40 class TITLE_BLOCK;
41 class PAGE_INFO;
42 class EDA_ITEM;
43 class EDA_DRAW_FRAME;
44 class PROJECT;
45 
46 /**
47  * Base class to handle basic graphic items.
48  *
49  * Used to draw and/or plot:
50  *  - title blocks and frame references
51  *  - segments
52  *  - rect
53  *  - polygons (for logos)
54  *  - graphic texts
55  *  - bitmaps (also for logos, but they cannot be plot by SVG, GERBER or HPGL plotters
56  *    where we just plot the bounding box)
57  */
58 class DS_DRAW_ITEM_BASE : public EDA_ITEM
59 {
60 public:
~DS_DRAW_ITEM_BASE()61     virtual ~DS_DRAW_ITEM_BASE() {}
62 
GetPeer()63     DS_DATA_ITEM* GetPeer() const { return m_peer; }
GetIndexInPeer()64     int GetIndexInPeer() const { return m_index; }
65 
66     void ViewGetLayers( int aLayers[], int& aCount ) const override;
67 
SetEnd(const wxPoint & aPos)68     virtual void SetEnd( const wxPoint& aPos ) { /* not all types will need this */ }
69 
GetPenWidth()70     virtual int GetPenWidth() const
71     {
72         if( m_penWidth > 0 )
73             return m_penWidth;
74         else
75             return 1;
76     }
77 
78     // The function to print a WS_DRAW_ITEM
PrintWsItem(const RENDER_SETTINGS * aSettings)79     virtual void PrintWsItem( const RENDER_SETTINGS* aSettings )
80     {
81         PrintWsItem( aSettings, wxPoint( 0, 0 ) );
82     }
83 
84     // More advanced version of DrawWsItem. This is what must be defined in the derived type.
85     virtual void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) = 0;
86 
87     // Derived types must define GetBoundingBox() as a minimum, and can then override the
88     // two HitTest() functions if they need something more specific.
89     const EDA_RECT GetBoundingBox() const override = 0;
90 
91     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override
92     {
93         // This is just here to prevent annoying compiler warnings about hidden overloaded
94         // virtual functions
95         return EDA_ITEM::HitTest( aPosition, aAccuracy );
96     }
97 
98     bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
99 
100     void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
101 
102 protected:
DS_DRAW_ITEM_BASE(DS_DATA_ITEM * aPeer,int aIndex,KICAD_T aType)103     DS_DRAW_ITEM_BASE( DS_DATA_ITEM* aPeer, int aIndex, KICAD_T aType ) :
104             EDA_ITEM( aType )
105     {
106         m_peer = aPeer;
107         m_index = aIndex;
108         m_penWidth = 0;
109         m_flags = 0;
110     }
111 
112     DS_DATA_ITEM*  m_peer;       // the parent DS_DATA_ITEM item in the DS_DATA_MODEL
113     int            m_index;      // the index in the parent's repeat count
114     int            m_penWidth;
115 };
116 
117 
118 // This class draws a thick segment
119 class DS_DRAW_ITEM_LINE : public DS_DRAW_ITEM_BASE
120 {
121 public:
DS_DRAW_ITEM_LINE(DS_DATA_ITEM * aPeer,int aIndex,wxPoint aStart,wxPoint aEnd,int aPenWidth)122     DS_DRAW_ITEM_LINE( DS_DATA_ITEM* aPeer, int aIndex, wxPoint aStart, wxPoint aEnd,
123                        int aPenWidth ) :
124             DS_DRAW_ITEM_BASE( aPeer, aIndex, WSG_LINE_T )
125     {
126         m_start     = aStart;
127         m_end       = aEnd;
128         m_penWidth  = aPenWidth;
129     }
130 
GetClass()131     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_LINE" ); }
132 
GetStart()133     const wxPoint&  GetStart() const { return m_start; }
SetStart(const wxPoint & aPos)134     void SetStart( const wxPoint& aPos ) { m_start = aPos; }
GetEnd()135     const wxPoint&  GetEnd() const { return m_end; }
SetEnd(const wxPoint & aPos)136     void SetEnd( const wxPoint& aPos ) override { m_end = aPos; }
137 
GetPosition()138     wxPoint GetPosition() const override { return GetStart(); }
SetPosition(const wxPoint & aPos)139     void SetPosition( const wxPoint& aPos ) override { SetStart( aPos ); }
140 
141     const EDA_RECT GetBoundingBox() const override;
142     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
143 
144     void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
145 
146     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
147 
148 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)149     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
150 #endif
151 
152 private:
153     wxPoint m_start;    // start point of line/rect
154     wxPoint m_end;      // end point
155 };
156 
157 
158 class DS_DRAW_ITEM_POLYPOLYGONS : public DS_DRAW_ITEM_BASE
159 {
160 public:
DS_DRAW_ITEM_POLYPOLYGONS(DS_DATA_ITEM * aPeer,int aIndex,wxPoint aPos,int aPenWidth)161     DS_DRAW_ITEM_POLYPOLYGONS( DS_DATA_ITEM* aPeer, int aIndex, wxPoint aPos, int aPenWidth ) :
162             DS_DRAW_ITEM_BASE( aPeer, aIndex, WSG_POLY_T )
163     {
164         m_penWidth = aPenWidth;
165         m_pos = aPos;
166     }
167 
GetClass()168     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_POLYPOLYGONS" ); }
169 
GetPolygons()170     SHAPE_POLY_SET& GetPolygons() { return m_Polygons; }
GetPosition()171     wxPoint GetPosition() const override { return m_pos; }
172     void SetPosition( const wxPoint& aPos ) override;
173 
174     const EDA_RECT GetBoundingBox() const override;
175     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
176     bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
177 
178     void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
179 
180     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
181 
182 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)183     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
184 #endif
185 
186 public:
187     /**
188      * The list of polygons.
189      *
190      * Because these polygons are only for drawing purposes, each polygon is expected to
191      * have no holes just a main outline.
192      */
193     SHAPE_POLY_SET m_Polygons;
194 
195 
196 private:
197     wxPoint m_pos;      // position of reference point, from the DS_DATA_ITEM_POLYGONS parent
198                         // (used only in drawing sheet editor to draw anchors)
199 };
200 
201 
202 /**
203  * Non filled rectangle with thick segment.
204  */
205 class DS_DRAW_ITEM_RECT : public DS_DRAW_ITEM_BASE
206 {
207 public:
DS_DRAW_ITEM_RECT(DS_DATA_ITEM * aPeer,int aIndex,wxPoint aStart,wxPoint aEnd,int aPenWidth)208     DS_DRAW_ITEM_RECT( DS_DATA_ITEM* aPeer, int aIndex, wxPoint aStart, wxPoint aEnd,
209                        int aPenWidth ) :
210             DS_DRAW_ITEM_BASE( aPeer, aIndex, WSG_RECT_T )
211     {
212         m_start     = aStart;
213         m_end       = aEnd;
214         m_penWidth  = aPenWidth;
215     }
216 
GetClass()217     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_RECT" ); }
218 
GetStart()219     const wxPoint&  GetStart() const { return m_start; }
SetStart(const wxPoint & aPos)220     void SetStart( const wxPoint& aPos ) { m_start = aPos; }
GetEnd()221     const wxPoint&  GetEnd() const { return m_end; }
SetEnd(const wxPoint & aPos)222     void SetEnd( const wxPoint& aPos ) override { m_end = aPos; }
223 
GetPosition()224     wxPoint GetPosition() const override { return GetStart(); }
SetPosition(const wxPoint & aPos)225     void SetPosition( const wxPoint& aPos ) override { SetStart( aPos ); }
226 
227     void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
228 
229     const EDA_RECT GetBoundingBox() const override;
230     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
231     bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
232 
233     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
234 
235 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)236     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
237 #endif
238 
239 private:
240     wxPoint m_start;    // start point of line/rect
241     wxPoint m_end;      // end point
242 };
243 
244 
245 /**
246  * A rectangle with thick segment showing the page limits and a marker showing the coordinate
247  * origin.
248  *
249  * This only a draw item only.  Therefore m_peer ( the parent DS_DATA_ITEM item in the
250  * DS_DATA_MODEL) is always a nullptr.
251  */
252 class DS_DRAW_ITEM_PAGE : public DS_DRAW_ITEM_BASE
253 {
254 public:
DS_DRAW_ITEM_PAGE(int aPenWidth,double aMarkerSize)255     DS_DRAW_ITEM_PAGE( int aPenWidth, double aMarkerSize ) :
256             DS_DRAW_ITEM_BASE( nullptr, 0, WSG_PAGE_T )
257     {
258         m_penWidth  = aPenWidth;
259         m_markerSize = aMarkerSize;
260     }
261 
GetClass()262     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_PAGE" ); }
263 
SetPageSize(const wxSize & aSize)264     void SetPageSize( const wxSize& aSize ) { m_pageSize = aSize; }
GetPageSize()265     wxSize GetPageSize() const { return m_pageSize; }
GetMarkerPos()266     const wxPoint& GetMarkerPos() const { return m_markerPos; }
SetMarkerPos(const wxPoint & aPos)267     void SetMarkerPos( const wxPoint& aPos ) { m_markerPos = aPos; }
GetMarkerSize()268     double GetMarkerSize() const { return m_markerSize; }
269 
GetPosition()270     wxPoint GetPosition() const override { return wxPoint( 0, 0 ); }
SetPosition(const wxPoint & aPos)271     void SetPosition( const wxPoint& aPos ) override { /* do nothing */ }
272 
PrintWsItem(const RENDER_SETTINGS *,const wxPoint &)273     void PrintWsItem( const RENDER_SETTINGS* , const wxPoint& ) override { /* do nothing */ }
274 
275     const EDA_RECT GetBoundingBox() const override;
276     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override { return false; }
277 
278     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
279 
280 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)281     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
282 #endif
283 
284 private:
285     wxPoint m_markerPos;    // position of the marker
286     wxSize  m_pageSize;     // full size of the page
287     double m_markerSize;
288 };
289 
290 
291 /**
292  * A graphic text.
293  *
294  * It is derived from an #EDA_TEXT, so it handle all characteristics of this graphic text
295  * (justification, rotation ... ).
296  */
297 class DS_DRAW_ITEM_TEXT : public DS_DRAW_ITEM_BASE, public EDA_TEXT
298 {
299 public:
300     DS_DRAW_ITEM_TEXT( DS_DATA_ITEM* aPeer, int aIndex, const wxString& aText, const wxPoint& aPos,
301                        const wxSize& aSize, int aPenWidth, bool aItalic = false,
302                        bool aBold = false ) :
DS_DRAW_ITEM_BASE(aPeer,aIndex,WSG_TEXT_T)303             DS_DRAW_ITEM_BASE( aPeer, aIndex, WSG_TEXT_T),
304             EDA_TEXT( aText )
305     {
306         SetTextPos( aPos );
307         SetTextSize( aSize );
308         SetTextThickness( aPenWidth );
309         SetItalic( aItalic );
310         SetBold( aBold );
311     }
312 
GetClass()313     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_TEXT" ); }
314 
315     void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
316 
317     void SetTextAngle( double aAngle ) override;
318 
GetPosition()319     wxPoint GetPosition() const override { return GetTextPos(); }
SetPosition(const wxPoint & aPos)320     void SetPosition( const wxPoint& aPos ) override { SetTextPos( aPos ); }
321 
322     const EDA_RECT GetBoundingBox() const override;
323     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
324     bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
325 
326     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
327 
328 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)329     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
330 #endif
331 };
332 
333 
334 /**
335  * A bitmap.
336  */
337 class DS_DRAW_ITEM_BITMAP : public DS_DRAW_ITEM_BASE
338 {
339 public:
DS_DRAW_ITEM_BITMAP(DS_DATA_ITEM * aPeer,int aIndex,wxPoint aPos)340     DS_DRAW_ITEM_BITMAP( DS_DATA_ITEM* aPeer, int aIndex, wxPoint aPos ) :
341             DS_DRAW_ITEM_BASE( aPeer, aIndex, WSG_BITMAP_T )
342     {
343         m_pos = aPos;
344     }
345 
~DS_DRAW_ITEM_BITMAP()346     ~DS_DRAW_ITEM_BITMAP() {}
347 
GetClass()348     virtual wxString GetClass() const override { return wxT( "DS_DRAW_ITEM_BITMAP" ); }
349 
GetPosition()350     wxPoint GetPosition() const override { return m_pos; }
SetPosition(const wxPoint & aPos)351     void SetPosition( const wxPoint& aPos ) override { m_pos = aPos; }
352 
353     void PrintWsItem( const RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
354 
355     bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
356     bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
357     const EDA_RECT GetBoundingBox() const override;
358 
359     wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
360 
361 #if defined(DEBUG)
Show(int nestLevel,std::ostream & os)362     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
363 #endif
364 
365 private:
366     wxPoint m_pos;                  // position of reference point
367 };
368 
369 
370 /**
371  * Store the list of graphic items:
372  * rect, lines, polygons and texts to draw/plot
373  * the title block and frame references, and parameters to
374  * draw/plot them
375  */
376 class DS_DRAW_ITEM_LIST
377 {
378 public:
DS_DRAW_ITEM_LIST()379     DS_DRAW_ITEM_LIST()
380     {
381         m_idx = 0;
382         m_milsToIu = 1.0;
383         m_penSize = 1;
384         m_pageNumber = "1";
385         m_sheetCount = 1;
386         m_sheetLayer = nullptr;
387         m_titleBlock = nullptr;
388         m_paperFormat = nullptr;
389         m_project = nullptr;
390         m_isFirstPage = true;
391     }
392 
~DS_DRAW_ITEM_LIST()393     ~DS_DRAW_ITEM_LIST()
394     {
395         // Items in the m_graphicList are owned by their respective DS_DATA_ITEMs.
396         // for( DS_DRAW_ITEM_BASE* item : m_graphicList )
397         //     delete item;
398     }
399 
SetProject(const PROJECT * aProject)400     void SetProject( const PROJECT* aProject ) { m_project = aProject; }
401 
402     /**
403      * Set the title block (mainly for drawing sheet editor)
404      */
SetTitleBlock(const TITLE_BLOCK * aTblock)405     void SetTitleBlock( const TITLE_BLOCK* aTblock ) { m_titleBlock = aTblock; }
406 
407     /**
408      * Set the paper format name (mainly for drawing sheet editor)
409      */
SetPaperFormat(const wxString * aFormatName)410     void SetPaperFormat( const wxString* aFormatName ) { m_paperFormat = aFormatName; }
411 
412     /**
413      * Set the filename to draw/plot
414      */
SetFileName(const wxString & aFileName)415     void SetFileName( const wxString& aFileName )
416     {
417         m_fileName = aFileName;
418     }
419 
420     /**
421      * Set the sheet name to draw/plot
422      */
SetSheetName(const wxString & aSheetName)423     void SetSheetName( const wxString& aSheetName )
424     {
425         m_sheetFullName = aSheetName;
426     }
427 
428     /**
429      * Set the sheet layer to draw/plot
430      */
SetSheetLayer(const wxString & aSheetLayer)431     void SetSheetLayer( const wxString& aSheetLayer )
432     {
433         m_sheetLayer = &aSheetLayer;
434     }
435 
SetDefaultPenSize(int aPenSize)436     void SetDefaultPenSize( int aPenSize ) { m_penSize = aPenSize; }
GetDefaultPenSize()437     int GetDefaultPenSize() const { return m_penSize; }
438 
439     /**
440      * Set the scalar to convert pages units (mils) to draw/plot units
441      */
SetMilsToIUfactor(double aMils2Iu)442     void SetMilsToIUfactor( double aMils2Iu )
443     {
444         m_milsToIu = aMils2Iu;
445     }
446 
447     /**
448      * Get the scalar to convert pages units (mils) to draw/plot units
449      */
GetMilsToIUfactor()450     double GetMilsToIUfactor() { return m_milsToIu; }
451 
452     /**
453      * Set the value of the sheet number.
454      */
SetPageNumber(const wxString & aPageNumber)455     void SetPageNumber( const wxString& aPageNumber )
456     {
457         m_pageNumber = aPageNumber;
458     }
459 
460     /**
461      * Set if the page is the first page.
462      */
SetIsFirstPage(bool aIsFirstPage)463     void SetIsFirstPage( bool aIsFirstPage ) { m_isFirstPage = aIsFirstPage; }
464 
465     /**
466      * Set the value of the count of sheets, for basic inscriptions
467      */
SetSheetCount(int aSheetCount)468     void SetSheetCount( int aSheetCount )
469     {
470         m_sheetCount = aSheetCount;
471     }
472 
Append(DS_DRAW_ITEM_BASE * aItem)473     void Append( DS_DRAW_ITEM_BASE* aItem )
474     {
475         m_graphicList.push_back( aItem );
476     }
477 
Remove(DS_DRAW_ITEM_BASE * aItem)478     void Remove( DS_DRAW_ITEM_BASE* aItem )
479     {
480         auto newEnd = std::remove( m_graphicList.begin(), m_graphicList.end(), aItem );
481         m_graphicList.erase( newEnd, m_graphicList.end() );
482     }
483 
GetFirst()484     DS_DRAW_ITEM_BASE* GetFirst()
485     {
486         m_idx = 0;
487 
488         if( m_graphicList.size() )
489             return m_graphicList[0];
490         else
491             return nullptr;
492     }
493 
GetNext()494     DS_DRAW_ITEM_BASE* GetNext()
495     {
496         m_idx++;
497 
498         if( m_graphicList.size() > m_idx )
499             return m_graphicList[m_idx];
500         else
501             return nullptr;
502     }
503 
GetAllItems(std::vector<DS_DRAW_ITEM_BASE * > * aList)504     void GetAllItems( std::vector<DS_DRAW_ITEM_BASE*>* aList )
505     {
506         *aList = m_graphicList;
507     }
508 
509     /**
510      * Draws the item list created by BuildDrawItemsList
511      */
512     void Print( const RENDER_SETTINGS* aSettings );
513 
514     /**
515      * Drawing or plot the drawing sheet.
516      *
517      * Before calling this function, some parameters should be initialized by calling:
518      *   SetPenSize( aPenWidth );
519      *   SetMilsToIUfactor( aMils2Iu );
520      *   SetSheetNumber( aSheetNumber );
521      *   SetSheetCount( aSheetCount );
522      *   SetFileName( aFileName );
523      *   SetSheetName( aFullSheetName );
524      *
525      * @param aPageInfo The PAGE_INFO, for page size, margins...
526      * @param aTitleBlock The sheet title block, for basic inscriptions.
527      * @param aColor The color for drawing.
528      * @param aAltColor The color for items which need to be "highlighted".
529      */
530     void BuildDrawItemsList( const PAGE_INFO& aPageInfo, const TITLE_BLOCK& aTitleBlock );
531 
532     static void GetTextVars( wxArrayString* aVars );
533 
534     /**
535      * Return the full text corresponding to the aTextbase,
536      * after replacing format symbols by the corresponding value
537      *
538      * Basic texts in Ki_WorkSheetData struct use format notation
539      * like "Title %T" to identify at run time the full text
540      * to display.
541      * Currently format identifier is % followed by a letter or 2 letters
542      *
543      * %% = replaced by %
544      * %K = Kicad version
545      * %Z = paper format name (A4, USLetter)
546      * %Y = company name
547      * %D = date
548      * %R = revision
549      * %S = sheet number
550      * %N = number of sheets
551      * %Cx = comment (x = 0 to 9 to identify the comment)
552      * %F = filename
553      * %P = sheet path or sheet full name
554      * %T = title
555      * Other fields like Developer, Verifier, Approver could use %Cx
556      * and are seen as comments for format
557      *
558      * @param aTextbase = the text with format symbols
559      * @return the text, after replacing the format symbols by the actual value
560      */
561     wxString BuildFullText( const wxString& aTextbase );
562 
563 protected:
564     std::vector <DS_DRAW_ITEM_BASE*> m_graphicList;     // Items to draw/plot
565     unsigned           m_idx;             // for GetFirst, GetNext functions
566     double             m_milsToIu;        // the scalar to convert pages units ( mils)
567                                           // to draw/plot units.
568     int                m_penSize;         // The default line width for drawings.
569                                           // used when an item has a pen size = 0
570     bool               m_isFirstPage;     ///< Is this the first page or not.
571     int                m_sheetCount;      ///< The number of sheets
572                                           // for basic inscriptions, in schematic
573     const TITLE_BLOCK* m_titleBlock;      // for basic inscriptions
574     const wxString*    m_paperFormat;     // for basic inscriptions
575     wxString           m_fileName;        // for basic inscriptions
576     wxString           m_sheetFullName;   // for basic inscriptions
577     wxString           m_pageNumber;      ///< The actual page number displayed in the title block.
578     const wxString*    m_sheetLayer;      // for basic inscriptions
579     const PROJECT*     m_project;         // for project-based variable substitutions
580 };
581 
582 
583 #endif      // DS_DRAW_ITEM_H
584