You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

427 lines
12 KiB

  1. /****************************************/
  2. /* traitement des textes sur empreintes */
  3. /****************************************/
  4. #include "fctsys.h"
  5. #include "common.h"
  6. #include "gerbview.h"
  7. #include "protos.h"
  8. #define L_MIN_DESSIN 1 /* seuil de largeur des segments pour trace autre que filaire */
  9. /* Fonctions externe: */
  10. /* Routines Locales */
  11. static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag );
  12. static void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC );
  13. /* variables exportees */
  14. int Angle_Rot_Fin = 50;/* Valeur par defaut de l'angle de rotation fine */
  15. /* Variables locales : */
  16. static int LocalOrient;
  17. static int LocalDimH;
  18. static int LocalDimV;
  19. static int LocalWidth;
  20. static wxPoint old_pos; // position originelle du texte selecte
  21. /**************************************/
  22. /* void Exit_Texte_Pcb(COMMAND * Cmd) */
  23. /**************************************/
  24. /*
  25. * Routine de sortie du menu edit texte Pcb
  26. * Si un texte est selectionne, ses coord initiales sont regenerees
  27. */
  28. void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC )
  29. {
  30. TEXTE_PCB* TextePcb;
  31. TextePcb = (TEXTE_PCB*) frame->CurrentScreen->m_CurrentPcbItem;
  32. if( TextePcb )
  33. {
  34. Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  35. TextePcb->m_Pos = old_pos;
  36. Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_OR );
  37. }
  38. frame->CurrentScreen->ManageCurseur = NULL;
  39. frame->CurrentScreen->ForceCloseManageCurseur = NULL;
  40. frame->CurrentScreen->m_CurrentPcbItem = NULL;
  41. }
  42. /******************************************/
  43. /* void Place_Texte_Pcb(MTOOL_EDA * Menu) */
  44. /******************************************/
  45. /* Routine de placement du texte en cours de deplacement
  46. */
  47. void WinEDA_PcbFrame::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
  48. {
  49. if( TextePcb == NULL )
  50. return;
  51. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  52. TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
  53. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_OR );
  54. CurrentScreen->ManageCurseur = NULL;
  55. CurrentScreen->ForceCloseManageCurseur = NULL;
  56. CurrentScreen->m_CurrentPcbItem = NULL;
  57. CurrentScreen->SetModify();
  58. }
  59. /*****************************************/
  60. /* void StartMoveTextePcb(COMMAND * Cmd) */
  61. /*****************************************/
  62. /* Routine de preparation du deplacement d'un texte
  63. */
  64. void WinEDA_PcbFrame::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
  65. {
  66. if( TextePcb == NULL )
  67. return;
  68. old_pos = TextePcb->m_Pos;
  69. Affiche_Infos_PCB_Texte( this, TextePcb );
  70. CurrentScreen->ManageCurseur = Move_Texte_Pcb;
  71. CurrentScreen->ForceCloseManageCurseur = Exit_Texte_Pcb;
  72. CurrentScreen->m_CurrentPcbItem = TextePcb;
  73. }
  74. /*****************************/
  75. /* void Move_Texte_Pcb() */
  76. /*****************************/
  77. /* Routine deplacant le texte PCB suivant le curseur de la souris */
  78. static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag )
  79. {
  80. TEXTE_PCB* TextePcb = (TEXTE_PCB*)
  81. panel->m_Parent->CurrentScreen->m_CurrentPcbItem;
  82. if( TextePcb == NULL )
  83. return;
  84. /* effacement du texte : */
  85. if( flag == CURSEUR_MOVED )
  86. Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
  87. TextePcb->m_Pos = panel->m_Parent->CurrentScreen->m_Curseur;
  88. TextePcb->m_Layer = panel->m_Parent->CurrentScreen->m_Active_Layer;
  89. /* Redessin du Texte */
  90. Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
  91. }
  92. /********************************/
  93. /* void Delete_Texte_Pcb(COMMAND * Cmd) */
  94. /********************************/
  95. void WinEDA_PcbFrame::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
  96. {
  97. if( TextePcb == NULL )
  98. return;
  99. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  100. /* Suppression du texte en Memoire*/
  101. TextePcb->DeleteStructure();
  102. CurrentScreen->ManageCurseur = NULL;
  103. CurrentScreen->ForceCloseManageCurseur = NULL;
  104. CurrentScreen->m_CurrentPcbItem = NULL;
  105. }
  106. /****************************/
  107. /* void Add_Texte_Pcb(COMMAND * Cmd) */
  108. /****************************/
  109. TEXTE_PCB* WinEDA_PcbFrame::Create_Texte_Pcb( wxDC* DC )
  110. {
  111. char buf_new_texte[256];
  112. TEXTE_PCB* TextePcb;
  113. buf_new_texte[0] = 0;
  114. Get_Message( "Texte:", buf_new_texte, this );
  115. if( *buf_new_texte <=' ' )
  116. return NULL;
  117. CurrentScreen->SetModify();
  118. /* placement du texte en memoire */
  119. TextePcb = new TEXTE_PCB( pt_pcb );
  120. /* Chainage de la nouvelle structure en debut de liste */
  121. TextePcb->Pnext = pt_pcb->m_Drawings;
  122. TextePcb->Pback = (EDA_BaseStruct*) pt_pcb;
  123. if( pt_pcb->m_Drawings )
  124. pt_pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
  125. pt_pcb->m_Drawings = (EDA_BaseStruct*) TextePcb;
  126. /* Mise a jour des caracteristiques */
  127. TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
  128. TextePcb->m_Miroir = 1;
  129. if( CurrentScreen->m_Active_Layer == COPPER_LAYER_N )
  130. TextePcb->m_Miroir = 0;
  131. TextePcb->m_Size.y = Texte_Pcb_DimV;
  132. TextePcb->m_Size.x = Texte_Pcb_DimH;
  133. TextePcb->m_Pos = CurrentScreen->m_Curseur;
  134. TextePcb->m_Width = Texte_Segment_Largeur;
  135. TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
  136. /* Copie du texte */
  137. TextePcb->SetText( buf_new_texte );
  138. /* Dessin du Texte */
  139. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  140. Affiche_Infos_PCB_Texte( this, TextePcb );
  141. StartMoveTextePcb( TextePcb, DC );
  142. return TextePcb;
  143. }
  144. /*******************************/
  145. /* void Rotate_Texte_Pcb(COMMAND * Cmd) */
  146. /*******************************/
  147. void WinEDA_PcbFrame::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
  148. {
  149. int angle = 900;
  150. int drawmode = GR_XOR;
  151. if( TextePcb == NULL )
  152. return;
  153. /* effacement du texte : */
  154. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  155. TextePcb->m_Orient += angle;
  156. if( TextePcb->m_Orient >= 3600 )
  157. TextePcb->m_Orient -= 3600;
  158. if( TextePcb->m_Orient < 0 )
  159. TextePcb->m_Orient += 3600;
  160. /* Redessin du Texte */
  161. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
  162. Affiche_Infos_PCB_Texte( this, TextePcb );
  163. CurrentScreen->SetModify();
  164. }
  165. /***************************************************************/
  166. /* void Trace_1_texte(char * ptr,int ox,int oy),int mode_color */
  167. /***************************************************************/
  168. /*
  169. * Trace de 1 texte :
  170. * ptr = pointeur sur le debut de la description du texte
  171. * ox, oy = Offsets de trace
  172. * mode_color = GR_OR, GR_XOR..
  173. */
  174. void Trace_1_texte_pcb( WinEDA_DrawPanel* panel, wxDC* DC,
  175. TEXTE_PCB* pt_texte, int ox, int oy, int DrawMode )
  176. {
  177. int zoom = panel->m_Parent->CurrentScreen->GetZoom();
  178. int cX, cY;
  179. int screen_epais, gcolor;
  180. int size_h, size_v, width;
  181. char* ptr;
  182. int orient;
  183. if( pt_texte->GetText() == NULL )
  184. return;
  185. /* lecture des caracteristiques du texte */
  186. size_h = pt_texte->m_Size.x; size_v = pt_texte->m_Size.y;
  187. orient = pt_texte->m_Orient;
  188. width = pt_texte->m_Width;
  189. screen_epais = width / zoom;
  190. if( (DisplayOpt.DisplayDrawItems == FILAIRE) || ( screen_epais < L_MIN_DESSIN) )
  191. width = 0;
  192. /* calcul de la position du texte */
  193. cX = pt_texte->m_Pos.x - ox;
  194. cY = pt_texte->m_Pos.y - oy;
  195. if( pt_texte->m_Miroir == 0 )
  196. size_h = -size_h;
  197. /* choix de la couleur du texte : */
  198. gcolor = color_layer[pt_texte->m_Layer];
  199. ptr = pt_texte->GetText(); /* ptr pointe 1er caractere du texte */
  200. GRSetDrawMode( DC, DrawMode );
  201. /* trace ancre du texte */
  202. if( (E_ancre_color & ITEM_NON_VISIBLE) == 0 )
  203. {
  204. GRLine( panel, DC, cX - (2 * zoom), cY,
  205. cX + (2 * zoom), cY, E_ancre_color );
  206. GRLine( panel, DC, cX, cY - (2 * zoom),
  207. cX, cY + (2 * zoom), E_ancre_color );
  208. }
  209. /* trace du texte */
  210. Display_1_Texte( panel, DC, ptr, strlen( ptr ), cX, cY,
  211. size_h, size_v, width, orient, gcolor );
  212. }
  213. /*********************************************/
  214. /* void InstallEditCaractMenu(COMMAND * Cmd) */
  215. /*********************************************/
  216. static void InstallEditCaractMenu( COMMAND* Cmd )
  217. {
  218. #if 0
  219. TEXTE_PCB* TextePcb = PtTextePcbSelecte;
  220. wxDC* DC = Cmd->DC;
  221. if( TextePcb == NULL )
  222. {
  223. TextePcb = (TEXTE_PCB*) pt_pcb->Drawings;
  224. while( ( TextePcb = Locate_Texte_Pcb( TextePcb, CURSEUR_OFF_GRILLE ) ) != 0 )
  225. {
  226. if( TextePcb->Layer == CurrentScreen->Active_Layer )
  227. break;
  228. // le Texte n'est pas sur la couche active
  229. TextePcb = (TEXTE_PCB*) TextePcb->Pnext;
  230. }
  231. }
  232. TextePcbEdite = TextePcb;
  233. if( TextePcb == NULL )
  234. {
  235. DisplayError( "Texte non trouve sur cette couche", 10 );
  236. Cmd->Menu->State = WAIT; DisplayMenu( DC, Cmd->Menu, NULL, ON );
  237. return;
  238. }
  239. Affiche_Infos_PCB_Texte( Cmd, TextePcb );
  240. if( TextePcb->orient >= 3600 )
  241. TextePcb->orient -= 3600;
  242. if( TextePcb->orient < 0 )
  243. TextePcb->orient += 3600;
  244. /* Init des variables */
  245. strncpy( BufNameTxt.s, TextePcb->GetText(), sizeof(BufNameTxt.s) - 1 );
  246. if( TextePcb->miroir )
  247. Texte_Pcb_Miroir_Item.State = WAIT;
  248. else
  249. Texte_Pcb_Miroir_Item.State = RUN;
  250. *(int*) Param_OrientText.param = TextePcb->orient;
  251. *(int*) Param_DimHText.param = TextePcb->Size.x;
  252. *(int*) Param_DimVText.param = TextePcb->Size.y;
  253. *(int*) Param_EpaisText.param = TextePcb->width;
  254. InstallNewList( Cmd );
  255. #endif
  256. }
  257. /*****************************************/
  258. /* void ChangeCaractTexte(COMMAND * Cmd) */
  259. /*****************************************/
  260. /* Change les caracteristiques du texte en cours d'edition
  261. */
  262. void WinEDA_PcbFrame::EditTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
  263. {
  264. int drawmode = GR_OR;
  265. char buf_new_texte[1024];
  266. if( TextePcb == NULL )
  267. return;
  268. if( PtTextePcbSelecte )
  269. drawmode = GR_XOR;
  270. buf_new_texte[0] = 0;
  271. Get_Message( "Texte:", buf_new_texte, this );
  272. if( *buf_new_texte <=' ' )
  273. return;
  274. /* effacement du texte : */
  275. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
  276. if( strcmp( TextePcb->GetText(), buf_new_texte ) && strlen( buf_new_texte ) )
  277. {
  278. TextePcb->SetText( buf_new_texte );
  279. CurrentScreen->SetModify();
  280. }
  281. while( LocalOrient >= 3600 )
  282. LocalOrient -= 3600;
  283. while( LocalOrient < 0 )
  284. LocalOrient += 3600;
  285. if( CurrentScreen->m_Active_Layer != TextePcb->m_Layer )
  286. {
  287. TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
  288. CurrentScreen->SetModify();
  289. }
  290. if( LocalOrient != TextePcb->m_Orient )
  291. {
  292. TextePcb->m_Orient = LocalOrient;
  293. CurrentScreen->SetModify();
  294. }
  295. if( LocalDimV != TextePcb->m_Size.y )
  296. {
  297. TextePcb->m_Size.y = LocalDimV;
  298. CurrentScreen->SetModify();
  299. }
  300. if( LocalDimH != TextePcb->m_Size.x )
  301. {
  302. TextePcb->m_Size.x = LocalDimH;
  303. CurrentScreen->SetModify();
  304. }
  305. if( LocalWidth != TextePcb->m_Width )
  306. {
  307. TextePcb->m_Width = LocalWidth;
  308. CurrentScreen->SetModify();
  309. }
  310. /* if( (Texte_Pcb_Miroir_Item.State == WAIT) && (TextePcb->miroir == 0) )
  311. * {
  312. * TextePcb->miroir = 1;
  313. * CurrentScreen->SetModify();
  314. * }
  315. *
  316. * if( (Texte_Pcb_Miroir_Item.State == RUN) && TextePcb->miroir )
  317. * {
  318. * TextePcb->miroir = 0;
  319. * CurrentScreen->SetModify();
  320. * }
  321. */
  322. /* Redessin du Texte */
  323. Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
  324. Affiche_Infos_PCB_Texte( this, TextePcb );
  325. }