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.

266 lines
6.5 KiB

14 years ago
14 years ago
14 years ago
14 years ago
  1. /**
  2. * @file class_edge_mod.cpp
  3. * @brief EDGE_MODULE class definition.
  4. */
  5. #include "fctsys.h"
  6. #include "gr_basic.h"
  7. #include "wxstruct.h"
  8. #include "trigo.h"
  9. #include "class_drawpanel.h"
  10. #include "confirm.h"
  11. #include "kicad_string.h"
  12. #include "colors_selection.h"
  13. #include "richio.h"
  14. #include "macros.h"
  15. #include "wxBasePcbFrame.h"
  16. #include "pcbcommon.h"
  17. #include "class_board.h"
  18. #include "class_module.h"
  19. #include "class_edge_mod.h"
  20. /*********************/
  21. /* class EDGE_MODULE */
  22. /*********************/
  23. EDGE_MODULE::EDGE_MODULE( MODULE* parent, STROKE_T aShape ) :
  24. DRAWSEGMENT( parent, PCB_MODULE_EDGE_T )
  25. {
  26. m_Shape = aShape;
  27. m_Angle = 0;
  28. m_Width = 120;
  29. }
  30. EDGE_MODULE::~EDGE_MODULE()
  31. {
  32. }
  33. void EDGE_MODULE::Copy( EDGE_MODULE* source )
  34. {
  35. if( source == NULL )
  36. return;
  37. DRAWSEGMENT::Copy( source );
  38. m_Start0 = source->m_Start0;
  39. m_End0 = source->m_End0;
  40. m_PolyPoints = source->m_PolyPoints; // std::vector copy
  41. }
  42. void EDGE_MODULE::SetDrawCoord()
  43. {
  44. MODULE* module = (MODULE*) m_Parent;
  45. m_Start = m_Start0;
  46. m_End = m_End0;
  47. if( module )
  48. {
  49. RotatePoint( &m_Start.x, &m_Start.y, module->GetOrientation() );
  50. RotatePoint( &m_End.x, &m_End.y, module->GetOrientation() );
  51. m_Start += module->m_Pos;
  52. m_End += module->m_Pos;
  53. }
  54. }
  55. /* Draw EDGE_MODULE:
  56. * Entry: offset = offset trace
  57. * Draw_mode mode = trace (GR_OR, GR_XOR, GR_AND)
  58. * The contours are of different types:
  59. * - Segment
  60. * - Circles
  61. * - Arcs
  62. */
  63. void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, int draw_mode, const wxPoint& offset )
  64. {
  65. int ux0, uy0, dx, dy, radius, StAngle, EndAngle;
  66. int color, type_trace;
  67. int typeaff;
  68. PCB_BASE_FRAME* frame;
  69. MODULE* module = (MODULE*) m_Parent;
  70. if( module == NULL )
  71. return;
  72. BOARD * brd = GetBoard( );
  73. if( brd->IsLayerVisible( m_Layer ) == false )
  74. return;
  75. color = brd->GetLayerColor( m_Layer );
  76. frame = (PCB_BASE_FRAME*) panel->GetParent();
  77. type_trace = m_Shape;
  78. ux0 = m_Start.x - offset.x;
  79. uy0 = m_Start.y - offset.y;
  80. dx = m_End.x - offset.x;
  81. dy = m_End.y - offset.y;
  82. GRSetDrawMode( DC, draw_mode );
  83. typeaff = frame->m_DisplayModEdge;
  84. if( m_Layer <= LAST_COPPER_LAYER )
  85. {
  86. typeaff = frame->m_DisplayPcbTrackFill;
  87. if( !typeaff )
  88. typeaff = SKETCH;
  89. }
  90. if( DC->LogicalToDeviceXRel( m_Width ) < MIN_DRAW_WIDTH )
  91. typeaff = FILAIRE;
  92. switch( type_trace )
  93. {
  94. case S_SEGMENT:
  95. if( typeaff == FILAIRE )
  96. GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color );
  97. else if( typeaff == FILLED )
  98. GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
  99. else
  100. // SKETCH Mode
  101. GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
  102. break;
  103. case S_CIRCLE:
  104. radius = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
  105. if( typeaff == FILAIRE )
  106. {
  107. GRCircle( &panel->m_ClipBox, DC, ux0, uy0, radius, color );
  108. }
  109. else
  110. {
  111. if( typeaff == FILLED )
  112. {
  113. GRCircle( &panel->m_ClipBox, DC, ux0, uy0, radius, m_Width, color );
  114. }
  115. else // SKETCH Mode
  116. {
  117. GRCircle( &panel->m_ClipBox, DC, ux0, uy0, radius + (m_Width / 2), color );
  118. GRCircle( &panel->m_ClipBox, DC, ux0, uy0, radius - (m_Width / 2), color );
  119. }
  120. }
  121. break;
  122. case S_ARC:
  123. radius = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
  124. StAngle = (int) ArcTangente( dy - uy0, dx - ux0 );
  125. EndAngle = StAngle + m_Angle;
  126. if( StAngle > EndAngle )
  127. EXCHG( StAngle, EndAngle );
  128. if( typeaff == FILAIRE )
  129. {
  130. GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, radius, color );
  131. }
  132. else if( typeaff == FILLED )
  133. {
  134. GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, radius, m_Width, color );
  135. }
  136. else // SKETCH Mode
  137. {
  138. GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
  139. radius + (m_Width / 2), color );
  140. GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
  141. radius - (m_Width / 2), color );
  142. }
  143. break;
  144. case S_POLYGON:
  145. // We must compute true coordinates from m_PolyPoints
  146. // which are relative to module position, orientation 0
  147. std::vector<wxPoint> points = m_PolyPoints;
  148. for( unsigned ii = 0; ii < points.size(); ii++ )
  149. {
  150. wxPoint& pt = points[ii];
  151. RotatePoint( &pt.x, &pt.y, module->GetOrientation() );
  152. pt += module->m_Pos - offset;
  153. }
  154. GRPoly( &panel->m_ClipBox, DC, points.size(), &points[0], true, m_Width, color, color );
  155. break;
  156. }
  157. }
  158. // see class_edge_mod.h
  159. void EDGE_MODULE::DisplayInfo( EDA_DRAW_FRAME* frame )
  160. {
  161. wxString msg;
  162. MODULE* module = (MODULE*) m_Parent;
  163. if( !module )
  164. return;
  165. BOARD* board = (BOARD*) module->GetParent();
  166. if( !board )
  167. return;
  168. frame->ClearMsgPanel();
  169. frame->AppendMsgPanel( _( "Graphic Item" ), wxEmptyString, DARKCYAN );
  170. frame->AppendMsgPanel( _( "Module" ), module->m_Reference->m_Text, DARKCYAN );
  171. frame->AppendMsgPanel( _( "Value" ), module->m_Value->m_Text, BLUE );
  172. msg.Printf( wxT( "%8.8lX" ), module->GetTimeStamp() );
  173. frame->AppendMsgPanel( _( "TimeStamp" ), msg, BROWN );
  174. frame->AppendMsgPanel( _( "Mod Layer" ), board->GetLayerName( module->GetLayer() ), RED );
  175. frame->AppendMsgPanel( _( "Seg Layer" ), board->GetLayerName( GetLayer() ), RED );
  176. valeur_param( m_Width, msg );
  177. frame->AppendMsgPanel( _( "Width" ), msg, BLUE );
  178. }
  179. wxString EDGE_MODULE::GetSelectMenuText() const
  180. {
  181. wxString text;
  182. text << _( "Graphic" ) << wxT( " " ) << ShowShape( (STROKE_T) m_Shape );
  183. text << wxT( " (" ) << GetLayerName() << wxT( ")" );
  184. text << _( " of " ) << ( (MODULE*) GetParent() )->GetReference();
  185. return text;
  186. }
  187. #if defined(DEBUG)
  188. void EDGE_MODULE::Show( int nestLevel, std::ostream& os ) const
  189. {
  190. wxString shape = ShowShape( (STROKE_T) m_Shape );
  191. // for now, make it look like XML:
  192. NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
  193. " type=\"" << TO_UTF8( shape ) << "\">";
  194. os << " <start" << m_Start0 << "/>";
  195. os << " <end" << m_End0 << "/>";
  196. os << " </" << GetClass().Lower().mb_str() << ">\n";
  197. }
  198. #endif