Commit 57463862 authored by g_harland's avatar g_harland

Added definitions for FIRST_COPPER_LAYER and LAST_COPPER_LAYER

parent 74b4e032
......@@ -20,7 +20,7 @@
#include "pcbstruct.h"
#include "macros.h"
//#include "pcbnew.h"
// #include "pcbnew.h"
#include "3d_viewer.h"
#include "trackball.h"
......@@ -59,7 +59,8 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
glRotatef(g_Parm_3D_Visu.m_Rot[1], 0.0, 1.0, 0.0);
glRotatef(g_Parm_3D_Visu.m_Rot[2], 0.0, 0.0, 1.0);
if( m_gllist ) glCallList( m_gllist );
if( m_gllist )
glCallList( m_gllist );
else
{
m_gllist = CreateDrawGL_List();
......@@ -67,15 +68,17 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
}
glFlush();
if (finish) glFinish();
if( finish )
glFinish();
SwapBuffers();
}
}
/**********************************************/
GLuint Pcb3D_GLCanvas::CreateDrawGL_List()
/**********************************************/
/* Creation de la liste des elements a afficher
*/
*/
{
GLuint gllist = glGenLists( 1 );
WinEDA_BasePcbFrame * pcbframe = m_Parent->m_Parent;
......@@ -93,20 +96,21 @@ int ii;
g_Parm_3D_Visu.m_Layers = pcb->m_BoardSettings->m_CopperLayerCount;
g_Parm_3D_Visu.m_BoardScale = 2.0 / MAX(g_Parm_3D_Visu.m_BoardSize.x, g_Parm_3D_Visu.m_BoardSize.y);
float epoxy_width = 1.6; // epoxy width in mm
g_Parm_3D_Visu.m_Epoxy_Width = epoxy_width/2.54 * 1000
g_Parm_3D_Visu.m_Epoxy_Width = epoxy_width / 2.54 * 1000
* g_Parm_3D_Visu.m_BoardScale;
/* calcul de l'altitude de chaque couche */
for ( ii = 0; ii < 32; ii++ )
for( ii = 0; ii < 32; ii++ )
{
if ( ii < g_Parm_3D_Visu.m_Layers )
if( ii < g_Parm_3D_Visu.m_Layers )
g_Parm_3D_Visu.m_LayerZcoord[ii] = g_Parm_3D_Visu.m_Epoxy_Width * ii
/ (g_Parm_3D_Visu.m_Layers-1);
else g_Parm_3D_Visu.m_LayerZcoord[ii] = g_Parm_3D_Visu.m_Epoxy_Width;
/ (g_Parm_3D_Visu.m_Layers - 1);
else
g_Parm_3D_Visu.m_LayerZcoord[ii] = g_Parm_3D_Visu.m_Epoxy_Width;
}
GLfloat zpos_cu = 500 * g_Parm_3D_Visu.m_BoardScale;
GLfloat zpos_cmp = g_Parm_3D_Visu.m_Epoxy_Width + zpos_cu;
g_Parm_3D_Visu.m_LayerZcoord[ADHESIVE_N_CU] = -zpos_cu*2;
g_Parm_3D_Visu.m_LayerZcoord[ADHESIVE_N_CU] = -zpos_cu * 2;
g_Parm_3D_Visu.m_LayerZcoord[ADHESIVE_N_CMP] = zpos_cmp + zpos_cu;
g_Parm_3D_Visu.m_LayerZcoord[SILKSCREEN_N_CU] = -zpos_cu;
g_Parm_3D_Visu.m_LayerZcoord[SILKSCREEN_N_CMP] = zpos_cmp;
......@@ -119,24 +123,30 @@ int ii;
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
/* draw axes*/
/* draw axes */
glEnable(GL_COLOR_MATERIAL);
SetGLColor(WHITE);
glBegin(GL_LINES);
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
glVertex3f( 0.0 , 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); // X axis
glVertex3f( 0.0 , 0.0, 0.0); glVertex3f(0.0, -1.0, 0.0); // y axis
glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis
glVertex3f( 0.0, 0.0, 0.0 );
glVertex3f( 1.0, 0.0, 0.0 ); // X axis
glVertex3f( 0.0, 0.0, 0.0);
glVertex3f( 0.0, -1.0, 0.0); // Y axis
glNormal3f( 1.0, 0.0, 0.0); // Normal is Y axis
glVertex3f( 0.0 , 0.0, 0.0); glVertex3f(0.0, 0.0, 0.3); // z axis
glVertex3f( 0.0 , 0.0, 0.0);
glVertex3f( 0.0, 0.0, 0.3 ); // Z axis
glEnd();
/* Draw epoxy limits (do not use, works and test in progress)*/
/* Draw epoxy limits (do not use, works and test in progress) */
#if 0
glEnable(GL_FOG);
glEnable(GL_FOG);
GLfloat param;
// param = GL_LINEAR; glFogfv(GL_FOG_MODE,& param);
param = 0.2; glFogfv(GL_FOG_DENSITY,& param);
param = g_Parm_3D_Visu.m_LayerZcoord[15]; glFogfv(GL_FOG_END,& param);
// param = GL_LINEAR;
// glFogfv(GL_FOG_MODE, & param);
param = 0.2;
glFogfv(GL_FOG_DENSITY, & param);
param = g_Parm_3D_Visu.m_LayerZcoord[15];
glFogfv(GL_FOG_END, & param);
glBegin(GL_QUADS);
SetGLColor(g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N]);
double sx = DataScale3D * g_Parm_3D_Visu.m_BoardSize.x / 2;
......@@ -144,18 +154,18 @@ glEnable(GL_FOG);
double zpos = g_Parm_3D_Visu.m_LayerZcoord[15];
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
sx = sy = 0.5;
glVertex3f( -sx, -sy , zpos);
glVertex3f( -sx, sy , zpos);
glVertex3f( sx, sy , zpos);
glVertex3f( sx, -sy , zpos);
glVertex3f( -sx, -sy, zpos );
glVertex3f( -sx, sy, zpos );
glVertex3f( sx, sy, zpos );
glVertex3f( sx, -sy, zpos );
glEnd();
glBegin(GL_QUADS);
SetGLColor(g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[COPPER_LAYER_N]);
glNormal3f( 0.0, 0.0, -1.0); // Normal is -Z axis
glVertex3f( -sx, -sy , 0);
glVertex3f( -sx, sy , 0);
glVertex3f( sx, sy , 0);
glVertex3f( sx, -sy , 0);
glNormal3f( 0.0, 0.0, -1.0 ); // Normal is -Z axis
glVertex3f( -sx, -sy, 0 );
glVertex3f( -sx, sy, 0 );
glVertex3f( sx, sy, 0 );
glVertex3f( sx, -sy, 0 );
glEnd();
#endif
......@@ -164,27 +174,29 @@ glEnable(GL_FOG);
-g_Parm_3D_Visu.m_BoardPos.y * g_Parm_3D_Visu.m_BoardScale,
0.0F);
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis
/* Trac des pistes : */
for (pt_piste = pcb->m_Track ; pt_piste != NULL ; pt_piste = (TRACK*) pt_piste->Pnext )
for( pt_piste = pcb->m_Track; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
{
if ( pt_piste->Type() == TYPEVIA )
if( pt_piste->Type() == TYPEVIA )
Draw3D_Via((SEGVIA*)pt_piste);
else Draw3D_Track( pt_piste);
else
Draw3D_Track( pt_piste);
}
/* Trac des edges */
EDA_BaseStruct * PtStruct;
for ( PtStruct = pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext)
for( PtStruct = pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext )
{
#define STRUCT ((DRAWSEGMENT *) PtStruct)
if( PtStruct->Type() != TYPEDRAWSEGMENT ) continue;
if( PtStruct->Type() != TYPEDRAWSEGMENT )
continue;
Draw3D_DrawSegment(STRUCT);
}
/* trac des modules */
MODULE * Module = (MODULE*) pcb->m_Modules;
for ( ; Module != NULL; Module = (MODULE *) Module->Pnext )
for( ; Module != NULL; Module = (MODULE *) Module->Pnext )
{
Module->Draw3D(this);
}
......@@ -192,11 +204,12 @@ MODULE * Module = (MODULE*) pcb->m_Modules;
/* Test for errors */
GLenum err = glGetError();
if ( err != GL_NO_ERROR )
if( err != GL_NO_ERROR )
DisplayError(this, wxT("Error in GL commands") );
return gllist;
}
/************************************************/
void Pcb3D_GLCanvas::Draw3D_Track(TRACK * track)
/************************************************/
......@@ -207,13 +220,14 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
double ox, oy, fx, fy;
double w;
if ( color & ITEM_NOT_SHOW ) return;
if ( layer == CMP_N )
layer = g_Parm_3D_Visu.m_Layers -1;
if( color & ITEM_NOT_SHOW )
return;
if( layer == LAST_COPPER_LAYER )
layer = g_Parm_3D_Visu.m_Layers - 1;
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
SetGLColor(color);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
w = track->m_Width * g_Parm_3D_Visu.m_BoardScale;
ox = track->m_Start.x * g_Parm_3D_Visu.m_BoardScale;
......@@ -223,11 +237,12 @@ double w;
Draw3D_FilledSegment(ox, -oy, fx, -fy, w, zpos);
}
/********************************************/
void Pcb3D_GLCanvas::Draw3D_Via(SEGVIA * via)
/*********************************************/
/* 3D drawing for a VIA (cylinder + filled circles)
*/
*/
{
double x, y, r, hole;
int layer, top_layer, bottom_layer;
......@@ -242,18 +257,20 @@ int color;
via->ReturnLayerPair(&top_layer, &bottom_layer);
// Drawing filled circles:
for ( layer = bottom_layer; layer < g_Parm_3D_Visu.m_Layers; layer++ )
for( layer = bottom_layer; layer < g_Parm_3D_Visu.m_Layers; layer++ )
{
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
if ( layer < g_Parm_3D_Visu.m_Layers-1 )
if( layer < g_Parm_3D_Visu.m_Layers - 1 )
color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
else color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N];
if ( color & ITEM_NOT_SHOW ) continue;
else
color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N];
if( color & ITEM_NOT_SHOW )
continue;
SetGLColor(color);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
Draw3D_FilledCircle(x, -y, r, hole, zpos);
if ( layer >= top_layer) break;
if( layer >= top_layer)
break;
}
// Drawing hole:
SetGLColor(DARKGRAY);
......@@ -271,7 +288,8 @@ double x, y, xf, yf;
double zpos, w;
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->GetLayer()];
if ( color & ITEM_NOT_SHOW ) return;
if( color & ITEM_NOT_SHOW )
return;
SetGLColor(color);
w = segment->m_Width * g_Parm_3D_Visu.m_BoardScale;
......@@ -280,25 +298,24 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->GetLayer()];
xf = segment->m_End.x * g_Parm_3D_Visu.m_BoardScale;
yf = segment->m_End.y * g_Parm_3D_Visu.m_BoardScale;
if ( segment->GetLayer() == EDGE_N)
if( segment->GetLayer() == EDGE_N )
{
for ( layer = 0; layer < g_Parm_3D_Visu.m_Layers; layer++ )
for( layer = 0; layer < g_Parm_3D_Visu.m_Layers; layer++ )
{
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos);
Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos );
}
}
else
{
zpos = g_Parm_3D_Visu.m_LayerZcoord[segment->GetLayer()];
Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos);
Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos );
}
}
/*********************************************/
void MODULE::Draw3D(Pcb3D_GLCanvas * glcanvas)
/*********************************************/
......@@ -308,43 +325,45 @@ D_PAD * pad = m_Pads;
#if 0
if( ! DisplayOpt.Show_Modules_Cmp )
{
if(m_Layer == CMP_N) return;
if( m_Layer == CMP_N )
return;
}
if( ! DisplayOpt.Show_Modules_Cu )
{
if(m_Layer == COPPER_LAYER_N) return;
if( m_Layer == COPPER_LAYER_N )
return;
}
#endif
/* Draw pads */
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis
for( ; pad != NULL; pad = (D_PAD*) pad->Pnext )
{
pad->Draw3D(glcanvas);
}
/* Draw module shape: 3D shape if exists (or module edge if not exists)*/
/* Draw module shape: 3D shape if exists (or module edge if not exists) */
Struct3D_Master * Struct3D = m_3D_Drawings;
bool As3dShape = FALSE;
glPushMatrix();
glTranslatef(m_Pos.x * g_Parm_3D_Visu.m_BoardScale,
glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BoardScale,
-m_Pos.y * g_Parm_3D_Visu.m_BoardScale,
g_Parm_3D_Visu.m_LayerZcoord[m_Layer] );
if ( m_Orient )
if( m_Orient )
{
glRotatef( (double)m_Orient / 10, 0.0, 0.0, 1.0 );
}
if ( m_Layer == COPPER_LAYER_N )
if( m_Layer == COPPER_LAYER_N )
{
glRotatef( 180.0, 0.0, 1.0, 0.0 );
glRotatef( 180.0, 0.0, 0.0, 1.0 );
}
DataScale3D = g_Parm_3D_Visu.m_BoardScale*UNITS3D_TO_UNITSPCB;
DataScale3D = g_Parm_3D_Visu.m_BoardScale * UNITS3D_TO_UNITSPCB;
for ( ; Struct3D != NULL; Struct3D = (Struct3D_Master *) Struct3D->Pnext )
for( ; Struct3D != NULL; Struct3D = (Struct3D_Master *) Struct3D->Pnext )
{
if ( ! Struct3D->m_Shape3DName.IsEmpty() )
if( ! Struct3D->m_Shape3DName.IsEmpty() )
{
As3dShape = TRUE;
Struct3D->ReadData();
......@@ -352,11 +371,11 @@ bool As3dShape = FALSE;
}
glPopMatrix();
if ( ! As3dShape)
if( ! As3dShape )
{
EDA_BaseStruct * Struct = m_Drawings;
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
for( ;Struct != NULL; Struct = Struct->Pnext )
glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis
for( ; Struct != NULL; Struct = Struct->Pnext )
{
switch( Struct->Type() )
{
......@@ -367,24 +386,27 @@ bool As3dShape = FALSE;
((EDGE_MODULE *) Struct)->Draw3D(glcanvas);
break;
default: break;
default:
break;
}
}
}
}
/***************************************************/
void EDGE_MODULE::Draw3D(Pcb3D_GLCanvas * glcanvas)
/***************************************************/
{
int ux0, uy0, dx, dy,rayon, StAngle, EndAngle;
double scale, x, y, fx, fy, w, zpos ;
int ux0, uy0, dx, dy, rayon, StAngle, EndAngle;
double scale, x, y, fx, fy, w, zpos;
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
if ( color & ITEM_NOT_SHOW ) return;
if( color & ITEM_NOT_SHOW )
return;
SetGLColor(color);
glNormal3f( 0.0, 0.0, (m_Layer == COPPER_LAYER_N) ? -1.0 : 1.0);
glNormal3f( 0.0, 0.0, (m_Layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
scale = g_Parm_3D_Visu.m_BoardScale;
ux0 = m_Start.x;
......@@ -393,7 +415,7 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
dy = m_End.y;
zpos = g_Parm_3D_Visu.m_LayerZcoord[m_Layer];
w = m_Width * g_Parm_3D_Visu.m_BoardScale;
switch (m_Shape )
switch( m_Shape )
{
case S_SEGMENT:
x = m_Start.x * g_Parm_3D_Visu.m_BoardScale;
......@@ -404,13 +426,13 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
break ;
case S_CIRCLE:
rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
rayon = (int)hypot( (double)(dx - ux0), (double)(dy - uy0) );
/* TO DO */
break;
case S_ARC:
rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
StAngle = (int)ArcTangente( dy-uy0, dx-ux0 );
rayon = (int)hypot( (double)(dx - ux0), (double)(dy - uy0) );
StAngle = (int)ArcTangente( dy - uy0, dx - ux0 );
EndAngle = StAngle + m_Angle;
/* TO DO */
break;
......@@ -422,11 +444,11 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[m_Layer];
void D_PAD::Draw3D(Pcb3D_GLCanvas * glcanvas)
/***********************************************/
/* Dessin 3D des pads avec leur trou de percage
*/
*/
{
int ii, ll, layer, nlmax;
int ux0,uy0,
dx,dx0,dy,dy0,
int ux0, uy0,
dx, dx0, dy, dy0,
delta_cx, delta_cy,
xc, yc;
int angle, delta_angle;
......@@ -443,7 +465,7 @@ int color;
scale = g_Parm_3D_Visu.m_BoardScale;
holeX = (double)m_Drill.x * scale / 2;
holeY = (double)m_Drill.y * scale / 2;
hole = MIN (holeX,holeY);
hole = MIN(holeX, holeY);
/* calcul du centre des formes des pads : */
shape_pos = ReturnShapePos();
......@@ -453,40 +475,45 @@ int color;
yc = uy0;
/* le trace depend de la rotation de l'empreinte */
dx = dx0 = m_Size.x >> 1 ;
dy = dy0 = m_Size.y >> 1 ; /* demi dim dx et dy */
dx = dx0 = m_Size.x >> 1;
dy = dy0 = m_Size.y >> 1; /* demi dim dx et dy */
angle = m_Orient;
drillx = m_Pos.x * scale;
drilly = m_Pos.y * scale;
/* Draw the pad hole (TODO: draw OBLONG hole)*/
if ( holeX && holeY )
/* Draw the pad hole (TODO: draw OBLONG hole) */
if( holeX && holeY )
{
SetGLColor(DARKGRAY);
Draw3D_FilledCylinder(drillx, -drilly, hole, g_Parm_3D_Visu.m_LayerZcoord[CMP_N], 0.0);
}
glNormal3f( 0.0, 0.0, 1.0); // Normal is Z axis
nlmax = g_Parm_3D_Visu.m_Layers-1;
glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis
nlmax = g_Parm_3D_Visu.m_Layers - 1;
Oncu = (m_Masque_Layer & CUIVRE_LAYER) ? TRUE : FALSE;
Oncmp = (m_Masque_Layer & CMP_LAYER) ? TRUE : FALSE;
Both = Oncu && Oncmp;
switch (m_PadShape & 0x7F)
switch( m_PadShape & 0x7F )
{
case CIRCLE :
x = xc * scale;
y = yc * scale;
r = (double)dx * scale;
for ( layer = COPPER_LAYER_N; layer <= CMP_N; layer ++)
{
if (layer && (layer == nlmax) ) layer = CMP_N;
if ( (layer == CMP_N) && ! Oncmp ) continue;
if ( (layer == COPPER_LAYER_N) && ! Oncu ) continue;
if ( (layer > COPPER_LAYER_N) && (layer < CMP_N) && !Both) continue;
for( layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; layer++ )
{
if( layer && (layer == nlmax) )
layer = CMP_N;
if( (layer == CMP_N) && ! Oncmp )
continue;
if( (layer == COPPER_LAYER_N) && ! Oncu )
continue;
if( (layer > FIRST_COPPER_LAYER) && (layer < LAST_COPPER_LAYER) && !Both)
continue;
color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
if ( color & ITEM_NOT_SHOW ) continue;
if( color & ITEM_NOT_SHOW )
continue;
SetGLColor(color);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
Draw3D_FilledCircle(x, -y, r, hole, zpos);
}
......@@ -496,13 +523,15 @@ int color;
/* calcul de l'entraxe de l'ellipse */
if( dx > dy ) /* ellipse horizontale */
{
delta_cx = dx - dy; delta_cy = 0;
delta_cx = dx - dy;
delta_cy = 0;
w = m_Size.y * scale;
delta_angle = angle+900;
delta_angle = angle + 900;
}
else /* ellipse verticale */
{
delta_cx = 0; delta_cy = dy - dx;
delta_cx = 0;
delta_cy = dy - dx;
w = m_Size.x * scale;
delta_angle = angle;
}
......@@ -513,15 +542,20 @@ int color;
oy = (double)(uy0 + delta_cy) * scale;
fx = (double)(ux0 - delta_cx) * scale;
fy = (double)(uy0 - delta_cy) * scale;
for ( layer = COPPER_LAYER_N; layer <= CMP_N; layer ++)
{
if (layer && (layer == nlmax) ) layer = CMP_N;
if ( (layer == CMP_N) && ! Oncmp ) continue;
if ( (layer == COPPER_LAYER_N) && ! Oncu ) continue;
if ( (layer > COPPER_LAYER_N) && (layer < CMP_N) && !Both) continue;
for( layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; layer ++ )
{
if( layer && (layer == nlmax) )
layer = CMP_N;
if( (layer == CMP_N) && ! Oncmp )
continue;
if( (layer == COPPER_LAYER_N) && ! Oncu )
continue;
if( (layer > FIRST_COPPER_LAYER) && (layer < LAST_COPPER_LAYER) && !Both )
continue;
color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
if ( color & ITEM_NOT_SHOW ) continue;
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
if( color & ITEM_NOT_SHOW )
continue;
SetGLColor(color);
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
Draw3D_FilledSegmentWithHole(ox, -oy, fx, -fy, w, drillx, -drilly, hole, zpos);
......@@ -549,74 +583,84 @@ int color;
coord[3][0] = + dx + ddy;
coord[3][1] = + dy - ddx;
for (ii = 0; ii < 4; ii++)
for( ii = 0; ii < 4; ii++ )
{
RotatePoint(&coord[ii][0],&coord[ii][1], angle);
RotatePoint(&coord[ii][0], &coord[ii][1], angle);
coord[ii][0] += ux0;
coord[ii][1] += uy0;
ll = ii*2;
ll = ii * 2;
fcoord[ll][0] = coord[ii][0] * scale;
fcoord[ll][1] = coord[ii][1] * scale;
}
for (ii = 0; ii < 7; ii+=2)
for( ii = 0; ii < 7; ii += 2 )
{
ll = ii+2; if (ll > 7) ll -= 8;
fcoord[ii+1][0] = (fcoord[ii][0] + fcoord[ll][0])/2;
fcoord[ii+1][1] = (fcoord[ii][1] + fcoord[ll][1])/2;
ll = ii + 2;
if( ll > 7 )
ll -= 8;
fcoord[ii + 1][0] = (fcoord[ii][0] + fcoord[ll][0]) / 2;
fcoord[ii + 1][1] = (fcoord[ii][1] + fcoord[ll][1]) / 2;
}
for (ii = 0; ii < 8; ii++)
for( ii = 0; ii < 8; ii++ )
{
f_hole_coord[ii][0] = -hole*0.707;
f_hole_coord[ii][1] = hole*0.707;
f_hole_coord[ii][0] = -hole * 0.707;
f_hole_coord[ii][1] = hole * 0.707;
RotatePoint(&f_hole_coord[ii][0], &f_hole_coord[ii][1],
angle -(ii * 450) );
angle - (ii * 450));
f_hole_coord[ii][0] += drillx;
f_hole_coord[ii][1] += drilly;
}
for ( layer = COPPER_LAYER_N; layer <= CMP_N; layer ++)
for( layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; layer++ )
{
if (layer && (layer == nlmax) ) layer = CMP_N;
if ( (layer == CMP_N) && ! Oncmp ) continue;
if ( (layer == COPPER_LAYER_N) && ! Oncu ) continue;
if ( (layer > COPPER_LAYER_N) && (layer < CMP_N) && !Both) continue;
if( layer && (layer == nlmax) )
layer = CMP_N;
if( (layer == CMP_N) && ! Oncmp )
continue;
if( (layer == COPPER_LAYER_N) && ! Oncu )
continue;
if( (layer > FIRST_COPPER_LAYER) && (layer < LAST_COPPER_LAYER) && !Both )
continue;
color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0);
if ( color & ITEM_NOT_SHOW ) continue;
glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 );
if( color & ITEM_NOT_SHOW )
continue;
SetGLColor(color);
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
glBegin(GL_QUAD_STRIP);
for ( ii = 0; ii < 8; ii++ )
for( ii = 0; ii < 8; ii++ )
{
glVertex3f( f_hole_coord[ii][0], -f_hole_coord[ii][1] , zpos);
glVertex3f( fcoord[ii][0], -fcoord[ii][1] , zpos);
glVertex3f( f_hole_coord[ii][0], -f_hole_coord[ii][1], zpos );
glVertex3f( fcoord[ii][0], -fcoord[ii][1], zpos );
}
glVertex3f( f_hole_coord[0][0], -f_hole_coord[0][1] , zpos);
glVertex3f( fcoord[0][0], -fcoord[0][1] , zpos);
glVertex3f( f_hole_coord[0][0], -f_hole_coord[0][1], zpos );
glVertex3f( fcoord[0][0], -fcoord[0][1], zpos );
glEnd();
}
}
break;
default:
break;
}
}
}
/*************************/
void SetGLColor(int color)
/*************************/
{
double red, green,blue;
double red, green, blue;
StructColors colordata = ColorRefs[color & MASKCOLOR];
red = colordata.m_Red / 255.0;
blue = colordata.m_Blue / 255.0;
green = colordata.m_Green / 255.0;
glColor3f(red, green,blue);
glColor3f(red, green, blue);
}
/********************************************************/
static void Draw3D_FilledCircle(double posx, double posy,
double rayon, double hole, double zpos)
......@@ -626,18 +670,21 @@ int ii, slice = 16;
double x, y;
glBegin(GL_QUAD_STRIP);
for ( ii = 0; ii <= slice; ii++ )
for( ii = 0; ii <= slice; ii++ )
{
x = hole; y = 0.0;
x = hole;
y = 0.0;
RotatePoint(&x, &y, ii * 225);
glVertex3f( x + posx, y + posy, zpos);
x = rayon; y = 0.0;
glVertex3f( x + posx, y + posy, zpos );
x = rayon;
y = 0.0;
RotatePoint(&x, &y, ii * 225);
glVertex3f( x + posx, y + posy, zpos);
glVertex3f( x + posx, y + posy, zpos );
}
glEnd();
}
/*********************************************************/
static void Draw3D_FilledCylinder(double posx, double posy,
double rayon, double height, double zpos)
......@@ -649,19 +696,20 @@ double x, y;
S3D_Vertex coords[4];
double tmp = DataScale3D;
DataScale3D = 1.0; //les coord sont deja a l'echelle pour Set_Object_Data();
DataScale3D = 1.0; // les coord sont deja a l'echelle pour Set_Object_Data();
coords[0].x = coords[1].x = posx + rayon;
coords[0].y = coords[1].y = posy;
coords[0].z = coords[3].z = zpos;
coords[1].z = coords[2].z = zpos + height;
for ( ii = 0; ii <= NB_SEGM; ii++ )
for( ii = 0; ii <= NB_SEGM; ii++ )
{
x = rayon; y = 0.0;
RotatePoint(&x, &y, ii * (3600/NB_SEGM));
x = rayon;
y = 0.0;
RotatePoint(&x, &y, ii * (3600 / NB_SEGM));
coords[2].x = coords[3].x = posx + x;
coords[2].y = coords[3].y = posy + y;
Set_Object_Data(coords, 4 );
Set_Object_Data( coords, 4 );
coords[0].x = coords[2].x;
coords[0].y = coords[2].y;
coords[1].x = coords[3].x;
......@@ -671,21 +719,23 @@ double tmp = DataScale3D;
DataScale3D = tmp;
}
/*****************************************************************/
static void Draw3D_FilledSegment(double startx, double starty,
double endx, double endy,double width, double zpos)
/*****************************************************************/
/* trace un polygone semblable a un segment a bouts ronds
*/
*/
{
double dx, dy, x, y, firstx=0, firsty=0;
int ii, angle;
/* on va calculer les coordonnes du segment suppos horizontal,
puis tourner les cordonnes de l'angle voulu */
// on va calculer les coordonnes du segment suppos horizontal,
// puis tourner les cordonnes de l'angle voulu
dx = endx - startx; dy = endy - starty;
angle = (int)(( atan2( dy, dx ) / M_PI * 1800)+0.5) ;
dx = endx - startx;
dy = endy - starty;
angle = (int)( ( atan2(dy, dx) * 1800 / M_PI ) + 0.5 );
RotatePoint(&dx, &dy, angle); // apres rotation: dx = longueur du segment
// dy = 0;
......@@ -693,51 +743,56 @@ int ii, angle;
glBegin(GL_POLYGON);
// trac de l'arrondi a droite (1er demi polygone a la fin du segment)
for ( ii = 0; ii <= 8; ii++ )
for( ii = 0; ii <= 8; ii++ )
{
x = 0.0; y =-width;
x = 0.0;
y = -width;
RotatePoint(&x, &y, -ii * 225);
x += dx;
RotatePoint(&x, &y, -angle);
glVertex3f( startx + x, starty+y, zpos);
if ( ii == 0 )
glVertex3f( startx + x, starty+y, zpos );
if( ii == 0 )
{
firstx = startx + x;
firsty = starty + y;
}
}
// trac de l'arrondi a gauche (2ieme demi polygone a l'origine du segment)
for ( ii = 0; ii <= 8; ii++ )
for( ii = 0; ii <= 8; ii++ )
{
int jj = ii * 225;
x = 0.0; y = width;
RotatePoint(&x, &y, -angle -jj);
glVertex3f( startx + x, starty+y, zpos);
x = 0.0;
y = width;
RotatePoint(&x, &y, -angle - jj);
glVertex3f( startx + x, starty+y, zpos );
}
glVertex3f( firstx, firsty, zpos);
glVertex3f( firstx, firsty, zpos );
glEnd();
}
/*****************************************************************/
static void Draw3D_FilledSegmentWithHole(double startx, double starty,
double endx, double endy,double width,
double endx, double endy, double width,
double holex, double holey, double holeradius, double zpos)
/*****************************************************************/
/* trace un polygone semblable a un segment a bouts ronds avec trou
*/
*/
{
double x, y, xin, yin;
double firstx=0, firsty=0, firstxin=0, firstyin=0;
double firstx = 0, firsty = 0, firstxin = 0, firstyin = 0;
int ii, angle, theta;
/* on va calculer les coordonnes du segment suppos horizontal,
puis tourner les cordonnes de l'angle voulu
Tous des calculs se font avec startx, starty comme origine du trac */
// on va calculer les coordonnes du segment suppos horizontal,
// puis tourner les cordonnes de l'angle voulu
// Tous des calculs se font avec startx, starty comme origine du trac
endx -= startx; endy -= starty;
holex -= startx; holey -= starty;
angle = (int)(( atan2( endy, endx ) / M_PI * 1800)+0.5) ;
endx -= startx;
endy -= starty;
holex -= startx;
holey -= starty;
angle = (int)( ( atan2(endy, endx) * 1800 / M_PI ) + 0.5 );
RotatePoint(&endx, &endy, angle); // apres rotation: endx = longueur du segment
// endy = 0;
......@@ -747,10 +802,12 @@ int ii, angle, theta;
glBegin(GL_QUAD_STRIP);
// trac de l'arrondi a droite (1er demi polygone a la fin du segment)
// autour du demi-trou de percage
for ( ii = 0; ii <= 8; ii++ )
for( ii = 0; ii <= 8; ii++ )
{
x = 0.0; y = -width;
xin = 0.0; yin = - holeradius;
x = 0.0;
y = -width;
xin = 0.0;
yin = -holeradius;
theta = -ii * 225;
RotatePoint(&x, &y, theta);
RotatePoint(&xin, &yin, theta);
......@@ -758,9 +815,9 @@ int ii, angle, theta;
RotatePoint(&x, &y, -angle);
xin += holex;
RotatePoint(&xin, &yin, -angle);
glVertex3f( startx + xin, starty+yin, zpos);
glVertex3f( startx + x, starty+y, zpos);
if ( ii == 0 ) // Memorisation du point de dpart du trac
glVertex3f( startx + xin, starty+yin, zpos );
glVertex3f( startx + x, starty+y, zpos );
if( ii == 0 ) // Memorisation du point de dpart du trac
{
firstx = startx + x;
firsty = starty + y;
......@@ -769,21 +826,22 @@ int ii, angle, theta;
}
}
// trac de l'arrondi a gauche (2ieme demi polygone a l'origine du segment)
for ( ii = 0; ii <= 8; ii++ )
for( ii = 0; ii <= 8; ii++ )
{
theta = - ii * 225;
x = 0.0; y = width;
theta = -ii * 225;
x = 0.0;
y = width;
RotatePoint(&x, &y, -angle + theta);
xin = 0.0; yin = holeradius;
xin = 0.0;
yin = holeradius;
RotatePoint(&xin, &yin, theta);
xin += holex;
RotatePoint(&xin, &yin, -angle);
glVertex3f( startx + xin,starty + yin, zpos);
glVertex3f( startx + x, starty + y, zpos);
glVertex3f( startx + xin,starty + yin, zpos );
glVertex3f( startx + x, starty + y, zpos );
}
glVertex3f( firstxin, firstyin, zpos);
glVertex3f( firstx, firsty, zpos);
glVertex3f( firstxin, firstyin, zpos );
glVertex3f( firstx, firsty, zpos );
glEnd();
}
......@@ -4,6 +4,14 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2007-Nov-01 UPDATE Geoff Harland <gharlandau@yahoo.com.au>
================================================================================
+ pcbnew
* Provided new definitions of FIRST_COPPER_LAYER and LAST_COPPER_LAYER within
include/pcbstruct.h, and used those definitions within various other files.
Beautified and generally refined 3d-viewer/3d_draw.cpp and pcbnew/plotgerb.cpp.
2007-Oct-31 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+kicad:
......@@ -401,8 +409,8 @@ email address.
field. (Refer to 2007-Oct-2 UPDATE notes for the relevance of this.)
* Beautification and house keeping.
+ eeschema
* The editpart.cpp and editpart.cpp files (which are no longer used) have been
removed, and replaced with editpart.cpp.notused and editpart.cpp.notused
* The editpart.cpp and libedpart.cpp files (which are no longer used) have been
removed, and replaced with editpart.cpp.notused and libedpart.cpp.notused
+ cvpcb
* Additional "OK", "Cancel", and "Apply" buttons have now been provided for the
"Options" dialog box which lists various display options for footprints.
......
......@@ -153,7 +153,7 @@ static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* aFile,
if( pcb_layer_number < 0 )
continue;
if( pcb_layer_number > CMP_N )
if( pcb_layer_number > LAST_COPPER_LAYER )
{
DRAWSEGMENT* drawitem = new DRAWSEGMENT( pcb, TYPEDRAWSEGMENT );
......
......@@ -266,7 +266,7 @@ bool AsCmpLayer = false;
AsCmpLayer = true;
else
{
if( LayerLookUpTable[ii] >= CMP_N )
if( LayerLookUpTable[ii] >= LAST_COPPER_LAYER )
continue; // not a copper layer
if( LayerLookUpTable[ii] >= g_DesignSettings.m_CopperLayerCount )
g_DesignSettings.m_CopperLayerCount++;
......@@ -275,8 +275,8 @@ bool AsCmpLayer = false;
if( AsCmpLayer )
g_DesignSettings.m_CopperLayerCount++;
if( g_DesignSettings.m_CopperLayerCount > CMP_N + 1 ) // should not occur.
g_DesignSettings.m_CopperLayerCount = CMP_N + 1;
if( g_DesignSettings.m_CopperLayerCount > NB_COPPER_LAYERS ) // should not occur.
g_DesignSettings.m_CopperLayerCount = NB_COPPER_LAYERS;
EndModal( 1 );
}
......@@ -35,6 +35,7 @@
/* Layer identification (layer number) */
#define FIRST_COPPER_LAYER 0
#define COPPER_LAYER_N 0
#define LAYER_N_2 1 /* Numero layer 2 */
#define LAYER_N_3 2 /* Numero layer 3 */
......@@ -52,7 +53,8 @@
#define LAYER_N_15 14 /* Numero layer 15 */
#define LAYER_CMP_N 15
#define CMP_N 15
#define NB_COPPER_LAYERS (CMP_N + 1)
#define LAST_COPPER_LAYER 15
#define NB_COPPER_LAYERS (LAST_COPPER_LAYER + 1)
#define FIRST_NO_COPPER_LAYER 16
#define ADHESIVE_N_CU 16
......
......@@ -181,7 +181,7 @@ void WinEDA_BasePcbFrame::SwitchLayer( wxDC* DC, int layer )
// Copper layers cannot be selected unconditionally; how many
// of those layers are currently enabled needs to be checked.
if( (layer >= COPPER_LAYER_N) && (layer <= CMP_N) )
if( (layer >= FIRST_COPPER_LAYER) && (layer <= LAST_COPPER_LAYER) )
{
// If only one copper layer is enabled, the only such layer
// that can be selected to is the "Copper" layer (so the
......
......@@ -173,7 +173,7 @@ void EDGE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
GRSetDrawMode( DC, draw_mode );
typeaff = frame->m_DisplayModEdge;
if( m_Layer <= CMP_N )
if( m_Layer <= LAST_COPPER_LAYER )
{
typeaff = frame->m_DisplayPcbTrackFill;
if( !typeaff )
......
......@@ -99,8 +99,8 @@ int TEXTE_PCB::ReadTextePcbDescr( FILE* File, int* LineNum )
{
sscanf( Line + 2, " %d %d %lX %d\n", &m_Layer, &m_Miroir,
&m_TimeStamp, &dummy );
if( m_Layer < COPPER_LAYER_N )
m_Layer = COPPER_LAYER_N;
if( m_Layer < FIRST_COPPER_LAYER )
m_Layer = FIRST_COPPER_LAYER;
if( m_Layer > LAST_NO_COPPER_LAYER )
m_Layer = LAST_NO_COPPER_LAYER;
......
......@@ -268,7 +268,7 @@ int TRACK::ReturnMaskLayer()
if( via_type == VIA_THROUGH )
return ALL_CU_LAYERS;
// VIA_BLIND ou VIA_BURIED:
// VIA_BLIND or VIA_BURIED:
int bottom_layer, top_layer;
......@@ -720,7 +720,7 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode )
}
/* Shows clearance (for tracks and vias, not for zone segments */
if( DisplayOpt.DisplayTrackIsol && ( m_Layer <= CMP_N )
if( DisplayOpt.DisplayTrackIsol && ( m_Layer <= LAST_COPPER_LAYER )
&& ( Type() == TYPETRACK || Type() == TYPEVIA) )
{
GRCSegm( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
......
......@@ -136,12 +136,12 @@ WinEDA_CotationPropertiesFrame::WinEDA_CotationPropertiesFrame( WinEDA_PcbFrame*
wxDefaultPosition, wxDefaultSize );
LeftBoxSizer->Add( m_SelLayerBox, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
int ii;
for( ii = CMP_N + 1; ii < NB_LAYERS; ii++ )
for( ii = FIRST_NO_COPPER_LAYER; ii < NB_LAYERS; ii++ )
{
m_SelLayerBox->Append( ReturnPcbLayerName( ii ) );
}
m_SelLayerBox->SetSelection( Cotation->GetLayer() - (CMP_N + 1) );
m_SelLayerBox->SetSelection( Cotation->GetLayer() - FIRST_NO_COPPER_LAYER );
GetSizer()->Fit( this );
GetSizer()->SetSizeHints( this );
......@@ -175,8 +175,8 @@ void WinEDA_CotationPropertiesFrame::OnOkClick( wxCommandEvent& event )
m_TxtWidthCtrl->GetValue();
CurrentCotation->m_Text->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0;
CurrentCotation->SetLayer( m_SelLayerBox->GetChoice() + CMP_N + 1 );
CurrentCotation->m_Text->SetLayer( m_SelLayerBox->GetChoice() + CMP_N + 1 );
CurrentCotation->SetLayer( m_SelLayerBox->GetChoice() + FIRST_NO_COPPER_LAYER );
CurrentCotation->m_Text->SetLayer( m_SelLayerBox->GetChoice() + FIRST_NO_COPPER_LAYER );
CurrentCotation->m_Text->CreateDrawData();
......
......@@ -194,11 +194,11 @@ void WinEDA_ModuleEditFrame::Edit_Edge_Layer( EDGE_MODULE* Edge, wxDC* DC )
/* Ask for the new layer */
new_layer = SelectLayer( new_layer, COPPER_LAYER_N, LAST_NO_COPPER_LAYER );
new_layer = SelectLayer( new_layer, FIRST_COPPER_LAYER, LAST_NO_COPPER_LAYER );
if( new_layer < 0 )
return;
if ( new_layer >= COPPER_LAYER_N && new_layer <= LAYER_CMP_N )
if ( new_layer >= FIRST_COPPER_LAYER && new_layer <= LAST_COPPER_LAYER )
/* an edge is put on a copper layer, and it is very dangerous. a confirmation is requested */
{
if ( ! IsOK(this, _("The graphic item will be on a copper layer.It is very dangerous. Are you sure") ) )
......
......@@ -632,7 +632,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_POPUP_PCB_SELECT_CU_LAYER:
itmp = SelectLayer( GetScreen()->m_Active_Layer, -1, CMP_N );
itmp = SelectLayer( GetScreen()->m_Active_Layer, -1, LAST_COPPER_LAYER );
if( itmp >= 0 )
GetScreen()->m_Active_Layer = itmp;
break;
......@@ -1005,7 +1005,7 @@ void WinEDA_PcbFrame::SwitchLayer( wxDC* DC, int layer )
// Copper layers cannot be selected unconditionally; how many
// of those layers are currently enabled needs to be checked.
if( (layer >= COPPER_LAYER_N) && (layer <= CMP_N) )
if( (layer >= FIRST_COPPER_LAYER) && (layer <= LAST_COPPER_LAYER) )
{
// If only one copper layer is enabled, the only such layer
// that can be selected to is the "Copper" layer (so the
......
......@@ -162,7 +162,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
COTATION* Cotation;
int layer = Segment->GetLayer();
if( layer <= CMP_N )
if( layer <= LAST_COPPER_LAYER )
{
DisplayError( this, _( "Copper layer global delete not allowed!" ), 20 );
return;
......
......@@ -202,12 +202,12 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
case HK_SWITCH_LAYER_TO_PREVIOUS:
ll = GetScreen()->m_Active_Layer;
if( (ll <= COPPER_LAYER_N) || (ll > CMP_N) )
if( (ll <= FIRST_COPPER_LAYER) || (ll > LAST_COPPER_LAYER) )
break;
if( m_Pcb->m_BoardSettings->m_CopperLayerCount < 2 ) // Single layer
ll = COPPER_LAYER_N;
else if( ll == CMP_N )
ll = MAX( COPPER_LAYER_N, m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 );
else if( ll == LAST_COPPER_LAYER )
ll = MAX( FIRST_COPPER_LAYER, m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 );
else
ll--;
SwitchLayer( DC, ll );
......@@ -215,12 +215,12 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
case HK_SWITCH_LAYER_TO_NEXT:
ll = GetScreen()->m_Active_Layer;
if( (ll < COPPER_LAYER_N) || (ll >= CMP_N) )
if( (ll < FIRST_COPPER_LAYER) || (ll >= LAST_COPPER_LAYER) )
break;
if( m_Pcb->m_BoardSettings->m_CopperLayerCount < 2 ) // Single layer
ll = COPPER_LAYER_N;
else if( ll >= m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 )
ll = CMP_N;
ll = LAST_COPPER_LAYER;
else
ll++;
SwitchLayer( DC, ll );
......@@ -299,7 +299,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
break;
case HK_BACK_SPACE:
if( m_ID_current_state == ID_TRACK_BUTT && GetScreen()->m_Active_Layer <= CMP_N )
if( m_ID_current_state == ID_TRACK_BUTT && GetScreen()->m_Active_Layer <= LAST_COPPER_LAYER )
{
if( ItemFree )
{
......@@ -570,7 +570,7 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct )
switch( m_ID_current_state )
{
case ID_TRACK_BUTT:
if( GetScreen()->m_Active_Layer > CMP_N )
if( GetScreen()->m_Active_Layer > LAST_COPPER_LAYER )
return FALSE;
if( ItemFree )
{
......
......@@ -163,9 +163,9 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
if( m_ID_current_state == ID_PCB_ARC_BUTT )
shape = S_ARC;
if( GetScreen()->m_Active_Layer <= CMP_N )
if( GetScreen()->m_Active_Layer <= LAST_COPPER_LAYER )
{
DisplayError( this, _( "Graphic not autorized on Copper layers" ) );
DisplayError( this, _( "Graphic not authorized on Copper layers" ) );
break;
}
if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
......@@ -186,7 +186,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
}
case ID_TRACK_BUTT:
if( GetScreen()->m_Active_Layer > CMP_N )
if( GetScreen()->m_Active_Layer > LAST_COPPER_LAYER )
{
DisplayError( this, _( "Tracks on Copper layers only " ) );
break;
......@@ -262,9 +262,9 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
break;
case ID_PCB_COTATION_BUTT:
if( GetScreen()->m_Active_Layer <= CMP_N )
if( GetScreen()->m_Active_Layer <= LAST_COPPER_LAYER )
{
DisplayError( this, _( "Cotation not autorized on Copper layers" ) );
DisplayError( this, _( "Cotation not authorized on Copper layers" ) );
break;
}
if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
......@@ -426,4 +426,3 @@ void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
break;
}
}
/****************************************/
/**** Routine de trace GERBER RS274X ****/
/****************************************/
/****************************************/
/**** Routine de trace GERBER RS274X ****/
/****************************************/
#include "fctsys.h"
......@@ -15,13 +15,13 @@
/* Variables locales : */
static int s_Last_D_code ;
static float Gerb_scale_plot; /*Coeff de conversion d'unites des traces */
static int scale_spot_mini; /* Ouverture mini (pour remplissages) */
static D_CODE * s_DCodeList; /* Pointeur sur la zone de stockage des D_CODES */
static int s_Last_D_code;
static float Gerb_scale_plot; // Coeff de conversion d'unites des traces
static int scale_spot_mini; // Ouverture mini (pour remplissages)
static D_CODE * s_DCodeList; // Pointeur sur la zone de stockage des D_CODES
wxString GerberFullFileName;
static double scale_x , scale_y ; /* echelles de convertion en X et Y (compte tenu
des unites relatives du PCB et des traceurs*/
static double scale_x, scale_y; // echelles de convertion en X et Y (compte tenu
// des unites relatives du PCB et des traceurs
static bool ShowDcodeError = TRUE;
/* Routines Locales */
......@@ -29,22 +29,23 @@ static bool ShowDcodeError = TRUE;
static void Init_Trace_GERBER(WinEDA_BasePcbFrame * frame, FILE * gerbfile);
static void Init_ApertureList();
static void Fin_Trace_GERBER(WinEDA_BasePcbFrame * frame, FILE * gerbfile);
static void Plot_1_CIRCLE_pad_GERBER(wxPoint pos,int diametre) ;
static void trace_1_pastille_OVALE_GERBER(wxPoint pos, wxSize size,int orient);
static void Plot_1_CIRCLE_pad_GERBER(wxPoint pos, int diametre);
static void trace_1_pastille_OVALE_GERBER(wxPoint pos, wxSize size, int orient);
static void PlotRectangularPad_GERBER(wxPoint pos, wxSize size, int orient);
static D_CODE * get_D_code(int dx,int dy, int type, int drill ) ;
static void trace_1_pad_TRAPEZE_GERBER(wxPoint pos, wxSize size,wxSize delta,
int orient,int modetrace);
static D_CODE * get_D_code(int dx, int dy, int type, int drill);
static void trace_1_pad_TRAPEZE_GERBER(wxPoint pos, wxSize size, wxSize delta,
int orient, int modetrace);
/********************************************************************************/
void WinEDA_BasePcbFrame::Genere_GERBER(const wxString & FullFileName, int Layer,
bool PlotOriginIsAuxAxis)
/********************************************************************************/
/* Genere les divers fichiers de trace:
Pour chaque couche 1 fichier xxxc.PHO au format RS274X
*/
* Pour chaque couche 1 fichier xxxc.PHO au format RS274X
*/
{
int tracevia = 1;
......@@ -52,25 +53,25 @@ int tracevia = 1;
GerberFullFileName = FullFileName;
g_PlotOrient = 0;
if (Plot_Set_MIROIR) g_PlotOrient |= PLOT_MIROIR;
if( Plot_Set_MIROIR )
g_PlotOrient |= PLOT_MIROIR;
/* Calcul des echelles de conversion */
Gerb_scale_plot = 1.0; /* pour unites gerber en 0,1 Mils, format 3.4 */
scale_spot_mini = (int)(spot_mini * 10 * Gerb_scale_plot);
scale_spot_mini = (int)(10 * spot_mini * Gerb_scale_plot);
scale_x = Scale_X * Gerb_scale_plot;
scale_y = Scale_Y * Gerb_scale_plot;
g_PlotOffset.x = 0;
g_PlotOffset.y = 0;
if ( PlotOriginIsAuxAxis )
{
if( PlotOriginIsAuxAxis )
g_PlotOffset = m_Auxiliary_Axis_Position;
}
dest = wxFopen(FullFileName, wxT("wt"));
if (dest == NULL)
dest = wxFopen( FullFileName, wxT("wt") );
if( dest == NULL )
{
wxString msg = _("unable to create file ") + FullFileName;
DisplayError(this, msg); return ;
DisplayError(this, msg);
return;
}
setlocale(LC_NUMERIC, "C");
......@@ -80,11 +81,11 @@ int tracevia = 1;
/* Clear the memory used for handle the D_CODE (aperture) list */
Init_ApertureList();
Affiche_1_Parametre(this, 0, _("File"),FullFileName,CYAN) ;
Affiche_1_Parametre(this, 0, _("File"), FullFileName, CYAN);
Init_Trace_GERBER(this, dest) ;
Init_Trace_GERBER(this, dest);
nb_plot_erreur = 0 ;
nb_plot_erreur = 0;
int layer_mask = g_TabOneLayerMask[Layer];
// Specify that the contents of the "Edges Pcb" layer are also to be
......@@ -92,36 +93,38 @@ int tracevia = 1;
if( ! Exclude_Edges_Pcb )
layer_mask |= EDGE_LAYER;
switch(Layer)
{
case COPPER_LAYER_N :
case LAYER_N_2 :
case LAYER_N_3 :
case LAYER_N_4 :
case LAYER_N_5 :
case LAYER_N_6 :
case LAYER_N_7 :
case LAYER_N_8 :
case LAYER_N_9 :
case LAYER_N_10 :
switch( Layer )
{
case FIRST_COPPER_LAYER:
case LAYER_N_2:
case LAYER_N_3:
case LAYER_N_4:
case LAYER_N_5:
case LAYER_N_6:
case LAYER_N_7:
case LAYER_N_8:
case LAYER_N_9:
case LAYER_N_10:
case LAYER_N_11:
case LAYER_N_12:
case LAYER_N_13 :
case LAYER_N_14 :
case LAYER_N_15 :
case CMP_N :
case LAYER_N_13:
case LAYER_N_14:
case LAYER_N_15:
case LAST_COPPER_LAYER:
Plot_Layer_GERBER(dest, layer_mask, 0, 1);
break;
case SOLDERMASK_N_CU :
case SOLDERMASK_N_CMP : /* Trace du vernis epargne */
if ( g_DrawViaOnMaskLayer ) tracevia = 1;
else tracevia = 0;
case SOLDERMASK_N_CU:
case SOLDERMASK_N_CMP: /* Trace du vernis epargne */
if( g_DrawViaOnMaskLayer )
tracevia = 1;
else
tracevia = 0;
Plot_Layer_GERBER(dest, layer_mask, g_DesignSettings.m_MaskMargin, tracevia);
break;
case SOLDERPASTE_N_CU :
case SOLDERPASTE_N_CMP : /* Trace du masque de pate de soudure */
case SOLDERPASTE_N_CU:
case SOLDERPASTE_N_CMP: /* Trace du masque de pate de soudure */
Plot_Layer_GERBER(dest, layer_mask, 0, 0);
break;
......@@ -130,8 +133,8 @@ int tracevia = 1;
break;
}
Fin_Trace_GERBER(this, dest) ;
setlocale(LC_NUMERIC, "");
Fin_Trace_GERBER( this, dest );
setlocale( LC_NUMERIC, "" );
}
......@@ -139,8 +142,9 @@ int tracevia = 1;
void WinEDA_BasePcbFrame::Plot_Layer_GERBER(FILE * File,int masque_layer,
int garde, int tracevia)
/***********************************************************************/
/* Trace en format GERBER. d'une couche cuivre ou masque
*/
*/
{
wxPoint pos;
wxSize size;
......@@ -150,7 +154,7 @@ TRACK * track ;
EDA_BaseStruct * PtStruct;
wxString msg;
// (Following command has been superceded by new command on lines 92 and 93.)
// (Following command has been superceded by new command on lines 93 and 94.)
// masque_layer |= EDGE_LAYER; /* Les elements de la couche EDGE sont tj traces */
/* trace des elements type Drawings Pcb : */
......@@ -183,16 +187,16 @@ wxString msg;
break;
default:
DisplayError(this, wxT("Type Draw non gere"));
DisplayError( this, wxT("Type Draw non gere") );
break;
}
}
/* Trace des Elements des modules autres que pads */
nb_items = 0 ;
Affiche_1_Parametre(this, 38, wxT("DrawMod"), wxEmptyString,GREEN) ;
nb_items = 0;
Affiche_1_Parametre(this, 38, wxT("DrawMod"), wxEmptyString, GREEN);
Module = m_Pcb->m_Modules;
for( ; Module != NULL ;Module = (MODULE *)Module->Pnext )
for( ; Module != NULL; Module = (MODULE *)Module->Pnext )
{
PtStruct = Module->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
......@@ -204,125 +208,144 @@ wxString msg;
Plot_1_EdgeModule(PLOT_FORMAT_GERBER, (EDGE_MODULE*) PtStruct);
break;
default: break;
default:
break;
}
}
}
/* Trace des Elements des modules : Pastilles */
nb_items = 0 ;
Affiche_1_Parametre(this, 48, wxT("Pads"),wxEmptyString,GREEN) ;
nb_items = 0;
Affiche_1_Parametre(this, 48, wxT("Pads"), wxEmptyString, GREEN);
Module = m_Pcb->m_Modules;
for( ; Module != NULL ;Module = (MODULE *)Module->Pnext )
for( ; Module != NULL; Module = (MODULE *)Module->Pnext )
{
PtPad = (D_PAD*) Module->m_Pads;
for ( ; PtPad != NULL ; PtPad = (D_PAD*)PtPad->Pnext )
for( ; PtPad != NULL; PtPad = (D_PAD*)PtPad->Pnext )
{
wxPoint shape_pos;
if( (PtPad->m_Masque_Layer & masque_layer) == 0)
continue ;
if( (PtPad->m_Masque_Layer & masque_layer) == 0 )
continue;
shape_pos = PtPad->ReturnShapePos();
pos = shape_pos;
size.x = PtPad->m_Size.x + (garde * 2) ;
size.y = PtPad->m_Size.y + (garde * 2) ;
size.x = PtPad->m_Size.x + 2 * garde;
size.y = PtPad->m_Size.y + 2 * garde;
/* Don't draw a null size item : */
if ( (size.x == 0) || (size.y == 0) ) continue;
if( size.x <= 0 || size.y <= 0 )
continue;
nb_items++ ;
nb_items++;
switch (PtPad->m_PadShape)
switch( PtPad->m_PadShape )
{
case CIRCLE :
Plot_1_CIRCLE_pad_GERBER(pos,size.x) ;
break ;
case CIRCLE:
Plot_1_CIRCLE_pad_GERBER(pos, size.x);
break;
case OVALE :
{
trace_1_pastille_OVALE_GERBER(pos, size,PtPad->m_Orient);
break ;
}
case OVALE:
// Check whether the pad really has a circular shape instead
if( size.x == size.y )
Plot_1_CIRCLE_pad_GERBER(pos, size.x);
else
trace_1_pastille_OVALE_GERBER(pos, size, PtPad->m_Orient);
break;
case TRAPEZE :
case TRAPEZE:
{
wxSize delta = PtPad->m_DeltaSize;
trace_1_pad_TRAPEZE_GERBER(pos,size,
delta, PtPad->m_Orient, FILLED) ;
break ;
trace_1_pad_TRAPEZE_GERBER(pos, size,
delta, PtPad->m_Orient, FILLED);
}
break;
case RECT:
default:
PlotRectangularPad_GERBER(pos,size, PtPad->m_Orient) ;
break ;
PlotRectangularPad_GERBER(pos, size, PtPad->m_Orient);
break;
}
msg.Printf( wxT("%d"),nb_items) ;
Affiche_1_Parametre(this, 48,wxEmptyString, msg,GREEN) ;
msg.Printf( wxT("%d"), nb_items );
Affiche_1_Parametre(this, 48, wxEmptyString, msg, GREEN);
}
}
/* trace des VIAS : */
if(tracevia)
if( tracevia )
{
nb_items = 0 ;
Affiche_1_Parametre(this, 56, wxT("Vias"), wxEmptyString,RED) ;
for( track = m_Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext)
nb_items = 0;
Affiche_1_Parametre(this, 56, wxT("Vias"), wxEmptyString, RED);
for( track = m_Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
{
if( track->Type() != TYPEVIA ) continue;
if( track->Type() != TYPEVIA )
continue;
SEGVIA * Via = (SEGVIA *) track;
/* vias not plotted if not on selected layer, but if layer
== SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn ,
if they are on a external copper layer
*/
// vias not plotted if not on selected layer, but if layer
// == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn,
// if they are on a external copper layer
int via_mask_layer = Via->ReturnMaskLayer();
if ( (via_mask_layer & CUIVRE_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CU;
if ( (via_mask_layer & CMP_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CMP;
if( (via_mask_layer & masque_layer) == 0 ) continue;
if( via_mask_layer & CUIVRE_LAYER )
via_mask_layer |= SOLDERMASK_LAYER_CU;
if( via_mask_layer & CMP_LAYER )
via_mask_layer |= SOLDERMASK_LAYER_CMP;
if( ( via_mask_layer & masque_layer) == 0 )
continue;
pos = Via->m_Start;
size.x = size.y = Via->m_Width + (garde * 2);
Plot_1_CIRCLE_pad_GERBER(pos,size.x) ;
nb_items++ ; msg.Printf( wxT("%d"),nb_items) ;
Affiche_1_Parametre(this, 56,wxEmptyString, msg,RED) ;
size.x = size.y = Via->m_Width + 2 * garde;
/* Don't draw a null size item : */
if( size.x <= 0 )
continue;
Plot_1_CIRCLE_pad_GERBER(pos, size.x);
nb_items++;
msg.Printf( wxT("%d"), nb_items );
Affiche_1_Parametre(this, 56, wxEmptyString, msg, RED);
}
}
/* trace des pistes : */
nb_items = 0 ;
Affiche_1_Parametre(this, 64, wxT("Tracks"),wxEmptyString,YELLOW) ;
nb_items = 0;
Affiche_1_Parametre(this, 64, wxT("Tracks"), wxEmptyString, YELLOW);
for( track = m_Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext)
for( track = m_Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
{
wxPoint end;
if ( track->Type() == TYPEVIA ) continue ;
if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 ) continue;
if( track->Type() == TYPEVIA )
continue;
if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 )
continue;
size.x = size.y = track->m_Width;
pos = track->m_Start; end = track->m_End;
pos = track->m_Start;
end = track->m_End;
PlotGERBERLine(pos,end, size.x) ;
PlotGERBERLine(pos, end, size.x);
nb_items++ ; msg.Printf( wxT("%d"),nb_items) ;
Affiche_1_Parametre(this, 64, wxEmptyString, msg,YELLOW) ;
nb_items++;
msg.Printf( wxT("%d"), nb_items );
Affiche_1_Parametre(this, 64, wxEmptyString, msg, YELLOW);
}
/* trace des zones: */
nb_items = 0 ;
if ( m_Pcb->m_Zone ) Affiche_1_Parametre(this, 72, wxT("Zones "),wxEmptyString,YELLOW) ;
nb_items = 0;
if( m_Pcb->m_Zone )
Affiche_1_Parametre(this, 72, wxT("Zones "), wxEmptyString, YELLOW);
for( track = m_Pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext)
for( track = m_Pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext )
{
wxPoint end;
if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 ) continue;
if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 )
continue;
size.x = size.y = track->m_Width;
pos = track->m_Start; end = track->m_End;
pos = track->m_Start;
end = track->m_End;
PlotGERBERLine(pos,end, size.x) ;
PlotGERBERLine(pos, end, size.x);
nb_items++ ; msg.Printf( wxT("%d"),nb_items) ;
Affiche_1_Parametre(this, 72, wxEmptyString,msg,YELLOW) ;
nb_items++;
msg.Printf( wxT("%d"), nb_items );
Affiche_1_Parametre(this, 72, wxEmptyString, msg, YELLOW);
}
}
......@@ -330,53 +353,57 @@ wxString msg;
/**********************************************************************/
void trace_1_pastille_OVALE_GERBER(wxPoint pos, wxSize size, int orient)
/**********************************************************************/
/* Trace 1 pastille OVALE en position pos_X,Y:
dimensions dx,dy,
orientation orient
Pour une orientation verticale ou horizontale, la forme est flashee
Pour une orientation quelconque la forme est tracee comme un segment
*/
* dimensions dx, dy,
* orientation orient
* Pour une orientation verticale ou horizontale, la forme est flashee
* Pour une orientation quelconque la forme est tracee comme un segment
*/
{
D_CODE * dcode_ptr;
int x0, y0, x1, y1, delta;
if( (orient == 900) || (orient == 2700)) /* orient tournee de 90 deg */
{
EXCHG(size.x,size.y);
}
if( orient == 900 || orient == 2700 ) /* orient tournee de 90 deg */
EXCHG(size.x, size.y);
/* Trace de la forme flashee */
if( (orient == 0) || (orient == 900) ||
(orient == 1800) || (orient == 2700) )
if( orient == 0 || orient == 900 || orient == 1800 || orient == 2700 )
{
UserToDeviceCoordinate(pos) ;
UserToDeviceCoordinate(pos);
UserToDeviceSize(size);
dcode_ptr = get_D_code(size.x,size.y,GERB_OVALE,0) ;
if (dcode_ptr->m_NumDcode != s_Last_D_code )
dcode_ptr = get_D_code(size.x, size.y, GERB_OVALE, 0);
if( dcode_ptr->m_NumDcode != s_Last_D_code )
{
sprintf(cbuf,"G54D%d*\n",dcode_ptr->m_NumDcode) ;
fputs(cbuf,dest) ;
sprintf(cbuf, "G54D%d*\n", dcode_ptr->m_NumDcode);
fputs(cbuf, dest);
s_Last_D_code = dcode_ptr->m_NumDcode;
}
sprintf(cbuf,"X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf,dest) ;
sprintf(cbuf, "X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf, dest);
}
else /* Forme tracee comme un segment */
{
if(size.x > size.y )
if( size.x > size.y )
{
EXCHG(size.x,size.y); orient += 900;
EXCHG(size.x, size.y);
if( orient < 2700 )
orient += 900;
else
orient -= 2700;
}
/* la pastille est ramenee a une pastille ovale avec dy > dx */
delta = size.y - size.x;
x0 = 0; y0 = -delta / 2;
x1 = 0; y1 = delta / 2;
RotatePoint(&x0,&y0, orient);
RotatePoint(&x1,&y1, orient);
x0 = 0;
y0 = -delta / 2;
x1 = 0;
y1 = delta / 2;
RotatePoint(&x0, &y0, orient);
RotatePoint(&x1, &y1, orient);
PlotGERBERLine( wxPoint(pos.x + x0, pos.y + y0),
wxPoint(pos.x + x1, pos.y + y1), size.x);
wxPoint(pos.x + x1, pos.y + y1), size.x );
}
}
......@@ -384,8 +411,9 @@ int x0, y0, x1, y1, delta;
/******************************************************************/
void Plot_1_CIRCLE_pad_GERBER(wxPoint pos,int diametre)
/******************************************************************/
/* Plot a circulat pad or via at the user position pos
*/
/* Plot a circular pad or via at the user position pos
*/
{
D_CODE * dcode_ptr;
wxSize size(diametre, diametre);
......@@ -393,55 +421,58 @@ wxSize size(diametre, diametre);
UserToDeviceCoordinate(pos);
UserToDeviceSize(size);
dcode_ptr = get_D_code(size.x,size.x,GERB_CIRCLE,0) ;
if (dcode_ptr->m_NumDcode != s_Last_D_code )
dcode_ptr = get_D_code(size.x, size.x, GERB_CIRCLE, 0);
if( dcode_ptr->m_NumDcode != s_Last_D_code )
{
sprintf(cbuf,"G54D%d*\n", dcode_ptr->m_NumDcode) ;
fputs(cbuf,dest) ;
sprintf(cbuf, "G54D%d*\n", dcode_ptr->m_NumDcode);
fputs(cbuf, dest);
s_Last_D_code = dcode_ptr->m_NumDcode;
}
sprintf(cbuf,"X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf,dest) ;
sprintf(cbuf, "X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf, dest);
}
/**************************************************************************/
void PlotRectangularPad_GERBER(wxPoint pos, wxSize size, int orient)
/**************************************************************************/
/*
Trace 1 pad rectangulaire d'orientation quelconque
donne par son centre, ses dimensions, et son orientation
Pour une orientation verticale ou horizontale, la forme est flashee
Pour une orientation quelconque la forme est tracee par 4 segments
de largeur 1/2 largeur pad
*/
/* Trace 1 pad rectangulaire d'orientation quelconque
* donne par son centre, ses dimensions, et son orientation
* Pour une orientation verticale ou horizontale, la forme est flashee
* Pour une orientation quelconque la forme est tracee par 4 segments
* de largeur 1/2 largeur pad
*/
{
D_CODE * dcode_ptr;
/* Trace de la forme flashee */
switch (orient)
{
case 900 :
case 2700 : /* la rotation de 90 ou 270 degres revient a permutter des dimensions */
EXCHG(size.x,size.y);
case 1800 :
case 0 :
UserToDeviceCoordinate(pos) ;
switch( orient )
{
case 900:
case 2700: /* la rotation de 90 ou 270 degres revient a permutter des dimensions */
EXCHG(size.x, size.y);
// Pass through
case 0:
case 1800:
UserToDeviceCoordinate(pos);
UserToDeviceSize(size);
dcode_ptr = get_D_code(size.x,size.y,GERB_RECT,0) ;
if (dcode_ptr->m_NumDcode != s_Last_D_code )
dcode_ptr = get_D_code(size.x, size.y, GERB_RECT, 0);
if( dcode_ptr->m_NumDcode != s_Last_D_code )
{
sprintf(cbuf,"G54D%d*\n", dcode_ptr->m_NumDcode) ;
fputs(cbuf,dest) ;
sprintf(cbuf, "G54D%d*\n", dcode_ptr->m_NumDcode);
fputs(cbuf, dest);
s_Last_D_code = dcode_ptr->m_NumDcode;
}
sprintf(cbuf,"X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf,dest) ;
sprintf(cbuf, "X%5.5dY%5.5dD03*\n", pos.x, pos.y);
fputs(cbuf, dest);
break;
default: /* Forme tracee par remplissage */
trace_1_pad_TRAPEZE_GERBER(pos, size, wxSize(0, 0), orient,FILLED);
trace_1_pad_TRAPEZE_GERBER(pos, size, wxSize(0, 0), orient, FILLED);
break;
}
}
......@@ -451,20 +482,22 @@ D_CODE * dcode_ptr;
void trace_1_contour_GERBER(wxPoint pos, wxSize size, wxSize delta,
int penwidth, int orient)
/*****************************************************************/
/*
Trace 1 contour rectangulaire ou trapezoidal d'orientation quelconque
donne par son centre,
ses dimensions ,
ses variations ,
l'epaisseur du trait,
et son orientation orient
*/
/* Trace 1 contour rectangulaire ou trapezoidal d'orientation quelconque
* donne par son centre,
* ses dimensions ,
* ses variations ,
* l'epaisseur du trait,
* et son orientation orient
*/
{
int ii;
wxPoint coord[4];
size.x /= 2; size.y /= 2 ;
delta.x /= 2; delta.y /= 2 ; /* demi dim dx et dy */
size.x /= 2;
size.y /= 2;
delta.x /= 2;
delta.y /= 2; /* demi dim dx et dy */
coord[0].x = pos.x - size.x - delta.y;
coord[0].y = pos.y + size.y + delta.x;
......@@ -478,16 +511,15 @@ wxPoint coord[4];
coord[3].x = pos.x + size.x + delta.y;
coord[3].y = pos.y + size.y - delta.x;
for (ii = 0; ii < 4; ii++)
for( ii = 0; ii < 4; ii++ )
{
RotatePoint(&coord[ii].x, &coord[ii].y, pos.x, pos.y, orient);
}
PlotGERBERLine( coord[0], coord[1], penwidth);
PlotGERBERLine( coord[1], coord[2], penwidth);
PlotGERBERLine( coord[2], coord[3], penwidth);
PlotGERBERLine( coord[3], coord[0], penwidth);
PlotGERBERLine( coord[0], coord[1], penwidth );
PlotGERBERLine( coord[1], coord[2], penwidth );
PlotGERBERLine( coord[2], coord[3], penwidth );
PlotGERBERLine( coord[3], coord[0], penwidth );
}
......@@ -496,69 +528,74 @@ void trace_1_pad_TRAPEZE_GERBER(wxPoint pos, wxSize size,wxSize delta,
int orient,int modetrace)
/*******************************************************************/
/*
Trace 1 pad trapezoidal donne par :
son centre pos.x,pos.y
ses dimensions size.x et size.y
les variations delta.x et delta.y ( 1 des deux au moins doit etre nulle)
son orientation orient en 0.1 degres
le mode de trace (FILLED, SKETCH, FILAIRE)
Le trace n'est fait que pour un trapeze, c.a.d que delta.x ou delta.y
= 0.
les notation des sommets sont ( vis a vis de la table tracante )
" 0 ------------- 3 "
" . . "
" . O . "
" . . "
" 1 ---- 2 "
exemple de Disposition pour delta.y > 0, delta.x = 0
" 1 ---- 2 "
" . . "
" . O . "
" . . "
" 0 ------------- 3 "
exemple de Disposition pour delta.y = 0, delta.x > 0
" 0 "
" . . "
" . . "
" . 3 "
" . . "
" . O . "
" . . "
" . 2 "
" . . "
" . . "
" 1 "
*/
/* Trace 1 pad trapezoidal donne par :
* son centre pos.x,pos.y
* ses dimensions size.x et size.y
* les variations delta.x et delta.y ( 1 des deux au moins doit etre nulle)
* son orientation orient en 0.1 degres
* le mode de trace (FILLED, SKETCH, FILAIRE)
*
* Le trace n'est fait que pour un trapeze, c.a.d que delta.x ou delta.y
* = 0.
*
* les notation des sommets sont ( vis a vis de la table tracante )
*
* " 0 ------------- 3 "
* " . . "
* " . O . "
* " . . "
* " 1 ---- 2 "
*
*
* exemple de Disposition pour delta.y > 0, delta.x = 0
* " 1 ---- 2 "
* " . . "
* " . O . "
* " . . "
* " 0 ------------- 3 "
*
*
* exemple de Disposition pour delta.y = 0, delta.x > 0
* " 0 "
* " . . "
* " . . "
* " . 3 "
* " . . "
* " . O . "
* " . . "
* " . 2 "
* " . . "
* " . . "
* " 1 "
*/
{
int ii , jj;
int dx,dy;
int ii, jj;
int dx, dy;
wxPoint polygone[4]; /* coord sommets */
int coord[8];
int ddx, ddy ;
int ddx, ddy;
/* calcul des dimensions optimales du spot choisi = 1/4 plus petite dim */
dx = size.x - abs(delta.y);
dy = size.y - abs(delta.x);
dx = size.x / 2; dy = size.y / 2 ;
ddx = delta.x / 2; ddy = delta.y / 2 ;
dx = size.x / 2;
dy = size.y / 2;
ddx = delta.x / 2;
ddy = delta.y / 2;
polygone[0].x = - dx - ddy; polygone[0].y = + dy + ddx;
polygone[1].x = - dx + ddy; polygone[1].y = - dy - ddx;
polygone[2].x = + dx - ddy; polygone[2].y = - dy + ddx;
polygone[3].x = + dx + ddy; polygone[3].y = + dy - ddx;
polygone[0].x = - dx - ddy;
polygone[0].y = + dy + ddx;
polygone[1].x = - dx + ddy;
polygone[1].y = - dy - ddx;
polygone[2].x = + dx - ddy;
polygone[2].y = - dy + ddx;
polygone[3].x = + dx + ddy;
polygone[3].y = + dy - ddx;
/* Dessin du polygone et Remplissage eventuel de l'interieur */
for (ii = 0, jj = 0; ii < 4; ii++)
for( ii = 0, jj = 0; ii < 4; ii++ )
{
RotatePoint(&polygone[ii].x, &polygone[ii].y, orient);
coord[jj] = polygone[ii].x += pos.x;
......@@ -567,12 +604,12 @@ int ddx, ddy ;
jj++;
}
if(modetrace != FILLED )
if( modetrace != FILLED )
{
PlotGERBERLine( polygone[0], polygone[1], scale_spot_mini);
PlotGERBERLine( polygone[1], polygone[2], scale_spot_mini);
PlotGERBERLine( polygone[2], polygone[3], scale_spot_mini);
PlotGERBERLine( polygone[3], polygone[0], scale_spot_mini);
PlotGERBERLine( polygone[0], polygone[1], scale_spot_mini );
PlotGERBERLine( polygone[1], polygone[2], scale_spot_mini );
PlotGERBERLine( polygone[2], polygone[3], scale_spot_mini );
PlotGERBERLine( polygone[3], polygone[0], scale_spot_mini );
}
else
......@@ -583,52 +620,63 @@ int ddx, ddy ;
/**********************************************************/
void PlotGERBERLine(wxPoint start, wxPoint end, int large)
/**********************************************************/
/* Trace 1 segment de piste :
*/
*/
{
D_CODE * dcode_ptr;
UserToDeviceCoordinate(start);
UserToDeviceCoordinate(end);
dcode_ptr = get_D_code(large,large,GERB_LINE,0) ;
if (dcode_ptr->m_NumDcode != s_Last_D_code )
dcode_ptr = get_D_code(large, large, GERB_LINE, 0);
if(dcode_ptr->m_NumDcode != s_Last_D_code )
{
sprintf(cbuf,"G54D%d*\n", dcode_ptr->m_NumDcode) ;
fputs(cbuf,dest) ;
sprintf(cbuf, "G54D%d*\n", dcode_ptr->m_NumDcode);
fputs(cbuf, dest);
s_Last_D_code = dcode_ptr->m_NumDcode;
}
sprintf(cbuf,"X%5.5dY%5.5dD02*\n",start.x,start.y) ; fputs(cbuf,dest) ;
sprintf(cbuf,"X%5.5dY%5.5dD01*\n",end.x,end.y) ; fputs(cbuf,dest) ;
sprintf(cbuf, "X%5.5dY%5.5dD02*\n", start.x, start.y);
fputs(cbuf, dest);
sprintf(cbuf, "X%5.5dY%5.5dD01*\n", end.x, end.y);
fputs(cbuf, dest);
}
/********************************************************************/
void PlotCircle_GERBER( wxPoint centre, int rayon, int epaisseur)
void PlotCircle_GERBER( wxPoint centre, int rayon, int epaisseur )
/********************************************************************/
/* routine de trace de 1 cercle de centre centre par approximation de segments
*/
*/
{
int ii ;
int ii;
int ox, oy, fx, fy;
int delta; /* increment (en 0.1 degres) angulaire pour trace de cercles */
delta = 120; /* un cercle sera trace en 3600/delta segments */
/* Correction pour petits cercles par rapport a l'epaisseur du trait */
if( rayon < (epaisseur * 10) ) delta = 225; /* 16 segm pour 360 deg */
if( rayon < (epaisseur * 5) ) delta = 300; /* 12 segm pour 360 deg */
if( rayon < (epaisseur * 2) ) delta = 600; /* 6 segm pour 360 deg */
if( rayon < (epaisseur * 10) )
delta = 225; /* 16 segm pour 360 deg */
if( rayon < (epaisseur * 5) )
delta = 300; /* 12 segm pour 360 deg */
if( rayon < (epaisseur * 2) )
delta = 600; /* 6 segm pour 360 deg */
ox = centre.x + rayon; oy = centre.y;
for (ii = delta ; ii < 3600 ; ii += delta )
ox = centre.x + rayon;
oy = centre.y;
for( ii = delta; ii < 3600; ii += delta )
{
fx = centre.x + (int)(rayon * fcosinus[ii]);
fy = centre.y + (int)(rayon * fsinus[ii]);
PlotGERBERLine(wxPoint(ox,oy), wxPoint(fx,fy), epaisseur) ;
ox = fx; oy = fy;
PlotGERBERLine(wxPoint(ox, oy), wxPoint(fx, fy), epaisseur);
ox = fx;
oy = fy;
}
fx = centre.x + rayon; fy = centre.y;
PlotGERBERLine(wxPoint(ox,oy), wxPoint(fx,fy), epaisseur) ;
fx = centre.x + rayon;
fy = centre.y;
PlotGERBERLine(wxPoint(ox ,oy), wxPoint(fx, fy), epaisseur);
}
......@@ -640,16 +688,20 @@ int ii;
wxPoint pos;
fputs("G36*\n", dest);
pos.x = *coord; coord++;
pos.y = *coord; coord++;
pos.x = *coord;
coord++;
pos.y = *coord;
coord++;
UserToDeviceCoordinate(pos);
fprintf(dest, "X%5.5dY%5.5dD02*\n", pos.x, pos.y );
for ( ii = 1; ii < nb_segm; ii++ )
fprintf( dest, "X%5.5dY%5.5dD02*\n", pos.x, pos.y );
for( ii = 1; ii < nb_segm; ii++ )
{
pos.x = *coord; coord++;
pos.y = *coord; coord++;
pos.x = *coord;
coord++;
pos.y = *coord;
coord++;
UserToDeviceCoordinate(pos);
fprintf(dest, "X%5.5dY%5.5dD01*\n", pos.x, pos.y );
fprintf( dest, "X%5.5dY%5.5dD01*\n", pos.x, pos.y );
}
fputs("G37*\n", dest);
......@@ -657,12 +709,12 @@ wxPoint pos;
/*******************************************************/
D_CODE * get_D_code(int dx,int dy, int type, int drill )
D_CODE * get_D_code( int dx, int dy, int type, int drill )
/*******************************************************/
/*
Fonction Recherchant et Creant eventuellement la description
du D_CODE du type et dimensions demandees
*/
/* Fonction Recherchant et Creant eventuellement la description
* du D_CODE du type et dimensions demandees
*/
{
D_CODE * ptr_tool, * last_dcode_ptr;
int num_new_D_code = FIRST_DCODE_VALUE;
......@@ -670,32 +722,33 @@ int num_new_D_code = FIRST_DCODE_VALUE;
ptr_tool = last_dcode_ptr = s_DCodeList;
while(ptr_tool && ptr_tool->m_Type >= 0 )
while( ptr_tool && ptr_tool->m_Type >= 0 )
{
if( ( ptr_tool->m_Size.x == dx ) &&
( ptr_tool->m_Size.y == dy ) &&
( ptr_tool->m_Type == type ) )
return(ptr_tool); /* D_code deja existant */
last_dcode_ptr = ptr_tool;
ptr_tool = ptr_tool->m_Pnext ;
num_new_D_code++ ;
ptr_tool = ptr_tool->m_Pnext;
num_new_D_code++;
}
/* At this point, the requested D_CODE does not exist: It will be created */
if ( ptr_tool == NULL ) /* We must create a new data */
if( ptr_tool == NULL ) /* We must create a new data */
{
ptr_tool = new D_CODE();
ptr_tool->m_NumDcode = num_new_D_code;
if ( last_dcode_ptr )
if( last_dcode_ptr )
{
ptr_tool->m_Pback = last_dcode_ptr;
last_dcode_ptr->m_Pnext = ptr_tool;
}
else s_DCodeList = ptr_tool;
else
s_DCodeList = ptr_tool;
}
ptr_tool->m_Size.x = dx ;
ptr_tool->m_Size.y = dy ;
ptr_tool->m_Type = type ;
ptr_tool->m_Size.x = dx;
ptr_tool->m_Size.y = dy;
ptr_tool->m_Type = type;
return(ptr_tool);
}
......@@ -706,20 +759,20 @@ void Init_Trace_GERBER(WinEDA_BasePcbFrame * frame, FILE * gerbfile)
{
char Line[1024];
s_Last_D_code = 0 ;
s_Last_D_code = 0;
DateAndTime(Line);
wxString Title = g_Main_Title + wxT(" ") + GetBuildVersion();
fprintf(gerbfile,"G04 (Genere par %s) le %s*\n",CONV_TO_UTF8(Title), Line);
fprintf(gerbfile, "G04 (Genere par %s) le %s*\n", CONV_TO_UTF8(Title), Line);
// Specify linear interpol (G01), unit = INCH (G70), abs format (G90):
fputs("G01*\nG70*\nG90*\n", gerbfile);
fputs("%MOIN*%\n", gerbfile); // set unites = INCHES
/* Set gerber format to 3.4 */
strcpy(Line,"G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n%FSLAX34Y34*%\n") ;
strcpy(Line, "G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n%FSLAX34Y34*%\n");
fputs(Line,gerbfile);
fputs(Line, gerbfile);
fputs("G04 APERTURE LIST*\n", gerbfile);
}
......@@ -728,21 +781,24 @@ char Line[1024];
/***********************************/
static void Init_ApertureList()
/***********************************/
/* Init the memory to handle the aperture list:
the member .m_Type is used by get_D_code() to handle the end of list:
.m_Type < 0 is the first free aperture descr */
* the member .m_Type is used by get_D_code() to handle the end of list:
* .m_Type < 0 is the first free aperture descr
*/
{
D_CODE * ptr_tool;
ptr_tool = s_DCodeList;
while ( ptr_tool )
while( ptr_tool )
{
s_DCodeList->m_Type = -1;
ptr_tool = ptr_tool->m_Pnext ;
ptr_tool = ptr_tool->m_Pnext;
}
ShowDcodeError = TRUE;
}
/*****************************************************************/
void Fin_Trace_GERBER(WinEDA_BasePcbFrame * frame, FILE * gerbfile)
/*****************************************************************/
......@@ -751,22 +807,22 @@ char line[1024];
wxString TmpFileName, msg;
FILE * outfile;
fputs("M02*\n",gerbfile);
fputs("M02*\n", gerbfile);
fclose(gerbfile);
// Reouverture gerbfile pour ajout des Apertures
gerbfile = wxFopen(GerberFullFileName, wxT("rt") );
if (gerbfile == NULL)
gerbfile = wxFopen( GerberFullFileName, wxT("rt") );
if( gerbfile == NULL )
{
msg.Printf( _("unable to reopen file <%s>"),GerberFullFileName.GetData() ) ;
DisplayError(frame, msg); return ;
msg.Printf( _("unable to reopen file <%s>"), GerberFullFileName.GetData() );
DisplayError(frame, msg);
return;
}
// Ouverture tmpfile
TmpFileName = GerberFullFileName + wxT(".$$$");
outfile = wxFopen(TmpFileName, wxT("wt") );
if ( outfile == NULL )
outfile = wxFopen( TmpFileName, wxT("wt") );
if( outfile == NULL )
{
fclose(gerbfile);
DisplayError(frame, wxT("Fin_Trace_GERBER(): Can't Open tmp file"));
......@@ -775,10 +831,10 @@ FILE * outfile;
// Placement des Apertures en RS274X
rewind(gerbfile);
while ( fgets(line, 1024, gerbfile) )
while( fgets(line, 1024, gerbfile) )
{
fputs(line, outfile);
if ( strcmp(strtok(line, "\n\r"),"G04 APERTURE LIST*") == 0 )
if( strcmp(strtok(line, "\n\r"), "G04 APERTURE LIST*") == 0 )
{
frame->Gen_D_CODE_File(outfile);
fputs("G04 APERTURE END LIST*\n", outfile);
......@@ -789,16 +845,16 @@ FILE * outfile;
fclose(gerbfile);
wxRemoveFile(GerberFullFileName);
wxRenameFile(TmpFileName, GerberFullFileName);
}
/******************************************************/
int WinEDA_BasePcbFrame::Gen_D_CODE_File(FILE * penfile)
/******************************************************/
/* Genere la liste courante des D_CODES
Retourne le nombre de D_Codes utilises
Genere une sequence RS274X
* Retourne le nombre de D_Codes utilises
* Genere une sequence RS274X
*/
{
D_CODE * ptr_tool;
......@@ -807,44 +863,43 @@ int nb_dcodes = 0 ;
/* Init : */
ptr_tool = s_DCodeList;
while(ptr_tool && (ptr_tool->m_Type >= 0 ) )
while( ptr_tool && ( ptr_tool->m_Type >= 0 ) )
{
float fscale = 0.0001; // For 3.4 format
char * text;
sprintf(cbuf,"%%ADD%d", ptr_tool->m_NumDcode);
sprintf(cbuf, "%%ADD%d", ptr_tool->m_NumDcode);
text = cbuf + strlen(cbuf);
switch ( ptr_tool->m_Type )
switch( ptr_tool->m_Type )
{
case 1: // Circle (flash )
sprintf(text,"C,%f*%%\n", ptr_tool->m_Size.x * fscale);
sprintf(text, "C,%f*%%\n", ptr_tool->m_Size.x * fscale);
break;
case 2: // RECT
sprintf(text,"R,%fX%f*%%\n", ptr_tool->m_Size.x * fscale,
sprintf(text, "R,%fX%f*%%\n", ptr_tool->m_Size.x * fscale,
ptr_tool->m_Size.y * fscale);
break;
case 3: // Circle ( lines )
sprintf(text,"C,%f*%%\n", ptr_tool->m_Size.x * fscale);
sprintf(text, "C,%f*%%\n", ptr_tool->m_Size.x * fscale);
break;
case 4: // OVALE
sprintf(text,"O,%fX%f*%%\n", ptr_tool->m_Size.x * fscale,
sprintf(text, "O,%fX%f*%%\n", ptr_tool->m_Size.x * fscale,
ptr_tool->m_Size.y * fscale);
break;
default:
DisplayError(this, wxT("Gen_D_CODE_File(): Dcode Type err") );
DisplayError( this, wxT("Gen_D_CODE_File(): Dcode Type err") );
break;
}
// compensation localisation printf (float x.y gnr x,y)
to_point ( text + 2 );
to_point( text + 2 );
fputs(cbuf,penfile) ;
ptr_tool = ptr_tool->m_Pnext; nb_dcodes++ ;
fputs(cbuf, penfile);
ptr_tool = ptr_tool->m_Pnext;
nb_dcodes++;
}
return(nb_dcodes);
return( nb_dcodes );
}
......@@ -136,7 +136,7 @@ void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer )
switch( Layer )
{
case COPPER_LAYER_N:
case FIRST_COPPER_LAYER:
case LAYER_N_2:
case LAYER_N_3:
case LAYER_N_4:
......@@ -151,7 +151,7 @@ void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer )
case LAYER_N_13:
case LAYER_N_14:
case LAYER_N_15:
case CMP_N:
case LAST_COPPER_LAYER:
Plot_Layer_HPGL( dest, layer_mask, 0, 1, modetrace );
break;
......
......@@ -178,7 +178,7 @@ void WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer )
Plot_Layer_PS( dest, layer_mask, 0, 1, modetrace );
break;
case COPPER_LAYER_N:
case FIRST_COPPER_LAYER:
case LAYER_N_2:
case LAYER_N_3:
case LAYER_N_4:
......@@ -193,7 +193,7 @@ void WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer )
case LAYER_N_13:
case LAYER_N_14:
case LAYER_N_15:
case CMP_N:
case LAST_COPPER_LAYER:
Plot_Layer_PS( dest, layer_mask, 0, 1, modetrace );
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment