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
f3c324d5
Commit
f3c324d5
authored
Aug 24, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EDA_BaseStruct::m_StructType is now type KICAD_T
parent
908f6d93
Changes
32
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
4866 additions
and
4314 deletions
+4866
-4314
3d_class.cpp
3d-viewer/3d_class.cpp
+4
-4
change_log.txt
change_log.txt
+12
-3
base_struct.cpp
common/base_struct.cpp
+5
-15
affiche.cpp
eeschema/affiche.cpp
+139
-100
block.cpp
eeschema/block.cpp
+3
-0
block_libedit.cpp
eeschema/block_libedit.cpp
+6
-0
cmpclass.cpp
eeschema/cmpclass.cpp
+1
-1
component_class.cpp
eeschema/component_class.cpp
+1
-1
component_class.h
eeschema/component_class.h
+1
-1
dangling_ends.cpp
eeschema/dangling_ends.cpp
+399
-348
eelibs_draw_components.cpp
eeschema/eelibs_draw_components.cpp
+961
-867
eelibs_read_libraryfiles.cpp
eeschema/eelibs_read_libraryfiles.cpp
+1129
-998
hotkeys.cpp
eeschema/hotkeys.cpp
+2
-0
libclass.cpp
eeschema/libclass.cpp
+575
-490
libcmp.h
eeschema/libcmp.h
+258
-248
libframe.cpp
eeschema/libframe.cpp
+1
-0
locate.cpp
eeschema/locate.cpp
+3
-0
plot.cpp
eeschema/plot.cpp
+3
-0
program.h
eeschema/program.h
+134
-105
symbdraw.cpp
eeschema/symbdraw.cpp
+740
-691
symbedit.cpp
eeschema/symbedit.cpp
+458
-410
base_struct.h
include/base_struct.h
+9
-24
pcbstruct.h
include/pcbstruct.h
+1
-1
wxstruct.h
include/wxstruct.h
+1
-1
block_module_editor.cpp
pcbnew/block_module_editor.cpp
+9
-0
class_edge_mod.cpp
pcbnew/class_edge_mod.cpp
+1
-0
class_track.cpp
pcbnew/class_track.cpp
+2
-1
class_track.h
pcbnew/class_track.h
+1
-1
classpcb.cpp
pcbnew/classpcb.cpp
+2
-2
classtrc.cpp
pcbnew/classtrc.cpp
+1
-1
dialog_track_options.cpp
pcbnew/dialog_track_options.cpp
+1
-1
ratsnest.cpp
pcbnew/ratsnest.cpp
+3
-0
No files found.
3d-viewer/3d_class.cpp
View file @
f3c324d5
...
...
@@ -25,8 +25,8 @@ S3D_Vertex::S3D_Vertex(void)
/**************************************************************************/
S3D_Material
::
S3D_Material
(
Struct3D_Master
*
father
,
const
wxString
&
name
)
:
EDA_BaseStruct
(
father
,
-
1
)
S3D_Material
::
S3D_Material
(
Struct3D_Master
*
father
,
const
wxString
&
name
)
:
EDA_BaseStruct
(
father
,
NOT_USED
)
/**************************************************************************/
{
m_DiffuseColor
.
x
=
m_DiffuseColor
.
y
=
m_DiffuseColor
.
z
=
1.0
;
...
...
@@ -67,7 +67,7 @@ void Struct3D_Master::Copy(Struct3D_Master * pattern)
/***************************************************************/
Struct3D_Master
::
Struct3D_Master
(
EDA_BaseStruct
*
StructFather
)
:
EDA_BaseStruct
(
StructFather
,
-
1
)
EDA_BaseStruct
(
StructFather
,
NOT_USED
)
/***************************************************************/
{
m_MatScale
.
x
=
m_MatScale
.
y
=
m_MatScale
.
z
=
1.0
;
...
...
@@ -100,7 +100,7 @@ S3D_Material * nextmat;
/***************************************************************/
Struct3D_Shape
::
Struct3D_Shape
(
EDA_BaseStruct
*
StructFather
)
:
EDA_BaseStruct
(
StructFather
,
-
1
)
EDA_BaseStruct
(
StructFather
,
NOT_USED
)
/***************************************************************/
{
m_3D_Coord
=
NULL
;
...
...
change_log.txt
View file @
f3c324d5
...
...
@@ -5,6 +5,18 @@ Please add newer entries at the top, list the date and your name with
email address.
2007-Aug-23 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ eeschema & pcbnew
* Removed class EDA_BaseLineStruct, which brought no behavioral advantage, only data.
Classes which were based on got its data members added and their initializers.
* Changed type of EDA_BaseStruct::m_StructType from int to KICAD_T which is an
enum. This makes debugging easier since gdb will show the name of the
KICAD_T rather than simply a number. Added NOT_USED = -1 to KICAD_T enum for
3d which was using -1.
* More beautification using latest uncrustify and the committed uncrustify.cfg
2007-Aug-24 UPDATE Geoff Harland <gharlandau@yahoo.com.au>
================================================================================
+ pcbnew
...
...
@@ -27,9 +39,6 @@ email address.
tomorrow I will add a new class COLLECTORS_GUIDE which can be used by a
COLLECTOR to control its operation. It adds the concept of layer
locking, even though PCBNEW does not support that in the UI yet.
@todo:
add constructor initializers for classes that were derived from
EDA_BaseLineStruct but are now not. Its late, will do tomorrow.
2007-Aug-22 UPDATE Dick Hollenbeck <dick@softplc.com>
...
...
common/base_struct.cpp
View file @
f3c324d5
...
...
@@ -17,8 +17,8 @@
#include "macros.h"
//
DrawStructureType
names for error messages only:
static
wxString
DrawStructureType
Name
[
MAX_STRUCT_TYPE_ID
+
1
]
=
{
//
KICAD_T
names for error messages only:
static
wxString
KICAD_T
Name
[
MAX_STRUCT_TYPE_ID
+
1
]
=
{
wxT
(
"Not init"
),
wxT
(
"Pcb"
),
...
...
@@ -74,7 +74,7 @@ enum textbox {
/******************************************************************************/
EDA_BaseStruct
::
EDA_BaseStruct
(
EDA_BaseStruct
*
parent
,
int
idType
)
EDA_BaseStruct
::
EDA_BaseStruct
(
EDA_BaseStruct
*
parent
,
KICAD_T
idType
)
/******************************************************************************/
{
InitVars
();
...
...
@@ -84,7 +84,7 @@ EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, int idType )
/********************************************/
EDA_BaseStruct
::
EDA_BaseStruct
(
int
idType
)
EDA_BaseStruct
::
EDA_BaseStruct
(
KICAD_T
idType
)
/********************************************/
{
InitVars
();
...
...
@@ -183,7 +183,7 @@ wxString EDA_BaseStruct::ReturnClassName() const
if
(
(
ii
<
0
)
||
(
ii
>
MAX_STRUCT_TYPE_ID
)
)
ii
=
MAX_STRUCT_TYPE_ID
;
classname
=
DrawStructureType
Name
[
ii
];
classname
=
KICAD_T
Name
[
ii
];
return
classname
;
}
...
...
@@ -287,16 +287,6 @@ std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os )
/**********************************************************************************************/
EDA_BaseLineStruct
::
EDA_BaseLineStruct
(
EDA_BaseStruct
*
StructFather
,
DrawStructureType
idtype
)
:
EDA_BaseStruct
(
StructFather
,
idtype
)
/**********************************************************************************************/
{
m_Layer
=
0
;
m_Width
=
0
;
// 0 = line, > 0 = tracks, bus ...
};
/*********************************************************/
/* EDA_TextStruct (classe de base, non utilis� seule */
/*********************************************************/
...
...
eeschema/affiche.cpp
View file @
f3c324d5
/**********************************************************/
/* Routines d'affichage de parametres et caracteristiques */
/**********************************************************/
/**********************************************************/
/* Routines d'affichage de parametres et caracteristiques */
/**********************************************************/
/* Fichier AFFICHE.CPP */
/* Fichier AFFICHE.CPP */
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -15,136 +15,175 @@
/***********************************************************/
void
DrawSheetStruct
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
void
DrawSheetStruct
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
/************************************************************/
{
frame
->
MsgPanel
->
EraseMsgBox
();
Affiche_1_Parametre
(
frame
,
1
,
_
(
"Name"
),
m_SheetName
,
CYAN
);
Affiche_1_Parametre
(
frame
,
30
,
_
(
"FileName"
),
m_FileName
,
BROWN
);
frame
->
MsgPanel
->
EraseMsgBox
();
Affiche_1_Parametre
(
frame
,
1
,
_
(
"Name"
),
m_SheetName
,
CYAN
);
Affiche_1_Parametre
(
frame
,
30
,
_
(
"FileName"
),
m_FileName
,
BROWN
);
}
/***************************************************************/
void
EDA_SchComponentStruct
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
void
EDA_SchComponentStruct
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
/***************************************************************/
{
EDA_LibComponentStruct
*
Entry
=
FindLibPart
(
m_ChipName
.
GetData
(),
wxEmptyString
,
FIND_ROOT
);;
wxString
msg
;
frame
->
MsgPanel
->
EraseMsgBox
();
EDA_LibComponentStruct
*
Entry
=
FindLibPart
(
m_ChipName
.
GetData
(),
wxEmptyString
,
FIND_ROOT
);;
Affiche_1_Parametre
(
frame
,
1
,
_
(
"Ref"
),
m_Field
[
REFERENCE
].
m_Text
,
DARKCYAN
);
wxString
msg
;
if
(
Entry
&&
Entry
->
m_Options
==
ENTRY_POWER
)
msg
=
_
(
"Pwr Symb"
);
else
msg
=
_
(
"Val"
);
Affiche_1_Parametre
(
frame
,
10
,
msg
,
m_Field
[
VALUE
].
m_Text
,
DARKCYAN
);
frame
->
MsgPanel
->
EraseMsgBox
();
Affiche_1_Parametre
(
frame
,
28
,
_
(
"RefLib"
),
m_ChipName
.
GetData
(),
BROWN
);
Affiche_1_Parametre
(
frame
,
1
,
_
(
"Ref"
),
m_Field
[
REFERENCE
].
m_Text
,
DARKCYAN
);
msg
=
FindLibName
;
Affiche_1_Parametre
(
frame
,
40
,
_
(
"Lib"
),
msg
,
DARKRED
);
if
(
Entry
&&
Entry
->
m_Options
==
ENTRY_POWER
)
msg
=
_
(
"Pwr Symb"
);
else
msg
=
_
(
"Val"
);
Affiche_1_Parametre
(
frame
,
10
,
msg
,
m_Field
[
VALUE
].
m_Text
,
DARKCYAN
);
if
(
Entry
)
{
Affiche_1_Parametre
(
frame
,
52
,
Entry
->
m_Doc
,
wxEmptyString
,
DARKCYAN
);
Affiche_1_Parametre
(
frame
,
52
,
wxEmptyString
,
Entry
->
m_KeyWord
,
DARKGREEN
);
}
}
Affiche_1_Parametre
(
frame
,
28
,
_
(
"RefLib"
),
m_ChipName
.
GetData
(),
BROWN
);
msg
=
FindLibName
;
Affiche_1_Parametre
(
frame
,
40
,
_
(
"Lib"
),
msg
,
DARKRED
);
if
(
Entry
)
{
Affiche_1_Parametre
(
frame
,
52
,
Entry
->
m_Doc
,
wxEmptyString
,
DARKCYAN
);
Affiche_1_Parametre
(
frame
,
52
,
wxEmptyString
,
Entry
->
m_KeyWord
,
DARKGREEN
);
}
}
/*******************************************************/
void
LibDrawPin
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
void
LibDrawPin
::
Display_Infos
(
WinEDA_DrawFrame
*
frame
)
/*******************************************************/
/* Affiche en bas d'ecran les caracteristiques de la pin
*/
*/
{
wxString
Text
;
int
ii
;
wxString
Text
;
int
ii
;
frame
->
MsgPanel
->
EraseMsgBox
();
/* Affichage du nom */
Affiche_1_Parametre
(
frame
,
24
,
_
(
"PinName"
),
m_PinName
,
DARKCYAN
);
frame
->
MsgPanel
->
EraseMsgBox
();
/* Affichage du numero */
if
(
m_PinNum
==
0
)
Text
=
wxT
(
"?"
);
else
ReturnPinStringNum
(
Text
);
/* Affichage du nom */
Affiche_1_Parametre
(
frame
,
24
,
_
(
"PinName"
),
m_PinName
,
DARKCYAN
);
Affiche_1_Parametre
(
frame
,
40
,
_
(
"PinNum"
),
Text
,
DARKCYAN
);
/* Affichage du numero
*/
if
(
m_PinNum
==
0
)
Text
=
wxT
(
"?"
)
;
else
ReturnPinStringNum
(
Text
);
/* Affichage du type
*/
ii
=
m_PinType
;
Affiche_1_Parametre
(
frame
,
48
,
_
(
"PinType"
),
MsgPinElectricType
[
ii
],
RED
);
Affiche_1_Parametre
(
frame
,
40
,
_
(
"PinNum"
),
Text
,
DARKCYAN
);
/* Affichage de la visiblite */
ii
=
m_Attributs
;
if
(
ii
&
1
)
Text
=
_
(
"no"
);
else
Text
=
_
(
"yes"
);
Affiche_1_Parametre
(
frame
,
58
,
_
(
"Display"
),
Text
,
DARKGREEN
);
/* Affichage du type
*/
ii
=
m_PinType
;
Affiche_1_Parametre
(
frame
,
48
,
_
(
"PinType"
),
MsgPinElectricType
[
ii
],
RED
);
/* Affichage de la longueur
*/
Text
.
Printf
(
wxT
(
"%d"
),
m_PinLen
)
;
Affiche_1_Parametre
(
frame
,
66
,
_
(
"Lengh"
),
Text
,
MAGENTA
);
/* Affichage de la visiblite
*/
ii
=
m_Attributs
;
if
(
ii
&
1
)
Text
=
_
(
"no"
);
else
Text
=
_
(
"yes"
);
Affiche_1_Parametre
(
frame
,
58
,
_
(
"Display"
),
Text
,
DARKGREEN
)
;
/* Affichage de l'orientation
*/
switch
(
m_Orient
)
{
case
PIN_UP
:
Text
=
_
(
"Up"
);
break
;
/* Affichage de la longueur */
Text
.
Printf
(
wxT
(
"%d"
),
m_PinLen
);
Affiche_1_Parametre
(
frame
,
66
,
_
(
"Lengh"
),
Text
,
MAGENTA
);
case
PIN_DOWN
:
Text
=
_
(
"Down"
);
break
;
/* Affichage de l'orientation */
switch
(
m_Orient
)
{
case
PIN_UP
:
Text
=
_
(
"Up"
);
break
;
case
PIN_DOWN
:
Text
=
_
(
"Down"
);
break
;
case
PIN_LEFT
:
Text
=
_
(
"Left"
);
break
;
case
PIN_RIGHT
:
Text
=
_
(
"Right"
);
break
;
default
:
Text
=
wxT
(
"??"
);
break
;
}
case
PIN_LEFT
:
Text
=
_
(
"Left"
);
break
;
Affiche_1_Parametre
(
frame
,
72
,
_
(
"Orient"
),
Text
,
MAGENTA
);
case
PIN_RIGHT
:
Text
=
_
(
"Right"
);
break
;
default
:
Text
=
wxT
(
"??"
);
break
;
}
Affiche_1_Parametre
(
frame
,
72
,
_
(
"Orient"
),
Text
,
MAGENTA
);
}
/***********************************************************************/
void
LibEDA_BaseStruct
::
Display_Infos_DrawEntry
(
WinEDA_DrawFrame
*
frame
)
void
LibEDA_BaseStruct
::
Display_Infos_DrawEntry
(
WinEDA_DrawFrame
*
frame
)
/***********************************************************************/
/* Affiche en bas d'ecran les caracteristiques de l'element
*/
*/
{
wxString
msg
;
frame
->
MsgPanel
->
EraseMsgBox
();
/* affichage du type */
msg
=
wxT
(
"??"
);
switch
(
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
msg
=
wxT
(
"Arc"
);
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
msg
=
wxT
(
"Circle"
);
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
msg
=
wxT
(
"Text"
);
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
msg
=
wxT
(
"Rect"
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
msg
=
wxT
(
"PolyLine"
);
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
msg
=
wxT
(
"Segment"
);
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
((
LibDrawPin
*
)
this
)
->
Display_Infos
(
frame
);
msg
=
wxT
(
"Pin"
);
break
;
}
Affiche_1_Parametre
(
frame
,
1
,
wxT
(
"Type"
),
msg
,
CYAN
);
/* Affichage de l'appartenance */
if
(
m_Unit
==
0
)
msg
=
_
(
"All"
);
else
msg
.
Printf
(
wxT
(
"%d"
),
m_Unit
);
Affiche_1_Parametre
(
frame
,
10
,
_
(
"Unit"
),
msg
,
BROWN
);
if
(
m_Convert
==
0
)
msg
=
_
(
"All"
);
else
if
(
m_Convert
==
1
)
msg
=
_
(
"no"
);
else
if
(
m_Convert
==
2
)
msg
=
_
(
"yes"
);
else
msg
=
wxT
(
"?"
);
Affiche_1_Parametre
(
frame
,
16
,
_
(
"Convert"
),
msg
,
BROWN
);
if
(
m_Width
)
valeur_param
(
m_Width
,
msg
);
else
msg
=
_
(
"default"
);
Affiche_1_Parametre
(
frame
,
24
,
_
(
"Width"
),
msg
,
BLUE
);
}
wxString
msg
;
frame
->
MsgPanel
->
EraseMsgBox
();
/* affichage du type */
msg
=
wxT
(
"??"
);
switch
(
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
msg
=
wxT
(
"Arc"
);
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
msg
=
wxT
(
"Circle"
);
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
msg
=
wxT
(
"Text"
);
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
msg
=
wxT
(
"Rect"
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
msg
=
wxT
(
"PolyLine"
);
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
msg
=
wxT
(
"Segment"
);
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
(
(
LibDrawPin
*
)
this
)
->
Display_Infos
(
frame
);
msg
=
wxT
(
"Pin"
);
break
;
default
:
;
}
Affiche_1_Parametre
(
frame
,
1
,
wxT
(
"Type"
),
msg
,
CYAN
);
/* Affichage de l'appartenance */
if
(
m_Unit
==
0
)
msg
=
_
(
"All"
);
else
msg
.
Printf
(
wxT
(
"%d"
),
m_Unit
);
Affiche_1_Parametre
(
frame
,
10
,
_
(
"Unit"
),
msg
,
BROWN
);
if
(
m_Convert
==
0
)
msg
=
_
(
"All"
);
else
if
(
m_Convert
==
1
)
msg
=
_
(
"no"
);
else
if
(
m_Convert
==
2
)
msg
=
_
(
"yes"
);
else
msg
=
wxT
(
"?"
);
Affiche_1_Parametre
(
frame
,
16
,
_
(
"Convert"
),
msg
,
BROWN
);
if
(
m_Width
)
valeur_param
(
m_Width
,
msg
);
else
msg
=
_
(
"default"
);
Affiche_1_Parametre
(
frame
,
24
,
_
(
"Width"
),
msg
,
BLUE
);
}
eeschema/block.cpp
View file @
f3c324d5
...
...
@@ -841,6 +841,9 @@ static EDA_BaseStruct* CopyStruct( WinEDA_DrawPanel* panel, wxDC* DC, BASE_SCREE
sheet
->
m_FileName
=
sheet
->
m_SheetName
+
wxT
(
".sch"
);
break
;
}
default
:
;
}
SetStructFather
(
Struct
,
screen
);
...
...
eeschema/block_libedit.cpp
View file @
f3c324d5
...
...
@@ -594,6 +594,9 @@ void MoveMarkedItems( EDA_LibComponentStruct* LibEntry, wxPoint offset )
(
(
LibDrawText
*
)
item
)
->
m_Pos
.
x
+=
offset
.
x
;
(
(
LibDrawText
*
)
item
)
->
m_Pos
.
y
+=
offset
.
y
;
break
;
default
:
;
}
item
->
m_Flags
=
item
->
m_Selected
=
0
;
...
...
@@ -701,6 +704,9 @@ void MirrorMarkedItems( EDA_LibComponentStruct* LibEntry, wxPoint offset )
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
SETMIRROR
(
(
(
LibDrawText
*
)
item
)
->
m_Pos
.
x
);
break
;
default
:
;
}
item
->
m_Flags
=
item
->
m_Selected
=
0
;
...
...
eeschema/cmpclass.cpp
View file @
f3c324d5
...
...
@@ -148,7 +148,7 @@ wxString DrawMarkerStruct::GetComment( void )
/***************************/
EDA_DrawLineStruct
::
EDA_DrawLineStruct
(
const
wxPoint
&
pos
,
int
layer
)
:
EDA_Base
Line
Struct
(
NULL
,
DRAW_SEGMENT_STRUCT_TYPE
)
EDA_BaseStruct
(
NULL
,
DRAW_SEGMENT_STRUCT_TYPE
)
{
m_Start
=
pos
;
m_End
=
pos
;
...
...
eeschema/component_class.cpp
View file @
f3c324d5
...
...
@@ -23,7 +23,7 @@
/***************************/
/***********************************************************************************/
DrawPartStruct
::
DrawPartStruct
(
DrawStructureType
struct_type
,
const
wxPoint
&
pos
)
:
DrawPartStruct
::
DrawPartStruct
(
KICAD_T
struct_type
,
const
wxPoint
&
pos
)
:
EDA_BaseStruct
(
struct_type
)
/***********************************************************************************/
{
...
...
eeschema/component_class.h
View file @
f3c324d5
...
...
@@ -70,7 +70,7 @@ public:
wxPoint
m_Pos
;
/* Exact position of part. */
public
:
DrawPartStruct
(
DrawStructureType
struct_type
,
const
wxPoint
&
pos
);
DrawPartStruct
(
KICAD_T
struct_type
,
const
wxPoint
&
pos
);
~
DrawPartStruct
(
void
);
};
...
...
eeschema/dangling_ends.cpp
View file @
f3c324d5
/*********************/
/* dangling_ends.cpp */
/*********************/
/*********************/
/* dangling_ends.cpp */
/*********************/
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -9,401 +9,452 @@
#include "libcmp.h"
#include "general.h"
#include "netlist.h"
/* Definitions generales liees au calcul de netliste */
#include "netlist.h"
/* Definitions generales liees au calcul de netliste */
#include "protos.h"
enum
End_Type
{
UNKNOWN
=
0
,
WIRE_START_END
,
WIRE_END_END
,
BUS_START_END
,
BUS_END_END
,
JUNCTION_END
,
PIN_END
,
LABEL_END
,
ENTRY_END
,
SHEET_LABEL_END
enum
End_Type
{
UNKNOWN
=
0
,
WIRE_START_END
,
WIRE_END_END
,
BUS_START_END
,
BUS_END_END
,
JUNCTION_END
,
PIN_END
,
LABEL_END
,
ENTRY_END
,
SHEET_LABEL_END
};
class
DanglingEndHandle
{
public
:
const
void
*
m_Item
;
wxPoint
m_Pos
;
int
m_Type
;
DanglingEndHandle
*
m_Pnext
;
DanglingEndHandle
(
int
type
)
{
m_Item
=
NULL
;
m_Type
=
type
;
m_Pnext
=
NULL
;
}
const
void
*
m_Item
;
wxPoint
m_Pos
;
int
m_Type
;
DanglingEndHandle
*
m_Pnext
;
DanglingEndHandle
(
int
type
)
{
m_Item
=
NULL
;
m_Type
=
type
;
m_Pnext
=
NULL
;
}
};
DanglingEndHandle
*
ItemList
;
DanglingEndHandle
*
ItemList
;
static
void
TestWireForDangling
(
EDA_DrawLineStruct
*
DrawRef
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
);
void
TestLabelForDangling
(
DrawTextStruct
*
label
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
);
DanglingEndHandle
*
RebuildEndList
(
EDA_BaseStruct
*
DrawList
);
static
void
TestWireForDangling
(
EDA_DrawLineStruct
*
DrawRef
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
);
void
TestLabelForDangling
(
DrawTextStruct
*
label
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
);
DanglingEndHandle
*
RebuildEndList
(
EDA_BaseStruct
*
DrawList
);
/**********************************************************/
bool
SegmentIntersect
(
int
Sx1
,
int
Sy1
,
int
Sx2
,
int
Sy2
,
int
Px1
,
int
Py1
)
bool
SegmentIntersect
(
int
Sx1
,
int
Sy1
,
int
Sx2
,
int
Sy2
,
int
Px1
,
int
Py1
)
/**********************************************************/
/* Retourne TRUE si le point P est sur le segment S.
Le segment est suppose horizontal ou vertical.
*/
*
Le segment est suppose horizontal ou vertical.
*/
{
int
Sxmin
,
Sxmax
,
Symin
,
Symax
;
if
(
Sx1
==
Sx2
)
/* Line S is vertical. */
{
Symin
=
MIN
(
Sy1
,
Sy2
);
Symax
=
MAX
(
Sy1
,
Sy2
);
if
(
Px1
!=
Sx1
)
return
FALSE
;
if
(
Py1
>=
Symin
&&
Py1
<=
Symax
)
return
TRUE
;
else
return
FALSE
;
}
else
if
(
Sy1
==
Sy2
)
/* Line S is horizontal. */
{
Sxmin
=
MIN
(
Sx1
,
Sx2
);
Sxmax
=
MAX
(
Sx1
,
Sx2
);
if
(
Py1
!=
Sy1
)
return
FALSE
;
if
(
Px1
>=
Sxmin
&&
Px1
<=
Sxmax
)
return
TRUE
;
else
return
FALSE
;
}
else
return
FALSE
;
// Segments quelconques
int
Sxmin
,
Sxmax
,
Symin
,
Symax
;
if
(
Sx1
==
Sx2
)
/* Line S is vertical. */
{
Symin
=
MIN
(
Sy1
,
Sy2
);
Symax
=
MAX
(
Sy1
,
Sy2
);
if
(
Px1
!=
Sx1
)
return
FALSE
;
if
(
Py1
>=
Symin
&&
Py1
<=
Symax
)
return
TRUE
;
else
return
FALSE
;
}
else
if
(
Sy1
==
Sy2
)
/* Line S is horizontal. */
{
Sxmin
=
MIN
(
Sx1
,
Sx2
);
Sxmax
=
MAX
(
Sx1
,
Sx2
);
if
(
Py1
!=
Sy1
)
return
FALSE
;
if
(
Px1
>=
Sxmin
&&
Px1
<=
Sxmax
)
return
TRUE
;
else
return
FALSE
;
}
else
return
FALSE
;
// Segments quelconques
}
/******************************************************************************/
void
WinEDA_SchematicFrame
::
TestDanglingEnds
(
EDA_BaseStruct
*
DrawList
,
wxDC
*
DC
)
void
WinEDA_SchematicFrame
::
TestDanglingEnds
(
EDA_BaseStruct
*
DrawList
,
wxDC
*
DC
)
/******************************************************************************/
/* Met a jour les membres m_Dangling des wires, bus, labels
*/
*/
{
EDA_BaseStruct
*
DrawItem
;
const
DanglingEndHandle
*
DanglingItem
,
*
nextitem
;
if
(
ItemList
)
for
(
DanglingItem
=
ItemList
;
DanglingItem
!=
NULL
;
DanglingItem
=
nextitem
)
{
nextitem
=
DanglingItem
->
m_Pnext
;
delete
DanglingItem
;
}
ItemList
=
RebuildEndList
(
DrawList
);
// Controle des elements
for
(
DrawItem
=
DrawList
;
DrawItem
!=
NULL
;
DrawItem
=
DrawItem
->
Pnext
)
{
switch
(
DrawItem
->
m_StructType
)
{
case
DRAW_GLOBAL_LABEL_STRUCT_TYPE
:
case
DRAW_LABEL_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((DrawLabelStruct*)DrawItem)
TestLabelForDangling
(
STRUCT
,
this
,
DC
);
break
;
break
;
case
DRAW_SEGMENT_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((EDA_DrawLineStruct*)DrawItem)
if
(
STRUCT
->
m_Layer
==
LAYER_WIRE
)
{
TestWireForDangling
(
STRUCT
,
this
,
DC
);
break
;
}
if
(
STRUCT
->
m_Layer
==
LAYER_NOTES
)
break
;
if
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
{
STRUCT
->
m_StartIsDangling
=
STRUCT
->
m_EndIsDangling
=
FALSE
;
break
;
}
break
;
}
}
EDA_BaseStruct
*
DrawItem
;
const
DanglingEndHandle
*
DanglingItem
,
*
nextitem
;
if
(
ItemList
)
for
(
DanglingItem
=
ItemList
;
DanglingItem
!=
NULL
;
DanglingItem
=
nextitem
)
{
nextitem
=
DanglingItem
->
m_Pnext
;
delete
DanglingItem
;
}
ItemList
=
RebuildEndList
(
DrawList
);
// Controle des elements
for
(
DrawItem
=
DrawList
;
DrawItem
!=
NULL
;
DrawItem
=
DrawItem
->
Pnext
)
{
switch
(
DrawItem
->
m_StructType
)
{
case
DRAW_GLOBAL_LABEL_STRUCT_TYPE
:
case
DRAW_LABEL_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (DrawLabelStruct*) DrawItem )
TestLabelForDangling
(
STRUCT
,
this
,
DC
);
break
;
break
;
case
DRAW_SEGMENT_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (EDA_DrawLineStruct*) DrawItem )
if
(
STRUCT
->
m_Layer
==
LAYER_WIRE
)
{
TestWireForDangling
(
STRUCT
,
this
,
DC
);
break
;
}
if
(
STRUCT
->
m_Layer
==
LAYER_NOTES
)
break
;
if
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
{
STRUCT
->
m_StartIsDangling
=
STRUCT
->
m_EndIsDangling
=
FALSE
;
break
;
}
break
;
default
:
;
}
}
}
/********************************************************************/
LibDrawPin
*
WinEDA_SchematicFrame
::
LocatePinEnd
(
EDA_BaseStruct
*
DrawList
,
const
wxPoint
&
pos
)
LibDrawPin
*
WinEDA_SchematicFrame
::
LocatePinEnd
(
EDA_BaseStruct
*
DrawList
,
const
wxPoint
&
pos
)
/********************************************************************/
/* Teste si le point de coordonnes pos est sur l'extrmit d'une PIN
retourne un pointeur sur la pin
NULL sinon
*/
*
retourne un pointeur sur la pin
*
NULL sinon
*/
{
EDA_SchComponentStruct
*
DrawLibItem
;
LibDrawPin
*
Pin
;
wxPoint
pinpos
;
Pin
=
LocateAnyPin
(
DrawList
,
pos
,
&
DrawLibItem
);
if
(
!
Pin
)
return
NULL
;
pinpos
=
Pin
->
m_Pos
;
if
(
DrawLibItem
==
NULL
)
pinpos
.
y
=
-
pinpos
.
y
;
else
{
int
x1
=
pinpos
.
x
,
y1
=
pinpos
.
y
;
pinpos
.
x
=
DrawLibItem
->
m_Pos
.
x
+
DrawLibItem
->
m_Transform
[
0
][
0
]
*
x1
+
DrawLibItem
->
m_Transform
[
0
][
1
]
*
y1
;
pinpos
.
y
=
DrawLibItem
->
m_Pos
.
y
+
DrawLibItem
->
m_Transform
[
1
][
0
]
*
x1
+
DrawLibItem
->
m_Transform
[
1
][
1
]
*
y1
;
}
if
(
(
pos
.
x
==
pinpos
.
x
)
&&
(
pos
.
y
==
pinpos
.
y
)
)
return
Pin
;
return
NULL
;
EDA_SchComponentStruct
*
DrawLibItem
;
LibDrawPin
*
Pin
;
wxPoint
pinpos
;
Pin
=
LocateAnyPin
(
DrawList
,
pos
,
&
DrawLibItem
);
if
(
!
Pin
)
return
NULL
;
pinpos
=
Pin
->
m_Pos
;
if
(
DrawLibItem
==
NULL
)
pinpos
.
y
=
-
pinpos
.
y
;
else
{
int
x1
=
pinpos
.
x
,
y1
=
pinpos
.
y
;
pinpos
.
x
=
DrawLibItem
->
m_Pos
.
x
+
DrawLibItem
->
m_Transform
[
0
][
0
]
*
x1
+
DrawLibItem
->
m_Transform
[
0
][
1
]
*
y1
;
pinpos
.
y
=
DrawLibItem
->
m_Pos
.
y
+
DrawLibItem
->
m_Transform
[
1
][
0
]
*
x1
+
DrawLibItem
->
m_Transform
[
1
][
1
]
*
y1
;
}
if
(
(
pos
.
x
==
pinpos
.
x
)
&&
(
pos
.
y
==
pinpos
.
y
)
)
return
Pin
;
return
NULL
;
}
/****************************************************************************/
void
TestWireForDangling
(
EDA_DrawLineStruct
*
DrawRef
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
)
void
TestWireForDangling
(
EDA_DrawLineStruct
*
DrawRef
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
)
/****************************************************************************/
{
DanglingEndHandle
*
terminal_item
;
bool
Sdangstate
=
TRUE
,
Edangstate
=
TRUE
;
for
(
terminal_item
=
ItemList
;
terminal_item
!=
NULL
;
terminal_item
=
terminal_item
->
m_Pnext
)
{
if
(
terminal_item
->
m_Item
==
DrawRef
)
continue
;
if
(
(
DrawRef
->
m_Start
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
DrawRef
->
m_Start
.
y
==
terminal_item
->
m_Pos
.
y
)
)
Sdangstate
=
FALSE
;
if
(
(
DrawRef
->
m_End
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
DrawRef
->
m_End
.
y
==
terminal_item
->
m_Pos
.
y
)
)
Edangstate
=
FALSE
;
if
(
(
Sdangstate
==
FALSE
)
&&
(
Edangstate
==
FALSE
)
)
break
;
}
if
(
(
Sdangstate
!=
DrawRef
->
m_StartIsDangling
)
||
(
Edangstate
!=
DrawRef
->
m_EndIsDangling
)
)
{
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
DrawRef
,
g_XorMode
);
DrawRef
->
m_StartIsDangling
=
Sdangstate
;
DrawRef
->
m_EndIsDangling
=
Edangstate
;
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
DrawRef
,
GR_DEFAULT_DRAWMODE
);
}
DanglingEndHandle
*
terminal_item
;
bool
Sdangstate
=
TRUE
,
Edangstate
=
TRUE
;
for
(
terminal_item
=
ItemList
;
terminal_item
!=
NULL
;
terminal_item
=
terminal_item
->
m_Pnext
)
{
if
(
terminal_item
->
m_Item
==
DrawRef
)
continue
;
if
(
(
DrawRef
->
m_Start
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
DrawRef
->
m_Start
.
y
==
terminal_item
->
m_Pos
.
y
)
)
Sdangstate
=
FALSE
;
if
(
(
DrawRef
->
m_End
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
DrawRef
->
m_End
.
y
==
terminal_item
->
m_Pos
.
y
)
)
Edangstate
=
FALSE
;
if
(
(
Sdangstate
==
FALSE
)
&&
(
Edangstate
==
FALSE
)
)
break
;
}
if
(
(
Sdangstate
!=
DrawRef
->
m_StartIsDangling
)
||
(
Edangstate
!=
DrawRef
->
m_EndIsDangling
)
)
{
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
DrawRef
,
g_XorMode
);
DrawRef
->
m_StartIsDangling
=
Sdangstate
;
DrawRef
->
m_EndIsDangling
=
Edangstate
;
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
DrawRef
,
GR_DEFAULT_DRAWMODE
);
}
}
/********************************************************/
void
TestLabelForDangling
(
DrawTextStruct
*
label
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
)
void
TestLabelForDangling
(
DrawTextStruct
*
label
,
WinEDA_SchematicFrame
*
frame
,
wxDC
*
DC
)
/********************************************************/
{
DanglingEndHandle
*
terminal_item
;
bool
dangstate
=
TRUE
;
for
(
terminal_item
=
ItemList
;
terminal_item
!=
NULL
;
terminal_item
=
terminal_item
->
m_Pnext
)
{
if
(
terminal_item
->
m_Item
==
label
)
continue
;
switch
(
terminal_item
->
m_Type
)
{
case
PIN_END
:
case
LABEL_END
:
case
SHEET_LABEL_END
:
if
(
(
label
->
m_Pos
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
label
->
m_Pos
.
y
==
terminal_item
->
m_Pos
.
y
)
)
dangstate
=
FALSE
;
break
;
case
WIRE_START_END
:
case
BUS_START_END
:
dangstate
=
!
SegmentIntersect
(
terminal_item
->
m_Pos
.
x
,
terminal_item
->
m_Pos
.
y
,
terminal_item
->
m_Pnext
->
m_Pos
.
x
,
terminal_item
->
m_Pnext
->
m_Pos
.
y
,
label
->
m_Pos
.
x
,
label
->
m_Pos
.
y
);
terminal_item
=
terminal_item
->
m_Pnext
;
break
;
case
UNKNOWN
:
case
JUNCTION_END
:
case
ENTRY_END
:
case
WIRE_END_END
:
case
BUS_END_END
:
break
;
}
if
(
dangstate
==
FALSE
)
break
;
}
if
(
dangstate
!=
label
->
m_IsDangling
)
{
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
label
,
g_XorMode
);
label
->
m_IsDangling
=
dangstate
;
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
label
,
GR_DEFAULT_DRAWMODE
);
}
DanglingEndHandle
*
terminal_item
;
bool
dangstate
=
TRUE
;
for
(
terminal_item
=
ItemList
;
terminal_item
!=
NULL
;
terminal_item
=
terminal_item
->
m_Pnext
)
{
if
(
terminal_item
->
m_Item
==
label
)
continue
;
switch
(
terminal_item
->
m_Type
)
{
case
PIN_END
:
case
LABEL_END
:
case
SHEET_LABEL_END
:
if
(
(
label
->
m_Pos
.
x
==
terminal_item
->
m_Pos
.
x
)
&&
(
label
->
m_Pos
.
y
==
terminal_item
->
m_Pos
.
y
)
)
dangstate
=
FALSE
;
break
;
case
WIRE_START_END
:
case
BUS_START_END
:
dangstate
=
!
SegmentIntersect
(
terminal_item
->
m_Pos
.
x
,
terminal_item
->
m_Pos
.
y
,
terminal_item
->
m_Pnext
->
m_Pos
.
x
,
terminal_item
->
m_Pnext
->
m_Pos
.
y
,
label
->
m_Pos
.
x
,
label
->
m_Pos
.
y
);
terminal_item
=
terminal_item
->
m_Pnext
;
break
;
case
UNKNOWN
:
case
JUNCTION_END
:
case
ENTRY_END
:
case
WIRE_END_END
:
case
BUS_END_END
:
break
;
}
if
(
dangstate
==
FALSE
)
break
;
}
if
(
dangstate
!=
label
->
m_IsDangling
)
{
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
label
,
g_XorMode
);
label
->
m_IsDangling
=
dangstate
;
if
(
DC
)
RedrawOneStruct
(
frame
->
DrawPanel
,
DC
,
label
,
GR_DEFAULT_DRAWMODE
);
}
}
/****************************************************/
wxPoint
ReturnPinPhysicalPosition
(
LibDrawPin
*
Pin
,
EDA_SchComponentStruct
*
DrawLibItem
)
wxPoint
ReturnPinPhysicalPosition
(
LibDrawPin
*
Pin
,
EDA_SchComponentStruct
*
DrawLibItem
)
/****************************************************/
/* Retourne la position physique de la pin, qui dpend de l'orientation
du composant */
*
du composant */
{
wxPoint
PinPos
=
Pin
->
m_Pos
;
if
(
DrawLibItem
==
NULL
)
PinPos
.
y
=
-
PinPos
.
y
;
else
{
int
x
=
Pin
->
m_Pos
.
x
,
y
=
Pin
->
m_Pos
.
y
;
PinPos
.
x
=
DrawLibItem
->
m_Pos
.
x
+
DrawLibItem
->
m_Transform
[
0
][
0
]
*
x
+
DrawLibItem
->
m_Transform
[
0
][
1
]
*
y
;
PinPos
.
y
=
DrawLibItem
->
m_Pos
.
y
+
DrawLibItem
->
m_Transform
[
1
][
0
]
*
x
+
DrawLibItem
->
m_Transform
[
1
][
1
]
*
y
;
}
return
PinPos
;
wxPoint
PinPos
=
Pin
->
m_Pos
;
if
(
DrawLibItem
==
NULL
)
PinPos
.
y
=
-
PinPos
.
y
;
else
{
int
x
=
Pin
->
m_Pos
.
x
,
y
=
Pin
->
m_Pos
.
y
;
PinPos
.
x
=
DrawLibItem
->
m_Pos
.
x
+
DrawLibItem
->
m_Transform
[
0
][
0
]
*
x
+
DrawLibItem
->
m_Transform
[
0
][
1
]
*
y
;
PinPos
.
y
=
DrawLibItem
->
m_Pos
.
y
+
DrawLibItem
->
m_Transform
[
1
][
0
]
*
x
+
DrawLibItem
->
m_Transform
[
1
][
1
]
*
y
;
}
return
PinPos
;
}
/***********************************************************/
DanglingEndHandle
*
RebuildEndList
(
EDA_BaseStruct
*
DrawList
)
DanglingEndHandle
*
RebuildEndList
(
EDA_BaseStruct
*
DrawList
)
/***********************************************************/
{
DanglingEndHandle
*
StartList
=
NULL
,
*
item
,
*
lastitem
=
NULL
;
EDA_BaseStruct
*
DrawItem
;
for
(
DrawItem
=
DrawList
;
DrawItem
!=
NULL
;
DrawItem
=
DrawItem
->
Pnext
)
{
switch
(
DrawItem
->
m_StructType
)
{
case
DRAW_LABEL_STRUCT_TYPE
:
break
;
case
DRAW_GLOBAL_LABEL_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((DrawGlobalLabelStruct*)DrawItem)
item
=
new
DanglingEndHandle
(
LABEL_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
break
;
case
DRAW_SEGMENT_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((EDA_DrawLineStruct*)DrawItem)
if
(
STRUCT
->
m_Layer
==
LAYER_NOTES
)
break
;
if
(
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
||
(
STRUCT
->
m_Layer
==
LAYER_WIRE
)
)
{
item
=
new
DanglingEndHandle
((
STRUCT
->
m_Layer
==
LAYER_BUS
)
?
BUS_START_END
:
WIRE_START_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Start
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
item
=
new
DanglingEndHandle
((
STRUCT
->
m_Layer
==
LAYER_BUS
)
?
BUS_END_END
:
WIRE_END_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_End
;
lastitem
->
m_Pnext
=
item
;
lastitem
=
item
;
}
break
;
case
DRAW_JUNCTION_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((DrawJunctionStruct*)DrawItem)
item
=
new
DanglingEndHandle
(
JUNCTION_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
break
;
case
DRAW_BUSENTRY_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ((DrawBusEntryStruct*)DrawItem)
item
=
new
DanglingEndHandle
(
ENTRY_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
item
=
new
DanglingEndHandle
(
ENTRY_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_End
();
lastitem
->
m_Pnext
=
item
;
lastitem
=
item
;
break
;
case
DRAW_LIB_ITEM_STRUCT_TYPE
:
{
#undef STRUCT
#define STRUCT ((EDA_SchComponentStruct*)DrawItem)
EDA_LibComponentStruct
*
Entry
;
Entry
=
FindLibPart
(
STRUCT
->
m_ChipName
,
wxEmptyString
,
FIND_ROOT
);
if
(
Entry
==
NULL
)
break
;
LibEDA_BaseStruct
*
DrawLibItem
=
Entry
->
m_Drawings
;
for
(
;
DrawLibItem
!=
NULL
;
DrawLibItem
=
DrawLibItem
->
Next
())
{
if
(
DrawLibItem
->
m_StructType
!=
COMPONENT_PIN_DRAW_TYPE
)
continue
;
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawLibItem
;
if
(
Pin
->
m_Unit
&&
DrawLibItem
->
m_Unit
&&
(
DrawLibItem
->
m_Unit
!=
Pin
->
m_Unit
)
)
continue
;
if
(
Pin
->
m_Convert
&&
DrawLibItem
->
m_Convert
&&
(
DrawLibItem
->
m_Convert
!=
Pin
->
m_Convert
)
)
continue
;
item
=
new
DanglingEndHandle
(
PIN_END
);
item
->
m_Item
=
Pin
;
item
->
m_Pos
=
ReturnPinPhysicalPosition
(
Pin
,
STRUCT
);
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
}
break
;
}
case
DRAW_SHEET_STRUCT_TYPE
:
{
#undef STRUCT
#define STRUCT ((DrawSheetStruct*)DrawItem)
DrawSheetLabelStruct
*
pinsheet
=
STRUCT
->
m_Label
;
while
(
pinsheet
)
{
item
=
new
DanglingEndHandle
(
SHEET_LABEL_END
);
item
->
m_Item
=
pinsheet
;
item
->
m_Pos
=
pinsheet
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
pinsheet
=
(
DrawSheetLabelStruct
*
)
pinsheet
->
Pnext
;
}
break
;
}
}
}
return
StartList
;
DanglingEndHandle
*
StartList
=
NULL
,
*
item
,
*
lastitem
=
NULL
;
EDA_BaseStruct
*
DrawItem
;
for
(
DrawItem
=
DrawList
;
DrawItem
!=
NULL
;
DrawItem
=
DrawItem
->
Pnext
)
{
switch
(
DrawItem
->
m_StructType
)
{
case
DRAW_LABEL_STRUCT_TYPE
:
break
;
case
DRAW_GLOBAL_LABEL_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (DrawGlobalLabelStruct*) DrawItem )
item
=
new
DanglingEndHandle
(
LABEL_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
break
;
case
DRAW_SEGMENT_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (EDA_DrawLineStruct*) DrawItem )
if
(
STRUCT
->
m_Layer
==
LAYER_NOTES
)
break
;
if
(
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
||
(
STRUCT
->
m_Layer
==
LAYER_WIRE
)
)
{
item
=
new
DanglingEndHandle
(
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
?
BUS_START_END
:
WIRE_START_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Start
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
item
=
new
DanglingEndHandle
(
(
STRUCT
->
m_Layer
==
LAYER_BUS
)
?
BUS_END_END
:
WIRE_END_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_End
;
lastitem
->
m_Pnext
=
item
;
lastitem
=
item
;
}
break
;
case
DRAW_JUNCTION_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (DrawJunctionStruct*) DrawItem )
item
=
new
DanglingEndHandle
(
JUNCTION_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
break
;
case
DRAW_BUSENTRY_STRUCT_TYPE
:
#undef STRUCT
#define STRUCT ( (DrawBusEntryStruct*) DrawItem )
item
=
new
DanglingEndHandle
(
ENTRY_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
item
=
new
DanglingEndHandle
(
ENTRY_END
);
item
->
m_Item
=
DrawItem
;
item
->
m_Pos
=
STRUCT
->
m_End
();
lastitem
->
m_Pnext
=
item
;
lastitem
=
item
;
break
;
case
DRAW_LIB_ITEM_STRUCT_TYPE
:
{
#undef STRUCT
#define STRUCT ( (EDA_SchComponentStruct*) DrawItem )
EDA_LibComponentStruct
*
Entry
;
Entry
=
FindLibPart
(
STRUCT
->
m_ChipName
,
wxEmptyString
,
FIND_ROOT
);
if
(
Entry
==
NULL
)
break
;
LibEDA_BaseStruct
*
DrawLibItem
=
Entry
->
m_Drawings
;
for
(
;
DrawLibItem
!=
NULL
;
DrawLibItem
=
DrawLibItem
->
Next
()
)
{
if
(
DrawLibItem
->
m_StructType
!=
COMPONENT_PIN_DRAW_TYPE
)
continue
;
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawLibItem
;
if
(
Pin
->
m_Unit
&&
DrawLibItem
->
m_Unit
&&
(
DrawLibItem
->
m_Unit
!=
Pin
->
m_Unit
)
)
continue
;
if
(
Pin
->
m_Convert
&&
DrawLibItem
->
m_Convert
&&
(
DrawLibItem
->
m_Convert
!=
Pin
->
m_Convert
)
)
continue
;
item
=
new
DanglingEndHandle
(
PIN_END
);
item
->
m_Item
=
Pin
;
item
->
m_Pos
=
ReturnPinPhysicalPosition
(
Pin
,
STRUCT
);
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
}
break
;
}
case
DRAW_SHEET_STRUCT_TYPE
:
{
#undef STRUCT
#define STRUCT ( (DrawSheetStruct*) DrawItem )
DrawSheetLabelStruct
*
pinsheet
=
STRUCT
->
m_Label
;
while
(
pinsheet
)
{
item
=
new
DanglingEndHandle
(
SHEET_LABEL_END
);
item
->
m_Item
=
pinsheet
;
item
->
m_Pos
=
pinsheet
->
m_Pos
;
if
(
lastitem
)
lastitem
->
m_Pnext
=
item
;
else
StartList
=
item
;
lastitem
=
item
;
pinsheet
=
(
DrawSheetLabelStruct
*
)
pinsheet
->
Pnext
;
}
break
;
}
default
:
;
}
}
return
StartList
;
}
eeschema/eelibs_draw_components.cpp
View file @
f3c324d5
/****************************************/
/* Modules to handle component drawing. */
/****************************************/
/****************************************/
/* Modules to handle component drawing. */
/****************************************/
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -21,339 +21,375 @@
/* Fonctions locales */
/* Descr component <DUMMY> used when a component is not found in library,
to draw a dummy shape*/
* to draw a dummy shape*/
/*
This component is a 400 mils square with the text ??
DEF DUMMY U 0 40 Y Y 1 0 N
F0 "U" 0 -350 60 H V
F1 "DUMMY" 0 350 60 H V
DRAW
T 0 0 0 150 0 0 0 ??
S -200 200 200 -200 0 1 0
ENDDRAW
ENDDEF
*/
static
int
s_ItemSelectColor
=
BROWN
;
static
EDA_LibComponentStruct
*
DummyCmp
;
static
int
*
Buf_Poly_Drawings
,
Buf_Poly_Size
;
// Used fo polyline drawings
static
void
DrawLibPartAux
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_SchComponentStruct
*
Component
,
EDA_LibComponentStruct
*
Entry
,
const
wxPoint
&
Pos
,
int
TransMat
[
2
][
2
],
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
=
-
1
,
bool
DrawPinText
=
TRUE
);
*
This component is a 400 mils square with the text ??
*
DEF DUMMY U 0 40 Y Y 1 0 N
*
F0 "U" 0 -350 60 H V
*
F1 "DUMMY" 0 350 60 H V
*
DRAW
*
T 0 0 0 150 0 0 0 ??
*
S -200 200 200 -200 0 1 0
*
ENDDRAW
*
ENDDEF
*/
static
int
s_ItemSelectColor
=
BROWN
;
static
EDA_LibComponentStruct
*
DummyCmp
;
static
int
*
Buf_Poly_Drawings
,
Buf_Poly_Size
;
// Used fo polyline drawings
static
void
DrawLibPartAux
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_SchComponentStruct
*
Component
,
EDA_LibComponentStruct
*
Entry
,
const
wxPoint
&
Pos
,
int
TransMat
[
2
][
2
],
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
=
-
1
,
bool
DrawPinText
=
TRUE
);
/******************************/
static
void
CreateDummyCmp
(
void
)
static
void
CreateDummyCmp
(
void
)
/******************************/
{
DummyCmp
=
new
EDA_LibComponentStruct
(
NULL
);
DummyCmp
=
new
EDA_LibComponentStruct
(
NULL
);
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
Square
->
m_Pos
=
wxPoint
(
-
200
,
200
);
Square
->
m_End
=
wxPoint
(
200
,
-
200
);
Square
->
m_Width
=
4
;
Square
->
m_Pos
=
wxPoint
(
-
200
,
200
);
Square
->
m_End
=
wxPoint
(
200
,
-
200
);
Square
->
m_Width
=
4
;
LibDrawText
*
Text
=
new
LibDrawText
();
Text
->
m_Size
.
x
=
Text
->
m_Size
.
y
=
150
;
Text
->
m_Text
=
wxT
(
"??"
);
LibDrawText
*
Text
=
new
LibDrawText
();
DummyCmp
->
m_Drawings
=
Square
;
Square
->
Pnext
=
Text
;
Text
->
m_Size
.
x
=
Text
->
m_Size
.
y
=
150
;
Text
->
m_Text
=
wxT
(
"??"
);
DummyCmp
->
m_Drawings
=
Square
;
Square
->
Pnext
=
Text
;
}
/*************************************************************/
void
DrawLibEntry
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
int
posX
,
int
posY
,
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
)
void
DrawLibEntry
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
int
posX
,
int
posY
,
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
)
/**************************************************************/
/* Routine de dessin d'un composant d'une librairie
LibEntry = pointeur sur la description en librairie
posX, posY = position du composant
DrawMode = GrOR ..
Color = 0 : dessin en vraies couleurs, sinon couleur = Color
Une croix symbolise le point d'accrochage (ref position) du composant
Le composant est toujours trace avec orientation 0
*/
/* Routine de dessin d'un composant d'une librairie
* LibEntry = pointeur sur la description en librairie
* posX, posY = position du composant
* DrawMode = GrOR ..
* Color = 0 : dessin en vraies couleurs, sinon couleur = Color
*
* Une croix symbolise le point d'accrochage (ref position) du composant
*
* Le composant est toujours trace avec orientation 0
*/
{
int
color
;
int
TransMat
[
2
][
2
];
wxString
Prefix
;
LibDrawField
*
Field
;
wxPoint
text_pos
;
/* Orientation normale */
TransMat
[
0
][
0
]
=
1
;
TransMat
[
1
][
1
]
=
-
1
;
TransMat
[
1
][
0
]
=
TransMat
[
0
][
1
]
=
0
;
DrawLibPartAux
(
panel
,
DC
,
NULL
,
LibEntry
,
wxPoint
(
posX
,
posY
),
TransMat
,
Multi
,
convert
,
DrawMode
,
Color
);
/* Trace des 2 champs ref et value (Attention aux coord: la matrice
de transformation change de signe les coord Y */
GRSetDrawMode
(
DC
,
DrawMode
);
if
(
LibEntry
->
m_Prefix
.
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_REFERENCEPART
);
}
if
(
LibEntry
->
m_UnitCount
>
1
)
Prefix
.
Printf
(
wxT
(
"%s?%c"
),
LibEntry
->
m_Prefix
.
m_Text
.
GetData
(),
Multi
+
'A'
-
1
);
else
Prefix
=
LibEntry
->
m_Prefix
.
m_Text
+
wxT
(
"?"
);
text_pos
.
x
=
LibEntry
->
m_Prefix
.
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
LibEntry
->
m_Prefix
.
m_Pos
.
y
;
int
LineWidth
=
MAX
(
LibEntry
->
m_Prefix
.
m_Width
,
g_DrawMinimunLineWidth
);
if
(
(
LibEntry
->
m_Prefix
.
m_Flags
&
IS_MOVED
)
==
0
)
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
LibEntry
->
m_Prefix
.
m_Text
.
GetData
(),
LibEntry
->
m_Prefix
.
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
LibEntry
->
m_Prefix
.
m_Size
,
LibEntry
->
m_Prefix
.
m_HJustify
,
LibEntry
->
m_Prefix
.
m_VJustify
,
LineWidth
);
if
(
LibEntry
->
m_Name
.
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_VALUEPART
);
}
text_pos
.
x
=
LibEntry
->
m_Name
.
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
LibEntry
->
m_Name
.
m_Pos
.
y
;
LineWidth
=
MAX
(
LibEntry
->
m_Name
.
m_Width
,
g_DrawMinimunLineWidth
);
if
(
(
LibEntry
->
m_Name
.
m_Flags
&
IS_MOVED
)
==
0
)
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
LibEntry
->
m_Name
.
m_Text
.
GetData
(),
LibEntry
->
m_Name
.
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
LibEntry
->
m_Name
.
m_Size
,
LibEntry
->
m_Name
.
m_HJustify
,
LibEntry
->
m_Name
.
m_VJustify
,
LineWidth
);
for
(
Field
=
LibEntry
->
Fields
;
Field
!=
NULL
;
Field
=
(
LibDrawField
*
)
Field
->
Pnext
)
{
if
(
Field
->
m_Text
.
IsEmpty
()
)
return
;
if
(
(
Field
->
m_Flags
&
IS_MOVED
)
!=
0
)
continue
;
if
(
Field
->
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_FIELDS
);
}
text_pos
.
x
=
Field
->
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
Field
->
m_Pos
.
y
;
LineWidth
=
MAX
(
Field
->
m_Width
,
g_DrawMinimunLineWidth
);
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
Field
->
m_Text
,
Field
->
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
Field
->
m_HJustify
,
Field
->
m_VJustify
,
LineWidth
);
}
// Trac de l'ancre
int
len
=
3
*
panel
->
GetZoom
();
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
-
len
,
posX
,
posY
+
len
,
0
,
color
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
posX
-
len
,
posY
,
posX
+
len
,
posY
,
0
,
color
);
int
color
;
int
TransMat
[
2
][
2
];
wxString
Prefix
;
LibDrawField
*
Field
;
wxPoint
text_pos
;
/* Orientation normale */
TransMat
[
0
][
0
]
=
1
;
TransMat
[
1
][
1
]
=
-
1
;
TransMat
[
1
][
0
]
=
TransMat
[
0
][
1
]
=
0
;
DrawLibPartAux
(
panel
,
DC
,
NULL
,
LibEntry
,
wxPoint
(
posX
,
posY
),
TransMat
,
Multi
,
convert
,
DrawMode
,
Color
);
/* Trace des 2 champs ref et value (Attention aux coord: la matrice
* de transformation change de signe les coord Y */
GRSetDrawMode
(
DC
,
DrawMode
);
if
(
LibEntry
->
m_Prefix
.
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_REFERENCEPART
);
}
if
(
LibEntry
->
m_UnitCount
>
1
)
Prefix
.
Printf
(
wxT
(
"%s?%c"
),
LibEntry
->
m_Prefix
.
m_Text
.
GetData
(),
Multi
+
'A'
-
1
);
else
Prefix
=
LibEntry
->
m_Prefix
.
m_Text
+
wxT
(
"?"
);
text_pos
.
x
=
LibEntry
->
m_Prefix
.
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
LibEntry
->
m_Prefix
.
m_Pos
.
y
;
int
LineWidth
=
MAX
(
LibEntry
->
m_Prefix
.
m_Width
,
g_DrawMinimunLineWidth
);
if
(
(
LibEntry
->
m_Prefix
.
m_Flags
&
IS_MOVED
)
==
0
)
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
LibEntry
->
m_Prefix
.
m_Text
.
GetData
(),
LibEntry
->
m_Prefix
.
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
LibEntry
->
m_Prefix
.
m_Size
,
LibEntry
->
m_Prefix
.
m_HJustify
,
LibEntry
->
m_Prefix
.
m_VJustify
,
LineWidth
);
if
(
LibEntry
->
m_Name
.
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_VALUEPART
);
}
text_pos
.
x
=
LibEntry
->
m_Name
.
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
LibEntry
->
m_Name
.
m_Pos
.
y
;
LineWidth
=
MAX
(
LibEntry
->
m_Name
.
m_Width
,
g_DrawMinimunLineWidth
);
if
(
(
LibEntry
->
m_Name
.
m_Flags
&
IS_MOVED
)
==
0
)
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
LibEntry
->
m_Name
.
m_Text
.
GetData
(),
LibEntry
->
m_Name
.
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
LibEntry
->
m_Name
.
m_Size
,
LibEntry
->
m_Name
.
m_HJustify
,
LibEntry
->
m_Name
.
m_VJustify
,
LineWidth
);
for
(
Field
=
LibEntry
->
Fields
;
Field
!=
NULL
;
Field
=
(
LibDrawField
*
)
Field
->
Pnext
)
{
if
(
Field
->
m_Text
.
IsEmpty
()
)
return
;
if
(
(
Field
->
m_Flags
&
IS_MOVED
)
!=
0
)
continue
;
if
(
Field
->
m_Attributs
&
TEXT_NO_VISIBLE
)
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
UNVISIBLE_COLOR
;
}
else
{
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_FIELDS
);
}
text_pos
.
x
=
Field
->
m_Pos
.
x
+
posX
;
text_pos
.
y
=
posY
-
Field
->
m_Pos
.
y
;
LineWidth
=
MAX
(
Field
->
m_Width
,
g_DrawMinimunLineWidth
);
DrawGraphicText
(
panel
,
DC
,
text_pos
,
color
,
Field
->
m_Text
,
Field
->
m_Orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
Field
->
m_HJustify
,
Field
->
m_VJustify
,
LineWidth
);
}
// Trac de l'ancre
int
len
=
3
*
panel
->
GetZoom
();
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
-
len
,
posX
,
posY
+
len
,
0
,
color
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
posX
-
len
,
posY
,
posX
+
len
,
posY
,
0
,
color
);
}
/*****************************************************************************
* Routine to draw the given part at given position, transformed/mirror as *
* specified, and in the given drawing mode. Only this one is visible... *
*****************************************************************************/
void
EDA_SchComponentStruct
::
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
DrawMode
,
int
Color
)
void
EDA_SchComponentStruct
::
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
DrawMode
,
int
Color
)
{
EDA_LibComponentStruct
*
Entry
;
int
ii
;
bool
dummy
=
FALSE
;
if
(
(
Entry
=
FindLibPart
(
m_ChipName
.
GetData
(),
wxEmptyString
,
FIND_ROOT
))
==
NULL
)
{
/* composant non trouv, on affiche un composant "dummy" */
dummy
=
TRUE
;
if
(
DummyCmp
==
NULL
)
CreateDummyCmp
();
Entry
=
DummyCmp
;
}
DrawLibPartAux
(
panel
,
DC
,
this
,
Entry
,
m_Pos
+
offset
,
m_Transform
,
dummy
?
0
:
m_Multi
,
dummy
?
0
:
m_Convert
,
DrawMode
);
/* Trace des champs, avec placement et orientation selon orient. du
composant
*/
if
(
((
m_Field
[
REFERENCE
].
m_Attributs
&
TEXT_NO_VISIBLE
)
==
0
)
&&
!
(
m_Field
[
REFERENCE
].
m_Flags
&
IS_MOVED
)
)
{
if
(
Entry
->
m_UnitCount
>
1
)
DrawTextField
(
panel
,
DC
,
&
m_Field
[
REFERENCE
],
1
,
DrawMode
);
else
DrawTextField
(
panel
,
DC
,
&
m_Field
[
REFERENCE
],
0
,
DrawMode
);
}
for
(
ii
=
VALUE
;
ii
<
NUMBER_OF_FIELDS
;
ii
++
)
{
if
(
m_Field
[
ii
].
m_Flags
&
IS_MOVED
)
continue
;
DrawTextField
(
panel
,
DC
,
&
m_Field
[
ii
],
0
,
DrawMode
);
}
EDA_LibComponentStruct
*
Entry
;
int
ii
;
bool
dummy
=
FALSE
;
if
(
(
Entry
=
FindLibPart
(
m_ChipName
.
GetData
(),
wxEmptyString
,
FIND_ROOT
)
)
==
NULL
)
{
/* composant non trouv, on affiche un composant "dummy" */
dummy
=
TRUE
;
if
(
DummyCmp
==
NULL
)
CreateDummyCmp
();
Entry
=
DummyCmp
;
}
DrawLibPartAux
(
panel
,
DC
,
this
,
Entry
,
m_Pos
+
offset
,
m_Transform
,
dummy
?
0
:
m_Multi
,
dummy
?
0
:
m_Convert
,
DrawMode
);
/* Trace des champs, avec placement et orientation selon orient. du
* composant
*/
if
(
(
(
m_Field
[
REFERENCE
].
m_Attributs
&
TEXT_NO_VISIBLE
)
==
0
)
&&
!
(
m_Field
[
REFERENCE
].
m_Flags
&
IS_MOVED
)
)
{
if
(
Entry
->
m_UnitCount
>
1
)
DrawTextField
(
panel
,
DC
,
&
m_Field
[
REFERENCE
],
1
,
DrawMode
);
else
DrawTextField
(
panel
,
DC
,
&
m_Field
[
REFERENCE
],
0
,
DrawMode
);
}
for
(
ii
=
VALUE
;
ii
<
NUMBER_OF_FIELDS
;
ii
++
)
{
if
(
m_Field
[
ii
].
m_Flags
&
IS_MOVED
)
continue
;
DrawTextField
(
panel
,
DC
,
&
m_Field
[
ii
],
0
,
DrawMode
);
}
}
/***********************************************************/
void
DrawTextField
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
PartTextStruct
*
Field
,
int
IsMulti
,
int
DrawMode
)
void
DrawTextField
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
PartTextStruct
*
Field
,
int
IsMulti
,
int
DrawMode
)
/***********************************************************/
/* Routine de trace des textes type Field du composant.
entree:
IsMulti: flag Non Null si il y a plusieurs parts par boitier.
n'est utile que pour le champ reference pour ajouter a celui ci
l'identification de la part ( A, B ... )
DrawMode: mode de trace
*/
*
entree:
*
IsMulti: flag Non Null si il y a plusieurs parts par boitier.
*
n'est utile que pour le champ reference pour ajouter a celui ci
*
l'identification de la part ( A, B ... )
*
DrawMode: mode de trace
*/
{
int
orient
,
color
;
wxPoint
pos
;
/* Position des textes */
EDA_SchComponentStruct
*
DrawLibItem
=
(
EDA_SchComponentStruct
*
)
Field
->
m_Parent
;
int
hjustify
,
vjustify
;
int
LineWidth
=
MAX
(
Field
->
m_Width
,
g_DrawMinimunLineWidth
);
if
(
Field
->
m_Attributs
&
TEXT_NO_VISIBLE
)
return
;
if
(
Field
->
IsVoid
()
)
return
;
GRSetDrawMode
(
DC
,
DrawMode
);
/* Calcul de la position des textes, selon orientation du composant */
orient
=
Field
->
m_Orient
;
hjustify
=
Field
->
m_HJustify
;
vjustify
=
Field
->
m_VJustify
;
pos
.
x
=
Field
->
m_Pos
.
x
-
DrawLibItem
->
m_Pos
.
x
;
pos
.
y
=
Field
->
m_Pos
.
y
-
DrawLibItem
->
m_Pos
.
y
;
pos
=
DrawLibItem
->
GetScreenCoord
(
pos
);
pos
.
x
+=
DrawLibItem
->
m_Pos
.
x
;
pos
.
y
+=
DrawLibItem
->
m_Pos
.
y
;
/* Y a t-il rotation (pour l'orientation, la justification)*/
if
(
DrawLibItem
->
m_Transform
[
0
][
1
])
// Rotation du composant de 90deg
{
if
(
orient
==
TEXT_ORIENT_HORIZ
)
orient
=
TEXT_ORIENT_VERT
;
else
orient
=
TEXT_ORIENT_HORIZ
;
/* Y a t-il rotation, miroir (pour les justifications)*/
EXCHG
(
hjustify
,
vjustify
);
if
(
DrawLibItem
->
m_Transform
[
1
][
0
]
<
0
)
vjustify
=
-
vjustify
;
if
(
DrawLibItem
->
m_Transform
[
1
][
0
]
>
0
)
hjustify
=
-
hjustify
;
}
else
{
/* Texte horizontal: Y a t-il miroir (pour les justifications)*/
if
(
DrawLibItem
->
m_Transform
[
0
][
0
]
<
0
)
hjustify
=
-
hjustify
;
if
(
DrawLibItem
->
m_Transform
[
1
][
1
]
>
0
)
vjustify
=
-
vjustify
;
}
if
(
Field
->
m_FieldId
==
REFERENCE
)
color
=
ReturnLayerColor
(
LAYER_REFERENCEPART
);
else
if
(
Field
->
m_FieldId
==
VALUE
)
color
=
ReturnLayerColor
(
LAYER_VALUEPART
);
else
color
=
ReturnLayerColor
(
LAYER_FIELDS
);
if
(
!
IsMulti
||
(
Field
->
m_FieldId
!=
REFERENCE
)
)
{
DrawGraphicText
(
panel
,
DC
,
pos
,
color
,
Field
->
m_Text
.
GetData
(),
orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
hjustify
,
vjustify
,
LineWidth
);
}
else
/* Le champ est la reference, et il y a plusieurs parts par boitier */
{
/* On ajoute alors A ou B ... a la reference */
wxString
fulltext
=
Field
->
m_Text
;
fulltext
.
Append
(
'A'
-
1
+
DrawLibItem
->
m_Multi
);
DrawGraphicText
(
panel
,
DC
,
pos
,
color
,
fulltext
.
GetData
(),
orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
hjustify
,
vjustify
,
LineWidth
);
}
int
orient
,
color
;
wxPoint
pos
;
/* Position des textes */
EDA_SchComponentStruct
*
DrawLibItem
=
(
EDA_SchComponentStruct
*
)
Field
->
m_Parent
;
int
hjustify
,
vjustify
;
int
LineWidth
=
MAX
(
Field
->
m_Width
,
g_DrawMinimunLineWidth
);
if
(
Field
->
m_Attributs
&
TEXT_NO_VISIBLE
)
return
;
if
(
Field
->
IsVoid
()
)
return
;
GRSetDrawMode
(
DC
,
DrawMode
);
/* Calcul de la position des textes, selon orientation du composant */
orient
=
Field
->
m_Orient
;
hjustify
=
Field
->
m_HJustify
;
vjustify
=
Field
->
m_VJustify
;
pos
.
x
=
Field
->
m_Pos
.
x
-
DrawLibItem
->
m_Pos
.
x
;
pos
.
y
=
Field
->
m_Pos
.
y
-
DrawLibItem
->
m_Pos
.
y
;
pos
=
DrawLibItem
->
GetScreenCoord
(
pos
);
pos
.
x
+=
DrawLibItem
->
m_Pos
.
x
;
pos
.
y
+=
DrawLibItem
->
m_Pos
.
y
;
/* Y a t-il rotation (pour l'orientation, la justification)*/
if
(
DrawLibItem
->
m_Transform
[
0
][
1
]
)
// Rotation du composant de 90deg
{
if
(
orient
==
TEXT_ORIENT_HORIZ
)
orient
=
TEXT_ORIENT_VERT
;
else
orient
=
TEXT_ORIENT_HORIZ
;
/* Y a t-il rotation, miroir (pour les justifications)*/
EXCHG
(
hjustify
,
vjustify
);
if
(
DrawLibItem
->
m_Transform
[
1
][
0
]
<
0
)
vjustify
=
-
vjustify
;
if
(
DrawLibItem
->
m_Transform
[
1
][
0
]
>
0
)
hjustify
=
-
hjustify
;
}
else
{
/* Texte horizontal: Y a t-il miroir (pour les justifications)*/
if
(
DrawLibItem
->
m_Transform
[
0
][
0
]
<
0
)
hjustify
=
-
hjustify
;
if
(
DrawLibItem
->
m_Transform
[
1
][
1
]
>
0
)
vjustify
=
-
vjustify
;
}
if
(
Field
->
m_FieldId
==
REFERENCE
)
color
=
ReturnLayerColor
(
LAYER_REFERENCEPART
);
else
if
(
Field
->
m_FieldId
==
VALUE
)
color
=
ReturnLayerColor
(
LAYER_VALUEPART
);
else
color
=
ReturnLayerColor
(
LAYER_FIELDS
);
if
(
!
IsMulti
||
(
Field
->
m_FieldId
!=
REFERENCE
)
)
{
DrawGraphicText
(
panel
,
DC
,
pos
,
color
,
Field
->
m_Text
.
GetData
(),
orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
hjustify
,
vjustify
,
LineWidth
);
}
else
/* Le champ est la reference, et il y a plusieurs parts par boitier */
{
/* On ajoute alors A ou B ... a la reference */
wxString
fulltext
=
Field
->
m_Text
;
fulltext
.
Append
(
'A'
-
1
+
DrawLibItem
->
m_Multi
);
DrawGraphicText
(
panel
,
DC
,
pos
,
color
,
fulltext
.
GetData
(),
orient
?
TEXT_ORIENT_VERT
:
TEXT_ORIENT_HORIZ
,
Field
->
m_Size
,
hjustify
,
vjustify
,
LineWidth
);
}
}
/********************************************************************************/
EDA_LibComponentStruct
*
FindLibPart
(
const
wxChar
*
Name
,
const
wxString
&
LibName
,
int
Alias
)
EDA_LibComponentStruct
*
FindLibPart
(
const
wxChar
*
Name
,
const
wxString
&
LibName
,
int
Alias
)
/********************************************************************************/
/*
Routine to find a part in one of the libraries given its name.
Name = Name of part.
LibName = Name of Lib; if "": seach in all libs
Alias = Flag: si flag != 0, retourne un pointeur sur une part ou un alias
si flag = 0, retourne un pointeur sur une part meme si le nom
correspond a un alias
Alias = FIND_ROOT, ou Alias = FIND_ALIAS
*/
*
Routine to find a part in one of the libraries given its name.
*
Name = Name of part.
*
LibName = Name of Lib; if "": seach in all libs
*
Alias = Flag: si flag != 0, retourne un pointeur sur une part ou un alias
*
si flag = 0, retourne un pointeur sur une part meme si le nom
*
correspond a un alias
*
Alias = FIND_ROOT, ou Alias = FIND_ALIAS
*/
{
EDA_LibComponentStruct
*
Entry
;
static
EDA_LibComponentStruct
DummyEntry
(
wxEmptyString
);
/* Used only to call PQFind. */
LibraryStruct
*
Lib
=
g_LibraryList
;
DummyEntry
.
m_Drawings
=
NULL
;
/* Used only to call PQFind. */
DummyEntry
.
m_Name
.
m_Text
=
Name
;
PQCompFunc
((
PQCompFuncType
)
LibraryEntryCompare
);
Entry
=
NULL
;
FindLibName
.
Empty
();
while
(
Lib
)
{
if
(
!
LibName
.
IsEmpty
()
)
{
if
(
Lib
->
m_Name
!=
LibName
)
{
Lib
=
Lib
->
m_Pnext
;
continue
;
}
}
if
(
Lib
==
NULL
)
break
;
Entry
=
(
EDA_LibComponentStruct
*
)
PQFind
(
Lib
->
m_Entries
,
&
DummyEntry
);
if
(
Entry
!=
NULL
)
{
FindLibName
=
Lib
->
m_Name
;
break
;
}
Lib
=
Lib
->
m_Pnext
;
}
/* Si le nom est un alias, recherche du vrai composant */
if
(
Entry
)
{
if
(
(
Entry
->
Type
!=
ROOT
)
&&
(
Alias
==
FIND_ROOT
)
)
Entry
=
FindLibPart
(
((
EDA_LibCmpAliasStruct
*
)
Entry
)
->
m_RootName
.
GetData
()
,
Lib
->
m_Name
,
FIND_ROOT
);
}
return
(
Entry
);
EDA_LibComponentStruct
*
Entry
;
static
EDA_LibComponentStruct
DummyEntry
(
wxEmptyString
);
/* Used only to call PQFind. */
LibraryStruct
*
Lib
=
g_LibraryList
;
DummyEntry
.
m_Drawings
=
NULL
;
/* Used only to call PQFind. */
DummyEntry
.
m_Name
.
m_Text
=
Name
;
PQCompFunc
(
(
PQCompFuncType
)
LibraryEntryCompare
);
Entry
=
NULL
;
FindLibName
.
Empty
();
while
(
Lib
)
{
if
(
!
LibName
.
IsEmpty
()
)
{
if
(
Lib
->
m_Name
!=
LibName
)
{
Lib
=
Lib
->
m_Pnext
;
continue
;
}
}
if
(
Lib
==
NULL
)
break
;
Entry
=
(
EDA_LibComponentStruct
*
)
PQFind
(
Lib
->
m_Entries
,
&
DummyEntry
);
if
(
Entry
!=
NULL
)
{
FindLibName
=
Lib
->
m_Name
;
break
;
}
Lib
=
Lib
->
m_Pnext
;
}
/* Si le nom est un alias, recherche du vrai composant */
if
(
Entry
)
{
if
(
(
Entry
->
Type
!=
ROOT
)
&&
(
Alias
==
FIND_ROOT
)
)
Entry
=
FindLibPart
(
(
(
EDA_LibCmpAliasStruct
*
)
Entry
)
->
m_RootName
.
GetData
(),
Lib
->
m_Name
,
FIND_ROOT
);
}
return
Entry
;
}
/*****************************************************************************
* Routine to draw the given part at given position, transformed/mirror as
* specified, and in the given drawing mode.
...
...
@@ -361,375 +397,417 @@ LibraryStruct *Lib = g_LibraryList;
* else draw in color = Color
*****************************************************************************/
/* DrawMode = GrXOR, GrOR ..*/
void
DrawLibPartAux
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_SchComponentStruct
*
Component
,
EDA_LibComponentStruct
*
Entry
,
const
wxPoint
&
Pos
,
int
TransMat
[
2
][
2
],
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
,
bool
DrawPinText
)
void
DrawLibPartAux
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_SchComponentStruct
*
Component
,
EDA_LibComponentStruct
*
Entry
,
const
wxPoint
&
Pos
,
int
TransMat
[
2
][
2
],
int
Multi
,
int
convert
,
int
DrawMode
,
int
Color
,
bool
DrawPinText
)
{
int
i
,
x1
,
y1
,
x2
,
y2
,
t1
,
t2
,
orient
;
LibEDA_BaseStruct
*
DEntry
=
NULL
;
int
CharColor
;
int
fill_option
;
int
SetHightColor
;
int
LineWidth
;
int
i
,
x1
,
y1
,
x2
,
y2
,
t1
,
t2
,
orient
;
LibEDA_BaseStruct
*
DEntry
=
NULL
;
int
CharColor
;
int
fill_option
;
int
SetHightColor
;
int
LineWidth
;
//#define GETCOLOR(l) Color < 0 ? (ReturnLayerColor(l)| SetHightColor) : Color;
#define GETCOLOR(l) Color < 0 ? SetHightColor ? s_ItemSelectColor : (ReturnLayerColor(l)| SetHightColor) : Color;
if
(
Entry
->
m_Drawings
==
NULL
)
return
;
GRSetDrawMode
(
DC
,
DrawMode
);
for
(
DEntry
=
Entry
->
m_Drawings
;
DEntry
!=
NULL
;
DEntry
=
DEntry
->
Next
())
{
/* Elimination des elements non relatifs a l'unite */
if
(
Multi
&&
DEntry
->
m_Unit
&&
(
DEntry
->
m_Unit
!=
Multi
)
)
continue
;
if
(
convert
&&
DEntry
->
m_Convert
&&
(
DEntry
->
m_Convert
!=
convert
)
)
continue
;
if
(
DEntry
->
m_Flags
&
IS_MOVED
)
continue
;
// Element en deplacement non trace
SetHightColor
=
(
DEntry
->
m_Selected
&
IS_SELECTED
)
?
HIGHT_LIGHT_FLAG
:
0
;
LineWidth
=
MAX
(
DEntry
->
m_Width
,
g_DrawMinimunLineWidth
);
switch
(
DEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
xc
,
yc
,
x2
,
y2
;
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
xc
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_Pos
.
y
;
yc
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_Pos
.
y
;
x2
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_ArcStart
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_ArcStart
.
y
;;
y2
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_ArcStart
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_ArcStart
.
y
;
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_ArcEnd
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_ArcEnd
.
y
;;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_ArcEnd
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_ArcEnd
.
y
;
t1
=
Arc
->
t1
;
t2
=
Arc
->
t2
;
bool
swap
=
MapAngles
(
&
t1
,
&
t2
,
TransMat
);
if
(
swap
)
{
EXCHG
(
x1
,
x2
);
EXCHG
(
y1
,
y2
)
}
fill_option
=
Arc
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
// Normal Color Layer
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
Arc
->
m_Width
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
,
CharColor
);
#define GETCOLOR( l ) Color < 0 ? SetHightColor ?\
s_ItemSelectColor : (ReturnLayerColor( l ) | SetHightColor) : Color;
if
(
Entry
->
m_Drawings
==
NULL
)
return
;
GRSetDrawMode
(
DC
,
DrawMode
);
for
(
DEntry
=
Entry
->
m_Drawings
;
DEntry
!=
NULL
;
DEntry
=
DEntry
->
Next
()
)
{
/* Elimination des elements non relatifs a l'unite */
if
(
Multi
&&
DEntry
->
m_Unit
&&
(
DEntry
->
m_Unit
!=
Multi
)
)
continue
;
if
(
convert
&&
DEntry
->
m_Convert
&&
(
DEntry
->
m_Convert
!=
convert
)
)
continue
;
if
(
DEntry
->
m_Flags
&
IS_MOVED
)
continue
;
// Element en deplacement non trace
SetHightColor
=
(
DEntry
->
m_Selected
&
IS_SELECTED
)
?
HIGHT_LIGHT_FLAG
:
0
;
LineWidth
=
MAX
(
DEntry
->
m_Width
,
g_DrawMinimunLineWidth
);
switch
(
DEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
xc
,
yc
,
x2
,
y2
;
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
xc
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_Pos
.
y
;
yc
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_Pos
.
y
;
x2
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_ArcStart
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_ArcStart
.
y
;;
y2
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_ArcStart
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_ArcStart
.
y
;
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Arc
->
m_ArcEnd
.
x
+
TransMat
[
0
][
1
]
*
Arc
->
m_ArcEnd
.
y
;;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Arc
->
m_ArcEnd
.
x
+
TransMat
[
1
][
1
]
*
Arc
->
m_ArcEnd
.
y
;
t1
=
Arc
->
t1
;
t2
=
Arc
->
t2
;
bool
swap
=
MapAngles
(
&
t1
,
&
t2
,
TransMat
);
if
(
swap
)
{
EXCHG
(
x1
,
x2
);
EXCHG
(
y1
,
y2
)
}
fill_option
=
Arc
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
// Normal Color Layer
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
Arc
->
m_Width
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
,
CharColor
);
#ifdef DRAW_ARC_WITH_ANGLE
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
LineWidth
,
CharColor
);
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
LineWidth
,
CharColor
);
#else
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
LineWidth
,
CharColor
);
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
LineWidth
,
CharColor
);
#endif
}
}
#ifdef DRAW_ARC_WITH_ANGLE
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
Circle
->
m_Width
,
CharColor
);
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
Circle
->
m_Width
,
CharColor
);
#else
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
Arc
->
m_Width
,
CharColor
);
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
Arc
->
m_Width
,
CharColor
);
#endif
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Circle
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Circle
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Circle
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Circle
->
m_Pos
.
y
;
fill_option
=
Circle
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
0
,
CharColor
,
CharColor
);
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
(
LibDrawText
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
/* The text orientation may need to be flipped if the
transformation matrix cuases xy axes to be flipped. */
t1
=
(
TransMat
[
0
][
0
]
!=
0
)
^
(
Text
->
m_Horiz
!=
0
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Text
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Text
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Text
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Text
->
m_Pos
.
y
;
DrawGraphicText
(
panel
,
DC
,
wxPoint
(
x1
,
y1
),
CharColor
,
Text
->
m_Text
,
t1
?
TEXT_ORIENT_HORIZ
:
TEXT_ORIENT_VERT
,
Text
->
m_Size
,
GR_TEXT_HJUSTIFY_CENTER
,
GR_TEXT_VJUSTIFY_CENTER
,
LineWidth
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Square
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Square
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Square
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Square
->
m_Pos
.
y
;
x2
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Square
->
m_End
.
x
+
TransMat
[
0
][
1
]
*
Square
->
m_End
.
y
;
y2
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Square
->
m_End
.
x
+
TransMat
[
1
][
1
]
*
Square
->
m_End
.
y
;
fill_option
=
Square
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
LineWidth
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
CharColor
);
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
/* Trace des Pins */
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DEntry
;
if
(
Pin
->
m_Attributs
&
PINNOTDRAW
)
{
if
(
(
ActiveScreen
->
m_Type
==
SCHEMATIC_FRAME
)
&&
!
g_ShowAllPins
)
break
;
}
/* Calcul de l'orientation reelle de la Pin */
orient
=
Pin
->
ReturnPinDrawOrient
(
TransMat
);
/* Calcul de la position du point de reference */
x2
=
Pos
.
x
+
(
TransMat
[
0
][
0
]
*
Pin
->
m_Pos
.
x
)
+
(
TransMat
[
0
][
1
]
*
Pin
->
m_Pos
.
y
);
y2
=
Pos
.
y
+
(
TransMat
[
1
][
0
]
*
Pin
->
m_Pos
.
x
)
+
(
TransMat
[
1
][
1
]
*
Pin
->
m_Pos
.
y
);
/* Dessin de la pin et du symbole special associe */
CharColor
=
GETCOLOR
(
LAYER_PIN
);
Pin
->
DrawPinSymbol
(
panel
,
DC
,
wxPoint
(
x2
,
y2
)
,
orient
,
DrawMode
,
CharColor
);
if
(
DrawPinText
)
{
wxPoint
pinpos
(
x2
,
y2
);
CharColor
=
SetHightColor
?
s_ItemSelectColor
:
Color
;
Pin
->
DrawPinTexts
(
panel
,
DC
,
pinpos
,
orient
,
Entry
->
m_TextInside
,
Entry
->
m_DrawPinNum
,
Entry
->
m_DrawPinName
,
CharColor
,
DrawMode
);
}
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
if
(
Buf_Poly_Drawings
==
NULL
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
MyMalloc
(
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
else
if
(
Buf_Poly_Size
<
polyline
->
n
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
realloc
(
Buf_Poly_Drawings
,
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
for
(
i
=
0
;
i
<
polyline
->
n
;
i
++
)
{
Buf_Poly_Drawings
[
i
*
2
]
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
polyline
->
PolyList
[
i
*
2
]
+
TransMat
[
0
][
1
]
*
polyline
->
PolyList
[
i
*
2
+
1
];
Buf_Poly_Drawings
[
i
*
2
+
1
]
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
polyline
->
PolyList
[
i
*
2
]
+
TransMat
[
1
][
1
]
*
polyline
->
PolyList
[
i
*
2
+
1
];
}
fill_option
=
polyline
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
CharColor
);
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
}
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
}
break
;
default
:
wxBell
();
break
;
}
/* Fin Switch */
}
/* Fin Boucle de dessin */
if
(
g_DebugLevel
>
4
)
/* Draw the component boundary box */
{
EDA_Rect
BoundaryBox
;
if
(
Component
)
BoundaryBox
=
Component
->
GetBoundaryBox
();
else
BoundaryBox
=
Entry
->
GetBoundaryBox
(
Multi
,
convert
);
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
BoundaryBox
=
Component
->
m_Field
[
REFERENCE
].
GetBoundaryBox
();
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
BoundaryBox
=
Component
->
m_Field
[
VALUE
].
GetBoundaryBox
();
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
}
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Circle
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Circle
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Circle
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Circle
->
m_Pos
.
y
;
fill_option
=
Circle
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
0
,
CharColor
,
CharColor
);
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
(
LibDrawText
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
/* The text orientation may need to be flipped if the
* transformation matrix cuases xy axes to be flipped. */
t1
=
(
TransMat
[
0
][
0
]
!=
0
)
^
(
Text
->
m_Horiz
!=
0
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Text
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Text
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Text
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Text
->
m_Pos
.
y
;
DrawGraphicText
(
panel
,
DC
,
wxPoint
(
x1
,
y1
),
CharColor
,
Text
->
m_Text
,
t1
?
TEXT_ORIENT_HORIZ
:
TEXT_ORIENT_VERT
,
Text
->
m_Size
,
GR_TEXT_HJUSTIFY_CENTER
,
GR_TEXT_VJUSTIFY_CENTER
,
LineWidth
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
x1
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Square
->
m_Pos
.
x
+
TransMat
[
0
][
1
]
*
Square
->
m_Pos
.
y
;
y1
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Square
->
m_Pos
.
x
+
TransMat
[
1
][
1
]
*
Square
->
m_Pos
.
y
;
x2
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
Square
->
m_End
.
x
+
TransMat
[
0
][
1
]
*
Square
->
m_End
.
y
;
y2
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
Square
->
m_End
.
x
+
TransMat
[
1
][
1
]
*
Square
->
m_End
.
y
;
fill_option
=
Square
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
LineWidth
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
CharColor
);
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
/* Trace des Pins */
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DEntry
;
if
(
Pin
->
m_Attributs
&
PINNOTDRAW
)
{
if
(
(
ActiveScreen
->
m_Type
==
SCHEMATIC_FRAME
)
&&
!
g_ShowAllPins
)
break
;
}
/* Calcul de l'orientation reelle de la Pin */
orient
=
Pin
->
ReturnPinDrawOrient
(
TransMat
);
/* Calcul de la position du point de reference */
x2
=
Pos
.
x
+
(
TransMat
[
0
][
0
]
*
Pin
->
m_Pos
.
x
)
+
(
TransMat
[
0
][
1
]
*
Pin
->
m_Pos
.
y
);
y2
=
Pos
.
y
+
(
TransMat
[
1
][
0
]
*
Pin
->
m_Pos
.
x
)
+
(
TransMat
[
1
][
1
]
*
Pin
->
m_Pos
.
y
);
/* Dessin de la pin et du symbole special associe */
CharColor
=
GETCOLOR
(
LAYER_PIN
);
Pin
->
DrawPinSymbol
(
panel
,
DC
,
wxPoint
(
x2
,
y2
),
orient
,
DrawMode
,
CharColor
);
if
(
DrawPinText
)
{
wxPoint
pinpos
(
x2
,
y2
);
CharColor
=
SetHightColor
?
s_ItemSelectColor
:
Color
;
Pin
->
DrawPinTexts
(
panel
,
DC
,
pinpos
,
orient
,
Entry
->
m_TextInside
,
Entry
->
m_DrawPinNum
,
Entry
->
m_DrawPinName
,
CharColor
,
DrawMode
);
}
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DEntry
;
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
if
(
Buf_Poly_Drawings
==
NULL
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
MyMalloc
(
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
else
if
(
Buf_Poly_Size
<
polyline
->
n
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
realloc
(
Buf_Poly_Drawings
,
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
for
(
i
=
0
;
i
<
polyline
->
n
;
i
++
)
{
Buf_Poly_Drawings
[
i
*
2
]
=
Pos
.
x
+
TransMat
[
0
][
0
]
*
polyline
->
PolyList
[
i
*
2
]
+
TransMat
[
0
][
1
]
*
polyline
->
PolyList
[
i
*
2
+
1
];
Buf_Poly_Drawings
[
i
*
2
+
1
]
=
Pos
.
y
+
TransMat
[
1
][
0
]
*
polyline
->
PolyList
[
i
*
2
]
+
TransMat
[
1
][
1
]
*
polyline
->
PolyList
[
i
*
2
+
1
];
}
fill_option
=
polyline
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
Color
<
0
)
{
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
CharColor
);
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
}
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
}
break
;
default
:
wxBell
();
break
;
}
/* Fin Switch */
}
/* Fin Boucle de dessin */
if
(
g_DebugLevel
>
4
)
/* Draw the component boundary box */
{
EDA_Rect
BoundaryBox
;
if
(
Component
)
BoundaryBox
=
Component
->
GetBoundaryBox
();
else
BoundaryBox
=
Entry
->
GetBoundaryBox
(
Multi
,
convert
);
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
BoundaryBox
=
Component
->
m_Field
[
REFERENCE
].
GetBoundaryBox
();
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
BoundaryBox
=
Component
->
m_Field
[
VALUE
].
GetBoundaryBox
();
x1
=
BoundaryBox
.
GetX
();
y1
=
BoundaryBox
.
GetY
();
x2
=
BoundaryBox
.
GetRight
();
y2
=
BoundaryBox
.
GetBottom
();
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
BROWN
);
}
}
/********************************************************************************/
void
LibDrawPin
::
DrawPinSymbol
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
pin_pos
,
int
orient
,
int
DrawMode
,
int
Color
)
void
LibDrawPin
::
DrawPinSymbol
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
pin_pos
,
int
orient
,
int
DrawMode
,
int
Color
)
/*******************************************************************************/
/* Draw the pin symbol (without texts)
if Color != 0 draw with Color, eles with the normal pin color
*/
*
if Color != 0 draw with Color, eles with the normal pin color
*/
{
int
MapX1
,
MapY1
,
x1
,
y1
;
int
color
;
int
width
=
MAX
(
m_Width
,
g_DrawMinimunLineWidth
);
int
posX
=
pin_pos
.
x
,
posY
=
pin_pos
.
y
,
len
=
m_PinLen
;
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_PIN
);
GRSetDrawMode
(
DC
,
DrawMode
);
MapX1
=
MapY1
=
0
;
x1
=
posX
;
y1
=
posY
;
switch
(
orient
)
{
case
PIN_UP
:
y1
=
posY
-
len
;
MapY1
=
1
;
break
;
case
PIN_DOWN
:
y1
=
posY
+
len
;
MapY1
=
-
1
;
break
;
case
PIN_LEFT
:
x1
=
posX
-
len
,
MapX1
=
1
;
break
;
case
PIN_RIGHT
:
x1
=
posX
+
len
;
MapX1
=
-
1
;
break
;
}
if
(
m_PinShape
&
INVERT
)
{
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
MapX1
*
INVERT_PIN_RADIUS
+
x1
,
MapY1
*
INVERT_PIN_RADIUS
+
y1
,
INVERT_PIN_RADIUS
,
width
,
color
);
GRMoveTo
(
MapX1
*
INVERT_PIN_RADIUS
*
2
+
x1
,
MapY1
*
INVERT_PIN_RADIUS
*
2
+
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
width
,
color
);
}
else
{
GRMoveTo
(
x1
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
width
,
color
);
}
if
(
m_PinShape
&
CLOCK
)
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
,
y1
+
CLOCK_PIN_DIM
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
MapX1
*
CLOCK_PIN_DIM
,
y1
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
-
CLOCK_PIN_DIM
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
+
CLOCK_PIN_DIM
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
-
MapY1
*
CLOCK_PIN_DIM
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
CLOCK_PIN_DIM
,
y1
,
width
,
color
);
}
}
if
(
m_PinShape
&
LOWLEVEL_IN
)
/* IEEE symbol "Active Low Input" */
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
-
IEEE_SYMBOL_PIN_DIM
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
IEEE_SYMBOL_PIN_DIM
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
width
,
color
);
}
}
if
(
m_PinShape
&
LOWLEVEL_OUT
)
/* IEEE symbol "Active Low Output" */
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
,
y1
-
IEEE_SYMBOL_PIN_DIM
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
-
IEEE_SYMBOL_PIN_DIM
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
width
,
color
);
}
}
/* Draw the pin end target (active end of the pin) */
if
(
!
g_IsPrinting
)
// Draw but do not print the pin end target 1 pixel width */
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
TARGET_PIN_DIAM
,
0
,
color
);
int
MapX1
,
MapY1
,
x1
,
y1
;
int
color
;
int
width
=
MAX
(
m_Width
,
g_DrawMinimunLineWidth
);
int
posX
=
pin_pos
.
x
,
posY
=
pin_pos
.
y
,
len
=
m_PinLen
;
if
(
Color
>=
0
)
color
=
Color
;
else
color
=
ReturnLayerColor
(
LAYER_PIN
);
GRSetDrawMode
(
DC
,
DrawMode
);
MapX1
=
MapY1
=
0
;
x1
=
posX
;
y1
=
posY
;
switch
(
orient
)
{
case
PIN_UP
:
y1
=
posY
-
len
;
MapY1
=
1
;
break
;
case
PIN_DOWN
:
y1
=
posY
+
len
;
MapY1
=
-
1
;
break
;
case
PIN_LEFT
:
x1
=
posX
-
len
,
MapX1
=
1
;
break
;
case
PIN_RIGHT
:
x1
=
posX
+
len
;
MapX1
=
-
1
;
break
;
}
if
(
m_PinShape
&
INVERT
)
{
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
MapX1
*
INVERT_PIN_RADIUS
+
x1
,
MapY1
*
INVERT_PIN_RADIUS
+
y1
,
INVERT_PIN_RADIUS
,
width
,
color
);
GRMoveTo
(
MapX1
*
INVERT_PIN_RADIUS
*
2
+
x1
,
MapY1
*
INVERT_PIN_RADIUS
*
2
+
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
width
,
color
);
}
else
{
GRMoveTo
(
x1
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
width
,
color
);
}
if
(
m_PinShape
&
CLOCK
)
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
,
y1
+
CLOCK_PIN_DIM
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
MapX1
*
CLOCK_PIN_DIM
,
y1
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
-
CLOCK_PIN_DIM
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
+
CLOCK_PIN_DIM
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
-
MapY1
*
CLOCK_PIN_DIM
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
CLOCK_PIN_DIM
,
y1
,
width
,
color
);
}
}
if
(
m_PinShape
&
LOWLEVEL_IN
)
/* IEEE symbol "Active Low Input" */
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
-
IEEE_SYMBOL_PIN_DIM
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
-
IEEE_SYMBOL_PIN_DIM
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
width
,
color
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
width
,
color
);
}
}
if
(
m_PinShape
&
LOWLEVEL_OUT
)
/* IEEE symbol "Active Low Output" */
{
if
(
MapY1
==
0
)
/* MapX1 = +- 1 */
{
GRMoveTo
(
x1
,
y1
-
IEEE_SYMBOL_PIN_DIM
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
+
MapX1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
y1
,
width
,
color
);
}
else
/* MapX1 = 0 */
{
GRMoveTo
(
x1
-
IEEE_SYMBOL_PIN_DIM
,
y1
);
GRLineTo
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
+
MapY1
*
IEEE_SYMBOL_PIN_DIM
*
2
,
width
,
color
);
}
}
/* Draw the pin end target (active end of the pin) */
if
(
!
g_IsPrinting
)
// Draw but do not print the pin end target 1 pixel width */
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
posX
,
posY
,
TARGET_PIN_DIAM
,
0
,
color
);
}
...
...
@@ -744,56 +822,58 @@ int posX = pin_pos.x, posY = pin_pos.y, len = m_PinLen;
* transform (only mirror and rotate so it remains on the unit circle) to *
* a new point which is used to detect new angle. *
*****************************************************************************/
bool
MapAngles
(
int
*
Angle1
,
int
*
Angle2
,
int
TransMat
[
2
][
2
]
)
bool
MapAngles
(
int
*
Angle1
,
int
*
Angle2
,
int
TransMat
[
2
][
2
]
)
{
int
Angle
,
Delta
;
double
x
,
y
,
t
;
bool
swap
=
FALSE
;
Delta
=
*
Angle2
-
*
Angle1
;
if
(
Delta
>=
1800
)
{
*
Angle1
-=
1
;
*
Angle2
+=
1
;
}
x
=
cos
(
*
Angle1
*
M_PI
/
1800.0
);
y
=
sin
(
*
Angle1
*
M_PI
/
1800.0
);
t
=
x
*
TransMat
[
0
][
0
]
+
y
*
TransMat
[
0
][
1
];
y
=
x
*
TransMat
[
1
][
0
]
+
y
*
TransMat
[
1
][
1
];
x
=
t
;
*
Angle1
=
(
int
)
(
atan2
(
y
,
x
)
*
1800.0
/
M_PI
+
0.5
);
x
=
cos
(
*
Angle2
*
M_PI
/
1800.0
);
y
=
sin
(
*
Angle2
*
M_PI
/
1800.0
);
t
=
x
*
TransMat
[
0
][
0
]
+
y
*
TransMat
[
0
][
1
];
y
=
x
*
TransMat
[
1
][
0
]
+
y
*
TransMat
[
1
][
1
];
x
=
t
;
*
Angle2
=
(
int
)
(
atan2
(
y
,
x
)
*
1800.0
/
M_PI
+
0.5
);
NORMALIZE_ANGLE
(
*
Angle1
);
NORMALIZE_ANGLE
(
*
Angle2
);
if
(
*
Angle2
<
*
Angle1
)
*
Angle2
+=
3600
;
if
(
*
Angle2
-
*
Angle1
>
1800
)
{
/* Need to swap the two angles. */
Angle
=
(
*
Angle1
);
*
Angle1
=
(
*
Angle2
);
*
Angle2
=
Angle
;
NORMALIZE_ANGLE
(
*
Angle1
);
NORMALIZE_ANGLE
(
*
Angle2
);
if
(
*
Angle2
<
*
Angle1
)
*
Angle2
+=
3600
;
swap
=
TRUE
;
}
if
(
Delta
>=
1800
)
{
*
Angle1
+=
1
;
*
Angle2
-=
1
;
}
return
swap
;
int
Angle
,
Delta
;
double
x
,
y
,
t
;
bool
swap
=
FALSE
;
Delta
=
*
Angle2
-
*
Angle1
;
if
(
Delta
>=
1800
)
{
*
Angle1
-=
1
;
*
Angle2
+=
1
;
}
x
=
cos
(
*
Angle1
*
M_PI
/
1800.0
);
y
=
sin
(
*
Angle1
*
M_PI
/
1800.0
);
t
=
x
*
TransMat
[
0
][
0
]
+
y
*
TransMat
[
0
][
1
];
y
=
x
*
TransMat
[
1
][
0
]
+
y
*
TransMat
[
1
][
1
];
x
=
t
;
*
Angle1
=
(
int
)
(
atan2
(
y
,
x
)
*
1800.0
/
M_PI
+
0.5
);
x
=
cos
(
*
Angle2
*
M_PI
/
1800.0
);
y
=
sin
(
*
Angle2
*
M_PI
/
1800.0
);
t
=
x
*
TransMat
[
0
][
0
]
+
y
*
TransMat
[
0
][
1
];
y
=
x
*
TransMat
[
1
][
0
]
+
y
*
TransMat
[
1
][
1
];
x
=
t
;
*
Angle2
=
(
int
)
(
atan2
(
y
,
x
)
*
1800.0
/
M_PI
+
0.5
);
NORMALIZE_ANGLE
(
*
Angle1
);
NORMALIZE_ANGLE
(
*
Angle2
);
if
(
*
Angle2
<
*
Angle1
)
*
Angle2
+=
3600
;
if
(
*
Angle2
-
*
Angle1
>
1800
)
{
/* Need to swap the two angles. */
Angle
=
(
*
Angle1
);
*
Angle1
=
(
*
Angle2
);
*
Angle2
=
Angle
;
NORMALIZE_ANGLE
(
*
Angle1
);
NORMALIZE_ANGLE
(
*
Angle2
);
if
(
*
Angle2
<
*
Angle1
)
*
Angle2
+=
3600
;
swap
=
TRUE
;
}
if
(
Delta
>=
1800
)
{
*
Angle1
+=
1
;
*
Angle2
-=
1
;
}
return
swap
;
}
...
...
@@ -801,186 +881,200 @@ bool swap = FALSE;
* Routine to display an outline version of given library entry. *
* This routine is applied by the PlaceLibItem routine above. *
*****************************************************************************/
void
DrawingLibInGhost
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
EDA_SchComponentStruct
*
DrawLibItem
,
int
PartX
,
int
PartY
,
int
multi
,
int
convert
,
int
Color
,
bool
DrawPinText
)
void
DrawingLibInGhost
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
EDA_SchComponentStruct
*
DrawLibItem
,
int
PartX
,
int
PartY
,
int
multi
,
int
convert
,
int
Color
,
bool
DrawPinText
)
{
int
DrawMode
=
g_XorMode
;
DrawLibPartAux
(
panel
,
DC
,
DrawLibItem
,
LibEntry
,
wxPoint
(
PartX
,
PartY
),
DrawLibItem
->
m_Transform
,
multi
,
convert
,
DrawMode
,
Color
,
DrawPinText
);
int
DrawMode
=
g_XorMode
;
DrawLibPartAux
(
panel
,
DC
,
DrawLibItem
,
LibEntry
,
wxPoint
(
PartX
,
PartY
),
DrawLibItem
->
m_Transform
,
multi
,
convert
,
DrawMode
,
Color
,
DrawPinText
);
}
/************************************************************/
/* Routine to draw One LibraryDrawStruct at given position, */
/* matrice de transformation 1 0 0 -1 (normale) */
/* DrawMode = GrXOR, GrOR .. */
/************************************************************/
/* Utilise en LibEdit et Lib Browse */
void
DrawLibraryDrawStruct
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
int
PartX
,
int
PartY
,
LibEDA_BaseStruct
*
DrawItem
,
int
Multi
,
int
DrawMode
,
int
Color
)
void
DrawLibraryDrawStruct
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
EDA_LibComponentStruct
*
LibEntry
,
int
PartX
,
int
PartY
,
LibEDA_BaseStruct
*
DrawItem
,
int
Multi
,
int
DrawMode
,
int
Color
)
{
int
i
,
x1
,
y1
,
x2
,
y2
,
t1
,
t2
,
orient
;
int
CharColor
;
int
TransMat
[
2
][
2
];
int
fill_option
;
int
i
,
x1
,
y1
,
x2
,
y2
,
t1
,
t2
,
orient
;
int
CharColor
;
int
TransMat
[
2
][
2
];
int
fill_option
;
#undef GETCOLOR
#define GETCOLOR(l) Color < 0 ? ReturnLayerColor(l) : Color;
Multi
=
0
;
/* unused */
/* Trace de la structure */
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
GRSetDrawMode
(
DC
,
DrawMode
);
TransMat
[
0
][
0
]
=
1
;
TransMat
[
0
][
1
]
=
TransMat
[
1
][
0
]
=
0
;
TransMat
[
1
][
1
]
=
-
1
;
int
LineWidth
=
MAX
(
DrawItem
->
m_Width
,
g_DrawMinimunLineWidth
);
switch
(
DrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
xc
,
yc
,
x2
,
y2
;
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DrawItem
;
t1
=
Arc
->
t1
;
t2
=
Arc
->
t2
;
bool
swap
=
MapAngles
(
&
t1
,
&
t2
,
TransMat
);
xc
=
PartX
+
Arc
->
m_Pos
.
x
;
yc
=
PartY
-
Arc
->
m_Pos
.
y
;
x2
=
PartX
+
Arc
->
m_ArcStart
.
x
;
y2
=
PartY
-
Arc
->
m_ArcStart
.
y
;
x1
=
PartX
+
Arc
->
m_ArcEnd
.
x
;
y1
=
PartY
-
Arc
->
m_ArcEnd
.
y
;
if
(
swap
)
{
EXCHG
(
x1
,
x2
);
EXCHG
(
y1
,
y2
)}
fill_option
=
Arc
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
Arc
->
m_Fill
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
Arc
->
m_Fill
==
FILLED_SHAPE
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
LineWidth
,
CharColor
,
CharColor
);
#define GETCOLOR( l ) Color < 0 ? ReturnLayerColor( l ) : Color;
Multi
=
0
;
/* unused */
/* Trace de la structure */
CharColor
=
GETCOLOR
(
LAYER_DEVICE
);
GRSetDrawMode
(
DC
,
DrawMode
);
TransMat
[
0
][
0
]
=
1
;
TransMat
[
0
][
1
]
=
TransMat
[
1
][
0
]
=
0
;
TransMat
[
1
][
1
]
=
-
1
;
int
LineWidth
=
MAX
(
DrawItem
->
m_Width
,
g_DrawMinimunLineWidth
);
switch
(
DrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
xc
,
yc
,
x2
,
y2
;
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DrawItem
;
t1
=
Arc
->
t1
;
t2
=
Arc
->
t2
;
bool
swap
=
MapAngles
(
&
t1
,
&
t2
,
TransMat
);
xc
=
PartX
+
Arc
->
m_Pos
.
x
;
yc
=
PartY
-
Arc
->
m_Pos
.
y
;
x2
=
PartX
+
Arc
->
m_ArcStart
.
x
;
y2
=
PartY
-
Arc
->
m_ArcStart
.
y
;
x1
=
PartX
+
Arc
->
m_ArcEnd
.
x
;
y1
=
PartY
-
Arc
->
m_ArcEnd
.
y
;
if
(
swap
)
{
EXCHG
(
x1
,
x2
);
EXCHG
(
y1
,
y2
)
}
fill_option
=
Arc
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
Arc
->
m_Fill
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
Arc
->
m_Fill
==
FILLED_SHAPE
)
GRFilledArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
LineWidth
,
CharColor
,
CharColor
);
#ifdef DRAW_ARC_WITH_ANGLE
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
);
else
GRArc
(
&
panel
->
m_ClipBox
,
DC
,
xc
,
yc
,
t1
,
t2
,
Arc
->
m_Rayon
,
CharColor
);
#else
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
LineWidth
,
CharColor
);
else
GRArc1
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
xc
,
yc
,
LineWidth
,
CharColor
);
#endif
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DrawItem
;
x1
=
PartX
+
Circle
->
m_Pos
.
x
;
y1
=
PartY
-
Circle
->
m_Pos
.
y
;
fill_option
=
Circle
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
0
,
CharColor
,
CharColor
);
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
(
LibDrawText
*
)
DrawItem
;
x1
=
PartX
+
Text
->
m_Pos
.
x
;
y1
=
PartY
-
Text
->
m_Pos
.
y
;
DrawGraphicText
(
panel
,
DC
,
wxPoint
(
x1
,
y1
),
CharColor
,
Text
->
m_Text
,
Text
->
m_Horiz
,
Text
->
m_Size
,
GR_TEXT_HJUSTIFY_CENTER
,
GR_TEXT_VJUSTIFY_CENTER
,
LineWidth
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DrawItem
;
x1
=
PartX
+
Square
->
m_Pos
.
x
;
y1
=
PartY
-
Square
->
m_Pos
.
y
;
x2
=
PartX
+
Square
->
m_End
.
x
;
y2
=
PartY
-
Square
->
m_End
.
y
;
fill_option
=
Square
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
LineWidth
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
CharColor
);
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
/* Trace des Pins */
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawItem
;
x2
=
PartX
+
Pin
->
m_Pos
.
x
;
y2
=
PartY
-
Pin
->
m_Pos
.
y
;
/* Compute the real pin orientation, i.e. pin orient + component orient */
orient
=
Pin
->
ReturnPinDrawOrient
(
TransMat
);
/* Dessin de la pin et du symbole special associe */
if
(
Pin
->
m_Attributs
&
PINNOTDRAW
)
CharColor
=
DARKGRAY
;
else
CharColor
=
-
1
;
Pin
->
DrawPinSymbol
(
panel
,
DC
,
wxPoint
(
x2
,
y2
),
orient
,
DrawMode
);
wxPoint
pinpos
(
x2
,
y2
);
Pin
->
DrawPinTexts
(
panel
,
DC
,
pinpos
,
orient
,
LibEntry
->
m_TextInside
,
LibEntry
->
m_DrawPinNum
,
LibEntry
->
m_DrawPinName
,
CharColor
,
DrawMode
);
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DrawItem
;
if
(
Buf_Poly_Drawings
==
NULL
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
MyMalloc
(
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
else
if
(
Buf_Poly_Size
<
polyline
->
n
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
realloc
(
Buf_Poly_Drawings
,
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
for
(
i
=
0
;
i
<
polyline
->
n
;
i
++
)
{
Buf_Poly_Drawings
[
i
*
2
]
=
PartX
+
polyline
->
PolyList
[
i
*
2
];
Buf_Poly_Drawings
[
i
*
2
+
1
]
=
PartY
-
polyline
->
PolyList
[
i
*
2
+
1
];
}
fill_option
=
polyline
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
));
else
if
(
fill_option
==
FILLED_SHAPE
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
CharColor
);
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
break
;
}
}
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DrawItem
;
x1
=
PartX
+
Circle
->
m_Pos
.
x
;
y1
=
PartY
-
Circle
->
m_Pos
.
y
;
fill_option
=
Circle
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
0
,
CharColor
,
CharColor
);
else
GRCircle
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
Circle
->
m_Rayon
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
(
LibDrawText
*
)
DrawItem
;
x1
=
PartX
+
Text
->
m_Pos
.
x
;
y1
=
PartY
-
Text
->
m_Pos
.
y
;
DrawGraphicText
(
panel
,
DC
,
wxPoint
(
x1
,
y1
),
CharColor
,
Text
->
m_Text
,
Text
->
m_Horiz
,
Text
->
m_Size
,
GR_TEXT_HJUSTIFY_CENTER
,
GR_TEXT_VJUSTIFY_CENTER
,
LineWidth
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DrawItem
;
x1
=
PartX
+
Square
->
m_Pos
.
x
;
y1
=
PartY
-
Square
->
m_Pos
.
y
;
x2
=
PartX
+
Square
->
m_End
.
x
;
y2
=
PartY
-
Square
->
m_End
.
y
;
fill_option
=
Square
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
LineWidth
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRFilledRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
CharColor
,
CharColor
);
else
GRRect
(
&
panel
->
m_ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
LineWidth
,
CharColor
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
/* Trace des Pins */
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawItem
;
x2
=
PartX
+
Pin
->
m_Pos
.
x
;
y2
=
PartY
-
Pin
->
m_Pos
.
y
;
/* Compute the real pin orientation, i.e. pin orient + component orient */
orient
=
Pin
->
ReturnPinDrawOrient
(
TransMat
);
/* Dessin de la pin et du symbole special associe */
if
(
Pin
->
m_Attributs
&
PINNOTDRAW
)
CharColor
=
DARKGRAY
;
else
CharColor
=
-
1
;
Pin
->
DrawPinSymbol
(
panel
,
DC
,
wxPoint
(
x2
,
y2
),
orient
,
DrawMode
);
wxPoint
pinpos
(
x2
,
y2
);
Pin
->
DrawPinTexts
(
panel
,
DC
,
pinpos
,
orient
,
LibEntry
->
m_TextInside
,
LibEntry
->
m_DrawPinNum
,
LibEntry
->
m_DrawPinName
,
CharColor
,
DrawMode
);
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DrawItem
;
if
(
Buf_Poly_Drawings
==
NULL
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
MyMalloc
(
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
else
if
(
Buf_Poly_Size
<
polyline
->
n
)
{
Buf_Poly_Size
=
polyline
->
n
;
Buf_Poly_Drawings
=
(
int
*
)
realloc
(
Buf_Poly_Drawings
,
sizeof
(
int
)
*
2
*
Buf_Poly_Size
);
}
for
(
i
=
0
;
i
<
polyline
->
n
;
i
++
)
{
Buf_Poly_Drawings
[
i
*
2
]
=
PartX
+
polyline
->
PolyList
[
i
*
2
];
Buf_Poly_Drawings
[
i
*
2
+
1
]
=
PartY
-
polyline
->
PolyList
[
i
*
2
+
1
];
}
fill_option
=
polyline
->
m_Fill
&
(
~
g_PrintFillMask
);
if
(
(
fill_option
==
FILLED_WITH_BG_BODYCOLOR
)
&&
!
g_IsPrinting
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
ReturnLayerColor
(
LAYER_DEVICE_BACKGROUND
)
);
else
if
(
fill_option
==
FILLED_SHAPE
)
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
1
,
LineWidth
,
CharColor
,
CharColor
);
else
GRPoly
(
&
panel
->
m_ClipBox
,
DC
,
polyline
->
n
,
Buf_Poly_Drawings
,
0
,
LineWidth
,
CharColor
,
CharColor
);
break
;
}
default
:
;
}
}
eeschema/eelibs_read_libraryfiles.cpp
View file @
f3c324d5
...
...
@@ -17,22 +17,22 @@
/* Fonctions locales */
/* pour librairies de composants */
static
LibEDA_BaseStruct
*
GetDrawEntry
(
WinEDA_DrawFrame
*
frame
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
);
static
bool
GetLibEntryField
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
);
static
bool
AddAliasNames
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
);
static
void
InsertAlias
(
PriorQue
**
PQ
,
EDA_LibComponentStruct
*
LibEntry
,
int
*
NumOfParts
);
static
bool
ReadLibEntryDateAndTime
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
Line
);
static
int
AddFootprintFilterList
(
EDA_LibComponentStruct
*
LibEntryLibEntry
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
);
static
LibEDA_BaseStruct
*
GetDrawEntry
(
WinEDA_DrawFrame
*
frame
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
);
static
bool
GetLibEntryField
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
);
static
bool
AddAliasNames
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
);
static
void
InsertAlias
(
PriorQue
**
PQ
,
EDA_LibComponentStruct
*
LibEntry
,
int
*
NumOfParts
);
static
bool
ReadLibEntryDateAndTime
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
Line
);
static
int
AddFootprintFilterList
(
EDA_LibComponentStruct
*
LibEntryLibEntry
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
);
/* pour doc librairies */
/****************************************************/
/* Routines de lecture des librairies de composants */
/****************************************************/
/****************************************************/
/* Routines de lecture des librairies de composants */
/****************************************************/
/*****************************************************************************
...
...
@@ -41,197 +41,222 @@ static int AddFootprintFilterList(EDA_LibComponentStruct *LibEntryLibEntry,
* IF library already exists, it is NOT reloaded. *
* return: new lib or NULL *
*****************************************************************************/
LibraryStruct
*
LoadLibraryName
(
WinEDA_DrawFrame
*
frame
,
const
wxString
&
FullLibName
,
const
wxString
&
LibName
)
LibraryStruct
*
LoadLibraryName
(
WinEDA_DrawFrame
*
frame
,
const
wxString
&
FullLibName
,
const
wxString
&
LibName
)
{
int
NumOfParts
;
FILE
*
f
;
LibraryStruct
*
NewLib
;
PriorQue
*
Entries
;
wxString
FullFileName
;
if
(
(
NewLib
=
FindLibrary
(
LibName
))
!=
NULL
)
{
if
(
NewLib
->
m_FullFileName
==
FullLibName
)
return
NewLib
;
FreeCmpLibrary
(
frame
,
LibName
);
}
NewLib
=
NULL
;
f
=
wxFopen
(
FullLibName
,
wxT
(
"rt"
)
);
if
(
f
==
NULL
)
{
wxString
msg
;
msg
.
Printf
(
_
(
"Library <%s> not found"
),
FullLibName
.
GetData
());
DisplayError
(
frame
,
msg
);
return
NULL
;
}
NewLib
=
new
LibraryStruct
(
LIBRARY_TYPE_EESCHEMA
,
LibName
,
FullLibName
);
Entries
=
LoadLibraryAux
(
frame
,
NewLib
,
f
,
&
NumOfParts
);
if
(
Entries
!=
NULL
)
{
NewLib
->
m_Entries
=
Entries
;
NewLib
->
m_NumOfParts
=
NumOfParts
;
if
(
g_LibraryList
==
NULL
)
g_LibraryList
=
NewLib
;
else
{
LibraryStruct
*
tmplib
=
g_LibraryList
;
while
(
tmplib
->
m_Pnext
)
tmplib
=
tmplib
->
m_Pnext
;
tmplib
->
m_Pnext
=
NewLib
;
}
FullFileName
=
FullLibName
;
ChangeFileNameExt
(
FullFileName
,
DOC_EXT
);
LoadDocLib
(
frame
,
FullFileName
,
NewLib
->
m_Name
);
}
else
delete
NewLib
;
fclose
(
f
);
return
NewLib
;
int
NumOfParts
;
FILE
*
f
;
LibraryStruct
*
NewLib
;
PriorQue
*
Entries
;
wxString
FullFileName
;
if
(
(
NewLib
=
FindLibrary
(
LibName
)
)
!=
NULL
)
{
if
(
NewLib
->
m_FullFileName
==
FullLibName
)
return
NewLib
;
FreeCmpLibrary
(
frame
,
LibName
);
}
NewLib
=
NULL
;
f
=
wxFopen
(
FullLibName
,
wxT
(
"rt"
)
);
if
(
f
==
NULL
)
{
wxString
msg
;
msg
.
Printf
(
_
(
"Library <%s> not found"
),
FullLibName
.
GetData
()
);
DisplayError
(
frame
,
msg
);
return
NULL
;
}
NewLib
=
new
LibraryStruct
(
LIBRARY_TYPE_EESCHEMA
,
LibName
,
FullLibName
);
Entries
=
LoadLibraryAux
(
frame
,
NewLib
,
f
,
&
NumOfParts
);
if
(
Entries
!=
NULL
)
{
NewLib
->
m_Entries
=
Entries
;
NewLib
->
m_NumOfParts
=
NumOfParts
;
if
(
g_LibraryList
==
NULL
)
g_LibraryList
=
NewLib
;
else
{
LibraryStruct
*
tmplib
=
g_LibraryList
;
while
(
tmplib
->
m_Pnext
)
tmplib
=
tmplib
->
m_Pnext
;
tmplib
->
m_Pnext
=
NewLib
;
}
FullFileName
=
FullLibName
;
ChangeFileNameExt
(
FullFileName
,
DOC_EXT
);
LoadDocLib
(
frame
,
FullFileName
,
NewLib
->
m_Name
);
}
else
delete
NewLib
;
fclose
(
f
);
return
NewLib
;
}
/******************************************/
void
LoadLibraries
(
WinEDA_DrawFrame
*
frame
)
void
LoadLibraries
(
WinEDA_DrawFrame
*
frame
)
/******************************************/
/* Delete toutes les librairies chargees et recree toutes les librairies
donnes dans la liste g_LibName_List
*/
*
donnes dans la liste g_LibName_List
*/
{
wxString
FullLibName
,
msg
;
wxString
LibName
;
unsigned
ii
,
iimax
=
g_LibName_List
.
GetCount
();
frame
->
PrintMsg
(
_
(
"Start loading schematic libs"
));
// Free the unwanted libraries (i.e. not in list) but keep the .cache lib
LibraryStruct
*
nextlib
,
*
lib
=
g_LibraryList
;
for
(;
lib
!=
NULL
;
lib
=
nextlib
)
{
nextlib
=
lib
->
m_Pnext
;
if
(
lib
->
m_IsLibCache
)
continue
;
wxString
libname
=
lib
->
m_Name
;
// is this library in "wanted list" g_LibName_List ?
int
test
=
g_LibName_List
.
Index
(
libname
);
if
(
test
==
wxNOT_FOUND
)
FreeCmpLibrary
(
frame
,
libname
);
}
// Load missing libraries (if any)
for
(
ii
=
0
;
ii
<
iimax
;
ii
++
)
{
LibName
=
g_LibName_List
[
ii
];
if
(
LibName
.
IsEmpty
()
)
continue
;
FullLibName
=
MakeFileName
(
g_RealLibDirBuffer
,
LibName
,
g_LibExtBuffer
);
msg
=
wxT
(
"Loading "
)
+
FullLibName
;
if
(
LoadLibraryName
(
frame
,
FullLibName
,
LibName
)
)
msg
+=
wxT
(
" OK"
);
else
msg
+=
wxT
(
" ->Error"
);
frame
->
PrintMsg
(
msg
);
}
// reorder the linked list to match the order filename list:
int
NumOfLibs
;
for
(
NumOfLibs
=
0
,
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
{
lib
->
m_Flags
=
0
;
NumOfLibs
++
;
}
if
(
NumOfLibs
==
0
)
return
;
LibraryStruct
**
libs
=
(
LibraryStruct
**
)
MyZMalloc
(
sizeof
(
LibraryStruct
*
)
*
(
NumOfLibs
+
2
));
int
jj
=
0
;
for
(
ii
=
0
;
ii
<
g_LibName_List
.
GetCount
();
ii
++
)
{
if
(
jj
>=
NumOfLibs
)
break
;
lib
=
FindLibrary
(
g_LibName_List
[
ii
]);
if
(
lib
)
{
lib
->
m_Flags
=
1
;
libs
[
jj
++
]
=
lib
;
}
}
/* Put lib cache at end of list */
for
(
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
{
if
(
lib
->
m_Flags
==
0
)
libs
[
jj
++
]
=
lib
;
}
libs
[
jj
]
=
NULL
;
/* Change the linked list pointers */
for
(
ii
=
0
;
libs
[
ii
]
!=
NULL
;
ii
++
)
libs
[
ii
]
->
m_Pnext
=
libs
[
ii
+
1
];
g_LibraryList
=
libs
[
0
];
MyFree
(
libs
);
for
(
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
lib
->
m_Flags
=
0
;
wxString
FullLibName
,
msg
;
wxString
LibName
;
unsigned
ii
,
iimax
=
g_LibName_List
.
GetCount
();
frame
->
PrintMsg
(
_
(
"Start loading schematic libs"
)
);
// Free the unwanted libraries (i.e. not in list) but keep the .cache lib
LibraryStruct
*
nextlib
,
*
lib
=
g_LibraryList
;
for
(
;
lib
!=
NULL
;
lib
=
nextlib
)
{
nextlib
=
lib
->
m_Pnext
;
if
(
lib
->
m_IsLibCache
)
continue
;
wxString
libname
=
lib
->
m_Name
;
// is this library in "wanted list" g_LibName_List ?
int
test
=
g_LibName_List
.
Index
(
libname
);
if
(
test
==
wxNOT_FOUND
)
FreeCmpLibrary
(
frame
,
libname
);
}
// Load missing libraries (if any)
for
(
ii
=
0
;
ii
<
iimax
;
ii
++
)
{
LibName
=
g_LibName_List
[
ii
];
if
(
LibName
.
IsEmpty
()
)
continue
;
FullLibName
=
MakeFileName
(
g_RealLibDirBuffer
,
LibName
,
g_LibExtBuffer
);
msg
=
wxT
(
"Loading "
)
+
FullLibName
;
if
(
LoadLibraryName
(
frame
,
FullLibName
,
LibName
)
)
msg
+=
wxT
(
" OK"
);
else
msg
+=
wxT
(
" ->Error"
);
frame
->
PrintMsg
(
msg
);
}
// reorder the linked list to match the order filename list:
int
NumOfLibs
;
for
(
NumOfLibs
=
0
,
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
{
lib
->
m_Flags
=
0
;
NumOfLibs
++
;
}
if
(
NumOfLibs
==
0
)
return
;
LibraryStruct
**
libs
=
(
LibraryStruct
**
)
MyZMalloc
(
sizeof
(
LibraryStruct
*
)
*
(
NumOfLibs
+
2
)
);
int
jj
=
0
;
for
(
ii
=
0
;
ii
<
g_LibName_List
.
GetCount
();
ii
++
)
{
if
(
jj
>=
NumOfLibs
)
break
;
lib
=
FindLibrary
(
g_LibName_List
[
ii
]
);
if
(
lib
)
{
lib
->
m_Flags
=
1
;
libs
[
jj
++
]
=
lib
;
}
}
/* Put lib cache at end of list */
for
(
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
{
if
(
lib
->
m_Flags
==
0
)
libs
[
jj
++
]
=
lib
;
}
libs
[
jj
]
=
NULL
;
/* Change the linked list pointers */
for
(
ii
=
0
;
libs
[
ii
]
!=
NULL
;
ii
++
)
libs
[
ii
]
->
m_Pnext
=
libs
[
ii
+
1
];
g_LibraryList
=
libs
[
0
];
MyFree
(
libs
);
for
(
lib
=
g_LibraryList
;
lib
!=
NULL
;
lib
=
lib
->
m_Pnext
)
lib
->
m_Flags
=
0
;
}
/*****************************************************************************
* Routine to free a library from the current loaded libraries. *
*****************************************************************************/
void
FreeCmpLibrary
(
wxWindow
*
frame
,
const
wxString
&
LibName
)
void
FreeCmpLibrary
(
wxWindow
*
frame
,
const
wxString
&
LibName
)
{
int
NumOfLibs
=
NumOfLibraries
();
LibraryStruct
*
Lib
,
*
TempLib
;
if
(
NumOfLibs
==
0
)
{
DisplayError
(
frame
,
wxT
(
"No libraries are loaded"
),
20
);
return
;
}
/* Search for this library name: */
for
(
Lib
=
g_LibraryList
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
)
{
if
(
LibName
==
Lib
->
m_Name
)
break
;
}
if
(
Lib
==
NULL
)
return
;
if
(
Lib
==
g_LibraryList
)
g_LibraryList
=
Lib
->
m_Pnext
;
else
{
for
(
TempLib
=
g_LibraryList
;
TempLib
->
m_Pnext
!=
Lib
;
TempLib
=
TempLib
->
m_Pnext
);
TempLib
->
m_Pnext
=
TempLib
->
m_Pnext
->
m_Pnext
;
}
delete
Lib
;
/* La librairie supprimee est peut etre celle selectee dans libedit */
if
(
Lib
==
CurrentLib
)
CurrentLib
=
NULL
;
int
NumOfLibs
=
NumOfLibraries
();
LibraryStruct
*
Lib
,
*
TempLib
;
if
(
NumOfLibs
==
0
)
{
DisplayError
(
frame
,
wxT
(
"No libraries are loaded"
),
20
);
return
;
}
/* Search for this library name: */
for
(
Lib
=
g_LibraryList
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
)
{
if
(
LibName
==
Lib
->
m_Name
)
break
;
}
if
(
Lib
==
NULL
)
return
;
if
(
Lib
==
g_LibraryList
)
g_LibraryList
=
Lib
->
m_Pnext
;
else
{
for
(
TempLib
=
g_LibraryList
;
TempLib
->
m_Pnext
!=
Lib
;
TempLib
=
TempLib
->
m_Pnext
)
;
TempLib
->
m_Pnext
=
TempLib
->
m_Pnext
->
m_Pnext
;
}
delete
Lib
;
/* La librairie supprimee est peut etre celle selectee dans libedit */
if
(
Lib
==
CurrentLib
)
CurrentLib
=
NULL
;
}
/******************************/
const
wxChar
**
GetLibNames
(
void
)
const
wxChar
**
GetLibNames
(
void
)
/******************************/
/* Routine to return pointers to all library names.
User is responsible to deallocate memory
*/
*
User is responsible to deallocate memory
*/
{
int
ii
,
NumOfLibs
=
NumOfLibraries
();
const
wxChar
**
Names
;
LibraryStruct
*
Lib
;
Names
=
(
const
wxChar
**
)
MyZMalloc
(
sizeof
(
wxChar
*
)
*
(
NumOfLibs
+
1
));
for
(
ii
=
0
,
Lib
=
g_LibraryList
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
,
ii
++
)
{
Names
[
ii
]
=
Lib
->
m_Name
.
GetData
();
}
Names
[
ii
]
=
NULL
;
return
Names
;
int
ii
,
NumOfLibs
=
NumOfLibraries
();
const
wxChar
**
Names
;
LibraryStruct
*
Lib
;
Names
=
(
const
wxChar
**
)
MyZMalloc
(
sizeof
(
wxChar
*
)
*
(
NumOfLibs
+
1
)
);
for
(
ii
=
0
,
Lib
=
g_LibraryList
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
,
ii
++
)
{
Names
[
ii
]
=
Lib
->
m_Name
.
GetData
();
}
Names
[
ii
]
=
NULL
;
return
Names
;
}
...
...
@@ -239,911 +264,1017 @@ LibraryStruct *Lib;
* Routine to compare two EDA_LibComponentStruct for the PriorQue module. *
* Comparison (insensitive case) is based on Part name. *
*****************************************************************************/
int
LibraryEntryCompare
(
EDA_LibComponentStruct
*
LE1
,
EDA_LibComponentStruct
*
LE2
)
int
LibraryEntryCompare
(
EDA_LibComponentStruct
*
LE1
,
EDA_LibComponentStruct
*
LE2
)
{
return
LE1
->
m_Name
.
m_Text
.
CmpNoCase
(
LE2
->
m_Name
.
m_Text
);
return
LE1
->
m_Name
.
m_Text
.
CmpNoCase
(
LE2
->
m_Name
.
m_Text
);
}
/*****************************************************************************
* Routine to load a library from given open file. *
*****************************************************************************/
PriorQue
*
LoadLibraryAux
(
WinEDA_DrawFrame
*
frame
,
LibraryStruct
*
Library
,
FILE
*
libfile
,
int
*
NumOfParts
)
PriorQue
*
LoadLibraryAux
(
WinEDA_DrawFrame
*
frame
,
LibraryStruct
*
Library
,
FILE
*
libfile
,
int
*
NumOfParts
)
{
int
LineNum
=
0
;
char
Line
[
1024
];
PriorQue
*
PQ
=
NULL
;
EDA_LibComponentStruct
*
LibEntry
;
wxString
msg
;
wxBusyCursor
ShowWait
;
// Display a Busy Cursor..
*
NumOfParts
=
0
;
if
(
GetLine
(
libfile
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
==
NULL
)
{
msg
=
_
(
"File <"
)
+
Library
->
m_Name
+
_
(
"> is empty!"
);
DisplayError
(
frame
,
msg
);
return
NULL
;
}
if
(
strnicmp
(
Line
,
LIBFILE_IDENT
,
10
)
!=
0
)
{
msg
=
_
(
"File <"
)
+
Library
->
m_Name
+
_
(
"> is NOT EESCHEMA library!"
);
DisplayError
(
frame
,
msg
);
return
NULL
;
}
if
(
Library
)
Library
->
m_Header
=
CONV_FROM_UTF8
(
Line
);
PQInit
(
&
PQ
);
PQCompFunc
((
PQCompFuncType
)
LibraryEntryCompare
);
while
(
GetLine
(
libfile
,
Line
,
&
LineNum
,
sizeof
(
Line
))
)
{
if
(
strnicmp
(
Line
,
"$HEADER"
,
7
)
==
0
)
{
if
(
Library
)
{
if
(
!
Library
->
ReadHeader
(
libfile
,
&
LineNum
)
)
{
msg
=
_
(
"Library <"
)
+
Library
->
m_Name
+
_
(
"> header read error"
);
DisplayError
(
frame
,
msg
,
30
);
}
}
continue
;
}
if
(
strnicmp
(
Line
,
"DEF"
,
3
)
==
0
)
{
/* Read one DEF/ENDDEF part entry from library: */
LibEntry
=
Read_Component_Definition
(
frame
,
Line
,
libfile
,
&
LineNum
);
if
(
LibEntry
)
{
/* If we are here, this part is O.k. - put it in: */
++*
NumOfParts
;
PQInsert
(
&
PQ
,
LibEntry
);
InsertAlias
(
&
PQ
,
LibEntry
,
NumOfParts
);
}
}
}
return
PQ
;
int
LineNum
=
0
;
char
Line
[
1024
];
PriorQue
*
PQ
=
NULL
;
EDA_LibComponentStruct
*
LibEntry
;
wxString
msg
;
wxBusyCursor
ShowWait
;
// Display a Busy Cursor..
*
NumOfParts
=
0
;
if
(
GetLine
(
libfile
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
==
NULL
)
{
msg
=
_
(
"File <"
)
+
Library
->
m_Name
+
_
(
"> is empty!"
);
DisplayError
(
frame
,
msg
);
return
NULL
;
}
if
(
strnicmp
(
Line
,
LIBFILE_IDENT
,
10
)
!=
0
)
{
msg
=
_
(
"File <"
)
+
Library
->
m_Name
+
_
(
"> is NOT EESCHEMA library!"
);
DisplayError
(
frame
,
msg
);
return
NULL
;
}
if
(
Library
)
Library
->
m_Header
=
CONV_FROM_UTF8
(
Line
);
PQInit
(
&
PQ
);
PQCompFunc
(
(
PQCompFuncType
)
LibraryEntryCompare
);
while
(
GetLine
(
libfile
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
)
{
if
(
strnicmp
(
Line
,
"$HEADER"
,
7
)
==
0
)
{
if
(
Library
)
{
if
(
!
Library
->
ReadHeader
(
libfile
,
&
LineNum
)
)
{
msg
=
_
(
"Library <"
)
+
Library
->
m_Name
+
_
(
"> header read error"
);
DisplayError
(
frame
,
msg
,
30
);
}
}
continue
;
}
if
(
strnicmp
(
Line
,
"DEF"
,
3
)
==
0
)
{
/* Read one DEF/ENDDEF part entry from library: */
LibEntry
=
Read_Component_Definition
(
frame
,
Line
,
libfile
,
&
LineNum
);
if
(
LibEntry
)
{
/* If we are here, this part is O.k. - put it in: */
++
*
NumOfParts
;
PQInsert
(
&
PQ
,
LibEntry
);
InsertAlias
(
&
PQ
,
LibEntry
,
NumOfParts
);
}
}
}
return
PQ
;
}
/*********************************************************************************************/
EDA_LibComponentStruct
*
Read_Component_Definition
(
WinEDA_DrawFrame
*
frame
,
char
*
Line
,
FILE
*
f
,
int
*
LineNum
)
EDA_LibComponentStruct
*
Read_Component_Definition
(
WinEDA_DrawFrame
*
frame
,
char
*
Line
,
FILE
*
f
,
int
*
LineNum
)
/*********************************************************************************************/
/* Routine to Read a DEF/ENDDEF part entry from given open file.
*/
*/
{
int
unused
;
char
*
p
,
*
Name
,
*
Prefix
=
NULL
;
EDA_LibComponentStruct
*
LibEntry
=
NULL
;
bool
Res
;
wxString
Msg
;
p
=
strtok
(
Line
,
"
\t\r\n
"
);
if
(
strcmp
(
p
,
"DEF"
)
!=
0
)
{
Msg
.
Printf
(
wxT
(
"DEF command expected in line %d, aborted."
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
return
NULL
;
}
/* Read DEF line: */
char
drawnum
=
0
,
drawname
=
0
;
LibEntry
=
new
EDA_LibComponentStruct
(
NULL
);
if
((
Name
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* Part name: */
(
Prefix
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* Prefix name: */
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* NumOfPins: */
sscanf
(
p
,
"%d"
,
&
unused
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* TextInside: */
sscanf
(
p
,
"%d"
,
&
LibEntry
->
m_TextInside
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* DrawNums: */
sscanf
(
p
,
"%c"
,
&
drawnum
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* DrawNums: */
sscanf
(
p
,
"%c"
,
&
drawname
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
==
NULL
||
/* m_UnitCount: */
sscanf
(
p
,
"%d"
,
&
LibEntry
->
m_UnitCount
)
!=
1
)
{
Msg
.
Printf
(
wxT
(
"Wrong DEF format in line %d, skipped."
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
while
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
)
{
p
=
strtok
(
Line
,
"
\t\n
"
);
if
(
stricmp
(
p
,
"ENDDEF"
)
==
0
)
break
;
}
return
NULL
;
}
else
/* Mise a jour des infos de la ligne "DEF" */
{
LibEntry
->
m_DrawPinNum
=
(
drawnum
==
'N'
)
?
FALSE
:
TRUE
;
LibEntry
->
m_DrawPinName
=
(
drawname
==
'N'
)
?
FALSE
:
TRUE
;
/* Copy part name and prefix. */
strupper
(
Name
);
if
(
Name
[
0
]
!=
'~'
)
LibEntry
->
m_Name
.
m_Text
=
CONV_FROM_UTF8
(
Name
);
else
{
LibEntry
->
m_Name
.
m_Text
=
CONV_FROM_UTF8
(
&
Name
[
1
]);
LibEntry
->
m_Name
.
m_Attributs
|=
TEXT_NO_VISIBLE
;
}
if
(
strcmp
(
Prefix
,
"~"
)
==
0
)
{
LibEntry
->
m_Prefix
.
m_Text
.
Empty
();
LibEntry
->
m_Prefix
.
m_Attributs
|=
TEXT_NO_VISIBLE
;
}
else
LibEntry
->
m_Prefix
.
m_Text
=
CONV_FROM_UTF8
(
Prefix
);
// Copy optional infos
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
!=
NULL
)
// m_UnitSelectionLocked param
{
if
(
*
p
==
'L'
)
LibEntry
->
m_UnitSelectionLocked
=
TRUE
;
}
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
!=
NULL
)
/* Type Of Component */
{
if
(
*
p
==
'P'
)
LibEntry
->
m_Options
=
ENTRY_POWER
;
}
}
/* Analyse lignes suivantes */
while
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
)
{
p
=
strtok
(
Line
,
"
\t\n
"
);
Res
=
TRUE
;
/* Pour test d'erreur (Res = FALSE = erreur) */
if
(
(
Line
[
0
]
==
'T'
)
&&
(
Line
[
1
]
==
'i'
)
)
{
Res
=
ReadLibEntryDateAndTime
(
LibEntry
,
Line
);
}
else
if
(
Line
[
0
]
==
'F'
)
{
Res
=
GetLibEntryField
(
LibEntry
,
Line
);
}
else
if
(
strcmp
(
p
,
"ENDDEF"
)
==
0
)
{
break
;
}
else
if
(
strcmp
(
p
,
"DRAW"
)
==
0
)
{
LibEntry
->
m_Drawings
=
GetDrawEntry
(
frame
,
f
,
Line
,
LineNum
);
}
else
if
(
strncmp
(
p
,
"ALIAS"
,
5
)
==
0
)
{
p
=
strtok
(
NULL
,
"
\r\n
"
);
Res
=
AddAliasNames
(
LibEntry
,
p
);
}
else
if
(
strncmp
(
p
,
"$FPLIST"
,
5
)
==
0
)
{
Res
=
AddFootprintFilterList
(
LibEntry
,
f
,
Line
,
LineNum
);
}
else
{
Msg
.
Printf
(
wxT
(
"Undefined command
\"
%s
\"
in line %d, skipped."
),
p
,
*
LineNum
);
frame
->
PrintMsg
(
Msg
);
}
/* Fin analyse de la ligne ou block: test de l'info lue */
if
(
!
Res
)
{
/* Something went wrong there. */
Msg
.
Printf
(
wxT
(
" Error Line %d, Library not loaded"
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
delete
LibEntry
;
return
NULL
;
}
}
/* If we are here, this part is O.k. - put it in: */
LibEntry
->
SortDrawItems
();
return
LibEntry
;
int
unused
;
char
*
p
,
*
Name
,
*
Prefix
=
NULL
;
EDA_LibComponentStruct
*
LibEntry
=
NULL
;
bool
Res
;
wxString
Msg
;
p
=
strtok
(
Line
,
"
\t\r\n
"
);
if
(
strcmp
(
p
,
"DEF"
)
!=
0
)
{
Msg
.
Printf
(
wxT
(
"DEF command expected in line %d, aborted."
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
return
NULL
;
}
/* Read DEF line: */
char
drawnum
=
0
,
drawname
=
0
;
LibEntry
=
new
EDA_LibComponentStruct
(
NULL
);
if
(
(
Name
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* Part name: */
||
(
Prefix
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* Prefix name: */
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* NumOfPins: */
||
sscanf
(
p
,
"%d"
,
&
unused
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* TextInside: */
||
sscanf
(
p
,
"%d"
,
&
LibEntry
->
m_TextInside
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* DrawNums: */
||
sscanf
(
p
,
"%c"
,
&
drawnum
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* DrawNums: */
||
sscanf
(
p
,
"%c"
,
&
drawname
)
!=
1
||
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
==
NULL
/* m_UnitCount: */
||
sscanf
(
p
,
"%d"
,
&
LibEntry
->
m_UnitCount
)
!=
1
)
{
Msg
.
Printf
(
wxT
(
"Wrong DEF format in line %d, skipped."
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
while
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
)
{
p
=
strtok
(
Line
,
"
\t\n
"
);
if
(
stricmp
(
p
,
"ENDDEF"
)
==
0
)
break
;
}
return
NULL
;
}
else
/* Mise a jour des infos de la ligne "DEF" */
{
LibEntry
->
m_DrawPinNum
=
(
drawnum
==
'N'
)
?
FALSE
:
TRUE
;
LibEntry
->
m_DrawPinName
=
(
drawname
==
'N'
)
?
FALSE
:
TRUE
;
/* Copy part name and prefix. */
strupper
(
Name
);
if
(
Name
[
0
]
!=
'~'
)
LibEntry
->
m_Name
.
m_Text
=
CONV_FROM_UTF8
(
Name
);
else
{
LibEntry
->
m_Name
.
m_Text
=
CONV_FROM_UTF8
(
&
Name
[
1
]
);
LibEntry
->
m_Name
.
m_Attributs
|=
TEXT_NO_VISIBLE
;
}
if
(
strcmp
(
Prefix
,
"~"
)
==
0
)
{
LibEntry
->
m_Prefix
.
m_Text
.
Empty
();
LibEntry
->
m_Prefix
.
m_Attributs
|=
TEXT_NO_VISIBLE
;
}
else
LibEntry
->
m_Prefix
.
m_Text
=
CONV_FROM_UTF8
(
Prefix
);
// Copy optional infos
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
!=
NULL
)
// m_UnitSelectionLocked param
{
if
(
*
p
==
'L'
)
LibEntry
->
m_UnitSelectionLocked
=
TRUE
;
}
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
!=
NULL
)
/* Type Of Component */
{
if
(
*
p
==
'P'
)
LibEntry
->
m_Options
=
ENTRY_POWER
;
}
}
/* Analyse lignes suivantes */
while
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
)
{
p
=
strtok
(
Line
,
"
\t\n
"
);
Res
=
TRUE
;
/* Pour test d'erreur (Res = FALSE = erreur) */
if
(
(
Line
[
0
]
==
'T'
)
&&
(
Line
[
1
]
==
'i'
)
)
{
Res
=
ReadLibEntryDateAndTime
(
LibEntry
,
Line
);
}
else
if
(
Line
[
0
]
==
'F'
)
{
Res
=
GetLibEntryField
(
LibEntry
,
Line
);
}
else
if
(
strcmp
(
p
,
"ENDDEF"
)
==
0
)
{
break
;
}
else
if
(
strcmp
(
p
,
"DRAW"
)
==
0
)
{
LibEntry
->
m_Drawings
=
GetDrawEntry
(
frame
,
f
,
Line
,
LineNum
);
}
else
if
(
strncmp
(
p
,
"ALIAS"
,
5
)
==
0
)
{
p
=
strtok
(
NULL
,
"
\r\n
"
);
Res
=
AddAliasNames
(
LibEntry
,
p
);
}
else
if
(
strncmp
(
p
,
"$FPLIST"
,
5
)
==
0
)
{
Res
=
AddFootprintFilterList
(
LibEntry
,
f
,
Line
,
LineNum
);
}
else
{
Msg
.
Printf
(
wxT
(
"Undefined command
\"
%s
\"
in line %d, skipped."
),
p
,
*
LineNum
);
frame
->
PrintMsg
(
Msg
);
}
/* Fin analyse de la ligne ou block: test de l'info lue */
if
(
!
Res
)
{
/* Something went wrong there. */
Msg
.
Printf
(
wxT
(
" Error Line %d, Library not loaded"
),
*
LineNum
);
DisplayError
(
frame
,
Msg
);
delete
LibEntry
;
return
NULL
;
}
}
/* If we are here, this part is O.k. - put it in: */
LibEntry
->
SortDrawItems
();
return
LibEntry
;
}
/*****************************************************************************
* Routine to load a DRAW definition from given file. Note "DRAW" line has *
* been read already. Reads upto and include ENDDRAW, or an error (NULL ret). *
*****************************************************************************/
static
LibEDA_BaseStruct
*
GetDrawEntry
(
WinEDA_DrawFrame
*
frame
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
)
static
LibEDA_BaseStruct
*
GetDrawEntry
(
WinEDA_DrawFrame
*
frame
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
)
{
int
i
=
0
,
jj
,
ll
,
Unit
,
Convert
,
size1
,
size2
;
char
*
p
,
Buffer
[
1024
],
BufName
[
256
],
PinNum
[
256
],
chartmp
[
256
],
chartmp1
[
256
];
wxString
MsgLine
;
bool
Error
=
FALSE
;
LibEDA_BaseStruct
*
Tail
=
NULL
,
*
New
=
NULL
,
*
Head
=
NULL
;
while
(
TRUE
)
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
frame
,
wxT
(
"File ended prematurely"
));
return
Head
;
}
if
(
strncmp
(
Line
,
"ENDDRAW"
,
7
)
==
0
)
{
break
;
}
New
=
NULL
;
switch
(
Line
[
0
])
{
case
'A'
:
/* Arc */
{
int
startx
,
starty
,
endx
,
endy
;
LibDrawArc
*
Arc
=
new
LibDrawArc
();
New
=
Arc
;
ll
=
0
;
int
nbarg
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %d %s %d %d %d %d"
,
&
Arc
->
m_Pos
.
x
,
&
Arc
->
m_Pos
.
y
,
&
Arc
->
m_Rayon
,
&
Arc
->
t1
,
&
Arc
->
t2
,
&
Unit
,
&
Convert
,
&
Arc
->
m_Width
,
chartmp
,
&
startx
,
&
starty
,
&
endx
,
&
endy
);
if
(
nbarg
<
8
)
Error
=
TRUE
;
Arc
->
m_Unit
=
Unit
;
Arc
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Arc
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Arc
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
NORMALIZE_ANGLE
(
Arc
->
t1
);
NORMALIZE_ANGLE
(
Arc
->
t2
);
if
(
nbarg
>=
13
)
// Coord reelles des extremites de l'arc lues
{
Arc
->
m_ArcStart
.
x
=
startx
;
Arc
->
m_ArcStart
.
y
=
starty
;
Arc
->
m_ArcEnd
.
x
=
endx
;
Arc
->
m_ArcEnd
.
y
=
endy
;
}
else
{
Arc
->
m_ArcStart
.
x
=
Arc
->
m_Rayon
;
Arc
->
m_ArcStart
.
y
=
0
;
Arc
->
m_ArcEnd
.
x
=
Arc
->
m_Rayon
;
Arc
->
m_ArcEnd
.
y
=
0
;
RotatePoint
(
&
Arc
->
m_ArcStart
.
x
,
&
Arc
->
m_ArcStart
.
y
,
-
Arc
->
t1
);
Arc
->
m_ArcStart
.
x
+=
Arc
->
m_Pos
.
x
;
Arc
->
m_ArcStart
.
y
+=
Arc
->
m_Pos
.
y
;
RotatePoint
(
&
Arc
->
m_ArcEnd
.
x
,
&
Arc
->
m_ArcEnd
.
y
,
-
Arc
->
t2
);
Arc
->
m_ArcEnd
.
x
+=
Arc
->
m_Pos
.
x
;
Arc
->
m_ArcEnd
.
y
+=
Arc
->
m_Pos
.
y
;
}
}
break
;
case
'C'
:
/* Circle */
{
LibDrawCircle
*
Circle
=
new
LibDrawCircle
();
New
=
Circle
;
ll
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %s"
,
&
Circle
->
m_Pos
.
x
,
&
Circle
->
m_Pos
.
y
,
&
Circle
->
m_Rayon
,
&
Unit
,
&
Convert
,
&
Circle
->
m_Width
,
chartmp
)
<
6
;
Circle
->
m_Unit
=
Unit
;
Circle
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Circle
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Circle
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
break
;
case
'T'
:
/* Text */
{
LibDrawText
*
Text
=
new
LibDrawText
();
New
=
Text
;
Buffer
[
0
]
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %s"
,
&
Text
->
m_Horiz
,
&
Text
->
m_Pos
.
x
,
&
Text
->
m_Pos
.
y
,
&
Text
->
m_Size
.
x
,
&
Text
->
m_Type
,
&
Unit
,
&
Convert
,
Buffer
)
!=
8
;
Text
->
m_Unit
=
Unit
;
Text
->
m_Convert
=
Convert
;
Text
->
m_Size
.
y
=
Text
->
m_Size
.
x
;
if
(
!
Error
)
{
/* Convert '~' to spaces. */
Text
->
m_Text
=
CONV_FROM_UTF8
(
Buffer
);
Text
->
m_Text
.
Replace
(
wxT
(
"~"
),
wxT
(
" "
));
// Les espaces sont restitus
}
}
break
;
case
'S'
:
/* Square */
{
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
New
=
Square
;
ll
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %s"
,
&
Square
->
m_Pos
.
x
,
&
Square
->
m_Pos
.
y
,
&
Square
->
m_End
.
x
,
&
Square
->
m_End
.
y
,
&
Unit
,
&
Convert
,
&
Square
->
m_Width
,
chartmp
)
<
7
;
Square
->
m_Unit
=
Unit
;
Square
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Square
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Square
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
break
;
case
'X'
:
/* Pin Description */
{
*
Buffer
=
0
;
LibDrawPin
*
Pin
=
new
LibDrawPin
();
New
=
Pin
;
i
=
sscanf
(
Line
+
2
,
"%s %s %d %d %d %s %d %d %d %d %s %s"
,
BufName
,
PinNum
,
&
Pin
->
m_Pos
.
x
,
&
Pin
->
m_Pos
.
y
,
&
ll
,
chartmp1
,
&
size1
,
&
size2
,
&
Unit
,
&
Convert
,
chartmp
,
Buffer
);
Pin
->
m_PinNumSize
=
size1
;
/* Parametres type short */
Pin
->
m_PinNameSize
=
size2
;
Pin
->
m_PinLen
=
ll
;
Pin
->
m_Orient
=
chartmp1
[
0
]
&
255
;
Pin
->
m_Unit
=
Unit
;
Pin
->
m_Convert
=
Convert
;
strncpy
((
char
*
)
&
Pin
->
m_PinNum
,
PinNum
,
4
);
Error
=
(
i
!=
11
&&
i
!=
12
);
Pin
->
m_PinName
=
CONV_FROM_UTF8
(
BufName
);
jj
=
*
chartmp
&
255
;
switch
(
jj
)
{
case
'I'
:
Pin
->
m_PinType
=
PIN_INPUT
;
break
;
case
'O'
:
Pin
->
m_PinType
=
PIN_OUTPUT
;
break
;
case
'B'
:
Pin
->
m_PinType
=
PIN_BIDI
;
break
;
case
'T'
:
Pin
->
m_PinType
=
PIN_TRISTATE
;
break
;
case
'P'
:
Pin
->
m_PinType
=
PIN_PASSIVE
;
break
;
case
'U'
:
Pin
->
m_PinType
=
PIN_UNSPECIFIED
;
break
;
case
'W'
:
Pin
->
m_PinType
=
PIN_POWER_IN
;
break
;
case
'w'
:
Pin
->
m_PinType
=
PIN_POWER_OUT
;
break
;
case
'C'
:
Pin
->
m_PinType
=
PIN_OPENCOLLECTOR
;
break
;
case
'E'
:
Pin
->
m_PinType
=
PIN_OPENEMITTER
;
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Unknown Pin Type [%c] line %d"
),
jj
,
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
}
if
(
i
==
12
)
/* Special Symbole defined */
for
(
jj
=
strlen
(
Buffer
);
jj
>
0
;
)
{
switch
(
Buffer
[
--
jj
])
{
case
'~'
:
break
;
case
'N'
:
Pin
->
m_Attributs
|=
PINNOTDRAW
;
break
;
case
'I'
:
Pin
->
m_PinShape
|=
INVERT
;
break
;
case
'C'
:
Pin
->
m_PinShape
|=
CLOCK
;
break
;
case
'L'
:
Pin
->
m_PinShape
|=
LOWLEVEL_IN
;
break
;
case
'V'
:
Pin
->
m_PinShape
|=
LOWLEVEL_OUT
;
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Unknown Pin Shape [%c] line %d"
),
Buffer
[
jj
],
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
break
;
}
}
}
break
;
case
'P'
:
/* Polyline */
{
LibDrawPolyline
*
Polyl
=
new
LibDrawPolyline
();
New
=
Polyl
;
if
(
sscanf
(
&
Line
[
2
],
"%d %d %d %d"
,
&
Polyl
->
n
,
&
Unit
,
&
Convert
,
&
Polyl
->
m_Width
)
==
4
&&
Polyl
->
n
>
0
)
{
Polyl
->
m_Unit
=
Unit
;
Polyl
->
m_Convert
=
Convert
;
Polyl
->
PolyList
=
(
int
*
)
MyZMalloc
(
sizeof
(
int
)
*
Polyl
->
n
*
2
);
p
=
strtok
(
&
Line
[
2
],
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
for
(
i
=
0
;
i
<
Polyl
->
n
*
2
&&
!
Error
;
i
++
)
{
p
=
strtok
(
NULL
,
"
\t\n
"
);
Error
=
sscanf
(
p
,
"%d"
,
&
Polyl
->
PolyList
[
i
])
!=
1
;
}
Polyl
->
m_Fill
=
NO_FILL
;
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
))
!=
NULL
)
{
if
(
p
[
0
]
==
'F'
)
Polyl
->
m_Fill
=
FILLED_SHAPE
;
if
(
p
[
0
]
==
'f'
)
Polyl
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
}
else
Error
=
TRUE
;
}
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Undefined DRAW command in line %d, aborted."
),
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
return
Head
;
}
if
(
Error
)
{
MsgLine
.
Printf
(
wxT
(
"Error in %c DRAW command in line %d, aborted."
),
Line
[
0
],
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
delete
New
;
/* FLush till end of draw: */
do
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
frame
,
wxT
(
"File ended prematurely"
)
);
return
Head
;
}
}
while
(
strncmp
(
Line
,
"ENDDRAW"
,
7
)
!=
0
);
return
(
Head
);
}
else
{
if
(
Head
==
NULL
)
Head
=
Tail
=
New
;
else
{
Tail
->
Pnext
=
New
;
Tail
=
New
;
}
}
}
return
Head
;
int
i
=
0
,
jj
,
ll
,
Unit
,
Convert
,
size1
,
size2
;
char
*
p
,
Buffer
[
1024
],
BufName
[
256
],
PinNum
[
256
],
chartmp
[
256
],
chartmp1
[
256
];
wxString
MsgLine
;
bool
Error
=
FALSE
;
LibEDA_BaseStruct
*
Tail
=
NULL
,
*
New
=
NULL
,
*
Head
=
NULL
;
while
(
TRUE
)
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
frame
,
wxT
(
"File ended prematurely"
)
);
return
Head
;
}
if
(
strncmp
(
Line
,
"ENDDRAW"
,
7
)
==
0
)
{
break
;
}
New
=
NULL
;
switch
(
Line
[
0
]
)
{
case
'A'
:
/* Arc */
{
int
startx
,
starty
,
endx
,
endy
;
LibDrawArc
*
Arc
=
new
LibDrawArc
();
New
=
Arc
;
ll
=
0
;
int
nbarg
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %d %s %d %d %d %d"
,
&
Arc
->
m_Pos
.
x
,
&
Arc
->
m_Pos
.
y
,
&
Arc
->
m_Rayon
,
&
Arc
->
t1
,
&
Arc
->
t2
,
&
Unit
,
&
Convert
,
&
Arc
->
m_Width
,
chartmp
,
&
startx
,
&
starty
,
&
endx
,
&
endy
);
if
(
nbarg
<
8
)
Error
=
TRUE
;
Arc
->
m_Unit
=
Unit
;
Arc
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Arc
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Arc
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
NORMALIZE_ANGLE
(
Arc
->
t1
);
NORMALIZE_ANGLE
(
Arc
->
t2
);
if
(
nbarg
>=
13
)
// Coord reelles des extremites de l'arc lues
{
Arc
->
m_ArcStart
.
x
=
startx
;
Arc
->
m_ArcStart
.
y
=
starty
;
Arc
->
m_ArcEnd
.
x
=
endx
;
Arc
->
m_ArcEnd
.
y
=
endy
;
}
else
{
Arc
->
m_ArcStart
.
x
=
Arc
->
m_Rayon
;
Arc
->
m_ArcStart
.
y
=
0
;
Arc
->
m_ArcEnd
.
x
=
Arc
->
m_Rayon
;
Arc
->
m_ArcEnd
.
y
=
0
;
RotatePoint
(
&
Arc
->
m_ArcStart
.
x
,
&
Arc
->
m_ArcStart
.
y
,
-
Arc
->
t1
);
Arc
->
m_ArcStart
.
x
+=
Arc
->
m_Pos
.
x
;
Arc
->
m_ArcStart
.
y
+=
Arc
->
m_Pos
.
y
;
RotatePoint
(
&
Arc
->
m_ArcEnd
.
x
,
&
Arc
->
m_ArcEnd
.
y
,
-
Arc
->
t2
);
Arc
->
m_ArcEnd
.
x
+=
Arc
->
m_Pos
.
x
;
Arc
->
m_ArcEnd
.
y
+=
Arc
->
m_Pos
.
y
;
}
}
break
;
case
'C'
:
/* Circle */
{
LibDrawCircle
*
Circle
=
new
LibDrawCircle
();
New
=
Circle
;
ll
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %s"
,
&
Circle
->
m_Pos
.
x
,
&
Circle
->
m_Pos
.
y
,
&
Circle
->
m_Rayon
,
&
Unit
,
&
Convert
,
&
Circle
->
m_Width
,
chartmp
)
<
6
;
Circle
->
m_Unit
=
Unit
;
Circle
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Circle
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Circle
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
break
;
case
'T'
:
/* Text */
{
LibDrawText
*
Text
=
new
LibDrawText
();
New
=
Text
;
Buffer
[
0
]
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %s"
,
&
Text
->
m_Horiz
,
&
Text
->
m_Pos
.
x
,
&
Text
->
m_Pos
.
y
,
&
Text
->
m_Size
.
x
,
&
Text
->
m_Type
,
&
Unit
,
&
Convert
,
Buffer
)
!=
8
;
Text
->
m_Unit
=
Unit
;
Text
->
m_Convert
=
Convert
;
Text
->
m_Size
.
y
=
Text
->
m_Size
.
x
;
if
(
!
Error
)
{
/* Convert '~' to spaces. */
Text
->
m_Text
=
CONV_FROM_UTF8
(
Buffer
);
Text
->
m_Text
.
Replace
(
wxT
(
"~"
),
wxT
(
" "
)
);
// Les espaces sont restitus
}
}
break
;
case
'S'
:
/* Square */
{
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
New
=
Square
;
ll
=
0
;
Error
=
sscanf
(
&
Line
[
2
],
"%d %d %d %d %d %d %d %s"
,
&
Square
->
m_Pos
.
x
,
&
Square
->
m_Pos
.
y
,
&
Square
->
m_End
.
x
,
&
Square
->
m_End
.
y
,
&
Unit
,
&
Convert
,
&
Square
->
m_Width
,
chartmp
)
<
7
;
Square
->
m_Unit
=
Unit
;
Square
->
m_Convert
=
Convert
;
if
(
chartmp
[
0
]
==
'F'
)
Square
->
m_Fill
=
FILLED_SHAPE
;
if
(
chartmp
[
0
]
==
'f'
)
Square
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
break
;
case
'X'
:
/* Pin Description */
{
*
Buffer
=
0
;
LibDrawPin
*
Pin
=
new
LibDrawPin
();
New
=
Pin
;
i
=
sscanf
(
Line
+
2
,
"%s %s %d %d %d %s %d %d %d %d %s %s"
,
BufName
,
PinNum
,
&
Pin
->
m_Pos
.
x
,
&
Pin
->
m_Pos
.
y
,
&
ll
,
chartmp1
,
&
size1
,
&
size2
,
&
Unit
,
&
Convert
,
chartmp
,
Buffer
);
Pin
->
m_PinNumSize
=
size1
;
/* Parametres type short */
Pin
->
m_PinNameSize
=
size2
;
Pin
->
m_PinLen
=
ll
;
Pin
->
m_Orient
=
chartmp1
[
0
]
&
255
;
Pin
->
m_Unit
=
Unit
;
Pin
->
m_Convert
=
Convert
;
strncpy
(
(
char
*
)
&
Pin
->
m_PinNum
,
PinNum
,
4
);
Error
=
(
i
!=
11
&&
i
!=
12
);
Pin
->
m_PinName
=
CONV_FROM_UTF8
(
BufName
);
jj
=
*
chartmp
&
255
;
switch
(
jj
)
{
case
'I'
:
Pin
->
m_PinType
=
PIN_INPUT
;
break
;
case
'O'
:
Pin
->
m_PinType
=
PIN_OUTPUT
;
break
;
case
'B'
:
Pin
->
m_PinType
=
PIN_BIDI
;
break
;
case
'T'
:
Pin
->
m_PinType
=
PIN_TRISTATE
;
break
;
case
'P'
:
Pin
->
m_PinType
=
PIN_PASSIVE
;
break
;
case
'U'
:
Pin
->
m_PinType
=
PIN_UNSPECIFIED
;
break
;
case
'W'
:
Pin
->
m_PinType
=
PIN_POWER_IN
;
break
;
case
'w'
:
Pin
->
m_PinType
=
PIN_POWER_OUT
;
break
;
case
'C'
:
Pin
->
m_PinType
=
PIN_OPENCOLLECTOR
;
break
;
case
'E'
:
Pin
->
m_PinType
=
PIN_OPENEMITTER
;
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Unknown Pin Type [%c] line %d"
),
jj
,
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
}
if
(
i
==
12
)
/* Special Symbole defined */
for
(
jj
=
strlen
(
Buffer
);
jj
>
0
;
)
{
switch
(
Buffer
[
--
jj
]
)
{
case
'~'
:
break
;
case
'N'
:
Pin
->
m_Attributs
|=
PINNOTDRAW
;
break
;
case
'I'
:
Pin
->
m_PinShape
|=
INVERT
;
break
;
case
'C'
:
Pin
->
m_PinShape
|=
CLOCK
;
break
;
case
'L'
:
Pin
->
m_PinShape
|=
LOWLEVEL_IN
;
break
;
case
'V'
:
Pin
->
m_PinShape
|=
LOWLEVEL_OUT
;
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Unknown Pin Shape [%c] line %d"
),
Buffer
[
jj
],
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
break
;
}
}
}
break
;
case
'P'
:
/* Polyline */
{
LibDrawPolyline
*
Polyl
=
new
LibDrawPolyline
();
New
=
Polyl
;
if
(
sscanf
(
&
Line
[
2
],
"%d %d %d %d"
,
&
Polyl
->
n
,
&
Unit
,
&
Convert
,
&
Polyl
->
m_Width
)
==
4
&&
Polyl
->
n
>
0
)
{
Polyl
->
m_Unit
=
Unit
;
Polyl
->
m_Convert
=
Convert
;
Polyl
->
PolyList
=
(
int
*
)
MyZMalloc
(
sizeof
(
int
)
*
Polyl
->
n
*
2
);
p
=
strtok
(
&
Line
[
2
],
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
p
=
strtok
(
NULL
,
"
\t\n
"
);
for
(
i
=
0
;
i
<
Polyl
->
n
*
2
&&
!
Error
;
i
++
)
{
p
=
strtok
(
NULL
,
"
\t\n
"
);
Error
=
sscanf
(
p
,
"%d"
,
&
Polyl
->
PolyList
[
i
]
)
!=
1
;
}
Polyl
->
m_Fill
=
NO_FILL
;
if
(
(
p
=
strtok
(
NULL
,
"
\t\n
"
)
)
!=
NULL
)
{
if
(
p
[
0
]
==
'F'
)
Polyl
->
m_Fill
=
FILLED_SHAPE
;
if
(
p
[
0
]
==
'f'
)
Polyl
->
m_Fill
=
FILLED_WITH_BG_BODYCOLOR
;
}
}
else
Error
=
TRUE
;
}
break
;
default
:
MsgLine
.
Printf
(
wxT
(
"Undefined DRAW command in line %d, aborted."
),
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
return
Head
;
}
if
(
Error
)
{
MsgLine
.
Printf
(
wxT
(
"Error in %c DRAW command in line %d, aborted."
),
Line
[
0
],
*
LineNum
);
DisplayError
(
frame
,
MsgLine
);
delete
New
;
/* FLush till end of draw: */
do
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
frame
,
wxT
(
"File ended prematurely"
)
);
return
Head
;
}
}
while
(
strncmp
(
Line
,
"ENDDRAW"
,
7
)
!=
0
);
return
Head
;
}
else
{
if
(
Head
==
NULL
)
Head
=
Tail
=
New
;
else
{
Tail
->
Pnext
=
New
;
Tail
=
New
;
}
}
}
return
Head
;
}
/*****************************************************************************
* Routine to find the library given its name. *
*****************************************************************************/
LibraryStruct
*
FindLibrary
(
const
wxString
&
Name
)
LibraryStruct
*
FindLibrary
(
const
wxString
&
Name
)
{
LibraryStruct
*
Lib
=
g_LibraryList
;
while
(
Lib
)
{
if
(
Lib
->
m_Name
==
Name
)
return
Lib
;
Lib
=
Lib
->
m_Pnext
;
}
return
NULL
;
LibraryStruct
*
Lib
=
g_LibraryList
;
while
(
Lib
)
{
if
(
Lib
->
m_Name
==
Name
)
return
Lib
;
Lib
=
Lib
->
m_Pnext
;
}
return
NULL
;
}
/*****************************************************************************
* Routine to find the number of libraries currently loaded. *
*****************************************************************************/
int
NumOfLibraries
(
void
)
int
NumOfLibraries
(
void
)
{
int
ii
;
LibraryStruct
*
Lib
=
g_LibraryList
;
int
ii
;
LibraryStruct
*
Lib
=
g_LibraryList
;
for
(
ii
=
0
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
)
ii
++
;
for
(
ii
=
0
;
Lib
!=
NULL
;
Lib
=
Lib
->
m_Pnext
)
ii
++
;
return
ii
;
return
ii
;
}
/*****************************************************************************/
static
bool
GetLibEntryField
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
)
static
bool
GetLibEntryField
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
)
/*****************************************************************************/
/* Analyse la ligne de description du champ de la forme:
Fn "CA3130" 150 -200 50 H V
ou n = 0 (REFERENCE), 1 (VALUE) , 2 .. 11 = autres champs, facultatifs
*/
*
Fn "CA3130" 150 -200 50 H V
*
ou n = 0 (REFERENCE), 1 (VALUE) , 2 .. 11 = autres champs, facultatifs
*/
{
int
posx
,
posy
,
size
,
orient
,
hjustify
,
vjustify
;
bool
draw
;
char
*
Text
,
Char1
[
256
],
Char2
[
256
],
Char3
[
256
],
Char4
[
256
],
FieldUserName
[
1024
];
int
NumOfField
,
nbparam
;
LibDrawField
*
Field
=
NULL
;
if
(
sscanf
(
line
+
1
,
"%d"
,
&
NumOfField
)
!=
1
)
return
(
0
);
/* Recherche du debut des donnees (debut du texte suivant) */
while
(
*
line
!=
0
)
line
++
;
while
(
*
line
==
0
)
line
++
;
/* recherche du texte */
while
(
*
line
&&
(
*
line
!=
'"'
)
)
line
++
;
if
(
*
line
==
0
)
return
(
0
);
line
++
;
Text
=
line
;
/* recherche fin de texte */
while
(
*
line
&&
(
*
line
!=
'"'
)
)
line
++
;
if
(
*
line
==
0
)
return
(
0
);
*
line
=
0
;
line
++
;
FieldUserName
[
0
]
=
0
;
nbparam
=
sscanf
(
line
,
" %d %d %d %c %c %c %c"
,
&
posx
,
&
posy
,
&
size
,
Char1
,
Char2
,
Char3
,
Char4
);
orient
=
TEXT_ORIENT_HORIZ
;
if
(
Char1
[
0
]
==
'V'
)
orient
=
TEXT_ORIENT_VERT
;
draw
=
TRUE
;
if
(
Char2
[
0
]
==
'I'
)
draw
=
FALSE
;
hjustify
=
GR_TEXT_HJUSTIFY_CENTER
;
vjustify
=
GR_TEXT_VJUSTIFY_CENTER
;
if
(
nbparam
>=
6
)
{
if
(
*
Char3
==
'L'
)
hjustify
=
GR_TEXT_HJUSTIFY_LEFT
;
else
if
(
*
Char3
==
'R'
)
hjustify
=
GR_TEXT_HJUSTIFY_RIGHT
;
if
(
*
Char4
==
'B'
)
vjustify
=
GR_TEXT_VJUSTIFY_BOTTOM
;
else
if
(
*
Char4
==
'T'
)
vjustify
=
GR_TEXT_VJUSTIFY_TOP
;
}
switch
(
NumOfField
)
{
case
REFERENCE
:
Field
=
&
LibEntry
->
m_Prefix
;
Field
->
m_FieldId
=
REFERENCE
;
break
;
case
VALUE
:
Field
=
&
LibEntry
->
m_Name
;
Field
->
m_FieldId
=
VALUE
;
break
;
default
:
if
(
NumOfField
>=
NUMBER_OF_FIELDS
)
break
;
Field
=
new
LibDrawField
(
NumOfField
);
Field
->
Pnext
=
LibEntry
->
Fields
;
LibEntry
->
Fields
=
Field
;
break
;
}
if
(
Field
==
NULL
)
return
FALSE
;
Field
->
m_Pos
.
x
=
posx
;
Field
->
m_Pos
.
y
=
posy
;
Field
->
m_Orient
=
orient
;
if
(
draw
==
FALSE
)
Field
->
m_Attributs
|=
TEXT_NO_VISIBLE
;
Field
->
m_Size
.
x
=
Field
->
m_Size
.
y
=
size
;
Field
->
m_Text
=
CONV_FROM_UTF8
(
Text
);
if
(
NumOfField
>=
FIELD1
)
{
ReadDelimitedText
(
FieldUserName
,
line
,
sizeof
(
FieldUserName
)
);
Field
->
m_Name
=
CONV_FROM_UTF8
(
FieldUserName
);
}
Field
->
m_HJustify
=
hjustify
;
Field
->
m_VJustify
=
vjustify
;
return
(
TRUE
);
int
posx
,
posy
,
size
,
orient
,
hjustify
,
vjustify
;
bool
draw
;
char
*
Text
,
Char1
[
256
],
Char2
[
256
],
Char3
[
256
],
Char4
[
256
],
FieldUserName
[
1024
];
int
NumOfField
,
nbparam
;
LibDrawField
*
Field
=
NULL
;
if
(
sscanf
(
line
+
1
,
"%d"
,
&
NumOfField
)
!=
1
)
return
0
;
/* Recherche du debut des donnees (debut du texte suivant) */
while
(
*
line
!=
0
)
line
++
;
while
(
*
line
==
0
)
line
++
;
/* recherche du texte */
while
(
*
line
&&
(
*
line
!=
'"'
)
)
line
++
;
if
(
*
line
==
0
)
return
0
;
line
++
;
Text
=
line
;
/* recherche fin de texte */
while
(
*
line
&&
(
*
line
!=
'"'
)
)
line
++
;
if
(
*
line
==
0
)
return
0
;
*
line
=
0
;
line
++
;
FieldUserName
[
0
]
=
0
;
nbparam
=
sscanf
(
line
,
" %d %d %d %c %c %c %c"
,
&
posx
,
&
posy
,
&
size
,
Char1
,
Char2
,
Char3
,
Char4
);
orient
=
TEXT_ORIENT_HORIZ
;
if
(
Char1
[
0
]
==
'V'
)
orient
=
TEXT_ORIENT_VERT
;
draw
=
TRUE
;
if
(
Char2
[
0
]
==
'I'
)
draw
=
FALSE
;
hjustify
=
GR_TEXT_HJUSTIFY_CENTER
;
vjustify
=
GR_TEXT_VJUSTIFY_CENTER
;
if
(
nbparam
>=
6
)
{
if
(
*
Char3
==
'L'
)
hjustify
=
GR_TEXT_HJUSTIFY_LEFT
;
else
if
(
*
Char3
==
'R'
)
hjustify
=
GR_TEXT_HJUSTIFY_RIGHT
;
if
(
*
Char4
==
'B'
)
vjustify
=
GR_TEXT_VJUSTIFY_BOTTOM
;
else
if
(
*
Char4
==
'T'
)
vjustify
=
GR_TEXT_VJUSTIFY_TOP
;
}
switch
(
NumOfField
)
{
case
REFERENCE
:
Field
=
&
LibEntry
->
m_Prefix
;
Field
->
m_FieldId
=
REFERENCE
;
break
;
case
VALUE
:
Field
=
&
LibEntry
->
m_Name
;
Field
->
m_FieldId
=
VALUE
;
break
;
default
:
if
(
NumOfField
>=
NUMBER_OF_FIELDS
)
break
;
Field
=
new
LibDrawField
(
NumOfField
);
Field
->
Pnext
=
LibEntry
->
Fields
;
LibEntry
->
Fields
=
Field
;
break
;
}
if
(
Field
==
NULL
)
return
FALSE
;
Field
->
m_Pos
.
x
=
posx
;
Field
->
m_Pos
.
y
=
posy
;
Field
->
m_Orient
=
orient
;
if
(
draw
==
FALSE
)
Field
->
m_Attributs
|=
TEXT_NO_VISIBLE
;
Field
->
m_Size
.
x
=
Field
->
m_Size
.
y
=
size
;
Field
->
m_Text
=
CONV_FROM_UTF8
(
Text
);
if
(
NumOfField
>=
FIELD1
)
{
ReadDelimitedText
(
FieldUserName
,
line
,
sizeof
(
FieldUserName
)
);
Field
->
m_Name
=
CONV_FROM_UTF8
(
FieldUserName
);
}
Field
->
m_HJustify
=
hjustify
;
Field
->
m_VJustify
=
vjustify
;
return
TRUE
;
}
/********************************************************************/
static
bool
AddAliasNames
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
)
static
bool
AddAliasNames
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
line
)
/********************************************************************/
/* Read the alias names (in buffer line) and add them in alias list
names are separated by spaces
*/
*
names are separated by spaces
*/
{
char
*
text
;
wxString
name
;
text
=
strtok
(
line
,
"
\t\r\n
"
);
while
(
text
)
{
name
=
CONV_FROM_UTF8
(
text
);
LibEntry
->
m_AliasList
.
Add
(
name
);
text
=
strtok
(
NULL
,
"
\t\r\n
"
);
}
return
(
TRUE
);
char
*
text
;
wxString
name
;
text
=
strtok
(
line
,
"
\t\r\n
"
);
while
(
text
)
{
name
=
CONV_FROM_UTF8
(
text
);
LibEntry
->
m_AliasList
.
Add
(
name
);
text
=
strtok
(
NULL
,
"
\t\r\n
"
);
}
return
TRUE
;
}
/********************************************************************/
static
void
InsertAlias
(
PriorQue
**
PQ
,
EDA_LibComponentStruct
*
LibEntry
,
int
*
NumOfParts
)
static
void
InsertAlias
(
PriorQue
**
PQ
,
EDA_LibComponentStruct
*
LibEntry
,
int
*
NumOfParts
)
/********************************************************************/
/* create in library (in list PQ) aliases of the "root" component LibEntry*/
{
EDA_LibCmpAliasStruct
*
AliasEntry
;
unsigned
ii
;
if
(
LibEntry
->
m_AliasList
.
GetCount
()
==
0
)
return
;
/* No alias for this component */
for
(
ii
=
0
;
ii
<
LibEntry
->
m_AliasList
.
GetCount
();
ii
++
)
{
AliasEntry
=
new
EDA_LibCmpAliasStruct
(
LibEntry
->
m_AliasList
[
ii
],
LibEntry
->
m_Name
.
m_Text
.
GetData
());
++*
NumOfParts
;
PQInsert
(
PQ
,
AliasEntry
);
}
EDA_LibCmpAliasStruct
*
AliasEntry
;
unsigned
ii
;
if
(
LibEntry
->
m_AliasList
.
GetCount
()
==
0
)
return
;
/* No alias for this component */
for
(
ii
=
0
;
ii
<
LibEntry
->
m_AliasList
.
GetCount
();
ii
++
)
{
AliasEntry
=
new
EDA_LibCmpAliasStruct
(
LibEntry
->
m_AliasList
[
ii
],
LibEntry
->
m_Name
.
m_Text
.
GetData
()
);
++
*
NumOfParts
;
PQInsert
(
PQ
,
AliasEntry
);
}
}
/*******************************************************/
/* Routines de lecture des Documentation de composants */
/*******************************************************/
/*******************************************************/
/* Routines de lecture des Documentation de composants */
/*******************************************************/
/**********************************************************************************************/
int
LoadDocLib
(
WinEDA_DrawFrame
*
frame
,
const
wxString
&
FullDocLibName
,
const
wxString
&
Libname
)
int
LoadDocLib
(
WinEDA_DrawFrame
*
frame
,
const
wxString
&
FullDocLibName
,
const
wxString
&
Libname
)
/**********************************************************************************************/
/* Routine to load a library from given open file.*/
{
int
LineNum
=
0
;
char
Line
[
1024
],
*
Name
,
*
Text
;
EDA_LibComponentStruct
*
Entry
;
FILE
*
f
;
wxString
msg
;
f
=
wxFopen
(
FullDocLibName
,
wxT
(
"rt"
)
);
if
(
f
==
NULL
)
return
(
0
);
if
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
==
NULL
)
{
/* pas de lignes utiles */
fclose
(
f
);
return
0
;
}
if
(
strnicmp
(
Line
,
DOCFILE_IDENT
,
10
)
!=
0
)
{
DisplayError
(
frame
,
wxT
(
"File is NOT EESCHEMA doclib!"
)
);
fclose
(
f
);
return
0
;
}
while
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
))
)
{
if
(
strncmp
(
Line
,
"$CMP"
,
4
)
!=
0
)
{
msg
.
Printf
(
wxT
(
"$CMP command expected in line %d, aborted."
),
LineNum
);
DisplayError
(
frame
,
msg
);
fclose
(
f
);
return
0
;
}
/* Read one $CMP/$ENDCMP part entry from library: */
Name
=
strtok
(
Line
+
5
,
"
\n\r
"
);
wxString
cmpname
;
cmpname
=
CONV_FROM_UTF8
(
Name
);
Entry
=
FindLibPart
(
cmpname
.
GetData
(),
Libname
,
FIND_ALIAS
);
while
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
))
)
{
if
(
strncmp
(
Line
,
"$ENDCMP"
,
7
)
==
0
)
break
;
Text
=
strtok
(
Line
+
2
,
"
\n\r
"
);
switch
(
Line
[
0
]
)
{
case
'D'
:
if
(
Entry
)
Entry
->
m_Doc
=
CONV_FROM_UTF8
(
Text
);
break
;
case
'K'
:
if
(
Entry
)
Entry
->
m_KeyWord
=
CONV_FROM_UTF8
(
Text
);
break
;
case
'F'
:
if
(
Entry
)
Entry
->
m_DocFile
=
CONV_FROM_UTF8
(
Text
);
break
;
}
}
}
fclose
(
f
);
return
1
;
int
LineNum
=
0
;
char
Line
[
1024
],
*
Name
,
*
Text
;
EDA_LibComponentStruct
*
Entry
;
FILE
*
f
;
wxString
msg
;
f
=
wxFopen
(
FullDocLibName
,
wxT
(
"rt"
)
);
if
(
f
==
NULL
)
return
0
;
if
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
==
NULL
)
{
/* pas de lignes utiles */
fclose
(
f
);
return
0
;
}
if
(
strnicmp
(
Line
,
DOCFILE_IDENT
,
10
)
!=
0
)
{
DisplayError
(
frame
,
wxT
(
"File is NOT EESCHEMA doclib!"
)
);
fclose
(
f
);
return
0
;
}
while
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
)
{
if
(
strncmp
(
Line
,
"$CMP"
,
4
)
!=
0
)
{
msg
.
Printf
(
wxT
(
"$CMP command expected in line %d, aborted."
),
LineNum
);
DisplayError
(
frame
,
msg
);
fclose
(
f
);
return
0
;
}
/* Read one $CMP/$ENDCMP part entry from library: */
Name
=
strtok
(
Line
+
5
,
"
\n\r
"
);
wxString
cmpname
;
cmpname
=
CONV_FROM_UTF8
(
Name
);
Entry
=
FindLibPart
(
cmpname
.
GetData
(),
Libname
,
FIND_ALIAS
);
while
(
GetLine
(
f
,
Line
,
&
LineNum
,
sizeof
(
Line
)
)
)
{
if
(
strncmp
(
Line
,
"$ENDCMP"
,
7
)
==
0
)
break
;
Text
=
strtok
(
Line
+
2
,
"
\n\r
"
);
switch
(
Line
[
0
]
)
{
case
'D'
:
if
(
Entry
)
Entry
->
m_Doc
=
CONV_FROM_UTF8
(
Text
);
break
;
case
'K'
:
if
(
Entry
)
Entry
->
m_KeyWord
=
CONV_FROM_UTF8
(
Text
);
break
;
case
'F'
:
if
(
Entry
)
Entry
->
m_DocFile
=
CONV_FROM_UTF8
(
Text
);
break
;
}
}
}
fclose
(
f
);
return
1
;
}
/*********************************************************************************/
static
bool
ReadLibEntryDateAndTime
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
Line
)
static
bool
ReadLibEntryDateAndTime
(
EDA_LibComponentStruct
*
LibEntry
,
char
*
Line
)
/*********************************************************************************/
/* lit date et time de modif composant sous le format:
"Ti yy/mm/jj hh:mm:ss"
*/
*
"Ti yy/mm/jj hh:mm:ss"
*/
{
int
year
,
mon
,
day
,
hour
,
min
,
sec
;
char
*
text
;
int
year
,
mon
,
day
,
hour
,
min
,
sec
;
char
*
text
;
year
=
mon
=
day
=
hour
=
min
=
sec
=
0
;
text
=
strtok
(
Line
,
"
\r\t\n
"
);
text
=
strtok
(
NULL
,
"
\r\t\n
"
);
// text pointe donnees utiles
year
=
mon
=
day
=
hour
=
min
=
sec
=
0
;
text
=
strtok
(
Line
,
"
\r\t\n
"
);
text
=
strtok
(
NULL
,
"
\r\t\n
"
);
// text pointe donnees utiles
sscanf
(
Line
,
"%d/%d/%d %d:%d:%d"
,
&
year
,
&
mon
,
&
day
,
&
hour
,
&
min
,
&
sec
);
sscanf
(
Line
,
"%d/%d/%d %d:%d:%d"
,
&
year
,
&
mon
,
&
day
,
&
hour
,
&
min
,
&
sec
);
LibEntry
->
m_LastDate
=
(
sec
&
63
)
+
((
min
&
63
)
<<
6
)
+
((
hour
&
31
)
<<
12
)
+
((
day
&
31
)
<<
17
)
+
((
mon
&
15
)
<<
22
)
+
((
year
-
1990
)
<<
26
);
LibEntry
->
m_LastDate
=
(
sec
&
63
)
+
(
(
min
&
63
)
<<
6
)
+
(
(
hour
&
31
)
<<
12
)
+
(
(
day
&
31
)
<<
17
)
+
(
(
mon
&
15
)
<<
22
)
+
(
(
year
-
1990
)
<<
26
);
return
TRUE
;
return
TRUE
;
}
/*******************************************/
static
int
SortItemsFct
(
const
void
*
ref
,
const
void
*
item
);
void
EDA_LibComponentStruct
::
SortDrawItems
(
void
)
static
int
SortItemsFct
(
const
void
*
ref
,
const
void
*
item
);
void
EDA_LibComponentStruct
::
SortDrawItems
(
void
)
/*******************************************/
/* Trie les lments graphiques d'un composant lib pour amliorer
le trac:
items remplis en premier, pins en dernier
En cas de superposition d'items, c'est plus lisible
*/
*
le trac:
*
items remplis en premier, pins en dernier
*
En cas de superposition d'items, c'est plus lisible
*/
{
LibEDA_BaseStruct
**
Bufentry
,
**
BufentryBase
,
*
Entry
=
m_Drawings
;
int
ii
,
nbitems
;
if
(
Entry
==
NULL
)
return
;
/* Pas d'alias pour ce composant */
/* calcul du nombre d'items */
for
(
nbitems
=
0
;
Entry
!=
NULL
;
Entry
=
Entry
->
Next
())
nbitems
++
;
BufentryBase
=
(
LibEDA_BaseStruct
**
)
MyZMalloc
(
(
nbitems
+
1
)
*
sizeof
(
LibEDA_BaseStruct
*
));
/* memorisation du chainage : */
for
(
Entry
=
m_Drawings
,
ii
=
0
;
Entry
!=
NULL
;
Entry
=
Entry
->
Next
())
BufentryBase
[
ii
++
]
=
Entry
;
/* Tri du chainage */
qsort
(
BufentryBase
,
nbitems
,
sizeof
(
LibEDA_BaseStruct
*
),
SortItemsFct
);
/* Mise a jour du chainage. Remarque:
le dernier element de BufEntryBase (BufEntryBase[nbitems]) est NULL*/
m_Drawings
=
*
BufentryBase
;
Bufentry
=
BufentryBase
;
for
(
ii
=
0
;
ii
<
nbitems
;
ii
++
)
{
(
*
Bufentry
)
->
Pnext
=
*
(
Bufentry
+
1
);
Bufentry
++
;
}
MyFree
(
BufentryBase
);
LibEDA_BaseStruct
**
Bufentry
,
**
BufentryBase
,
*
Entry
=
m_Drawings
;
int
ii
,
nbitems
;
if
(
Entry
==
NULL
)
return
;
/* Pas d'alias pour ce composant */
/* calcul du nombre d'items */
for
(
nbitems
=
0
;
Entry
!=
NULL
;
Entry
=
Entry
->
Next
()
)
nbitems
++
;
BufentryBase
=
(
LibEDA_BaseStruct
**
)
MyZMalloc
(
(
nbitems
+
1
)
*
sizeof
(
LibEDA_BaseStruct
*
)
);
/* memorisation du chainage : */
for
(
Entry
=
m_Drawings
,
ii
=
0
;
Entry
!=
NULL
;
Entry
=
Entry
->
Next
()
)
BufentryBase
[
ii
++
]
=
Entry
;
/* Tri du chainage */
qsort
(
BufentryBase
,
nbitems
,
sizeof
(
LibEDA_BaseStruct
*
),
SortItemsFct
);
/* Mise a jour du chainage. Remarque:
* le dernier element de BufEntryBase (BufEntryBase[nbitems]) est NULL*/
m_Drawings
=
*
BufentryBase
;
Bufentry
=
BufentryBase
;
for
(
ii
=
0
;
ii
<
nbitems
;
ii
++
)
{
(
*
Bufentry
)
->
Pnext
=
*
(
Bufentry
+
1
);
Bufentry
++
;
}
MyFree
(
BufentryBase
);
}
int
SortItemsFct
(
const
void
*
ref
,
const
void
*
item
)
int
SortItemsFct
(
const
void
*
ref
,
const
void
*
item
)
{
#define Ref
(*(LibEDA_BaseStruct **)(ref)
)
#define Item
(*(LibEDA_BaseStruct **)(item)
)
#define Ref
( *(LibEDA_BaseStruct**) (ref)
)
#define Item
( *(LibEDA_BaseStruct**) (item)
)
#define BEFORE -1
#define AFTER 1
int
fill_ref
=
0
,
fill_item
=
0
;
switch
(
Ref
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
const
LibDrawArc
*
draw
=
(
const
LibDrawArc
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
const
LibDrawCircle
*
draw
=
(
const
LibDrawCircle
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_RECT_DRAW_TYPE
:
{
const
LibDrawSquare
*
draw
=
(
const
LibDrawSquare
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
const
LibDrawPolyline
*
draw
=
(
const
LibDrawPolyline
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
if
(
Item
->
m_StructType
==
COMPONENT_PIN_DRAW_TYPE
)
return
BEFORE
;
if
(
Item
->
m_StructType
==
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
)
return
0
;
return
1
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
if
(
Item
->
m_StructType
==
COMPONENT_PIN_DRAW_TYPE
)
{
int
ii
;
// We sort the pins by orientation
ii
=
((
LibDrawPin
*
)
Ref
)
->
m_Orient
-
((
LibDrawPin
*
)
Item
)
->
m_Orient
;
if
(
ii
)
return
ii
;
/* We sort the pins by position (x or y).
note: at this point, most of pins have same x pos or y pos,
because they are sorted by orientation and generally are vertically or
horizontally aligned */
wxPoint
pos_ref
,
pos_tst
;
pos_ref
=
((
LibDrawPin
*
)
Ref
)
->
m_Pos
;
pos_tst
=
((
LibDrawPin
*
)
Item
)
->
m_Pos
;
if
(
(
ii
=
pos_ref
.
x
-
pos_tst
.
x
)
)
return
ii
;
ii
=
pos_ref
.
y
-
pos_tst
.
y
;
return
ii
;
}
else
return
AFTER
;
break
;
}
/* Test de l'item */
switch
(
Item
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
const
LibDrawArc
*
draw
=
(
const
LibDrawArc
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
const
LibDrawCircle
*
draw
=
(
const
LibDrawCircle
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_RECT_DRAW_TYPE
:
{
const
LibDrawSquare
*
draw
=
(
const
LibDrawSquare
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
const
LibDrawPolyline
*
draw
=
(
const
LibDrawPolyline
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
return
BEFORE
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
return
BEFORE
;
break
;
}
if
(
fill_ref
&
fill_item
)
return
0
;
if
(
fill_ref
)
return
BEFORE
;
return
AFTER
;
#define AFTER 1
int
fill_ref
=
0
,
fill_item
=
0
;
switch
(
Ref
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
const
LibDrawArc
*
draw
=
(
const
LibDrawArc
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
const
LibDrawCircle
*
draw
=
(
const
LibDrawCircle
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_RECT_DRAW_TYPE
:
{
const
LibDrawSquare
*
draw
=
(
const
LibDrawSquare
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
const
LibDrawPolyline
*
draw
=
(
const
LibDrawPolyline
*
)
Ref
;
fill_ref
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
if
(
Item
->
m_StructType
==
COMPONENT_PIN_DRAW_TYPE
)
return
BEFORE
;
if
(
Item
->
m_StructType
==
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
)
return
0
;
return
1
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
if
(
Item
->
m_StructType
==
COMPONENT_PIN_DRAW_TYPE
)
{
int
ii
;
// We sort the pins by orientation
ii
=
(
(
LibDrawPin
*
)
Ref
)
->
m_Orient
-
(
(
LibDrawPin
*
)
Item
)
->
m_Orient
;
if
(
ii
)
return
ii
;
/* We sort the pins by position (x or y).
* note: at this point, most of pins have same x pos or y pos,
* because they are sorted by orientation and generally are vertically or
* horizontally aligned */
wxPoint
pos_ref
,
pos_tst
;
pos_ref
=
(
(
LibDrawPin
*
)
Ref
)
->
m_Pos
;
pos_tst
=
(
(
LibDrawPin
*
)
Item
)
->
m_Pos
;
if
(
(
ii
=
pos_ref
.
x
-
pos_tst
.
x
)
)
return
ii
;
ii
=
pos_ref
.
y
-
pos_tst
.
y
;
return
ii
;
}
else
return
AFTER
;
break
;
default
:
;
}
/* Test de l'item */
switch
(
Item
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
const
LibDrawArc
*
draw
=
(
const
LibDrawArc
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
const
LibDrawCircle
*
draw
=
(
const
LibDrawCircle
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_RECT_DRAW_TYPE
:
{
const
LibDrawSquare
*
draw
=
(
const
LibDrawSquare
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
const
LibDrawPolyline
*
draw
=
(
const
LibDrawPolyline
*
)
Item
;
fill_item
=
draw
->
m_Fill
;
break
;
}
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
return
BEFORE
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
return
BEFORE
;
break
;
default
:
;
}
if
(
fill_ref
&
fill_item
)
return
0
;
if
(
fill_ref
)
return
BEFORE
;
return
AFTER
;
}
/*****************************************************************************/
int
AddFootprintFilterList
(
EDA_LibComponentStruct
*
LibEntryLibEntry
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
)
int
AddFootprintFilterList
(
EDA_LibComponentStruct
*
LibEntryLibEntry
,
FILE
*
f
,
char
*
Line
,
int
*
LineNum
)
/******************************************************************************/
/* read the FootprintFilter List stating with:
FPLIST
and ending with:
ENDFPLIST
*/
*
FPLIST
*
and ending with:
*
ENDFPLIST
*/
{
for
(
;
;
)
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
NULL
,
wxT
(
"File ended prematurely"
)
);
return
0
;
}
if
(
stricmp
(
Line
,
"$ENDFPLIST"
)
==
0
)
{
break
;
/*normal exit on end of list */
}
LibEntryLibEntry
->
m_FootprintList
.
Add
(
CONV_FROM_UTF8
(
Line
+
1
)
);
}
return
1
;
for
(
;
;
)
{
if
(
GetLine
(
f
,
Line
,
LineNum
,
1024
)
==
NULL
)
{
DisplayError
(
NULL
,
wxT
(
"File ended prematurely"
)
);
return
0
;
}
if
(
stricmp
(
Line
,
"$ENDFPLIST"
)
==
0
)
{
break
;
/*normal exit on end of list */
}
LibEntryLibEntry
->
m_FootprintList
.
Add
(
CONV_FROM_UTF8
(
Line
+
1
)
);
}
return
1
;
}
eeschema/hotkeys.cpp
View file @
f3c324d5
...
...
@@ -212,6 +212,8 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition;
}
ChangeTextOrient
(
(
DrawTextStruct
*
)
DrawStruct
,
DC
);
break
;
default
:
;
}
break
;
...
...
eeschema/libclass.cpp
View file @
f3c324d5
...
...
@@ -13,695 +13,780 @@
#include "protos.h"
/*******************************************************/
/* Methodes relatives a la manipulation des librairies */
/*******************************************************/
/*******************************************************/
/* Methodes relatives a la manipulation des librairies */
/*******************************************************/
/***************************************************************************************/
LibraryStruct
::
LibraryStruct
(
int
type
,
const
wxString
&
name
,
const
wxString
&
fullname
)
LibraryStruct
::
LibraryStruct
(
int
type
,
const
wxString
&
name
,
const
wxString
&
fullname
)
/***************************************************************************************/
{
m_Type
=
type
;
/* type indicator */
m_Name
=
name
;
/* Name of library loaded. */
m_FullFileName
=
fullname
;
/* Full File Name (with path) of library loaded. */
m_NumOfParts
=
0
;
/* Number of parts this library has. */
m_Entries
=
NULL
;
/* Parts themselves are saved here. */
m_Pnext
=
NULL
;
/* Point on next lib in chain. */
m_Modified
=
FALSE
;
/* flag indicateur d'edition */
m_TimeStamp
=
0
;
m_Flags
=
0
;
m_IsLibCache
=
FALSE
;
m_Type
=
type
;
/* type indicator */
m_Name
=
name
;
/* Name of library loaded. */
m_FullFileName
=
fullname
;
/* Full File Name (with path) of library loaded. */
m_NumOfParts
=
0
;
/* Number of parts this library has. */
m_Entries
=
NULL
;
/* Parts themselves are saved here. */
m_Pnext
=
NULL
;
/* Point on next lib in chain. */
m_Modified
=
FALSE
;
/* flag indicateur d'edition */
m_TimeStamp
=
0
;
m_Flags
=
0
;
m_IsLibCache
=
FALSE
;
}
/*****************************************/
void
FreeLibraryEntry
(
LibCmpEntry
*
Entry
)
void
FreeLibraryEntry
(
LibCmpEntry
*
Entry
)
/*****************************************/
/* Used by PQFreeFunc() to delete all entries
*/
*/
{
delete
Entry
;
delete
Entry
;
}
/******************************/
LibraryStruct
::~
LibraryStruct
()
/******************************/
{
if
(
m_Entries
)
PQFreeFunc
(
m_Entries
,
(
void
(
*
)(
void
*
))
FreeLibraryEntry
);
if
(
m_Entries
)
PQFreeFunc
(
m_Entries
,
(
void
(
*
)
(
void
*
)
)
FreeLibraryEntry
);
}
/*******************************************/
bool
LibraryStruct
::
WriteHeader
(
FILE
*
file
)
bool
LibraryStruct
::
WriteHeader
(
FILE
*
file
)
/*******************************************/
/* Ecrit l'entete du fichier librairie
*/
*/
{
char
BufLine
[
1024
];
bool
succes
=
TRUE
;
char
BufLine
[
1024
];
bool
succes
=
TRUE
;
DateAndTime
(
BufLine
);
if
(
fprintf
(
file
,
"%s %d.%d Date: %s
\n
"
,
LIBFILE_IDENT
,
LIB_VERSION_MAJOR
,
LIB_VERSION_MINOR
,
BufLine
)
!=
5
)
succes
=
FALSE
;
DateAndTime
(
BufLine
);
if
(
fprintf
(
file
,
"%s %d.%d Date: %s
\n
"
,
LIBFILE_IDENT
,
LIB_VERSION_MAJOR
,
LIB_VERSION_MINOR
,
BufLine
)
!=
5
)
succes
=
FALSE
;
#if 0
if ( fprintf(file,"$HEADER\n") != 1 ) succes = FALSE;
if ( fprintf(file,"TimeStamp %8.8lX\n", m_TimeStamp) != 2 ) succes = FALSE;
if ( fprintf(file,"Parts %d\n", m_NumOfParts) != 2 ) succes = FALSE;
if ( fprintf(file,"$ENDHEADER\n") != 1 ) succes = FALSE;
if( fprintf( file, "$HEADER\n" ) != 1 )
succes = FALSE;
if( fprintf( file, "TimeStamp %8.8lX\n", m_TimeStamp ) != 2 )
succes = FALSE;
if( fprintf( file, "Parts %d\n", m_NumOfParts ) != 2 )
succes = FALSE;
if( fprintf( file, "$ENDHEADER\n" ) != 1 )
succes = FALSE;
#endif
return
(
succes
)
;
return
succes
;
}
/***********************************************************/
bool
LibraryStruct
::
ReadHeader
(
FILE
*
libfile
,
int
*
LineNum
)
bool
LibraryStruct
::
ReadHeader
(
FILE
*
libfile
,
int
*
LineNum
)
/***********************************************************/
/* Ecrit l'entete du fichier librairie
*/
*/
{
char
Line
[
1024
],
*
text
,
*
data
;
char
Line
[
1024
],
*
text
,
*
data
;
while
(
GetLine
(
libfile
,
Line
,
LineNum
,
sizeof
(
Line
)
)
)
{
text
=
strtok
(
Line
,
"
\t\r\n
"
);
data
=
strtok
(
NULL
,
"
\t\r\n
"
);
if
(
stricmp
(
text
,
"TimeStamp"
)
==
0
)
m_TimeStamp
=
atol
(
data
);
if
(
stricmp
(
text
,
"$ENDHEADER"
)
==
0
)
return
TRUE
;
}
while
(
GetLine
(
libfile
,
Line
,
LineNum
,
sizeof
(
Line
))
)
{
text
=
strtok
(
Line
,
"
\t\r\n
"
);
data
=
strtok
(
NULL
,
"
\t\r\n
"
);
if
(
stricmp
(
text
,
"TimeStamp"
)
==
0
)
m_TimeStamp
=
atol
(
data
);
if
(
stricmp
(
text
,
"$ENDHEADER"
)
==
0
)
return
TRUE
;
}
return
FALSE
;
return
FALSE
;
}
/*********************/
/* class LibCmpEntry */
/*********************/
/*********************/
/* class LibCmpEntry */
/*********************/
/* Basic class for librarty oomponent description
Not directly used
Used to create the 2 derived classes :
- EDA_LibCmpAliasStruct
- EDA_LibComponentStruct
*/
*
Not directly used
*
Used to create the 2 derived classes :
*
- EDA_LibCmpAliasStruct
*
- EDA_LibComponentStruct
*/
/********************************************************************/
LibCmpEntry
::
LibCmpEntry
(
LibrEntryType
CmpType
,
const
wxChar
*
CmpName
)
:
EDA_BaseStruct
(
LIBCOMPONENT_STRUCT_TYPE
)
LibCmpEntry
::
LibCmpEntry
(
LibrEntryType
CmpType
,
const
wxChar
*
CmpName
)
:
EDA_BaseStruct
(
LIBCOMPONENT_STRUCT_TYPE
)
/********************************************************************/
{
Type
=
CmpType
;
m_Name
.
m_FieldId
=
VALUE
;
if
(
CmpName
)
m_Name
.
m_Text
=
CmpName
;
Type
=
CmpType
;
m_Name
.
m_FieldId
=
VALUE
;
if
(
CmpName
)
m_Name
.
m_Text
=
CmpName
;
}
/******************************/
LibCmpEntry
::~
LibCmpEntry
(
void
)
LibCmpEntry
::~
LibCmpEntry
(
void
)
/******************************/
{
}
/*******************************/
/* class EDA_LibCmpAliasStruct */
/*******************************/
/*******************************/
/* class EDA_LibCmpAliasStruct */
/*******************************/
/* Class to define an alias of a component
An alias uses the component defintion (graphic, pins...)
but has its own name and documentation.
Therefore, when the component is modified, alias of this component are modified.
This is a simple method to create components with differs very few
(like 74LS00, 74HC00 ... and many op amps )
*/
*
An alias uses the component defintion (graphic, pins...)
*
but has its own name and documentation.
*
Therefore, when the component is modified, alias of this component are modified.
*
This is a simple method to create components with differs very few
*
(like 74LS00, 74HC00 ... and many op amps )
*/
EDA_LibCmpAliasStruct
::
EDA_LibCmpAliasStruct
(
const
wxChar
*
CmpName
,
const
wxChar
*
CmpRootName
)
:
LibCmpEntry
(
ALIAS
,
CmpName
)
EDA_LibCmpAliasStruct
::
EDA_LibCmpAliasStruct
(
const
wxChar
*
CmpName
,
const
wxChar
*
CmpRootName
)
:
LibCmpEntry
(
ALIAS
,
CmpName
)
{
if
(
CmpRootName
==
NULL
)
m_RootName
.
Empty
();
else
m_RootName
=
CmpRootName
;
if
(
CmpRootName
==
NULL
)
m_RootName
.
Empty
();
else
m_RootName
=
CmpRootName
;
}
EDA_LibCmpAliasStruct
::~
EDA_LibCmpAliasStruct
(
void
)
EDA_LibCmpAliasStruct
::~
EDA_LibCmpAliasStruct
(
void
)
{
}
/********************************/
/* class EDA_LibComponentStruct */
/********************************/
/********************************/
/* class EDA_LibComponentStruct */
/********************************/
/* This is a standard component (in library)
*/
EDA_LibComponentStruct
::
EDA_LibComponentStruct
(
const
wxChar
*
CmpName
)
:
LibCmpEntry
(
ROOT
,
CmpName
)
*/
EDA_LibComponentStruct
::
EDA_LibComponentStruct
(
const
wxChar
*
CmpName
)
:
LibCmpEntry
(
ROOT
,
CmpName
)
{
m_Drawings
=
NULL
;
m_LastDate
=
0
;
m_UnitCount
=
1
;
m_TextInside
=
40
;
m_Options
=
ENTRY_NORMAL
;
m_UnitSelectionLocked
=
FALSE
;
m_DrawPinNum
=
m_DrawPinName
=
1
;
m_Drawings
=
NULL
;
m_LastDate
=
0
;
m_UnitCount
=
1
;
m_TextInside
=
40
;
m_Options
=
ENTRY_NORMAL
;
m_UnitSelectionLocked
=
FALSE
;
m_DrawPinNum
=
m_DrawPinName
=
1
;
Fields
=
NULL
;
m_Prefix
.
m_FieldId
=
REFERENCE
;
Fields
=
NULL
;
m_Prefix
.
m_FieldId
=
REFERENCE
;
}
/******************************************************/
EDA_LibComponentStruct
::~
EDA_LibComponentStruct
(
void
)
/******************************************************/
{
LibEDA_BaseStruct
*
DrawItem
,
*
NextDrawItem
;
LibDrawField
*
TempField
,
*
field
;
LibEDA_BaseStruct
*
DrawItem
,
*
NextDrawItem
;
LibDrawField
*
TempField
,
*
field
;
field
=
Fields
;
Fields
=
NULL
;
while
(
field
)
{
TempField
=
field
;
field
=
(
LibDrawField
*
)
field
->
Pnext
;
delete
TempField
;
}
field
=
Fields
;
Fields
=
NULL
;
while
(
field
)
{
TempField
=
field
;
field
=
(
LibDrawField
*
)
field
->
Pnext
;
delete
TempField
;
}
/* suppression des elements dependants */
DrawItem
=
m_Drawings
;
m_Drawings
=
NULL
;
while
(
DrawItem
)
{
NextDrawItem
=
DrawItem
->
Next
();
delete
DrawItem
;
DrawItem
=
NextDrawItem
;
}
/* suppression des elements dependants */
DrawItem
=
m_Drawings
;
m_Drawings
=
NULL
;
while
(
DrawItem
)
{
NextDrawItem
=
DrawItem
->
Next
();
delete
DrawItem
;
DrawItem
=
NextDrawItem
;
}
}
/**********************************************************************/
EDA_Rect
EDA_LibComponentStruct
::
GetBoundaryBox
(
int
Unit
,
int
Convert
)
EDA_Rect
EDA_LibComponentStruct
::
GetBoundaryBox
(
int
Unit
,
int
Convert
)
/**********************************************************************/
/* Return the componenty boundary box ( in user coordinates )
The unit Unit, and the shape Convert are considered.
If Unit == 0, Unit is not used
if Convert == 0 Convert is non used
**/
{
int
xmin
,
xmax
,
ymin
,
ymax
,
x1
,
y1
;
int
*
pt
,
ii
;
LibEDA_BaseStruct
*
DrawEntry
;
EDA_Rect
BoundaryBox
;
DrawEntry
=
m_Drawings
;
if
(
DrawEntry
)
{
xmin
=
ymin
=
0x7FFFFFFF
;
xmax
=
ymax
=
0x80000000
;
}
else
{
xmin
=
ymin
=
-
50
;
xmax
=
ymax
=
50
;
// Min size in 1/1000 inch
}
for
(
;
DrawEntry
!=
NULL
;
DrawEntry
=
DrawEntry
->
Next
()
)
{
if
(
DrawEntry
->
m_Unit
>
0
)
// The item is non common to units
if
(
(
m_UnitCount
>
1
)
&&
(
Unit
>
0
)
&&
(
Unit
!=
DrawEntry
->
m_Unit
)
)
continue
;
if
(
DrawEntry
->
m_Convert
>
0
)
//The item is not common to alls convert
if
(
(
Convert
>
0
)
&&
(
Convert
!=
DrawEntry
->
m_Convert
)
)
continue
;
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
// Arc is reduced to a line from m_Start to m_End.
// TO DO better.
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DrawEntry
;
x1
=
Arc
->
m_ArcStart
.
x
;
y1
=
Arc
->
m_ArcStart
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
x1
=
Arc
->
m_ArcEnd
.
x
;
y1
=
Arc
->
m_ArcEnd
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DrawEntry
;
x1
=
Circle
->
m_Pos
.
x
-
Circle
->
m_Rayon
;
y1
=
Circle
->
m_Pos
.
y
-
Circle
->
m_Rayon
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
x1
=
Circle
->
m_Pos
.
x
+
Circle
->
m_Rayon
;
y1
=
Circle
->
m_Pos
.
y
+
Circle
->
m_Rayon
;
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DrawEntry
;
xmin
=
MIN
(
xmin
,
Square
->
m_Pos
.
x
);
xmin
=
MIN
(
xmin
,
Square
->
m_End
.
x
);
xmax
=
MAX
(
xmax
,
Square
->
m_Pos
.
x
);
xmax
=
MAX
(
xmax
,
Square
->
m_End
.
x
);
ymin
=
MIN
(
ymin
,
Square
->
m_Pos
.
y
);
ymin
=
MIN
(
ymin
,
Square
->
m_End
.
y
);
ymax
=
MAX
(
ymax
,
Square
->
m_Pos
.
y
);
ymax
=
MAX
(
ymax
,
Square
->
m_End
.
y
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawEntry
;
x1
=
Pin
->
m_Pos
.
x
;
y1
=
Pin
->
m_Pos
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
xmax
=
MAX
(
xmax
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
ymax
=
MAX
(
ymax
,
y1
);
#if 0 // 0 pour englober le point origine de la pin, 1 pour englober toute la pin
switch ( Pin->Orient )
{
case PIN_UP: y1 += Pin->Len; break;
case PIN_DOWN: y1 -= Pin->Len; break;
case PIN_LEFT: x1 -= Pin->Len; break;
case PIN_RIGHT: x1 += Pin->Len; break;
}
xmin = MIN(xmin, x1);
xmax = MAX(xmax, x1);
ymin = MIN(ymin, y1);
ymax = MAX(ymax, y1);
* The unit Unit, and the shape Convert are considered.
* If Unit == 0, Unit is not used
* if Convert == 0 Convert is non used
**/
{
int
xmin
,
xmax
,
ymin
,
ymax
,
x1
,
y1
;
int
*
pt
,
ii
;
LibEDA_BaseStruct
*
DrawEntry
;
EDA_Rect
BoundaryBox
;
DrawEntry
=
m_Drawings
;
if
(
DrawEntry
)
{
xmin
=
ymin
=
0x7FFFFFFF
;
xmax
=
ymax
=
0x80000000
;
}
else
{
xmin
=
ymin
=
-
50
;
xmax
=
ymax
=
50
;
// Min size in 1/1000 inch
}
for
(
;
DrawEntry
!=
NULL
;
DrawEntry
=
DrawEntry
->
Next
()
)
{
if
(
DrawEntry
->
m_Unit
>
0
)
// The item is non common to units
if
(
(
m_UnitCount
>
1
)
&&
(
Unit
>
0
)
&&
(
Unit
!=
DrawEntry
->
m_Unit
)
)
continue
;
if
(
DrawEntry
->
m_Convert
>
0
)
//The item is not common to alls convert
if
(
(
Convert
>
0
)
&&
(
Convert
!=
DrawEntry
->
m_Convert
)
)
continue
;
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
// Arc is reduced to a line from m_Start to m_End.
// TO DO better.
LibDrawArc
*
Arc
=
(
LibDrawArc
*
)
DrawEntry
;
x1
=
Arc
->
m_ArcStart
.
x
;
y1
=
Arc
->
m_ArcStart
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
x1
=
Arc
->
m_ArcEnd
.
x
;
y1
=
Arc
->
m_ArcEnd
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
(
LibDrawCircle
*
)
DrawEntry
;
x1
=
Circle
->
m_Pos
.
x
-
Circle
->
m_Rayon
;
y1
=
Circle
->
m_Pos
.
y
-
Circle
->
m_Rayon
;
xmin
=
MIN
(
xmin
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
x1
=
Circle
->
m_Pos
.
x
+
Circle
->
m_Rayon
;
y1
=
Circle
->
m_Pos
.
y
+
Circle
->
m_Rayon
;
xmax
=
MAX
(
xmax
,
x1
);
ymax
=
MAX
(
ymax
,
y1
);
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
(
LibDrawSquare
*
)
DrawEntry
;
xmin
=
MIN
(
xmin
,
Square
->
m_Pos
.
x
);
xmin
=
MIN
(
xmin
,
Square
->
m_End
.
x
);
xmax
=
MAX
(
xmax
,
Square
->
m_Pos
.
x
);
xmax
=
MAX
(
xmax
,
Square
->
m_End
.
x
);
ymin
=
MIN
(
ymin
,
Square
->
m_Pos
.
y
);
ymin
=
MIN
(
ymin
,
Square
->
m_End
.
y
);
ymax
=
MAX
(
ymax
,
Square
->
m_Pos
.
y
);
ymax
=
MAX
(
ymax
,
Square
->
m_End
.
y
);
}
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
{
LibDrawPin
*
Pin
=
(
LibDrawPin
*
)
DrawEntry
;
x1
=
Pin
->
m_Pos
.
x
;
y1
=
Pin
->
m_Pos
.
y
;
xmin
=
MIN
(
xmin
,
x1
);
xmax
=
MAX
(
xmax
,
x1
);
ymin
=
MIN
(
ymin
,
y1
);
ymax
=
MAX
(
ymax
,
y1
);
#if 0 \
// 0 pour englober le point origine de la pin, 1 pour englober toute la pin
switch( Pin->Orient )
{
case PIN_UP:
y1 += Pin->Len; break;
case PIN_DOWN:
y1 -= Pin->Len; break;
case PIN_LEFT:
x1 -= Pin->Len; break;
case PIN_RIGHT:
x1 += Pin->Len; break;
}
xmin = MIN( xmin, x1 );
xmax = MAX( xmax, x1 );
ymin = MIN( ymin, y1 );
ymax = MAX( ymax, y1 );
#endif
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DrawEntry
;
pt
=
polyline
->
PolyList
;
for
(
ii
=
0
;
ii
<
polyline
->
n
;
ii
++
)
{
if
(
xmin
>
*
pt
)
xmin
=
*
pt
;
if
(
xmax
<
*
pt
)
xmax
=
*
pt
;
pt
++
;
if
(
ymin
>
*
pt
)
ymin
=
*
pt
;
if
(
ymax
<
*
pt
)
ymax
=
*
pt
;
pt
++
;
}
}
break
;
}
}
// Update the BoundaryBox. Remenber the fact the screen Y axis is the reverse */
ymax
=
-
ymax
;
ymin
=
-
ymin
;
// Y is is screen axis sense
// Ensure w and H > 0 (wxRect assume it)
if
(
xmax
<
xmin
)
EXCHG
(
xmax
,
xmin
);
if
(
ymax
<
ymin
)
EXCHG
(
ymax
,
ymin
);
BoundaryBox
.
SetX
(
xmin
);
BoundaryBox
.
SetWidth
(
xmax
-
xmin
);
BoundaryBox
.
SetY
(
ymin
);
BoundaryBox
.
SetHeight
(
ymax
-
ymin
);
return
BoundaryBox
;
}
/***************************/
/* class LibraryFieldEntry */
/***************************/
/* a Field is a string linked to a component.
Unlike a pure graphic text, fields can be used in netlist generation
and other things.
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
(
LibDrawPolyline
*
)
DrawEntry
;
pt
=
polyline
->
PolyList
;
for
(
ii
=
0
;
ii
<
polyline
->
n
;
ii
++
)
{
if
(
xmin
>
*
pt
)
xmin
=
*
pt
;
if
(
xmax
<
*
pt
)
xmax
=
*
pt
;
pt
++
;
if
(
ymin
>
*
pt
)
ymin
=
*
pt
;
if
(
ymax
<
*
pt
)
ymax
=
*
pt
;
pt
++
;
}
}
break
;
default
:
;
}
}
// Update the BoundaryBox. Remenber the fact the screen Y axis is the reverse */
ymax
=
-
ymax
;
ymin
=
-
ymin
;
// Y is is screen axis sense
// Ensure w and H > 0 (wxRect assume it)
if
(
xmax
<
xmin
)
EXCHG
(
xmax
,
xmin
);
if
(
ymax
<
ymin
)
EXCHG
(
ymax
,
ymin
);
BoundaryBox
.
SetX
(
xmin
);
BoundaryBox
.
SetWidth
(
xmax
-
xmin
);
BoundaryBox
.
SetY
(
ymin
);
BoundaryBox
.
SetHeight
(
ymax
-
ymin
);
return
BoundaryBox
;
}
/***************************/
/* class LibraryFieldEntry */
/***************************/
4 fields have a special meaning:
REFERENCE
VALUE
FOOTPRINT NAME
SCHEMATIC LINK (reserved but not used in kicad)
*/
LibDrawField
::
LibDrawField
(
int
idfield
)
:
LibEDA_BaseStruct
(
COMPONENT_FIELD_DRAW_TYPE
)
/* a Field is a string linked to a component.
* Unlike a pure graphic text, fields can be used in netlist generation
* and other things.
*
* 4 fields have a special meaning:
* REFERENCE
* VALUE
* FOOTPRINT NAME
* SCHEMATIC LINK (reserved but not used in kicad)
*/
LibDrawField
::
LibDrawField
(
int
idfield
)
:
LibEDA_BaseStruct
(
COMPONENT_FIELD_DRAW_TYPE
)
{
m_FieldId
=
idfield
;
/* 0 a 11, 0 = REFERENCE, 1 = VALUE*/
if
(
m_FieldId
<
0
)
m_FieldId
=
0
;
if
(
m_FieldId
>=
NUMBER_OF_FIELDS
)
m_FieldId
=
NUMBER_OF_FIELDS
-
1
;
m_Size
.
x
=
m_Size
.
y
=
DEFAULT_SIZE_TEXT
;
m_Orient
=
0
;
/* Orientation */
m_Attributs
=
0
;
/* Attributs = unvisible ... */
m_Width
=
0
;
m_HJustify
=
GR_TEXT_HJUSTIFY_CENTER
;
m_VJustify
=
GR_TEXT_VJUSTIFY_CENTER
;
/* Horizontal and vertical text justification */
m_FieldId
=
idfield
;
/* 0 a 11, 0 = REFERENCE, 1 = VALUE*/
if
(
m_FieldId
<
0
)
m_FieldId
=
0
;
if
(
m_FieldId
>=
NUMBER_OF_FIELDS
)
m_FieldId
=
NUMBER_OF_FIELDS
-
1
;
m_Size
.
x
=
m_Size
.
y
=
DEFAULT_SIZE_TEXT
;
m_Orient
=
0
;
/* Orientation */
m_Attributs
=
0
;
/* Attributs = unvisible ... */
m_Width
=
0
;
m_HJustify
=
GR_TEXT_HJUSTIFY_CENTER
;
m_VJustify
=
GR_TEXT_VJUSTIFY_CENTER
;
/* Horizontal and vertical text justification */
}
LibDrawField
::~
LibDrawField
(
void
)
LibDrawField
::~
LibDrawField
(
void
)
{
}
// Creation et Duplication d'un field
LibDrawField
*
LibDrawField
::
GenCopy
(
void
)
// Creation et Duplication d'un field
LibDrawField
*
LibDrawField
::
GenCopy
(
void
)
{
LibDrawField
*
newfield
=
new
LibDrawField
(
m_FieldId
);
Copy
(
newfield
);
LibDrawField
*
newfield
=
new
LibDrawField
(
m_FieldId
);
return
newfield
;
Copy
(
newfield
);
return
newfield
;
}
// copie du field dans le field Target
void
LibDrawField
::
Copy
(
LibDrawField
*
Target
)
// copie du field dans le field Target
void
LibDrawField
::
Copy
(
LibDrawField
*
Target
)
{
Target
->
m_Pos
=
m_Pos
;
Target
->
m_Size
=
m_Size
;
Target
->
m_Width
=
m_Width
;
Target
->
m_Orient
=
m_Orient
;
Target
->
m_Attributs
=
m_Attributs
;
Target
->
m_Text
=
m_Text
;
Target
->
m_Name
=
m_Name
;
Target
->
m_HJustify
=
m_HJustify
;
Target
->
m_VJustify
=
m_VJustify
;
Target
->
m_Pos
=
m_Pos
;
Target
->
m_Size
=
m_Size
;
Target
->
m_Width
=
m_Width
;
Target
->
m_Orient
=
m_Orient
;
Target
->
m_Attributs
=
m_Attributs
;
Target
->
m_Text
=
m_Text
;
Target
->
m_Name
=
m_Name
;
Target
->
m_HJustify
=
m_HJustify
;
Target
->
m_VJustify
=
m_VJustify
;
}
/* Elements Graphiques */
LibEDA_BaseStruct
::
LibEDA_BaseStruct
(
int
struct_type
)
:
EDA_BaseStruct
(
struct_type
)
LibEDA_BaseStruct
::
LibEDA_BaseStruct
(
KICAD_T
struct_type
)
:
EDA_BaseStruct
(
struct_type
)
{
m_Unit
=
0
;
/* Unit identification (for multi part per package)
0 if the item is common to all units */
m_Convert
=
0
;
/* Shape identification (for parts which have a convert shape)
0 if the item is common to all shapes */
m_Width
=
0
;
/* Default value to draw lines or arc ... */
m_Unit
=
0
;
/* Unit identification (for multi part per package)
*
0 if the item is common to all units */
m_Convert
=
0
;
/* Shape identification (for parts which have a convert shape)
*
0 if the item is common to all shapes */
m_Width
=
0
;
/* Default value to draw lines or arc ... */
}
/***************************************************************/
LibDrawPin
::
LibDrawPin
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_PIN_DRAW_TYPE
)
LibDrawPin
::
LibDrawPin
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_PIN_DRAW_TYPE
)
/***************************************************************/
{
m_PinLen
=
300
;
/* default Pin len */
m_Orient
=
PIN_RIGHT
;
/* Pin oprient: Up, Down, Left, Right */
m_PinShape
=
NONE
;
/* Bit a bit: Pin shape (voir enum prec) */
m_PinType
=
PIN_UNSPECIFIED
;
/* electrical type of pin */
m_Attributs
=
0
;
/* bit 0 != 0: pin invisible */
m_PinNum
=
0
;
/*pin number ( i.e. 4 codes Ascii ) */
m_PinNumSize
=
50
;
m_PinNameSize
=
50
;
/* Default size for pin name and num */
m_Width
=
0
;
m_PinLen
=
300
;
/* default Pin len */
m_Orient
=
PIN_RIGHT
;
/* Pin oprient: Up, Down, Left, Right */
m_PinShape
=
NONE
;
/* Bit a bit: Pin shape (voir enum prec) */
m_PinType
=
PIN_UNSPECIFIED
;
/* electrical type of pin */
m_Attributs
=
0
;
/* bit 0 != 0: pin invisible */
m_PinNum
=
0
;
/*pin number ( i.e. 4 codes Ascii ) */
m_PinNumSize
=
50
;
m_PinNameSize
=
50
;
/* Default size for pin name and num */
m_Width
=
0
;
// m_PinNumWidth = m_PinNameWidth = 0; // Unused
}
/******************************************/
wxPoint
LibDrawPin
::
ReturnPinEndPoint
(
void
)
wxPoint
LibDrawPin
::
ReturnPinEndPoint
(
void
)
/******************************************/
/* return the pin end position, for a component in normal orient
*/
*/
{
wxPoint
pos
=
m_Pos
;
switch
(
m_Orient
)
{
case
PIN_UP
:
pos
.
y
+=
m_PinLen
;
break
;
case
PIN_DOWN
:
pos
.
y
-=
m_PinLen
;
break
;
case
PIN_LEFT
:
pos
.
x
-=
m_PinLen
;
break
;
case
PIN_RIGHT
:
pos
.
x
+=
m_PinLen
;
break
;
}
wxPoint
pos
=
m_Pos
;
return
pos
;
switch
(
m_Orient
)
{
case
PIN_UP
:
pos
.
y
+=
m_PinLen
;
break
;
case
PIN_DOWN
:
pos
.
y
-=
m_PinLen
;
break
;
case
PIN_LEFT
:
pos
.
x
-=
m_PinLen
;
break
;
case
PIN_RIGHT
:
pos
.
x
+=
m_PinLen
;
break
;
}
return
pos
;
}
/********************************************************/
int
LibDrawPin
::
ReturnPinDrawOrient
(
int
TransMat
[
2
][
2
]
)
int
LibDrawPin
::
ReturnPinDrawOrient
(
int
TransMat
[
2
][
2
]
)
/********************************************************/
/* Return the pin real orientation (PIN_UP, PIN_DOWN, PIN_RIGHT, PIN_LEFT),
according to its orientation,
AND the matrix transform (rot, mirror) TransMat
*/
{
int
orient
;
int
x1
=
0
,
y1
=
0
;
int
t1
,
t2
;
switch
(
m_Orient
)
{
case
PIN_UP
:
y1
=
1
;
break
;
case
PIN_DOWN
:
y1
=
-
1
;
break
;
case
PIN_LEFT
:
x1
=
-
1
;
break
;
case
PIN_RIGHT
:
x1
=
1
;
break
;
}
t1
=
TransMat
[
0
][
0
]
*
x1
+
TransMat
[
0
][
1
]
*
y1
;
t2
=
TransMat
[
1
][
0
]
*
x1
+
TransMat
[
1
][
1
]
*
y1
;
orient
=
PIN_UP
;
if
(
t1
==
0
)
{
if
(
t2
>
0
)
orient
=
PIN_DOWN
;
}
else
{
orient
=
PIN_RIGHT
;
if
(
t1
<
0
)
orient
=
PIN_LEFT
;
}
return
orient
;
* according to its orientation,
* AND the matrix transform (rot, mirror) TransMat
*/
{
int
orient
;
int
x1
=
0
,
y1
=
0
;
int
t1
,
t2
;
switch
(
m_Orient
)
{
case
PIN_UP
:
y1
=
1
;
break
;
case
PIN_DOWN
:
y1
=
-
1
;
break
;
case
PIN_LEFT
:
x1
=
-
1
;
break
;
case
PIN_RIGHT
:
x1
=
1
;
break
;
}
t1
=
TransMat
[
0
][
0
]
*
x1
+
TransMat
[
0
][
1
]
*
y1
;
t2
=
TransMat
[
1
][
0
]
*
x1
+
TransMat
[
1
][
1
]
*
y1
;
orient
=
PIN_UP
;
if
(
t1
==
0
)
{
if
(
t2
>
0
)
orient
=
PIN_DOWN
;
}
else
{
orient
=
PIN_RIGHT
;
if
(
t1
<
0
)
orient
=
PIN_LEFT
;
}
return
orient
;
}
/****************************************************/
void
LibDrawPin
::
ReturnPinStringNum
(
wxString
&
buffer
)
void
LibDrawPin
::
ReturnPinStringNum
(
wxString
&
buffer
)
/****************************************************/
/* fill the buffer with pin num as a wxString
Pin num is coded as a long
Used to print/draw the pin num
*/
*
Pin num is coded as a long
*
Used to print/draw the pin num
*/
{
char
ascii_buf
[
5
];
strncpy
(
ascii_buf
,
(
char
*
)
&
m_PinNum
,
4
);
ascii_buf
[
4
]
=
0
;
char
ascii_buf
[
5
];
strncpy
(
ascii_buf
,
(
char
*
)
&
m_PinNum
,
4
);
ascii_buf
[
4
]
=
0
;
buffer
=
CONV_FROM_UTF8
(
ascii_buf
);
buffer
=
CONV_FROM_UTF8
(
ascii_buf
);
}
/****************************************************/
void
LibDrawPin
::
SetPinNumFromString
(
wxString
&
buffer
)
void
LibDrawPin
::
SetPinNumFromString
(
wxString
&
buffer
)
/****************************************************/
/* fill the buffer with pin num as a wxString
Pin num is coded as a long
Used to print/draw the pin num
*/
{
char
ascii_buf
[
4
];
unsigned
ii
,
len
=
buffer
.
Len
();
ascii_buf
[
0
]
=
ascii_buf
[
1
]
=
ascii_buf
[
2
]
=
ascii_buf
[
3
]
=
0
;
if
(
len
>
4
)
len
=
4
;
for
(
ii
=
0
;
ii
<
len
;
ii
++
)
{
ascii_buf
[
ii
]
=
buffer
.
GetChar
(
ii
)
&
0xFF
;
}
strncpy
((
char
*
)
&
m_PinNum
,
ascii_buf
,
4
);
* Pin num is coded as a long
* Used to print/draw the pin num
*/
{
char
ascii_buf
[
4
];
unsigned
ii
,
len
=
buffer
.
Len
();
ascii_buf
[
0
]
=
ascii_buf
[
1
]
=
ascii_buf
[
2
]
=
ascii_buf
[
3
]
=
0
;
if
(
len
>
4
)
len
=
4
;
for
(
ii
=
0
;
ii
<
len
;
ii
++
)
{
ascii_buf
[
ii
]
=
buffer
.
GetChar
(
ii
)
&
0xFF
;
}
strncpy
(
(
char
*
)
&
m_PinNum
,
ascii_buf
,
4
);
}
/*************************************/
LibDrawPin
*
LibDrawPin
::
GenCopy
(
void
)
LibDrawPin
*
LibDrawPin
::
GenCopy
(
void
)
/*************************************/
{
LibDrawPin
*
newpin
=
new
LibDrawPin
();
LibDrawPin
*
newpin
=
new
LibDrawPin
();
newpin
->
m_Pos
=
m_Pos
;
newpin
->
m_PinLen
=
m_PinLen
;
newpin
->
m_Orient
=
m_Orient
;
newpin
->
m_PinShape
=
m_PinShape
;
newpin
->
m_PinType
=
m_PinType
;
newpin
->
m_Attributs
=
m_Attributs
;
newpin
->
m_PinNum
=
m_PinNum
;
newpin
->
m_PinNumSize
=
m_PinNumSize
;
newpin
->
m_PinNameSize
=
m_PinNameSize
;
newpin
->
m_Unit
=
m_Unit
;
newpin
->
m_Convert
=
m_Convert
;
newpin
->
m_Flags
=
m_Flags
;
newpin
->
m_Width
=
m_Width
;
newpin
->
m_Pos
=
m_Pos
;
newpin
->
m_PinLen
=
m_PinLen
;
newpin
->
m_Orient
=
m_Orient
;
newpin
->
m_PinShape
=
m_PinShape
;
newpin
->
m_PinType
=
m_PinType
;
newpin
->
m_Attributs
=
m_Attributs
;
newpin
->
m_PinNum
=
m_PinNum
;
newpin
->
m_PinNumSize
=
m_PinNumSize
;
newpin
->
m_PinNameSize
=
m_PinNameSize
;
newpin
->
m_Unit
=
m_Unit
;
newpin
->
m_Convert
=
m_Convert
;
newpin
->
m_Flags
=
m_Flags
;
newpin
->
m_Width
=
m_Width
;
newpin
->
m_PinName
=
m_PinName
;
newpin
->
m_PinName
=
m_PinName
;
return
newpin
;
return
newpin
;
}
/**************************************************************/
LibDrawArc
::
LibDrawArc
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_ARC_DRAW_TYPE
)
LibDrawArc
::
LibDrawArc
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_ARC_DRAW_TYPE
)
/**************************************************************/
{
m_Rayon
=
0
;
t1
=
t2
=
0
;
m_Width
=
0
;
m_Fill
=
NO_FILL
;
m_Rayon
=
0
;
t1
=
t2
=
0
;
m_Width
=
0
;
m_Fill
=
NO_FILL
;
}
/************************************/
LibDrawArc
*
LibDrawArc
::
GenCopy
(
void
)
LibDrawArc
*
LibDrawArc
::
GenCopy
(
void
)
/************************************/
{
LibDrawArc
*
newitem
=
new
LibDrawArc
();
LibDrawArc
*
newitem
=
new
LibDrawArc
();
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_ArcStart
=
m_ArcStart
;
newitem
->
m_ArcEnd
=
m_ArcEnd
;
newitem
->
m_Rayon
=
m_Rayon
;
newitem
->
t1
=
t1
;
newitem
->
t2
=
t2
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_ArcStart
=
m_ArcStart
;
newitem
->
m_ArcEnd
=
m_ArcEnd
;
newitem
->
m_Rayon
=
m_Rayon
;
newitem
->
t1
=
t1
;
newitem
->
t2
=
t2
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
}
/**********************************************************************/
LibDrawCircle
::
LibDrawCircle
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_CIRCLE_DRAW_TYPE
)
LibDrawCircle
::
LibDrawCircle
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_CIRCLE_DRAW_TYPE
)
/**********************************************************************/
{
m_Rayon
=
0
;
m_Fill
=
NO_FILL
;
m_Rayon
=
0
;
m_Fill
=
NO_FILL
;
}
/*******************************************/
LibDrawCircle
*
LibDrawCircle
::
GenCopy
(
void
)
LibDrawCircle
*
LibDrawCircle
::
GenCopy
(
void
)
/*******************************************/
{
LibDrawCircle
*
newitem
=
new
LibDrawCircle
();
LibDrawCircle
*
newitem
=
new
LibDrawCircle
();
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Rayon
=
m_Rayon
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Rayon
=
m_Rayon
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
}
/*****************************************************************/
LibDrawText
::
LibDrawText
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
)
LibDrawText
::
LibDrawText
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
)
/*****************************************************************/
{
m_Horiz
=
TEXT_ORIENT_HORIZ
;
m_Size
=
wxSize
(
50
,
50
);
m_Type
=
0
;
m_Width
=
0
;
m_Horiz
=
TEXT_ORIENT_HORIZ
;
m_Size
=
wxSize
(
50
,
50
);
m_Type
=
0
;
m_Width
=
0
;
}
/***************************************/
LibDrawText
*
LibDrawText
::
GenCopy
(
void
)
LibDrawText
*
LibDrawText
::
GenCopy
(
void
)
/***************************************/
{
LibDrawText
*
newitem
=
new
LibDrawText
();
LibDrawText
*
newitem
=
new
LibDrawText
();
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Horiz
=
m_Horiz
;
newitem
->
m_Size
=
m_Size
;
newitem
->
m_Type
=
m_Type
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Text
=
m_Text
;
newitem
->
m_Width
=
m_Width
;
return
newitem
;
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Horiz
=
m_Horiz
;
newitem
->
m_Size
=
m_Size
;
newitem
->
m_Type
=
m_Type
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Text
=
m_Text
;
newitem
->
m_Width
=
m_Width
;
return
newitem
;
}
LibDrawSquare
::
LibDrawSquare
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_RECT_DRAW_TYPE
)
LibDrawSquare
::
LibDrawSquare
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_RECT_DRAW_TYPE
)
{
m_Width
=
0
;
m_Fill
=
NO_FILL
;
m_Width
=
0
;
m_Fill
=
NO_FILL
;
}
LibDrawSquare
*
LibDrawSquare
::
GenCopy
(
void
)
LibDrawSquare
*
LibDrawSquare
::
GenCopy
(
void
)
{
LibDrawSquare
*
newitem
=
new
LibDrawSquare
();
LibDrawSquare
*
newitem
=
new
LibDrawSquare
();
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_End
=
m_End
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_End
=
m_End
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
}
LibDrawSegment
::
LibDrawSegment
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_LINE_DRAW_TYPE
)
LibDrawSegment
::
LibDrawSegment
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_LINE_DRAW_TYPE
)
{
m_Width
=
0
;
m_Width
=
0
;
}
LibDrawSegment
*
LibDrawSegment
::
GenCopy
(
void
)
LibDrawSegment
*
LibDrawSegment
::
GenCopy
(
void
)
{
LibDrawSegment
*
newitem
=
new
LibDrawSegment
();
LibDrawSegment
*
newitem
=
new
LibDrawSegment
();
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_End
=
m_End
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
return
newitem
;
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_End
=
m_End
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
return
newitem
;
}
LibDrawPolyline
::
LibDrawPolyline
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_POLYLINE_DRAW_TYPE
)
LibDrawPolyline
::
LibDrawPolyline
(
void
)
:
LibEDA_BaseStruct
(
COMPONENT_POLYLINE_DRAW_TYPE
)
{
n
=
0
;
PolyList
=
NULL
;
m_Fill
=
NO_FILL
;
m_Width
=
0
;
n
=
0
;
PolyList
=
NULL
;
m_Fill
=
NO_FILL
;
m_Width
=
0
;
}
/************************************************/
LibDrawPolyline
*
LibDrawPolyline
::
GenCopy
(
void
)
LibDrawPolyline
*
LibDrawPolyline
::
GenCopy
(
void
)
/************************************************/
{
LibDrawPolyline
*
newitem
=
new
LibDrawPolyline
();
int
size
;
newitem
->
n
=
n
;
size
=
sizeof
(
int
)
*
2
*
n
;
if
(
size
)
{
newitem
->
PolyList
=
(
int
*
)
MyMalloc
(
size
);
memcpy
(
newitem
->
PolyList
,
PolyList
,
size
);
}
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
LibDrawPolyline
*
newitem
=
new
LibDrawPolyline
();
int
size
;
newitem
->
n
=
n
;
size
=
sizeof
(
int
)
*
2
*
n
;
if
(
size
)
{
newitem
->
PolyList
=
(
int
*
)
MyMalloc
(
size
);
memcpy
(
newitem
->
PolyList
,
PolyList
,
size
);
}
newitem
->
m_Pos
=
m_Pos
;
newitem
->
m_Width
=
m_Width
;
newitem
->
m_Unit
=
m_Unit
;
newitem
->
m_Convert
=
m_Convert
;
newitem
->
m_Flags
=
m_Flags
;
newitem
->
m_Fill
=
m_Fill
;
return
newitem
;
}
/***************************************************/
void
LibDrawPolyline
::
AddPoint
(
const
wxPoint
&
point
)
void
LibDrawPolyline
::
AddPoint
(
const
wxPoint
&
point
)
/***************************************************/
/* add a point to the polyline coordinate list, and realloc the memory
*/
*/
{
int
allocsize
;
int
allocsize
;
n
++
;
allocsize
=
2
*
sizeof
(
int
)
*
n
;
if
(
PolyList
==
NULL
)
PolyList
=
(
int
*
)
MyMalloc
(
allocsize
);
else
PolyList
=
(
int
*
)
realloc
(
PolyList
,
allocsize
);
n
++
;
allocsize
=
2
*
sizeof
(
int
)
*
n
;
if
(
PolyList
==
NULL
)
PolyList
=
(
int
*
)
MyMalloc
(
allocsize
);
else
PolyList
=
(
int
*
)
realloc
(
PolyList
,
allocsize
);
PolyList
[(
n
*
2
)
-
2
]
=
point
.
x
;
PolyList
[(
n
*
2
)
-
1
]
=
-
point
.
y
;
PolyList
[(
n
*
2
)
-
2
]
=
point
.
x
;
PolyList
[(
n
*
2
)
-
1
]
=
-
point
.
y
;
}
eeschema/libcmp.h
View file @
f3c324d5
...
...
@@ -13,118 +13,120 @@
#define LIB_VERSION_MAJOR 2
#define LIB_VERSION_MINOR 3
#define LIBFILE_IDENT
"EESchema-LIBRARY Version"
/* Must be at the lib file start. */
#define DOCFILE_IDENT
"EESchema-DOCLIB Version 2.0"
/* Must be at the doc file start. */
#define DOC_EXT
wxT(".dcm")
/* extension des fichiers de documentation */
#define LIBFILE_IDENT
"EESchema-LIBRARY Version"
/* Must be at the lib file start. */
#define DOCFILE_IDENT
"EESchema-DOCLIB Version 2.0"
/* Must be at the doc file start. */
#define DOC_EXT
wxT( ".dcm" )
/* extension des fichiers de documentation */
#define TARGET_PIN_DIAM 12
/* Diam cercle des extremites des pins */
#define TARGET_PIN_DIAM 12
/* Diam cercle des extremites des pins */
#define DEFAULT_TEXT_SIZE 50
/* Default size for field texts */
#define PART_NAME_LEN
15
/* Maximum length of part name. */
#define PREFIX_NAME_LEN
5
/* Maximum length of prefix (IC, R, SW etc.). */
#define PIN_WIDTH
100
/* Width between 2 pins in internal units. */
#define PIN_LENGTH
300
/* Default Length of each pin to be drawn. */
#define DEFAULT_TEXT_SIZE 50
/* Default size for field texts */
#define PART_NAME_LEN
15
/* Maximum length of part name. */
#define PREFIX_NAME_LEN
5
/* Maximum length of prefix (IC, R, SW etc.). */
#define PIN_WIDTH
100
/* Width between 2 pins in internal units. */
#define PIN_LENGTH
300
/* Default Length of each pin to be drawn. */
#define INVERT_PIN_RADIUS
35
/* Radius of inverted pin circle. */
#define CLOCK_PIN_DIM
40
/* Dim of clock pin symbol. */
#define IEEE_SYMBOL_PIN_DIM 40
/* Dim of special pin symbol. */
#define INVERT_PIN_RADIUS
35
/* Radius of inverted pin circle. */
#define CLOCK_PIN_DIM
40
/* Dim of clock pin symbol. */
#define IEEE_SYMBOL_PIN_DIM 40
/* Dim of special pin symbol. */
#define NO_FILL
0
// Poly, Squar, Circle, Arc = option No Fill
#define FILLED_SHAPE
1
// Poly, Squar, Circle, Arc = option Fill with current color
#define FILLED_WITH_BG_BODYCOLOR 2
// Poly, Squar, Circle, Arc = option Fill
// with background body color
#define NO_FILL
0
// Poly, Squar, Circle, Arc = option No Fill
#define FILLED_SHAPE
1
// Poly, Squar, Circle, Arc = option Fill with current color
#define FILLED_WITH_BG_BODYCOLOR 2
// Poly, Squar, Circle, Arc = option Fill
// with background body color
//Offsets used in editing library component, for handle aliad dats
#define ALIAS_NAME 0
#define ALIAS_DOC 1
#define ALIAS_KEYWORD 2
#define ALIAS_NAME
0
#define ALIAS_DOC
1
#define ALIAS_KEYWORD
2
#define ALIAS_DOC_FILENAME 3
#define ALIAS_NEXT 4
#define ALIAS_NEXT
4
typedef
enum
{
LOCATE_COMPONENT_ARC_DRAW_TYPE
=
1
,
LOCATE_COMPONENT_CIRCLE_DRAW_TYPE
=
2
,
LOCATE_COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
=
4
,
LOCATE_COMPONENT_RECT_DRAW_TYPE
=
8
,
LOCATE_LINE_DRAW_TYPE
=
0x10
,
LOCATE_COMPONENT_POLYLINE_DRAW_TYPE
=
0x20
,
LOCATE_COMPONENT_LINE_DRAW_TYPE
=
0x40
LOCATE_COMPONENT_ARC_DRAW_TYPE
=
1
,
LOCATE_COMPONENT_CIRCLE_DRAW_TYPE
=
2
,
LOCATE_COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
=
4
,
LOCATE_COMPONENT_RECT_DRAW_TYPE
=
8
,
LOCATE_LINE_DRAW_TYPE
=
0x10
,
LOCATE_COMPONENT_POLYLINE_DRAW_TYPE
=
0x20
,
LOCATE_COMPONENT_LINE_DRAW_TYPE
=
0x40
}
LocateDrawStructType
;
#define LOCATE_ALL_DRAW_ITEM 0xFFFFFFFF
/* flags utilises dans FindLibPart() : */
#define FIND_ROOT
0
/* indique la recherche du composant racine si
meme si le composant specifie est un alias */
#define FIND_ALIAS 1
/* indique la recherche du composant specifie
(alias ou racine) */
#define FIND_ROOT
0
/* indique la recherche du composant racine si
*
meme si le composant specifie est un alias */
#define FIND_ALIAS 1
/* indique la recherche du composant specifie
*
(alias ou racine) */
/* definition des types des structures d'elements de librairie */
typedef
enum
{
ROOT
,
/* Structure est a standard EDA_LibComponentStruct */
ALIAS
/* Structure is an alias */
ROOT
,
/* Structure est a standard EDA_LibComponentStruct */
ALIAS
/* Structure is an alias */
}
LibrEntryType
;
/* valeur du membre .m_Options */
typedef
enum
{
ENTRY_NORMAL
,
// Libentry is standard
ENTRY_POWER
// Libentry is a power symbol
ENTRY_NORMAL
,
// Libentry is standard
ENTRY_POWER
// Libentry is a power symbol
}
LibrEntryOptions
;
/* Definitions des Pins */
typedef
enum
{
/* Type des Pins. si modif: modifier tableau des mgs suivant */
PIN_INPUT
,
PIN_OUTPUT
,
PIN_BIDI
,
PIN_TRISTATE
,
PIN_PASSIVE
,
PIN_UNSPECIFIED
,
PIN_POWER_IN
,
PIN_POWER_OUT
,
PIN_OPENCOLLECTOR
,
PIN_OPENEMITTER
,
PIN_NC
,
/* No connect */
PIN_NMAX
/* Valeur limite ( utilisee comme limite de tableaux) */
typedef
enum
{
/* Type des Pins. si modif: modifier tableau des mgs suivant */
PIN_INPUT
,
PIN_OUTPUT
,
PIN_BIDI
,
PIN_TRISTATE
,
PIN_PASSIVE
,
PIN_UNSPECIFIED
,
PIN_POWER_IN
,
PIN_POWER_OUT
,
PIN_OPENCOLLECTOR
,
PIN_OPENEMITTER
,
PIN_NC
,
/* No connect */
PIN_NMAX
/* Valeur limite ( utilisee comme limite de tableaux) */
}
ElectricPinType
;
/* Messages d'affichage du type electrique */
eda_global
wxChar
*
MsgPinElectricType
[]
eda_global
wxChar
*
MsgPinElectricType
[]
#ifdef MAIN
=
{
wxT
(
"input"
),
wxT
(
"output"
),
wxT
(
"BiDi"
),
wxT
(
"3state"
),
wxT
(
"passive"
),
wxT
(
"unspc"
),
wxT
(
"power_in"
),
wxT
(
"power_out"
),
wxT
(
"openCol"
),
wxT
(
"openEm"
),
wxT
(
"?????"
)
}
=
{
wxT
(
"input"
),
wxT
(
"output"
),
wxT
(
"BiDi"
),
wxT
(
"3state"
),
wxT
(
"passive"
),
wxT
(
"unspc"
),
wxT
(
"power_in"
),
wxT
(
"power_out"
),
wxT
(
"openCol"
),
wxT
(
"openEm"
),
wxT
(
"?????"
)
}
#endif
;
;
/* Autres bits: bits du membre .Flag des Pins */
#define PINNOTDRAW 1
/* si 1: pin invisible */
typedef
enum
{
/* Forme des Pins */
NONE
=
0
,
INVERT
=
1
,
CLOCK
=
2
,
LOWLEVEL_IN
=
4
,
LOWLEVEL_OUT
=
8
}
DrawPinShape
;
typedef
enum
{
/* Orientation des Pins */
PIN_RIGHT
=
'R'
,
PIN_LEFT
=
'L'
,
PIN_UP
=
'U'
,
PIN_DOWN
=
'D'
,
}
DrawPinOrient
;
#define PINNOTDRAW 1
/* si 1: pin invisible */
typedef
enum
{
/* Forme des Pins */
NONE
=
0
,
INVERT
=
1
,
CLOCK
=
2
,
LOWLEVEL_IN
=
4
,
LOWLEVEL_OUT
=
8
}
DrawPinShape
;
typedef
enum
{
/* Orientation des Pins */
PIN_RIGHT
=
'R'
,
PIN_LEFT
=
'L'
,
PIN_UP
=
'U'
,
PIN_DOWN
=
'D'
,
}
DrawPinOrient
;
/*************************************/
/* Classe representant une librairie */
...
...
@@ -133,25 +135,25 @@ typedef enum { /* Orientation des Pins */
class
LibraryStruct
{
public
:
int
m_Type
;
/* type indicator */
wxString
m_Name
;
/* Name of library loaded. */
wxString
m_FullFileName
;
/* Full File Name (with path) of library loaded. */
wxString
m_Header
;
/* first line of library loaded. */
int
m_NumOfParts
;
/* Number of parts this library has. */
PriorQue
*
m_Entries
;
/* Parts themselves are saved here. */
LibraryStruct
*
m_Pnext
;
/* Point on next lib in chain. */
int
m_Modified
;
/* flag indicateur d'edition */
int
m_Size
;
// Size in bytes (for statistics)
unsigned
long
m_TimeStamp
;
// Signature temporelle
int
m_Flags
;
// variable used in some functions
bool
m_IsLibCache
;
// False for the "standard" libraries,
// True for the library cache
int
m_Type
;
/* type indicator */
wxString
m_Name
;
/* Name of library loaded. */
wxString
m_FullFileName
;
/* Full File Name (with path) of library loaded. */
wxString
m_Header
;
/* first line of library loaded. */
int
m_NumOfParts
;
/* Number of parts this library has. */
PriorQue
*
m_Entries
;
/* Parts themselves are saved here. */
LibraryStruct
*
m_Pnext
;
/* Point on next lib in chain. */
int
m_Modified
;
/* flag indicateur d'edition */
int
m_Size
;
// Size in bytes (for statistics)
unsigned
long
m_TimeStamp
;
// Signature temporelle
int
m_Flags
;
// variable used in some functions
bool
m_IsLibCache
;
// False for the "standard" libraries,
// True for the library cache
public
:
LibraryStruct
(
int
type
,
const
wxString
&
name
,
const
wxString
&
fullname
);
~
LibraryStruct
();
bool
WriteHeader
(
FILE
*
file
);
bool
ReadHeader
(
FILE
*
file
,
int
*
LineNum
);
LibraryStruct
(
int
type
,
const
wxString
&
name
,
const
wxString
&
fullname
);
~
LibraryStruct
();
bool
WriteHeader
(
FILE
*
file
);
bool
ReadHeader
(
FILE
*
file
,
int
*
LineNum
);
};
...
...
@@ -161,252 +163,260 @@ public:
/* class LibEDA_BaseStruct : Basic class for items used in a library component
(graphic shapes, texts, fields, pins)
*/
*
(graphic shapes, texts, fields, pins)
*/
class
LibEDA_BaseStruct
:
public
EDA_BaseStruct
{
public
:
int
m_Unit
;
/* Unit identification (for multi part per parkage)
0 if the item is common to all units */
int
m_Convert
;
/* Shape identification (for parts which have a convert shape)
0 if the item is common to all shapes */
wxPoint
m_Pos
;
/* Position or centre (Arc and Circle) or start point (segments) */
int
m_Width
;
/* Width of draw lines */
int
m_Unit
;
/* Unit identification (for multi part per parkage)
*
0 if the item is common to all units */
int
m_Convert
;
/* Shape identification (for parts which have a convert shape)
*
0 if the item is common to all shapes */
wxPoint
m_Pos
;
/* Position or centre (Arc and Circle) or start point (segments) */
int
m_Width
;
/* Width of draw lines */
public
:
LibEDA_BaseStruct
*
Next
(
void
)
{
return
(
LibEDA_BaseStruct
*
)
Pnext
;}
LibEDA_BaseStruct
(
int
struct_type
);
virtual
~
LibEDA_BaseStruct
(
void
){}
void
Display_Infos_DrawEntry
(
WinEDA_DrawFrame
*
frame
);
LibEDA_BaseStruct
*
Next
(
void
)
{
return
(
LibEDA_BaseStruct
*
)
Pnext
;
}
LibEDA_BaseStruct
(
KICAD_T
struct_type
);
virtual
~
LibEDA_BaseStruct
(
void
)
{
}
void
Display_Infos_DrawEntry
(
WinEDA_DrawFrame
*
frame
);
};
class
LibDrawPin
:
public
LibEDA_BaseStruct
{
public
:
int
m_PinLen
;
/* Pin lenght */
int
m_Orient
;
/* Pin orientation (Up, Down, Left, Right) */
int
m_PinShape
;
/* Bitwise ORed: Pin shape (see enum DrawPinShape) */
int
m_PinType
;
/* Electrical pin properties */
int
m_Attributs
;
/* bit 0 != 0: pin invisible */
long
m_PinNum
;
/* Pin number: 4 Ascii code like "12" or "anod" or "G6"
"12" is really "12\0\0"*/
wxString
m_PinName
;
int
m_PinNumSize
,
m_PinNameSize
;
/* Pin num and Pin name sizes */
int
m_PinLen
;
/* Pin lenght */
int
m_Orient
;
/* Pin orientation (Up, Down, Left, Right) */
int
m_PinShape
;
/* Bitwise ORed: Pin shape (see enum DrawPinShape) */
int
m_PinType
;
/* Electrical pin properties */
int
m_Attributs
;
/* bit 0 != 0: pin invisible */
long
m_PinNum
;
/* Pin number: 4 Ascii code like "12" or "anod" or "G6"
* "12" is really "12\0\0"*/
wxString
m_PinName
;
int
m_PinNumSize
,
m_PinNameSize
;
/* Pin num and Pin name sizes */
// short m_PinNumWidth, m_PinNameWidth; /* (Unused) Pin num and Pin name text width */
public
:
LibDrawPin
(
void
);
~
LibDrawPin
(
void
)
{}
LibDrawPin
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
void
Display_Infos
(
WinEDA_DrawFrame
*
frame
);
wxPoint
ReturnPinEndPoint
(
void
);
int
ReturnPinDrawOrient
(
int
TransMat
[
2
][
2
]);
void
ReturnPinStringNum
(
wxString
&
buffer
);
void
SetPinNumFromString
(
wxString
&
buffer
);
void
DrawPinSymbol
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
pin_pos
,
int
orient
,
int
DrawMode
,
int
Color
=
-
1
);
void
DrawPinTexts
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
wxPoint
&
pin_pos
,
int
orient
,
int
TextInside
,
bool
DrawPinNum
,
bool
DrawPinName
,
int
Color
,
int
DrawMode
);
void
PlotPinTexts
(
wxPoint
&
pin_pos
,
int
orient
,
int
TextInside
,
bool
DrawPinNum
,
bool
DrawPinName
);
LibDrawPin
(
void
);
~
LibDrawPin
(
void
)
{
}
LibDrawPin
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
void
Display_Infos
(
WinEDA_DrawFrame
*
frame
);
wxPoint
ReturnPinEndPoint
(
void
);
int
ReturnPinDrawOrient
(
int
TransMat
[
2
][
2
]
);
void
ReturnPinStringNum
(
wxString
&
buffer
);
void
SetPinNumFromString
(
wxString
&
buffer
);
void
DrawPinSymbol
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
pin_pos
,
int
orient
,
int
DrawMode
,
int
Color
=
-
1
);
void
DrawPinTexts
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
wxPoint
&
pin_pos
,
int
orient
,
int
TextInside
,
bool
DrawPinNum
,
bool
DrawPinName
,
int
Color
,
int
DrawMode
);
void
PlotPinTexts
(
wxPoint
&
pin_pos
,
int
orient
,
int
TextInside
,
bool
DrawPinNum
,
bool
DrawPinName
);
};
class
LibDrawArc
:
public
LibEDA_BaseStruct
class
LibDrawArc
:
public
LibEDA_BaseStruct
{
public
:
int
m_Rayon
;
int
m_Fill
;
int
t1
,
t2
;
/* position des 2 extremites de l'arc en 0,1 degres */
wxPoint
m_ArcStart
,
m_ArcEnd
;
/* position des 2 extremites de l'arc en coord reelles*/
int
m_Rayon
;
int
m_Fill
;
int
t1
,
t2
;
/* position des 2 extremites de l'arc en 0,1 degres */
wxPoint
m_ArcStart
,
m_ArcEnd
;
/* position des 2 extremites de l'arc en coord reelles*/
public
:
LibDrawArc
(
void
);
~
LibDrawArc
(
void
){
}
LibDrawArc
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawArc
(
void
);
~
LibDrawArc
(
void
)
{
}
LibDrawArc
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
LibDrawCircle
:
public
LibEDA_BaseStruct
class
LibDrawCircle
:
public
LibEDA_BaseStruct
{
public
:
int
m_Rayon
;
int
m_Fill
;
int
m_Rayon
;
int
m_Fill
;
public
:
LibDrawCircle
(
void
);
~
LibDrawCircle
(
void
){
}
LibDrawCircle
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawCircle
(
void
);
~
LibDrawCircle
(
void
)
{
}
LibDrawCircle
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
LibDrawText
:
public
LibEDA_BaseStruct
class
LibDrawText
:
public
LibEDA_BaseStruct
{
public
:
int
m_Horiz
;
wxSize
m_Size
;
int
m_Type
;
wxString
m_Text
;
int
m_Horiz
;
wxSize
m_Size
;
int
m_Type
;
wxString
m_Text
;
public
:
LibDrawText
(
void
);
~
LibDrawText
(
void
){
}
LibDrawText
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawText
(
void
);
~
LibDrawText
(
void
)
{
}
LibDrawText
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
LibDrawSquare
:
public
LibEDA_BaseStruct
class
LibDrawSquare
:
public
LibEDA_BaseStruct
{
public
:
wxPoint
m_End
;
int
m_Fill
;
wxPoint
m_End
;
int
m_Fill
;
public
:
LibDrawSquare
(
void
);
~
LibDrawSquare
(
void
){
}
LibDrawSquare
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawSquare
(
void
);
~
LibDrawSquare
(
void
)
{
}
LibDrawSquare
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
LibDrawSegment
:
public
LibEDA_BaseStruct
class
LibDrawSegment
:
public
LibEDA_BaseStruct
{
public
:
wxPoint
m_End
;
wxPoint
m_End
;
public
:
LibDrawSegment
(
void
);
~
LibDrawSegment
(
void
){
}
LibDrawSegment
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawSegment
(
void
);
~
LibDrawSegment
(
void
)
{
}
LibDrawSegment
*
GenCopy
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
LibDrawPolyline
:
public
LibEDA_BaseStruct
{
public
:
int
n
,
*
PolyList
;
int
m_Fill
;
int
n
,
*
PolyList
;
int
m_Fill
;
public
:
LibDrawPolyline
(
void
);
~
LibDrawPolyline
(
void
){
if
(
PolyList
)
free
(
PolyList
);}
LibDrawPolyline
*
GenCopy
(
void
);
void
AddPoint
(
const
wxPoint
&
point
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawPolyline
(
void
);
~
LibDrawPolyline
(
void
)
{
if
(
PolyList
)
free
(
PolyList
);
}
LibDrawPolyline
*
GenCopy
(
void
);
void
AddPoint
(
const
wxPoint
&
point
);
bool
WriteDescr
(
FILE
*
File
);
};
/* Fields identiques aux fields des composants, pouvant etre predefinis en lib
2 Fields sont toujours presents : Prefix (U, IC..) et Name (74LS00..)*/
*
2 Fields sont toujours presents : Prefix (U, IC..) et Name (74LS00..)*/
class
LibDrawField
:
public
LibEDA_BaseStruct
{
public
:
int
m_FieldId
;
// 0 a 11
// 0 = Name 1 = Valeur 2 .. 11 autres fields
wxPoint
m_Pos
;
wxSize
m_Size
;
int
m_Orient
;
/* Orientation */
int
m_Attributs
;
/* Attributs (Non visible ...) */
int
m_HJustify
,
m_VJustify
;
/* Justifications Horiz et Vert du texte */
wxString
m_Text
;
/* Field Data */
wxString
m_Name
;
/* Field Name */
int
m_FieldId
;
// 0 a 11
// 0 = Name 1 = Valeur 2 .. 11 autres fields
wxPoint
m_Pos
;
wxSize
m_Size
;
int
m_Orient
;
/* Orientation */
int
m_Attributs
;
/* Attributs (Non visible ...) */
int
m_HJustify
,
m_VJustify
;
/* Justifications Horiz et Vert du texte */
wxString
m_Text
;
/* Field Data */
wxString
m_Name
;
/* Field Name */
public
:
LibDrawField
(
int
idfield
=
2
);
~
LibDrawField
(
void
);
LibDrawField
(
int
idfield
=
2
);
~
LibDrawField
(
void
);
LibDrawField
*
GenCopy
(
void
);
void
Copy
(
LibDrawField
*
Target
);
bool
WriteDescr
(
FILE
*
File
);
LibDrawField
*
GenCopy
(
void
);
void
Copy
(
LibDrawField
*
Target
);
bool
WriteDescr
(
FILE
*
File
);
};
/* classe de base de description des composants en librairie */
class
LibCmpEntry
:
public
EDA_BaseStruct
class
LibCmpEntry
:
public
EDA_BaseStruct
{
public
:
LibrEntryType
Type
;
/* Type = ROOT;
= ALIAS pour struct LibraryAliasType */
LibDrawField
m_Name
;
// name (74LS00 ..) in lib ( = VALUE )
wxString
m_Doc
;
/* ligne de documentation */
wxString
m_KeyWord
;
/* liste des mots cles */
wxString
m_DocFile
;
/* nom du fichier Doc Associe */
LibrEntryOptions
m_Options
;
// special features (i.e. Entry is a POWER)
LibrEntryType
Type
;
/* Type = ROOT;
*
= ALIAS pour struct LibraryAliasType */
LibDrawField
m_Name
;
// name (74LS00 ..) in lib ( = VALUE )
wxString
m_Doc
;
/* ligne de documentation */
wxString
m_KeyWord
;
/* liste des mots cles */
wxString
m_DocFile
;
/* nom du fichier Doc Associe */
LibrEntryOptions
m_Options
;
// special features (i.e. Entry is a POWER)
public
:
LibCmpEntry
(
LibrEntryType
CmpType
,
const
wxChar
*
CmpName
);
virtual
~
LibCmpEntry
(
void
);
bool
WriteDescr
(
FILE
*
File
);
LibCmpEntry
(
LibrEntryType
CmpType
,
const
wxChar
*
CmpName
);
virtual
~
LibCmpEntry
(
void
);
bool
WriteDescr
(
FILE
*
File
);
};
class
EDA_LibComponentStruct
:
public
LibCmpEntry
/* composant "racine" */
class
EDA_LibComponentStruct
:
public
LibCmpEntry
/* composant "racine" */
{
public
:
LibDrawField
m_Prefix
;
/* Prefix ( U, IC ... ) = REFERENCE */
wxArrayString
m_AliasList
;
/* ALIAS list for the component */
wxArrayString
m_FootprintList
;
/* list of suitable footprint names for the component (wildcard names accepted)*/
int
m_UnitCount
;
/* Units (or sections) per package */
bool
m_UnitSelectionLocked
;
// True if units are differents and their selection is locked
// (i.e. if part A cannot be automatically changed in part B
int
m_TextInside
;
/* if 0: pin name drawn on the pin itself
if > 0 pin name drawn inside the component,
with a distance of m_TextInside in mils */
bool
m_DrawPinNum
;
bool
m_DrawPinName
;
LibDrawField
*
Fields
;
/* Auxiliairy Field list (id = 2 a 11*/
LibEDA_BaseStruct
*
m_Drawings
;
/* How to draw this part */
long
m_LastDate
;
// Last change Date
LibDrawField
m_Prefix
;
/* Prefix ( U, IC ... ) = REFERENCE */
wxArrayString
m_AliasList
;
/* ALIAS list for the component */
wxArrayString
m_FootprintList
;
/* list of suitable footprint names for the component (wildcard names accepted)*/
int
m_UnitCount
;
/* Units (or sections) per package */
bool
m_UnitSelectionLocked
;
// True if units are differents and their selection is locked
// (i.e. if part A cannot be automatically changed in part B
int
m_TextInside
;
/* if 0: pin name drawn on the pin itself
*
if > 0 pin name drawn inside the component,
*
with a distance of m_TextInside in mils */
bool
m_DrawPinNum
;
bool
m_DrawPinName
;
LibDrawField
*
Fields
;
/* Auxiliairy Field list (id = 2 a 11*/
LibEDA_BaseStruct
*
m_Drawings
;
/* How to draw this part */
long
m_LastDate
;
// Last change Date
public
:
EDA_LibComponentStruct
(
const
wxChar
*
CmpName
);
EDA_Rect
GetBoundaryBox
(
int
Unit
,
int
Convert
);
/* return Box around the part. */
~
EDA_LibComponentStruct
(
void
);
void
SortDrawItems
(
void
);
EDA_LibComponentStruct
(
const
wxChar
*
CmpName
);
EDA_Rect
GetBoundaryBox
(
int
Unit
,
int
Convert
);
/* return Box around the part. */
~
EDA_LibComponentStruct
(
void
);
void
SortDrawItems
(
void
);
};
class
EDA_LibCmpAliasStruct
:
public
LibCmpEntry
class
EDA_LibCmpAliasStruct
:
public
LibCmpEntry
{
public
:
wxString
m_RootName
;
/* Part name pour le composant de reference */
wxString
m_RootName
;
/* Part name pour le composant de reference */
public
:
EDA_LibCmpAliasStruct
(
const
wxChar
*
CmpName
,
const
wxChar
*
CmpRootName
);
~
EDA_LibCmpAliasStruct
(
void
);
EDA_LibCmpAliasStruct
(
const
wxChar
*
CmpName
,
const
wxChar
*
CmpRootName
);
~
EDA_LibCmpAliasStruct
(
void
);
};
/* Variables */
extern
LibraryStruct
*
LibraryList
;
/* All part libs are saved here. */
extern
LibraryStruct
*
LibraryList
;
/* All part libs are saved here. */
/* Variables Utiles pour les editions de composants en librairie */
eda_global
LibEDA_BaseStruct
*
LibItemToRepeat
;
/* pointeur sur l'lment que l'on
peut rpter (Pin..;) */
eda_global
LibraryStruct
*
CurrentLib
;
/* Pointeur sur la librairie du
composant en cours d'edition */
eda_global
EDA_LibComponentStruct
*
CurrentLibEntry
;
/* pointeur sur le composant en
cours d'edition */
eda_global
LibEDA_BaseStruct
*
CurrentDrawItem
;
/* pointeur sur les
elements de dessin du comp. en edition */
eda_global
wxString
CurrentAliasName
;
// Nom de l'alias selectionn
eda_global
bool
g_AsDeMorgan
;
// Pour libedit:
eda_global
int
CurrentUnit
eda_global
LibEDA_BaseStruct
*
LibItemToRepeat
;
/* pointeur sur l'lment que l'on
*
peut rpter (Pin..;) */
eda_global
LibraryStruct
*
CurrentLib
;
/* Pointeur sur la librairie du
*
composant en cours d'edition */
eda_global
EDA_LibComponentStruct
*
CurrentLibEntry
;
/* pointeur sur le composant en
*
cours d'edition */
eda_global
LibEDA_BaseStruct
*
CurrentDrawItem
;
/* pointeur sur les
*
elements de dessin du comp. en edition */
eda_global
wxString
CurrentAliasName
;
// Nom de l'alias selectionn
eda_global
bool
g_AsDeMorgan
;
// Pour libedit:
eda_global
int
CurrentUnit
#ifdef MAIN
=
1
=
1
#endif
;
eda_global
int
CurrentConvert
/* Convert = 1 .. 255 */
eda_global
int
CurrentConvert
/* Convert = 1 .. 255 */
#ifdef MAIN
=
1
=
1
#endif
;
eda_global
wxString
FindLibName
;
/* nom de la librairie ou a ete trouve le
dernier composant recherche par FindLibPart() */
eda_global
wxString
FindLibName
;
/* nom de la librairie ou a ete trouve le
*
dernier composant recherche par FindLibPart() */
#endif // LIBCMP_H
eeschema/libframe.cpp
View file @
f3c324d5
...
...
@@ -543,6 +543,7 @@ wxClientDC dc(DrawPanel);
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
EditSymbolText
(
&
dc
,
CurrentDrawItem
);
break
;
default
:
;
}
DrawPanel
->
CursorOn
(
&
dc
);
}
...
...
eeschema/locate.cpp
View file @
f3c324d5
...
...
@@ -839,6 +839,9 @@ int seuil;
return
(
DrawItem
);
/* Texte trouve */
}
break
;
default
:
;
}
}
return
(
NULL
);
...
...
eeschema/plot.cpp
View file @
f3c324d5
...
...
@@ -290,6 +290,9 @@ wxPoint pos;
MyFree
(
Poly
);
}
break
;
default
:
;
}
/* Fin Switch */
Plume
(
'U'
);
}
/* Fin Boucle de dessin */
...
...
eeschema/program.h
View file @
f3c324d5
/********************************************/
/* Definitions for the EESchema program: */
/********************************************/
/********************************************/
/* Definitions for the EESchema program: */
/********************************************/
#ifndef PROGRAM_H
#define PROGRAM_H
...
...
@@ -15,9 +15,9 @@
#include "component_class.h"
#include "class_screen.h"
#define DRAWJUNCTION_SIZE
16
/* Rayon du symbole connexion */
#define DRAWMARKER_SIZE
16
/* Rayon du symbole marqueur */
#define DRAWNOCONNECT_SIZE 48
/* Rayon du symbole No Connexion */
#define DRAWJUNCTION_SIZE
16
/* Rayon du symbole connexion */
#define DRAWMARKER_SIZE
16
/* Rayon du symbole marqueur */
#define DRAWNOCONNECT_SIZE 48
/* Rayon du symbole No Connexion */
#define HIGHLIGHT_COLOR WHITE
...
...
@@ -26,161 +26,191 @@
/* flags pour BUS ENTRY (bus to bus ou wire to bus */
#define WIRE_TO_BUS 0
#define BUS_TO_BUS 1
#define BUS_TO_BUS
1
typedef
enum
{
/* Type des Marqueurs */
MARQ_UNSPEC
,
MARQ_ERC
,
MARQ_PCB
,
MARQ_SIMUL
,
MARQ_NMAX
/* Derniere valeur: fin de tableau */
typedef
enum
{
/* Type des Marqueurs */
MARQ_UNSPEC
,
MARQ_ERC
,
MARQ_PCB
,
MARQ_SIMUL
,
MARQ_NMAX
/* Derniere valeur: fin de tableau */
}
TypeMarker
;
/* Messages correspondants aux types des marqueurs */
#ifdef MAIN
const
wxChar
*
NameMarqueurType
[]
=
{
wxT
(
""
),
wxT
(
"ERC"
),
wxT
(
"PCB"
),
wxT
(
"SIMUL"
),
wxT
(
"?????"
)
};
const
wxChar
*
NameMarqueurType
[]
=
{
wxT
(
""
),
wxT
(
"ERC"
),
wxT
(
"PCB"
),
wxT
(
"SIMUL"
),
wxT
(
"?????"
)
};
#else
extern
const
wxChar
*
NameMarqueurType
[];
extern
const
wxChar
*
NameMarqueurType
[];
#endif
/* Forward declarations */
class
DrawSheetStruct
;
class
EDA_DrawLineStruct
:
public
EDA_BaseLineStruct
/* Segment decription
base class to describe items which have 2 end points (track, wire, draw line ...) */
/**
* Class EDA_DrawLineStruct
* is a segment decription base class to describe items which have 2 end
* points (track, wire, draw line ...)
*/
class
EDA_DrawLineStruct
:
public
EDA_BaseStruct
{
public
:
bool
m_StartIsDangling
,
m_EndIsDangling
;
// TRUE si Start ou End not connected (wires, tracks...)
int
m_Layer
;
// Layer number
int
m_Width
;
// 0 = line, > 0 = tracks, bus ...
wxPoint
m_Start
;
// Line start point
wxPoint
m_End
;
// Line end point
bool
m_StartIsDangling
;
bool
m_EndIsDangling
;
// TRUE si Start ou End not connected (wires, tracks...)
public
:
EDA_DrawLineStruct
(
const
wxPoint
&
pos
,
int
layer
);
~
EDA_DrawLineStruct
(
void
)
{}
bool
IsOneEndPointAt
(
const
wxPoint
&
pos
);
EDA_DrawLineStruct
*
GenCopy
(
void
);
bool
IsNull
(
void
)
{
return
(
m_Start
==
m_End
);
}
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
EDA_DrawLineStruct
(
const
wxPoint
&
pos
,
int
layer
);
~
EDA_DrawLineStruct
(
void
)
{
}
bool
IsOneEndPointAt
(
const
wxPoint
&
pos
);
EDA_DrawLineStruct
*
GenCopy
(
void
);
bool
IsNull
(
void
)
{
return
m_Start
==
m_End
;
}
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawMarkerStruct
:
public
EDA_BaseStruct
/* marqueurs */
class
DrawMarkerStruct
:
public
EDA_BaseStruct
/* marqueurs */
{
public
:
wxPoint
m_Pos
;
/* XY coordinates of marker. */
TypeMarker
m_Type
;
int
m_MarkFlags
;
// complements d'information
wxString
m_Comment
;
/* Texte (commentaireassocie eventuel */
wxPoint
m_Pos
;
/* XY coordinates of marker. */
TypeMarker
m_Type
;
int
m_MarkFlags
;
// complements d'information
wxString
m_Comment
;
/* Texte (commentaireassocie eventuel */
public
:
DrawMarkerStruct
(
const
wxPoint
&
pos
,
const
wxString
&
text
);
~
DrawMarkerStruct
(
void
);
DrawMarkerStruct
*
GenCopy
(
void
);
wxString
GetComment
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
DrawMarkerStruct
(
const
wxPoint
&
pos
,
const
wxString
&
text
);
~
DrawMarkerStruct
(
void
);
DrawMarkerStruct
*
GenCopy
(
void
);
wxString
GetComment
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawNoConnectStruct
:
public
EDA_BaseStruct
/* Symboles de non connexion */
class
DrawNoConnectStruct
:
public
EDA_BaseStruct
/* Symboles de non connexion */
{
public
:
wxPoint
m_Pos
;
/* XY coordinates of NoConnect. */
wxPoint
m_Pos
;
/* XY coordinates of NoConnect. */
public
:
DrawNoConnectStruct
(
const
wxPoint
&
pos
);
~
DrawNoConnectStruct
(
void
)
{}
DrawNoConnectStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
DrawNoConnectStruct
(
const
wxPoint
&
pos
);
~
DrawNoConnectStruct
(
void
)
{
}
DrawNoConnectStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawBusEntryStruct
:
public
EDA_BaseStruct
/* Struct de descr 1 raccord
a 45 degres de BUS ou WIRE */
/**
* Class DrawBusEntryStruct
* Struct de descr 1 raccord a 45 degres de BUS ou WIRE
*/
class
DrawBusEntryStruct
:
public
EDA_BaseStruct
{
public
:
int
m_Layer
;
int
m_Width
;
wxPoint
m_Pos
;
wxSize
m_Size
;
int
m_Layer
;
int
m_Width
;
wxPoint
m_Pos
;
wxSize
m_Size
;
public
:
DrawBusEntryStruct
(
const
wxPoint
&
pos
,
int
shape
,
int
id
);
~
DrawBusEntryStruct
(
void
)
{}
DrawBusEntryStruct
*
GenCopy
(
void
);
wxPoint
m_End
(
void
);
// retourne la coord de fin du raccord
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
DrawBusEntryStruct
(
const
wxPoint
&
pos
,
int
shape
,
int
id
);
~
DrawBusEntryStruct
(
void
)
{
}
DrawBusEntryStruct
*
GenCopy
(
void
);
wxPoint
m_End
(
void
);
// retourne la coord de fin du raccord
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawPolylineStruct
:
public
EDA_BaseStruct
/* Polyligne (serie de segments) */
class
DrawPolylineStruct
:
public
EDA_BaseStruct
/* Polyligne (serie de segments) */
{
public
:
int
m_Layer
;
int
m_Width
;
int
m_NumOfPoints
;
/* Number of XY pairs in Points array. */
int
*
m_Points
;
/* XY pairs that forms the polyline. */
int
m_Layer
;
int
m_Width
;
int
m_NumOfPoints
;
/* Number of XY pairs in Points array. */
int
*
m_Points
;
/* XY pairs that forms the polyline. */
public
:
DrawPolylineStruct
(
int
layer
);
~
DrawPolylineStruct
(
void
);
DrawPolylineStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
DrawPolylineStruct
(
int
layer
);
~
DrawPolylineStruct
(
void
);
DrawPolylineStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawJunctionStruct
:
public
EDA_BaseStruct
class
DrawJunctionStruct
:
public
EDA_BaseStruct
{
public
:
int
m_Layer
;
wxPoint
m_Pos
;
/* XY coordinates of connection. */
int
m_Layer
;
wxPoint
m_Pos
;
/* XY coordinates of connection. */
public
:
DrawJunctionStruct
(
const
wxPoint
&
pos
);
~
DrawJunctionStruct
(
void
){}
DrawJunctionStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
DrawJunctionStruct
(
const
wxPoint
&
pos
);
~
DrawJunctionStruct
(
void
)
{
}
DrawJunctionStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
};
class
DrawTextStruct
:
public
EDA_BaseStruct
,
public
EDA_TextStruct
class
DrawTextStruct
:
public
EDA_BaseStruct
,
public
EDA_TextStruct
{
public
:
int
m_Layer
;
int
m_Shape
;
bool
m_IsDangling
;
// TRUE si non connect
int
m_Layer
;
int
m_Shape
;
bool
m_IsDangling
;
// TRUE si non connect
public
:
DrawTextStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawTextStruct
(
void
)
{}
DrawTextStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
void
SwapData
(
DrawTextStruct
*
copyitem
);
virtual
void
Place
(
WinEDA_DrawFrame
*
frame
,
wxDC
*
DC
);
DrawTextStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawTextStruct
(
void
)
{
}
DrawTextStruct
*
GenCopy
(
void
);
virtual
void
Draw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
=
-
1
);
void
SwapData
(
DrawTextStruct
*
copyitem
);
virtual
void
Place
(
WinEDA_DrawFrame
*
frame
,
wxDC
*
DC
);
private
:
void
DrawAsText
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
void
DrawAsLabel
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
void
DrawAsGlobalLabel
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
void
DrawAsText
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
void
DrawAsLabel
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
void
DrawAsGlobalLabel
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
const
wxPoint
&
offset
,
int
draw_mode
,
int
Color
);
};
class
DrawLabelStruct
:
public
DrawTextStruct
class
DrawLabelStruct
:
public
DrawTextStruct
{
public
:
DrawLabelStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawLabelStruct
(
void
)
{
}
DrawLabelStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawLabelStruct
(
void
)
{
}
};
class
DrawGlobalLabelStruct
:
public
DrawTextStruct
class
DrawGlobalLabelStruct
:
public
DrawTextStruct
{
public
:
DrawGlobalLabelStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawGlobalLabelStruct
(
void
)
{}
DrawGlobalLabelStruct
(
const
wxPoint
&
pos
=
wxPoint
(
0
,
0
),
const
wxString
&
text
=
wxEmptyString
);
~
DrawGlobalLabelStruct
(
void
)
{
}
};
...
...
@@ -188,16 +218,15 @@ public:
class
LayerStruct
{
public
:
char
LayerNames
[
MAX_LAYERS
+
1
][
8
];
int
LayerColor
[
MAX_LAYERS
+
1
];
char
LayerStatus
[
MAX_LAYERS
+
1
];
int
NumberOfLayers
;
int
CurrentLayer
;
int
CurrentWidth
;
int
CommonColor
;
int
Flags
;
char
LayerNames
[
MAX_LAYERS
+
1
][
8
];
int
LayerColor
[
MAX_LAYERS
+
1
];
char
LayerStatus
[
MAX_LAYERS
+
1
];
int
NumberOfLayers
;
int
CurrentLayer
;
int
CurrentWidth
;
int
CommonColor
;
int
Flags
;
};
#endif
/* PROGRAM_H */
eeschema/symbdraw.cpp
View file @
f3c324d5
/*********************************************************************/
/* EESchema - symbdraw.cpp */
/* Create, move .. graphic shapes used to build and draw a component */
/* (lines, arcs .. */
/*********************************************************************/
/*********************************************************************/
/* EESchema - symbdraw.cpp */
/* Create, move .. graphic shapes used to build and draw a component */
/* (lines, arcs .. */
/*********************************************************************/
#include "fctsys.h"
...
...
@@ -19,784 +19,833 @@
#include "id.h"
/* Routines locales */
static
void
SymbolDisplayDraw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
static
void
ComputeArc
(
LibDrawArc
*
DrawItem
,
wxPoint
ArcCentre
);
static
void
RedrawWhileMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
static
void
MoveLibDrawItemAt
(
LibEDA_BaseStruct
*
DrawItem
,
wxPoint
newpos
);
static
void
SymbolDisplayDraw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
static
void
ComputeArc
(
LibDrawArc
*
DrawItem
,
wxPoint
ArcCentre
);
static
void
RedrawWhileMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
static
void
MoveLibDrawItemAt
(
LibEDA_BaseStruct
*
DrawItem
,
wxPoint
newpos
);
/* Variables locales */
static
int
StateDrawArc
,
ArcStartX
,
ArcStartY
,
ArcEndX
,
ArcEndY
;
static
int
StateDrawArc
,
ArcStartX
,
ArcStartY
,
ArcEndX
,
ArcEndY
;
static
wxPoint
InitPosition
,
StartCursor
,
ItemPreviousPos
;
static
int
FlSymbol_Fill
=
NO_FILL
;
static
int
FlSymbol_Fill
=
NO_FILL
;
/************************************/
/* class WinEDA_PartPropertiesFrame */
/************************************/
/************************************/
/* class WinEDA_PartPropertiesFrame */
/************************************/
#include "dialog_cmp_graphic_properties.cpp"
/************************************************************/
void
WinEDA_bodygraphics_PropertiesFrame
::
bodygraphics_PropertiesAccept
(
wxCommandEvent
&
event
)
bodygraphics_PropertiesAccept
(
wxCommandEvent
&
event
)
/************************************************************/
/* Update the current draw item
*/
*/
{
g_FlDrawSpecificConvert
=
m_CommonConvert
->
GetValue
()
?
FALSE
:
TRUE
;
g_FlDrawSpecificUnit
=
m_CommonUnit
->
GetValue
()
?
FALSE
:
TRUE
;
if
(
m_Filled
)
FlSymbol_Fill
=
m_Filled
->
GetSelection
();
g_LibSymbolDefaultLineWidth
=
m_GraphicShapeWidthCtrl
->
GetValue
();
if
(
CurrentDrawItem
)
{
if
(
!
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
)
// if IS_NEW, copy for undo is done before place
m_Parent
->
SaveCopyInUndoList
(
CurrentLibEntry
);
wxClientDC
dc
(
m_Parent
->
DrawPanel
);
m_Parent
->
DrawPanel
->
PrepareGraphicContext
(
&
dc
);
DrawLibraryDrawStruct
(
m_Parent
->
DrawPanel
,
&
dc
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
if
(
g_FlDrawSpecificUnit
)
CurrentDrawItem
->
m_Unit
=
CurrentUnit
;
else
CurrentDrawItem
->
m_Unit
=
0
;
if
(
g_FlDrawSpecificConvert
)
CurrentDrawItem
->
m_Convert
=
CurrentConvert
;
else
CurrentDrawItem
->
m_Convert
=
0
;
if
(
m_Filled
)
{
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
default
:
break
;
}
}
CurrentLibEntry
->
SortDrawItems
();
m_Parent
->
m_CurrentScreen
->
SetModify
();
DrawLibraryDrawStruct
(
m_Parent
->
DrawPanel
,
&
dc
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
}
Close
();
if
(
CurrentDrawItem
)
CurrentDrawItem
->
Display_Infos_DrawEntry
(
m_Parent
);
m_Parent
->
ReDrawPanel
();
g_FlDrawSpecificConvert
=
m_CommonConvert
->
GetValue
()
?
FALSE
:
TRUE
;
g_FlDrawSpecificUnit
=
m_CommonUnit
->
GetValue
()
?
FALSE
:
TRUE
;
if
(
m_Filled
)
FlSymbol_Fill
=
m_Filled
->
GetSelection
();
g_LibSymbolDefaultLineWidth
=
m_GraphicShapeWidthCtrl
->
GetValue
();
if
(
CurrentDrawItem
)
{
if
(
!
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
)
// if IS_NEW, copy for undo is done before place
m_Parent
->
SaveCopyInUndoList
(
CurrentLibEntry
);
wxClientDC
dc
(
m_Parent
->
DrawPanel
);
m_Parent
->
DrawPanel
->
PrepareGraphicContext
(
&
dc
);
DrawLibraryDrawStruct
(
m_Parent
->
DrawPanel
,
&
dc
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
if
(
g_FlDrawSpecificUnit
)
CurrentDrawItem
->
m_Unit
=
CurrentUnit
;
else
CurrentDrawItem
->
m_Unit
=
0
;
if
(
g_FlDrawSpecificConvert
)
CurrentDrawItem
->
m_Convert
=
CurrentConvert
;
else
CurrentDrawItem
->
m_Convert
=
0
;
if
(
m_Filled
)
{
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Width
=
m_GraphicShapeWidthCtrl
->
GetValue
();
break
;
default
:
break
;
}
}
CurrentLibEntry
->
SortDrawItems
();
m_Parent
->
m_CurrentScreen
->
SetModify
();
DrawLibraryDrawStruct
(
m_Parent
->
DrawPanel
,
&
dc
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
}
Close
();
if
(
CurrentDrawItem
)
CurrentDrawItem
->
Display_Infos_DrawEntry
(
m_Parent
);
m_Parent
->
ReDrawPanel
();
}
/**********************************************************/
void
WinEDA_LibeditFrame
::
EditGraphicSymbol
(
wxDC
*
DC
,
LibEDA_BaseStruct
*
DrawItem
)
void
WinEDA_LibeditFrame
::
EditGraphicSymbol
(
wxDC
*
DC
,
LibEDA_BaseStruct
*
DrawItem
)
/**********************************************************/
/* Install the dialog box for editing a graphical item properties
*/
*/
{
if
(
DrawItem
==
NULL
)
return
;
WinEDA_bodygraphics_PropertiesFrame
*
frame
=
new
WinEDA_bodygraphics_PropertiesFrame
(
this
);
frame
->
ShowModal
();
frame
->
Destroy
();
if
(
DrawItem
==
NULL
)
return
;
WinEDA_bodygraphics_PropertiesFrame
*
frame
=
new
WinEDA_bodygraphics_PropertiesFrame
(
this
);
frame
->
ShowModal
();
frame
->
Destroy
();
}
/****************************************************************/
static
void
AbortSymbolTraceOn
(
WinEDA_DrawPanel
*
Panel
,
wxDC
*
DC
)
static
void
AbortSymbolTraceOn
(
WinEDA_DrawPanel
*
Panel
,
wxDC
*
DC
)
/****************************************************************/
{
StateDrawArc
=
0
;
Panel
->
ManageCurseur
=
NULL
;
Panel
->
ForceCloseManageCurseur
=
NULL
;
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
{
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
Panel
->
m_Parent
->
RedrawActiveWindow
(
DC
,
TRUE
);
}
else
DrawLibraryDrawStruct
(
Panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
delete
CurrentDrawItem
;
}
else
{
wxPoint
curpos
;
curpos
=
Panel
->
GetScreen
()
->
m_Curseur
;
Panel
->
GetScreen
()
->
m_Curseur
=
StartCursor
;
RedrawWhileMovingCursor
(
Panel
,
DC
,
TRUE
);
Panel
->
GetScreen
()
->
m_Curseur
=
curpos
;
DrawLibraryDrawStruct
(
Panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
GR_DEFAULT_DRAWMODE
);
CurrentDrawItem
->
m_Flags
=
0
;
}
CurrentDrawItem
=
NULL
;
StateDrawArc
=
0
;
Panel
->
ManageCurseur
=
NULL
;
Panel
->
ForceClose
ManageCurseur
=
NULL
;
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
{
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
Panel
->
m_Parent
->
RedrawActiveWindow
(
DC
,
TRUE
);
}
else
DrawLibraryDrawStruct
(
Panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
)
;
delete
CurrentDrawItem
;
}
else
{
wxPoint
curpos
;
curpos
=
Panel
->
GetScreen
()
->
m_Curseur
;
Panel
->
GetScreen
()
->
m_Curseur
=
StartCursor
;
RedrawWhileMovingCursor
(
Panel
,
DC
,
TRUE
);
Panel
->
GetScreen
()
->
m_Curseur
=
curpos
;
DrawLibraryDrawStruct
(
Panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
GR_DEFAULT_DRAWMODE
);
CurrentDrawItem
->
m_Flags
=
0
;
}
CurrentDrawItem
=
NULL
;
}
/*********************************************************************/
LibEDA_BaseStruct
*
WinEDA_LibeditFrame
::
CreateGraphicItem
(
wxDC
*
DC
)
LibEDA_BaseStruct
*
WinEDA_LibeditFrame
::
CreateGraphicItem
(
wxDC
*
DC
)
/*********************************************************************/
/* Routine de creation d'un nouvel element type LibraryDrawStruct
POLYLINE
ARC
CIRCLE
RECTANGLE
*/
*
POLYLINE
*
ARC
*
CIRCLE
*
RECTANGLE
*/
{
int
DrawType
;
int
*
ptpoly
;
if
(
CurrentDrawItem
)
return
NULL
;
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
// Creation du nouvel element
switch
(
m_ID_current_state
)
{
case
ID_LIBEDIT_BODY_LINE_BUTT
:
DrawType
=
COMPONENT_POLYLINE_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_ARC_BUTT
:
DrawType
=
COMPONENT_ARC_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_CIRCLE_BUTT
:
DrawType
=
COMPONENT_CIRCLE_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_RECT_BUTT
:
DrawType
=
COMPONENT_RECT_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_TEXT_BUTT
:
DrawType
=
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
;
break
;
default
:
DisplayError
(
this
,
wxT
(
"SymbolBeginDrawItem Internal err: Id error"
));
return
NULL
;
}
DrawPanel
->
ManageCurseur
=
SymbolDisplayDraw
;
DrawPanel
->
ForceCloseManageCurseur
=
AbortSymbolTraceOn
;
switch
(
DrawType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
LibDrawArc
*
Arc
=
new
LibDrawArc
();
CurrentDrawItem
=
Arc
;
ArcStartX
=
ArcEndX
=
m_CurrentScreen
->
m_Curseur
.
x
;
ArcStartY
=
ArcEndY
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
StateDrawArc
=
1
;
Arc
->
m_Fill
=
FlSymbol_Fill
;
Arc
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
new
LibDrawCircle
();
CurrentDrawItem
=
Circle
;
Circle
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Circle
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Circle
->
m_Fill
=
FlSymbol_Fill
;
Circle
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
CurrentDrawItem
=
Square
;
Square
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Square
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Square
->
m_End
=
Square
->
m_Pos
;
Square
->
m_Fill
=
FlSymbol_Fill
;
Square
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
new
LibDrawPolyline
();
CurrentDrawItem
=
polyline
;
polyline
->
n
=
2
;
ptpoly
=
(
int
*
)
MyZMalloc
(
4
*
sizeof
(
int
));
polyline
->
PolyList
=
ptpoly
;
ptpoly
[
0
]
=
ptpoly
[
2
]
=
m_CurrentScreen
->
m_Curseur
.
x
;
ptpoly
[
1
]
=
ptpoly
[
3
]
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
polyline
->
m_Fill
=
FlSymbol_Fill
;
polyline
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
{
LibDrawSegment
*
Segment
=
new
LibDrawSegment
();
CurrentDrawItem
=
Segment
;
Segment
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Segment
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Segment
->
m_End
=
Segment
->
m_Pos
;
Segment
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
new
LibDrawText
();
CurrentDrawItem
=
Text
;
Text
->
m_Size
.
x
=
Text
->
m_Size
.
y
=
g_LastTextSize
;
Text
->
m_Horiz
=
g_LastTextOrient
;
Text
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Text
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
EditSymbolText
(
NULL
,
Text
);
if
(
Text
->
m_Text
.
IsEmpty
()
)
{
delete
Text
;
CurrentDrawItem
=
NULL
;
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
}
else
{
StartMoveDrawSymbol
(
DC
);
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
Text
,
CurrentUnit
,
g_XorMode
);
}
}
break
;
}
if
(
CurrentDrawItem
)
{
CurrentDrawItem
->
m_Flags
|=
IS_NEW
;
if
(
g_FlDrawSpecificUnit
)
CurrentDrawItem
->
m_Unit
=
CurrentUnit
;
if
(
g_FlDrawSpecificConvert
)
CurrentDrawItem
->
m_Convert
=
CurrentConvert
;
}
DrawPanel
->
MouseToCursorSchema
();
DrawPanel
->
m_IgnoreMouseEvents
=
FALSE
;
return
CurrentDrawItem
;
int
DrawType
;
int
*
ptpoly
;
if
(
CurrentDrawItem
)
return
NULL
;
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
// Creation du nouvel element
switch
(
m_ID_current_state
)
{
case
ID_LIBEDIT_BODY_LINE_BUTT
:
DrawType
=
COMPONENT_POLYLINE_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_ARC_BUTT
:
DrawType
=
COMPONENT_ARC_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_CIRCLE_BUTT
:
DrawType
=
COMPONENT_CIRCLE_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_RECT_BUTT
:
DrawType
=
COMPONENT_RECT_DRAW_TYPE
;
break
;
case
ID_LIBEDIT_BODY_TEXT_BUTT
:
DrawType
=
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
;
break
;
default
:
DisplayError
(
this
,
wxT
(
"SymbolBeginDrawItem Internal err: Id error"
)
);
return
NULL
;
}
DrawPanel
->
ManageCurseur
=
SymbolDisplayDraw
;
DrawPanel
->
ForceCloseManageCurseur
=
AbortSymbolTraceOn
;
switch
(
DrawType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
LibDrawArc
*
Arc
=
new
LibDrawArc
();
CurrentDrawItem
=
Arc
;
ArcStartX
=
ArcEndX
=
m_CurrentScreen
->
m_Curseur
.
x
;
ArcStartY
=
ArcEndY
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
StateDrawArc
=
1
;
Arc
->
m_Fill
=
FlSymbol_Fill
;
Arc
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
{
LibDrawCircle
*
Circle
=
new
LibDrawCircle
();
CurrentDrawItem
=
Circle
;
Circle
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Circle
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Circle
->
m_Fill
=
FlSymbol_Fill
;
Circle
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
{
LibDrawSquare
*
Square
=
new
LibDrawSquare
();
CurrentDrawItem
=
Square
;
Square
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Square
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Square
->
m_End
=
Square
->
m_Pos
;
Square
->
m_Fill
=
FlSymbol_Fill
;
Square
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
LibDrawPolyline
*
polyline
=
new
LibDrawPolyline
();
CurrentDrawItem
=
polyline
;
polyline
->
n
=
2
;
ptpoly
=
(
int
*
)
MyZMalloc
(
4
*
sizeof
(
int
)
);
polyline
->
PolyList
=
ptpoly
;
ptpoly
[
0
]
=
ptpoly
[
2
]
=
m_CurrentScreen
->
m_Curseur
.
x
;
ptpoly
[
1
]
=
ptpoly
[
3
]
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
polyline
->
m_Fill
=
FlSymbol_Fill
;
polyline
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
{
LibDrawSegment
*
Segment
=
new
LibDrawSegment
();
CurrentDrawItem
=
Segment
;
Segment
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Segment
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
Segment
->
m_End
=
Segment
->
m_Pos
;
Segment
->
m_Width
=
g_LibSymbolDefaultLineWidth
;
}
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
{
LibDrawText
*
Text
=
new
LibDrawText
();
CurrentDrawItem
=
Text
;
Text
->
m_Size
.
x
=
Text
->
m_Size
.
y
=
g_LastTextSize
;
Text
->
m_Horiz
=
g_LastTextOrient
;
Text
->
m_Pos
.
x
=
m_CurrentScreen
->
m_Curseur
.
x
;
Text
->
m_Pos
.
y
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
EditSymbolText
(
NULL
,
Text
);
if
(
Text
->
m_Text
.
IsEmpty
()
)
{
delete
Text
;
CurrentDrawItem
=
NULL
;
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
}
else
{
StartMoveDrawSymbol
(
DC
);
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
Text
,
CurrentUnit
,
g_XorMode
);
}
}
break
;
}
if
(
CurrentDrawItem
)
{
CurrentDrawItem
->
m_Flags
|=
IS_NEW
;
if
(
g_FlDrawSpecificUnit
)
CurrentDrawItem
->
m_Unit
=
CurrentUnit
;
if
(
g_FlDrawSpecificConvert
)
CurrentDrawItem
->
m_Convert
=
CurrentConvert
;
}
DrawPanel
->
MouseToCursorSchema
();
DrawPanel
->
m_IgnoreMouseEvents
=
FALSE
;
return
CurrentDrawItem
;
}
/********************************************************/
void
WinEDA_LibeditFrame
::
GraphicItemBeginDraw
(
wxDC
*
DC
)
void
WinEDA_LibeditFrame
::
GraphicItemBeginDraw
(
wxDC
*
DC
)
/********************************************************/
/* Routine de creation d'un nouvel element type LibraryDrawStruct
*/
*/
{
if
(
CurrentDrawItem
==
NULL
)
return
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
if
(
StateDrawArc
==
1
)
{
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
StateDrawArc
=
2
;
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
break
;
}
if
(
StateDrawArc
>
1
)
{
EndDrawGraphicItem
(
DC
);
return
;
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
case
COMPONENT_RECT_DRAW_TYPE
:
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
EndDrawGraphicItem
(
DC
);
return
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
wxPoint
pos
=
m_CurrentScreen
->
m_Curseur
;
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
AddPoint
(
pos
);
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
}
if
(
CurrentDrawItem
==
NULL
)
return
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
if
(
StateDrawArc
==
1
)
{
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
StateDrawArc
=
2
;
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
break
;
}
if
(
StateDrawArc
>
1
)
{
EndDrawGraphicItem
(
DC
);
return
;
}
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
case
COMPONENT_RECT_DRAW_TYPE
:
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
EndDrawGraphicItem
(
DC
);
return
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
wxPoint
pos
=
m_CurrentScreen
->
m_Curseur
;
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
AddPoint
(
pos
);
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
default
:
;
}
}
/**************************************************************************/
static
void
RedrawWhileMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
static
void
RedrawWhileMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
/**************************************************************************/
/* Redraw the graphoc shape while moving
*/
*/
{
BASE_SCREEN
*
Screen
=
panel
->
m_Parent
->
m_CurrentScreen
;
int
mx
,
my
;
/* Erase shape in the old positon*/
if
(
erase
)
{
mx
=
ItemPreviousPos
.
x
-
StartCursor
.
x
,
my
=
ItemPreviousPos
.
y
-
StartCursor
.
y
;
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
mx
,
my
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
}
/* Redraw moved shape */
mx
=
Screen
->
m_Curseur
.
x
-
StartCursor
.
x
,
my
=
Screen
->
m_Curseur
.
y
-
StartCursor
.
y
;
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
mx
,
my
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
ItemPreviousPos
=
Screen
->
m_Curseur
;
BASE_SCREEN
*
Screen
=
panel
->
m_Parent
->
m_CurrentScreen
;
int
mx
,
my
;
/* Erase shape in the old positon*/
if
(
erase
)
{
mx
=
ItemPreviousPos
.
x
-
StartCursor
.
x
,
my
=
ItemPreviousPos
.
y
-
StartCursor
.
y
;
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
mx
,
my
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
}
/* Redraw moved shape */
mx
=
Screen
->
m_Curseur
.
x
-
StartCursor
.
x
,
my
=
Screen
->
m_Curseur
.
y
-
StartCursor
.
y
;
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
mx
,
my
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
ItemPreviousPos
=
Screen
->
m_Curseur
;
}
/*****************************************************************/
void
MoveLibDrawItemAt
(
LibEDA_BaseStruct
*
DrawItem
,
wxPoint
newpos
)
void
MoveLibDrawItemAt
(
LibEDA_BaseStruct
*
DrawItem
,
wxPoint
newpos
)
/*****************************************************************/
{
int
mx
=
newpos
.
x
,
my
=
newpos
.
y
;
wxSize
size
;
switch
(
DrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
dx
=
mx
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
;
int
dy
=
-
my
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcStart
.
x
+=
dx
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcStart
.
y
+=
dy
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcEnd
.
x
+=
dx
;
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcEnd
.
y
+=
dy
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
size
.
x
=
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
-
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
x
;
size
.
y
=
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
-
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
y
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
+
size
.
x
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
+
size
.
y
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
int
ii
,
imax
=
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
n
*
2
;
int
*
ptpoly
=
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
int
dx
=
mx
-
ptpoly
[
0
];
int
dy
=
-
my
-
ptpoly
[
1
];
for
(
ii
=
0
;
ii
<
imax
;
ii
+=
2
)
{
ptpoly
[
ii
]
+=
dx
;
ptpoly
[
ii
+
1
]
+=
dy
;
}
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
((
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
((
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
break
;
}
int
mx
=
newpos
.
x
,
my
=
newpos
.
y
;
wxSize
size
;
switch
(
DrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
{
int
dx
=
mx
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
;
int
dy
=
-
my
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcStart
.
x
+=
dx
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcStart
.
y
+=
dy
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcEnd
.
x
+=
dx
;
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_ArcEnd
.
y
+=
dy
;
break
;
}
case
COMPONENT_CIRCLE_DRAW_TYPE
:
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
size
.
x
=
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
-
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
x
;
size
.
y
=
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
-
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
y
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
+
size
.
x
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
+
size
.
y
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
{
int
ii
,
imax
=
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
n
*
2
;
int
*
ptpoly
=
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
int
dx
=
mx
-
ptpoly
[
0
];
int
dy
=
-
my
-
ptpoly
[
1
];
for
(
ii
=
0
;
ii
<
imax
;
ii
+=
2
)
{
ptpoly
[
ii
]
+=
dx
;
ptpoly
[
ii
+
1
]
+=
dy
;
}
}
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
(
(
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
.
x
=
mx
;
(
(
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
.
y
=
-
my
;
break
;
default
:
;
}
}
/************************************************************/
void
WinEDA_LibeditFrame
::
StartMoveDrawSymbol
(
wxDC
*
DC
)
void
WinEDA_LibeditFrame
::
StartMoveDrawSymbol
(
wxDC
*
DC
)
/************************************************************/
{
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
==
NULL
)
return
;
SetCursor
(
wxCURSOR_HAND
);
SetCursor
(
wxCURSOR_HAND
);
CurrentDrawItem
->
m_Flags
|=
IS_MOVED
;
StartCursor
=
m_CurrentScreen
->
m_Curseur
;
CurrentDrawItem
->
m_Flags
|=
IS_MOVED
;
StartCursor
=
m_CurrentScreen
->
m_Curseur
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
InitPosition
=
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
InitPosition
=
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
InitPosition
=
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
InitPosition
=
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
InitPosition
=
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
InitPosition
=
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
InitPosition
.
x
=
*
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
InitPosition
.
y
=
*
(((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
+
1
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
InitPosition
.
x
=
*
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
InitPosition
.
y
=
*
(
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
+
1
);
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
InitPosition
=
((
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
}
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
InitPosition
=
(
(
LibDrawText
*
)
CurrentDrawItem
)
->
m_Pos
;
break
;
ItemPreviousPos
=
m_CurrentScreen
->
m_Curseur
;
DrawPanel
->
ManageCurseur
=
RedrawWhileMovingCursor
;
DrawPanel
->
ForceCloseManageCurseur
=
AbortSymbolTraceOn
;
DrawPanel
->
ManageCurseur
(
DrawPanel
,
DC
,
TRUE
);
}
default
:
;
}
ItemPreviousPos
=
m_CurrentScreen
->
m_Curseur
;
DrawPanel
->
ManageCurseur
=
RedrawWhileMovingCursor
;
DrawPanel
->
ForceCloseManageCurseur
=
AbortSymbolTraceOn
;
DrawPanel
->
ManageCurseur
(
DrawPanel
,
DC
,
TRUE
);
}
/****************************************************************/
/* Routine de Gestion des evenements souris lors de la creation */
/* d'un nouvel element type LibraryDrawStruct */
/****************************************************************/
static
void
SymbolDisplayDraw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
static
void
SymbolDisplayDraw
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
{
int
DrawMode
=
g_XorMode
;
int
*
ptpoly
;
int
dx
,
dy
;
BASE_SCREEN
*
Screen
=
panel
->
m_Parent
->
m_CurrentScreen
;
int
mx
=
Screen
->
m_Curseur
.
x
,
my
=
Screen
->
m_Curseur
.
y
;
GRSetDrawMode
(
DC
,
DrawMode
);
if
(
erase
)
{
if
(
StateDrawArc
==
1
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
ArcEndX
,
-
ArcEndY
,
0
,
Color
);
}
else
{
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
DrawMode
);
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcEndX
,
-
ArcEndY
,
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
}
}
}
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
if
(
StateDrawArc
==
1
)
{
ArcEndX
=
mx
;
ArcEndY
=
-
my
;
}
if
(
StateDrawArc
==
2
)
{
ComputeArc
((
LibDrawArc
*
)
CurrentDrawItem
,
Screen
->
m_Curseur
);
}
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
dx
=
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
x
-
mx
;
dy
=
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
y
+
my
;
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Rayon
=
(
int
)
sqrt
(
(
dx
*
dx
)
+
(
dy
*
dy
)
);
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
;
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
ptpoly
=
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
ptpoly
+=
2
*
(((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
n
-
1
);
ptpoly
[
0
]
=
mx
;
ptpoly
[
1
]
=
-
my
;
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
((
LibDrawSegment
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
;
((
LibDrawSegment
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
;
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
/* Traite par des routines specifiques */
break
;
}
if
(
StateDrawArc
==
1
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
ArcEndX
,
-
ArcEndY
,
0
,
Color
);
}
else
{
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
DrawMode
);
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcEndX
,
-
ArcEndY
,
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
}
}
int
DrawMode
=
g_XorMode
;
int
*
ptpoly
;
int
dx
,
dy
;
BASE_SCREEN
*
Screen
=
panel
->
m_Parent
->
m_CurrentScreen
;
int
mx
=
Screen
->
m_Curseur
.
x
,
my
=
Screen
->
m_Curseur
.
y
;
GRSetDrawMode
(
DC
,
DrawMode
);
if
(
erase
)
{
if
(
StateDrawArc
==
1
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
ArcEndX
,
-
ArcEndY
,
0
,
Color
);
}
else
{
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
DrawMode
);
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcEndX
,
-
ArcEndY
,
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
}
}
}
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
if
(
StateDrawArc
==
1
)
{
ArcEndX
=
mx
;
ArcEndY
=
-
my
;
}
if
(
StateDrawArc
==
2
)
{
ComputeArc
(
(
LibDrawArc
*
)
CurrentDrawItem
,
Screen
->
m_Curseur
);
}
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
dx
=
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
x
-
mx
;
dy
=
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Pos
.
y
+
my
;
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Rayon
=
(
int
)
sqrt
(
(
dx
*
dx
)
+
(
dy
*
dy
)
);
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
;
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
ptpoly
=
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
PolyList
;
ptpoly
+=
2
*
(
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
n
-
1
);
ptpoly
[
0
]
=
mx
;
ptpoly
[
1
]
=
-
my
;
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_LINE_DRAW_TYPE
:
(
(
LibDrawSegment
*
)
CurrentDrawItem
)
->
m_End
.
x
=
mx
;
(
(
LibDrawSegment
*
)
CurrentDrawItem
)
->
m_End
.
y
=
-
my
;
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
/* Traite par des routines specifiques */
break
;
default
:
;
}
if
(
StateDrawArc
==
1
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
ArcEndX
,
-
ArcEndY
,
0
,
Color
);
}
else
{
DrawLibraryDrawStruct
(
panel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
DrawMode
);
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
int
Color
=
ReturnLayerColor
(
LAYER_DEVICE
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcStartX
,
-
ArcStartY
,
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
GRDashedLine
(
&
panel
->
m_ClipBox
,
DC
,
ArcEndX
,
-
ArcEndY
,
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
x
,
-
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Pos
.
y
,
0
,
Color
);
}
}
}
/******************************************************/
void
WinEDA_LibeditFrame
::
EndDrawGraphicItem
(
wxDC
*
DC
)
void
WinEDA_LibeditFrame
::
EndDrawGraphicItem
(
wxDC
*
DC
)
/******************************************************/
/* Place la structure courante en liste des structures du composant
courant, si elle existe et redessine toujours celle ci
Parametres: (tous globaux)
CurrentDrawItem
CurrentLibEntry
*/
*
courant, si elle existe et redessine toujours celle ci
*
Parametres: (tous globaux)
*
CurrentDrawItem
*
CurrentLibEntry
*/
{
if
(
CurrentLibEntry
==
NULL
)
return
;
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
if
(
StateDrawArc
==
1
)
/* Trace d'arc en cours: doit etre termine */
{
DisplayError
(
this
,
wxT
(
"Arc in progress.."
),
10
);
return
;
}
else
{
if
(
(
CurrentDrawItem
->
m_Flags
&
IS_MOVED
)
==
0
)
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
}
}
StateDrawArc
=
0
;
if
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
{
SaveCopyInUndoList
(
CurrentLibEntry
);
CurrentDrawItem
->
Pnext
=
CurrentLibEntry
->
m_Drawings
;
CurrentLibEntry
->
m_Drawings
=
CurrentDrawItem
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
((
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
((
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
((
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
((
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
case
COMPONENT_LINE_DRAW_TYPE
:
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
break
;
}
CurrentLibEntry
->
SortDrawItems
();
}
if
(
m_ID_current_state
)
SetCursor
(
wxCURSOR_PENCIL
);
else
SetCursor
(
wxCURSOR_ARROW
);
if
(
(
CurrentDrawItem
->
m_Flags
&
IS_MOVED
)
)
{
wxPoint
pos
;
pos
.
x
=
GetScreen
()
->
m_Curseur
.
x
+
InitPosition
.
x
-
StartCursor
.
x
,
pos
.
y
=
GetScreen
()
->
m_Curseur
.
y
-
InitPosition
.
y
-
StartCursor
.
y
;
MoveLibDrawItemAt
(
CurrentDrawItem
,
pos
);
}
DrawLibEntry
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentUnit
,
CurrentConvert
,
GR_DEFAULT_DRAWMODE
);
CurrentDrawItem
->
m_Flags
=
0
;
CurrentDrawItem
=
NULL
;
m_CurrentScreen
->
SetModify
();
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
if
(
CurrentLibEntry
==
NULL
)
return
;
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_StructType
==
COMPONENT_ARC_DRAW_TYPE
)
{
if
(
StateDrawArc
==
1
)
/* Trace d'arc en cours: doit etre termine */
{
DisplayError
(
this
,
wxT
(
"Arc in progress.."
),
10
);
return
;
}
else
{
if
(
(
CurrentDrawItem
->
m_Flags
&
IS_MOVED
)
==
0
)
SymbolDisplayDraw
(
DrawPanel
,
DC
,
FALSE
);
}
}
StateDrawArc
=
0
;
if
(
CurrentDrawItem
->
m_Flags
&
IS_NEW
)
{
SaveCopyInUndoList
(
CurrentLibEntry
);
CurrentDrawItem
->
Pnext
=
CurrentLibEntry
->
m_Drawings
;
CurrentLibEntry
->
m_Drawings
=
CurrentDrawItem
;
switch
(
CurrentDrawItem
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
(
(
LibDrawArc
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
(
(
LibDrawCircle
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
(
(
LibDrawSquare
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
(
(
LibDrawPolyline
*
)
CurrentDrawItem
)
->
m_Fill
=
FlSymbol_Fill
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
case
COMPONENT_LINE_DRAW_TYPE
:
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
break
;
default
:
;
}
CurrentLibEntry
->
SortDrawItems
();
}
if
(
m_ID_current_state
)
SetCursor
(
wxCURSOR_PENCIL
);
else
SetCursor
(
wxCURSOR_ARROW
);
if
(
(
CurrentDrawItem
->
m_Flags
&
IS_MOVED
)
)
{
wxPoint
pos
;
pos
.
x
=
GetScreen
()
->
m_Curseur
.
x
+
InitPosition
.
x
-
StartCursor
.
x
,
pos
.
y
=
GetScreen
()
->
m_Curseur
.
y
-
InitPosition
.
y
-
StartCursor
.
y
;
MoveLibDrawItemAt
(
CurrentDrawItem
,
pos
);
}
DrawLibEntry
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentUnit
,
CurrentConvert
,
GR_DEFAULT_DRAWMODE
);
CurrentDrawItem
->
m_Flags
=
0
;
CurrentDrawItem
=
NULL
;
m_CurrentScreen
->
SetModify
();
DrawPanel
->
ManageCurseur
=
NULL
;
DrawPanel
->
ForceCloseManageCurseur
=
NULL
;
}
/***************************************************************/
static
void
ComputeArc
(
LibDrawArc
*
DrawItem
,
wxPoint
ArcCentre
)
static
void
ComputeArc
(
LibDrawArc
*
DrawItem
,
wxPoint
ArcCentre
)
/***************************************************************/
/* routine d'ajustage des parametres de l'arc en cours de trace
calcule le centre, rayon, angles pour que l'arc en cours
passe par les points ArcStartX,Y et ArcEndX,Y avec le centre le plus proche
de la pos souris
Remarque: le centre n'est evidemment pas sur la grille
*/
*
calcule le centre, rayon, angles pour que l'arc en cours
*
passe par les points ArcStartX,Y et ArcEndX,Y avec le centre le plus proche
*
de la pos souris
*
Remarque: le centre n'est evidemment pas sur la grille
*/
{
int
dx
,
dy
;
int
cX
,
cY
;
/* Coord centre de l'arc */
int
angle
;
cX
=
ArcCentre
.
x
;
cY
=
ArcCentre
.
y
;
cY
=
-
cY
;
/* Attention a l'orientation de l'axe Y */
/* calcul de cX et cY pour que l'arc passe par ArcStartX,Y et ArcEndX,Y */
dx
=
ArcEndX
-
ArcStartX
;
dy
=
ArcEndY
-
ArcStartY
;
cX
-=
ArcStartX
;
cY
-=
ArcStartY
;
angle
=
(
int
)(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
RotatePoint
(
&
dx
,
&
dy
,
angle
);
/* Le segment dx, dy est horizontal */
/* -> dx = longueur, dy = 0 */
RotatePoint
(
&
cX
,
&
cY
,
angle
);
cX
=
dx
/
2
;
/* cX, cY est sur la mediane du segment 0,0 a dx,0 */
RotatePoint
(
&
cX
,
&
cY
,
-
angle
);
cX
+=
ArcStartX
;
cY
+=
ArcStartY
;
DrawItem
->
m_Pos
.
x
=
cX
;
DrawItem
->
m_Pos
.
y
=
cY
;
dx
=
ArcStartX
-
DrawItem
->
m_Pos
.
x
;
dy
=
ArcStartY
-
DrawItem
->
m_Pos
.
y
;
DrawItem
->
m_Rayon
=
(
int
)
sqrt
(
(
dx
*
dx
)
+
(
dy
*
dy
)
);
DrawItem
->
t1
=
(
int
)(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
dx
=
ArcEndX
-
DrawItem
->
m_Pos
.
x
;
dy
=
ArcEndY
-
DrawItem
->
m_Pos
.
y
;
DrawItem
->
t2
=
(
int
)(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
DrawItem
->
m_ArcStart
.
x
=
ArcStartX
;
DrawItem
->
m_ArcStart
.
y
=
ArcStartY
;
DrawItem
->
m_ArcEnd
.
x
=
ArcEndX
;
DrawItem
->
m_ArcEnd
.
y
=
ArcEndY
;
NORMALIZE_ANGLE
(
DrawItem
->
t1
);
NORMALIZE_ANGLE
(
DrawItem
->
t2
);
// angles = 0 .. 3600
// limitation val abs a < 1800 (1/2 cercle) pour eviter Pbs d'affichage en miroir
// car en trace on suppose que l'arc fait moins de 180 deg pour trouver
// son orientation apres rot, miroir...
if
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
>
1800
)
DrawItem
->
t2
-=
3600
;
else
if
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
<=
-
1800
)
DrawItem
->
t2
+=
3600
;
wxString
msg
;
angle
=
DrawItem
->
t2
-
DrawItem
->
t1
;
msg
.
Printf
(
_
(
"Arc %.1f deg"
),
(
float
)
angle
/
10
);
EDA_Appl
->
LibeditFrame
->
PrintMsg
(
msg
);
while
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
>=
1800
)
{
DrawItem
->
t2
--
;
DrawItem
->
t1
++
;
}
while
(
(
DrawItem
->
t1
-
DrawItem
->
t2
)
>=
1800
)
{
DrawItem
->
t2
++
;
DrawItem
->
t1
--
;
}
NORMALIZE_ANGLE
(
DrawItem
->
t1
);
NORMALIZE_ANGLE
(
DrawItem
->
t2
);
int
dx
,
dy
;
int
cX
,
cY
;
/* Coord centre de l'arc */
int
angle
;
cX
=
ArcCentre
.
x
;
cY
=
ArcCentre
.
y
;
cY
=
-
cY
;
/* Attention a l'orientation de l'axe Y */
/* calcul de cX et cY pour que l'arc passe par ArcStartX,Y et ArcEndX,Y */
dx
=
ArcEndX
-
ArcStartX
;
dy
=
ArcEndY
-
ArcStartY
;
cX
-=
ArcStartX
;
cY
-=
ArcStartY
;
angle
=
(
int
)
(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
RotatePoint
(
&
dx
,
&
dy
,
angle
);
/* Le segment dx, dy est horizontal */
/* -> dx = longueur, dy = 0 */
RotatePoint
(
&
cX
,
&
cY
,
angle
);
cX
=
dx
/
2
;
/* cX, cY est sur la mediane du segment 0,0 a dx,0 */
RotatePoint
(
&
cX
,
&
cY
,
-
angle
);
cX
+=
ArcStartX
;
cY
+=
ArcStartY
;
DrawItem
->
m_Pos
.
x
=
cX
;
DrawItem
->
m_Pos
.
y
=
cY
;
dx
=
ArcStartX
-
DrawItem
->
m_Pos
.
x
;
dy
=
ArcStartY
-
DrawItem
->
m_Pos
.
y
;
DrawItem
->
m_Rayon
=
(
int
)
sqrt
(
(
dx
*
dx
)
+
(
dy
*
dy
)
);
DrawItem
->
t1
=
(
int
)
(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
dx
=
ArcEndX
-
DrawItem
->
m_Pos
.
x
;
dy
=
ArcEndY
-
DrawItem
->
m_Pos
.
y
;
DrawItem
->
t2
=
(
int
)
(
atan2
(
dy
,
dx
)
*
1800
/
M_PI
);
DrawItem
->
m_ArcStart
.
x
=
ArcStartX
;
DrawItem
->
m_ArcStart
.
y
=
ArcStartY
;
DrawItem
->
m_ArcEnd
.
x
=
ArcEndX
;
DrawItem
->
m_ArcEnd
.
y
=
ArcEndY
;
NORMALIZE_ANGLE
(
DrawItem
->
t1
);
NORMALIZE_ANGLE
(
DrawItem
->
t2
);
// angles = 0 .. 3600
// limitation val abs a < 1800 (1/2 cercle) pour eviter Pbs d'affichage en miroir
// car en trace on suppose que l'arc fait moins de 180 deg pour trouver
// son orientation apres rot, miroir...
if
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
>
1800
)
DrawItem
->
t2
-=
3600
;
else
if
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
<=
-
1800
)
DrawItem
->
t2
+=
3600
;
wxString
msg
;
angle
=
DrawItem
->
t2
-
DrawItem
->
t1
;
msg
.
Printf
(
_
(
"Arc %.1f deg"
),
(
float
)
angle
/
10
);
EDA_Appl
->
LibeditFrame
->
PrintMsg
(
msg
);
while
(
(
DrawItem
->
t2
-
DrawItem
->
t1
)
>=
1800
)
{
DrawItem
->
t2
--
;
DrawItem
->
t1
++
;
}
while
(
(
DrawItem
->
t1
-
DrawItem
->
t2
)
>=
1800
)
{
DrawItem
->
t2
++
;
DrawItem
->
t1
--
;
}
NORMALIZE_ANGLE
(
DrawItem
->
t1
);
NORMALIZE_ANGLE
(
DrawItem
->
t2
);
}
/***************************************************/
void
WinEDA_LibeditFrame
::
DeleteDrawPoly
(
wxDC
*
DC
)
void
WinEDA_LibeditFrame
::
DeleteDrawPoly
(
wxDC
*
DC
)
/**************************************************/
/* Used for deleting last entered segment while creating a Polyline
*/
*/
{
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_StructType
!=
COMPONENT_POLYLINE_DRAW_TYPE
)
return
;
int
*
ptpoly
;
LibDrawPolyline
*
Poly
=
(
LibDrawPolyline
*
)
CurrentDrawItem
;
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
while
(
Poly
->
n
>
2
)
// First segment is kept, only its end point is changed
{
Poly
->
n
--
;
ptpoly
=
Poly
->
PolyList
+
(
2
*
(
Poly
->
n
-
1
)
);
if
(
(
ptpoly
[
0
]
!=
m_CurrentScreen
->
m_Curseur
.
x
)
||
(
ptpoly
[
1
]
!=
-
m_CurrentScreen
->
m_Curseur
.
y
)
)
{
ptpoly
[
0
]
=
m_CurrentScreen
->
m_Curseur
.
x
;
ptpoly
[
1
]
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
break
;
}
}
int
allocsize
=
2
*
sizeof
(
int
)
*
Poly
->
n
;
Poly
->
PolyList
=
(
int
*
)
realloc
(
Poly
->
PolyList
,
allocsize
);
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
if
(
CurrentDrawItem
==
NULL
)
return
;
if
(
CurrentDrawItem
->
m_StructType
!=
COMPONENT_POLYLINE_DRAW_TYPE
)
return
;
int
*
ptpoly
;
LibDrawPolyline
*
Poly
=
(
LibDrawPolyline
*
)
CurrentDrawItem
;
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
while
(
Poly
->
n
>
2
)
// First segment is kept, only its end point is changed
{
Poly
->
n
--
;
ptpoly
=
Poly
->
PolyList
+
(
2
*
(
Poly
->
n
-
1
)
);
if
(
(
ptpoly
[
0
]
!=
m_CurrentScreen
->
m_Curseur
.
x
)
||
(
ptpoly
[
1
]
!=
-
m_CurrentScreen
->
m_Curseur
.
y
)
)
{
ptpoly
[
0
]
=
m_CurrentScreen
->
m_Curseur
.
x
;
ptpoly
[
1
]
=
-
m_CurrentScreen
->
m_Curseur
.
y
;
break
;
}
}
int
allocsize
=
2
*
sizeof
(
int
)
*
Poly
->
n
;
Poly
->
PolyList
=
(
int
*
)
realloc
(
Poly
->
PolyList
,
allocsize
);
DrawLibraryDrawStruct
(
DrawPanel
,
DC
,
CurrentLibEntry
,
0
,
0
,
CurrentDrawItem
,
CurrentUnit
,
g_XorMode
);
}
eeschema/symbedit.cpp
View file @
f3c324d5
/*************************************************/
/* Functions to Load from file and save to file */
/* the graphic shapes used to draw a component */
/* When using the import/export symbol options */
/* files are the *.sym files */
/*************************************************/
/*************************************************/
/* Functions to Load from file and save to file */
/* the graphic shapes used to draw a component */
/* When using the import/export symbol options */
/* files are the *.sym files */
/*************************************************/
/* fichier symbedit.cpp */
/* fichier symbedit.cpp */
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -19,362 +19,406 @@
/* Routines locales */
static
bool
CompareSymbols
(
LibEDA_BaseStruct
*
DEntryRef
,
LibEDA_BaseStruct
*
DEntryCompare
);
static
bool
CompareSymbols
(
LibEDA_BaseStruct
*
DEntryRef
,
LibEDA_BaseStruct
*
DEntryCompare
);
/* Variables locales */
/***************************************************/
void
WinEDA_LibeditFrame
::
LoadOneSymbol
(
wxDC
*
DC
)
void
WinEDA_LibeditFrame
::
LoadOneSymbol
(
wxDC
*
DC
)
/***************************************************/
/* Read a component shape file and add data (graphic items) to the current
component.
*/
*
component.
*/
{
int
NumOfParts
;
PriorQue
*
Entries
;
EDA_LibComponentStruct
*
LibEntry
=
NULL
;
LibEDA_BaseStruct
*
DrawEntry
;
wxString
FullFileName
,
mask
;
FILE
*
ImportFile
;
wxString
msg
;
if
(
CurrentDrawItem
)
return
;
if
(
CurrentLibEntry
==
NULL
)
return
;
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
mask
=
wxT
(
"*"
)
+
g_SymbolExtBuffer
;
FullFileName
=
EDA_FileSelector
(
_
(
"Import symbol drawings:"
),
g_RealLibDirBuffer
,
/* Chemin par defaut */
wxEmptyString
,
/* nom fichier par defaut */
g_SymbolExtBuffer
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
this
,
0
,
TRUE
);
GetScreen
()
->
m_Curseur
=
wxPoint
(
0
,
0
);
DrawPanel
->
MouseToCursorSchema
();
DrawPanel
->
m_IgnoreMouseEvents
=
FALSE
;
if
(
FullFileName
.
IsEmpty
()
)
return
;
/* Load data */
ImportFile
=
wxFopen
(
FullFileName
,
wxT
(
"rt"
));
if
(
ImportFile
==
NULL
)
{
msg
.
Printf
(
_
(
"Failed to open Symbol File <%s>"
),
FullFileName
.
GetData
());
DisplayError
(
this
,
msg
,
20
);
return
;
}
Entries
=
LoadLibraryAux
(
this
,
NULL
,
ImportFile
,
&
NumOfParts
);
fclose
(
ImportFile
);
if
(
Entries
==
NULL
)
return
;
if
(
NumOfParts
>
1
)
DisplayError
(
this
,
_
(
"Warning: more than 1 part in Symbol File"
),
20
);
LibEntry
=
(
EDA_LibComponentStruct
*
)
PQFirst
(
&
Entries
,
FALSE
);
if
(
LibEntry
==
NULL
)
DisplayError
(
this
,
_
(
"Symbol File is void"
),
20
);
else
/* add data to the current symbol */
{
DrawEntry
=
LibEntry
->
m_Drawings
;
while
(
DrawEntry
)
{
if
(
DrawEntry
->
m_Unit
)
DrawEntry
->
m_Unit
=
CurrentUnit
;
if
(
DrawEntry
->
m_Convert
)
DrawEntry
->
m_Convert
=
CurrentConvert
;
DrawEntry
->
m_Flags
=
IS_NEW
;
DrawEntry
->
m_Selected
=
IS_SELECTED
;
if
(
DrawEntry
->
Pnext
==
NULL
)
{
/* Fin de liste trouvee */
DrawEntry
->
Pnext
=
CurrentLibEntry
->
m_Drawings
;
CurrentLibEntry
->
m_Drawings
=
LibEntry
->
m_Drawings
;
LibEntry
->
m_Drawings
=
NULL
;
break
;
}
DrawEntry
=
DrawEntry
->
Next
();
}
SuppressDuplicateDrawItem
(
CurrentLibEntry
);
m_CurrentScreen
->
SetModify
();
// Move (and place ) the new draw items:
HandleBlockBegin
(
DC
,
-
1
,
GetScreen
()
->
m_Curseur
);
HandleBlockEnd
(
DC
);
RedrawActiveWindow
(
DC
,
TRUE
);
}
PQFreeFunc
(
Entries
,
(
void
(
*
)(
void
*
))
FreeLibraryEntry
);
int
NumOfParts
;
PriorQue
*
Entries
;
EDA_LibComponentStruct
*
LibEntry
=
NULL
;
LibEDA_BaseStruct
*
DrawEntry
;
wxString
FullFileName
,
mask
;
FILE
*
ImportFile
;
wxString
msg
;
if
(
CurrentDrawItem
)
return
;
if
(
CurrentLibEntry
==
NULL
)
return
;
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
mask
=
wxT
(
"*"
)
+
g_SymbolExtBuffer
;
FullFileName
=
EDA_FileSelector
(
_
(
"Import symbol drawings:"
),
g_RealLibDirBuffer
,
/* Chemin par defaut */
wxEmptyString
,
/* nom fichier par defaut */
g_SymbolExtBuffer
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
this
,
0
,
TRUE
);
GetScreen
()
->
m_Curseur
=
wxPoint
(
0
,
0
);
DrawPanel
->
MouseToCursorSchema
();
DrawPanel
->
m_IgnoreMouseEvents
=
FALSE
;
if
(
FullFileName
.
IsEmpty
()
)
return
;
/* Load data */
ImportFile
=
wxFopen
(
FullFileName
,
wxT
(
"rt"
)
);
if
(
ImportFile
==
NULL
)
{
msg
.
Printf
(
_
(
"Failed to open Symbol File <%s>"
),
FullFileName
.
GetData
()
);
DisplayError
(
this
,
msg
,
20
);
return
;
}
Entries
=
LoadLibraryAux
(
this
,
NULL
,
ImportFile
,
&
NumOfParts
);
fclose
(
ImportFile
);
if
(
Entries
==
NULL
)
return
;
if
(
NumOfParts
>
1
)
DisplayError
(
this
,
_
(
"Warning: more than 1 part in Symbol File"
),
20
);
LibEntry
=
(
EDA_LibComponentStruct
*
)
PQFirst
(
&
Entries
,
FALSE
);
if
(
LibEntry
==
NULL
)
DisplayError
(
this
,
_
(
"Symbol File is void"
),
20
);
else
/* add data to the current symbol */
{
DrawEntry
=
LibEntry
->
m_Drawings
;
while
(
DrawEntry
)
{
if
(
DrawEntry
->
m_Unit
)
DrawEntry
->
m_Unit
=
CurrentUnit
;
if
(
DrawEntry
->
m_Convert
)
DrawEntry
->
m_Convert
=
CurrentConvert
;
DrawEntry
->
m_Flags
=
IS_NEW
;
DrawEntry
->
m_Selected
=
IS_SELECTED
;
if
(
DrawEntry
->
Pnext
==
NULL
)
{
/* Fin de liste trouvee */
DrawEntry
->
Pnext
=
CurrentLibEntry
->
m_Drawings
;
CurrentLibEntry
->
m_Drawings
=
LibEntry
->
m_Drawings
;
LibEntry
->
m_Drawings
=
NULL
;
break
;
}
DrawEntry
=
DrawEntry
->
Next
();
}
SuppressDuplicateDrawItem
(
CurrentLibEntry
);
m_CurrentScreen
->
SetModify
();
// Move (and place ) the new draw items:
HandleBlockBegin
(
DC
,
-
1
,
GetScreen
()
->
m_Curseur
);
HandleBlockEnd
(
DC
);
RedrawActiveWindow
(
DC
,
TRUE
);
}
PQFreeFunc
(
Entries
,
(
void
(
*
)
(
void
*
)
)
FreeLibraryEntry
);
}
/********************************************/
void
WinEDA_LibeditFrame
::
SaveOneSymbol
(
void
)
void
WinEDA_LibeditFrame
::
SaveOneSymbol
(
void
)
/********************************************/
/* Save in file the current symbol
file format is like the standard libraries, but there is only one symbol
Invisible pins are not saved
*/
*
file format is like the standard libraries, but there is only one symbol
*
Invisible pins are not saved
*/
{
EDA_LibComponentStruct
*
LibEntry
=
CurrentLibEntry
;
int
Unit
=
CurrentUnit
,
convert
=
CurrentConvert
;
int
SymbUnit
,
SymbConvert
;
LibEDA_BaseStruct
*
DrawEntry
;
wxString
FullFileName
,
mask
;
wxString
msg
;
FILE
*
ExportFile
;
if
(
LibEntry
->
m_Drawings
==
NULL
)
return
;
/* Creation du fichier symbole */
mask
=
wxT
(
"*"
)
+
g_SymbolExtBuffer
;
FullFileName
=
EDA_FileSelector
(
_
(
"Export symbol drawings:"
),
g_RealLibDirBuffer
,
/* Chemin par defaut */
wxEmptyString
,
/* nom fichier par defaut */
g_SymbolExtBuffer
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
this
,
wxFD_SAVE
,
TRUE
);
if
(
FullFileName
.
IsEmpty
()
)
return
;
ExportFile
=
wxFopen
(
FullFileName
,
wxT
(
"wt"
)
);
if
(
ExportFile
==
NULL
)
{
msg
.
Printf
(
_
(
"Unable to create <%s>"
),
FullFileName
.
GetData
());
DisplayError
(
this
,
msg
);
return
;
}
msg
.
Printf
(
_
(
"Save Symbol in [%s]"
),
FullFileName
.
GetData
());
Affiche_Message
(
msg
);
/* Creation de l'entete de la librairie */
char
Line
[
256
];
fprintf
(
ExportFile
,
"%s %d.%d %s Date: %s
\n
"
,
LIBFILE_IDENT
,
LIB_VERSION_MAJOR
,
LIB_VERSION_MINOR
,
"SYMBOL"
,
DateAndTime
(
Line
));
/* Creation du commentaire donnant le nom du composant */
fprintf
(
ExportFile
,
"# SYMBOL %s
\n
#
\n
"
,
(
const
char
*
)
LibEntry
->
m_Name
.
m_Text
.
GetData
());
/* Generation des lignes utiles */
fprintf
(
ExportFile
,
"DEF %s"
,
(
const
char
*
)
LibEntry
->
m_Name
.
m_Text
.
GetData
());
if
(
!
LibEntry
->
m_Prefix
.
m_Text
.
IsEmpty
())
fprintf
(
ExportFile
,
" %s"
,
(
const
char
*
)
LibEntry
->
m_Prefix
.
m_Text
.
GetData
());
else
fprintf
(
ExportFile
,
" ~"
);
fprintf
(
ExportFile
,
" %d %d %c %c %d %d %c
\n
"
,
0
,
/* unused */
LibEntry
->
m_TextInside
,
LibEntry
->
m_DrawPinNum
?
'Y'
:
'N'
,
LibEntry
->
m_DrawPinName
?
'Y'
:
'N'
,
1
,
0
/* unused */
,
'N'
);
/* Position / orientation / visibilite des champs */
EDA_LibComponentStruct
*
LibEntry
=
CurrentLibEntry
;
int
Unit
=
CurrentUnit
,
convert
=
CurrentConvert
;
int
SymbUnit
,
SymbConvert
;
LibEDA_BaseStruct
*
DrawEntry
;
wxString
FullFileName
,
mask
;
wxString
msg
;
FILE
*
ExportFile
;
if
(
LibEntry
->
m_Drawings
==
NULL
)
return
;
/* Creation du fichier symbole */
mask
=
wxT
(
"*"
)
+
g_SymbolExtBuffer
;
FullFileName
=
EDA_FileSelector
(
_
(
"Export symbol drawings:"
),
g_RealLibDirBuffer
,
/* Chemin par defaut */
wxEmptyString
,
/* nom fichier par defaut */
g_SymbolExtBuffer
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
this
,
wxFD_SAVE
,
TRUE
);
if
(
FullFileName
.
IsEmpty
()
)
return
;
ExportFile
=
wxFopen
(
FullFileName
,
wxT
(
"wt"
)
);
if
(
ExportFile
==
NULL
)
{
msg
.
Printf
(
_
(
"Unable to create <%s>"
),
FullFileName
.
GetData
()
);
DisplayError
(
this
,
msg
);
return
;
}
msg
.
Printf
(
_
(
"Save Symbol in [%s]"
),
FullFileName
.
GetData
()
);
Affiche_Message
(
msg
);
/* Creation de l'entete de la librairie */
char
Line
[
256
];
fprintf
(
ExportFile
,
"%s %d.%d %s Date: %s
\n
"
,
LIBFILE_IDENT
,
LIB_VERSION_MAJOR
,
LIB_VERSION_MINOR
,
"SYMBOL"
,
DateAndTime
(
Line
)
);
/* Creation du commentaire donnant le nom du composant */
fprintf
(
ExportFile
,
"# SYMBOL %s
\n
#
\n
"
,
(
const
char
*
)
LibEntry
->
m_Name
.
m_Text
.
GetData
()
);
/* Generation des lignes utiles */
fprintf
(
ExportFile
,
"DEF %s"
,
(
const
char
*
)
LibEntry
->
m_Name
.
m_Text
.
GetData
()
);
if
(
!
LibEntry
->
m_Prefix
.
m_Text
.
IsEmpty
()
)
fprintf
(
ExportFile
,
" %s"
,
(
const
char
*
)
LibEntry
->
m_Prefix
.
m_Text
.
GetData
()
);
else
fprintf
(
ExportFile
,
" ~"
);
fprintf
(
ExportFile
,
" %d %d %c %c %d %d %c
\n
"
,
0
,
/* unused */
LibEntry
->
m_TextInside
,
LibEntry
->
m_DrawPinNum
?
'Y'
:
'N'
,
LibEntry
->
m_DrawPinName
?
'Y'
:
'N'
,
1
,
0
/* unused */
,
'N'
);
/* Position / orientation / visibilite des champs */
LibEntry
->
m_Prefix
.
WriteDescr
(
ExportFile
);
LibEntry
->
m_Name
.
WriteDescr
(
ExportFile
);
DrawEntry
=
LibEntry
->
m_Drawings
;
if
(
DrawEntry
)
{
fprintf
(
ExportFile
,
"DRAW
\n
"
);
for
(
;
DrawEntry
!=
NULL
;
DrawEntry
=
DrawEntry
->
Next
())
{
/* Elimination des elements non relatifs a l'unite */
if
(
Unit
&&
DrawEntry
->
m_Unit
&&
(
DrawEntry
->
m_Unit
!=
Unit
)
)
continue
;
if
(
convert
&&
DrawEntry
->
m_Convert
&&
(
DrawEntry
->
m_Convert
!=
convert
)
)
continue
;
/* .Unit , . Convert est laisse a 0 ou mis a 1 */
SymbUnit
=
DrawEntry
->
m_Unit
;
if
(
SymbUnit
>
1
)
SymbUnit
=
1
;
SymbConvert
=
DrawEntry
->
m_Convert
;
if
(
SymbConvert
>
1
)
SymbConvert
=
1
;
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#define DRAWSTRUCT ((LibDrawArc *) DrawEntry)
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ((LibDrawCircle *) DrawEntry)
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ((LibDrawText *) DrawEntry)
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ((LibDrawSquare *) DrawEntry)
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ((LibDrawPin *) DrawEntry)
if
(
DRAWSTRUCT
->
m_Attributs
&
PINNOTDRAW
)
break
;
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ((LibDrawPolyline *) DrawEntry)
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
}
}
fprintf
(
ExportFile
,
"ENDDRAW
\n
"
);
}
fprintf
(
ExportFile
,
"ENDDEF
\n
"
);
fclose
(
ExportFile
);
DrawEntry
=
LibEntry
->
m_Drawings
;
if
(
DrawEntry
)
{
fprintf
(
ExportFile
,
"DRAW
\n
"
);
for
(
;
DrawEntry
!=
NULL
;
DrawEntry
=
DrawEntry
->
Next
()
)
{
/* Elimination des elements non relatifs a l'unite */
if
(
Unit
&&
DrawEntry
->
m_Unit
&&
(
DrawEntry
->
m_Unit
!=
Unit
)
)
continue
;
if
(
convert
&&
DrawEntry
->
m_Convert
&&
(
DrawEntry
->
m_Convert
!=
convert
)
)
continue
;
/* .Unit , . Convert est laisse a 0 ou mis a 1 */
SymbUnit
=
DrawEntry
->
m_Unit
;
if
(
SymbUnit
>
1
)
SymbUnit
=
1
;
SymbConvert
=
DrawEntry
->
m_Convert
;
if
(
SymbConvert
>
1
)
SymbConvert
=
1
;
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#define DRAWSTRUCT ( (LibDrawArc*) DrawEntry )
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ( (LibDrawCircle*) DrawEntry )
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ( (LibDrawText*) DrawEntry )
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ( (LibDrawSquare*) DrawEntry )
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ( (LibDrawPin*) DrawEntry )
if
(
DRAWSTRUCT
->
m_Attributs
&
PINNOTDRAW
)
break
;
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef DRAWSTRUCT
#define DRAWSTRUCT ( (LibDrawPolyline*) DrawEntry )
DRAWSTRUCT
->
WriteDescr
(
ExportFile
);
break
;
default
:
;
}
}
fprintf
(
ExportFile
,
"ENDDRAW
\n
"
);
}
fprintf
(
ExportFile
,
"ENDDEF
\n
"
);
fclose
(
ExportFile
);
}
/*****************************************************************/
void
SuppressDuplicateDrawItem
(
EDA_LibComponentStruct
*
LibEntry
)
void
SuppressDuplicateDrawItem
(
EDA_LibComponentStruct
*
LibEntry
)
/*****************************************************************/
/* Delete redundant graphic items.
Useful after loading asymbole from a file symbol, because some graphic items
can be duplicated.
*/
*
Useful after loading asymbole from a file symbol, because some graphic items
*
can be duplicated.
*/
{
LibEDA_BaseStruct
*
DEntryRef
,
*
DEntryCompare
;
bool
deleted
;
wxDC
*
DC
=
NULL
;
DEntryRef
=
LibEntry
->
m_Drawings
;
while
(
DEntryRef
)
{
if
(
DEntryRef
->
Pnext
==
NULL
)
return
;
DEntryCompare
=
DEntryRef
->
Next
();
if
(
DEntryCompare
==
NULL
)
return
;
deleted
=
0
;
while
(
DEntryCompare
)
{
if
(
CompareSymbols
(
DEntryRef
,
DEntryCompare
)
==
TRUE
)
{
DeleteOneLibraryDrawStruct
(
NULL
,
DC
,
LibEntry
,
DEntryRef
,
1
);
deleted
=
TRUE
;
break
;
}
DEntryCompare
=
DEntryCompare
->
Next
();
}
if
(
!
deleted
)
DEntryRef
=
DEntryRef
->
Next
();
else
DEntryRef
=
LibEntry
->
m_Drawings
;
}
LibEDA_BaseStruct
*
DEntryRef
,
*
DEntryCompare
;
bool
deleted
;
wxDC
*
DC
=
NULL
;
DEntryRef
=
LibEntry
->
m_Drawings
;
while
(
DEntryRef
)
{
if
(
DEntryRef
->
Pnext
==
NULL
)
return
;
DEntryCompare
=
DEntryRef
->
Next
();
if
(
DEntryCompare
==
NULL
)
return
;
deleted
=
0
;
while
(
DEntryCompare
)
{
if
(
CompareSymbols
(
DEntryRef
,
DEntryCompare
)
==
TRUE
)
{
DeleteOneLibraryDrawStruct
(
NULL
,
DC
,
LibEntry
,
DEntryRef
,
1
);
deleted
=
TRUE
;
break
;
}
DEntryCompare
=
DEntryCompare
->
Next
();
}
if
(
!
deleted
)
DEntryRef
=
DEntryRef
->
Next
();
else
DEntryRef
=
LibEntry
->
m_Drawings
;
}
}
/********************************************************************/
static
bool
CompareSymbols
(
LibEDA_BaseStruct
*
DEntryRef
,
LibEDA_BaseStruct
*
DEntryCompare
)
/********************************************************************/
static
bool
CompareSymbols
(
LibEDA_BaseStruct
*
DEntryRef
,
LibEDA_BaseStruct
*
DEntryCompare
)
/********************************************************************/
/* Compare 2 graphic items (arc, lines ...).
return FALSE si different
TRUE si they are identical, and therefore redundant
*/
*
return FALSE si different
*
TRUE si they are identical, and therefore redundant
*/
{
int
ii
;
int
*
ptref
,
*
ptcomp
;
/* Comparaison des proprietes generales */
if
(
DEntryRef
->
m_StructType
!=
DEntryCompare
->
m_StructType
)
return
(
FALSE
);
if
(
DEntryRef
->
m_Unit
!=
DEntryCompare
->
m_Unit
)
return
(
FALSE
);
if
(
DEntryRef
->
m_Convert
!=
DEntryCompare
->
m_Convert
)
return
(
FALSE
);
switch
(
DEntryRef
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawArc *) DEntryRef)
#define CMPSTRUCT ((LibDrawArc *) DEntryCompare)
if
(
REFSTRUCT
->
m_Pos
.
x
!=
CMPSTRUCT
->
m_Pos
.
x
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_Pos
.
y
!=
CMPSTRUCT
->
m_Pos
.
y
)
return
(
FALSE
);
if
(
REFSTRUCT
->
t1
!=
CMPSTRUCT
->
t1
)
return
(
FALSE
);
if
(
REFSTRUCT
->
t2
!=
CMPSTRUCT
->
t2
)
return
(
FALSE
);
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawCircle *) DEntryRef)
#define CMPSTRUCT ((LibDrawCircle *) DEntryCompare)
if
(
REFSTRUCT
->
m_Pos
.
x
!=
CMPSTRUCT
->
m_Pos
.
x
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_Pos
.
y
!=
CMPSTRUCT
->
m_Pos
.
y
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_Rayon
!=
CMPSTRUCT
->
m_Rayon
)
return
(
FALSE
);
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawText *) DEntryRef)
#define CMPSTRUCT ((LibDrawText *) DEntryCompare)
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_Size
!=
CMPSTRUCT
->
m_Size
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_Text
!=
CMPSTRUCT
->
m_Text
)
return
(
FALSE
);
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawSquare *) DEntryRef)
#define CMPSTRUCT ((LibDrawSquare *) DEntryCompare)
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
(
FALSE
);
if
(
REFSTRUCT
->
m_End
!=
CMPSTRUCT
->
m_End
)
return
(
FALSE
);
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawPin *) DEntryRef)
#define CMPSTRUCT ((LibDrawPin *) DEntryCompare)
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
(
FALSE
);
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ((LibDrawPolyline *) DEntryRef)
#define CMPSTRUCT ((LibDrawPolyline *) DEntryCompare)
if
(
REFSTRUCT
->
n
!=
CMPSTRUCT
->
n
)
return
(
FALSE
);
ptref
=
REFSTRUCT
->
PolyList
;
ptcomp
=
CMPSTRUCT
->
PolyList
;
for
(
ii
=
2
*
REFSTRUCT
->
n
;
ii
>
0
;
ii
--
)
{
if
(
*
ptref
!=
*
ptcomp
)
return
(
FALSE
);
ptref
++
;
ptcomp
++
;
}
break
;
}
return
(
TRUE
);
int
ii
;
int
*
ptref
,
*
ptcomp
;
/* Comparaison des proprietes generales */
if
(
DEntryRef
->
m_StructType
!=
DEntryCompare
->
m_StructType
)
return
FALSE
;
if
(
DEntryRef
->
m_Unit
!=
DEntryCompare
->
m_Unit
)
return
FALSE
;
if
(
DEntryRef
->
m_Convert
!=
DEntryCompare
->
m_Convert
)
return
FALSE
;
switch
(
DEntryRef
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawArc*) DEntryRef )
#define CMPSTRUCT ( (LibDrawArc*) DEntryCompare )
if
(
REFSTRUCT
->
m_Pos
.
x
!=
CMPSTRUCT
->
m_Pos
.
x
)
return
FALSE
;
if
(
REFSTRUCT
->
m_Pos
.
y
!=
CMPSTRUCT
->
m_Pos
.
y
)
return
FALSE
;
if
(
REFSTRUCT
->
t1
!=
CMPSTRUCT
->
t1
)
return
FALSE
;
if
(
REFSTRUCT
->
t2
!=
CMPSTRUCT
->
t2
)
return
FALSE
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawCircle*) DEntryRef )
#define CMPSTRUCT ( (LibDrawCircle*) DEntryCompare )
if
(
REFSTRUCT
->
m_Pos
.
x
!=
CMPSTRUCT
->
m_Pos
.
x
)
return
FALSE
;
if
(
REFSTRUCT
->
m_Pos
.
y
!=
CMPSTRUCT
->
m_Pos
.
y
)
return
FALSE
;
if
(
REFSTRUCT
->
m_Rayon
!=
CMPSTRUCT
->
m_Rayon
)
return
FALSE
;
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawText*) DEntryRef )
#define CMPSTRUCT ( (LibDrawText*) DEntryCompare )
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
FALSE
;
if
(
REFSTRUCT
->
m_Size
!=
CMPSTRUCT
->
m_Size
)
return
FALSE
;
if
(
REFSTRUCT
->
m_Text
!=
CMPSTRUCT
->
m_Text
)
return
FALSE
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawSquare*) DEntryRef )
#define CMPSTRUCT ( (LibDrawSquare*) DEntryCompare )
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
FALSE
;
if
(
REFSTRUCT
->
m_End
!=
CMPSTRUCT
->
m_End
)
return
FALSE
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawPin*) DEntryRef )
#define CMPSTRUCT ( (LibDrawPin*) DEntryCompare )
if
(
REFSTRUCT
->
m_Pos
!=
CMPSTRUCT
->
m_Pos
)
return
FALSE
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef REFSTRUCT
#undef CMPSTRUCT
#define REFSTRUCT ( (LibDrawPolyline*) DEntryRef )
#define CMPSTRUCT ( (LibDrawPolyline*) DEntryCompare )
if
(
REFSTRUCT
->
n
!=
CMPSTRUCT
->
n
)
return
FALSE
;
ptref
=
REFSTRUCT
->
PolyList
;
ptcomp
=
CMPSTRUCT
->
PolyList
;
for
(
ii
=
2
*
REFSTRUCT
->
n
;
ii
>
0
;
ii
--
)
{
if
(
*
ptref
!=
*
ptcomp
)
return
FALSE
;
ptref
++
;
ptcomp
++
;
}
break
;
default
:
;
}
return
TRUE
;
}
/***************************************************************************/
/* Routine de placement du point d'ancrage ( reference des coordonnes pour */
/* le trace) du composant courant */
...
...
@@ -383,86 +427,90 @@ int * ptref, *ptcomp;
/* d'ancrage ( coord 0,0 ). */
/***************************************************************************/
void
WinEDA_LibeditFrame
::
PlaceAncre
(
void
)
void
WinEDA_LibeditFrame
::
PlaceAncre
(
void
)
{
int
ii
,
*
ptsegm
;
int
dx
,
dy
;
/* Offsets de deplacement */
EDA_LibComponentStruct
*
LibEntry
;
LibEDA_BaseStruct
*
DrawEntry
;
dx
=
-
m_CurrentScreen
->
m_Curseur
.
x
;
dy
=
m_CurrentScreen
->
m_Curseur
.
y
;
LibEntry
=
CurrentLibEntry
;
if
(
LibEntry
==
NULL
)
return
;
m_CurrentScreen
->
SetModify
();
LibEntry
->
m_Name
.
m_Pos
.
x
+=
dx
;
LibEntry
->
m_Name
.
m_Pos
.
y
+=
dy
;
LibEntry
->
m_Prefix
.
m_Pos
.
x
+=
dx
;
LibEntry
->
m_Prefix
.
m_Pos
.
y
+=
dy
;
DrawEntry
=
LibEntry
->
m_Drawings
;
while
(
DrawEntry
)
{
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawArc *) DrawEntry)
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
STRUCT
->
m_ArcStart
.
x
+=
dx
;
STRUCT
->
m_ArcStart
.
y
+=
dy
;
STRUCT
->
m_ArcEnd
.
x
+=
dx
;
STRUCT
->
m_ArcEnd
.
y
+=
dy
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawCircle *) DrawEntry)
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawText *) DrawEntry)
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawSquare *) DrawEntry)
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
STRUCT
->
m_End
.
x
+=
dx
;
STRUCT
->
m_End
.
y
+=
dy
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawPin *) DrawEntry)
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ((LibDrawPolyline *) DrawEntry)
ptsegm
=
STRUCT
->
PolyList
;
for
(
ii
=
STRUCT
->
n
;
ii
>
0
;
ii
--
)
{
*
ptsegm
+=
dx
;
ptsegm
++
;
*
ptsegm
+=
dy
;
ptsegm
++
;
}
break
;
}
DrawEntry
=
DrawEntry
->
Next
();
}
/* Redraw the symbol */
m_CurrentScreen
->
m_Curseur
.
x
=
m_CurrentScreen
->
m_Curseur
.
y
=
0
;
Recadre_Trace
(
TRUE
);
m_CurrentScreen
->
SetRefreshReq
();
int
ii
,
*
ptsegm
;
int
dx
,
dy
;
/* Offsets de deplacement */
EDA_LibComponentStruct
*
LibEntry
;
LibEDA_BaseStruct
*
DrawEntry
;
dx
=
-
m_CurrentScreen
->
m_Curseur
.
x
;
dy
=
m_CurrentScreen
->
m_Curseur
.
y
;
LibEntry
=
CurrentLibEntry
;
if
(
LibEntry
==
NULL
)
return
;
m_CurrentScreen
->
SetModify
();
LibEntry
->
m_Name
.
m_Pos
.
x
+=
dx
;
LibEntry
->
m_Name
.
m_Pos
.
y
+=
dy
;
LibEntry
->
m_Prefix
.
m_Pos
.
x
+=
dx
;
LibEntry
->
m_Prefix
.
m_Pos
.
y
+=
dy
;
DrawEntry
=
LibEntry
->
m_Drawings
;
while
(
DrawEntry
)
{
switch
(
DrawEntry
->
m_StructType
)
{
case
COMPONENT_ARC_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawArc*) DrawEntry )
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
STRUCT
->
m_ArcStart
.
x
+=
dx
;
STRUCT
->
m_ArcStart
.
y
+=
dy
;
STRUCT
->
m_ArcEnd
.
x
+=
dx
;
STRUCT
->
m_ArcEnd
.
y
+=
dy
;
break
;
case
COMPONENT_CIRCLE_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawCircle*) DrawEntry )
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawText*) DrawEntry )
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_RECT_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawSquare*) DrawEntry )
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
STRUCT
->
m_End
.
x
+=
dx
;
STRUCT
->
m_End
.
y
+=
dy
;
break
;
case
COMPONENT_PIN_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawPin*) DrawEntry )
STRUCT
->
m_Pos
.
x
+=
dx
;
STRUCT
->
m_Pos
.
y
+=
dy
;
break
;
case
COMPONENT_POLYLINE_DRAW_TYPE
:
#undef STRUCT
#define STRUCT ( (LibDrawPolyline*) DrawEntry )
ptsegm
=
STRUCT
->
PolyList
;
for
(
ii
=
STRUCT
->
n
;
ii
>
0
;
ii
--
)
{
*
ptsegm
+=
dx
;
ptsegm
++
;
*
ptsegm
+=
dy
;
ptsegm
++
;
}
break
;
default
:
;
}
DrawEntry
=
DrawEntry
->
Next
();
}
/* Redraw the symbol */
m_CurrentScreen
->
m_Curseur
.
x
=
m_CurrentScreen
->
m_Curseur
.
y
=
0
;
Recadre_Trace
(
TRUE
);
m_CurrentScreen
->
SetRefreshReq
();
}
include/base_struct.h
View file @
f3c324d5
...
...
@@ -14,8 +14,10 @@ extern std::ostream& operator<<( std::ostream& out, const wxPoint& pt );
/* Id for class identification, at run time */
enum
DrawStructureType
{
enum
KICAD_T
{
NOT_USED
=
-
1
,
// the 3d code uses this value
EOT
=
0
,
// search types array terminator (End Of Types)
TYPE_NOT_INIT
=
0
,
...
...
@@ -80,7 +82,6 @@ enum SEARCH_RESULT {
SEARCH_CONTINUE
};
typedef
DrawStructureType
KICAD_T
;
// shorter name
class
EDA_BaseStruct
;
class
WinEDA_DrawFrame
;
...
...
@@ -126,7 +127,7 @@ public:
class
EDA_BaseStruct
/* Basic class, not directly used */
{
public
:
int
m_StructType
;
/* Struct ident for run time identification */
KICAD_T
m_StructType
;
/* Struct ident for run time identification */
EDA_BaseStruct
*
Pnext
;
/* Linked list: Link (next struct) */
EDA_BaseStruct
*
Pback
;
/* Linked list: Link (previous struct) */
EDA_BaseStruct
*
m_Parent
;
/* Linked list: Link (parent struct) */
...
...
@@ -163,11 +164,11 @@ private:
public
:
EDA_BaseStruct
(
EDA_BaseStruct
*
parent
,
int
idType
);
EDA_BaseStruct
(
int
struct_type
);
EDA_BaseStruct
(
EDA_BaseStruct
*
parent
,
KICAD_T
idType
);
EDA_BaseStruct
(
KICAD_T
struct_type
);
virtual
~
EDA_BaseStruct
()
{
};
EDA_BaseStruct
*
Next
(
void
)
{
return
Pnext
;
}
EDA_BaseStruct
*
Next
(
)
{
return
Pnext
;
}
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int
GetState
(
int
type
);
...
...
@@ -381,7 +382,7 @@ protected:
public
:
BOARD_ITEM
(
BOARD_ITEM
*
StructFather
,
DrawStructureType
idtype
)
:
BOARD_ITEM
(
BOARD_ITEM
*
StructFather
,
KICAD_T
idtype
)
:
EDA_BaseStruct
(
StructFather
,
idtype
),
m_Layer
(
0
)
{
...
...
@@ -450,22 +451,6 @@ public:
};
/* Base class for building items like lines, which have 1 start point and 1 end point.
* Arc and circles can use this class.
*/
class
EDA_BaseLineStruct
:
public
EDA_BaseStruct
{
public
:
int
m_Layer
;
// Layer number
int
m_Width
;
// 0 = line, > 0 = tracks, bus ...
wxPoint
m_Start
;
// Line start point
wxPoint
m_End
;
// Line end point
public
:
EDA_BaseLineStruct
(
EDA_BaseStruct
*
StructFather
,
DrawStructureType
idtype
);
};
/**************************/
/* class DrawPickedStruct */
/**************************/
...
...
include/pcbstruct.h
View file @
f3c324d5
...
...
@@ -358,7 +358,7 @@ public:
int
m_Angle
;
// pour les arcs: "longueur" de l'arc en 1/10 deg
public
:
DRAWSEGMENT
(
BOARD_ITEM
*
StructFather
,
DrawStructureType
idtype
=
TYPEDRAWSEGMENT
);
DRAWSEGMENT
(
BOARD_ITEM
*
StructFather
,
KICAD_T
idtype
=
TYPEDRAWSEGMENT
);
~
DRAWSEGMENT
(
void
);
// Read/write data
...
...
include/wxstruct.h
View file @
f3c324d5
...
...
@@ -501,7 +501,7 @@ public:
virtual
void
SwitchLayer
(
wxDC
*
DC
,
int
layer
);
// divers
void
AddHistory
(
int
value
,
DrawStructureType
type
);
// Add value in data list history
void
AddHistory
(
int
value
,
KICAD_T
type
);
// Add value in data list history
void
InstallGridFrame
(
const
wxPoint
&
pos
);
};
...
...
pcbnew/block_module_editor.cpp
View file @
f3c324d5
...
...
@@ -502,6 +502,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
(
(
EDGE_MODULE
*
)
item
)
->
m_End0
.
x
+=
offset
.
x
;
(
(
EDGE_MODULE
*
)
item
)
->
m_End0
.
y
+=
offset
.
y
;
break
;
default
:
;
}
item
->
m_Flags
=
item
->
m_Selected
=
0
;
...
...
@@ -588,6 +591,9 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset )
SETMIRROR
(
(
(
TEXTE_MODULE
*
)
item
)
->
m_Pos
.
x
);
(
(
TEXTE_MODULE
*
)
item
)
->
m_Pos0
.
x
=
(
(
TEXTE_MODULE
*
)
item
)
->
m_Pos
.
x
;
break
;
default
:
;
}
item
->
m_Flags
=
item
->
m_Selected
=
0
;
...
...
@@ -639,6 +645,9 @@ void RotateMarkedItems( MODULE* module, wxPoint offset )
(
(
TEXTE_MODULE
*
)
item
)
->
m_Pos0
=
(
(
TEXTE_MODULE
*
)
item
)
->
m_Pos
;
(
(
TEXTE_MODULE
*
)
item
)
->
m_Orient
+=
900
;
break
;
default
:
;
}
item
->
m_Flags
=
item
->
m_Selected
=
0
;
...
...
pcbnew/class_edge_mod.cpp
View file @
f3c324d5
...
...
@@ -31,6 +31,7 @@
EDGE_MODULE
::
EDGE_MODULE
(
MODULE
*
parent
)
:
BOARD_ITEM
(
parent
,
TYPEEDGEMODULE
)
{
m_Width
=
0
;
m_Shape
=
S_SEGMENT
;
m_Angle
=
0
;
m_Width
=
120
;
...
...
pcbnew/class_track.cpp
View file @
f3c324d5
...
...
@@ -22,9 +22,10 @@
/* Constructeur des classes type pistes, vias et zones */
TRACK
::
TRACK
(
BOARD_ITEM
*
StructFather
,
DrawStructureType
idtype
)
:
TRACK
::
TRACK
(
BOARD_ITEM
*
StructFather
,
KICAD_T
idtype
)
:
BOARD_ITEM
(
StructFather
,
idtype
)
{
m_Width
=
0
;
m_Shape
=
S_SEGMENT
;
start
=
end
=
NULL
;
m_NetCode
=
0
;
...
...
pcbnew/class_track.h
View file @
f3c324d5
...
...
@@ -40,7 +40,7 @@ public:
int
m_Param
;
// Auxiliary variable ( used in some computations )
public
:
TRACK
(
BOARD_ITEM
*
StructFather
,
DrawStructureType
idtype
=
TYPETRACK
);
TRACK
(
BOARD_ITEM
*
StructFather
,
KICAD_T
idtype
=
TYPETRACK
);
TRACK
(
const
TRACK
&
track
);
TRACK
*
Next
()
{
return
(
TRACK
*
)
Pnext
;
}
...
...
pcbnew/classpcb.cpp
View file @
f3c324d5
...
...
@@ -52,10 +52,10 @@ EDGE_ZONE:: ~EDGE_ZONE( void )
/**********************/
/* Classe DRAWSEGMENT: constructeur */
DRAWSEGMENT
::
DRAWSEGMENT
(
BOARD_ITEM
*
StructFather
,
DrawStructureType
idtype
)
:
DRAWSEGMENT
::
DRAWSEGMENT
(
BOARD_ITEM
*
StructFather
,
KICAD_T
idtype
)
:
BOARD_ITEM
(
StructFather
,
idtype
)
{
m_Flags
=
m_Shape
=
m_Type
=
m_Angle
=
0
;
m_
Width
=
m_
Flags
=
m_Shape
=
m_Type
=
m_Angle
=
0
;
}
...
...
pcbnew/classtrc.cpp
View file @
f3c324d5
...
...
@@ -19,7 +19,7 @@
/* Constructeur des classes type pistes, vias et zones */
TRACK
::
TRACK
(
EDA_BaseStruct
*
StructFather
,
DrawStructureType
idtype
)
:
TRACK
::
TRACK
(
EDA_BaseStruct
*
StructFather
,
KICAD_T
idtype
)
:
SEGDRAW_Struct
(
StructFather
,
idtype
)
{
m_Shape
=
S_SEGMENT
;
...
...
pcbnew/dialog_track_options.cpp
View file @
f3c324d5
...
...
@@ -281,7 +281,7 @@ void WinEDA_PcbTracksDialog::AcceptPcbOptions(wxCommandEvent& event)
/*********************************************************************/
void
WinEDA_BasePcbFrame
::
AddHistory
(
int
value
,
DrawStructureType
type
)
void
WinEDA_BasePcbFrame
::
AddHistory
(
int
value
,
KICAD_T
type
)
/**********************************************************************/
// Mise a jour des listes des dernieres epaisseurs de via et track utilisées
{
...
...
pcbnew/ratsnest.cpp
View file @
f3c324d5
...
...
@@ -1254,6 +1254,9 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref,
conn_number
=
track_ref
->
m_Sous_Netcode
;
break
;
}
default
:
;
}
if
(
current_net_code
<=
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