~cern-kicad/kicad/kicad-pns-tom

« back to all changes in this revision

Viewing changes to pcbnew/class_pad.cpp

  • Committer: Maciej Suminski
  • Date: 2013-08-02 13:57:24 UTC
  • mfrom: (4024.1.238 kicad)
  • mto: This revision was merged to the branch mainline in revision 4221.
  • Revision ID: maciej.suminski@cern.ch-20130802135724-gix6orezshkukodv
Upstream merge.

Show diffs side-by-side

added added

removed removed

Lines of Context:
123
123
EDA_RECT D_PAD::GetBoundingBox() const
124
124
{
125
125
    EDA_RECT area;
126
 
 
127
 
    // radius of pad area, enclosed in minimum sized circle
128
 
    int radius = boundingRadius();
129
 
 
130
 
    area.SetOrigin( m_Pos );
131
 
    area.Inflate( radius );
 
126
    wxPoint quadrant1, quadrant2, quadrant3, quadrant4;
 
127
    int x, y, dx, dy;
 
128
 
 
129
    switch( GetShape() )
 
130
    {
 
131
    case PAD_CIRCLE:
 
132
        area.SetOrigin( m_Pos );
 
133
        area.Inflate( m_Size.x / 2 );
 
134
        break;
 
135
 
 
136
    case PAD_OVAL:
 
137
        //Use the maximal two most distant points and track their rotation
 
138
        // (utilise symmetry to avoid four points)
 
139
        quadrant1.x =  m_Size.x/2;
 
140
        quadrant1.y =  0;
 
141
        quadrant2.x =  0;
 
142
        quadrant2.y =  m_Size.y/2;
 
143
 
 
144
        RotatePoint( &quadrant1, m_Orient );
 
145
        RotatePoint( &quadrant2, m_Orient );
 
146
        dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x )  );
 
147
        dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y )  );
 
148
        area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy );
 
149
        area.SetSize( 2*dx, 2*dy );
 
150
        break;
 
151
        break;
 
152
 
 
153
    case PAD_RECT:
 
154
        //Use two corners and track their rotation
 
155
        // (utilise symmetry to avoid four points)
 
156
        quadrant1.x =  m_Size.x/2;
 
157
        quadrant1.y =  m_Size.y/2;
 
158
        quadrant2.x = -m_Size.x/2;
 
159
        quadrant2.y =  m_Size.y/2;
 
160
 
 
161
        RotatePoint( &quadrant1, m_Orient );
 
162
        RotatePoint( &quadrant2, m_Orient );
 
163
        dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x )  );
 
164
        dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y )  );
 
165
        area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy );
 
166
        area.SetSize( 2*dx, 2*dy );
 
167
        break;
 
168
 
 
169
    case PAD_TRAPEZOID:
 
170
        //Use the four corners and track their rotation
 
171
        // (Trapezoids will not be symmetric)
 
172
        quadrant1.x =  (m_Size.x + m_DeltaSize.y)/2;
 
173
        quadrant1.y =  (m_Size.y - m_DeltaSize.x)/2;
 
174
        quadrant2.x = -(m_Size.x + m_DeltaSize.y)/2;
 
175
        quadrant2.y =  (m_Size.y + m_DeltaSize.x)/2;
 
176
        quadrant3.x = -(m_Size.x - m_DeltaSize.y)/2;
 
177
        quadrant3.y = -(m_Size.y + m_DeltaSize.x)/2;
 
178
        quadrant4.x =  (m_Size.x - m_DeltaSize.y)/2;
 
179
        quadrant4.y = -(m_Size.y - m_DeltaSize.x)/2;
 
180
 
 
181
        RotatePoint( &quadrant1, m_Orient );
 
182
        RotatePoint( &quadrant2, m_Orient );
 
183
        RotatePoint( &quadrant3, m_Orient );
 
184
        RotatePoint( &quadrant4, m_Orient );
 
185
 
 
186
        x  = std::min( quadrant1.x, std::min( quadrant2.x, std::min( quadrant3.x, quadrant4.x) ) );
 
187
        y  = std::min( quadrant1.y, std::min( quadrant2.y, std::min( quadrant3.y, quadrant4.y) ) );
 
188
        dx = std::max( quadrant1.x, std::max( quadrant2.x, std::max( quadrant3.x, quadrant4.x) ) );
 
189
        dy = std::max( quadrant1.y, std::max( quadrant2.y, std::max( quadrant3.y, quadrant4.y) ) );
 
190
        area.SetOrigin( m_Pos.x+x, m_Pos.y+y );
 
191
        area.SetSize( dx-x, dy-y );
 
192
        break;
 
193
 
 
194
    default:
 
195
        break;
 
196
    }
132
197
 
133
198
    return area;
134
199
}
417
482
        int minsize = -std::min( m_Size.x, m_Size.y ) / 2;
418
483
 
419
484
        if( margin < minsize )
420
 
            minsize = minsize;
 
485
            margin = minsize;
421
486
    }
422
487
 
423
488
    return margin;