Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
1047e60e
Commit
1047e60e
authored
Dec 08, 2011
by
Wayne Stambaugh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Encapsulate SCH_POLYLINE, SCH_SHEET, and SCH_TEXT classes.
parent
eb52f4ba
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
573 additions
and
464 deletions
+573
-464
build_BOM.cpp
eeschema/build_BOM.cpp
+30
-6
bus-wire-junction.cpp
eeschema/bus-wire-junction.cpp
+5
-5
dialog_edit_label.cpp
eeschema/dialogs/dialog_edit_label.cpp
+40
-9
edit_label.cpp
eeschema/edit_label.cpp
+4
-4
erc.cpp
eeschema/erc.cpp
+4
-4
hierarch.cpp
eeschema/hierarch.cpp
+1
-1
sch_polyline.cpp
eeschema/sch_polyline.cpp
+51
-26
sch_polyline.h
eeschema/sch_polyline.h
+40
-9
sch_screen.cpp
eeschema/sch_screen.cpp
+1
-1
sch_sheet.cpp
eeschema/sch_sheet.cpp
+137
-132
sch_sheet.h
eeschema/sch_sheet.h
+82
-72
sch_sheet_path.cpp
eeschema/sch_sheet_path.cpp
+1
-1
sch_sheet_pin.cpp
eeschema/sch_sheet_pin.cpp
+40
-50
sch_text.cpp
eeschema/sch_text.cpp
+64
-67
sch_text.h
eeschema/sch_text.h
+39
-45
sheet.cpp
eeschema/sheet.cpp
+20
-19
sheetlab.cpp
eeschema/sheetlab.cpp
+6
-5
base_struct.h
include/base_struct.h
+8
-8
No files found.
eeschema/build_BOM.cpp
View file @
1047e60e
/////////////////////////////////////////////////////////////////////////////
// Name: build_BOM.cpp
// Author: jean-pierre Charras
// License: GPL license
/////////////////////////////////////////////////////////////////////////////
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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
*/
/**
* @file build_BOM.cpp
* @brief Code used to generate bill of materials.
*/
#include <algorithm> // to use sort vector
#include <vector>
...
...
@@ -159,7 +183,7 @@ int PrintListeGLabel( FILE* f, LABEL_OBJECT_LIST& aList )
case
SCH_SHEET_PIN_T
:
{
pinsheet
=
(
SCH_SHEET_PIN
*
)
aList
[
ii
].
m_Label
;
int
jj
=
pinsheet
->
m_Shape
;
int
jj
=
pinsheet
->
GetShape
()
;
if
(
jj
<
0
)
jj
=
NET_TMAX
;
...
...
eeschema/bus-wire-junction.cpp
View file @
1047e60e
...
...
@@ -424,18 +424,18 @@ void SCH_EDIT_FRAME::DeleteCurrentSegment( wxDC* DC )
endpos
=
screen
->
GetCrossHairPosition
();
int
idx
=
polyLine
->
GetCornerCount
()
-
1
;
wxPoint
pt
=
(
*
polyLine
)[
idx
];
if
(
g_HVLines
)
{
/* Coerce the line to vertical or horizontal one: */
if
(
ABS
(
endpos
.
x
-
polyLine
->
m_PolyPoints
[
idx
].
x
)
<
ABS
(
endpos
.
y
-
polyLine
->
m_PolyPoints
[
idx
].
y
)
)
endpos
.
x
=
polyLine
->
m_PolyPoints
[
idx
].
x
;
if
(
ABS
(
endpos
.
x
-
pt
.
x
)
<
ABS
(
endpos
.
y
-
pt
.
y
)
)
endpos
.
x
=
pt
.
x
;
else
endpos
.
y
=
p
olyLine
->
m_PolyPoints
[
idx
]
.
y
;
endpos
.
y
=
p
t
.
y
;
}
polyLine
->
m_PolyPoints
[
idx
]
=
endpos
;
polyLine
->
SetPoint
(
idx
,
endpos
)
;
polyLine
->
Draw
(
DrawPanel
,
DC
,
wxPoint
(
0
,
0
),
g_XorMode
);
}
else
...
...
eeschema/dialogs/dialog_edit_label.cpp
View file @
1047e60e
/////////////////////////////////////////////////////////////////////////////
// Name: dialog_edit_label.cpp
// Author: jean-pierre Charras
// Modified by:
// Created: 18/12/2008 15:46:26
// Licence: GPL
/////////////////////////////////////////////////////////////////////////////
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2008 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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
*/
/**
* @file sch_text.h
* @brief Implementation of the label properties dialog.
*/
#include "fctsys.h"
#include "wx/valgen.h"
...
...
@@ -98,6 +120,7 @@ void DialogLabelEditor::InitDialog()
int
MINTEXTWIDTH
=
40
;
// M's are big characters, a few establish a lot of width
int
max_len
=
0
;
if
(
!
multiLine
)
{
max_len
=
m_CurrentText
->
m_Text
.
Length
();
...
...
@@ -108,6 +131,7 @@ void DialogLabelEditor::InitDialog()
// we cannot use the length of the entire text that has no meaning
int
curr_len
=
MINTEXTWIDTH
;
int
imax
=
m_CurrentText
->
m_Text
.
Len
();
for
(
int
count
=
0
;
count
<
imax
;
count
++
)
{
if
(
m_CurrentText
->
m_Text
[
count
]
==
'\n'
||
...
...
@@ -118,11 +142,13 @@ void DialogLabelEditor::InitDialog()
else
{
curr_len
++
;
if
(
max_len
<
curr_len
)
max_len
=
curr_len
;
}
}
}
if
(
max_len
<
MINTEXTWIDTH
)
max_len
=
MINTEXTWIDTH
;
...
...
@@ -132,11 +158,13 @@ void DialogLabelEditor::InitDialog()
// Set validators
m_TextOrient
->
SetSelection
(
m_CurrentText
->
GetOrientation
()
);
m_TextShape
->
SetSelection
(
m_CurrentText
->
m_Shape
);
m_TextShape
->
SetSelection
(
m_CurrentText
->
GetShape
()
);
int
style
=
0
;
if
(
m_CurrentText
->
m_Italic
)
style
=
1
;
if
(
m_CurrentText
->
m_Bold
)
style
+=
2
;
...
...
@@ -203,6 +231,7 @@ void DialogLabelEditor::TextPropertiesAccept( wxCommandEvent& aEvent )
m_Parent
->
DrawPanel
->
RefreshDrawingRect
(
m_CurrentText
->
GetBoundingBox
()
);
text
=
m_textLabel
->
GetValue
();
if
(
!
text
.
IsEmpty
()
)
m_CurrentText
->
m_Text
=
text
;
else
if
(
(
m_CurrentText
->
m_Flags
&
IS_NEW
)
==
0
)
...
...
@@ -212,10 +241,12 @@ void DialogLabelEditor::TextPropertiesAccept( wxCommandEvent& aEvent )
text
=
m_TextSize
->
GetValue
();
value
=
ReturnValueFromString
(
g_UserUnit
,
text
,
m_Parent
->
m_InternalUnits
);
m_CurrentText
->
m_Size
.
x
=
m_CurrentText
->
m_Size
.
y
=
value
;
if
(
m_TextShape
)
m_CurrentText
->
m_Shape
=
m_TextShape
->
GetSelection
(
);
m_CurrentText
->
SetShape
(
m_TextShape
->
GetSelection
()
);
int
style
=
m_TextStyle
->
GetSelection
();
if
(
(
style
&
1
)
)
m_CurrentText
->
m_Italic
=
1
;
else
...
...
eeschema/edit_label.cpp
View file @
1047e60e
...
...
@@ -87,12 +87,12 @@ SCH_TEXT* SCH_EDIT_FRAME::CreateNewText( wxDC* aDC, int aType )
case
LAYER_HIERLABEL
:
textItem
=
new
SCH_HIERLABEL
(
GetScreen
()
->
GetCrossHairPosition
()
);
textItem
->
m_Shape
=
lastGlobalLabelShape
;
textItem
->
SetShape
(
lastGlobalLabelShape
)
;
break
;
case
LAYER_GLOBLABEL
:
textItem
=
new
SCH_GLOBALLABEL
(
GetScreen
()
->
GetCrossHairPosition
()
);
textItem
->
m_Shape
=
lastGlobalLabelShape
;
textItem
->
SetShape
(
lastGlobalLabelShape
)
;
break
;
default
:
...
...
@@ -121,7 +121,7 @@ SCH_TEXT* SCH_EDIT_FRAME::CreateNewText( wxDC* aDC, int aType )
if
(
(
aType
==
SCH_GLOBAL_LABEL_T
)
||
(
aType
==
SCH_HIERARCHICAL_LABEL_T
)
)
{
lastGlobalLabelShape
=
textItem
->
m_Shape
;
lastGlobalLabelShape
=
textItem
->
GetShape
()
;
}
textItem
->
Draw
(
DrawPanel
,
aDC
,
wxPoint
(
0
,
0
),
GR_DEFAULT_DRAWMODE
);
...
...
@@ -207,7 +207,7 @@ void SCH_EDIT_FRAME::OnConvertTextType( wxCommandEvent& aEvent )
* text item type.
*/
newtext
->
SetFlags
(
text
->
GetFlags
()
);
newtext
->
m_Shape
=
text
->
m_Shape
;
newtext
->
SetShape
(
text
->
GetShape
()
)
;
newtext
->
SetOrientation
(
text
->
GetOrientation
()
);
newtext
->
m_Size
=
text
->
m_Size
;
newtext
->
m_Thickness
=
text
->
m_Thickness
;
...
...
eeschema/erc.cpp
View file @
1047e60e
...
...
@@ -197,8 +197,8 @@ int TestDuplicateSheetNames( bool aCreateMarker )
continue
;
// We have found a second sheet: compare names
if
(
(
(
SCH_SHEET
*
)
item
)
->
m_SheetName
.
CmpNoCase
(
(
(
SCH_SHEET
*
)
test_item
)
->
m_SheetName
)
==
0
)
if
(
(
(
SCH_SHEET
*
)
item
)
->
GetName
()
.
CmpNoCase
(
(
(
SCH_SHEET
*
)
test_item
)
->
GetName
()
)
==
0
)
{
if
(
aCreateMarker
)
{
...
...
@@ -206,9 +206,9 @@ int TestDuplicateSheetNames( bool aCreateMarker )
SCH_MARKER
*
marker
=
new
SCH_MARKER
();
marker
->
m_TimeStamp
=
GetNewTimeStamp
();
marker
->
SetData
(
ERCE_DUPLICATE_SHEET_NAME
,
(
(
SCH_SHEET
*
)
test_item
)
->
m_Pos
,
(
(
SCH_SHEET
*
)
test_item
)
->
GetPosition
()
,
_
(
"Duplicate sheet name"
),
(
(
SCH_SHEET
*
)
test_item
)
->
m_Pos
);
(
(
SCH_SHEET
*
)
test_item
)
->
GetPosition
()
);
marker
->
SetMarkerType
(
MARK_ERC
);
marker
->
SetErrorLevel
(
ERR
);
marker
->
SetNext
(
screen
->
GetDrawItems
()
);
...
...
eeschema/hierarch.cpp
View file @
1047e60e
...
...
@@ -197,7 +197,7 @@ void HIERARCHY_NAVIG_DLG::BuildSheetsTree( SCH_SHEET_PATH* list, wxTreeItemId*
{
SCH_SHEET
*
sheet
=
(
SCH_SHEET
*
)
schitem
;
m_nbsheets
++
;
menu
=
m_Tree
->
AppendItem
(
*
previousmenu
,
sheet
->
m_SheetName
,
0
,
1
);
menu
=
m_Tree
->
AppendItem
(
*
previousmenu
,
sheet
->
GetName
()
,
0
,
1
);
list
->
Push
(
sheet
);
m_Tree
->
SetItemData
(
menu
,
new
TreeItemData
(
*
list
)
);
int
ll
=
m_Tree
->
GetItemText
(
menu
).
Len
();
...
...
eeschema/sch_polyline.cpp
View file @
1047e60e
/**********************/
/* Class SCH_POLYLINE */
/**********************/
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2011 KiCad Developers, see change_log.txt for contributors.
*
* 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
*/
/**
* @file sch_polyline.cpp
*/
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -18,7 +43,7 @@
SCH_POLYLINE
::
SCH_POLYLINE
(
int
layer
)
:
SCH_ITEM
(
NULL
,
SCH_POLYLINE_T
)
{
m_
W
idth
=
0
;
m_
w
idth
=
0
;
switch
(
layer
)
{
...
...
@@ -38,8 +63,8 @@ SCH_POLYLINE::SCH_POLYLINE( int layer ) :
SCH_POLYLINE
::
SCH_POLYLINE
(
const
SCH_POLYLINE
&
aPolyLine
)
:
SCH_ITEM
(
aPolyLine
)
{
m_
Width
=
aPolyLine
.
m_W
idth
;
m_
PolyPoints
=
aPolyLine
.
m_PolyP
oints
;
m_
width
=
aPolyLine
.
m_w
idth
;
m_
points
=
aPolyLine
.
m_p
oints
;
}
...
...
@@ -74,7 +99,7 @@ bool SCH_POLYLINE::Save( FILE* aFile ) const
for
(
unsigned
ii
=
0
;
ii
<
GetCornerCount
();
ii
++
)
{
if
(
fprintf
(
aFile
,
"
\t
%-4d %-4d
\n
"
,
m_
PolyPoints
[
ii
].
x
,
m_PolyP
oints
[
ii
].
y
)
==
EOF
)
if
(
fprintf
(
aFile
,
"
\t
%-4d %-4d
\n
"
,
m_
points
[
ii
].
x
,
m_p
oints
[
ii
].
y
)
==
EOF
)
{
success
=
false
;
break
;
...
...
@@ -133,7 +158,7 @@ bool SCH_POLYLINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
int
SCH_POLYLINE
::
GetPenSize
()
const
{
int
pensize
=
(
m_
Width
==
0
)
?
g_DrawDefaultLineThickness
:
m_W
idth
;
int
pensize
=
(
m_
width
==
0
)
?
g_DrawDefaultLineThickness
:
m_w
idth
;
return
pensize
;
}
...
...
@@ -157,19 +182,19 @@ void SCH_POLYLINE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffs
width
*=
3
;
}
GRMoveTo
(
m_
PolyPoints
[
0
].
x
,
m_PolyP
oints
[
0
].
y
);
GRMoveTo
(
m_
points
[
0
].
x
,
m_p
oints
[
0
].
y
);
if
(
m_Layer
==
LAYER_NOTES
)
{
for
(
unsigned
i
=
1
;
i
<
GetCornerCount
();
i
++
)
GRDashedLineTo
(
&
aPanel
->
m_ClipBox
,
aDC
,
m_
PolyP
oints
[
i
].
x
+
aOffset
.
x
,
m_
PolyP
oints
[
i
].
y
+
aOffset
.
y
,
width
,
color
);
GRDashedLineTo
(
&
aPanel
->
m_ClipBox
,
aDC
,
m_
p
oints
[
i
].
x
+
aOffset
.
x
,
m_
p
oints
[
i
].
y
+
aOffset
.
y
,
width
,
color
);
}
else
{
for
(
unsigned
i
=
1
;
i
<
GetCornerCount
();
i
++
)
GRLineTo
(
&
aPanel
->
m_ClipBox
,
aDC
,
m_
PolyP
oints
[
i
].
x
+
aOffset
.
x
,
m_
PolyP
oints
[
i
].
y
+
aOffset
.
y
,
width
,
color
);
GRLineTo
(
&
aPanel
->
m_ClipBox
,
aDC
,
m_
p
oints
[
i
].
x
+
aOffset
.
x
,
m_
p
oints
[
i
].
y
+
aOffset
.
y
,
width
,
color
);
}
}
...
...
@@ -178,9 +203,9 @@ void SCH_POLYLINE::Mirror_X( int aXaxis_position )
{
for
(
unsigned
ii
=
0
;
ii
<
GetCornerCount
();
ii
++
)
{
m_
PolyP
oints
[
ii
].
y
-=
aXaxis_position
;
NEGATE
(
m_
PolyP
oints
[
ii
].
y
);
m_
PolyP
oints
[
ii
].
y
=
aXaxis_position
;
m_
p
oints
[
ii
].
y
-=
aXaxis_position
;
NEGATE
(
m_
p
oints
[
ii
].
y
);
m_
p
oints
[
ii
].
y
=
aXaxis_position
;
}
}
...
...
@@ -189,9 +214,9 @@ void SCH_POLYLINE::Mirror_Y( int aYaxis_position )
{
for
(
unsigned
ii
=
0
;
ii
<
GetCornerCount
();
ii
++
)
{
m_
PolyP
oints
[
ii
].
x
-=
aYaxis_position
;
NEGATE
(
m_
PolyP
oints
[
ii
].
x
);
m_
PolyP
oints
[
ii
].
x
=
aYaxis_position
;
m_
p
oints
[
ii
].
x
-=
aYaxis_position
;
NEGATE
(
m_
p
oints
[
ii
].
x
);
m_
p
oints
[
ii
].
x
=
aYaxis_position
;
}
}
...
...
@@ -200,7 +225,7 @@ void SCH_POLYLINE::Rotate( wxPoint rotationPoint )
{
for
(
unsigned
ii
=
0
;
ii
<
GetCornerCount
();
ii
++
)
{
RotatePoint
(
&
m_
PolyP
oints
[
ii
],
rotationPoint
,
900
);
RotatePoint
(
&
m_
p
oints
[
ii
],
rotationPoint
,
900
);
}
}
...
...
@@ -227,7 +252,7 @@ wxString SCH_POLYLINE::GetSelectMenuText() const
fmt
=
_
(
"Polyline on Unkown Layer with %d Points"
);
}
menuText
.
Printf
(
fmt
,
m_
PolyP
oints
.
size
()
);
menuText
.
Printf
(
fmt
,
m_
p
oints
.
size
()
);
return
menuText
;
}
...
...
@@ -246,9 +271,9 @@ BITMAP_DEF SCH_POLYLINE::GetMenuImage() const
bool
SCH_POLYLINE
::
doHitTest
(
const
wxPoint
&
aPoint
,
int
aAccuracy
)
const
{
for
(
size_t
i
=
0
;
i
<
m_
PolyP
oints
.
size
()
-
1
;
i
++
)
for
(
size_t
i
=
0
;
i
<
m_
p
oints
.
size
()
-
1
;
i
++
)
{
if
(
TestSegmentHit
(
aPoint
,
m_
PolyPoints
[
i
],
m_PolyP
oints
[
i
+
1
],
aAccuracy
)
)
if
(
TestSegmentHit
(
aPoint
,
m_
points
[
i
],
m_p
oints
[
i
+
1
],
aAccuracy
)
)
return
true
;
}
...
...
@@ -271,9 +296,9 @@ bool SCH_POLYLINE::doHitTest( const EDA_RECT& aRect, bool aContained, int aAccur
void
SCH_POLYLINE
::
doSetPosition
(
const
wxPoint
&
aPosition
)
{
wxPoint
offset
=
m_
PolyP
oints
[
0
]
-
aPosition
;
wxPoint
offset
=
m_
p
oints
[
0
]
-
aPosition
;
for
(
size_t
i
=
0
;
i
<
m_
PolyP
oints
.
size
();
i
++
)
m_
PolyPoints
[
i
]
=
m_PolyP
oints
[
i
]
-
offset
;
for
(
size_t
i
=
0
;
i
<
m_
p
oints
.
size
();
i
++
)
m_
points
[
i
]
=
m_p
oints
[
i
]
-
offset
;
}
eeschema/sch_polyline.h
View file @
1047e60e
...
...
@@ -37,9 +37,8 @@
class
SCH_POLYLINE
:
public
SCH_ITEM
{
public
:
int
m_Width
;
/* Thickness */
std
::
vector
<
wxPoint
>
m_PolyPoints
;
// list of points (>= 2)
int
m_width
;
/* Thickness */
std
::
vector
<
wxPoint
>
m_points
;
// list of points (>= 2)
public
:
SCH_POLYLINE
(
int
layer
=
LAYER_NOTES
);
...
...
@@ -77,19 +76,36 @@ public:
/**
* Function AddPoint
* add a corner to m_
PolyP
oints
* add a corner to m_
p
oints
*/
void
AddPoint
(
const
wxPoint
&
point
)
{
m_
PolyP
oints
.
push_back
(
point
);
m_
p
oints
.
push_back
(
point
);
}
/**
* Function SetPoint
* sets the point at \a aIndex in the list to \a aPoint.
*
* @param aIndex The index in the point list.
* @param aPoint The new point value.
*/
void
SetPoint
(
int
aIndex
,
const
wxPoint
&
aPoint
)
{
// (unsigned) excludes aIndex<0 also
wxCHECK_RET
(
(
unsigned
)
aIndex
<
m_points
.
size
(),
wxT
(
"Invalid SCH_POLYLINE point list index."
)
);
m_points
[
aIndex
]
=
aPoint
;
}
/**
* Function GetCornerCount
* @return the number of corners
*/
unsigned
GetCornerCount
()
const
{
return
m_PolyPoints
.
size
();
}
unsigned
GetCornerCount
()
const
{
return
m_points
.
size
();
}
/**
* Function GetPenSize
...
...
@@ -105,7 +121,7 @@ public:
virtual
void
Move
(
const
wxPoint
&
aMoveVector
)
{
for
(
unsigned
ii
=
0
;
ii
<
GetCornerCount
();
ii
++
)
m_
PolyP
oints
[
ii
]
+=
aMoveVector
;
m_
p
oints
[
ii
]
+=
aMoveVector
;
}
/**
...
...
@@ -123,11 +139,26 @@ public:
virtual
BITMAP_DEF
GetMenuImage
()
const
;
/**
* Function operator[]
* is used for read only access and returns the point at \a aIndex.
* @param aIndex The index of the list of points to return.
* @return A wxPoint object containing the point at \a aIndex.
*/
wxPoint
operator
[](
int
aIndex
)
const
{
// (unsigned) excludes aIndex<0 also
wxCHECK_MSG
(
(
unsigned
)
aIndex
<
m_points
.
size
(),
wxDefaultPosition
,
wxT
(
"Invalid SCH_POLYLINE point list index."
)
);
return
m_points
[
aIndex
];
}
private
:
virtual
bool
doHitTest
(
const
wxPoint
&
aPoint
,
int
aAccuracy
)
const
;
virtual
bool
doHitTest
(
const
EDA_RECT
&
aRect
,
bool
aContained
,
int
aAccuracy
)
const
;
virtual
EDA_ITEM
*
doClone
()
const
;
virtual
wxPoint
doGetPosition
()
const
{
return
m_
PolyP
oints
[
0
];
}
virtual
wxPoint
doGetPosition
()
const
{
return
m_
p
oints
[
0
];
}
virtual
void
doSetPosition
(
const
wxPoint
&
aPosition
);
};
...
...
eeschema/sch_screen.cpp
View file @
1047e60e
...
...
@@ -720,7 +720,7 @@ SCH_SHEET* SCH_SCREEN::GetSheet( const wxString& aName )
SCH_SHEET
*
sheet
=
(
SCH_SHEET
*
)
item
;
if
(
aName
.
CmpNoCase
(
sheet
->
m_SheetName
)
==
0
)
if
(
aName
.
CmpNoCase
(
sheet
->
GetName
()
)
==
0
)
return
sheet
;
}
...
...
eeschema/sch_sheet.cpp
View file @
1047e60e
...
...
@@ -51,50 +51,50 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) :
SCH_ITEM
(
NULL
,
SCH_SHEET_T
)
{
m_Layer
=
LAYER_SHEET
;
m_
P
os
=
pos
;
m_
S
ize
=
wxSize
(
MIN_SHEET_WIDTH
,
MIN_SHEET_HEIGHT
);
m_
p
os
=
pos
;
m_
s
ize
=
wxSize
(
MIN_SHEET_WIDTH
,
MIN_SHEET_HEIGHT
);
m_TimeStamp
=
GetNewTimeStamp
();
m_
SheetNameSize
=
m_F
ileNameSize
=
60
;
m_
AssociatedS
creen
=
NULL
;
m_
SheetN
ame
.
Printf
(
wxT
(
"Sheet%8.8lX"
),
m_TimeStamp
);
m_
F
ileName
.
Printf
(
wxT
(
"file%8.8lX.sch"
),
m_TimeStamp
);
m_
sheetNameSize
=
m_f
ileNameSize
=
60
;
m_
s
creen
=
NULL
;
m_
n
ame
.
Printf
(
wxT
(
"Sheet%8.8lX"
),
m_TimeStamp
);
m_
f
ileName
.
Printf
(
wxT
(
"file%8.8lX.sch"
),
m_TimeStamp
);
}
SCH_SHEET
::
SCH_SHEET
(
const
SCH_SHEET
&
aSheet
)
:
SCH_ITEM
(
aSheet
)
{
m_
Pos
=
aSheet
.
m_P
os
;
m_
Size
=
aSheet
.
m_S
ize
;
m_
pos
=
aSheet
.
m_p
os
;
m_
size
=
aSheet
.
m_s
ize
;
m_Layer
=
aSheet
.
m_Layer
;
m_TimeStamp
=
aSheet
.
m_TimeStamp
;
m_
SheetNameSize
=
aSheet
.
m_S
heetNameSize
;
m_
FileNameSize
=
aSheet
.
m_F
ileNameSize
;
m_
AssociatedScreen
=
aSheet
.
m_AssociatedS
creen
;
m_
SheetName
=
aSheet
.
m_SheetN
ame
;
m_
FileName
=
aSheet
.
m_F
ileName
;
m_
sheetNameSize
=
aSheet
.
m_s
heetNameSize
;
m_
fileNameSize
=
aSheet
.
m_f
ileNameSize
;
m_
screen
=
aSheet
.
m_s
creen
;
m_
name
=
aSheet
.
m_n
ame
;
m_
fileName
=
aSheet
.
m_f
ileName
;
m_pins
=
aSheet
.
m_pins
;
for
(
size_t
i
=
0
;
i
<
m_pins
.
size
();
i
++
)
m_pins
[
i
].
SetParent
(
this
);
if
(
m_
AssociatedS
creen
)
m_
AssociatedS
creen
->
IncRefCount
();
if
(
m_
s
creen
)
m_
s
creen
->
IncRefCount
();
}
SCH_SHEET
::~
SCH_SHEET
()
{
wxLogDebug
(
wxT
(
"Destroying sheet "
)
+
m_
SheetN
ame
);
wxLogDebug
(
wxT
(
"Destroying sheet "
)
+
m_
n
ame
);
// also, look at the associated sheet & its reference count
// perhaps it should be deleted also.
if
(
m_
AssociatedS
creen
)
if
(
m_
s
creen
)
{
m_
AssociatedS
creen
->
DecRefCount
();
m_
s
creen
->
DecRefCount
();
if
(
m_
AssociatedS
creen
->
GetRefCount
()
==
0
)
delete
m_
AssociatedS
creen
;
if
(
m_
s
creen
->
GetRefCount
()
==
0
)
delete
m_
s
creen
;
}
}
...
...
@@ -107,33 +107,33 @@ EDA_ITEM* SCH_SHEET::doClone() const
void
SCH_SHEET
::
SetScreen
(
SCH_SCREEN
*
aScreen
)
{
if
(
aScreen
==
m_
AssociatedS
creen
)
if
(
aScreen
==
m_
s
creen
)
return
;
if
(
m_
AssociatedS
creen
!=
NULL
)
if
(
m_
s
creen
!=
NULL
)
{
m_
AssociatedS
creen
->
DecRefCount
();
m_
s
creen
->
DecRefCount
();
if
(
m_
AssociatedS
creen
->
GetRefCount
()
==
0
)
if
(
m_
s
creen
->
GetRefCount
()
==
0
)
{
delete
m_
AssociatedS
creen
;
m_
AssociatedS
creen
=
NULL
;
delete
m_
s
creen
;
m_
s
creen
=
NULL
;
}
}
m_
AssociatedS
creen
=
aScreen
;
m_
s
creen
=
aScreen
;
if
(
m_
AssociatedS
creen
)
m_
AssociatedS
creen
->
IncRefCount
();
if
(
m_
s
creen
)
m_
s
creen
->
IncRefCount
();
}
int
SCH_SHEET
::
GetScreenCount
()
const
{
if
(
m_
AssociatedS
creen
==
NULL
)
if
(
m_
s
creen
==
NULL
)
return
0
;
return
m_
AssociatedS
creen
->
GetRefCount
();
return
m_
s
creen
->
GetRefCount
();
}
...
...
@@ -141,7 +141,7 @@ bool SCH_SHEET::Save( FILE* aFile ) const
{
if
(
fprintf
(
aFile
,
"$Sheet
\n
"
)
==
EOF
||
fprintf
(
aFile
,
"S %-4d %-4d %-4d %-4d
\n
"
,
m_
Pos
.
x
,
m_Pos
.
y
,
m_Size
.
x
,
m_S
ize
.
y
)
==
EOF
)
m_
pos
.
x
,
m_pos
.
y
,
m_size
.
x
,
m_s
ize
.
y
)
==
EOF
)
return
false
;
//save the unique timestamp, like other schematic parts.
...
...
@@ -149,17 +149,17 @@ bool SCH_SHEET::Save( FILE* aFile ) const
return
false
;
/* Save schematic sheetname and filename. */
if
(
!
m_
SheetN
ame
.
IsEmpty
()
)
if
(
!
m_
n
ame
.
IsEmpty
()
)
{
if
(
fprintf
(
aFile
,
"F0 %s %d
\n
"
,
EscapedUTF8
(
m_
SheetN
ame
).
c_str
(),
m_
S
heetNameSize
)
==
EOF
)
if
(
fprintf
(
aFile
,
"F0 %s %d
\n
"
,
EscapedUTF8
(
m_
n
ame
).
c_str
(),
m_
s
heetNameSize
)
==
EOF
)
return
false
;
}
if
(
!
m_
F
ileName
.
IsEmpty
()
)
if
(
!
m_
f
ileName
.
IsEmpty
()
)
{
if
(
fprintf
(
aFile
,
"F1 %s %d
\n
"
,
EscapedUTF8
(
m_
F
ileName
).
c_str
(),
m_
F
ileNameSize
)
==
EOF
)
if
(
fprintf
(
aFile
,
"F1 %s %d
\n
"
,
EscapedUTF8
(
m_
f
ileName
).
c_str
(),
m_
f
ileNameSize
)
==
EOF
)
return
false
;
}
...
...
@@ -204,7 +204,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
/* Next line: must be "S xx yy nn mm" with xx, yy = sheet position
* ( upper left corner ) et nn,mm = sheet size */
if
(
(
sscanf
(
&
((
char
*
)
aLine
)[
1
],
"%d %d %d %d"
,
&
m_
Pos
.
x
,
&
m_Pos
.
y
,
&
m_Size
.
x
,
&
m_S
ize
.
y
)
!=
4
)
&
m_
pos
.
x
,
&
m_pos
.
y
,
&
m_size
.
x
,
&
m_s
ize
.
y
)
!=
4
)
||
(
((
char
*
)
aLine
)[
0
]
!=
'S'
)
)
{
aErrorMsg
.
Printf
(
wxT
(
" ** Eeschema file sheet struct error at line %d, aborted
\n
"
),
...
...
@@ -239,6 +239,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
* F1 and "text" for filename
*/
ptcar
=
((
char
*
)
aLine
);
while
(
*
ptcar
&&
(
*
ptcar
!=
'"'
)
)
ptcar
++
;
...
...
@@ -270,18 +271,19 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
aErrorMsg
<<
FROM_UTF8
(
(
char
*
)
aLine
);
}
if
(
size
==
0
)
size
=
DEFAULT_SIZE_TEXT
;
if
(
fieldNdx
==
0
)
{
m_
SheetN
ame
=
sheetName
;
m_
S
heetNameSize
=
size
;
m_
n
ame
=
sheetName
;
m_
s
heetNameSize
=
size
;
}
else
{
SetFileName
(
sheetName
);
m_
F
ileNameSize
=
size
;
m_
f
ileNameSize
=
size
;
}
}
...
...
@@ -320,11 +322,11 @@ void SCH_SHEET::SwapData( SCH_ITEM* aItem )
SCH_SHEET
*
sheet
=
(
SCH_SHEET
*
)
aItem
;
EXCHG
(
m_
Pos
,
sheet
->
m_P
os
);
EXCHG
(
m_
Size
,
sheet
->
m_S
ize
);
EXCHG
(
m_
SheetName
,
sheet
->
m_SheetN
ame
);
EXCHG
(
m_
SheetNameSize
,
sheet
->
m_S
heetNameSize
);
EXCHG
(
m_
FileNameSize
,
sheet
->
m_F
ileNameSize
);
EXCHG
(
m_
pos
,
sheet
->
m_p
os
);
EXCHG
(
m_
size
,
sheet
->
m_s
ize
);
EXCHG
(
m_
name
,
sheet
->
m_n
ame
);
EXCHG
(
m_
sheetNameSize
,
sheet
->
m_s
heetNameSize
);
EXCHG
(
m_
fileNameSize
,
sheet
->
m_f
ileNameSize
);
m_pins
.
swap
(
sheet
->
m_pins
);
// Ensure sheet labels have their .m_Parent member pointing really on their
...
...
@@ -369,7 +371,7 @@ void SCH_SHEET::RemovePin( SCH_SHEET_PIN* aSheetPin )
}
wxLogDebug
(
wxT
(
"Fix me: attempt to remove label %s which is not in sheet %s."
),
GetChars
(
aSheetPin
->
m_Text
),
GetChars
(
m_
SheetN
ame
)
);
GetChars
(
aSheetPin
->
m_Text
),
GetChars
(
m_
n
ame
)
);
}
...
...
@@ -401,7 +403,7 @@ bool SCH_SHEET::HasUndefinedPins()
BOOST_FOREACH
(
SCH_SHEET_PIN
pin
,
m_pins
)
{
/* Search the schematic for a hierarchical label corresponding to this sheet label. */
EDA_ITEM
*
DrawStruct
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
DrawStruct
=
m_
s
creen
->
GetDrawItems
();
SCH_HIERLABEL
*
HLabel
=
NULL
;
for
(
;
DrawStruct
!=
NULL
;
DrawStruct
=
DrawStruct
->
Next
()
)
...
...
@@ -465,7 +467,7 @@ int SCH_SHEET::GetMinHeight() const
for
(
size_t
i
=
0
;
i
<
m_pins
.
size
();
i
++
)
{
int
pinY
=
m_pins
[
i
].
m_Pos
.
y
-
m_
P
os
.
y
;
int
pinY
=
m_pins
[
i
].
m_Pos
.
y
-
m_
p
os
.
y
;
if
(
pinY
>
height
)
height
=
pinY
;
...
...
@@ -509,7 +511,7 @@ void SCH_SHEET::CleanupSheet()
while
(
i
!=
m_pins
.
end
()
)
{
/* Search the schematic for a hierarchical label corresponding to this sheet label. */
EDA_ITEM
*
DrawStruct
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
DrawStruct
=
m_
s
creen
->
GetDrawItems
();
SCH_HIERLABEL
*
HLabel
=
NULL
;
for
(
;
DrawStruct
!=
NULL
;
DrawStruct
=
DrawStruct
->
Next
()
)
...
...
@@ -553,11 +555,12 @@ int SCH_SHEET::GetPenSize() const
wxPoint
SCH_SHEET
::
GetSheetNamePosition
()
{
wxPoint
pos
=
m_Pos
;
wxPoint
pos
=
m_pos
;
if
(
IsVerticalOrientation
()
)
{
pos
.
x
-=
8
;
pos
.
y
+=
m_
S
ize
.
y
;
pos
.
y
+=
m_
s
ize
.
y
;
}
else
{
...
...
@@ -570,17 +573,17 @@ wxPoint SCH_SHEET::GetSheetNamePosition()
wxPoint
SCH_SHEET
::
GetFileNamePosition
()
{
wxPoint
pos
=
m_
P
os
;
wxPoint
pos
=
m_
p
os
;
int
margin
=
GetPenSize
()
+
4
;
if
(
IsVerticalOrientation
()
)
{
pos
.
x
+=
m_
S
ize
.
x
+
margin
;
pos
.
y
+=
m_
S
ize
.
y
;
pos
.
x
+=
m_
s
ize
.
x
+
margin
;
pos
.
y
+=
m_
s
ize
.
y
;
}
else
{
pos
.
y
+=
m_
S
ize
.
y
+
margin
;
pos
.
y
+=
m_
s
ize
.
y
+
margin
;
}
return
pos
;
...
...
@@ -595,7 +598,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
int
color
;
int
name_orientation
;
wxPoint
pos_sheetname
,
pos_filename
;
wxPoint
pos
=
m_
P
os
+
aOffset
;
wxPoint
pos
=
m_
p
os
+
aOffset
;
int
lineWidth
=
GetPenSize
();
if
(
aColor
>=
0
)
...
...
@@ -606,7 +609,7 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
GRSetDrawMode
(
aDC
,
aDrawMode
);
GRRect
(
&
aPanel
->
m_ClipBox
,
aDC
,
pos
.
x
,
pos
.
y
,
pos
.
x
+
m_
Size
.
x
,
pos
.
y
+
m_S
ize
.
y
,
lineWidth
,
color
);
pos
.
x
+
m_
size
.
x
,
pos
.
y
+
m_s
ize
.
y
,
lineWidth
,
color
);
pos_sheetname
=
GetSheetNamePosition
()
+
aOffset
;
pos_filename
=
GetFileNamePosition
()
+
aOffset
;
...
...
@@ -622,10 +625,10 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
else
txtcolor
=
ReturnLayerColor
(
LAYER_SHEETNAME
);
Text
=
wxT
(
"Sheet: "
)
+
m_
SheetN
ame
;
Text
=
wxT
(
"Sheet: "
)
+
m_
n
ame
;
DrawGraphicText
(
aPanel
,
aDC
,
pos_sheetname
,
(
EDA_Colors
)
txtcolor
,
Text
,
name_orientation
,
wxSize
(
m_
SheetNameSize
,
m_S
heetNameSize
),
wxSize
(
m_
sheetNameSize
,
m_s
heetNameSize
),
GR_TEXT_HJUSTIFY_LEFT
,
GR_TEXT_VJUSTIFY_BOTTOM
,
lineWidth
,
false
,
false
);
...
...
@@ -635,10 +638,10 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
else
txtcolor
=
ReturnLayerColor
(
LAYER_SHEETFILENAME
);
Text
=
wxT
(
"File: "
)
+
m_
F
ileName
;
Text
=
wxT
(
"File: "
)
+
m_
f
ileName
;
DrawGraphicText
(
aPanel
,
aDC
,
pos_filename
,
(
EDA_Colors
)
txtcolor
,
Text
,
name_orientation
,
wxSize
(
m_
FileNameSize
,
m_F
ileNameSize
),
wxSize
(
m_
fileNameSize
,
m_f
ileNameSize
),
GR_TEXT_HJUSTIFY_LEFT
,
GR_TEXT_VJUSTIFY_TOP
,
lineWidth
,
false
,
false
);
...
...
@@ -655,26 +658,26 @@ void SCH_SHEET::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
EDA_RECT
SCH_SHEET
::
GetBoundingBox
()
const
{
wxPoint
end
;
EDA_RECT
box
(
m_
Pos
,
m_S
ize
);
EDA_RECT
box
(
m_
pos
,
m_s
ize
);
int
lineWidth
=
GetPenSize
();
// Determine length of texts
wxString
text
=
wxT
(
"Sheet: "
)
+
m_
SheetN
ame
;
int
textlen
=
ReturnGraphicTextWidth
(
text
,
m_
S
heetNameSize
,
false
,
lineWidth
);
text
=
wxT
(
"File: "
)
+
m_
F
ileName
;
int
textlen2
=
ReturnGraphicTextWidth
(
text
,
m_
F
ileNameSize
,
false
,
lineWidth
);
wxString
text
=
wxT
(
"Sheet: "
)
+
m_
n
ame
;
int
textlen
=
ReturnGraphicTextWidth
(
text
,
m_
s
heetNameSize
,
false
,
lineWidth
);
text
=
wxT
(
"File: "
)
+
m_
f
ileName
;
int
textlen2
=
ReturnGraphicTextWidth
(
text
,
m_
f
ileNameSize
,
false
,
lineWidth
);
// Calculate bounding box X size:
textlen
=
MAX
(
textlen
,
textlen2
);
end
.
x
=
MAX
(
m_
S
ize
.
x
,
textlen
);
end
.
x
=
MAX
(
m_
s
ize
.
x
,
textlen
);
// Calculate bounding box pos:
end
.
y
=
m_
S
ize
.
y
;
end
+=
m_
P
os
;
end
.
y
=
m_
s
ize
.
y
;
end
+=
m_
p
os
;
// Move upper and lower limits to include texts:
box
.
m_Pos
.
y
-=
wxRound
(
m_
S
heetNameSize
*
1.3
)
+
8
;
end
.
y
+=
wxRound
(
m_
F
ileNameSize
*
1.3
)
+
8
;
box
.
m_Pos
.
y
-=
wxRound
(
m_
s
heetNameSize
*
1.3
)
+
8
;
end
.
y
+=
wxRound
(
m_
f
ileNameSize
*
1.3
)
+
8
;
box
.
SetEnd
(
end
);
box
.
Inflate
(
lineWidth
/
2
);
...
...
@@ -687,11 +690,11 @@ int SCH_SHEET::ComponentCount()
{
int
n
=
0
;
if
(
m_
AssociatedS
creen
)
if
(
m_
s
creen
)
{
EDA_ITEM
*
bs
;
for
(
bs
=
m_
AssociatedS
creen
->
GetDrawItems
();
bs
!=
NULL
;
bs
=
bs
->
Next
()
)
for
(
bs
=
m_
s
creen
->
GetDrawItems
();
bs
!=
NULL
;
bs
=
bs
->
Next
()
)
{
if
(
bs
->
Type
()
==
SCH_COMPONENT_T
)
{
...
...
@@ -715,9 +718,9 @@ int SCH_SHEET::ComponentCount()
bool
SCH_SHEET
::
SearchHierarchy
(
const
wxString
&
aFilename
,
SCH_SCREEN
**
aScreen
)
{
if
(
m_
AssociatedS
creen
)
if
(
m_
s
creen
)
{
EDA_ITEM
*
item
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
item
=
m_
s
creen
->
GetDrawItems
();
while
(
item
)
{
...
...
@@ -725,10 +728,10 @@ bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen
{
SCH_SHEET
*
sheet
=
(
SCH_SHEET
*
)
item
;
if
(
sheet
->
m_
AssociatedS
creen
&&
sheet
->
m_
AssociatedS
creen
->
GetFileName
().
CmpNoCase
(
aFilename
)
==
0
)
if
(
sheet
->
m_
s
creen
&&
sheet
->
m_
s
creen
->
GetFileName
().
CmpNoCase
(
aFilename
)
==
0
)
{
*
aScreen
=
sheet
->
m_
AssociatedS
creen
;
*
aScreen
=
sheet
->
m_
s
creen
;
return
true
;
}
...
...
@@ -746,14 +749,14 @@ bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen
bool
SCH_SHEET
::
LocatePathOfScreen
(
SCH_SCREEN
*
aScreen
,
SCH_SHEET_PATH
*
aList
)
{
if
(
m_
AssociatedS
creen
)
if
(
m_
s
creen
)
{
aList
->
Push
(
this
);
if
(
m_
AssociatedS
creen
==
aScreen
)
if
(
m_
s
creen
==
aScreen
)
return
true
;
EDA_ITEM
*
strct
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
strct
=
m_
s
creen
->
GetDrawItems
();
while
(
strct
)
{
...
...
@@ -778,10 +781,10 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
{
bool
success
=
true
;
if
(
!
m_
AssociatedS
creen
)
if
(
!
m_
s
creen
)
{
SCH_SCREEN
*
screen
=
NULL
;
g_RootSheet
->
SearchHierarchy
(
m_
F
ileName
,
&
screen
);
g_RootSheet
->
SearchHierarchy
(
m_
f
ileName
,
&
screen
);
if
(
screen
)
{
...
...
@@ -792,11 +795,11 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
else
{
SetScreen
(
new
SCH_SCREEN
()
);
success
=
aFrame
->
LoadOneEEFile
(
m_
AssociatedScreen
,
m_F
ileName
);
success
=
aFrame
->
LoadOneEEFile
(
m_
screen
,
m_f
ileName
);
if
(
success
)
{
EDA_ITEM
*
bs
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
bs
=
m_
s
creen
->
GetDrawItems
();
while
(
bs
)
{
...
...
@@ -822,9 +825,9 @@ int SCH_SHEET::CountSheets()
{
int
count
=
1
;
//1 = this!!
if
(
m_
AssociatedS
creen
)
if
(
m_
s
creen
)
{
EDA_ITEM
*
strct
=
m_
AssociatedS
creen
->
GetDrawItems
();
EDA_ITEM
*
strct
=
m_
s
creen
->
GetDrawItems
();
for
(
;
strct
;
strct
=
strct
->
Next
()
)
{
...
...
@@ -841,18 +844,19 @@ int SCH_SHEET::CountSheets()
wxString
SCH_SHEET
::
GetFileName
(
void
)
const
{
return
m_
F
ileName
;
return
m_
f
ileName
;
}
void
SCH_SHEET
::
DisplayInfo
(
EDA_DRAW_FRAME
*
frame
)
{
frame
->
ClearMsgPanel
();
frame
->
AppendMsgPanel
(
_
(
"Sheet name"
),
m_SheetName
,
CYAN
);
frame
->
AppendMsgPanel
(
_
(
"File name"
),
m_FileName
,
BROWN
);
frame
->
AppendMsgPanel
(
_
(
"Sheet name"
),
m_name
,
CYAN
);
frame
->
AppendMsgPanel
(
_
(
"File name"
),
m_fileName
,
BROWN
);
#if 0 // Set to 1 to display the sheet time stamp (mainly for test)
wxString msg;
msg.Printf(
wxT("%.8X"
), m_TimeStamp );
msg.Printf(
wxT( "%.8X"
), m_TimeStamp );
frame->AppendMsgPanel( _( "Time Stamp" ), msg, BLUE );
#endif
}
...
...
@@ -860,19 +864,19 @@ void SCH_SHEET::DisplayInfo( EDA_DRAW_FRAME* frame )
void
SCH_SHEET
::
Rotate
(
wxPoint
rotationPoint
)
{
RotatePoint
(
&
m_
P
os
,
rotationPoint
,
900
);
RotatePoint
(
&
m_
Size
.
x
,
&
m_S
ize
.
y
,
900
);
RotatePoint
(
&
m_
p
os
,
rotationPoint
,
900
);
RotatePoint
(
&
m_
size
.
x
,
&
m_s
ize
.
y
,
900
);
if
(
m_
S
ize
.
x
<
0
)
if
(
m_
s
ize
.
x
<
0
)
{
m_
Pos
.
x
+=
m_S
ize
.
x
;
NEGATE
(
m_
S
ize
.
x
);
m_
pos
.
x
+=
m_s
ize
.
x
;
NEGATE
(
m_
s
ize
.
x
);
}
if
(
m_
S
ize
.
y
<
0
)
if
(
m_
s
ize
.
y
<
0
)
{
m_
Pos
.
y
+=
m_S
ize
.
y
;
NEGATE
(
m_
S
ize
.
y
);
m_
pos
.
y
+=
m_s
ize
.
y
;
NEGATE
(
m_
s
ize
.
y
);
}
BOOST_FOREACH
(
SCH_SHEET_PIN
&
sheetPin
,
m_pins
)
...
...
@@ -884,10 +888,10 @@ void SCH_SHEET::Rotate(wxPoint rotationPoint)
void
SCH_SHEET
::
Mirror_X
(
int
aXaxis_position
)
{
m_
P
os
.
y
-=
aXaxis_position
;
NEGATE
(
m_
P
os
.
y
);
m_
P
os
.
y
+=
aXaxis_position
;
m_
Pos
.
y
-=
m_S
ize
.
y
;
m_
p
os
.
y
-=
aXaxis_position
;
NEGATE
(
m_
p
os
.
y
);
m_
p
os
.
y
+=
aXaxis_position
;
m_
pos
.
y
-=
m_s
ize
.
y
;
BOOST_FOREACH
(
SCH_SHEET_PIN
&
sheetPin
,
m_pins
)
{
...
...
@@ -898,10 +902,10 @@ void SCH_SHEET::Mirror_X( int aXaxis_position )
void
SCH_SHEET
::
Mirror_Y
(
int
aYaxis_position
)
{
m_
P
os
.
x
-=
aYaxis_position
;
NEGATE
(
m_
P
os
.
x
);
m_
P
os
.
x
+=
aYaxis_position
;
m_
Pos
.
x
-=
m_S
ize
.
x
;
m_
p
os
.
x
-=
aYaxis_position
;
NEGATE
(
m_
p
os
.
x
);
m_
p
os
.
x
+=
aYaxis_position
;
m_
pos
.
x
-=
m_s
ize
.
x
;
BOOST_FOREACH
(
SCH_SHEET_PIN
&
label
,
m_pins
)
{
...
...
@@ -912,10 +916,10 @@ void SCH_SHEET::Mirror_Y( int aYaxis_position )
void
SCH_SHEET
::
Resize
(
const
wxSize
&
aSize
)
{
if
(
aSize
==
m_
S
ize
)
if
(
aSize
==
m_
s
ize
)
return
;
m_
S
ize
=
aSize
;
m_
s
ize
=
aSize
;
/* Move the sheet labels according to the new sheet size. */
BOOST_FOREACH
(
SCH_SHEET_PIN
&
label
,
m_pins
)
...
...
@@ -929,7 +933,7 @@ bool SCH_SHEET::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint
{
wxLogTrace
(
traceFindReplace
,
wxT
(
" item "
)
+
GetSelectMenuText
()
);
if
(
SCH_ITEM
::
Matches
(
m_
F
ileName
,
aSearchData
)
)
if
(
SCH_ITEM
::
Matches
(
m_
f
ileName
,
aSearchData
)
)
{
if
(
aFindLocation
)
*
aFindLocation
=
GetFileNamePosition
();
...
...
@@ -937,7 +941,7 @@ bool SCH_SHEET::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint
return
true
;
}
if
(
SCH_ITEM
::
Matches
(
m_
SheetN
ame
,
aSearchData
)
)
if
(
SCH_ITEM
::
Matches
(
m_
n
ame
,
aSearchData
)
)
{
if
(
aFindLocation
)
*
aFindLocation
=
GetSheetNamePosition
();
...
...
@@ -1056,7 +1060,7 @@ SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR* aInspector, const void* aTestData,
wxString
SCH_SHEET
::
GetSelectMenuText
()
const
{
wxString
tmp
;
tmp
.
Printf
(
_
(
"Hierarchical Sheet %s"
),
GetChars
(
m_
SheetN
ame
)
);
tmp
.
Printf
(
_
(
"Hierarchical Sheet %s"
),
GetChars
(
m_
n
ame
)
);
return
tmp
;
}
...
...
@@ -1086,7 +1090,7 @@ bool SCH_SHEET::doHitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy
wxPoint
SCH_SHEET
::
GetResizePosition
()
const
{
return
wxPoint
(
m_
Pos
.
x
+
m_Size
.
GetWidth
(),
m_Pos
.
y
+
m_S
ize
.
GetHeight
()
);
return
wxPoint
(
m_
pos
.
x
+
m_size
.
GetWidth
(),
m_pos
.
y
+
m_s
ize
.
GetHeight
()
);
}
...
...
@@ -1104,7 +1108,7 @@ void SCH_SHEET::GetNetListItem( vector<NETLIST_OBJECT*>& aNetListItems,
item
->
m_Comp
=
&
m_pins
[
i
];
item
->
m_Link
=
this
;
item
->
m_Type
=
NET_SHEETLABEL
;
item
->
m_ElectricalType
=
m_pins
[
i
].
m_Shape
;
item
->
m_ElectricalType
=
m_pins
[
i
].
GetShape
()
;
item
->
m_Label
=
m_pins
[
i
].
m_Text
;
item
->
m_Start
=
item
->
m_End
=
m_pins
[
i
].
m_Pos
;
aNetListItems
.
push_back
(
item
);
...
...
@@ -1129,37 +1133,38 @@ void SCH_SHEET::doPlot( PLOTTER* aPlotter )
int
thickness
=
GetPenSize
();
aPlotter
->
set_current_line_width
(
thickness
);
aPlotter
->
move_to
(
m_
P
os
);
pos
=
m_
P
os
;
pos
.
x
+=
m_
S
ize
.
x
;
aPlotter
->
move_to
(
m_
p
os
);
pos
=
m_
p
os
;
pos
.
x
+=
m_
s
ize
.
x
;
aPlotter
->
line_to
(
pos
);
pos
.
y
+=
m_
S
ize
.
y
;
pos
.
y
+=
m_
s
ize
.
y
;
aPlotter
->
line_to
(
pos
);
pos
=
m_
P
os
;
pos
.
y
+=
m_
S
ize
.
y
;
pos
=
m_
p
os
;
pos
.
y
+=
m_
s
ize
.
y
;
aPlotter
->
line_to
(
pos
);
aPlotter
->
finish_to
(
m_
P
os
);
aPlotter
->
finish_to
(
m_
p
os
);
if
(
IsVerticalOrientation
()
)
{
pos_sheetname
=
wxPoint
(
m_
Pos
.
x
-
8
,
m_Pos
.
y
+
m_S
ize
.
y
);
pos_filename
=
wxPoint
(
m_
Pos
.
x
+
m_Size
.
x
+
4
,
m_Pos
.
y
+
m_S
ize
.
y
);
pos_sheetname
=
wxPoint
(
m_
pos
.
x
-
8
,
m_pos
.
y
+
m_s
ize
.
y
);
pos_filename
=
wxPoint
(
m_
pos
.
x
+
m_size
.
x
+
4
,
m_pos
.
y
+
m_s
ize
.
y
);
name_orientation
=
TEXT_ORIENT_VERT
;
}
else
{
pos_sheetname
=
wxPoint
(
m_
Pos
.
x
,
m_P
os
.
y
-
4
);
pos_filename
=
wxPoint
(
m_
Pos
.
x
,
m_Pos
.
y
+
m_S
ize
.
y
+
4
);
pos_sheetname
=
wxPoint
(
m_
pos
.
x
,
m_p
os
.
y
-
4
);
pos_filename
=
wxPoint
(
m_
pos
.
x
,
m_pos
.
y
+
m_s
ize
.
y
+
4
);
name_orientation
=
TEXT_ORIENT_HORIZ
;
}
/* Draw texts: SheetName */
Text
=
m_
SheetN
ame
;
size
=
wxSize
(
m_
SheetNameSize
,
m_S
heetNameSize
);
Text
=
m_
n
ame
;
size
=
wxSize
(
m_
sheetNameSize
,
m_s
heetNameSize
);
//pos = m_
P
os; pos.y -= 4;
//pos = m_
p
os; pos.y -= 4;
thickness
=
g_DrawDefaultLineThickness
;
thickness
=
Clamp_Text_PenSize
(
thickness
,
size
,
false
);
...
...
@@ -1172,7 +1177,7 @@ void SCH_SHEET::doPlot( PLOTTER* aPlotter )
/*Draw texts : FileName */
Text
=
GetFileName
();
size
=
wxSize
(
m_
FileNameSize
,
m_F
ileNameSize
);
size
=
wxSize
(
m_
fileNameSize
,
m_f
ileNameSize
);
thickness
=
g_DrawDefaultLineThickness
;
thickness
=
Clamp_Text_PenSize
(
thickness
,
size
,
false
);
...
...
@@ -1200,7 +1205,7 @@ void SCH_SHEET::Show( int nestLevel, std::ostream& os )
wxString
s
=
GetClass
();
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
s
.
Lower
().
mb_str
()
<<
">"
<<
" sheet_name=
\"
"
<<
TO_UTF8
(
m_
SheetN
ame
)
<<
'"'
<<
">
\n
"
;
<<
TO_UTF8
(
m_
n
ame
)
<<
'"'
<<
">
\n
"
;
// show all the pins, and check the linked list integrity
BOOST_FOREACH
(
SCH_SHEET_PIN
&
label
,
m_pins
)
...
...
eeschema/sch_sheet.h
View file @
1047e60e
...
...
@@ -28,8 +28,8 @@
* @brief Definition of the SCH_SHEET class for Eeschema.
*/
#ifndef
CLASS_DRAWSH
EET_H
#define
CLASS_DRAWSH
EET_H
#ifndef
SCH_SHE
EET_H
#define
SCH_SHE
EET_H
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/foreach.hpp>
...
...
@@ -50,7 +50,8 @@ class SCH_EDIT_FRAME;
/**
* Pin (label) used in sheets to create hierarchical schematics.
* Class SCH_SHEET_PIN
* defines a sheet pin (label) used in sheets to create hierarchical schematics.
*
* A SCH_SHEET_PIN is used to create a hierarchical sheet in the same way a
* pin is used in a component. It connects the objects in the sheet object
...
...
@@ -59,23 +60,24 @@ class SCH_EDIT_FRAME;
* connected to a wire, bus, or label. In the schematic page represented by
* the sheet, it corresponds to a hierarchical label.
*/
class
SCH_SHEET_PIN
:
public
SCH_HIERLABEL
{
private
:
int
m_
N
umber
;
///< Label number use for saving sheet label to file.
int
m_
n
umber
;
///< Label number use for saving sheet label to file.
///< Sheet label numbering begins at 2.
///< 0 is reserved for the sheet name.
///< 1 is reserve for the sheet file name.
int
m_Edge
;
/* For pin labels only: sheet edge (0 to 3) of the pin
* m_Edge define on which edge the pin is positioned:
* 0: pin on left side
* 1: pin on right side
* 2: pin on top side
* 3: pin on bottom side
* for compatibility reasons, this does not follow same values as text
* orientation.
*/
/**
* Defines the edge of the sheet that the sheet pin is positioned
* 0: pin on left side
* 1: pin on right side
* 2: pin on top side
* 3: pin on bottom side
*
* For compatibility reasons, this does not follow same values as text orientation.
*/
int
m_edge
;
virtual
EDA_ITEM
*
doClone
()
const
;
...
...
@@ -118,7 +120,7 @@ public:
*
* @return Number of the sheet label.
*/
int
GetNumber
()
const
{
return
m_
N
umber
;
}
int
GetNumber
()
const
{
return
m_
n
umber
;
}
/**
* Set the sheet label number.
...
...
@@ -202,15 +204,7 @@ public:
virtual
void
Mirror_X
(
int
aXaxis_position
);
/**
* Function Matches
* Compare hierarchical pin name against search string.
*
* @param aSearchData - Criteria to search against.
* @param aAuxData - a pointer on auxiliary data, if needed.
* When searching string in REFERENCE field we must know the sheet path
* This param is used in this case
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if this item matches the search criteria.
* @copydoc EDA_ITEM::Matches(wxFindReplaceData&,void*,wxPoint*)
*/
virtual
bool
Matches
(
wxFindReplaceData
&
aSearchData
,
void
*
aAuxData
,
wxPoint
*
aFindLocation
);
...
...
@@ -233,33 +227,40 @@ private:
typedef
boost
::
ptr_vector
<
SCH_SHEET_PIN
>
SCH_SHEET_PINS
;
/*
class SCH_SHEET
*
This class is the sheet symbol placed in a schematic, and is the entry point
*
for a sub schematic
/*
*
*
Class SCH_SHEET
*
is the sheet symbol placed in a schematic, and is the entry point for a sub schematic.
*/
class
SCH_SHEET
:
public
SCH_ITEM
{
SCH_SCREEN
*
m_AssociatedScreen
;
///< Screen that contains the physical data for
///< the sheet. In complex hierarchies multiple
///< sheets can share a common screen.
SCH_SHEET_PINS
m_pins
;
///< List of sheet connection points.
wxString
m_FileName
;
/* also in SCH_SCREEN (redundant),
* but need it here for loading after
* reading the sheet description from
* file. */
/// Screen that contains the physical data for the sheet. In complex hierarchies
/// multiple sheets can share a common screen.
SCH_SCREEN
*
m_screen
;
public
:
wxString
m_SheetName
;
/* this is equivalent to C101 for
* components: it is stored in F0 ...
* of the file. */
public
:
int
m_SheetNameSize
;
/* Size (height) of the text, used to
* draw the sheet name */
int
m_FileNameSize
;
/* Size (height) of the text, used to
* draw the file name */
wxPoint
m_Pos
;
wxSize
m_Size
;
/* Position and Size of *sheet symbol */
/// The list of sheet connection points.
SCH_SHEET_PINS
m_pins
;
/// The file name is also in the #SCH_SCREEN object associated with the sheet. It is
/// also needed here for loading after reading the sheet description from file.
wxString
m_fileName
;
/// This is equivalent to the reference designator for components and is stored in F0
/// sheet pin in the schematic file.
wxString
m_name
;
/// The height of the text used to draw the sheet name.
int
m_sheetNameSize
;
/// The height of the text used to draw the file name.
int
m_fileNameSize
;
/// The position of the sheet.
wxPoint
m_pos
;
/// The size of the sheet.
wxSize
m_size
;
friend
class
SCH_SHEET_PIN
;
public
:
SCH_SHEET
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
)
);
...
...
@@ -273,7 +274,24 @@ public:
return
wxT
(
"SCH_SHEET"
);
}
SCH_SCREEN
*
GetScreen
()
{
return
m_AssociatedScreen
;
}
wxString
GetName
()
const
{
return
m_name
;
}
void
SetName
(
const
wxString
&
aName
)
{
m_name
=
aName
;
}
int
GetSheetNameSize
()
const
{
return
m_sheetNameSize
;
}
void
SetSheetNameSize
(
int
aSize
)
{
m_sheetNameSize
=
aSize
;
}
int
GetFileNameSize
()
const
{
return
m_fileNameSize
;
}
void
SetFileNameSize
(
int
aSize
)
{
m_fileNameSize
=
aSize
;
}
SCH_SCREEN
*
GetScreen
()
{
return
m_screen
;
}
wxSize
GetSize
()
{
return
m_size
;
}
void
SetSize
(
const
wxSize
&
aSize
)
{
m_size
=
aSize
;
}
/**
* Function SetScreen
...
...
@@ -462,9 +480,9 @@ public:
/**
* Function Load.
* for the sheet: load the file m_
F
ileName
* for the sheet: load the file m_
f
ileName
* if a screen already exists, the file is already read.
* m_
AssociatedS
creen point on the screen, and its m_RefCount is
* m_
s
creen point on the screen, and its m_RefCount is
* incremented
* else creates a new associated screen and load the data file.
* @param aFrame = a SCH_EDIT_FRAME pointer to the maim schematic frame
...
...
@@ -483,14 +501,14 @@ public:
/**
* Function LocatePathOfScreen
*
search the existing hierarchy for an instance of screen "FileName".
*
don't bother looking at the root sheet - it must be unique,
*
no other references to its m_AssociatedS
creen otherwise there would be
*
loops
*
in the hierarchy.
*
@param
aScreen = the SCH_SCREEN* screen that we search for
*
@param aList = the SCH_SHEET_PATH* that must be used
*
@return true if found
* search the existing hierarchy for an instance of screen "FileName".
* don't bother looking at the root sheet - it must be unique,
*
no other references to its m_s
creen otherwise there would be
*
loops in the hierarchy.
*
*
@param
aScreen = the SCH_SCREEN* screen that we search for
* @param aList = the SCH_SHEET_PATH* that must be used
* @return true if found
*/
bool
LocatePathOfScreen
(
SCH_SCREEN
*
aScreen
,
SCH_SHEET_PATH
*
aList
);
...
...
@@ -512,7 +530,7 @@ public:
// Set a new filename without changing anything else
void
SetFileName
(
const
wxString
&
aFilename
)
{
m_
F
ileName
=
aFilename
;
m_
f
ileName
=
aFilename
;
}
bool
ChangeFileName
(
SCH_EDIT_FRAME
*
aFrame
,
const
wxString
&
aFileName
);
...
...
@@ -529,7 +547,7 @@ public:
*/
virtual
void
Move
(
const
wxPoint
&
aMoveVector
)
{
m_
P
os
+=
aMoveVector
;
m_
p
os
+=
aMoveVector
;
BOOST_FOREACH
(
SCH_SHEET_PIN
&
pin
,
m_pins
)
{
...
...
@@ -546,15 +564,7 @@ public:
virtual
void
Rotate
(
wxPoint
rotationPoint
);
/**
* Compare schematic sheet file and sheet name against search string.
*
* @param aSearchData - Criteria to search against.
* @param aAuxData - a pointer on auxiliary data, if needed.
* When searching string in REFERENCE field we must know the sheet path
* This param is used in this case
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
*
* @return True if this item matches the search criteria.
* @copydoc EDA_ITEM::Matches(wxFindReplaceData&,void*,wxPoint*)
*/
virtual
bool
Matches
(
wxFindReplaceData
&
aSearchData
,
void
*
aAuxData
,
wxPoint
*
aFindLocation
);
...
...
@@ -627,11 +637,11 @@ private:
virtual
bool
doHitTest
(
const
EDA_RECT
&
aRect
,
bool
aContained
,
int
aAccuracy
)
const
;
virtual
EDA_ITEM
*
doClone
()
const
;
virtual
void
doPlot
(
PLOTTER
*
aPlotter
);
virtual
wxPoint
doGetPosition
()
const
{
return
m_
P
os
;
}
virtual
void
doSetPosition
(
const
wxPoint
&
aPosition
)
{
m_
P
os
=
aPosition
;
}
virtual
wxPoint
doGetPosition
()
const
{
return
m_
p
os
;
}
virtual
void
doSetPosition
(
const
wxPoint
&
aPosition
)
{
m_
p
os
=
aPosition
;
}
};
typedef
std
::
vector
<
SCH_SHEET
*
>
SCH_SHEETS
;
#endif
/*
CLASS_DRAWSH
EET_H */
#endif
/*
SCH_SHE
EET_H */
eeschema/sch_sheet_path.cpp
View file @
1047e60e
...
...
@@ -217,7 +217,7 @@ wxString SCH_SHEET_PATH::PathHumanReadable() const
// start at 1 to avoid the root sheet, as above.
for
(
unsigned
i
=
1
;
i
<
m_numSheets
;
i
++
)
{
s
=
s
+
m_sheets
[
i
]
->
m_SheetName
+
wxT
(
"/"
);
s
=
s
+
m_sheets
[
i
]
->
GetName
()
+
wxT
(
"/"
);
}
return
s
;
...
...
eeschema/sch_sheet_pin.cpp
View file @
1047e60e
...
...
@@ -43,16 +43,6 @@
#include "kicad_string.h"
/* m_Edge define on which edge the pin is positioned:
*
* 0: pin on left side
* 1: pin on right side
* 2: pin on top side
* 3: pin on bottom side
* for compatibility reasons, this does not follow same values as text
* orientation.
*/
SCH_SHEET_PIN
::
SCH_SHEET_PIN
(
SCH_SHEET
*
parent
,
const
wxPoint
&
pos
,
const
wxString
&
text
)
:
SCH_HIERLABEL
(
pos
,
text
,
SCH_SHEET_PIN_T
)
{
...
...
@@ -66,17 +56,17 @@ SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos, const wxStr
else
SetEdge
(
0
);
m_
S
hape
=
NET_INPUT
;
m_
I
sDangling
=
true
;
m_
N
umber
=
2
;
m_
s
hape
=
NET_INPUT
;
m_
i
sDangling
=
true
;
m_
n
umber
=
2
;
}
SCH_SHEET_PIN
::
SCH_SHEET_PIN
(
const
SCH_SHEET_PIN
&
aSheetLabel
)
:
SCH_HIERLABEL
(
aSheetLabel
)
{
m_
Number
=
aSheetLabel
.
m_N
umber
;
m_
Edge
=
aSheetLabel
.
m_E
dge
;
m_
number
=
aSheetLabel
.
m_n
umber
;
m_
edge
=
aSheetLabel
.
m_e
dge
;
}
...
...
@@ -132,7 +122,7 @@ void SCH_SHEET_PIN::SetNumber( int aNumber )
{
wxASSERT
(
aNumber
>=
2
);
m_
N
umber
=
aNumber
;
m_
n
umber
=
aNumber
;
}
...
...
@@ -168,27 +158,27 @@ void SCH_SHEET_PIN::SetEdge( int aEdge )
/* use -1 to adjust text orientation without changing edge*/
if
(
aEdge
>
-
1
)
m_
E
dge
=
aEdge
;
m_
e
dge
=
aEdge
;
switch
(
m_
E
dge
)
switch
(
m_
e
dge
)
{
case
0
:
/* pin on left side*/
m_Pos
.
x
=
Sheet
->
m_
P
os
.
x
;
m_Pos
.
x
=
Sheet
->
m_
p
os
.
x
;
SetOrientation
(
2
);
/* Orientation horiz inverse */
break
;
case
1
:
/* pin on right side*/
m_Pos
.
x
=
Sheet
->
m_
Pos
.
x
+
Sheet
->
m_S
ize
.
x
;
m_Pos
.
x
=
Sheet
->
m_
pos
.
x
+
Sheet
->
m_s
ize
.
x
;
SetOrientation
(
0
);
/* Orientation horiz normal */
break
;
case
2
:
/* pin on top side*/
m_Pos
.
y
=
Sheet
->
m_
P
os
.
y
;
m_Pos
.
y
=
Sheet
->
m_
p
os
.
y
;
SetOrientation
(
3
);
/* Orientation vert BOTTOM */
break
;
case
3
:
/* pin on bottom side*/
m_Pos
.
y
=
Sheet
->
m_
Pos
.
y
+
Sheet
->
m_S
ize
.
y
;
m_Pos
.
y
=
Sheet
->
m_
pos
.
y
+
Sheet
->
m_s
ize
.
y
;
SetOrientation
(
1
);
/* Orientation vert UP */
break
;
}
...
...
@@ -197,7 +187,7 @@ void SCH_SHEET_PIN::SetEdge( int aEdge )
int
SCH_SHEET_PIN
::
GetEdge
()
const
{
return
m_
E
dge
;
return
m_
e
dge
;
}
...
...
@@ -208,9 +198,9 @@ void SCH_SHEET_PIN::ConstrainOnEdge( wxPoint Pos )
if
(
Sheet
==
NULL
)
return
;
if
(
m_
E
dge
<
2
)
/*horizontal sheetpin*/
if
(
m_
e
dge
<
2
)
/*horizontal sheetpin*/
{
if
(
Pos
.
x
>
(
Sheet
->
m_
Pos
.
x
+
(
Sheet
->
m_S
ize
.
x
/
2
)
)
)
if
(
Pos
.
x
>
(
Sheet
->
m_
pos
.
x
+
(
Sheet
->
m_s
ize
.
x
/
2
)
)
)
{
SetEdge
(
1
);
}
...
...
@@ -221,15 +211,15 @@ void SCH_SHEET_PIN::ConstrainOnEdge( wxPoint Pos )
m_Pos
.
y
=
Pos
.
y
;
if
(
m_Pos
.
y
<
Sheet
->
m_
P
os
.
y
)
m_Pos
.
y
=
Sheet
->
m_
P
os
.
y
;
if
(
m_Pos
.
y
<
Sheet
->
m_
p
os
.
y
)
m_Pos
.
y
=
Sheet
->
m_
p
os
.
y
;
if
(
m_Pos
.
y
>
(
Sheet
->
m_
Pos
.
y
+
Sheet
->
m_S
ize
.
y
)
)
m_Pos
.
y
=
Sheet
->
m_
Pos
.
y
+
Sheet
->
m_S
ize
.
y
;
if
(
m_Pos
.
y
>
(
Sheet
->
m_
pos
.
y
+
Sheet
->
m_s
ize
.
y
)
)
m_Pos
.
y
=
Sheet
->
m_
pos
.
y
+
Sheet
->
m_s
ize
.
y
;
}
else
/* vertical sheetpin*/
{
if
(
Pos
.
y
>
(
Sheet
->
m_
Pos
.
y
+
(
Sheet
->
m_S
ize
.
y
/
2
)
)
)
if
(
Pos
.
y
>
(
Sheet
->
m_
pos
.
y
+
(
Sheet
->
m_s
ize
.
y
/
2
)
)
)
{
SetEdge
(
3
);
//bottom
}
...
...
@@ -240,11 +230,11 @@ void SCH_SHEET_PIN::ConstrainOnEdge( wxPoint Pos )
m_Pos
.
x
=
Pos
.
x
;
if
(
m_Pos
.
x
<
Sheet
->
m_
P
os
.
x
)
m_Pos
.
x
=
Sheet
->
m_
P
os
.
x
;
if
(
m_Pos
.
x
<
Sheet
->
m_
p
os
.
x
)
m_Pos
.
x
=
Sheet
->
m_
p
os
.
x
;
if
(
m_Pos
.
x
>
(
Sheet
->
m_
Pos
.
x
+
Sheet
->
m_S
ize
.
x
)
)
m_Pos
.
x
=
Sheet
->
m_
Pos
.
x
+
Sheet
->
m_S
ize
.
x
;
if
(
m_Pos
.
x
>
(
Sheet
->
m_
pos
.
x
+
Sheet
->
m_s
ize
.
x
)
)
m_Pos
.
x
=
Sheet
->
m_
pos
.
x
+
Sheet
->
m_s
ize
.
x
;
}
}
...
...
@@ -256,7 +246,7 @@ bool SCH_SHEET_PIN::Save( FILE* aFile ) const
if
(
m_Text
.
IsEmpty
()
)
return
true
;
switch
(
m_
E
dge
)
switch
(
m_
e
dge
)
{
case
0
:
//pin on left side
side
=
'L'
;
...
...
@@ -275,7 +265,7 @@ bool SCH_SHEET_PIN::Save( FILE* aFile ) const
break
;
}
switch
(
m_
S
hape
)
switch
(
m_
s
hape
)
{
case
NET_INPUT
:
type
=
'I'
;
break
;
...
...
@@ -293,7 +283,7 @@ bool SCH_SHEET_PIN::Save( FILE* aFile ) const
type
=
'U'
;
break
;
}
if
(
fprintf
(
aFile
,
"F%d %s %c %c %-3d %-3d %-3d
\n
"
,
m_
N
umber
,
if
(
fprintf
(
aFile
,
"F%d %s %c %c %-3d %-3d %-3d
\n
"
,
m_
n
umber
,
EscapedUTF8
(
m_Text
).
c_str
(),
// supplies wrapping quotes
type
,
side
,
m_Pos
.
x
,
m_Pos
.
y
,
m_Size
.
x
)
==
EOF
)
...
...
@@ -359,23 +349,23 @@ bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg )
switch
(
connectType
[
0
]
)
{
case
'I'
:
m_
S
hape
=
NET_INPUT
;
m_
s
hape
=
NET_INPUT
;
break
;
case
'O'
:
m_
S
hape
=
NET_OUTPUT
;
m_
s
hape
=
NET_OUTPUT
;
break
;
case
'B'
:
m_
S
hape
=
NET_BIDI
;
m_
s
hape
=
NET_BIDI
;
break
;
case
'T'
:
m_
S
hape
=
NET_TRISTATE
;
m_
s
hape
=
NET_TRISTATE
;
break
;
case
'U'
:
m_
S
hape
=
NET_UNSPECIFIED
;
m_
s
hape
=
NET_UNSPECIFIED
;
break
;
}
...
...
@@ -429,7 +419,7 @@ void SCH_SHEET_PIN::Mirror_X( int aXaxis_position )
m_Pos
.
y
=
aXaxis_position
-
p
;
switch
(
m_
E
dge
)
switch
(
m_
e
dge
)
{
case
2
:
SetEdge
(
3
);
...
...
@@ -448,7 +438,7 @@ void SCH_SHEET_PIN::Mirror_Y( int aYaxis_position )
m_Pos
.
x
=
aYaxis_position
-
p
;
switch
(
m_
E
dge
)
switch
(
m_
e
dge
)
{
case
0
:
SetEdge
(
1
);
...
...
@@ -465,7 +455,7 @@ void SCH_SHEET_PIN::Rotate( wxPoint rotationPoint )
{
RotatePoint
(
&
m_Pos
,
rotationPoint
,
900
);
switch
(
m_
E
dge
)
switch
(
m_
e
dge
)
{
case
0
:
//pin on left side
SetEdge
(
3
);
...
...
@@ -493,16 +483,16 @@ void SCH_SHEET_PIN::CreateGraphicShape( std::vector <wxPoint>& aPoints, const wx
* for INPUT type the icon is the OUTPUT shape of SCH_HIERLABEL
* for OUTPUT type the icon is the INPUT shape of SCH_HIERLABEL
*/
int
tmp
=
m_
S
hape
;
int
tmp
=
m_
s
hape
;
switch
(
m_
S
hape
)
switch
(
m_
s
hape
)
{
case
NET_INPUT
:
m_
S
hape
=
NET_OUTPUT
;
m_
s
hape
=
NET_OUTPUT
;
break
;
case
NET_OUTPUT
:
m_
S
hape
=
NET_INPUT
;
m_
s
hape
=
NET_INPUT
;
break
;
default
:
...
...
@@ -510,7 +500,7 @@ void SCH_SHEET_PIN::CreateGraphicShape( std::vector <wxPoint>& aPoints, const wx
}
SCH_HIERLABEL
::
CreateGraphicShape
(
aPoints
,
aPos
);
m_
S
hape
=
tmp
;
m_
s
hape
=
tmp
;
}
...
...
eeschema/sch_text.cpp
View file @
1047e60e
...
...
@@ -104,10 +104,10 @@ SCH_TEXT::SCH_TEXT( const wxPoint& pos, const wxString& text, KICAD_T aType ) :
{
m_Layer
=
LAYER_NOTES
;
m_Pos
=
pos
;
m_
S
hape
=
0
;
m_
I
sDangling
=
false
;
m_
s
hape
=
0
;
m_
i
sDangling
=
false
;
m_MultilineAllowed
=
true
;
m_
S
chematicOrientation
=
0
;
m_
s
chematicOrientation
=
0
;
}
...
...
@@ -116,10 +116,10 @@ SCH_TEXT::SCH_TEXT( const SCH_TEXT& aText ) :
EDA_TEXT
(
aText
)
{
m_Pos
=
aText
.
m_Pos
;
m_
Shape
=
aText
.
m_S
hape
;
m_
shape
=
aText
.
m_s
hape
;
m_MultilineAllowed
=
aText
.
m_MultilineAllowed
;
m_
SchematicOrientation
=
aText
.
m_S
chematicOrientation
;
m_
I
sDangling
=
false
;
m_
schematicOrientation
=
aText
.
m_s
chematicOrientation
;
m_
i
sDangling
=
false
;
}
...
...
@@ -141,7 +141,7 @@ wxPoint SCH_TEXT::GetSchematicTextOffset() const
// add a small offset (TXTMARGE) to x ( or y) position to allow a text to
// be on a wire or a line and be readable
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
default
:
case
0
:
/* Horiz Normal Orientation (left justified) */
...
...
@@ -301,9 +301,9 @@ void SCH_TEXT::Rotate( wxPoint rotationPoint )
void
SCH_TEXT
::
SetOrientation
(
int
aOrientation
)
{
m_
S
chematicOrientation
=
aOrientation
;
m_
s
chematicOrientation
=
aOrientation
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
default
:
case
0
:
/* Horiz Normal Orientation (left justified) */
...
...
@@ -341,14 +341,14 @@ void SCH_TEXT::SwapData( SCH_ITEM* aItem )
EXCHG
(
m_Pos
,
item
->
m_Pos
);
EXCHG
(
m_Size
,
item
->
m_Size
);
EXCHG
(
m_Thickness
,
item
->
m_Thickness
);
EXCHG
(
m_
Shape
,
item
->
m_S
hape
);
EXCHG
(
m_
shape
,
item
->
m_s
hape
);
EXCHG
(
m_Orient
,
item
->
m_Orient
);
EXCHG
(
m_Layer
,
item
->
m_Layer
);
EXCHG
(
m_HJustify
,
item
->
m_HJustify
);
EXCHG
(
m_VJustify
,
item
->
m_VJustify
);
EXCHG
(
m_
IsDangling
,
item
->
m_I
sDangling
);
EXCHG
(
m_
SchematicOrientation
,
item
->
m_S
chematicOrientation
);
EXCHG
(
m_
isDangling
,
item
->
m_i
sDangling
);
EXCHG
(
m_
schematicOrientation
,
item
->
m_s
chematicOrientation
);
}
...
...
@@ -390,7 +390,7 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
EDA_TEXT
::
Draw
(
panel
,
DC
,
text_offset
,
color
,
DrawMode
,
FILLED
,
UNSPECIFIED_COLOR
);
EXCHG
(
linewidth
,
m_Thickness
);
// set initial value
if
(
m_
I
sDangling
)
if
(
m_
i
sDangling
)
DrawDanglingSymbol
(
panel
,
DC
,
m_Pos
+
aOffset
,
color
);
// Enable these line to draw the bounding box (debug tests purposes only)
...
...
@@ -403,12 +403,6 @@ void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset,
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool
SCH_TEXT
::
Save
(
FILE
*
aFile
)
const
{
bool
success
=
true
;
...
...
@@ -439,7 +433,7 @@ bool SCH_TEXT::Save( FILE* aFile ) const
if
(
fprintf
(
aFile
,
"Text Notes %-4d %-4d %-4d %-4d %s %d
\n
%s
\n
"
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
S
chematicOrientation
,
m_Size
.
x
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
s
chematicOrientation
,
m_Size
.
x
,
shape
,
m_Thickness
,
TO_UTF8
(
text
)
)
==
EOF
)
{
success
=
false
;
...
...
@@ -494,6 +488,7 @@ bool SCH_TEXT::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
wxString
val
=
FROM_UTF8
(
text
);
for
(
;
;
)
{
int
i
=
val
.
find
(
wxT
(
"
\\
n"
)
);
...
...
@@ -540,8 +535,8 @@ bool SCH_TEXT::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
if
(
Type
()
==
SCH_TEXT_T
)
return
false
;
bool
previousState
=
m_
I
sDangling
;
m_
I
sDangling
=
true
;
bool
previousState
=
m_
i
sDangling
;
m_
i
sDangling
=
true
;
for
(
unsigned
ii
=
0
;
ii
<
aItemList
.
size
();
ii
++
)
{
...
...
@@ -556,7 +551,7 @@ bool SCH_TEXT::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
case
LABEL_END
:
case
SHEET_LABEL_END
:
if
(
m_Pos
==
item
.
GetPosition
()
)
m_
I
sDangling
=
false
;
m_
i
sDangling
=
false
;
break
;
...
...
@@ -567,11 +562,11 @@ bool SCH_TEXT::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
// a paranoid programmer, I'll check just in case.
ii
++
;
wxCHECK_MSG
(
ii
<
aItemList
.
size
(),
previousState
!=
m_
I
sDangling
,
wxCHECK_MSG
(
ii
<
aItemList
.
size
(),
previousState
!=
m_
i
sDangling
,
wxT
(
"Dangling end type list overflow. Bad programmer!"
)
);
DANGLING_END_ITEM
&
nextItem
=
aItemList
[
ii
];
m_
I
sDangling
=
!
SegmentIntersect
(
item
.
GetPosition
(),
nextItem
.
GetPosition
(),
m_Pos
);
m_
i
sDangling
=
!
SegmentIntersect
(
item
.
GetPosition
(),
nextItem
.
GetPosition
(),
m_Pos
);
}
break
;
...
...
@@ -579,11 +574,11 @@ bool SCH_TEXT::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
break
;
}
if
(
m_
I
sDangling
==
false
)
if
(
m_
i
sDangling
==
false
)
break
;
}
return
previousState
!=
m_
I
sDangling
;
return
previousState
!=
m_
i
sDangling
;
}
...
...
@@ -744,8 +739,8 @@ void SCH_TEXT::Show( int nestLevel, std::ostream& os )
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
s
.
Lower
().
mb_str
()
<<
" layer=
\"
"
<<
m_Layer
<<
'"'
<<
" shape=
\"
"
<<
m_
S
hape
<<
'"'
<<
" dangling=
\"
"
<<
m_
I
sDangling
<<
'"'
<<
" shape=
\"
"
<<
m_
s
hape
<<
'"'
<<
" dangling=
\"
"
<<
m_
i
sDangling
<<
'"'
<<
'>'
<<
TO_UTF8
(
m_Text
)
<<
"</"
<<
s
.
Lower
().
mb_str
()
<<
">
\n
"
;
...
...
@@ -758,8 +753,8 @@ SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) :
SCH_TEXT
(
pos
,
text
,
SCH_LABEL_T
)
{
m_Layer
=
LAYER_LOCLABEL
;
m_
S
hape
=
NET_INPUT
;
m_
I
sDangling
=
true
;
m_
s
hape
=
NET_INPUT
;
m_
i
sDangling
=
true
;
m_MultilineAllowed
=
false
;
}
...
...
@@ -819,7 +814,7 @@ bool SCH_LABEL::Save( FILE* aFile ) const
shape
=
"Italic"
;
if
(
fprintf
(
aFile
,
"Text Label %-4d %-4d %-4d %-4d %s %d
\n
%s
\n
"
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
S
chematicOrientation
,
m_Size
.
x
,
shape
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
s
chematicOrientation
,
m_Size
.
x
,
shape
,
m_Thickness
,
TO_UTF8
(
m_Text
)
)
==
EOF
)
{
success
=
false
;
...
...
@@ -909,7 +904,7 @@ EDA_RECT SCH_LABEL::GetBoundingBox() const
height
=
m_Size
.
y
+
width
;
dx
=
dy
=
0
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
case
0
:
/* Horiz Normal Orientation (left justified) */
dx
=
2
*
DANGLING_SYMBOL_SIZE
+
length
;
...
...
@@ -966,8 +961,8 @@ SCH_GLOBALLABEL::SCH_GLOBALLABEL( const wxPoint& pos, const wxString& text ) :
SCH_TEXT
(
pos
,
text
,
SCH_GLOBAL_LABEL_T
)
{
m_Layer
=
LAYER_GLOBLABEL
;
m_
S
hape
=
NET_BIDI
;
m_
I
sDangling
=
true
;
m_
s
hape
=
NET_BIDI
;
m_
i
sDangling
=
true
;
m_MultilineAllowed
=
false
;
}
...
...
@@ -993,8 +988,8 @@ bool SCH_GLOBALLABEL::Save( FILE* aFile ) const
shape
=
"Italic"
;
if
(
fprintf
(
aFile
,
"Text GLabel %-4d %-4d %-4d %-4d %s %s %d
\n
%s
\n
"
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
S
chematicOrientation
,
m_Size
.
x
,
SheetLabelType
[
m_
S
hape
],
shape
,
m_Thickness
,
TO_UTF8
(
m_Text
)
)
==
EOF
)
m_Pos
.
x
,
m_Pos
.
y
,
m_
s
chematicOrientation
,
m_Size
.
x
,
SheetLabelType
[
m_
s
hape
],
shape
,
m_Thickness
,
TO_UTF8
(
m_Text
)
)
==
EOF
)
{
success
=
false
;
}
...
...
@@ -1013,6 +1008,7 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
Name1
[
0
]
=
0
;
Name2
[
0
]
=
0
;
Name3
[
0
]
=
0
;
char
*
sline
=
(
char
*
)
aLine
;
while
(
(
*
sline
!=
' '
)
&&
*
sline
)
sline
++
;
...
...
@@ -1049,21 +1045,21 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Text
=
FROM_UTF8
(
text
);
m_Size
.
x
=
m_Size
.
y
=
size
;
SetOrientation
(
orient
);
m_
S
hape
=
NET_INPUT
;
m_
s
hape
=
NET_INPUT
;
m_Bold
=
(
thickness
!=
0
);
m_Thickness
=
m_Bold
?
GetPenSizeForBold
(
size
)
:
0
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_OUTPUT
]
)
==
0
)
m_
S
hape
=
NET_OUTPUT
;
m_
s
hape
=
NET_OUTPUT
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_BIDI
]
)
==
0
)
m_
S
hape
=
NET_BIDI
;
m_
s
hape
=
NET_BIDI
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_TRISTATE
]
)
==
0
)
m_
S
hape
=
NET_TRISTATE
;
m_
s
hape
=
NET_TRISTATE
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_UNSPECIFIED
]
)
==
0
)
m_
S
hape
=
NET_UNSPECIFIED
;
m_
s
hape
=
NET_UNSPECIFIED
;
if
(
stricmp
(
Name3
,
"Italic"
)
==
0
)
m_Italic
=
1
;
...
...
@@ -1131,7 +1127,7 @@ wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset() const
int
HalfSize
=
m_Size
.
x
/
2
;
int
offset
=
width
;
switch
(
m_
S
hape
)
switch
(
m_
s
hape
)
{
case
NET_INPUT
:
case
NET_BIDI
:
...
...
@@ -1148,7 +1144,7 @@ wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset() const
break
;
}
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
case
0
:
/* Orientation horiz normal */
text_offset
.
x
-=
offset
;
...
...
@@ -1173,9 +1169,9 @@ wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset() const
void
SCH_GLOBALLABEL
::
SetOrientation
(
int
aOrientation
)
{
m_
S
chematicOrientation
=
aOrientation
;
m_
s
chematicOrientation
=
aOrientation
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
default
:
case
0
:
/* Horiz Normal Orientation */
...
...
@@ -1231,7 +1227,7 @@ void SCH_GLOBALLABEL::Draw( EDA_DRAW_PANEL* panel,
CreateGraphicShape
(
Poly
,
m_Pos
+
aOffset
);
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
Poly
.
size
(),
&
Poly
[
0
],
0
,
linewidth
,
color
,
color
);
if
(
m_
I
sDangling
)
if
(
m_
i
sDangling
)
DrawDanglingSymbol
(
panel
,
DC
,
m_Pos
+
aOffset
,
color
);
// Enable these line to draw the bounding box (debug tests purposes only)
...
...
@@ -1271,7 +1267,7 @@ void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aPoints, const
int
x_offset
=
0
;
switch
(
m_
S
hape
)
switch
(
m_
s
hape
)
{
case
NET_INPUT
:
x_offset
=
-
HalfSize
;
...
...
@@ -1296,7 +1292,7 @@ void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aPoints, const
int
angle
=
0
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
case
0
:
/* Orientation horiz normal */
break
;
...
...
@@ -1318,8 +1314,10 @@ void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aPoints, const
for
(
unsigned
ii
=
0
;
ii
<
aPoints
.
size
();
ii
++
)
{
aPoints
[
ii
].
x
+=
x_offset
;
if
(
angle
)
RotatePoint
(
&
aPoints
[
ii
],
angle
);
aPoints
[
ii
]
+=
Pos
;
}
...
...
@@ -1341,7 +1339,7 @@ EDA_RECT SCH_GLOBALLABEL::GetBoundingBox() const
// text X size add height for triangular shapes(bidirectional)
length
=
LenSize
(
m_Text
)
+
height
+
DANGLING_SYMBOL_SIZE
;
switch
(
m_
S
chematicOrientation
)
// respect orientation
switch
(
m_
s
chematicOrientation
)
// respect orientation
{
case
0
:
/* Horiz Normal Orientation (left justified) */
dx
=
-
length
;
...
...
@@ -1398,8 +1396,8 @@ SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text, KICAD_T
SCH_TEXT
(
pos
,
text
,
aType
)
{
m_Layer
=
LAYER_HIERLABEL
;
m_
S
hape
=
NET_INPUT
;
m_
I
sDangling
=
true
;
m_
s
hape
=
NET_INPUT
;
m_
i
sDangling
=
true
;
m_MultilineAllowed
=
false
;
}
...
...
@@ -1425,8 +1423,8 @@ bool SCH_HIERLABEL::Save( FILE* aFile ) const
shape
=
"Italic"
;
if
(
fprintf
(
aFile
,
"Text HLabel %-4d %-4d %-4d %-4d %s %s %d
\n
%s
\n
"
,
m_Pos
.
x
,
m_Pos
.
y
,
m_
S
chematicOrientation
,
m_Size
.
x
,
SheetLabelType
[
m_
S
hape
],
shape
,
m_Thickness
,
TO_UTF8
(
m_Text
)
)
==
EOF
)
m_Pos
.
x
,
m_Pos
.
y
,
m_
s
chematicOrientation
,
m_Size
.
x
,
SheetLabelType
[
m_
s
hape
],
shape
,
m_Thickness
,
TO_UTF8
(
m_Text
)
)
==
EOF
)
{
success
=
false
;
}
...
...
@@ -1482,21 +1480,21 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Text
=
FROM_UTF8
(
text
);
m_Size
.
x
=
m_Size
.
y
=
size
;
SetOrientation
(
orient
);
m_
S
hape
=
NET_INPUT
;
m_
s
hape
=
NET_INPUT
;
m_Bold
=
(
thickness
!=
0
);
m_Thickness
=
m_Bold
?
GetPenSizeForBold
(
size
)
:
0
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_OUTPUT
]
)
==
0
)
m_
S
hape
=
NET_OUTPUT
;
m_
s
hape
=
NET_OUTPUT
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_BIDI
]
)
==
0
)
m_
S
hape
=
NET_BIDI
;
m_
s
hape
=
NET_BIDI
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_TRISTATE
]
)
==
0
)
m_
S
hape
=
NET_TRISTATE
;
m_
s
hape
=
NET_TRISTATE
;
if
(
stricmp
(
Name2
,
SheetLabelType
[
NET_UNSPECIFIED
]
)
==
0
)
m_
S
hape
=
NET_UNSPECIFIED
;
m_
s
hape
=
NET_UNSPECIFIED
;
if
(
stricmp
(
Name3
,
"Italic"
)
==
0
)
m_Italic
=
1
;
...
...
@@ -1507,9 +1505,9 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
void
SCH_HIERLABEL
::
SetOrientation
(
int
aOrientation
)
{
m_
S
chematicOrientation
=
aOrientation
;
m_
s
chematicOrientation
=
aOrientation
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
default
:
case
0
:
/* Horiz Normal Orientation */
...
...
@@ -1566,7 +1564,7 @@ void SCH_HIERLABEL::Draw( EDA_DRAW_PANEL* panel,
CreateGraphicShape
(
Poly
,
m_Pos
+
offset
);
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
Poly
.
size
(),
&
Poly
[
0
],
0
,
linewidth
,
color
,
color
);
if
(
m_
I
sDangling
)
if
(
m_
i
sDangling
)
DrawDanglingSymbol
(
panel
,
DC
,
m_Pos
+
offset
,
color
);
// Enable these line to draw the bounding box (debug tests purposes only)
...
...
@@ -1581,7 +1579,7 @@ void SCH_HIERLABEL::Draw( EDA_DRAW_PANEL* panel,
void
SCH_HIERLABEL
::
CreateGraphicShape
(
std
::
vector
<
wxPoint
>&
aPoints
,
const
wxPoint
&
Pos
)
{
int
*
Template
=
TemplateShape
[
m_
Shape
][
m_S
chematicOrientation
];
int
*
Template
=
TemplateShape
[
m_
shape
][
m_s
chematicOrientation
];
int
HalfSize
=
m_Size
.
x
/
2
;
int
imax
=
*
Template
;
Template
++
;
...
...
@@ -1616,10 +1614,9 @@ EDA_RECT SCH_HIERLABEL::GetBoundingBox() const
+
height
// add height for triangular shapes
+
2
*
DANGLING_SYMBOL_SIZE
;
switch
(
m_
S
chematicOrientation
)
// respect orientation
switch
(
m_
s
chematicOrientation
)
// respect orientation
{
case
0
:
/* Horiz Normal Orientation (left
*justified) */
case
0
:
/* Horiz Normal Orientation (left justified) */
dx
=
-
length
;
dy
=
height
;
x
+=
DANGLING_SYMBOL_SIZE
;
...
...
@@ -1662,7 +1659,7 @@ wxPoint SCH_HIERLABEL::GetSchematicTextOffset() const
int
ii
=
m_Size
.
x
+
TXTMARGE
+
width
;
switch
(
m_
S
chematicOrientation
)
switch
(
m_
s
chematicOrientation
)
{
case
0
:
/* Orientation horiz normale */
text_offset
.
x
=
-
ii
;
...
...
eeschema/sch_text.h
View file @
1047e60e
...
...
@@ -56,27 +56,23 @@ extern const char* SheetLabelType[]; /* names of types of labels */
class
SCH_TEXT
:
public
SCH_ITEM
,
public
EDA_TEXT
{
public
:
int
m_Shape
;
bool
m_IsDangling
;
// true if not connected (used to draw the "not
// connected" symbol
protected
:
int
m_SchematicOrientation
;
/* orientation of texts (comments) and
* labels in schematic
* 0 = normal (horizontal, left
* justified)
.
* 1 = up (vertical)
* 2 = (horizontal, right justified).
* This can be seen as the mirrored
* position of 0
* 3 = bottom . This can be seen as the
* mirrored position of up
* this is perhaps a duplicate of m_Orient
* and m_HJustified or m_VJustified,
* but is more easy to handle that 3
* parameters in editions, Reading and
* Saving file
*/
int
m_shape
;
/// True if not connected to another object if the object derive from SCH_TEXT
/// supports connections
.
bool
m_isDangling
;
/**
* The orientation of text and any associated drawing elements of derived objects.
* 0 is the horizontal and left justified.
* 1 is vertical and top justified.
* 2 is horizontal and right justified. It is the equivalent of the mirrored 0 orentation.
* 3 is veritcal and bottom justifiend. It is the equivalent of the mirrored 1 orentation.
* This is a duplicattion of m_Orient, m_HJustified, and m_VJustified in #EDA_TEXT but is
* easier to handle that 3 parameters when editing and reading and saving files.
*/
int
m_schematicOrientation
;
public
:
SCH_TEXT
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
...
...
@@ -100,10 +96,10 @@ public:
/**
* Function SetOrientation
* Set m_
S
chematicOrientation, and initialize
* Set m_
s
chematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_
S
chematicOrientation (for a text )
* must be called after changing m_
S
chematicOrientation
* m_
s
chematicOrientation (for a text )
* must be called after changing m_
s
chematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
...
...
@@ -113,15 +109,18 @@ public:
*/
virtual
void
SetOrientation
(
int
aSchematicOrientation
);
int
GetOrientation
()
{
return
m_SchematicOrientation
;
}
int
GetOrientation
()
{
return
m_schematicOrientation
;
}
int
GetShape
()
const
{
return
m_shape
;
}
void
SetShape
(
int
aShape
)
{
m_shape
=
aShape
;
}
/**
* Function GetSchematicTextOffset (virtual)
* @return the offset between the SCH_TEXT position and the text itself
* position
* This offset depend on orientation, and the type of text
* (room to draw an associated graphic symbol, or put the text above a
* wire)
* @return the offset between the SCH_TEXT position and the text itself position
*
* This offset depends on the orientation, the type of text, and the area required to
* draw the associated graphic symbol or to put the text above a wire.
*/
virtual
wxPoint
GetSchematicTextOffset
()
const
;
...
...
@@ -203,12 +202,7 @@ public:
virtual
void
Mirror_X
(
int
aXaxis_position
);
/**
* Compare schematic text entry against search string.
*
* @param aSearchData - Criterial to search against.
* @param aAuxData - a pointer on auxiliary data, if needed. Can be null
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if this schematic text item matches the search criteria.
* @copydoc EDA_ITEM::Matches(wxFindReplaceData&,void*,wxPoint*)
*/
virtual
bool
Matches
(
wxFindReplaceData
&
aSearchData
,
void
*
aAuxData
,
wxPoint
*
aFindLocation
);
...
...
@@ -216,7 +210,7 @@ public:
virtual
bool
IsDanglingStateChanged
(
std
::
vector
<
DANGLING_END_ITEM
>&
aItemList
);
virtual
bool
IsDangling
()
const
{
return
m_
I
sDangling
;
}
virtual
bool
IsDangling
()
const
{
return
m_
i
sDangling
;
}
virtual
bool
IsSelectStateChanged
(
const
wxRect
&
aRect
);
...
...
@@ -267,10 +261,10 @@ public:
/**
* Function SetOrientation
* Set m_
S
chematicOrientation, and initialize
* Set m_
s
chematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_
S
chematicOrientation (for a label)
* must be called after changing m_
S
chematicOrientation
* m_
s
chematicOrientation (for a label)
* must be called after changing m_
s
chematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
...
...
@@ -362,10 +356,10 @@ public:
/**
* Function SetOrientation
* Set m_
S
chematicOrientation, and initialize
* Set m_
s
chematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_
S
chematicOrientation
* must be called after changing m_
S
chematicOrientation
* m_
s
chematicOrientation
* must be called after changing m_
s
chematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
...
...
@@ -468,10 +462,10 @@ public:
/**
* Function SetOrientation
* Set m_
S
chematicOrientation, and initialize
* Set m_
s
chematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_
S
chematicOrientation
* must be called after changing m_
S
chematicOrientation
* m_
s
chematicOrientation
* must be called after changing m_
s
chematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
...
...
eeschema/sheet.cpp
View file @
1047e60e
...
...
@@ -50,12 +50,12 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC )
wxString
units
=
GetUnitsLabel
(
g_UserUnit
);
dlg
.
SetFileName
(
aSheet
->
GetFileName
()
);
dlg
.
SetFileNameTextSize
(
ReturnStringFromValue
(
g_UserUnit
,
aSheet
->
m_FileNameSize
,
aSheet
->
GetFileNameSize
()
,
m_InternalUnits
)
);
dlg
.
SetFileNameTextSizeUnits
(
units
);
dlg
.
SetSheetName
(
aSheet
->
m_SheetName
);
dlg
.
SetSheetName
(
aSheet
->
GetName
()
);
dlg
.
SetSheetNameTextSize
(
ReturnStringFromValue
(
g_UserUnit
,
aSheet
->
m_SheetNameSize
,
aSheet
->
GetSheetNameSize
()
,
m_InternalUnits
)
);
dlg
.
SetSheetNameTextSizeUnits
(
units
);
...
...
@@ -192,16 +192,16 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC )
else
if
(
loadFromFile
)
aSheet
->
Load
(
this
);
aSheet
->
m_FileNameSize
=
ReturnValueFromString
(
g_UserUnit
,
aSheet
->
SetFileNameSize
(
ReturnValueFromString
(
g_UserUnit
,
dlg
.
GetFileNameTextSize
(),
m_InternalUnits
);
aSheet
->
m_SheetName
=
dlg
.
GetSheetName
(
);
aSheet
->
m_SheetNameSize
=
ReturnValueFromString
(
g_UserUnit
,
m_InternalUnits
)
)
;
aSheet
->
SetName
(
dlg
.
GetSheetName
()
);
aSheet
->
SetSheetNameSize
(
ReturnValueFromString
(
g_UserUnit
,
dlg
.
GetSheetNameTextSize
(),
m_InternalUnits
);
m_InternalUnits
)
)
;
if
(
aSheet
->
m_SheetName
.
IsEmpty
()
)
aSheet
->
m_SheetName
.
Printf
(
wxT
(
"Sheet%8.8lX"
),
aSheet
->
GetTimeStamp
(
)
);
if
(
aSheet
->
GetName
()
.
IsEmpty
()
)
aSheet
->
SetName
(
wxString
::
Format
(
wxT
(
"Sheet%8.8lX"
),
aSheet
->
GetTimeStamp
()
)
);
DrawPanel
->
MoveCursorToCrossHair
();
DrawPanel
->
m_IgnoreMouseEvents
=
false
;
...
...
@@ -225,10 +225,12 @@ static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint&
if
(
aErase
)
sheet
->
Draw
(
aPanel
,
aDC
,
wxPoint
(
0
,
0
),
g_XorMode
);
wxPoint
pos
=
sheet
->
GetPosition
();
if
(
sheet
->
IsResized
()
)
{
int
width
=
screen
->
GetCrossHairPosition
().
x
-
sheet
->
m_Pos
.
x
;
int
height
=
screen
->
GetCrossHairPosition
().
y
-
sheet
->
m_Pos
.
y
;
int
width
=
screen
->
GetCrossHairPosition
().
x
-
sheet
->
GetPosition
()
.
x
;
int
height
=
screen
->
GetCrossHairPosition
().
y
-
sheet
->
GetPosition
()
.
y
;
// If the sheet doesn't have any pins, clamp the minimum size to the default values.
width
=
(
width
<
MIN_SHEET_WIDTH
)
?
MIN_SHEET_WIDTH
:
width
;
...
...
@@ -241,18 +243,17 @@ static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint&
// If the sheet has pins, use the pin positions to clamp the minimum height.
height
=
(
height
<
sheet
->
GetMinHeight
()
+
gridSizeY
)
?
sheet
->
GetMinHeight
()
+
gridSizeY
:
height
;
sheet
->
GetMinHeight
()
+
gridSizeY
:
height
;
width
=
(
width
<
sheet
->
GetMinWidth
()
+
gridSizeX
)
?
sheet
->
GetMinWidth
()
+
gridSizeX
:
width
;
sheet
->
GetMinWidth
()
+
gridSizeX
:
width
;
}
wxPoint
grid
=
screen
->
GetNearestGridPosition
(
wxPoint
(
sheet
->
m_Pos
.
x
+
width
,
sheet
->
m_Pos
.
y
+
height
)
);
sheet
->
Resize
(
wxSize
(
grid
.
x
-
sheet
->
m_Pos
.
x
,
grid
.
y
-
sheet
->
m_Pos
.
y
)
);
wxPoint
grid
=
screen
->
GetNearestGridPosition
(
wxPoint
(
pos
.
x
+
width
,
pos
.
y
+
height
)
);
sheet
->
Resize
(
wxSize
(
grid
.
x
-
pos
.
x
,
grid
.
y
-
pos
.
y
)
);
}
else
if
(
sheet
->
IsMoving
()
)
{
moveVector
=
screen
->
GetCrossHairPosition
()
-
sheet
->
m_P
os
;
moveVector
=
screen
->
GetCrossHairPosition
()
-
p
os
;
sheet
->
Move
(
moveVector
);
}
...
...
@@ -361,7 +362,7 @@ void SCH_EDIT_FRAME::StartMoveSheet( SCH_SHEET* aSheet, wxDC* aDC )
return
;
DrawPanel
->
CrossHairOff
(
aDC
);
GetScreen
()
->
SetCrossHairPosition
(
aSheet
->
m_Pos
);
GetScreen
()
->
SetCrossHairPosition
(
aSheet
->
GetPosition
()
);
DrawPanel
->
MoveCursorToCrossHair
();
if
(
!
aSheet
->
IsNew
()
)
...
...
eeschema/sheetlab.cpp
View file @
1047e60e
...
...
@@ -60,7 +60,7 @@ int SCH_EDIT_FRAME::EditSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC )
dlg
.
SetTextHeightUnits
(
GetUnitsLabel
(
g_UserUnit
)
);
dlg
.
SetTextWidth
(
ReturnStringFromValue
(
g_UserUnit
,
aSheetPin
->
m_Size
.
x
,
m_InternalUnits
)
);
dlg
.
SetTextWidthUnits
(
GetUnitsLabel
(
g_UserUnit
)
);
dlg
.
SetConnectionType
(
aSheetPin
->
m_Shape
);
dlg
.
SetConnectionType
(
aSheetPin
->
GetShape
()
);
/* This ugly hack fixes a bug in wxWidgets 2.8.7 and likely earlier versions for
* the flex grid sizer in wxGTK that prevents the last column from being sized
...
...
@@ -86,7 +86,7 @@ int SCH_EDIT_FRAME::EditSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC )
aSheetPin
->
m_Text
=
dlg
.
GetLabelName
();
aSheetPin
->
m_Size
.
y
=
ReturnValueFromString
(
g_UserUnit
,
dlg
.
GetTextHeight
(),
m_InternalUnits
);
aSheetPin
->
m_Size
.
x
=
ReturnValueFromString
(
g_UserUnit
,
dlg
.
GetTextWidth
(),
m_InternalUnits
);
aSheetPin
->
m_Shape
=
dlg
.
GetConnectionType
(
);
aSheetPin
->
SetShape
(
dlg
.
GetConnectionType
()
);
if
(
aDC
)
aSheetPin
->
Draw
(
DrawPanel
,
aDC
,
wxPoint
(
0
,
0
),
GR_DEFAULT_DRAWMODE
);
...
...
@@ -103,7 +103,7 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::CreateSheetPin( SCH_SHEET* aSheet, wxDC* aDC )
sheetPin
=
new
SCH_SHEET_PIN
(
aSheet
,
wxPoint
(
0
,
0
),
line
);
sheetPin
->
SetFlags
(
IS_NEW
);
sheetPin
->
m_Size
=
m_lastSheetPinTextSize
;
sheetPin
->
m_Shape
=
m_lastSheetPinType
;
sheetPin
->
SetShape
(
m_lastSheetPinType
)
;
int
response
=
EditSheetPin
(
sheetPin
,
NULL
);
...
...
@@ -113,7 +113,7 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::CreateSheetPin( SCH_SHEET* aSheet, wxDC* aDC )
return
NULL
;
}
m_lastSheetPinType
=
sheetPin
->
m_Shape
;
m_lastSheetPinType
=
sheetPin
->
GetShape
()
;
m_lastSheetPinTextSize
=
sheetPin
->
m_Size
;
MoveItem
(
(
SCH_ITEM
*
)
sheetPin
,
aDC
);
...
...
@@ -157,7 +157,8 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::ImportSheetPin( SCH_SHEET* aSheet, wxDC* aDC )
sheetPin
=
new
SCH_SHEET_PIN
(
aSheet
,
wxPoint
(
0
,
0
),
label
->
m_Text
);
sheetPin
->
SetFlags
(
IS_NEW
);
sheetPin
->
m_Size
=
m_lastSheetPinTextSize
;
m_lastSheetPinType
=
sheetPin
->
m_Shape
=
label
->
m_Shape
;
m_lastSheetPinType
=
label
->
GetShape
();
sheetPin
->
SetShape
(
label
->
GetShape
()
);
MoveItem
(
(
SCH_ITEM
*
)
sheetPin
,
aDC
);
...
...
include/base_struct.h
View file @
1047e60e
...
...
@@ -162,16 +162,16 @@ public:
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
*
Iterate function. It is used primarily for searching, but not limited
* to that. It can also collect or modify the scanned objects.
*
EDA_ITEM::Iterate() function. It is used primarily for searching, but
*
not limited
to that. It can also collect or modify the scanned objects.
*
* @param
test
Item An EDA_ITEM to examine.
* @param
t
estData is arbitrary data needed by the inspector to determine
* if the EDA_ITEM under test meets its match criteria.
* @return
SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan,
*
else SCAN
_CONTINUE;
* @param
a
Item An EDA_ITEM to examine.
* @param
aT
estData is arbitrary data needed by the inspector to determine
*
if the EDA_ITEM under test meets its match criteria.
* @return
A #SEARCH_RESULT type #SEARCH_QUIT if the iterator function is to
*
stop the scan, else #SEARCH
_CONTINUE;
*/
SEARCH_RESULT
virtual
Inspect
(
EDA_ITEM
*
testItem
,
const
void
*
t
estData
)
=
0
;
SEARCH_RESULT
virtual
Inspect
(
EDA_ITEM
*
aItem
,
const
void
*
aT
estData
)
=
0
;
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment