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
1c294c33
Commit
1c294c33
authored
Jan 29, 2008
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more free specctra support, MODULE::GetValue()
parent
6d6ca5ee
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
256 additions
and
90 deletions
+256
-90
change_log.txt
change_log.txt
+7
-0
class_module.h
pcbnew/class_module.h
+9
-1
dsn.h
pcbnew/dsn.h
+2
-1
specctra.cpp
pcbnew/specctra.cpp
+43
-7
specctra.h
pcbnew/specctra.h
+81
-56
specctra_export.cpp
pcbnew/specctra_export.cpp
+114
-25
No files found.
change_log.txt
View file @
1c294c33
...
...
@@ -5,6 +5,13 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-Jan-29 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew:
SPECCTRA export does most items now, except existing tracks. Soon will
need testing.
2008-Jan-28 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+pcbnew:
...
...
pcbnew/class_module.h
View file @
1c294c33
...
...
@@ -180,13 +180,21 @@ public:
/**
* Function GetReference
* @return
wxString
- the reference designator text.
* @return
const wxString&
- the reference designator text.
*/
const
wxString
&
GetReference
()
{
return
m_Reference
->
m_Text
;
}
/**
* Function GetValue
* @return const wxString& - the value text.
*/
const
wxString
&
GetValue
()
{
return
m_Value
->
m_Text
;
}
/**
* Function Visit
...
...
pcbnew/dsn.h
View file @
1c294c33
...
...
@@ -617,7 +617,8 @@ public:
/**
* Function SetSpaceInQuotedTokens
* changes the setting controlling whether a space in a quoted string is
* a terminator
* a terminator.
* @param val If true, means
*/
bool
SetSpaceInQuotedTokens
(
bool
val
)
{
...
...
pcbnew/specctra.cpp
View file @
1c294c33
...
...
@@ -57,7 +57,7 @@
// To build the DSN beautifier and unit tester, simply uncomment this and then
// use CMake's makefile to build target "specctra_test".
//
#define STANDALONE // define "stand alone, i.e. unit testing"
#define STANDALONE // define "stand alone, i.e. unit testing"
#if defined(STANDALONE)
...
...
@@ -1707,6 +1707,10 @@ void SPECCTRA_DB::doPLACE( PLACE* growth ) throw( IOError )
while
(
(
tok
=
nextTok
())
!=
T_RIGHT
)
{
if
(
tok
!=
T_LEFT
)
expecting
(
T_LEFT
);
tok
=
nextTok
();
switch
(
tok
)
{
case
T_mirror
:
...
...
@@ -1772,7 +1776,9 @@ void SPECCTRA_DB::doPLACE( PLACE* growth ) throw( IOError )
case
T_pn
:
if
(
growth
->
part_number
.
size
()
)
unexpected
(
tok
);
needSYMBOL
();
growth
->
part_number
=
lexer
->
CurText
();
needRIGHT
();
break
;
default
:
...
...
@@ -3633,6 +3639,22 @@ int IMAGE::Compare( IMAGE* lhs, IMAGE* rhs )
}
//-----<COMPONENT>--------------------------------------------------------
/*
int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs )
{
if( !lhs->hash.size() )
lhs->hash = lhs->makeHash();
if( !rhs->hash.size() )
rhs->hash = rhs->makeHash();
int result = lhs->hash.compare( rhs->hash );
return result;
}
*/
//-----<PARSER>-----------------------------------------------------------
PARSER
::
PARSER
(
ELEM
*
aParent
)
:
...
...
@@ -3688,8 +3710,7 @@ void PLACE::Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
const
char
*
quote
=
out
->
GetQuoteChar
(
component_id
.
c_str
()
);
if
(
place_rules
||
properties
.
size
()
||
lock_type
!=
T_NONE
||
rules
||
region
||
part_number
.
size
()
)
if
(
place_rules
||
properties
.
size
()
||
rules
||
region
)
{
useMultiLine
=
true
;
...
...
@@ -3715,16 +3736,18 @@ void PLACE::Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
out
->
Print
(
0
,
" %.6g"
,
rotation
);
}
out
->
Print
(
0
,
" "
);
if
(
mirror
!=
T_NONE
)
out
->
Print
(
0
,
"
(mirror %s)"
,
LEXER
::
GetTokenText
(
mirror
)
);
out
->
Print
(
0
,
"(mirror %s)"
,
LEXER
::
GetTokenText
(
mirror
)
);
if
(
status
!=
T_NONE
)
out
->
Print
(
0
,
"
(status %s)"
,
LEXER
::
GetTokenText
(
status
)
);
out
->
Print
(
0
,
"(status %s)"
,
LEXER
::
GetTokenText
(
status
)
);
if
(
logical_part
.
size
()
)
{
quote
=
out
->
GetQuoteChar
(
logical_part
.
c_str
()
);
out
->
Print
(
0
,
"
(logical_part %s%s%s)"
,
out
->
Print
(
0
,
"(logical_part %s%s%s)"
,
quote
,
logical_part
.
c_str
(),
quote
);
}
...
...
@@ -3764,6 +3787,19 @@ void PLACE::Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
}
}
else
{
if
(
lock_type
!=
T_NONE
)
out
->
Print
(
0
,
"(lock_type %s)"
,
LEXER
::
GetTokenText
(
lock_type
)
);
if
(
part_number
.
size
()
)
{
const
char
*
quote
=
out
->
GetQuoteChar
(
part_number
.
c_str
()
);
out
->
Print
(
0
,
"(PN %s%s%s)"
,
quote
,
part_number
.
c_str
(),
quote
);
}
}
out
->
Print
(
0
,
")
\n
"
);
}
...
...
pcbnew/specctra.h
View file @
1c294c33
...
...
@@ -616,49 +616,6 @@ public:
};
#if 0
class PLACE_RULE : public RULE
{
friend class SPECCTRA_DB;
DSN_T object_type;
DSN_T image_type;
/* T_spacing, T_permit_orient, T_permit_side & T_opposite_side are
all stored in the kids list.
*/
public:
PLACE_RULE( ELEM* aParent ) :
RULE( aParent, T_place_rule )
{
object_type = T_NONE;
image_type = T_NONE;
}
void FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
{
if( object_type != T_NONE )
{
if( object_type == T_pcb )
out->Print( nestLevel, "(object_type %s",
LEXER::GetTokenText( object_type ) );
else
out->Print( nestLevel, "(object_type image_set %s",
LEXER::GetTokenText( object_type ) );
if( image_type != T_NONE )
out->Print( 0, " (image_type %s)", LEXER::GetTokenText( image_type ) );
out->Print( 0, ")\n" );
}
RULE::FormatContents( out, nestLevel );
}
};
#endif
class
LAYER_RULE
:
public
ELEM
{
friend
class
SPECCTRA_DB
;
...
...
@@ -1680,6 +1637,10 @@ public:
};
/**
* Class PLACE
* implements the <placement_reference> in the specctra dsn spec.
*/
class
PLACE
:
public
ELEM
{
friend
class
SPECCTRA_DB
;
...
...
@@ -1688,7 +1649,6 @@ class PLACE : public ELEM
DSN_T
side
;
bool
isRotated
;
double
rotation
;
bool
hasVertex
;
...
...
@@ -1718,7 +1678,9 @@ public:
ELEM
(
T_place
,
aParent
)
{
side
=
T_front
;
isRotated
=
false
;
rotation
=
0
.
0
;
hasVertex
=
false
;
mirror
=
T_NONE
;
...
...
@@ -1740,26 +1702,31 @@ public:
void
SetVertex
(
const
POINT
&
aVertex
)
{
vertex
=
aVertex
;
vertex
.
FixNegativeZero
();
hasVertex
=
true
;
}
void
SetRotation
(
double
aRotation
)
{
rotation
=
aRotation
;
isRotated
=
(
aRotation
!=
0
.
0
);
}
void
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
);
};
typedef
boost
::
ptr_vector
<
PLACE
>
PLACES
;
/**
* Class COMPONENT
* implements the <component_descriptor> in the specctra dsn spec.
*/
class
COMPONENT
:
public
ELEM
{
friend
class
SPECCTRA_DB
;
std
::
string
image_id
;
// std::string hash; ///< a hash string used by Compare(), not Format()ed/exported.
typedef
boost
::
ptr_vector
<
PLACE
>
PLACES
;
std
::
string
image_id
;
PLACES
places
;
public
:
...
...
@@ -1768,17 +1735,35 @@ public:
{
}
const
std
::
string
&
GetImageId
()
const
{
return
image_id
;
}
void
SetImageId
(
const
std
::
string
&
aImageId
)
{
image_id
=
aImageId
;
}
/**
* Function Compare
* compares two objects of this type and returns <0, 0, or >0.
*/
// static int Compare( IMAGE* lhs, IMAGE* rhs );
void
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
const
char
*
quote
=
out
->
GetQuoteChar
(
image_id
.
c_str
()
);
out
->
Print
(
nestLevel
,
"(%s %s%s%s
\n
"
,
LEXER
::
GetTokenText
(
Type
()
),
quote
,
image_id
.
c_str
(),
quote
);
for
(
PLACES
::
iterator
i
=
places
.
begin
();
i
!=
places
.
end
();
++
i
)
i
->
Format
(
out
,
nestLevel
+
1
);
FormatContents
(
out
,
nestLevel
+
1
);
out
->
Print
(
nestLevel
,
")
\n
"
);
}
void
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
for
(
PLACES
::
iterator
i
=
places
.
begin
();
i
!=
places
.
end
();
++
i
)
i
->
Format
(
out
,
nestLevel
);
}
};
...
...
@@ -1806,6 +1791,27 @@ public:
delete
unit
;
}
/**
* Function LookupCOMPONENT
* looks up a COMPONENT by name. If the name is not found, a new
* COMPONENT is added to the components container. At any time the
* names in the component container should remain unique.
* @return COMPONENT* - an existing or new
*/
COMPONENT
*
LookupCOMPONENT
(
const
std
::
string
&
imageName
)
{
for
(
unsigned
i
=
0
;
i
<
components
.
size
();
++
i
)
{
if
(
0
==
components
[
i
].
GetImageId
().
compare
(
imageName
)
)
return
&
components
[
i
];
}
COMPONENT
*
added
=
new
COMPONENT
(
this
);
components
.
push_back
(
added
);
added
->
SetImageId
(
imageName
);
return
added
;
}
void
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
if
(
unit
)
...
...
@@ -2111,7 +2117,7 @@ public:
// format the kids, which in this class are the shapes
ELEM_HOLDER
::
FormatContents
(
out
,
nestLevel
);
out
->
Print
(
nestLevel
+
1
,
"%s"
,
""
);
out
->
Print
(
nestLevel
,
"%s"
,
""
);
// spec for <attach_descriptor> says default is on, so
// print the off condition to override this.
...
...
@@ -2193,6 +2199,12 @@ public:
return
via_start_index
;
}
/**
* Function FindIMAGE
* searches this LIBRARY for an image which matches the argument.
* @return int - if found the index into the images list, else -1.
*/
int
FindIMAGE
(
IMAGE
*
aImage
)
{
for
(
unsigned
i
=
0
;
i
<
images
.
size
();
++
i
)
...
...
@@ -2203,21 +2215,34 @@ public:
return
-
1
;
}
/**
* Function AppendIMAGE
* adds the image to the image list.
*/
void
AppendIMAGE
(
IMAGE
*
aImage
)
{
aImage
->
SetParent
(
this
);
images
.
push_back
(
aImage
);
}
bool
LookupIMAGE
(
IMAGE
*
aImage
)
/**
* Function LookupIMAGE
* will add the image only if one exactly like it does not alread exist
* in the image list.
* @return IMAGE* - the IMAGE which is registered in the LIBRARY that
* matches the argument, and it will be either the argument or
* a previous image which is a duplicate.
*/
IMAGE
*
LookupIMAGE
(
IMAGE
*
aImage
)
{
int
ndx
=
FindIMAGE
(
aImage
);
if
(
ndx
==
-
1
)
{
AppendIMAGE
(
aImage
);
return
fals
e
;
return
aImag
e
;
}
return
true
;
return
&
images
[
ndx
]
;
}
void
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
...
...
pcbnew/specctra_export.cpp
View file @
1c294c33
...
...
@@ -76,11 +76,11 @@ void WinEDA_PcbFrame::ExportToSPECCTRA( wxCommandEvent& event )
// if an exception is thrown by FromBOARD or ExportPCB(), then
// ~SPECCTRA_DB() will close the file.
}
catch
(
IOError
ioe
)
catch
(
IOError
ioe
)
{
ok
=
false
;
//
display no messages until we flip back the modules below
.
//
copy the error string to safe place, ioe is in this scope only
.
errorText
=
ioe
.
errorText
;
}
...
...
@@ -112,6 +112,11 @@ static inline void swap( POINT_PAIR& pair )
}
/**
* Function scale
* converts a distance from kicad units to our reported specctra dsn units:
* 1/10000 inches (deci-mils) to mils. So the factor of 10 comes in.
*/
static
inline
double
scale
(
int
kicadDist
)
{
return
kicadDist
/
10.0
;
...
...
@@ -139,6 +144,7 @@ static POINT mapPt( const wxPoint& pt )
POINT
ret
;
ret
.
x
=
mapX
(
pt
.
x
);
ret
.
y
=
mapY
(
pt
.
y
);
ret
.
FixNegativeZero
();
return
ret
;
}
...
...
@@ -238,24 +244,46 @@ static QARC* makeArc( const POINT& aStart, const POINT& aEnd,
IMAGE
*
SPECCTRA_DB
::
makeIMAGE
(
MODULE
*
aModule
)
{
TYPE_COLLECTOR
item
s
;
PADSTACKS
&
padstacks
=
pcb
->
library
->
padstack
s
;
TYPE_COLLECTOR
pads
;
static
const
KICAD_T
scanPADs
[]
=
{
TYPEPAD
,
EOT
};
PADSTACKS
&
padstacks
=
pcb
->
library
->
padstacks
;
// get all the MODULE's pads.
item
s
.
Collect
(
aModule
,
scanPADs
);
pad
s
.
Collect
(
aModule
,
scanPADs
);
IMAGE
*
image
=
new
IMAGE
(
0
);
IMAGE
*
image
=
new
IMAGE
(
0
);
image
->
image_id
=
CONV_TO_UTF8
(
aModule
->
m_LibRef
);
// collate all the pads, and make a component.
for
(
int
p
=
0
;
p
<
items
.
GetCount
();
++
p
)
// from the pads, and make an IMAGE using collated padstacks.
for
(
int
p
=
0
;
p
<
pads
.
GetCount
();
++
p
)
{
D_PAD
*
pad
=
(
D_PAD
*
)
pads
[
p
];
// see if this pad is a through hole with no copper on its perimeter
if
(
!
pad
->
IsOnLayer
(
LAYER_CMP_N
)
&&
!
pad
->
IsOnLayer
(
COPPER_LAYER_N
)
)
{
if
(
pad
->
m_Drill
.
x
!=
0
)
{
D_PAD
*
pad
=
(
D_PAD
*
)
items
[
p
];
KEEPOUT
*
keepout
=
new
KEEPOUT
(
image
,
T_keepout
);
image
->
keepouts
.
push_back
(
keepout
);
WINDOW
*
window
=
new
WINDOW
(
keepout
);
keepout
->
windows
.
push_back
(
window
);
CIRCLE
*
circle
=
new
CIRCLE
(
window
);
window
->
SetShape
(
circle
);
circle
->
SetDiameter
(
scale
(
pad
->
m_Drill
.
x
)
);
circle
->
SetVertex
(
POINT
(
mapPt
(
pad
->
m_Pos0
)
)
);
circle
->
layer_id
=
"signal"
;
// ?? the keepout is not affecting the power layers?
}
}
else
{
PADSTACK
*
padstack
=
&
padstacks
[
pad
->
m_logical_connexion
];
PIN
*
pin
=
new
PIN
(
image
);
...
...
@@ -265,6 +293,7 @@ IMAGE* SPECCTRA_DB::makeIMAGE( MODULE* aModule )
pin
->
pin_id
=
CONV_TO_UTF8
(
pad
->
ReturnStringPadName
()
);
pin
->
SetVertex
(
mapPt
(
pad
->
m_Pos0
)
);
}
}
return
image
;
}
...
...
@@ -562,7 +591,8 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
}
}
// unique pads are now in the padstack. next we add the via's which may be used.
// unique pads are now in the padstack list.
// next we add the via's which may be used.
int
defaultViaSize
=
aBoard
->
m_BoardSettings
->
m_CurrentViaSize
;
if
(
defaultViaSize
)
...
...
@@ -636,6 +666,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
}
}
// a space in a quoted token is NOT a terminator, true establishes this.
pcb
->
parser
->
space_in_quoted_tokens
=
true
;
//-----<unit_descriptor> & <resolution_descriptor>--------------------
{
...
...
@@ -648,7 +680,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
//-----<boundary_descriptor>------------------------------------------
{
// get all the DRAWSEGMENTS into 'items', then look for layer == EDGE_N,
// and those segments compri
z
e the board's perimeter.
// and those segments compri
s
e the board's perimeter.
static
const
KICAD_T
scanDRAWSEGMENTS
[]
=
{
TYPEDRAWSEGMENT
,
EOT
};
items
.
Collect
(
aBoard
,
scanDRAWSEGMENTS
);
...
...
@@ -725,8 +757,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
bottomRight
.
x
=
aBoard
->
m_BoundaryBox
.
GetRight
();
bottomRight
.
y
=
aBoard
->
m_BoundaryBox
.
GetBottom
();
rect
->
point0
=
mapPt
(
aBoard
->
m_BoundaryBox
.
GetOrigin
()
);
rect
->
point1
=
mapPt
(
bottomRight
);
rect
->
SetCorners
(
mapPt
(
aBoard
->
m_BoundaryBox
.
GetOrigin
()
),
mapPt
(
bottomRight
)
);
boundary
->
rectangle
=
rect
;
...
...
@@ -808,7 +840,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
}
//-----<build the images
>-------------
---------------------------------
//-----<build the images
and components>
---------------------------------
{
static
const
KICAD_T
scanMODULEs
[]
=
{
TYPEMODULE
,
EOT
};
items
.
Collect
(
aBoard
,
scanMODULEs
);
...
...
@@ -819,10 +851,29 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
IMAGE
*
image
=
makeIMAGE
(
module
);
if
(
pcb
->
library
->
LookupIMAGE
(
image
)
)
IMAGE
*
registered
=
pcb
->
library
->
LookupIMAGE
(
image
);
if
(
registered
!=
image
)
{
// If our new 'image' is not a unique IMAGE, delete it.
// In either case, 'registered' is the one we'll work with henceforth.
delete
image
;
}
const
std
::
string
&
imageId
=
registered
->
image_id
;
COMPONENT
*
comp
=
pcb
->
placement
->
LookupCOMPONENT
(
imageId
);
PLACE
*
place
=
new
PLACE
(
comp
);
comp
->
places
.
push_back
(
place
);
place
->
SetRotation
(
module
->
m_Orient
/
10.0
);
place
->
SetVertex
(
mapPt
(
module
->
m_Pos
)
);
place
->
component_id
=
CONV_TO_UTF8
(
module
->
GetReference
()
);
place
->
part_number
=
CONV_TO_UTF8
(
module
->
GetValue
()
);
// module is flipped from bottom side, set side to T_back
if
(
module
->
flag
)
place
->
side
=
T_back
;
}
}
...
...
@@ -844,6 +895,44 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
}
//-----<create the nets>------------------------------------------------
{
NETWORK
*
network
=
pcb
->
network
;
static
const
KICAD_T
scanNETs
[]
=
{
PCB_EQUIPOT_STRUCT_TYPE
,
EOT
};
items
.
Collect
(
aBoard
,
scanNETs
);
PIN_REF
emptypin
(
0
);
for
(
int
i
=
0
;
i
<
items
.
GetCount
();
++
i
)
{
EQUIPOT
*
kinet
=
(
EQUIPOT
*
)
items
[
i
];
NET
*
net
=
new
NET
(
network
);
network
->
nets
.
push_back
(
net
);
net
->
net_id
=
CONV_TO_UTF8
(
kinet
->
m_Netname
);
net
->
net_number
=
kinet
->
GetNet
();
D_PAD
**
ppad
=
kinet
->
m_PadzoneStart
;
for
(
;
ppad
<
kinet
->
m_PadzoneEnd
;
++
ppad
)
{
D_PAD
*
pad
=
*
ppad
;
wxASSERT
(
pad
->
Type
()
==
TYPEPAD
);
// push on an empty one, then fill it via 'pin_ref'
net
->
pins
.
push_back
(
emptypin
);
PIN_REF
*
pin_ref
=
&
net
->
pins
.
back
();
pin_ref
->
SetParent
(
net
);
pin_ref
->
component_id
=
CONV_TO_UTF8
(
((
MODULE
*
)
pad
->
m_Parent
)
->
GetReference
()
);;
pin_ref
->
pin_id
=
CONV_TO_UTF8
(
pad
->
ReturnStringPadName
()
);
}
}
}
//-----<restore MODULEs>------------------------------------------------
// DSN Images (=Kicad MODULES and pads) must be presented from the
...
...
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