void PCB_PAD::AddToModule( MODULE* aModule, int aRotation, bool aEncapsulatedPad ) { PCB_PAD_SHAPE* padShape; wxString padShapeName = wxT( "Ellipse" ); PAD_ATTR_T padType; int i; int width = 0; int height = 0; D_PAD* pad = new D_PAD( aModule ); aModule->Pads().PushBack( pad ); if( !m_isHolePlated && m_hole ) { // mechanical hole pad->SetShape( PAD_CIRCLE ); pad->SetAttribute( PAD_HOLE_NOT_PLATED ); pad->SetDrillShape( PAD_DRILL_CIRCLE ); pad->SetDrillSize( wxSize( m_hole, m_hole ) ); pad->SetSize( wxSize( m_hole, m_hole ) ); pad->SetLayerSet( LSET::AllCuMask() | LSET( 2, B_Mask, F_Mask ) ); } else { ( m_hole ) ? padType = PAD_STANDARD : padType = PAD_SMD; // form layer mask for( i = 0; i < (int) m_shapes.GetCount(); i++ ) { padShape = m_shapes[i]; if( padShape->m_width > 0 && padShape->m_height > 0 ) { if( padShape->m_KiCadLayer == F_Cu || padShape->m_KiCadLayer == B_Cu ) { padShapeName = padShape->m_shape; width = padShape->m_width; height = padShape->m_height; // assume this is SMD pad if( padShape->m_KiCadLayer == F_Cu ) pad->SetLayerSet( LSET( 3, F_Cu, F_Paste, F_Mask ) ); else pad->SetLayerSet( LSET( 3, B_Cu, B_Paste, B_Mask ) ); break; } } } if( padType == PAD_STANDARD ) // actually this is a thru-hole pad pad->SetLayerSet( LSET::AllCuMask() | LSET( 2, B_Mask, F_Mask ) ); if( width == 0 || height == 0 ) THROW_IO_ERROR( wxT( "pad with zero size" ) ); pad->SetPadName( m_name.text ); if( padShapeName == wxT( "Oval" ) || padShapeName == wxT( "Ellipse" ) || padShapeName == wxT( "MtHole" ) ) { if( width != height ) pad->SetShape( PAD_OVAL ); else pad->SetShape( PAD_CIRCLE ); } else if( padShapeName == wxT( "Rect" ) || padShapeName == wxT( "RndRect" ) ) pad->SetShape( PAD_RECT ); else if( padShapeName == wxT( "Polygon" ) ) pad->SetShape( PAD_RECT ); // approximation pad->SetSize( wxSize( width, height ) ); pad->SetDelta( wxSize( 0, 0 ) ); pad->SetOrientation( m_rotation + aRotation ); pad->SetDrillShape( PAD_DRILL_CIRCLE ); pad->SetOffset( wxPoint( 0, 0 ) ); pad->SetDrillSize( wxSize( m_hole, m_hole ) ); pad->SetAttribute( padType ); // Set the proper net code NETINFO_ITEM* netinfo = m_board->FindNet( m_net ); if( netinfo == NULL ) // I believe this should not happen, but just in case { // It is a new net netinfo = new NETINFO_ITEM( m_board, m_net ); m_board->AppendNet( netinfo ); } pad->SetNetCode( netinfo->GetNet() ); } if( !aEncapsulatedPad ) { // pad's "Position" is not relative to the module's, // whereas Pos0 is relative to the module's but is the unrotated coordinate. wxPoint padpos( m_positionX, m_positionY ); pad->SetPos0( padpos ); RotatePoint( &padpos, aModule->GetOrientation() ); pad->SetPosition( padpos + aModule->GetPosition() ); } }
void PCB_PAD::AddToModule( MODULE* aModule, int aRotation ) { PCB_PAD_SHAPE* padShape; wxString padShapeName = wxT( "Ellipse" ); PAD_ATTR_T padType; int i; int width = 0; int height = 0; if( !m_isHolePlated && m_hole ) { // mechanical hole D_PAD* pad = new D_PAD( aModule ); aModule->m_Pads.PushBack( pad ); pad->SetShape( PAD_CIRCLE ); pad->SetAttribute( PAD_HOLE_NOT_PLATED ); pad->SetDrillShape( PAD_CIRCLE ); pad->SetDrillSize( wxSize( m_hole, m_hole ) ); pad->SetSize( wxSize( m_hole, m_hole ) ); // pad's "Position" is not relative to the module's, // whereas Pos0 is relative to the module's but is the unrotated coordinate. wxPoint padpos( m_positionX, m_positionY ); pad->SetPos0( padpos ); RotatePoint( &padpos, aModule->GetOrientation() ); pad->SetPosition( padpos + aModule->GetPosition() ); pad->SetLayerMask( ALL_CU_LAYERS | SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT ); } else { D_PAD* pad = new D_PAD( aModule ); aModule->m_Pads.PushBack( pad ); ( m_hole ) ? padType = PAD_STANDARD : padType = PAD_SMD; // form layer mask for( i = 0; i < (int) m_shapes.GetCount(); i++ ) { padShape = m_shapes[i]; if( padShape->m_width > 0 && padShape->m_height > 0 ) { if( padShape->m_KiCadLayer == LAYER_N_FRONT || padShape->m_KiCadLayer == LAYER_N_BACK ) { padShapeName = padShape->m_shape; width = padShape->m_width; height = padShape->m_height; // assume this is SMD pad if( padShape->m_KiCadLayer == LAYER_N_FRONT ) pad->SetLayerMask( LAYER_FRONT | SOLDERPASTE_LAYER_FRONT | SOLDERMASK_LAYER_FRONT ); else pad->SetLayerMask( LAYER_BACK | SOLDERPASTE_LAYER_BACK | SOLDERMASK_LAYER_BACK ); break; } } } if( padType == PAD_STANDARD ) // actually this is a thru-hole pad pad->SetLayerMask( ALL_CU_LAYERS | SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT ); if( width == 0 || height == 0 ) THROW_IO_ERROR( wxT( "pad with zero size" ) ); pad->SetPadName( m_name.text ); if( padShapeName == wxT( "Oval" ) || padShapeName == wxT( "Ellipse" ) || padShapeName == wxT( "MtHole" ) ) { if( width != height ) pad->SetShape( PAD_OVAL ); else pad->SetShape( PAD_CIRCLE ); } else if( padShapeName == wxT( "Rect" ) || padShapeName == wxT( "RndRect" ) ) pad->SetShape( PAD_RECT ); else if( padShapeName == wxT( "Polygon" ) ) pad->SetShape( PAD_RECT ); // approximation pad->SetSize( wxSize( width, height ) ); pad->SetDelta( wxSize( 0, 0 ) ); pad->SetOrientation( m_rotation + aRotation ); pad->SetDrillShape( PAD_CIRCLE ); pad->SetOffset( wxPoint( 0, 0 ) ); pad->SetDrillSize( wxSize( m_hole, m_hole ) ); pad->SetAttribute( padType ); pad->SetNet( 0 ); pad->SetNetname( m_net ); // pad's "Position" is not relative to the module's, // whereas Pos0 is relative to the module's but is the unrotated coordinate. wxPoint padpos( m_positionX, m_positionY ); pad->SetPos0( padpos ); RotatePoint( &padpos, aModule->GetOrientation() ); pad->SetPosition( padpos + aModule->GetPosition() ); } }