void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event ) { if( m_PadType->GetSelection() == 1 || m_PadType->GetSelection() == 2 ) { // pad type = SMD or CONN: no hole allowed m_PadDrill_X_Ctrl->Enable( false ); m_PadDrill_Y_Ctrl->Enable( false ); } else { switch( m_DrillShapeCtrl->GetSelection() ) { case 0: //CIRCLE: m_PadDrill_X_Ctrl->Enable( true ); m_PadDrill_Y_Ctrl->Enable( false ); break; case 1: //OVALE: m_PadDrill_X_Ctrl->Enable( true ); m_PadDrill_Y_Ctrl->Enable( true ); break; } } transferDataToPad( m_dummyPad ); redraw(); }
void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event ) { switch( m_PadOrient->GetSelection() ) { case 0: m_dummyPad->SetOrientation( 0 ); break; case 1: m_dummyPad->SetOrientation( 900 ); break; case 2: m_dummyPad->SetOrientation( -900 ); break; case 3: m_dummyPad->SetOrientation( 1800 ); break; default: break; } m_OrientValue = m_dummyPad->GetOrientation() / 10.0; m_OrientValidator.TransferToWindow(); transferDataToPad( m_dummyPad ); redraw(); }
void DIALOG_PAD_PROPERTIES::onCornerSizePercentChange( wxCommandEvent& event ) { if( m_dummyPad->GetShape() != PAD_SHAPE_ROUNDRECT ) return; wxString value = m_tcCornerSizeRatio->GetValue(); double rrRadiusRatioPercent; if( value.ToDouble( &rrRadiusRatioPercent ) ) { // Clamp rrRadiusRatioPercent to acceptable value (0.0 to 50.0) if( rrRadiusRatioPercent < 0.0 ) { rrRadiusRatioPercent = 0.0; m_tcCornerSizeRatio->ChangeValue( "0.0" ); } if( rrRadiusRatioPercent > 50.0 ) { rrRadiusRatioPercent = 0.5; m_tcCornerSizeRatio->ChangeValue( "50.0" ); } transferDataToPad( m_dummyPad ); m_staticTextCornerRadiusValue->SetLabel( StringFromValue( g_UserUnit, m_dummyPad->GetRoundRectCornerRadius() ) ); redraw(); } }
void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event ) { switch( m_PadOrient->GetSelection() ) { case 0: m_dummyPad->SetOrientation( 0 ); break; case 1: m_dummyPad->SetOrientation( 900 ); break; case 2: m_dummyPad->SetOrientation( -900 ); break; case 3: m_dummyPad->SetOrientation( 1800 ); break; default: break; } wxString msg; msg.Printf( wxT( "%g" ), m_dummyPad->GetOrientation() ); m_PadOrientCtrl->SetValue( msg ); transferDataToPad( m_dummyPad ); redraw(); }
void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event ) { if( m_canUpdate ) { transferDataToPad( m_dummyPad ); redraw(); } }
void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event ) { if( m_canUpdate ) { transferDataToPad( m_dummyPad ); m_panelShowPad->Refresh(); } }
void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event ) { switch( m_PadShape->GetSelection() ) { case CHOICE_SHAPE_CIRCLE: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( false ); m_ShapeOffset_X_Ctrl->Enable( false ); m_ShapeOffset_Y_Ctrl->Enable( false ); break; case CHOICE_SHAPE_OVAL: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; case CHOICE_SHAPE_RECT: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; case CHOICE_SHAPE_TRAPEZOID: m_ShapeDelta_Ctrl->Enable( true ); m_trapDeltaDirChoice->Enable( true ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; case CHOICE_SHAPE_ROUNDRECT: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); // Ensure m_tcCornerSizeRatio contains the right value: m_tcCornerSizeRatio->ChangeValue( wxString::Format( "%.1f", m_dummyPad->GetRoundRectRadiusRatio()*100 ) ); break; } // A few widgets are enabled only for rounded rect pads: m_tcCornerSizeRatio->Enable( m_PadShape->GetSelection() == CHOICE_SHAPE_ROUNDRECT ); transferDataToPad( m_dummyPad ); updateRoundRectCornerValues(); redraw(); }
void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event ) { if( m_canUpdate ) { transferDataToPad( m_dummyPad ); // If the pad size has changed, update the displayed values // for rounded rect pads updateRoundRectCornerValues(); redraw(); } }
void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event ) { switch( m_PadShape->GetSelection() ) { case 0: // CIRCLE: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( false ); m_ShapeOffset_X_Ctrl->Enable( false ); m_ShapeOffset_Y_Ctrl->Enable( false ); break; case 1: // OVAL: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; case 2: // PAD_RECT: m_ShapeDelta_Ctrl->Enable( false ); m_trapDeltaDirChoice->Enable( false ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; case 3: // TRAPEZOID: m_ShapeDelta_Ctrl->Enable( true ); m_trapDeltaDirChoice->Enable( true ); m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeOffset_X_Ctrl->Enable( true ); m_ShapeOffset_Y_Ctrl->Enable( true ); break; } transferDataToPad( m_dummyPad ); redraw(); }
bool DIALOG_PAD_PROPERTIES::TransferDataFromWindow() { if( !wxDialog::TransferDataFromWindow() ) return false; if( !m_panelGeneral->TransferDataFromWindow() ) return false; if( !m_localSettingsPanel->TransferDataFromWindow() ) return false; if( !padValuesOK() ) return false; bool rastnestIsChanged = false; int isign = m_isFlipped ? -1 : 1; transferDataToPad( m_padMaster ); // m_padMaster is a pattern: ensure there is no net for this pad: m_padMaster->SetNetCode( NETINFO_LIST::UNCONNECTED ); if( m_currentPad ) // Set current Pad parameters { wxSize size; MODULE* footprint = m_currentPad->GetParent(); m_parent->SaveCopyInUndoList( footprint, UR_CHANGED ); footprint->SetLastEditTime(); // redraw the area where the pad was, without pad (delete pad on screen) m_currentPad->SetFlags( DO_NOT_DRAW ); m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); m_currentPad->ClearFlags( DO_NOT_DRAW ); // Update values m_currentPad->SetShape( m_padMaster->GetShape() ); m_currentPad->SetAttribute( m_padMaster->GetAttribute() ); if( m_currentPad->GetPosition() != m_padMaster->GetPosition() ) { m_currentPad->SetPosition( m_padMaster->GetPosition() ); rastnestIsChanged = true; } // compute the pos 0 value, i.e. pad position for footprint with orientation = 0 // i.e. relative to footprint origin (footprint position) wxPoint pt = m_currentPad->GetPosition() - footprint->GetPosition(); RotatePoint( &pt, -footprint->GetOrientation() ); m_currentPad->SetPos0( pt ); m_currentPad->SetOrientation( m_padMaster->GetOrientation() * isign + footprint->GetOrientation() ); m_currentPad->SetSize( m_padMaster->GetSize() ); size = m_padMaster->GetDelta(); size.y *= isign; m_currentPad->SetDelta( size ); m_currentPad->SetDrillSize( m_padMaster->GetDrillSize() ); m_currentPad->SetDrillShape( m_padMaster->GetDrillShape() ); wxPoint offset = m_padMaster->GetOffset(); offset.y *= isign; m_currentPad->SetOffset( offset ); m_currentPad->SetPadToDieLength( m_padMaster->GetPadToDieLength() ); if( m_currentPad->GetLayerSet() != m_padMaster->GetLayerSet() ) { rastnestIsChanged = true; m_currentPad->SetLayerSet( m_padMaster->GetLayerSet() ); } if( m_isFlipped ) { m_currentPad->SetLayerSet( FlipLayerMask( m_currentPad->GetLayerSet() ) ); } m_currentPad->SetPadName( m_padMaster->GetPadName() ); wxString padNetname; // For PAD_ATTRIB_HOLE_NOT_PLATED, ensure there is no net name selected if( m_padMaster->GetAttribute() != PAD_ATTRIB_HOLE_NOT_PLATED ) padNetname = m_PadNetNameCtrl->GetValue(); if( m_currentPad->GetNetname() != padNetname ) { const NETINFO_ITEM* netinfo = m_board->FindNet( padNetname ); if( !padNetname.IsEmpty() && netinfo == NULL ) { DisplayError( NULL, _( "Unknown netname, netname not changed" ) ); } else if( netinfo ) { rastnestIsChanged = true; m_currentPad->SetNetCode( netinfo->GetNet() ); } } m_currentPad->SetLocalClearance( m_padMaster->GetLocalClearance() ); m_currentPad->SetLocalSolderMaskMargin( m_padMaster->GetLocalSolderMaskMargin() ); m_currentPad->SetLocalSolderPasteMargin( m_padMaster->GetLocalSolderPasteMargin() ); m_currentPad->SetLocalSolderPasteMarginRatio( m_padMaster->GetLocalSolderPasteMarginRatio() ); m_currentPad->SetZoneConnection( m_padMaster->GetZoneConnection() ); m_currentPad->SetThermalWidth( m_padMaster->GetThermalWidth() ); m_currentPad->SetThermalGap( m_padMaster->GetThermalGap() ); m_currentPad->SetRoundRectRadiusRatio( m_padMaster->GetRoundRectRadiusRatio() ); // rounded rect pads with radius ratio = 0 are in fact rect pads. // So set the right shape (and perhaps issues with a radius = 0) if( m_currentPad->GetShape() == PAD_SHAPE_ROUNDRECT && m_currentPad->GetRoundRectRadiusRatio() == 0.0 ) { m_currentPad->SetShape( PAD_SHAPE_RECT ); } footprint->CalculateBoundingBox(); m_parent->SetMsgPanel( m_currentPad ); // redraw the area where the pad was m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); m_parent->OnModify(); } if( rastnestIsChanged ) // The net ratsnest must be recalculated m_board->m_Status_Pcb = 0; return true; }
// test if all values are acceptable for the pad bool DIALOG_PAD_PROPERTIES::padValuesOK() { bool error = transferDataToPad( m_dummyPad ); bool skip_tstoffset = false; // the offset prm is not always tested wxArrayString error_msgs; wxString msg; // Test for incorrect values if( (m_dummyPad->GetSize().x <= 0) || ((m_dummyPad->GetSize().y <= 0) && (m_dummyPad->GetShape() != PAD_SHAPE_CIRCLE)) ) { error_msgs.Add( _( "Pad size must be greater than zero" ) ); } if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) || (m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) ) { error_msgs.Add( _( "Incorrect value for pad drill: pad drill bigger than pad size" ) ); skip_tstoffset = true; // offset prm will be not tested because if the drill value // is incorrect the offset prm is always seen as incorrect, even if it is 0 } LSET padlayers_mask = m_dummyPad->GetLayerSet(); if( padlayers_mask == 0 ) error_msgs.Add( _( "Error: pad has no layer" ) ); if( !padlayers_mask[F_Cu] && !padlayers_mask[B_Cu] ) { if( m_dummyPad->GetDrillSize().x || m_dummyPad->GetDrillSize().y ) { // Note: he message is shown in an HTML window msg = _( "Error: the pad is not on a copper layer and has a hole" ); if( m_dummyPad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED ) { msg += wxT( "<br><br><i>" ); msg += _( "For NPTH pad, set pad size value to pad drill value," " if you do not want this pad plotted in gerber files" ); } error_msgs.Add( msg ); } } if( !skip_tstoffset ) { wxPoint max_size; max_size.x = std::abs( m_dummyPad->GetOffset().x ); max_size.y = std::abs( m_dummyPad->GetOffset().y ); max_size.x += m_dummyPad->GetDrillSize().x / 2; max_size.y += m_dummyPad->GetDrillSize().y / 2; if( ( m_dummyPad->GetSize().x / 2 < max_size.x ) || ( m_dummyPad->GetSize().y / 2 < max_size.y ) ) { error_msgs.Add( _( "Incorrect value for pad offset" ) ); } } if( error ) { error_msgs.Add( _( "Too large value for pad delta size" ) ); } switch( m_dummyPad->GetAttribute() ) { case PAD_ATTRIB_HOLE_NOT_PLATED: // Not plated, but through hole, a hole is expected case PAD_ATTRIB_STANDARD : // Pad through hole, a hole is also expected if( m_dummyPad->GetDrillSize().x <= 0 ) error_msgs.Add( _( "Error: Through hole pad: drill diameter set to 0" ) ); break; case PAD_ATTRIB_CONN: // Connector pads are smd pads, just they do not have solder paste. if( padlayers_mask[B_Paste] || padlayers_mask[F_Paste] ) error_msgs.Add( _( "Error: Connector pads are not on the solder paste layer\n" "Use SMD pads instead" ) ); // Fall trough case PAD_ATTRIB_SMD: // SMD and Connector pads (One external copper layer only) { LSET innerlayers_mask = padlayers_mask & LSET::InternalCuMask(); if( ( padlayers_mask[F_Cu] && padlayers_mask[B_Cu] ) || innerlayers_mask.count() != 0 ) error_msgs.Add( _( "Error: only one external copper layer allowed for SMD or Connector pads" ) ); } break; } if( m_dummyPad->GetShape() == PAD_SHAPE_ROUNDRECT ) { wxString value = m_tcCornerSizeRatio->GetValue(); double rrRadiusRatioPercent; if( !value.ToDouble( &rrRadiusRatioPercent ) ) error_msgs.Add( _( "Incorrect corner size value" ) ); else { if( rrRadiusRatioPercent < 0.0 ) error_msgs.Add( _( "Incorrect (negative) corner size value" ) ); else if( rrRadiusRatioPercent > 50.0 ) error_msgs.Add( _( "Corner size value must be smaller than 50%" ) ); } } if( error_msgs.GetCount() ) { HTML_MESSAGE_BOX dlg( this, _("Pad setup errors list" ) ); dlg.ListSet( error_msgs ); dlg.ShowModal(); } return error_msgs.GetCount() == 0; }
// Called when select/deselect a layer. void DIALOG_PAD_PROPERTIES::OnSetLayers( wxCommandEvent& event ) { transferDataToPad( m_dummyPad ); redraw(); }
void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event ) { if( !padValuesOK() ) return; bool rastnestIsChanged = false; int isign = m_isFlipped ? -1 : 1; transferDataToPad( m_padMaster ); // m_padMaster is a pattern: ensure there is no net for this pad: m_padMaster->SetNetCode( NETINFO_LIST::UNCONNECTED ); if( m_currentPad ) // Set current Pad parameters { wxSize size; MODULE* module = m_currentPad->GetParent(); m_parent->SaveCopyInUndoList( module, UR_CHANGED ); module->SetLastEditTime(); // redraw the area where the pad was, without pad (delete pad on screen) m_currentPad->SetFlags( DO_NOT_DRAW ); m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); m_currentPad->ClearFlags( DO_NOT_DRAW ); // Update values m_currentPad->SetShape( m_padMaster->GetShape() ); m_currentPad->SetAttribute( m_padMaster->GetAttribute() ); if( m_currentPad->GetPosition() != m_padMaster->GetPosition() ) { m_currentPad->SetPosition( m_padMaster->GetPosition() ); rastnestIsChanged = true; } // compute the pos 0 value, i.e. pad position for module with orientation = 0 // i.e. relative to module origin (module position) wxPoint pt = m_currentPad->GetPosition() - module->GetPosition(); RotatePoint( &pt, -module->GetOrientation() ); m_currentPad->SetPos0( pt ); m_currentPad->SetOrientation( m_padMaster->GetOrientation() * isign + module->GetOrientation() ); m_currentPad->SetSize( m_padMaster->GetSize() ); size = m_padMaster->GetDelta(); size.y *= isign; m_currentPad->SetDelta( size ); m_currentPad->SetDrillSize( m_padMaster->GetDrillSize() ); m_currentPad->SetDrillShape( m_padMaster->GetDrillShape() ); wxPoint offset = m_padMaster->GetOffset(); offset.y *= isign; m_currentPad->SetOffset( offset ); m_currentPad->SetPadToDieLength( m_padMaster->GetPadToDieLength() ); if( m_currentPad->GetLayerSet() != m_padMaster->GetLayerSet() ) { rastnestIsChanged = true; m_currentPad->SetLayerSet( m_padMaster->GetLayerSet() ); } if( m_isFlipped ) m_currentPad->SetLayerSet( FlipLayerMask( m_currentPad->GetLayerSet() ) ); m_currentPad->SetPadName( m_padMaster->GetPadName() ); wxString padNetname; // For PAD_HOLE_NOT_PLATED, ensure there is no net name selected if( m_padMaster->GetAttribute() != PAD_HOLE_NOT_PLATED ) padNetname = m_PadNetNameCtrl->GetValue(); if( m_currentPad->GetNetname() != padNetname ) { const NETINFO_ITEM* netinfo = m_board->FindNet( padNetname ); if( !padNetname.IsEmpty() && netinfo == NULL ) { DisplayError( NULL, _( "Unknown netname, netname not changed" ) ); } else { rastnestIsChanged = true; m_currentPad->SetNetCode( netinfo->GetNet() ); } } m_currentPad->SetLocalClearance( m_padMaster->GetLocalClearance() ); m_currentPad->SetLocalSolderMaskMargin( m_padMaster->GetLocalSolderMaskMargin() ); m_currentPad->SetLocalSolderPasteMargin( m_padMaster->GetLocalSolderPasteMargin() ); m_currentPad->SetLocalSolderPasteMarginRatio( m_padMaster->GetLocalSolderPasteMarginRatio() ); m_currentPad->SetZoneConnection( m_padMaster->GetZoneConnection() ); m_currentPad->SetThermalWidth( m_padMaster->GetThermalWidth() ); m_currentPad->SetThermalGap( m_padMaster->GetThermalGap() ); module->CalculateBoundingBox(); m_parent->SetMsgPanel( m_currentPad ); // redraw the area where the pad was m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); m_parent->OnModify(); } EndModal( wxID_OK ); if( rastnestIsChanged ) // The net ratsnest must be recalculated m_board->m_Status_Pcb = 0; }
// test if all values are acceptable for the pad bool DIALOG_PAD_PROPERTIES::padValuesOK() { bool error = transferDataToPad( m_dummyPad ); wxArrayString error_msgs; wxString msg; // Test for incorrect values if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) || (m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) ) { error_msgs.Add( _( "Incorrect value for pad drill: pad drill bigger than pad size" ) ); } LSET padlayers_mask = m_dummyPad->GetLayerSet(); if( padlayers_mask == 0 ) error_msgs.Add( _( "Error: pad has no layer" ) ); if( !padlayers_mask[F_Cu] && !padlayers_mask[B_Cu] ) { if( m_dummyPad->GetDrillSize().x || m_dummyPad->GetDrillSize().y ) { // Note: he message is shown in an HTML window msg = _( "Error: the pad is not on a copper layer and has a hole" ); if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED ) { msg += wxT("<br><br><i>"); msg += _( "For NPTH pad, set pad size value to pad drill value," " if you do not want this pad plotted in gerber files" ); } error_msgs.Add( msg ); } } wxPoint max_size; max_size.x = std::abs( m_dummyPad->GetOffset().x ); max_size.y = std::abs( m_dummyPad->GetOffset().y ); max_size.x += m_dummyPad->GetDrillSize().x / 2; max_size.y += m_dummyPad->GetDrillSize().y / 2; if( ( m_dummyPad->GetSize().x / 2 < max_size.x ) || ( m_dummyPad->GetSize().y / 2 < max_size.y ) ) { error_msgs.Add( _( "Incorrect value for pad offset" ) ); } if( error ) { error_msgs.Add( _( "Too large value for pad delta size" ) ); } switch( m_dummyPad->GetAttribute() ) { case PAD_HOLE_NOT_PLATED: // Not plated, but through hole, a hole is expected case PAD_STANDARD : // Pad through hole, a hole is also expected if( m_dummyPad->GetDrillSize().x <= 0 ) error_msgs.Add( _( "Error: Through hole pad: drill diameter set to 0" ) ); break; case PAD_CONN: // Connector pads are smd pads, just they do not have solder paste. if( padlayers_mask[B_Paste] || padlayers_mask[F_Paste] ) error_msgs.Add( _( "Error: Connector pads are not on the solder paste layer\n" "Use SMD pads instead" ) ); // Fall trough case PAD_SMD: // SMD and Connector pads (One external copper layer only) /* if( padlayers_mask[B_Cu] && padlayers_mask[F_Cu] ) error_msgs.Add( _( "Error: only one copper layer allowed for SMD or Connector pads" ) ); */ break; } if( error_msgs.GetCount() ) { HTML_MESSAGE_BOX dlg( this, _("Pad setup errors list" ) ); dlg.ListSet( error_msgs ); dlg.ShowModal(); } return error_msgs.GetCount() == 0; }
// test if all values are acceptable for the pad bool DIALOG_PAD_PROPERTIES::padValuesOK() { bool error = transferDataToPad( m_dummyPad ); wxArrayString error_msgs; wxString msg; // Test for incorrect values if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) || (m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) ) { error_msgs.Add( _( "Incorrect value for pad drill: pad drill bigger than pad size" ) ); } LAYER_MSK padlayers_mask = m_dummyPad->GetLayerMask(); if( ( padlayers_mask == 0 ) && ( m_dummyPad->GetAttribute() != PAD_HOLE_NOT_PLATED ) ) error_msgs.Add( _( "Error: pad has no layer and is not a mechanical pad" ) ); padlayers_mask &= (LAYER_BACK | LAYER_FRONT); if( padlayers_mask == 0 ) { if( m_dummyPad->GetDrillSize().x || m_dummyPad->GetDrillSize().y ) { msg = _( "Error: pad is not on a copper layer and has a hole" ); if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED ) { msg += wxT("\n"); msg += _( "For NPTH pad, set pad drill value to pad size value,\n" "if you do not want this pad plotted in gerber files" ); } error_msgs.Add( msg ); } } wxPoint max_size; max_size.x = std::abs( m_dummyPad->GetOffset().x ); max_size.y = std::abs( m_dummyPad->GetOffset().y ); max_size.x += m_dummyPad->GetDrillSize().x / 2; max_size.y += m_dummyPad->GetDrillSize().y / 2; if( ( m_dummyPad->GetSize().x / 2 < max_size.x ) || ( m_dummyPad->GetSize().y / 2 < max_size.y ) ) { error_msgs.Add( _( "Incorrect value for pad offset" ) ); } if( error ) { error_msgs.Add( _( "Too large value for pad delta size" ) ); } switch( m_dummyPad->GetAttribute() ) { case PAD_STANDARD : // Pad through hole, a hole is expected if( m_dummyPad->GetDrillSize().x <= 0 ) error_msgs.Add( _( "Incorrect value for pad drill (too small value)" ) ); break; case PAD_SMD: // SMD and Connector pads (One external copper layer only) if( (padlayers_mask & LAYER_BACK) && (padlayers_mask & LAYER_FRONT) ) error_msgs.Add( _( "Error: only one copper layer allowed for this pad" ) ); break; case PAD_CONN: // connectors can have pads on "All" Cu layers. break; case PAD_HOLE_NOT_PLATED: // Not plated break; } if( error_msgs.GetCount() ) { HTML_MESSAGE_BOX dlg( this, _("Pad setup errors list" ) ); dlg.ListSet( error_msgs ); dlg.ShowModal(); } return error_msgs.GetCount() == 0; }
// Called when select/deselect a layer. void DIALOG_PAD_PROPERTIES::OnSetLayers( wxCommandEvent& event ) { transferDataToPad( m_dummyPad ); m_panelShowPad->Refresh(); }