1
/************************************************/
2
/* drawtxt.cpp : trace des textes de composants */
3
/************************************************/
9
#include "plot_common.h"
14
#ifndef DEFAULT_SIZE_TEXT
15
#define DEFAULT_SIZE_TEXT 50
21
/* fonctions locales : */
24
/****************************************************************************/
25
void DrawGraphicText(WinEDA_DrawPanel * panel, wxDC * DC,
26
const wxPoint & Pos, int gcolor, const wxString & Text,
27
int orient, const wxSize & Size, int h_justify, int v_justify, int width)
28
/*****************************************************************************/
29
/* Draw a graphic text (like module texts)
31
Pos = text position (according to h_justify, v_justify)
32
Size = text size (size.x or size.y can be < 0 for mirrored texts)
33
orient = angle in 0.1 degree
34
mode_color = GR_OR, GR_XOR..
35
h_justify = horizontal justification (Left, center, right)
36
v_justify = vertical justification (bottom, center, top)
37
width = line width (pen width) (default = 0)
38
if width < 0 : draw segments in sketch mode, width = abs(width)
41
int ii, kk,nbchar, AsciiCode, endcar;
44
int size_h , size_v , espacement ;
45
SH_CODE f_cod , plume = 'U';
46
const SH_CODE * ptcar;
48
int ux0, uy0, dx, dy; // Coord de trace des segments de texte & variables de calcul */
49
int cX, cY; // Centre du texte
50
int ox, oy; // coord de trace du caractere courant
51
int coord[100]; // liste des coord des segments a tracer
52
bool sketch_mode = FALSE;
54
zoom = panel->GetZoom();
64
kk = 0 ; ptr = 0; /* ptr = text index */
66
/* calcul de la position du debut des textes: ox et oy */
68
if ( nbchar == 0 ) return;
70
espacement = (10 * size_h ) / 9;
71
ox = cX = Pos.x; oy = cY = Pos.y;
73
/* Si le texte est totalement hors fenetre d'affichage, termin�! */
76
int xm, ym, ll, xc, yc;
77
int textsize = ABS(espacement);
78
ll = (textsize * nbchar) / zoom;
81
x0 = panel->m_ClipBox.GetX() - ll;
82
y0 = panel->m_ClipBox.GetY() -ll ;
83
xm = panel->m_ClipBox.GetRight() + ll;
84
ym = panel->m_ClipBox.GetBottom() + ll;
85
if ( xc < x0 ) return;
86
if ( yc < y0 ) return;
87
if ( xc > xm ) return;
88
if ( yc > ym ) return;
92
/* Calcul du cadrage du texte */
93
dx = (espacement * nbchar) / 2;
94
dy = size_v / 2; /* Decalage du debut du texte / centre */
96
ux0 = uy0 = 0; /* Decalage du centre du texte / coord de ref */
98
if( (orient == 0) || (orient == 1800) ) /* Texte Horizontal */
102
case GR_TEXT_HJUSTIFY_CENTER:
105
case GR_TEXT_HJUSTIFY_RIGHT:
109
case GR_TEXT_HJUSTIFY_LEFT:
116
case GR_TEXT_VJUSTIFY_CENTER:
119
case GR_TEXT_VJUSTIFY_TOP:
123
case GR_TEXT_VJUSTIFY_BOTTOM:
129
else /* Texte Vertical */
133
case GR_TEXT_HJUSTIFY_CENTER:
136
case GR_TEXT_HJUSTIFY_RIGHT:
140
case GR_TEXT_HJUSTIFY_LEFT:
147
case GR_TEXT_VJUSTIFY_CENTER:
150
case GR_TEXT_VJUSTIFY_TOP:
154
case GR_TEXT_VJUSTIFY_BOTTOM:
159
cX += ux0; cY += uy0;
160
ox = cX - dx; ; oy = cY + dy;
162
if( (Size.x/zoom) == 0 ) return;
164
if( ABS((Size.x/zoom)) < 3) /* chars trop petits pour etre dessines */
165
{ /* le texte est symbolise par une barre */
166
dx = (espacement * nbchar) / 2;
167
dy = size_v / 2; /* Decalage du debut du texte / centre */
169
ux0 = cX - dx; uy0 = cY;
171
RotatePoint(&ux0, &uy0, cX, cY, orient);
172
RotatePoint(&dx, &dy, cX, cY, orient);
173
GRLine(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, gcolor);
179
dx = (espacement * nbchar) / 2;
180
dy = size_v / 2; /* Decalage du debut du texte / centre */
181
ux0 = cX - dx; uy0 = cY;
183
RotatePoint(&ux0, &uy0, cX, cY, orient);
184
RotatePoint(&dx, &dy, cX, cY, orient);
185
DC->SetTextForeground( wxColour(
188
ColorRefs[gcolor].b) );
189
DC->DrawRotatedText(Text, GRMapX(ux0), GRMapY(uy0), (double) orient / 10.0);
196
AsciiCode = Text.GetChar(ptr) & 255;
197
ptcar = graphic_fonte_shape[AsciiCode] ; /* ptcar pointe la description
198
du caractere a dessiner */
200
for(ii = 0, endcar = FALSE; ! endcar; ptcar++)
202
f_cod = *ptcar ; /* get code n de la forme selectionnee */
206
endcar = TRUE;/* fin du caractere */
210
if(ii && (plume == 'D' ) )
213
GRPoly(&panel->m_ClipBox, DC, ii /2, coord, 0,
215
else if ( sketch_mode )
219
for ( ik = 0; ik < (ii-2); ik += 2, coordptr+= 2)
220
GRCSegm(&panel->m_ClipBox, DC, *coordptr, *(coordptr+1),
221
*(coordptr+2), *(coordptr+3), width, gcolor) ;
225
GRPolyLines(&panel->m_ClipBox, DC, ii /2, coord,
226
gcolor, gcolor, width);
228
plume = f_cod; ii = 0;
231
case 'D' : plume = f_cod ; break ;
235
k1 = f_cod; /* trace sur axe V */
236
k1 = - ((k1 * size_v) / 9) ;
239
k2 = f_cod; /* trace sur axe H */
240
k2 = (k2 * size_h) / 9 ;
241
dx = k2 + ox; dy = k1 + oy;
242
RotatePoint(&dx, &dy, cX, cY, orient);
243
coord[ii] = dx; ii++; coord[ii] = dy; ii++;
247
} /* end boucle for = end trace de 1 caractere */
249
ptr++; ox += espacement;
250
} /* end trace du texte */
255
/******************************************************************************************/
256
void PlotGraphicText(int format_plot, const wxPoint & Pos, int gcolor,
257
const wxString & Text,
258
int orient, const wxSize & Size, int h_justify, int v_justify)
259
/******************************************************************************************/
261
id DrawGraphicText, for plot graphic text
264
int kk, nbchar, end, AsciiCode;
265
int k1 , k2 , x0 , y0, ox, oy ;
266
int size_h , size_v , espacement ;
267
SH_CODE f_cod , plume = 'U';
268
const SH_CODE * ptcar;
270
int ux0, uy0, dx, dy; // Coord de trace des segments de texte & variables de calcul */
271
int cX, cY; // Centre du texte
272
void (*FctPlume)(wxPoint pos, int state);
274
switch ( format_plot)
276
case PLOT_FORMAT_POST:
277
FctPlume = LineTo_PS;
280
case PLOT_FORMAT_HPGL:
281
FctPlume = Move_Plume_HPGL;
284
case PLOT_FORMAT_GERBER:
289
if ( (gcolor >= 0) && (format_plot == PLOT_FORMAT_POST) )
290
SetColorMapPS ( gcolor );
294
if(size_h == 0) size_h = DEFAULT_SIZE_TEXT;
295
if(size_v == 0) size_v = DEFAULT_SIZE_TEXT;
297
kk = 0 ; ptr = 0; /* ptr = text index */
299
/* calcul de la position du debut des textes: ox et oy */
302
espacement = (10 * size_h ) / 9;
303
ox = cX = Pos.x; oy = cY = Pos.y;
305
/* Calcul du cadrage du texte */
306
dx = (espacement * nbchar) / 2;
307
dy = size_v / 2; /* Decalage du debut du texte / centre */
309
ux0 = uy0 = 0; /* Decalage du centre du texte / ccord de ref */
311
if( (orient == 0) || (orient == 1800) ) /* Texte Horizontal */
315
case GR_TEXT_HJUSTIFY_CENTER:
318
case GR_TEXT_HJUSTIFY_RIGHT:
322
case GR_TEXT_HJUSTIFY_LEFT:
329
case GR_TEXT_VJUSTIFY_CENTER:
332
case GR_TEXT_VJUSTIFY_TOP:
336
case GR_TEXT_VJUSTIFY_BOTTOM:
342
else /* Texte Vertical */
346
case GR_TEXT_HJUSTIFY_CENTER:
349
case GR_TEXT_HJUSTIFY_RIGHT:
353
case GR_TEXT_HJUSTIFY_LEFT:
360
case GR_TEXT_VJUSTIFY_CENTER:
363
case GR_TEXT_VJUSTIFY_TOP:
367
case GR_TEXT_VJUSTIFY_BOTTOM:
372
cX += ux0; cY += uy0; /* cX, cY = coord du centre du texte */
373
ox = -dx; oy = +dy; /* ox, oy = coord debut texte, relativement au centre */
375
FctPlume(wxPoint(0,0), 'Z');
379
AsciiCode = Text.GetChar(ptr) & 255;
380
ptcar = graphic_fonte_shape[AsciiCode] ; /* ptcar pointe la description
381
du caractere a dessiner */
383
for(end = 0 ; end == 0; ptcar++)
385
f_cod = *ptcar ; /* get code n de la forme selectionnee */
388
case 'X' : end = 1 ;/* fin du caractere */
391
case 'D' : plume = f_cod ; break ;
394
k1 = f_cod ; /* trace sur axe V */
395
k1 = -(k1 * size_v) / 9 ;
398
k2 = f_cod; /* trace sur axe H */
399
k2 = (k2 * size_h) / 9 ;
400
dx = k2 + ox; dy = k1 + oy;
401
RotatePoint(&dx, &dy, orient);
402
FctPlume(wxPoint(cX + dx, cY + dy), plume);
406
} /* end boucle for = end trace de 1 caractere */
408
FctPlume(wxPoint(0,0), 'Z');
409
ptr++; ox += espacement;
410
} /* end trace du texte */
411
FctPlume(wxPoint(0,0), 'Z');