428 lines
12 KiB
C++
428 lines
12 KiB
C++
/****************************************/
|
|
/* traitement des textes sur empreintes */
|
|
/****************************************/
|
|
|
|
#include "fctsys.h"
|
|
|
|
#include "common.h"
|
|
#include "gerbview.h"
|
|
|
|
#include "protos.h"
|
|
|
|
#define L_MIN_DESSIN 1 /* seuil de largeur des segments pour trace autre que filaire */
|
|
|
|
/* Fonctions externe: */
|
|
|
|
/* Routines Locales */
|
|
static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag );
|
|
static void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC );
|
|
|
|
/* variables exportees */
|
|
int Angle_Rot_Fin = 50;/* Valeur par defaut de l'angle de rotation fine */
|
|
|
|
/* Variables locales : */
|
|
static int LocalOrient;
|
|
static int LocalDimH;
|
|
static int LocalDimV;
|
|
static int LocalWidth;
|
|
|
|
static wxPoint old_pos; // position originelle du texte selecte
|
|
|
|
|
|
/**************************************/
|
|
/* void Exit_Texte_Pcb(COMMAND * Cmd) */
|
|
/**************************************/
|
|
|
|
/*
|
|
* Routine de sortie du menu edit texte Pcb
|
|
* Si un texte est selectionne, ses coord initiales sont regenerees
|
|
*/
|
|
void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC )
|
|
{
|
|
TEXTE_PCB* TextePcb;
|
|
|
|
TextePcb = (TEXTE_PCB*) frame->CurrentScreen->m_CurrentPcbItem;
|
|
|
|
if( TextePcb )
|
|
{
|
|
Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
TextePcb->m_Pos = old_pos;
|
|
Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_OR );
|
|
}
|
|
|
|
frame->CurrentScreen->ManageCurseur = NULL;
|
|
frame->CurrentScreen->ForceCloseManageCurseur = NULL;
|
|
frame->CurrentScreen->m_CurrentPcbItem = NULL;
|
|
}
|
|
|
|
|
|
/******************************************/
|
|
/* void Place_Texte_Pcb(MTOOL_EDA * Menu) */
|
|
/******************************************/
|
|
|
|
/* Routine de placement du texte en cours de deplacement
|
|
*/
|
|
void WinEDA_PcbFrame::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
{
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_OR );
|
|
CurrentScreen->ManageCurseur = NULL;
|
|
CurrentScreen->ForceCloseManageCurseur = NULL;
|
|
CurrentScreen->m_CurrentPcbItem = NULL;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
|
|
/*****************************************/
|
|
/* void StartMoveTextePcb(COMMAND * Cmd) */
|
|
/*****************************************/
|
|
|
|
/* Routine de preparation du deplacement d'un texte
|
|
*/
|
|
|
|
void WinEDA_PcbFrame::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
{
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
old_pos = TextePcb->m_Pos;
|
|
Affiche_Infos_PCB_Texte( this, TextePcb );
|
|
CurrentScreen->ManageCurseur = Move_Texte_Pcb;
|
|
CurrentScreen->ForceCloseManageCurseur = Exit_Texte_Pcb;
|
|
CurrentScreen->m_CurrentPcbItem = TextePcb;
|
|
}
|
|
|
|
|
|
/*****************************/
|
|
/* void Move_Texte_Pcb() */
|
|
/*****************************/
|
|
|
|
/* Routine deplacant le texte PCB suivant le curseur de la souris */
|
|
|
|
static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag )
|
|
{
|
|
TEXTE_PCB* TextePcb = (TEXTE_PCB*)
|
|
panel->m_Parent->CurrentScreen->m_CurrentPcbItem;
|
|
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
/* effacement du texte : */
|
|
|
|
if( flag == CURSEUR_MOVED )
|
|
Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
|
|
|
|
TextePcb->m_Pos = panel->m_Parent->CurrentScreen->m_Curseur;
|
|
TextePcb->m_Layer = panel->m_Parent->CurrentScreen->m_Active_Layer;
|
|
|
|
/* Redessin du Texte */
|
|
Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
|
|
}
|
|
|
|
|
|
/********************************/
|
|
/* void Delete_Texte_Pcb(COMMAND * Cmd) */
|
|
/********************************/
|
|
|
|
void WinEDA_PcbFrame::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
{
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
|
|
/* Suppression du texte en Memoire*/
|
|
TextePcb->DeleteStructure();
|
|
CurrentScreen->ManageCurseur = NULL;
|
|
CurrentScreen->ForceCloseManageCurseur = NULL;
|
|
CurrentScreen->m_CurrentPcbItem = NULL;
|
|
}
|
|
|
|
|
|
/****************************/
|
|
/* void Add_Texte_Pcb(COMMAND * Cmd) */
|
|
/****************************/
|
|
|
|
TEXTE_PCB* WinEDA_PcbFrame::Create_Texte_Pcb( wxDC* DC )
|
|
{
|
|
char buf_new_texte[256];
|
|
TEXTE_PCB* TextePcb;
|
|
|
|
buf_new_texte[0] = 0;
|
|
Get_Message( "Texte:", buf_new_texte, this );
|
|
if( *buf_new_texte <=' ' )
|
|
return NULL;
|
|
|
|
CurrentScreen->SetModify();
|
|
/* placement du texte en memoire */
|
|
TextePcb = new TEXTE_PCB( pt_pcb );
|
|
|
|
/* Chainage de la nouvelle structure en debut de liste */
|
|
TextePcb->Pnext = pt_pcb->m_Drawings;
|
|
TextePcb->Pback = (EDA_BaseStruct*) pt_pcb;
|
|
if( pt_pcb->m_Drawings )
|
|
pt_pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
|
|
pt_pcb->m_Drawings = (EDA_BaseStruct*) TextePcb;
|
|
|
|
/* Mise a jour des caracteristiques */
|
|
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
|
|
TextePcb->m_Miroir = 1;
|
|
if( CurrentScreen->m_Active_Layer == COPPER_LAYER_N )
|
|
TextePcb->m_Miroir = 0;
|
|
|
|
TextePcb->m_Size.y = Texte_Pcb_DimV;
|
|
TextePcb->m_Size.x = Texte_Pcb_DimH;
|
|
TextePcb->m_Pos = CurrentScreen->m_Curseur;
|
|
TextePcb->m_Width = Texte_Segment_Largeur;
|
|
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
|
|
|
|
/* Copie du texte */
|
|
TextePcb->SetText( buf_new_texte );
|
|
|
|
/* Dessin du Texte */
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
Affiche_Infos_PCB_Texte( this, TextePcb );
|
|
|
|
StartMoveTextePcb( TextePcb, DC );
|
|
|
|
return TextePcb;
|
|
}
|
|
|
|
|
|
/*******************************/
|
|
/* void Rotate_Texte_Pcb(COMMAND * Cmd) */
|
|
/*******************************/
|
|
|
|
void WinEDA_PcbFrame::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
{
|
|
int angle = 900;
|
|
int drawmode = GR_XOR;
|
|
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
/* effacement du texte : */
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
|
|
|
|
TextePcb->m_Orient += angle;
|
|
if( TextePcb->m_Orient >= 3600 )
|
|
TextePcb->m_Orient -= 3600;
|
|
if( TextePcb->m_Orient < 0 )
|
|
TextePcb->m_Orient += 3600;
|
|
|
|
/* Redessin du Texte */
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
|
|
Affiche_Infos_PCB_Texte( this, TextePcb );
|
|
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
|
|
/***************************************************************/
|
|
/* void Trace_1_texte(char * ptr,int ox,int oy),int mode_color */
|
|
/***************************************************************/
|
|
|
|
/*
|
|
* Trace de 1 texte :
|
|
* ptr = pointeur sur le debut de la description du texte
|
|
* ox, oy = Offsets de trace
|
|
* mode_color = GR_OR, GR_XOR..
|
|
*/
|
|
|
|
void Trace_1_texte_pcb( WinEDA_DrawPanel* panel, wxDC* DC,
|
|
TEXTE_PCB* pt_texte, int ox, int oy, int DrawMode )
|
|
{
|
|
int zoom = panel->m_Parent->CurrentScreen->GetZoom();
|
|
int cX, cY;
|
|
int screen_epais, gcolor;
|
|
int size_h, size_v, width;
|
|
char* ptr;
|
|
int orient;
|
|
|
|
if( pt_texte->GetText() == NULL )
|
|
return;
|
|
|
|
/* lecture des caracteristiques du texte */
|
|
size_h = pt_texte->m_Size.x; size_v = pt_texte->m_Size.y;
|
|
orient = pt_texte->m_Orient;
|
|
width = pt_texte->m_Width;
|
|
screen_epais = width / zoom;
|
|
|
|
if( (DisplayOpt.DisplayDrawItems == FILAIRE) || ( screen_epais < L_MIN_DESSIN) )
|
|
width = 0;
|
|
|
|
/* calcul de la position du texte */
|
|
cX = pt_texte->m_Pos.x - ox;
|
|
cY = pt_texte->m_Pos.y - oy;
|
|
|
|
if( pt_texte->m_Miroir == 0 )
|
|
size_h = -size_h;
|
|
|
|
/* choix de la couleur du texte : */
|
|
gcolor = color_layer[pt_texte->m_Layer];
|
|
|
|
ptr = pt_texte->GetText(); /* ptr pointe 1er caractere du texte */
|
|
|
|
GRSetDrawMode( DC, DrawMode );
|
|
/* trace ancre du texte */
|
|
if( (E_ancre_color & ITEM_NON_VISIBLE) == 0 )
|
|
{
|
|
GRLine( panel, DC, cX - (2 * zoom), cY,
|
|
cX + (2 * zoom), cY, E_ancre_color );
|
|
GRLine( panel, DC, cX, cY - (2 * zoom),
|
|
cX, cY + (2 * zoom), E_ancre_color );
|
|
}
|
|
|
|
/* trace du texte */
|
|
Display_1_Texte( panel, DC, ptr, strlen( ptr ), cX, cY,
|
|
size_h, size_v, width, orient, gcolor );
|
|
}
|
|
|
|
|
|
/*********************************************/
|
|
/* void InstallEditCaractMenu(COMMAND * Cmd) */
|
|
/*********************************************/
|
|
|
|
static void InstallEditCaractMenu( COMMAND* Cmd )
|
|
{
|
|
#if 0
|
|
TEXTE_PCB* TextePcb = PtTextePcbSelecte;
|
|
wxDC* DC = Cmd->DC;
|
|
|
|
if( TextePcb == NULL )
|
|
{
|
|
TextePcb = (TEXTE_PCB*) pt_pcb->Drawings;
|
|
while( ( TextePcb = Locate_Texte_Pcb( TextePcb, CURSEUR_OFF_GRILLE ) ) != 0 )
|
|
{
|
|
if( TextePcb->Layer == CurrentScreen->Active_Layer )
|
|
break;
|
|
|
|
// le Texte n'est pas sur la couche active
|
|
TextePcb = (TEXTE_PCB*) TextePcb->Pnext;
|
|
}
|
|
}
|
|
|
|
TextePcbEdite = TextePcb;
|
|
|
|
if( TextePcb == NULL )
|
|
{
|
|
DisplayError( "Texte non trouve sur cette couche", 10 );
|
|
Cmd->Menu->State = WAIT; DisplayMenu( DC, Cmd->Menu, NULL, ON );
|
|
return;
|
|
}
|
|
|
|
Affiche_Infos_PCB_Texte( Cmd, TextePcb );
|
|
|
|
if( TextePcb->orient >= 3600 )
|
|
TextePcb->orient -= 3600;
|
|
if( TextePcb->orient < 0 )
|
|
TextePcb->orient += 3600;
|
|
|
|
/* Init des variables */
|
|
strncpy( BufNameTxt.s, TextePcb->GetText(), sizeof(BufNameTxt.s) - 1 );
|
|
if( TextePcb->miroir )
|
|
Texte_Pcb_Miroir_Item.State = WAIT;
|
|
else
|
|
Texte_Pcb_Miroir_Item.State = RUN;
|
|
|
|
*(int*) Param_OrientText.param = TextePcb->orient;
|
|
*(int*) Param_DimHText.param = TextePcb->Size.x;
|
|
*(int*) Param_DimVText.param = TextePcb->Size.y;
|
|
*(int*) Param_EpaisText.param = TextePcb->width;
|
|
|
|
InstallNewList( Cmd );
|
|
#endif
|
|
}
|
|
|
|
|
|
/*****************************************/
|
|
/* void ChangeCaractTexte(COMMAND * Cmd) */
|
|
/*****************************************/
|
|
|
|
/* Change les caracteristiques du texte en cours d'edition
|
|
*/
|
|
void WinEDA_PcbFrame::EditTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
{
|
|
int drawmode = GR_OR;
|
|
char buf_new_texte[1024];
|
|
|
|
if( TextePcb == NULL )
|
|
return;
|
|
|
|
if( PtTextePcbSelecte )
|
|
drawmode = GR_XOR;
|
|
|
|
buf_new_texte[0] = 0;
|
|
Get_Message( "Texte:", buf_new_texte, this );
|
|
if( *buf_new_texte <=' ' )
|
|
return;
|
|
|
|
/* effacement du texte : */
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
|
|
|
|
if( strcmp( TextePcb->GetText(), buf_new_texte ) && strlen( buf_new_texte ) )
|
|
{
|
|
TextePcb->SetText( buf_new_texte );
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
while( LocalOrient >= 3600 )
|
|
LocalOrient -= 3600;
|
|
|
|
while( LocalOrient < 0 )
|
|
LocalOrient += 3600;
|
|
|
|
if( CurrentScreen->m_Active_Layer != TextePcb->m_Layer )
|
|
{
|
|
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
if( LocalOrient != TextePcb->m_Orient )
|
|
{
|
|
TextePcb->m_Orient = LocalOrient;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
if( LocalDimV != TextePcb->m_Size.y )
|
|
{
|
|
TextePcb->m_Size.y = LocalDimV;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
if( LocalDimH != TextePcb->m_Size.x )
|
|
{
|
|
TextePcb->m_Size.x = LocalDimH;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
if( LocalWidth != TextePcb->m_Width )
|
|
{
|
|
TextePcb->m_Width = LocalWidth;
|
|
CurrentScreen->SetModify();
|
|
}
|
|
|
|
/* if( (Texte_Pcb_Miroir_Item.State == WAIT) && (TextePcb->miroir == 0) )
|
|
* {
|
|
* TextePcb->miroir = 1;
|
|
* CurrentScreen->SetModify();
|
|
* }
|
|
*
|
|
* if( (Texte_Pcb_Miroir_Item.State == RUN) && TextePcb->miroir )
|
|
* {
|
|
* TextePcb->miroir = 0;
|
|
* CurrentScreen->SetModify();
|
|
* }
|
|
*/
|
|
|
|
/* Redessin du Texte */
|
|
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
|
|
|
|
Affiche_Infos_PCB_Texte( this, TextePcb );
|
|
}
|