/****************************************/ /* 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 ); }