void ReadParam( wxConfigBase* aConfig ) const override { if( !m_Pt_param || !aConfig ) return; m_Pt_param->clear(); for( int index = 1; ; ++index ) { double width, gap, viagap; wxString key = dPairWidthKey; if( !aConfig->Read( key << index, &width ) ) break; key = dPairGapKey; gap = aConfig->ReadDouble( key << index, 0.0 ); key = dPairViaGapKey; viagap = aConfig->ReadDouble( key << index, 0.0 ); m_Pt_param->emplace_back( DIFF_PAIR_DIMENSION( Millimeter2iu( width ), Millimeter2iu( gap ), Millimeter2iu( viagap ) ) ); } }
/** * Construct with some sensible defaults. * In future, this could be loaded from config? */ CREATE_ARRAY_DIALOG_ENTRIES() : m_optionsSet( true ), m_gridNx( 5 ), m_gridNy( 5 ), m_gridDx( Millimeter2iu( 2.54 ) ), m_gridDy( Millimeter2iu( 2.54 ) ), m_gridOffsetX( 0 ), m_gridOffsetY( 0 ), m_gridStagger( 1 ), m_gridStaggerType( 0 ), // rows m_gridNumberingAxis( 0 ), // h then v m_gridNumberingReverseAlternate( false ), m_gridNumberingStartSet( 1 ), // use specified start m_grid2dArrayNumbering( 0 ), // linear numbering m_gridPriAxisNumScheme( 0 ), // numeric m_gridSecAxisNumScheme( 0 ), // numeric m_gridPriNumberingOffset( "1" ), // numeric m_gridSecNumberingOffset( "1" ), // numeric m_circCentreX( 0 ), m_circCentreY( 0 ), m_circAngle( 0.0 ), m_circCount( 4 ), m_circNumberingStartSet( 1 ), // use specified start m_circNumberingOffset( "1" ), m_circRotate( false ), m_arrayTypeTab( 0 ) // start on grid view { }
static void write_layers( MODEL_VRML& aModel, std::ofstream& output_file, BOARD* aPcb ) { // VRML_LAYER board; aModel.board.Tesselate( &aModel.holes ); double brdz = aModel.board_thickness / 2.0 - ( Millimeter2iu( ART_OFFSET / 2.0 ) ) * aModel.scale; write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_PCB ), &aModel.board, false, false, brdz, -brdz, aModel.precision ); // VRML_LAYER top_copper; aModel.top_copper.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TRACK ), &aModel.top_copper, true, true, aModel.GetLayerZ( F_Cu ), 0, aModel.precision ); // VRML_LAYER top_tin; aModel.top_tin.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), &aModel.top_tin, true, true, aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * aModel.scale, 0, aModel.precision ); // VRML_LAYER bot_copper; aModel.bot_copper.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TRACK ), &aModel.bot_copper, true, false, aModel.GetLayerZ( B_Cu ), 0, aModel.precision ); // VRML_LAYER bot_tin; aModel.bot_tin.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), &aModel.bot_tin, true, false, aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * aModel.scale, 0, aModel.precision ); // VRML_LAYER PTH; aModel.plated_holes.Tesselate( NULL, true ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), &aModel.plated_holes, false, false, aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * aModel.scale, aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * aModel.scale, aModel.precision ); // VRML_LAYER top_silk; aModel.top_silk.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_SILK ), &aModel.top_silk, true, true, aModel.GetLayerZ( F_SilkS ), 0, aModel.precision ); // VRML_LAYER bot_silk; aModel.bot_silk.Tesselate( &aModel.holes ); write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_SILK ), &aModel.bot_silk, true, false, aModel.GetLayerZ( B_SilkS ), 0, aModel.precision ); }
PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent ) : BOARD_ITEM( aParent, PCB_TARGET_T ) { m_Shape = 0; m_Size = Millimeter2iu( 5 ); // Gives a decent size m_Width = Millimeter2iu( 0.15 ); // Gives a decent width m_Layer = Edge_Cuts; // a target is on all layers }
bool DIALOG_NON_COPPER_ZONES_EDITOR::TransferDataToWindow() { m_cornerSmoothingChoice->SetSelection( m_settings.GetCornerSmoothingType() ); m_cornerRadius.SetValue( m_settings.GetCornerRadius() ); m_minWidth.SetValue( m_settings.m_ZoneMinThickness ); m_ConstrainOpt->SetValue( m_settings.m_Zone_45_Only ); switch( m_settings.m_Zone_HatchingStyle ) { case ZONE_CONTAINER::NO_HATCH: m_OutlineAppearanceCtrl->SetSelection( 0 ); break; case ZONE_CONTAINER::DIAGONAL_EDGE: m_OutlineAppearanceCtrl->SetSelection( 1 ); break; case ZONE_CONTAINER::DIAGONAL_FULL: m_OutlineAppearanceCtrl->SetSelection( 2 ); break; } SetInitialFocus( m_OutlineAppearanceCtrl ); switch( m_settings.m_FillMode ) { case ZFM_HATCH_PATTERN: m_GridStyleCtrl->SetSelection( 1 ); break; default: m_GridStyleCtrl->SetSelection( 0 ); break; } m_gridStyleRotation.SetUnits( DEGREES ); m_gridStyleRotation.SetValue( m_settings.m_HatchFillTypeOrientation*10 ); // IU is decidegree // Gives a reasonable value to grid style parameters, if currently there are no defined // parameters for grid pattern thickness and gap (if the value is 0) // the grid pattern thickness default value is (arbitrary) m_ZoneMinThickness * 4 // or 1mm // the grid pattern gap default value is (arbitrary) m_ZoneMinThickness * 6 // or 1.5 mm int bestvalue = m_settings.m_HatchFillTypeThickness; if( bestvalue <= 0 ) // No defined value for m_HatchFillTypeThickness bestvalue = std::max( m_settings.m_ZoneMinThickness * 4, Millimeter2iu( 1.0 ) ); m_gridStyleThickness.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) ); bestvalue = m_settings.m_HatchFillTypeGap; if( bestvalue <= 0 ) // No defined value for m_HatchFillTypeGap bestvalue = std::max( m_settings.m_ZoneMinThickness * 6, Millimeter2iu( 1.5 ) ); m_gridStyleGap.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) ); m_spinCtrlSmoothLevel->SetValue( m_settings.m_HatchFillTypeSmoothingLevel ); m_spinCtrlSmoothValue->SetValue( m_settings.m_HatchFillTypeSmoothingValue ); // Enable/Disable some widgets wxCommandEvent event; OnStyleSelection( event ); return true; }
void DIALOG_PLOT_SCHEMATIC::SetHPGLPenWidth() { m_HPGLPenSize = ValueFromTextCtrl( *m_penHPGLWidthCtrl ); if( m_HPGLPenSize > Millimeter2iu( 2 ) ) m_HPGLPenSize = Millimeter2iu( 2 ); if( m_HPGLPenSize < Millimeter2iu( 0.01 ) ) m_HPGLPenSize = Millimeter2iu( 0.01 ); }
void DXF2BRD_CONVERTER::insertLine( const wxRealPoint& aSegStart, const wxRealPoint& aSegEnd, int aWidth ) { DRAWSEGMENT* segm = ( m_useModuleItems ) ? static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; wxPoint segment_startpoint( Millimeter2iu( aSegStart.x ), Millimeter2iu( aSegStart.y ) ); wxPoint segment_endpoint( Millimeter2iu( aSegEnd.x ), Millimeter2iu( aSegEnd.y ) ); segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); segm->SetStart( segment_startpoint ); segm->SetEnd( segment_endpoint ); segm->SetWidth( aWidth ); m_newItemsList.push_back( segm ); return; }
void PCB_EDIT_FRAME::LoadSettings() { wxConfig* config = wxGetApp().GetSettings(); if( config == NULL ) return; // The configuration setting that used to be mixed in with the project file settings. wxGetApp().ReadCurrentSetupValues( GetConfigurationSettings() ); PCB_BASE_FRAME::LoadSettings(); double dtmp; config->Read( OPTKEY_DEFAULT_LINEWIDTH_VALUE, &dtmp, 0.1 ); // stored in mm if( dtmp < 0.01 ) dtmp = 0.01; if( dtmp > 5.0 ) dtmp = 5.0; g_DrawDefaultLineThickness = Millimeter2iu( dtmp ); long tmp; config->Read( PCB_SHOW_FULL_RATSNET_OPT, &tmp ); GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, tmp); config->Read( PCB_MAGNETIC_PADS_OPT, &g_MagneticPadOption ); config->Read( PCB_MAGNETIC_TRACKS_OPT, &g_MagneticTrackOption ); config->Read( SHOW_MICROWAVE_TOOLS, &m_show_microwave_tools ); config->Read( SHOW_LAYER_MANAGER_TOOLS, &m_show_layer_manager_tools ); // WxWidgets 2.9.1 seems call setlocale( LC_NUMERIC, "" ) // when reading doubles in config, // but forget to back to current locale. So we call SetLocaleTo_Default SetLocaleTo_Default( ); }
void PCB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) { PCB_BASE_FRAME::LoadSettings( aCfg ); wxConfigLoadSetups( aCfg, GetConfigurationSettings() ); double dtmp; aCfg->Read( OPTKEY_DEFAULT_LINEWIDTH_VALUE, &dtmp, 0.1 ); // stored in mm if( dtmp < 0.01 ) dtmp = 0.01; if( dtmp > 5.0 ) dtmp = 5.0; g_DrawDefaultLineThickness = Millimeter2iu( dtmp ); long tmp; aCfg->Read( PCB_SHOW_FULL_RATSNET_OPT, &tmp ); GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, tmp); aCfg->Read( PCB_MAGNETIC_PADS_OPT, &g_MagneticPadOption ); aCfg->Read( PCB_MAGNETIC_TRACKS_OPT, &g_MagneticTrackOption ); aCfg->Read( SHOW_MICROWAVE_TOOLS, &m_show_microwave_tools ); aCfg->Read( SHOW_LAYER_MANAGER_TOOLS, &m_show_layer_manager_tools ); // WxWidgets 2.9.1 seems call setlocale( LC_NUMERIC, "" ) // when reading doubles in cfg, // but forget to back to current locale. So we call SetLocaleTo_Default SetLocaleTo_Default( ); }
void PCB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) { PCB_BASE_FRAME::LoadSettings( aCfg ); wxConfigLoadSetups( aCfg, GetConfigurationSettings() ); double dtmp; aCfg->Read( OPTKEY_DEFAULT_LINEWIDTH_VALUE, &dtmp, 0.1 ); // stored in mm if( dtmp < 0.01 ) dtmp = 0.01; if( dtmp > 5.0 ) dtmp = 5.0; g_DrawDefaultLineThickness = Millimeter2iu( dtmp ); long tmp; aCfg->Read( PCB_SHOW_FULL_RATSNET_OPT, &tmp ); GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, tmp); aCfg->Read( PCB_MAGNETIC_PADS_OPT, &g_MagneticPadOption ); aCfg->Read( PCB_MAGNETIC_TRACKS_OPT, &g_MagneticTrackOption ); aCfg->Read( SHOW_MICROWAVE_TOOLS, &m_show_microwave_tools ); aCfg->Read( SHOW_LAYER_MANAGER_TOOLS, &m_show_layer_manager_tools ); }
TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, TEXT_TYPE text_type ) : BOARD_ITEM( parent, PCB_MODULE_TEXT_T ), EDA_TEXT() { MODULE* module = static_cast<MODULE*>( m_Parent ); m_Type = text_type; m_unlocked = false; // Set text thickness to a default value SetThickness( Millimeter2iu( 0.15 ) ); SetLayer( F_SilkS ); // Set position and give a default layer if a valid parent footprint exists if( module && ( module->Type() == PCB_MODULE_T ) ) { SetTextPos( module->GetPosition() ); if( IsBackLayer( module->GetLayer() ) ) { SetLayer( B_SilkS ); SetMirrored( true ); } } SetDrawCoord(); }
unsigned int GERBER_DRAW_ITEM::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const { // DCodes will be shown only if zoom is appropriate: // Returns the level of detail of the item. // A level of detail (LOD) is the minimal VIEW scale that // is sufficient for an item to be shown on a given layer. if( IsDCodeLayer( aLayer ) ) { int size = 0; switch( m_Shape ) { case GBR_SPOT_MACRO: size = GetDcodeDescr()->GetMacro()->GetBoundingBox().GetWidth(); break; case GBR_ARC: size = GetLineLength( m_Start, m_ArcCentre ); break; default: size = m_Size.x; } // the level of details is chosen experimentally, to show // only a readable text: const int level = Millimeter2iu( 4 ); return ( level / ( size + 1 ) ); } // Other layers are shown without any conditions return 0; }
TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, TEXT_TYPE text_type ) : BOARD_ITEM( parent, PCB_MODULE_TEXT_T ), EDA_TEXT() { MODULE* module = (MODULE*) m_Parent; m_Type = text_type; m_NoShow = false; // Set text tickness to a default value m_Thickness = Millimeter2iu( 0.15 ); SetLayer( SILKSCREEN_N_FRONT ); if( module && ( module->Type() == PCB_MODULE_T ) ) { m_Pos = module->GetPosition(); if( IsBackLayer( module->GetLayer() ) ) { SetLayer( SILKSCREEN_N_BACK ); m_Mirror = true; } else { SetLayer( SILKSCREEN_N_FRONT ); m_Mirror = false; } } }
TRACK::TRACK( BOARD_ITEM* aParent, KICAD_T idtype ) : BOARD_CONNECTED_ITEM( aParent, idtype ) { m_Width = Millimeter2iu( 0.2 ); start = end = NULL; m_Param = 0; }
DIMENSION::DIMENSION( BOARD_ITEM* aParent ) : BOARD_ITEM( aParent, PCB_DIMENSION_T ), m_Width( Millimeter2iu( 0.2 ) ), m_Unit( INCHES ), m_Value( 0 ), m_Height( 0 ), m_Text( this ) { m_Layer = Dwgs_User; m_Shape = 0; }
PNS_PCBNEW_CLEARANCE_RESOLVER::PNS_PCBNEW_CLEARANCE_RESOLVER( PNS_ROUTER* aRouter ) : m_router( aRouter ) { BOARD* brd = m_router->GetBoard(); m_clearanceCache.resize( brd->GetNetCount() ); m_useDpGap = false; for( unsigned int i = 0; i < brd->GetNetCount(); i++ ) { NETINFO_ITEM* ni = brd->FindNet( i ); if( ni == NULL ) continue; CLEARANCE_ENT ent; ent.coupledNet = m_router->GetWorld()->PairedNet( i ); wxString netClassName = ni->GetClassName(); NETCLASSPTR nc = brd->GetDesignSettings().m_NetClasses.Find( netClassName ); int clearance = nc->GetClearance(); ent.clearance = clearance; m_clearanceCache[i] = ent; TRACE( 1, "Add net %d netclass %s clearance %d", i % netClassName.mb_str() % clearance ); } m_overrideEnabled = false; m_defaultClearance = Millimeter2iu( 0.254 ); // aBoard->m_NetClasses.Find ("Default clearance")->GetClearance(); m_overrideNetA = 0; m_overrideNetB = 0; m_overrideClearance = 0; }
bool ZONE_CONTAINER::HitTestForEdge( const wxPoint& refPos ) { int distmax = Millimeter2iu( MAX_DIST_IN_MM ); m_CornerSelection = m_Poly->HitTestForEdge( refPos, distmax ); return m_CornerSelection >= 0; }
wxPoint BOARD_NETLIST_UPDATER::estimateComponentInsertionPosition() { wxPoint bestPosition; if( !m_board->IsEmpty() ) { // Position new components below any existing board features. EDA_RECT bbox = m_board->ComputeBoundingBox( true ); if( bbox.GetWidth() || bbox.GetHeight() ) { bestPosition.x = bbox.Centre().x; bestPosition.y = bbox.GetBottom() + Millimeter2iu( 10 ); } } else { // Position new components in the center of the page when the board is empty. wxSize pageSize = m_board->GetPageSettings().GetSizeIU(); bestPosition.x = pageSize.GetWidth() / 2; bestPosition.y = pageSize.GetHeight() / 2; } return bestPosition; }
DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, D_PAD* aPad ) : DIALOG_PAD_PROPERTIES_BASE( aParent ), m_OrientValidator( 1, &m_OrientValue ) { m_canUpdate = false; m_parent = aParent; m_currentPad = aPad; // aPad can be NULL, if the dialog is called // from the footprint editor to set default pad setup m_board = m_parent->GetBoard(); m_OrientValidator.SetRange( -360.0, 360.0 ); m_PadOrientCtrl->SetValidator( m_OrientValidator ); m_OrientValidator.SetWindow( m_PadOrientCtrl ); m_padMaster = &m_parent->GetDesignSettings().m_Pad_Master; m_dummyPad = new D_PAD( (MODULE*) NULL ); if( aPad ) *m_dummyPad = *aPad; else // We are editing a "master" pad, i.e. a template to create new pads *m_dummyPad = *m_padMaster; // Show the X and Y axis. It is usefull because pad shape can have an offset // or be a complex shape. m_axisOrigin = new KIGFX::ORIGIN_VIEWITEM( KIGFX::COLOR4D(0.0, 0.0, 0.8, 1.0), KIGFX::ORIGIN_VIEWITEM::CROSS, Millimeter2iu( 0.2 ), VECTOR2D( m_dummyPad->GetPosition() ) ); m_axisOrigin->SetDrawAtZero( true ); if( m_parent->IsGalCanvasActive() ) { m_panelShowPadGal->UseColorScheme( m_board->GetColorsSettings() ); m_panelShowPadGal->SwitchBackend( m_parent->GetGalCanvas()->GetBackend() ); m_panelShowPadGal->Show(); m_panelShowPad->Hide(); m_panelShowPadGal->GetView()->Add( m_dummyPad ); m_panelShowPadGal->GetView()->Add( m_axisOrigin ); m_panelShowPadGal->StartDrawing(); Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_PAD_PROPERTIES::OnResize ) ); } else { m_panelShowPad->Show(); m_panelShowPadGal->Hide(); } initValues(); TransferDataToWindow(); m_sdbSizerOK->SetDefault(); m_PadNumCtrl->SetFocus(); m_canUpdate = true; FixOSXCancelButtonIssue(); // Now all widgets have the size fixed, call FinishDialogSettings FinishDialogSettings(); }
void FOOTPRINT_EDIT_FRAME::PrintPage( wxDC* aDC, LSET aPrintMaskLayer, bool aPrintMirrorMode, void * aData) { const GR_DRAWMODE drawmode = (GR_DRAWMODE) 0; int defaultPenSize = Millimeter2iu( 0.2 ); DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions(); DISPLAY_OPTIONS save_opt; PRINT_PARAMETERS * printParameters = (PRINT_PARAMETERS*) aData; // can be null PRINT_PARAMETERS::DrillShapeOptT drillShapeOpt = PRINT_PARAMETERS::FULL_DRILL_SHAPE; if( printParameters ) defaultPenSize = printParameters->m_PenDefaultSize; save_opt = *displ_opts; displ_opts->m_ContrastModeDisplay = false; displ_opts->m_DisplayPadFill = true; displ_opts->m_DisplayViaFill = true; displ_opts->m_DisplayPadNum = false; bool nctmp = GetBoard()->IsElementVisible(NO_CONNECTS_VISIBLE); GetBoard()->SetElementVisibility(NO_CONNECTS_VISIBLE, false); displ_opts->m_DisplayPadIsol = false; displ_opts->m_DisplayModEdgeFill = FILLED; displ_opts->m_DisplayModTextFill = FILLED; displ_opts->m_DisplayPcbTrackFill = true; displ_opts->m_ShowTrackClearanceMode = DO_NOT_SHOW_CLEARANCE; displ_opts->m_DisplayDrawItemsFill = FILLED; displ_opts->m_DisplayZonesMode = 0; displ_opts->m_DisplayNetNamesMode = 0; m_canvas->SetPrintMirrored( aPrintMirrorMode ); // Draw footprints, this is done at last in order to print the pad holes in // white after the tracks and zones int tmp = D_PAD::m_PadSketchModePenSize; D_PAD::m_PadSketchModePenSize = defaultPenSize; wxSize pageSizeIU = GetPageSizeIU() / 2; wxPoint offset( pageSizeIU.x, pageSizeIU.y ); for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() ) { module->Move( offset ); Print_Module( m_canvas, aDC, module, drawmode, aPrintMaskLayer, drillShapeOpt ); module->Move( -offset ); } D_PAD::m_PadSketchModePenSize = tmp; m_canvas->SetPrintMirrored( false ); *displ_opts = save_opt; GetBoard()->SetElementVisibility( NO_CONNECTS_VISIBLE, nctmp ); }
/* This function is used to extract a board outlines (3D view, automatic zones build ...) * Any closed outline inside the main outline is a hole * All contours should be closed, i.e. valid closed polygon vertices */ bool BuildBoardPolygonOutlines( BOARD* aBoard, SHAPE_POLY_SET& aOutlines, wxString* aErrorText, unsigned int aTolerance, wxPoint* aErrorLocation ) { PCB_TYPE_COLLECTOR items; // Get all the DRAWSEGMENTS and module graphics into 'items', // then keep only those on layer == Edge_Cuts. static const KICAD_T scan_graphics[] = { PCB_LINE_T, PCB_MODULE_EDGE_T, EOT }; items.Collect( aBoard, scan_graphics ); // Make a working copy of aSegList, because the list is modified during calculations std::vector< DRAWSEGMENT* > segList; for( int ii = 0; ii < items.GetCount(); ii++ ) { if( items[ii]->GetLayer() == Edge_Cuts ) segList.push_back( static_cast< DRAWSEGMENT* >( items[ii] ) ); } bool success = ConvertOutlineToPolygon( segList, aOutlines, aErrorText, aTolerance, aErrorLocation ); if( !success || !aOutlines.OutlineCount() ) { // Creates a valid polygon outline is not possible. // So uses the board edge cuts bounding box to create a // rectangular outline // When no edge cuts items, build a contour // from global bounding box EDA_RECT bbbox = aBoard->GetBoardEdgesBoundingBox(); // If null area, uses the global bounding box. if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) bbbox = aBoard->ComputeBoundingBox(); // Ensure non null area. If happen, gives a minimal size. if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) bbbox.Inflate( Millimeter2iu( 1.0 ) ); aOutlines.RemoveAllContours(); aOutlines.NewOutline(); wxPoint corner; aOutlines.Append( bbbox.GetOrigin() ); corner.x = bbbox.GetOrigin().x; corner.y = bbbox.GetEnd().y; aOutlines.Append( corner ); aOutlines.Append( bbbox.GetEnd() ); corner.x = bbbox.GetEnd().x; corner.y = bbbox.GetOrigin().y; aOutlines.Append( corner ); } return success; }
double StrToDoublePrecisionUnits( wxString aStr, char aAxe, wxString aActualConversion ) { wxString ls; double i; char u; ls = aStr; ls.Trim( true ); ls.Trim( false ); if( ls.Len() > 0 ) { u = ls[ls.Len() - 1]; while( ls.Len() > 0 && !( ls[ls.Len() - 1] == wxT( '.' ) || ls[ls.Len() - 1] == wxT( ',' ) || (ls[ls.Len() - 1] >= wxT( '0' ) && ls[ls.Len() - 1] <= wxT( '9' ) ) ) ) { ls = ls.Left( ls.Len() - 1 ); } while( ls.Len() > 0 && !( ls[0] == wxT( '-' ) || ls[0] == wxT( '+' ) || ls[0] == wxT( '.' ) || ls[0] == wxT( ',' ) || (ls[0] >= wxT( '0' ) && ls[0] <= wxT( '9' ) ) ) ) { ls = ls.Mid( 1 ); } if( u == wxT( 'm' ) ) { ls.ToDouble( &i ); #ifdef PCAD2KICAD_SCALE_SCH_TO_INCH_GRID if( aActualConversion == wxT( "SCH" ) || aActualConversion == wxT( "SCHLIB" ) ) i = i * (0.0254 / 0.025); #endif i = Millimeter2iu( i ); } else { ls.ToDouble( &i ); i = Mils2iu( i ); } } else i = 0.0; if( ( aActualConversion == wxT( "PCB" ) || aActualConversion == wxT( "SCH" ) ) && aAxe == wxT( 'Y' ) ) return -i; else return i; // Y axe is mirrored compared to P-Cad }
DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* aParent, KICAD_T idtype ) : BOARD_ITEM( aParent, idtype ) { m_Type = 0; m_Angle = 0; m_Flags = 0; m_Shape = S_SEGMENT; m_Width = Millimeter2iu( 0.15 ); // Gives a decent width }
TRACK::TRACK( BOARD_ITEM* aParent, KICAD_T idtype ) : BOARD_CONNECTED_ITEM( aParent, idtype ) { m_Width = Millimeter2iu( 0.2 ); m_Shape = S_SEGMENT; start = end = NULL; SetDrillDefault(); m_Param = 0; }
PNS_PCBNEW_RULE_RESOLVER::PNS_PCBNEW_RULE_RESOLVER( BOARD* aBoard, PNS::ROUTER* aRouter ) : m_router( aRouter ), m_board( aBoard ) { PNS::NODE* world = m_router->GetWorld(); PNS::TOPOLOGY topo( world ); m_netClearanceCache.resize( m_board->GetNetCount() ); // Build clearance cache for net classes for( unsigned int i = 0; i < m_board->GetNetCount(); i++ ) { NETINFO_ITEM* ni = m_board->FindNet( i ); if( ni == NULL ) continue; CLEARANCE_ENT ent; ent.coupledNet = DpCoupledNet( i ); wxString netClassName = ni->GetClassName(); NETCLASSPTR nc = m_board->GetDesignSettings().m_NetClasses.Find( netClassName ); int clearance = nc->GetClearance(); ent.clearance = clearance; m_netClearanceCache[i] = ent; wxLogTrace( "PNS", "Add net %u netclass %s clearance %d", i, netClassName.mb_str(), clearance ); } // Build clearance cache for pads for( MODULE* mod = m_board->m_Modules; mod ; mod = mod->Next() ) { auto moduleClearance = mod->GetLocalClearance(); for( D_PAD* pad = mod->PadsList(); pad; pad = pad->Next() ) { int padClearance = pad->GetLocalClearance(); if( padClearance > 0 ) m_localClearanceCache[ pad ] = padClearance; else if( moduleClearance > 0 ) m_localClearanceCache[ pad ] = moduleClearance; } } //printf("DefaultCL : %d\n", m_board->GetDesignSettings().m_NetClasses.Find ("Default clearance")->GetClearance()); m_overrideEnabled = false; m_defaultClearance = Millimeter2iu( 0.254 ); // m_board->m_NetClasses.Find ("Default clearance")->GetClearance(); m_overrideNetA = 0; m_overrideNetB = 0; m_overrideClearance = 0; m_useDpGap = false; }
BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() : m_Pad_Master( 0 ) { m_EnabledLayers = ALL_LAYERS; // All layers enabled at first. // SetCopperLayerCount() will adjust this. SetVisibleLayers( FULL_LAYERS ); // set all but hidden text as visible. m_VisibleElements = ~( 1 << MOD_TEXT_INVISIBLE ); SetCopperLayerCount( 2 ); // Default design is a double sided board // via type (VIA_BLIND_BURIED, VIA_THROUGH VIA_MICROVIA). m_CurrentViaType = VIA_THROUGH; // if true, when creating a new track starting on an existing track, use this track width m_UseConnectedTrackWidth = false; m_BlindBuriedViaAllowed = false; // true to allow blind/buried vias m_MicroViasAllowed = false; // true to allow micro vias m_DrawSegmentWidth = DEFAULT_GRAPHIC_THICKNESS; // current graphic line width (not EDGE layer) m_EdgeSegmentWidth = DEFAULT_PCB_EDGE_THICKNESS; // current graphic line width (EDGE layer only) m_PcbTextWidth = DEFAULT_TEXT_PCB_THICKNESS; // current Pcb (not module) Text width m_PcbTextSize = wxSize( DEFAULT_TEXT_PCB_SIZE, DEFAULT_TEXT_PCB_SIZE ); // current Pcb (not module) Text size m_TrackMinWidth = DMils2iu( 100 ); // track min value for width ((min copper size value m_ViasMinSize = DMils2iu( 350 ); // vias (not micro vias) min diameter m_ViasMinDrill = DMils2iu( 200 ); // vias (not micro vias) min drill diameter m_MicroViasMinSize = DMils2iu( 200 ); // micro vias (not vias) min diameter m_MicroViasMinDrill = DMils2iu( 50 ); // micro vias (not vias) min drill diameter // Global mask margins: m_SolderMaskMargin = DEFAULT_SOLDERMASK_CLEARANCE; // Solder mask margin m_SolderMaskMinWidth = DEFAULT_SOLDERMASK_MIN_WIDTH; // Solder mask min width m_SolderPasteMargin = 0; // Solder paste margin absolute value m_SolderPasteMarginRatio = 0.0; // Solder pask margin ratio value of pad size // The final margin is the sum of these 2 values // Usually < 0 because the mask is smaller than pad m_ModuleTextSize = wxSize( DEFAULT_TEXT_MODULE_SIZE, DEFAULT_TEXT_MODULE_SIZE ); m_ModuleTextWidth = DEFAULT_GR_MODULE_THICKNESS; m_ModuleSegmentWidth = DEFAULT_GR_MODULE_THICKNESS; // Layer thickness for 3D viewer m_boardThickness = Millimeter2iu( DEFAULT_BOARD_THICKNESS_MM ); }
void ReadParam( wxConfigBase* aConfig ) const override { if( !m_Pt_param || !aConfig ) return; m_Pt_param->clear(); for( int index = 1; ; ++index ) { double diameter = 0.0, drill = 0.0; wxString key = ViaDiameterKey; if( !aConfig->Read( key << index, &diameter ) ) break; key = ViaDrillKey; drill = aConfig->ReadDouble( key << index, 0.0 ); m_Pt_param->emplace_back( VIA_DIMENSION( Millimeter2iu( diameter ), Millimeter2iu( drill ) ) ); } }
void D_PAD::AppendConfigs( PARAM_CFG_ARRAY* aResult ) { aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadDrill" ), &m_Drill.x, Millimeter2iu( 0.6 ), Millimeter2iu( 0.1 ), Millimeter2iu( 10.0 ), NULL, MM_PER_IU ) ); aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadSizeH" ), &m_Size.x, Millimeter2iu( 1.4 ), Millimeter2iu( 0.1 ), Millimeter2iu( 20.0 ), NULL, MM_PER_IU ) ); aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadSizeV" ), &m_Size.y, Millimeter2iu( 1.4 ), Millimeter2iu( 0.1 ), Millimeter2iu( 20.0 ), NULL, MM_PER_IU ) ); }
unsigned int D_PAD::ViewGetLOD( int aLayer ) const { // Netnames will be shown only if zoom is appropriate if( IsNetnameLayer( aLayer ) ) { // Pad sizes can be zero briefly when someone is typing a number like "0.5" in the pad properties dialog. // Fail gracefully if this happens. if( ( m_Size.x == 0 ) && ( m_Size.y == 0 ) ) return UINT_MAX; return ( Millimeter2iu( 100 ) / std::max( m_Size.x, m_Size.y ) ); } // Other layers are shown without any conditions return 0; }
unsigned int D_PAD::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const { if( aView->GetPrintMode() > 0 ) // In printing mode the pad is always drawable return 0; const int HIDE = std::numeric_limits<unsigned int>::max(); BOARD* board = GetBoard(); // Handle Render tab switches if( ( GetAttribute() == PAD_ATTRIB_STANDARD || GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED ) && !aView->IsLayerVisible( LAYER_PADS_TH ) ) return HIDE; if( !IsFlipped() && !aView->IsLayerVisible( LAYER_MOD_FR ) ) return HIDE; if( IsFlipped() && !aView->IsLayerVisible( LAYER_MOD_BK ) ) return HIDE; if( IsFrontLayer( ( PCB_LAYER_ID )aLayer ) && !aView->IsLayerVisible( LAYER_PAD_FR ) ) return HIDE; if( IsBackLayer( ( PCB_LAYER_ID )aLayer ) && !aView->IsLayerVisible( LAYER_PAD_BK ) ) return HIDE; // Only draw the pad if at least one of the layers it crosses is being displayed if( board && !( board->GetVisibleLayers() & GetLayerSet() ).any() ) return HIDE; // Netnames will be shown only if zoom is appropriate if( IsNetnameLayer( aLayer ) ) { int divisor = std::max( m_Size.x, m_Size.y ); // Pad sizes can be zero briefly when someone is typing a number like "0.5" // in the pad properties dialog if( divisor == 0 ) return HIDE; return ( Millimeter2iu( 10 ) / divisor ); } // Other layers are shown without any conditions return 0; }