/****************************************/ /* 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*/ DeleteStructure(TextePcb); 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 == CUIVRE_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); }