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.

368 lines
9.9 KiB

  1. /******************************************************/
  2. /* edit.cpp: fonctions generales de l'edition du PCB */
  3. /******************************************************/
  4. #include "fctsys.h"
  5. #include "common.h"
  6. #include "gerbview.h"
  7. #include "pcbplot.h"
  8. #include "id.h"
  9. #include "protos.h"
  10. static void Process_Move_Item( WinEDA_GerberFrame* frame,
  11. EDA_BaseStruct* DrawStruct, wxDC* DC );
  12. /************************************************************************/
  13. void WinEDA_GerberFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
  14. /************************************************************************/
  15. /* Traite les commandes declench�e par le bouton gauche de la souris,
  16. * quand un outil est deja selectionn
  17. */
  18. {
  19. BOARD_ITEM* DrawStruct = GetScreen()->GetCurItem();
  20. wxString msg;
  21. if( m_ID_current_state == 0 )
  22. {
  23. if( DrawStruct && DrawStruct->m_Flags ) // Commande "POPUP" en cours
  24. {
  25. switch( DrawStruct->Type() )
  26. {
  27. default:
  28. msg.Printf(
  29. wxT( "WinEDA_GerberFrame::ProcessCommand err: Struct %d, m_Flags = %X" ),
  30. (unsigned) DrawStruct->Type(),
  31. (unsigned) DrawStruct->m_Flags );
  32. DisplayError( this, msg );
  33. }
  34. }
  35. else
  36. {
  37. DrawStruct = GerberGeneralLocateAndDisplay();
  38. GetScreen()->SetCurItem( DrawStruct );
  39. }
  40. }
  41. switch( m_ID_current_state )
  42. {
  43. case 0:
  44. break;
  45. case ID_NO_SELECT_BUTT:
  46. break;
  47. case ID_PCB_DELETE_ITEM_BUTT:
  48. DrawStruct = GerberGeneralLocateAndDisplay();
  49. if( DrawStruct == NULL )
  50. break;
  51. if( DrawStruct->Type() == TYPETRACK )
  52. {
  53. Delete_Segment( DC, (TRACK*) DrawStruct );
  54. GetScreen()->SetCurItem( NULL );
  55. GetScreen()->SetModify();
  56. }
  57. break;
  58. default:
  59. DisplayError( this, wxT( "WinEDA_GerberFrame::ProcessCommand error" ) );
  60. SetToolID( 0, wxCURSOR_ARROW, wxEmptyString );
  61. break;
  62. }
  63. }
  64. /********************************************************************************/
  65. void WinEDA_GerberFrame::Process_Special_Functions( wxCommandEvent& event )
  66. /********************************************************************************/
  67. /* Traite les selections d'outils et les commandes appelees du menu POPUP
  68. */
  69. {
  70. int id = event.GetId();
  71. int layer = GetScreen()->m_Active_Layer;
  72. GERBER_Descr* gerber_layer = g_GERBER_Descr_List[layer];
  73. wxPoint pos;
  74. wxClientDC dc( DrawPanel );
  75. DrawPanel->PrepareGraphicContext( &dc );
  76. wxGetMousePosition( &pos.x, &pos.y );
  77. pos.y += 20;
  78. switch( id ) // Arret eventuel de la commande de d�placement en cours
  79. {
  80. case wxID_CUT:
  81. case wxID_COPY:
  82. case ID_POPUP_DELETE_BLOCK:
  83. case ID_POPUP_PLACE_BLOCK:
  84. case ID_POPUP_ZOOM_BLOCK:
  85. case ID_POPUP_INVERT_BLOCK:
  86. case ID_POPUP_ROTATE_BLOCK:
  87. case ID_POPUP_COPY_BLOCK:
  88. break;
  89. case ID_POPUP_CANCEL_CURRENT_COMMAND:
  90. if( DrawPanel->ManageCurseur
  91. && DrawPanel->ForceCloseManageCurseur )
  92. {
  93. DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
  94. }
  95. /* ne devrait pas etre execute, sauf bug */
  96. if( GetScreen()->BlockLocate.m_Command != BLOCK_IDLE )
  97. {
  98. GetScreen()->BlockLocate.m_Command = BLOCK_IDLE;
  99. GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK;
  100. GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
  101. }
  102. if( m_ID_current_state == 0 )
  103. SetToolID( 0, wxCURSOR_ARROW, wxEmptyString );
  104. else
  105. SetCursor( DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor );
  106. break;
  107. default: // Arret dea commande de d�placement en cours
  108. if( DrawPanel->ManageCurseur
  109. && DrawPanel->ForceCloseManageCurseur )
  110. {
  111. DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
  112. }
  113. SetToolID( 0, wxCURSOR_ARROW, wxEmptyString );
  114. break;
  115. }
  116. switch( id ) // Traitement des commandes
  117. {
  118. case ID_EXIT:
  119. Close( TRUE );
  120. break;
  121. case ID_NEW_PROJECT:
  122. case ID_LOAD_PROJECT:
  123. Files_io( event );
  124. break;
  125. case ID_PCB_GLOBAL_DELETE:
  126. Erase_Current_Layer( TRUE );
  127. break;
  128. case wxID_CUT:
  129. break;
  130. case wxID_COPY:
  131. break;
  132. case wxID_PASTE:
  133. // HandleBlockBegin(&dc, BLOCK_PASTE);
  134. break;
  135. case ID_UNDO_BUTT:
  136. UnDeleteItem( &dc );
  137. break;
  138. case ID_GET_TOOLS:
  139. // InstallToolsFrame(this, wxPoint(-1,-1) );
  140. break;
  141. case ID_FIND_ITEMS:
  142. // InstallFindFrame(this, pos);
  143. break;
  144. case ID_BUS_BUTT:
  145. SetToolID( id, wxCURSOR_PENCIL, wxT( "Add Tracks" ) );
  146. break;
  147. case ID_LINE_COMMENT_BUTT:
  148. SetToolID( id, wxCURSOR_PENCIL, wxT( "Add Drawing" ) );
  149. break;
  150. case ID_TEXT_COMMENT_BUTT:
  151. SetToolID( id, wxCURSOR_PENCIL, wxT( "Add Text" ) );
  152. break;
  153. case ID_NO_SELECT_BUTT:
  154. SetToolID( 0, 0, wxEmptyString );
  155. break;
  156. case ID_POPUP_CLOSE_CURRENT_TOOL:
  157. SetToolID( 0, wxCURSOR_ARROW, wxEmptyString );
  158. break;
  159. case ID_POPUP_CANCEL_CURRENT_COMMAND:
  160. break;
  161. case ID_POPUP_END_LINE:
  162. DrawPanel->MouseToCursorSchema();
  163. // EndSegment(&dc);
  164. break;
  165. case ID_POPUP_PCB_DELETE_TRACKSEG:
  166. DrawPanel->MouseToCursorSchema();
  167. if( GetScreen()->GetCurItem() == NULL )
  168. break;
  169. Delete_Segment( &dc, (TRACK*) GetScreen()->GetCurItem() );
  170. GetScreen()->SetCurItem( NULL );
  171. GetScreen()->SetModify();
  172. break;
  173. case ID_PCB_DELETE_ITEM_BUTT:
  174. SetToolID( id, wxCURSOR_BULLSEYE, wxT( "Delete item" ) );
  175. break;
  176. case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
  177. DrawPanel->MouseToCursorSchema();
  178. Process_Move_Item( this, GetScreen()->GetCurItem(), &dc );
  179. break;
  180. case ID_TOOLBARH_PCB_SELECT_LAYER:
  181. {
  182. ((PCB_SCREEN*)GetScreen())->m_Active_Layer = m_SelLayerBox->GetChoice();
  183. DrawPanel->Refresh( TRUE );
  184. break;
  185. }
  186. case ID_TOOLBARH_GERBER_SELECT_TOOL:
  187. if( gerber_layer )
  188. {
  189. int tool = m_SelLayerTool->GetChoice();
  190. if( tool > 0 )
  191. tool = tool - 1 + FIRST_DCODE;
  192. else
  193. tool = 0;
  194. gerber_layer->m_Selected_Tool = tool;
  195. DrawPanel->Refresh( TRUE );
  196. }
  197. else
  198. DisplayError( this, _( "No layer selected" ) );
  199. break;
  200. case ID_GERBVIEW_SHOW_LIST_DCODES:
  201. Liste_D_Codes( &dc );
  202. break;
  203. case ID_GERBVIEW_SHOW_SOURCE:
  204. if( gerber_layer )
  205. {
  206. wxString editorname = GetEditorName();
  207. if( !editorname.IsEmpty() )
  208. ExecuteFile( this, editorname, gerber_layer->m_FileName );
  209. }
  210. break;
  211. case ID_POPUP_PLACE_BLOCK:
  212. GetScreen()->BlockLocate.m_Command = BLOCK_MOVE;
  213. DrawPanel->m_AutoPAN_Request = FALSE;
  214. HandleBlockPlace( &dc );
  215. break;
  216. case ID_POPUP_COPY_BLOCK:
  217. GetScreen()->BlockLocate.m_Command = BLOCK_COPY;
  218. GetScreen()->BlockLocate.SetMessageBlock( this );
  219. DrawPanel->m_AutoPAN_Request = FALSE;
  220. HandleBlockEnd( &dc );
  221. break;
  222. case ID_POPUP_ZOOM_BLOCK:
  223. GetScreen()->BlockLocate.m_Command = BLOCK_ZOOM;
  224. GetScreen()->BlockLocate.SetMessageBlock( this );
  225. GetScreen()->BlockLocate.SetMessageBlock( this );
  226. HandleBlockEnd( &dc );
  227. break;
  228. case ID_POPUP_DELETE_BLOCK:
  229. GetScreen()->BlockLocate.m_Command = BLOCK_DELETE;
  230. GetScreen()->BlockLocate.SetMessageBlock( this );
  231. HandleBlockEnd( &dc );
  232. break;
  233. case ID_GERBVIEW_POPUP_DELETE_DCODE_ITEMS:
  234. if( gerber_layer )
  235. Delete_DCode_Items( &dc, gerber_layer->m_Selected_Tool, ((PCB_SCREEN*)GetScreen())->m_Active_Layer );
  236. break;
  237. default:
  238. wxMessageBox( wxT( "WinEDA_GerberFrame::Process_Special_Functions error" ) );
  239. break;
  240. }
  241. SetToolbars();
  242. }
  243. /****************************************************************/
  244. static void Process_Move_Item( WinEDA_GerberFrame* frame,
  245. EDA_BaseStruct* DrawStruct, wxDC* DC )
  246. /****************************************************************/
  247. {
  248. if( DrawStruct == NULL )
  249. return;
  250. frame->DrawPanel->MouseToCursorSchema();
  251. switch( DrawStruct->Type() )
  252. {
  253. default:
  254. wxString msg;
  255. msg.Printf(
  256. wxT( "WinEDA_LibeditFrame::Move_Item Error: Bad DrawType %d" ),
  257. DrawStruct->Type() );
  258. DisplayError( frame, msg );
  259. break;
  260. }
  261. }
  262. /**************************************************************************/
  263. void WinEDA_GerberFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
  264. /**************************************************************************/
  265. /* Appel� sur un double click:
  266. * pour un lment editable (textes, composant):
  267. * appel de l'editeur correspondant.
  268. * pour une connexion en cours:
  269. * termine la connexion
  270. */
  271. {
  272. EDA_BaseStruct* DrawStruct = GetScreen()->GetCurItem();
  273. wxClientDC dc( DrawPanel );
  274. DrawPanel->PrepareGraphicContext( &dc );
  275. switch( m_ID_current_state )
  276. {
  277. case 0:
  278. if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
  279. {
  280. DrawStruct = GerberGeneralLocateAndDisplay();
  281. }
  282. if( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) )
  283. break;
  284. // Element localis�
  285. switch( DrawStruct->Type() )
  286. {
  287. default:
  288. break;
  289. }
  290. break; // end case 0
  291. case ID_BUS_BUTT:
  292. case ID_WIRE_BUTT:
  293. // if ( DrawStruct && (DrawStruct->m_Flags & IS_NEW) )
  294. // EndSegment(DC);
  295. break;
  296. }
  297. }