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
7fbeb899
Commit
7fbeb899
authored
May 11, 2010
by
Dick Hollenbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
initial work on Bug 578577, partial fix
parent
74cc5a75
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
266 additions
and
223 deletions
+266
-223
rs274d.cpp
gerbview/rs274d.cpp
+233
-212
rs274x.cpp
gerbview/rs274x.cpp
+33
-11
No files found.
gerbview/rs274d.cpp
View file @
7fbeb899
...
...
@@ -1180,225 +1180,246 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame,
break
;
case
APT_MACRO
:
{
APERTURE_MACRO
*
macro
=
tool
->
GetMacro
();
wxASSERT
(
macro
);
// split the macro primitives up into multiple normal TRACK
// elements
for
(
AM_PRIMITIVES
::
iterator
p
=
macro
->
primitives
.
begin
();
p
!=
macro
->
primitives
.
end
();
++
p
)
{
bool
exposure
;
wxPoint
curPos
=
m_CurrentPos
;
switch
(
p
->
primitive_id
)
{
case
AMP_CIRCLE
:
APERTURE_MACRO
*
macro
=
tool
->
GetMacro
();
wxASSERT
(
macro
);
// split the macro primitives up into multiple normal TRACK
// elements
for
(
AM_PRIMITIVES
::
iterator
p
=
macro
->
primitives
.
begin
();
p
!=
macro
->
primitives
.
end
();
++
p
)
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
curPos
+=
mapPt
(
p
->
params
[
2
].
GetValue
(
tool
),
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
int
diameter
=
scale
(
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
m_CurrentPos
,
diameter
,
exposure
);
}
break
;
bool
exposure
;
wxPoint
curPos
=
m_CurrentPos
;
case
AMP_LINE2
:
case
AMP_LINE20
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
int
width
=
scale
(
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
wxPoint
start
=
mapPt
(
p
->
params
[
2
].
GetValue
(
tool
),
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
wxPoint
end
=
mapPt
(
p
->
params
[
4
].
GetValue
(
tool
),
p
->
params
[
5
].
GetValue
(
tool
),
m_GerbMetric
);
if
(
start
.
x
==
end
.
x
)
{
size
.
x
=
width
;
size
.
y
=
ABS
(
end
.
y
-
start
.
y
)
+
1
;
}
else
switch
(
p
->
primitive_id
)
{
size
.
x
=
ABS
(
end
.
x
-
start
.
x
)
+
1
;
size
.
y
=
width
;
case
AMP_CIRCLE
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
curPos
+=
mapPt
(
p
->
params
[
2
].
GetValue
(
tool
),
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
int
diameter
=
scale
(
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
m_CurrentPos
,
diameter
,
exposure
);
}
break
;
case
AMP_LINE2
:
case
AMP_LINE20
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
int
width
=
scale
(
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
wxPoint
start
=
mapPt
(
p
->
params
[
2
].
GetValue
(
tool
),
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
wxPoint
end
=
mapPt
(
p
->
params
[
4
].
GetValue
(
tool
),
p
->
params
[
5
].
GetValue
(
tool
),
m_GerbMetric
);
if
(
start
.
x
==
end
.
x
)
{
size
.
x
=
width
;
size
.
y
=
ABS
(
end
.
y
-
start
.
y
)
+
1
;
}
else
{
size
.
x
=
ABS
(
end
.
x
-
start
.
x
)
+
1
;
size
.
y
=
width
;
}
wxPoint
midPoint
(
(
start
.
x
+
end
.
x
)
/
2
,
(
start
.
y
+
end
.
y
)
/
2
);
curPos
+=
midPoint
;
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_LINE_CENTER
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
wxPoint
msize
=
mapPt
(
p
->
params
[
1
].
GetValue
(
tool
),
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
size
.
x
=
msize
.
x
;
size
.
y
=
msize
.
y
;
curPos
+=
mapPt
(
p
->
params
[
3
].
GetValue
(
tool
),
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_LINE_LOWER_LEFT
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
wxPoint
msize
=
mapPt
(
p
->
params
[
1
].
GetValue
(
tool
),
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
size
.
x
=
msize
.
x
;
size
.
y
=
msize
.
y
;
wxPoint
lowerLeft
=
mapPt
(
p
->
params
[
3
].
GetValue
(
tool
),
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
curPos
+=
lowerLeft
;
// need the middle, so adjust from the lower left
curPos
.
y
+=
size
.
y
/
2
;
curPos
.
x
+=
size
.
x
/
2
;
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_THERMAL
:
{
int
outerDiam
=
scale
(
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
int
innerDiam
=
scale
(
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
curPos
+=
mapPt
(
p
->
params
[
0
].
GetValue
(
tool
),
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
outerDiam
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
innerDiam
,
(
m_LayerNegative
^
m_ImageNegative
)
);
// @todo: draw the cross hairs, see page 23 of rs274
// spec. this might be done with two lines, thickness
// from params[4], and drawing
// darkness "(m_LayerNegative ^ m_ImageNegative)"
}
break
;
case
AMP_MOIRE
:
{
curPos
+=
mapPt
(
p
->
params
[
0
].
GetValue
(
tool
),
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
// e.g.: "6,0,0,0.125,.01,0.01,3,0.003,0.150,0"
int
outerDiam
=
scale
(
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
int
penThickness
=
scale
(
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
int
gap
=
scale
(
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
int
numCircles
=
(
int
)
p
->
params
[
5
].
GetValue
(
tool
);
int
crossHairThickness
=
scale
(
p
->
params
[
6
].
GetValue
(
tool
),
m_GerbMetric
);
int
crossHairLength
=
scale
(
p
->
params
[
7
].
GetValue
(
tool
),
m_GerbMetric
);
// ignore rotation, not supported
// adjust outerDiam by this on each nested circle
int
diamAdjust
=
2
*
(
gap
+
penThickness
);
for
(
int
i
=
0
;
i
<
numCircles
;
++
i
,
outerDiam
-=
diamAdjust
)
{
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillCircularTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
outerDiam
,
penThickness
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
}
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
wxSize
(
crossHairThickness
,
crossHairLength
),
S_SPOT_RECT
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
// swap x and y in wxSize() for this one
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
wxSize
(
crossHairLength
,
crossHairThickness
),
S_SPOT_RECT
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
}
break
;
case
AMP_OUTLINE
:
#if defined(DEBUG)
{
int
numPoints
=
(
int
)
p
->
params
[
1
].
GetValue
(
tool
);
printf
(
"AMP_OUTLINE:
\n
"
);
printf
(
" exposure: %g
\n
"
,
p
->
params
[
0
].
GetValue
(
tool
)
);
printf
(
" # points: %d
\n
"
,
numPoints
);
// numPoints does not include the starting point, so add 1.
for
(
int
i
=
0
;
i
<
numPoints
+
1
;
++
i
)
{
printf
(
" [%d]: X=%g Y=%g
\n
"
,
i
,
p
->
params
[
i
*
2
+
2
+
0
].
GetValue
(
tool
),
p
->
params
[
i
*
2
+
2
+
1
].
GetValue
(
tool
)
);
}
printf
(
" rotation: %g
\n
"
,
p
->
params
[
numPoints
*
2
+
4
].
GetValue
(
tool
)
);
}
#endif
break
;
case
AMP_POLYGON
:
case
AMP_EOF
:
default
:
// not yet supported, waiting for you.
break
;
}
wxPoint
midPoint
(
(
start
.
x
+
end
.
x
)
/
2
,
(
start
.
y
+
end
.
y
)
/
2
);
curPos
+=
midPoint
;
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_LINE_CENTER
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
wxPoint
msize
=
mapPt
(
p
->
params
[
1
].
GetValue
(
tool
),
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
size
.
x
=
msize
.
x
;
size
.
y
=
msize
.
y
;
curPos
+=
mapPt
(
p
->
params
[
3
].
GetValue
(
tool
),
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_LINE_LOWER_LEFT
:
{
exposure
=
mapExposure
(
p
->
GetExposure
(),
m_Exposure
,
m_ImageNegative
);
wxPoint
msize
=
mapPt
(
p
->
params
[
1
].
GetValue
(
tool
),
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
size
.
x
=
msize
.
x
;
size
.
y
=
msize
.
y
;
wxPoint
lowerLeft
=
mapPt
(
p
->
params
[
3
].
GetValue
(
tool
),
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
curPos
+=
lowerLeft
;
// need the middle, so adjust from the lower left
curPos
.
y
+=
size
.
y
/
2
;
curPos
.
x
+=
size
.
x
/
2
;
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
size
,
S_SPOT_RECT
,
exposure
);
}
break
;
case
AMP_THERMAL
:
{
int
outerDiam
=
scale
(
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
int
innerDiam
=
scale
(
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
curPos
+=
mapPt
(
p
->
params
[
0
].
GetValue
(
tool
),
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
outerDiam
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillRoundFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
innerDiam
,
(
m_LayerNegative
^
m_ImageNegative
)
);
// @todo: draw the cross hairs, see page 23 of rs274
// spec. this might be done with two lines, thickness
// from params[4], and drawing
// darkness "(m_LayerNegative ^ m_ImageNegative)"
}
break
;
case
AMP_MOIRE
:
{
curPos
+=
mapPt
(
p
->
params
[
0
].
GetValue
(
tool
),
p
->
params
[
1
].
GetValue
(
tool
),
m_GerbMetric
);
// e.g.: "6,0,0,0.125,.01,0.01,3,0.003,0.150,0"
int
outerDiam
=
scale
(
p
->
params
[
2
].
GetValue
(
tool
),
m_GerbMetric
);
int
penThickness
=
scale
(
p
->
params
[
3
].
GetValue
(
tool
),
m_GerbMetric
);
int
gap
=
scale
(
p
->
params
[
4
].
GetValue
(
tool
),
m_GerbMetric
);
int
numCircles
=
(
int
)
p
->
params
[
5
].
GetValue
(
tool
);
int
crossHairThickness
=
scale
(
p
->
params
[
6
].
GetValue
(
tool
),
m_GerbMetric
);
int
crossHairLength
=
scale
(
p
->
params
[
7
].
GetValue
(
tool
),
m_GerbMetric
);
// ignore rotation, not supported
// adjust outerDiam by this on each nested circle
int
diamAdjust
=
2
*
(
gap
+
penThickness
);
for
(
int
i
=
0
;
i
<
numCircles
;
++
i
,
outerDiam
-=
diamAdjust
)
{
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillCircularTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
outerDiam
,
penThickness
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
}
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
wxSize
(
crossHairThickness
,
crossHairLength
),
S_SPOT_RECT
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
track
=
new
TRACK
(
pcb
);
pcb
->
m_Track
.
Append
(
track
);
D
(
printf
(
"R:%p
\n
"
,
track
);
)
// swap x and y in wxSize() for this one
fillOvalOrRectFlashTRACK
(
track
,
dcode
,
activeLayer
,
curPos
,
wxSize
(
crossHairLength
,
crossHairThickness
),
S_SPOT_RECT
,
!
(
m_LayerNegative
^
m_ImageNegative
)
);
}
break
;
case
AMP_EOF
:
case
AMP_OUTLINE
:
case
AMP_POLYGON
:
default
:
// not yet supported, waiting for you.
break
;
}
}
}
break
;
break
;
default
:
break
;
...
...
gerbview/rs274x.cpp
View file @
7fbeb899
...
...
@@ -535,6 +535,26 @@ bool GetEndOfBlock( char buff[GERBER_BUFZ], char*& text, FILE* gerber_file )
}
static
bool
CheckForLineEnd
(
char
buff
[
GERBER_BUFZ
],
char
*&
text
,
FILE
*
fp
)
{
while
(
*
text
==
'\n'
||
!*
text
)
{
if
(
*
text
==
'\n'
)
++
text
;
if
(
!*
text
)
{
if
(
fgets
(
buff
,
GERBER_BUFZ
,
fp
)
==
NULL
)
return
false
;
text
=
buff
;
}
}
return
true
;
}
bool
GERBER
::
ReadApertureMacro
(
char
buff
[
GERBER_BUFZ
],
char
*&
text
,
FILE
*
gerber_file
)
...
...
@@ -563,15 +583,8 @@ bool GERBER::ReadApertureMacro( char buff[GERBER_BUFZ],
if
(
*
text
==
'*'
)
++
text
;
if
(
*
text
==
'\n'
)
++
text
;
if
(
!*
text
)
{
text
=
buff
;
if
(
fgets
(
buff
,
GERBER_BUFZ
,
gerber_file
)
==
NULL
)
return
false
;
}
if
(
!
CheckForLineEnd
(
buff
,
text
,
gerber_file
)
)
return
false
;
if
(
*
text
==
'%'
)
break
;
// exit with text still pointing at %
...
...
@@ -625,12 +638,15 @@ bool GERBER::ReadApertureMacro( char buff[GERBER_BUFZ],
}
int
i
;
for
(
i
=
0
;
i
<
paramCount
&&
*
text
&&
*
text
!=
'*'
;
++
i
)
for
(
i
=
0
;
i
<
paramCount
&&
*
text
!=
'*'
;
++
i
)
{
prim
.
params
.
push_back
(
DCODE_PARAM
()
);
DCODE_PARAM
&
param
=
prim
.
params
.
back
();
if
(
!
CheckForLineEnd
(
buff
,
text
,
gerber_file
)
)
return
false
;
if
(
*
text
==
'$'
)
{
++
text
;
...
...
@@ -647,18 +663,24 @@ bool GERBER::ReadApertureMacro( char buff[GERBER_BUFZ],
// there are more parameters to read if this is an AMP_OUTLINE
if
(
prim
.
primitive_id
==
AMP_OUTLINE
)
{
// so far we have read [0]:exposure, [1]:#points, [2]:X start, [3]: Y start
// Now read all the points, plus trailing rotation in degrees.
// params[1] is a count of polygon points, so it must be given
// in advance, i.e. be immediate.
wxASSERT
(
prim
.
params
[
1
].
IsImmediate
()
);
paramCount
=
(
int
)
prim
.
params
[
1
].
GetValue
(
0
)
*
2
+
1
;
for
(
int
i
=
0
;
i
<
paramCount
&&
*
text
&&
*
text
!=
'*'
;
++
i
)
for
(
int
i
=
0
;
i
<
paramCount
&&
*
text
!=
'*'
;
++
i
)
{
prim
.
params
.
push_back
(
DCODE_PARAM
()
);
DCODE_PARAM
&
param
=
prim
.
params
.
back
();
if
(
!
CheckForLineEnd
(
buff
,
text
,
gerber_file
)
)
return
false
;
if
(
*
text
==
'$'
)
{
++
text
;
...
...
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