KiCad PCB EDA Suite
ws_data_model.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 1992-2018 Jean-Pierre Charras <jp.charras at wanadoo.fr>.
5  * Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 
27 /*
28  * The WS_DATA_ITEM_* classes define the basic shapes of a page layout (frame references
29  * and title block). The list of these items is stored in a WS_DATA_MODEL instance.
30  *
31  * These items cannot be drawn or plotetd "as is". They must be converted to WS_DRAW_*
32  * types. When building the draw list:
33  * - the WS_DATA_MODEL is used to create a WS_DRAW_ITEM_LIST
34  * - coordinates are converted to draw/plot coordinates.
35  * - texts are expanded if they contain format symbols.
36  * - items with m_RepeatCount > 1 are created m_RepeatCount times.
37  *
38  * The WS_DATA_MODEL is created only once.
39  * The WS_DRAW_ITEM_*s are created and maintained by the PlEditor, but are created each time
40  * they're needed for drawing by the clients (Eeschema, Pcbnew, etc.)
41  *
42  * The WS_DATA_MODEL instance is created from a S expression which describes the page
43  * layout (can be the default page layout or a custom file). This format is also used
44  * for undo/redo storage (wrapped in a WS_PROXY_UNDO_ITEM).
45  */
46 
47 #include <fctsys.h>
48 #include <kiface_i.h>
49 #include <gr_text.h>
50 #include <ws_painter.h>
51 #include <title_block.h>
52 #include <ws_draw_item.h>
53 #include <ws_data_model.h>
54 
55 
56 // The layout shape used in the application
57 // It is accessible by WS_DATA_MODEL::GetTheInstance()
60 
62  m_WSunits2Iu( 1000.0 ),
63  m_DefaultLineWidth( 0.0 ),
64  m_DefaultTextSize( TB_DEFAULT_TEXTSIZE, TB_DEFAULT_TEXTSIZE ),
65  m_DefaultTextThickness( 0.0 ),
66  m_EditMode( false )
67 {
68  m_allowVoidList = false;
69  m_leftMargin = 10.0; // the left page margin in mm
70  m_rightMargin = 10.0; // the right page margin in mm
71  m_topMargin = 10.0; // the top page margin in mm
72  m_bottomMargin = 10.0; // the bottom page margin in mm
73 }
74 
75 /* static function: returns the instance of WS_DATA_MODEL
76  * used in the application
77  */
79 {
80  if( wksAltInstance )
81  return *wksAltInstance;
82  else
83  return wksTheInstance;
84 }
85 
93 {
94  wksAltInstance = aLayout;
95 }
96 
97 
98 void WS_DATA_MODEL::SetupDrawEnvironment( const PAGE_INFO& aPageInfo, double aMilsToIU )
99 {
100 #define MILS_TO_MM (25.4/1000)
101 
102  m_WSunits2Iu = aMilsToIU / MILS_TO_MM;
103 
104  // Left top corner position
105  DPOINT lt_corner;
106  lt_corner.x = GetLeftMargin();
107  lt_corner.y = GetTopMargin();
108  m_LT_Corner = lt_corner;
109 
110  // Right bottom corner position
111  DPOINT rb_corner;
112  rb_corner.x = ( aPageInfo.GetSizeMils().x * MILS_TO_MM ) - GetRightMargin();
113  rb_corner.y = ( aPageInfo.GetSizeMils().y * MILS_TO_MM ) - GetBottomMargin();
114  m_RB_Corner = rb_corner;
115 }
116 
117 
119 {
120  for( WS_DATA_ITEM* item : m_list )
121  delete item;
122 
123  m_list.clear();
124 }
125 
126 
128 {
129  m_list.push_back( aItem );
130 }
131 
132 
134 {
135  auto newEnd = std::remove( m_list.begin(), m_list.end(), aItem );
136  m_list.erase( newEnd, m_list.end() );
137 }
138 
139 
141 {
142  unsigned idx = 0;
143  while( idx < m_list.size() )
144  {
145  if( m_list[idx] == aItem )
146  return (int) idx;
147 
148  idx++;
149  }
150 
151  return -1;
152 }
153 
154 /* return the item from its index aIdx, or NULL if does not exist
155  */
156 WS_DATA_ITEM* WS_DATA_MODEL::GetItem( unsigned aIdx ) const
157 {
158  if( aIdx < m_list.size() )
159  return m_list[aIdx];
160  else
161  return nullptr;
162 }
163 
164 
165 const wxString WS_DATA_MODEL::MakeShortFileName( const wxString& aFullFileName,
166  const wxString& aProjectPath )
167 {
168  wxString shortFileName = aFullFileName;
169  wxFileName fn = aFullFileName;
170 
171  if( fn.IsRelative() )
172  return shortFileName;
173 
174  if( ! aProjectPath.IsEmpty() && aFullFileName.StartsWith( aProjectPath ) )
175  {
176  fn.MakeRelativeTo( aProjectPath );
177  shortFileName = fn.GetFullPath();
178  return shortFileName;
179  }
180 
181  wxString fileName = Kiface().KifaceSearch().FindValidPath( fn.GetFullName() );
182 
183  if( !fileName.IsEmpty() )
184  {
185  fn = fileName;
186  shortFileName = fn.GetFullName();
187  return shortFileName;
188  }
189 
190  return shortFileName;
191 }
192 
193 
194 const wxString WS_DATA_MODEL::MakeFullFileName( const wxString& aShortFileName,
195  const wxString& aProjectPath )
196 {
197  wxString fullFileName = ExpandEnvVarSubstitutions( aShortFileName );
198 
199  if( fullFileName.IsEmpty() )
200  return fullFileName;
201 
202  wxFileName fn = fullFileName;
203 
204  if( fn.IsAbsolute() )
205  return fullFileName;
206 
207  // the path is not absolute: search it in project path, and then in
208  // kicad valid paths
209  if( !aProjectPath.IsEmpty() )
210  {
211  fn.MakeAbsolute( aProjectPath );
212 
213  if( wxFileExists( fn.GetFullPath() ) )
214  return fn.GetFullPath();
215  }
216 
217  fn = fullFileName;
218  wxString name = Kiface().KifaceSearch().FindValidPath( fn.GetFullName() );
219 
220  if( !name.IsEmpty() )
221  fullFileName = name;
222 
223  return fullFileName;
224 }
int GetItemIndex(WS_DATA_ITEM *aItem) const
WS_DATA_MODEL handles the graphic items list to draw/plot the frame and title block.
Definition: ws_data_model.h:39
DPOINT m_RB_Corner
Definition: ws_data_model.h:53
static WS_DATA_MODEL * wksAltInstance
wxString FindValidPath(const wxString &aFileName) const
Definition: search_stack.h:73
double GetTopMargin()
Definition: ws_data_model.h:90
Work sheet structure type definitions.
Definition: ws_data_item.h:93
std::vector< WS_DATA_ITEM * > m_list
Definition: ws_data_model.h:41
double m_bottomMargin
Definition: ws_data_model.h:48
WS_DATA_ITEM * GetItem(unsigned aIdx) const
bool m_allowVoidList
Definition: ws_data_model.h:42
#define TB_DEFAULT_TEXTSIZE
Definition: ws_data_item.h:41
DPOINT m_LT_Corner
Definition: ws_data_model.h:54
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
Definition: kicad.cpp:51
double GetBottomMargin()
Definition: ws_data_model.h:93
double m_leftMargin
Definition: ws_data_model.h:45
void ClearList()
erase the list of items
static WS_DATA_MODEL & GetTheInstance()
static function: returns the instance of WS_DATA_MODEL used in the application
static void SetAltInstance(WS_DATA_MODEL *aLayout=NULL)
static function: Set an alternate instance of WS_DATA_MODEL mainly used in page setting dialog
SEARCH_STACK & KifaceSearch()
Only for DSO specific 'non-library' files.
Definition: kiface_i.h:127
const wxString ExpandEnvVarSubstitutions(const wxString &aString)
Replace any environment variable references with their values.
Definition: common.cpp:458
static const wxString MakeShortFileName(const wxString &aFullFileName, const wxString &aProjectPath)
double GetRightMargin()
Definition: ws_data_model.h:87
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:54
double m_topMargin
Definition: ws_data_model.h:47
const wxSize & GetSizeMils() const
Definition: page_info.h:142
#define MILS_TO_MM
void Remove(WS_DATA_ITEM *aItem)
void SetupDrawEnvironment(const PAGE_INFO &aPageInfo, double aMilsToIU)
static WS_DATA_MODEL wksTheInstance
static const wxString MakeFullFileName(const wxString &aShortFileName, const wxString &aProjectPath)
Static function.
const char * name
Definition: DXF_plotter.cpp:61
double GetLeftMargin()
Definition: ws_data_model.h:84
double m_WSunits2Iu
Definition: ws_data_model.h:51
void Append(WS_DATA_ITEM *aItem)
double m_rightMargin
Definition: ws_data_model.h:46