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.

545 lines
16 KiB

18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
  1. /******************************************************/
  2. /* editpads.cpp: Pad editing functions and dialog box */
  3. /******************************************************/
  4. #include "fctsys.h"
  5. #include "gr_basic.h"
  6. #include "common.h"
  7. #include "pcbnew.h"
  8. #include "autorout.h"
  9. #include "trigo.h"
  10. #include "drag.h"
  11. #include "protos.h"
  12. /* Routines Locales */
  13. /* Variables locales */
  14. static wxString Current_PadNetName;
  15. #define NBSHAPES 4
  16. int CodeShape[NBSHAPES] = /* forme des pads */
  17. {
  18. PAD_CIRCLE, PAD_OVAL, PAD_RECT, PAD_TRAPEZOID
  19. };
  20. #define NBTYPES 5
  21. int CodeType[NBTYPES] =
  22. {
  23. PAD_STANDARD, PAD_SMD, PAD_CONN, PAD_P_HOLE, PAD_MECA
  24. };
  25. static long Std_Pad_Layers[NBTYPES] =
  26. {
  27. ALL_CU_LAYERS | SILKSCREEN_LAYER_CMP | SOLDERMASK_LAYER_CU | SOLDERMASK_LAYER_CMP,
  28. CMP_LAYER | SOLDERPASTE_LAYER_CMP | SOLDERMASK_LAYER_CMP,
  29. CMP_LAYER | SOLDERMASK_LAYER_CMP,
  30. ALL_CU_LAYERS | SILKSCREEN_LAYER_CU | SILKSCREEN_LAYER_CMP |
  31. SOLDERMASK_LAYER_CU | SOLDERMASK_LAYER_CMP,
  32. ALL_CU_LAYERS | SILKSCREEN_LAYER_CU | SILKSCREEN_LAYER_CMP |
  33. SOLDERMASK_LAYER_CU | SOLDERMASK_LAYER_CMP
  34. };
  35. /************************************/
  36. /* class WinEDA_PadPropertiesFrame */
  37. /************************************/
  38. #include "dialog_pad_edit.cpp"
  39. /*************************************************************/
  40. void WinEDA_BasePcbFrame::InstallPadOptionsFrame( D_PAD* Pad,
  41. wxDC* DC, const wxPoint& pos )
  42. /*************************************************************/
  43. {
  44. WinEDA_PadPropertiesFrame* frame = new WinEDA_PadPropertiesFrame( this,
  45. Pad, DC );
  46. frame->ShowModal(); frame->Destroy();
  47. }
  48. /********************************************************/
  49. void WinEDA_PadPropertiesFrame::SetOthersControls()
  50. /********************************************************/
  51. {
  52. int tmp;
  53. m_PadNumCtrl->SetValue( g_Current_PadName );
  54. m_PadNetNameCtrl->SetValue( Current_PadNetName );
  55. m_PadPositionCtrl = new WinEDA_PositionCtrl( this, _(
  56. "Pad Position" ),
  57. CurrentPad ? CurrentPad->m_Pos : g_Pad_Master
  58. .m_Pos,
  59. g_UnitMetric, m_PadPositionBoxSizer,
  60. m_Parent->m_InternalUnits );
  61. m_PadSizeCtrl = new WinEDA_SizeCtrl( this, _(
  62. "Pad Size" ),
  63. CurrentPad ? CurrentPad->m_Size : g_Pad_Master.
  64. m_Size,
  65. g_UnitMetric, m_PadPositionBoxSizer,
  66. m_Parent->m_InternalUnits );
  67. m_PadDeltaSizeCtrl = new WinEDA_SizeCtrl( this, _(
  68. "Delta" ),
  69. CurrentPad ? CurrentPad->m_DeltaSize :
  70. g_Pad_Master.m_DeltaSize,
  71. g_UnitMetric, m_PadPositionBoxSizer,
  72. m_Parent->m_InternalUnits );
  73. m_PadOffsetCtrl = new WinEDA_SizeCtrl( this, _(
  74. "Offset" ),
  75. CurrentPad ? CurrentPad->m_Offset : g_Pad_Master.
  76. m_Offset,
  77. g_UnitMetric, m_PadPositionBoxSizer,
  78. m_Parent->m_InternalUnits );
  79. /* In second column */
  80. m_PadDrillCtrl = new WinEDA_SizeCtrl( this, _(
  81. "Pad Drill" ),
  82. CurrentPad ? CurrentPad->m_Drill : g_Pad_Master.m_Drill,
  83. g_UnitMetric, m_DrillShapeBoxSizer,
  84. m_Parent->m_InternalUnits );
  85. if( CurrentPad )
  86. {
  87. tmp = CurrentPad->m_Orient - m_Module->m_Orient;
  88. }
  89. else
  90. tmp = g_Pad_Master.m_Orient;
  91. m_DrillShapeBoxSizer->Add( 5, 5, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5 );
  92. m_PadOrientCtrl = new WinEDA_ValueCtrl( this, _( "Pad Orient (0.1 deg)" ),
  93. tmp, 2, m_DrillShapeBoxSizer, 1 );
  94. // Pad Orient
  95. switch( tmp )
  96. {
  97. case 0:
  98. m_PadOrient->SetSelection( 0 );
  99. m_PadOrientCtrl->Enable( FALSE );
  100. break;
  101. case - 2700:
  102. case 900:
  103. m_PadOrient->SetSelection( 1 );
  104. m_PadOrientCtrl->Enable( FALSE );
  105. break;
  106. case - 900:
  107. case 2700:
  108. m_PadOrient->SetSelection( 2 );
  109. m_PadOrientCtrl->Enable( FALSE );
  110. break;
  111. case 1800:
  112. case - 1800:
  113. m_PadOrient->SetSelection( 3 );
  114. m_PadOrientCtrl->Enable( FALSE );
  115. break;
  116. default:
  117. m_PadOrient->SetSelection( 4 );
  118. break;
  119. }
  120. tmp = CurrentPad ? CurrentPad->m_PadShape : g_Pad_Master.m_PadShape;
  121. switch( tmp )
  122. {
  123. case PAD_CIRCLE:
  124. m_PadDeltaSizeCtrl->Enable( FALSE, FALSE );
  125. m_PadSizeCtrl->Enable( TRUE, FALSE );
  126. m_PadShape->SetSelection( 0 );
  127. break;
  128. case PAD_OVAL:
  129. m_PadDeltaSizeCtrl->Enable( FALSE, FALSE );
  130. m_PadSizeCtrl->Enable( TRUE, TRUE );
  131. m_PadShape->SetSelection( 1 );
  132. break;
  133. case PAD_RECT:
  134. m_PadDeltaSizeCtrl->Enable( FALSE, FALSE );
  135. m_PadSizeCtrl->Enable( TRUE, TRUE );
  136. m_PadShape->SetSelection( 2 );
  137. break;
  138. case PAD_TRAPEZOID:
  139. m_PadDeltaSizeCtrl->Enable( TRUE, TRUE );
  140. m_PadSizeCtrl->Enable( TRUE, TRUE );
  141. m_PadShape->SetSelection( 3 );
  142. break;
  143. }
  144. // Selection du type
  145. tmp = CurrentPad ? CurrentPad->m_Attribut : g_Pad_Master.m_Attribut;
  146. m_PadType->SetSelection( 0 );
  147. for( int ii = 0; ii < NBTYPES; ii++ )
  148. {
  149. if( CodeType[ii] == tmp )
  150. {
  151. m_PadType->SetSelection( ii ); break;
  152. }
  153. }
  154. tmp = CurrentPad ? CurrentPad->m_DrillShape : g_Pad_Master.m_DrillShape;
  155. switch( tmp )
  156. {
  157. case PAD_CIRCLE:
  158. m_DrillShapeCtrl->SetSelection( 0 );
  159. m_PadDrillCtrl->Enable( TRUE, FALSE );
  160. break;
  161. case PAD_OVAL:
  162. m_DrillShapeCtrl->SetSelection( 1 );
  163. m_PadDrillCtrl->Enable( TRUE, TRUE );
  164. break;
  165. }
  166. // Selection des couches cuivre :
  167. if( CurrentPad )
  168. SetPadLayersList( CurrentPad->m_Masque_Layer );
  169. else
  170. PadTypeSelected();
  171. }
  172. /*******************************************************************/
  173. void WinEDA_PadPropertiesFrame::PadOrientEvent( wxCommandEvent& event )
  174. /********************************************************************/
  175. {
  176. switch( m_PadOrient->GetSelection() )
  177. {
  178. case 0:
  179. m_PadOrientCtrl->SetValue( 0 );
  180. m_PadOrientCtrl->Enable( FALSE );
  181. break;
  182. case 1:
  183. m_PadOrientCtrl->SetValue( 900 );
  184. m_PadOrientCtrl->Enable( FALSE );
  185. break;
  186. case 2:
  187. m_PadOrientCtrl->SetValue( 2700 );
  188. m_PadOrientCtrl->Enable( FALSE );
  189. break;
  190. case 3:
  191. m_PadOrientCtrl->SetValue( 1800 );
  192. m_PadOrientCtrl->Enable( FALSE );
  193. break;
  194. default:
  195. m_PadOrientCtrl->Enable( TRUE );
  196. break;
  197. }
  198. }
  199. /**************************************************************************/
  200. void WinEDA_PadPropertiesFrame::PadTypeSelectedEvent( wxCommandEvent& event )
  201. /**************************************************************************/
  202. /* calcule un layer_mask type selon la selection du type du pad
  203. */
  204. {
  205. PadTypeSelected();
  206. }
  207. void WinEDA_PadPropertiesFrame::PadTypeSelected()
  208. {
  209. long layer_mask;
  210. int ii;
  211. ii = m_PadType->GetSelection();
  212. if( (ii < 0) || ( ii >= NBTYPES) )
  213. ii = 0;
  214. layer_mask = Std_Pad_Layers[ii];
  215. SetPadLayersList( layer_mask );
  216. }
  217. /****************************************************************/
  218. void WinEDA_PadPropertiesFrame::SetPadLayersList( long layer_mask )
  219. /****************************************************************/
  220. /* Met a jour l'etat des CheckBoxes de la liste des layers actives,
  221. * donnes bit a bit dans layer_mask
  222. */
  223. {
  224. if( layer_mask & CUIVRE_LAYER )
  225. m_PadLayerCu->SetValue( TRUE );
  226. else
  227. m_PadLayerCu->SetValue( FALSE );
  228. if( layer_mask & CMP_LAYER )
  229. m_PadLayerCmp->SetValue( TRUE );
  230. else
  231. m_PadLayerCmp->SetValue( FALSE );
  232. if( layer_mask & ADHESIVE_LAYER_CMP )
  233. m_PadLayerAdhCmp->SetValue( TRUE );
  234. else
  235. m_PadLayerAdhCmp->SetValue( FALSE );
  236. if( layer_mask & ADHESIVE_LAYER_CU )
  237. m_PadLayerAdhCu->SetValue( TRUE );
  238. else
  239. m_PadLayerAdhCu->SetValue( FALSE );
  240. if( layer_mask & SOLDERPASTE_LAYER_CMP )
  241. m_PadLayerPateCmp->SetValue( TRUE );
  242. else
  243. m_PadLayerPateCmp->SetValue( FALSE );
  244. if( layer_mask & SOLDERPASTE_LAYER_CU )
  245. m_PadLayerPateCu->SetValue( TRUE );
  246. else
  247. m_PadLayerPateCu->SetValue( FALSE );
  248. if( layer_mask & SILKSCREEN_LAYER_CMP )
  249. m_PadLayerSilkCmp->SetValue( TRUE );
  250. else
  251. m_PadLayerSilkCmp->SetValue( FALSE );
  252. if( layer_mask & SILKSCREEN_LAYER_CU )
  253. m_PadLayerSilkCu->SetValue( TRUE );
  254. else
  255. m_PadLayerSilkCu->SetValue( FALSE );
  256. if( layer_mask & SOLDERMASK_LAYER_CMP )
  257. m_PadLayerMaskCmp->SetValue( TRUE );
  258. else
  259. m_PadLayerMaskCmp->SetValue( FALSE );
  260. if( layer_mask & SOLDERMASK_LAYER_CU )
  261. m_PadLayerMaskCu->SetValue( TRUE );
  262. else
  263. m_PadLayerMaskCu->SetValue( FALSE );
  264. if( layer_mask & ECO1_LAYER )
  265. m_PadLayerECO1->SetValue( TRUE );
  266. else
  267. m_PadLayerECO1->SetValue( FALSE );
  268. if( layer_mask & ECO2_LAYER )
  269. m_PadLayerECO2->SetValue( TRUE );
  270. else
  271. m_PadLayerECO2->SetValue( FALSE );
  272. if( layer_mask & DRAW_LAYER )
  273. m_PadLayerDraft->SetValue( TRUE );
  274. else
  275. m_PadLayerDraft->SetValue( FALSE );
  276. }
  277. /*************************************************************************/
  278. void WinEDA_PadPropertiesFrame::PadPropertiesAccept( wxCommandEvent& event )
  279. /*************************************************************************/
  280. /* Met a jour les differents parametres pour le composant en cours d'�dition
  281. */
  282. {
  283. long PadLayerMask;
  284. bool error = FALSE;
  285. bool RastnestIsChanged = false;
  286. if( m_DC )
  287. m_Parent->DrawPanel->CursorOff( m_DC );
  288. g_Pad_Master.m_Attribut = CodeType[m_PadType->GetSelection()];
  289. g_Pad_Master.m_PadShape = CodeShape[m_PadShape->GetSelection()];
  290. g_Pad_Master.m_Pos = m_PadPositionCtrl->GetValue();
  291. g_Pad_Master.m_Pos0 = g_Pad_Master.m_Pos;
  292. g_Pad_Master.m_Size = m_PadSizeCtrl->GetValue();
  293. if( g_Pad_Master.m_PadShape == PAD_CIRCLE )
  294. g_Pad_Master.m_Size.y = g_Pad_Master.m_Size.x;
  295. g_Pad_Master.m_DeltaSize = m_PadDeltaSizeCtrl->GetValue();
  296. g_Pad_Master.m_Offset = m_PadOffsetCtrl->GetValue();
  297. g_Pad_Master.m_Drill = m_PadDrillCtrl->GetValue();
  298. if( m_DrillShapeCtrl->GetSelection() == 0 )
  299. {
  300. g_Pad_Master.m_DrillShape = PAD_CIRCLE;
  301. g_Pad_Master.m_Drill.y = g_Pad_Master.m_Drill.x;
  302. }
  303. else
  304. g_Pad_Master.m_DrillShape = PAD_OVAL;
  305. g_Pad_Master.m_Orient = m_PadOrientCtrl->GetValue();
  306. g_Current_PadName = m_PadNumCtrl->GetValue().Left( 4 );
  307. Current_PadNetName = m_PadNetNameCtrl->GetValue();
  308. /* Test for incorrect values */
  309. if( (g_Pad_Master.m_Size.x < g_Pad_Master.m_Drill.x)
  310. || (g_Pad_Master.m_Size.y < g_Pad_Master.m_Drill.y) )
  311. {
  312. error = TRUE;
  313. DisplayError( this, _( "Incorrect value for pad drill: pad drill bigger than pad size" ) );
  314. }
  315. if( ( g_Pad_Master.m_Size.x / 2 <= ABS( g_Pad_Master.m_Offset.x ) )
  316. || ( g_Pad_Master.m_Size.y / 2 <= ABS( g_Pad_Master.m_Offset.y ) ) )
  317. {
  318. error = TRUE;
  319. DisplayError( this, _( "Incorrect value for pad offset" ) );
  320. }
  321. if( error )
  322. {
  323. if( m_DC )
  324. m_Parent->DrawPanel->CursorOn( m_DC );
  325. return;
  326. }
  327. PadLayerMask = 0;
  328. if( m_PadLayerCu->GetValue() )
  329. PadLayerMask |= CUIVRE_LAYER;
  330. if( m_PadLayerCmp->GetValue() )
  331. PadLayerMask |= CMP_LAYER;
  332. if( ( PadLayerMask & (CUIVRE_LAYER | CMP_LAYER) ) == (CUIVRE_LAYER | CMP_LAYER) )
  333. PadLayerMask |= ALL_CU_LAYERS;
  334. if( m_PadLayerAdhCmp->GetValue() )
  335. PadLayerMask |= ADHESIVE_LAYER_CMP;
  336. if( m_PadLayerAdhCu->GetValue() )
  337. PadLayerMask |= ADHESIVE_LAYER_CU;
  338. if( m_PadLayerPateCmp->GetValue() )
  339. PadLayerMask |= SOLDERPASTE_LAYER_CMP;
  340. if( m_PadLayerPateCu->GetValue() )
  341. PadLayerMask |= SOLDERPASTE_LAYER_CU;
  342. if( m_PadLayerSilkCmp->GetValue() )
  343. PadLayerMask |= SILKSCREEN_LAYER_CMP;
  344. if( m_PadLayerSilkCu->GetValue() )
  345. PadLayerMask |= SILKSCREEN_LAYER_CU;
  346. if( m_PadLayerMaskCmp->GetValue() )
  347. PadLayerMask |= SOLDERMASK_LAYER_CMP;
  348. if( m_PadLayerMaskCu->GetValue() )
  349. PadLayerMask |= SOLDERMASK_LAYER_CU;
  350. if( m_PadLayerECO1->GetValue() )
  351. PadLayerMask |= ECO1_LAYER;
  352. if( m_PadLayerECO2->GetValue() )
  353. PadLayerMask |= ECO2_LAYER;
  354. if( m_PadLayerDraft->GetValue() )
  355. PadLayerMask |= DRAW_LAYER;
  356. g_Pad_Master.m_Masque_Layer = PadLayerMask;
  357. if( CurrentPad ) // Set Pad Name & Num
  358. {
  359. m_Parent->SaveCopyInUndoList( m_Parent->m_Pcb->m_Modules );
  360. MODULE* Module;
  361. Module = (MODULE*) CurrentPad->m_Parent;
  362. Module->m_LastEdit_Time = time( NULL );
  363. if( m_DC )
  364. CurrentPad->Draw( m_Parent->DrawPanel, m_DC, wxPoint( 0, 0 ), GR_XOR );
  365. CurrentPad->m_PadShape = g_Pad_Master.m_PadShape;
  366. CurrentPad->m_Attribut = g_Pad_Master.m_Attribut;
  367. if (CurrentPad->m_Pos != g_Pad_Master.m_Pos )
  368. {
  369. CurrentPad->m_Pos = g_Pad_Master.m_Pos;
  370. RastnestIsChanged = true;
  371. }
  372. /* compute the pos 0 value, i.e. pad position for module orient = 0 i.e.
  373. * refer to module origin (module position) */
  374. CurrentPad->m_Pos0 = CurrentPad->m_Pos;
  375. CurrentPad->m_Pos0.x -= Module->m_Pos.x;
  376. CurrentPad->m_Pos0.y -= Module->m_Pos.y;
  377. CurrentPad->m_Orient = g_Pad_Master.m_Orient + Module->m_Orient;
  378. RotatePoint( &CurrentPad->m_Pos0.x, &CurrentPad->m_Pos0.y, -Module->m_Orient );
  379. CurrentPad->m_Size = g_Pad_Master.m_Size;
  380. CurrentPad->m_DeltaSize = g_Pad_Master.m_DeltaSize;
  381. CurrentPad->m_Drill = g_Pad_Master.m_Drill;
  382. CurrentPad->m_DrillShape = g_Pad_Master.m_DrillShape;
  383. CurrentPad->m_Offset = g_Pad_Master.m_Offset;
  384. if ( CurrentPad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
  385. {
  386. RastnestIsChanged = true;
  387. CurrentPad->m_Masque_Layer = g_Pad_Master.m_Masque_Layer;
  388. }
  389. CurrentPad->SetPadName( g_Current_PadName );
  390. if ( CurrentPad->m_Netname != Current_PadNetName )
  391. {
  392. if( Current_PadNetName.IsEmpty() )
  393. CurrentPad->SetNet( 0 );
  394. else
  395. {
  396. const EQUIPOT* net = m_Parent->m_Pcb->FindNet( Current_PadNetName );
  397. if ( net )
  398. {
  399. RastnestIsChanged = true;
  400. CurrentPad->m_Netname = Current_PadNetName;
  401. CurrentPad->SetNet(net->GetNet());
  402. }
  403. else
  404. DisplayError(this, _("Unknown netname, no change"));
  405. }
  406. }
  407. switch( CurrentPad->m_PadShape )
  408. {
  409. case PAD_CIRCLE:
  410. CurrentPad->m_DeltaSize = wxSize( 0, 0 );
  411. CurrentPad->m_Size.y = CurrentPad->m_Size.x;
  412. break;
  413. case PAD_RECT:
  414. CurrentPad->m_DeltaSize = wxSize( 0, 0 );
  415. break;
  416. case PAD_OVAL:
  417. CurrentPad->m_DeltaSize = wxSize( 0, 0 );
  418. break;
  419. case PAD_TRAPEZOID:
  420. break;
  421. }
  422. switch( CurrentPad->m_Attribut )
  423. {
  424. case PAD_STANDARD:
  425. break;
  426. case PAD_CONN:
  427. case PAD_SMD:
  428. CurrentPad->m_Offset = wxSize( 0, 0 );
  429. CurrentPad->m_Drill = wxSize( 0, 0 );
  430. break;
  431. case PAD_P_HOLE:
  432. case PAD_MECA:
  433. break;
  434. }
  435. CurrentPad->ComputeRayon();
  436. Module->Set_Rectangle_Encadrement();
  437. CurrentPad->Display_Infos( m_Parent );
  438. if( m_DC )
  439. CurrentPad->Draw( m_Parent->DrawPanel, m_DC, wxPoint( 0, 0 ), GR_OR );
  440. m_Parent->GetScreen()->SetModify();
  441. }
  442. Close();
  443. if( m_DC )
  444. m_Parent->DrawPanel->CursorOn( m_DC );
  445. if ( RastnestIsChanged ) // The net ratsnest must be recalculated
  446. m_Parent->m_Pcb->m_Status_Pcb = 0;
  447. }