void PCB_BASE_FRAME::SetCurItem( BOARD_ITEM* aItem, bool aDisplayInfo ) { GetScreen()->SetCurItem( aItem ); if( aItem ) { if( aDisplayInfo ) { MSG_PANEL_ITEMS items; aItem->GetMsgPanelInfo( items ); SetMsgPanel( items ); } #if 0 && defined(DEBUG) aItem->Show( 0, std::cout ); #endif } else { // we can use either of these two: MSG_PANEL_ITEMS items; m_Pcb->GetMsgPanelInfo( items ); // show the BOARD stuff SetMsgPanel( items ); #if 0 && defined(DEBUG) std::cout << "SetCurItem(NULL)\n"; #endif } }
// Function to initialize the "move pad" command void PCB_BASE_FRAME::StartMovePad( D_PAD* aPad, wxDC* aDC, bool aDragConnectedTracks ) { if( aPad == NULL ) return; s_CurrentSelectedPad = aPad; Pad_OldPos = aPad->GetPosition(); SetMsgPanel( aPad ); m_canvas->SetMouseCapture( Show_Pad_Move, Abort_Move_Pad ); // Draw the pad, in SKETCH mode aPad->Draw( m_canvas, aDC, GR_XOR ); aPad->SetFlags( IS_MOVED ); aPad->Draw( m_canvas, aDC, GR_XOR ); EraseDragList(); // Build the list of track segments to drag if the command is a drag pad if( aDragConnectedTracks ) { DRAG_LIST drglist( GetBoard() ); drglist.BuildDragListe( aPad ); UndrawAndMarkSegmentsToDrag( m_canvas, aDC ); } }
LIB_ITEM* LIB_EDIT_FRAME::locateItem( const wxPoint& aPosition, const KICAD_T aFilterList[] ) { if( m_component == NULL ) return NULL; LIB_ITEM* item = NULL; m_collectedItems.Collect( m_component->GetDrawItemList(), aFilterList, aPosition, m_unit, m_convert ); if( m_collectedItems.GetCount() == 0 ) { ClearMsgPanel(); } else if( m_collectedItems.GetCount() == 1 ) { item = m_collectedItems[0]; } else { if( item == NULL ) { wxASSERT_MSG( m_collectedItems.GetCount() <= MAX_SELECT_ITEM_IDS, wxT( "Select item clarification context menu size limit exceeded." ) ); wxMenu selectMenu; wxMenuItem* title = new wxMenuItem( &selectMenu, wxID_NONE, _( "Clarify Selection" ) ); selectMenu.Append( title ); selectMenu.AppendSeparator(); for( int i = 0; i < m_collectedItems.GetCount() && i < MAX_SELECT_ITEM_IDS; i++ ) { wxString text = m_collectedItems[i]->GetSelectMenuText(); BITMAP_DEF xpm = m_collectedItems[i]->GetMenuImage(); AddMenuItem( &selectMenu, ID_SELECT_ITEM_START + i, text, KiBitmap( xpm ) ); } // Set to NULL in case user aborts the clarification context menu. m_drawItem = NULL; m_canvas->SetAbortRequest( true ); // Changed to false if an item is selected PopupMenu( &selectMenu ); m_canvas->MoveCursorToCrossHair(); item = m_drawItem; } } if( item ) { MSG_PANEL_ITEMS items; item->GetMsgPanelInfo( items ); SetMsgPanel( items ); } else { ClearMsgPanel(); } return item; }
/* * FOOTPRINT_EDIT_FRAME::Function PushPadProperties * Function to change pad caracteristics for the footprint. * Options are set by the opened dialog. */ void FOOTPRINT_EDIT_FRAME::PushPadProperties( D_PAD* aPad ) { if( !aPad ) return; MODULE* module = aPad->GetParent(); if( !module ) return; SetMsgPanel( module ); DIALOG_PUSH_PAD_PROPERTIES dlg( this ); int retCode = dlg.ShowModal(); if( retCode == wxID_CANCEL ) return; bool edit_Same_Modules = ( retCode == 1 ); DoPushPadProperties( aPad, edit_Same_Modules, DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Shape_Filter, DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Orient_Filter, DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Layer_Filter, false ); }
void EDA_DRAW_FRAME::UpdateMsgPanel() { EDA_ITEM* item = GetScreen()->GetCurItem(); if( item ) SetMsgPanel( item ); }
void PCB_EDIT_FRAME::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ) { int angle = 900; if( TextePcb == NULL ) return; // Erase previous text: TextePcb->Draw( m_canvas, DC, GR_XOR ); TextePcb->SetOrientation( TextePcb->GetOrientation() + angle ); // Redraw text in new position: TextePcb->Draw( m_canvas, DC, GR_XOR ); SetMsgPanel( TextePcb ); if( TextePcb->GetFlags() == 0 ) // i.e. not edited, or moved SaveCopyInUndoList( TextePcb, UR_ROTATED, TextePcb->GetTextPosition() ); else // set flag edit, to show it was a complex command TextePcb->SetFlags( IN_EDIT ); OnModify(); #ifdef USE_WX_OVERLAY m_canvas->Refresh(); #endif }
void PCB_BASE_FRAME::RotateTextModule( TEXTE_MODULE* Text, wxDC* DC ) { if( Text == NULL ) return; MODULE* module = (MODULE*) Text->GetParent(); if( module && module->GetFlags() == 0 && Text->GetFlags() == 0 ) // prepare undo command { if( IsType( FRAME_PCB ) ) SaveCopyInUndoList( module, UR_CHANGED ); } // we expect MoveVector to be (0,0) if there is no move in progress Text->Draw( m_canvas, DC, GR_XOR, MoveVector ); Text->SetTextAngle( Text->GetTextAngle() + 900 ); Text->Draw( m_canvas, DC, GR_XOR, MoveVector ); SetMsgPanel( Text ); if( module ) module->SetLastEditTime(); OnModify(); }
/* Add a new graphical text to the active module (footprint) * Note there always are 2 mandatory texts: reference and value. * New texts have the member TEXTE_MODULE.GetType() set to TEXT_is_DIVERS */ TEXTE_MODULE* FOOTPRINT_EDIT_FRAME::CreateTextModule( MODULE* aModule, wxDC* aDC ) { TEXTE_MODULE* text = new TEXTE_MODULE( aModule ); text->SetFlags( IS_NEW ); if( LSET::AllTechMask().test( GetActiveLayer() ) ) // i.e. a possible layer for a text text->SetLayer( GetActiveLayer() ); InstallTextOptionsFrame( text, NULL ); if( text->GetText().IsEmpty() ) { delete text; return NULL; } // Add the new text object to the beginning of the footprint draw list. if( aModule ) aModule->GraphicalItemsList().PushFront( text ); text->ClearFlags(); if( aDC ) text->Draw( m_canvas, aDC, GR_OR ); SetMsgPanel( text ); return text; }
void EDA_DRAW_FRAME::SetMsgPanel( EDA_ITEM* aItem ) { wxCHECK_RET( aItem != NULL, wxT( "Invalid EDA_ITEM pointer. Bad programmer." ) ); MSG_PANEL_ITEMS items; aItem->GetMsgPanelInfo( items ); SetMsgPanel( items ); }
void EDA_DRAW_FRAME::unitsChangeRefresh() { UpdateStatusBar(); EDA_ITEM* item = GetScreen()->GetCurItem(); if( item ) SetMsgPanel( item ); }
MODULE* PCB_BASE_FRAME::Create_1_Module( const wxString& aModuleName ) { MODULE* module; wxString moduleName; wxPoint newpos; moduleName = aModuleName; // Ask for the new module reference if( moduleName.IsEmpty() ) { wxTextEntryDialog dlg( this, FMT_MOD_REF, FMT_MOD_CREATE, moduleName ); if( dlg.ShowModal() != wxID_OK ) return NULL; //Aborted by user moduleName = dlg.GetValue(); } moduleName.Trim( true ); moduleName.Trim( false ); if( moduleName.IsEmpty( ) ) { DisplayInfoMessage( this, FMT_NO_REF_ABORTED ); return NULL; } // Creates the new module and add it to the head of the linked list of modules module = new MODULE( GetBoard() ); GetBoard()->Add( module ); // Update parameters: position, timestamp ... newpos = GetScreen()->GetCrossHairPosition(); module->SetPosition( newpos ); module->SetLastEditTime(); // Update its name in lib module->m_LibRef = moduleName; // Update reference: module->m_Reference->m_Text = moduleName; module->m_Reference->SetThickness( GetDesignSettings().m_ModuleTextWidth ); module->m_Reference->SetSize( GetDesignSettings().m_ModuleTextSize ); // Set the value field to a default value module->m_Value->m_Text = wxT( "VAL**" ); module->m_Value->SetThickness( GetDesignSettings().m_ModuleTextWidth ); module->m_Value->SetSize( GetDesignSettings().m_ModuleTextSize ); module->SetPosition( wxPoint( 0, 0 ) ); SetMsgPanel( module ); return module; }
/* * Exports the current pad settings to board design settings. */ void PCB_BASE_FRAME::Export_Pad_Settings( D_PAD* aPad ) { if( aPad == NULL ) return; SetMsgPanel( aPad ); D_PAD& masterPad = GetDesignSettings().m_Pad_Master; masterPad.ImportSettingsFromMaster( *aPad ); }
/** * Function RedrawActiveWindow * Display the current selected component. * If the component is an alias, the ROOT component is displayed * */ void FOOTPRINT_WIZARD_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) { if( !GetBoard() ) return; m_canvas->DrawBackGround( DC ); GetBoard()->Draw( m_canvas, DC, GR_COPY ); MODULE* module = GetBoard()->m_Modules; if( module ) SetMsgPanel( module ); m_canvas->DrawCrossHair( DC ); ClearMsgPanel(); if( module ) SetMsgPanel( module ); }
// Start move of a graphic element type DRAWSEGMENT void PCB_EDIT_FRAME::Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC ) { if( drawitem == NULL ) return; drawitem->Draw( m_canvas, DC, GR_XOR ); drawitem->SetFlags( IS_MOVED ); s_InitialPosition = s_LastPosition = GetCrossHairPosition(); SetMsgPanel( drawitem ); m_canvas->SetMouseCapture( Move_Segment, Abort_EditEdge ); SetCurItem( drawitem ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); }
/* localize a gerber item and return a pointer to it. * Display info about this item */ GERBER_DRAW_ITEM* GERBVIEW_FRAME::Locate( const wxPoint& aPosition, int aTypeloc ) { m_messagePanel->EraseMsgBox(); wxPoint ref = aPosition; bool found = false; if( aTypeloc == CURSEUR_ON_GRILLE ) ref = GetNearestGridPosition( ref ); int layer = getActiveLayer(); // Search first on active layer GERBER_DRAW_ITEM* gerb_item = GetItemsList(); for( ; gerb_item; gerb_item = gerb_item->Next() ) { if( gerb_item->GetLayer()!= layer ) continue; if( gerb_item->HitTest( ref ) ) { found = true; break; } } if( !found ) // Search on all layers { for( gerb_item = GetItemsList(); gerb_item; gerb_item = gerb_item->Next() ) { if( gerb_item->HitTest( ref ) ) { found = true; break; } } } if( found ) { MSG_PANEL_ITEMS items; gerb_item->GetMsgPanelInfo( items ); SetMsgPanel( items ); return gerb_item; } return NULL; }
/** * Prepare the displacement of a pin * * Locate the pin pointed to by the cursor, and set the cursor management * function move the pin. */ void LIB_EDIT_FRAME::StartMovePin( wxDC* DC ) { LIB_PIN* cur_pin = (LIB_PIN*) m_drawItem; wxPoint startPos; TempCopyComponent(); LIB_PART* part = GetCurPart(); // Mark pins for moving. for( LIB_PIN* pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) ) { pin->ClearFlags(); if( pin == cur_pin ) continue; if( pin->GetPosition() == cur_pin->GetPosition() && pin->GetOrientation() == cur_pin->GetOrientation() && SynchronizePins() ) { pin->SetFlags( IS_LINKED | IS_MOVED ); } } cur_pin->SetFlags( IS_LINKED | IS_MOVED ); PinPreviousPos = OldPos = cur_pin->GetPosition(); startPos.x = OldPos.x; startPos.y = -OldPos.y; // m_canvas->CrossHairOff( DC ); SetCrossHairPosition( startPos ); m_canvas->MoveCursorToCrossHair(); MSG_PANEL_ITEMS items; cur_pin->GetMsgPanelInfo( items ); SetMsgPanel( items ); m_canvas->SetMouseCapture( DrawMovePin, AbortPinMove ); // m_canvas->CrossHairOn( DC ); // Refresh the screen to avoid color artifacts when drawing // the pin in Edit mode and moving it from its start position m_canvas->Refresh(); }
void GERBVIEW_FRAME::SetCurItem( GERBER_DRAW_ITEM* aItem, bool aDisplayInfo ) { GetScreen()->SetCurItem( aItem ); if( aItem ) { if( aDisplayInfo ) { MSG_PANEL_ITEMS items; aItem->GetMsgPanelInfo( items ); SetMsgPanel( items ); } } else { EraseMsgBox(); } }
void FOOTPRINT_EDIT_FRAME::UpdateMsgPanel() { // If a item is currently selected, displays the item info. // If nothing selected, display the current footprint info BOARD_ITEM* item = GetScreen()->GetCurItem(); if( !item ) item = GetBoard()->m_Modules; MSG_PANEL_ITEMS items; if( item ) { item->GetMsgPanelInfo( m_UserUnits, items ); SetMsgPanel( items ); } else ClearMsgPanel(); }
void DISPLAY_FOOTPRINTS_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) { if( !GetBoard() ) return; m_canvas->DrawBackGround( DC ); GetBoard()->Draw( m_canvas, DC, GR_COPY ); MODULE* Module = GetBoard()->m_Modules; if ( Module ) { MSG_PANEL_ITEMS items; Module->GetMsgPanelInfo( items ); SetMsgPanel( items ); } m_canvas->DrawCrossHair( DC ); }
void PCB_EDIT_FRAME::BeginMoveDimensionText( DIMENSION* aItem, wxDC* DC ) { if( aItem == NULL ) return; // Store the initial position for undo/abort command initialTextPosition = aItem->Text().GetTextPosition(); aItem->Draw( m_canvas, DC, GR_XOR ); aItem->SetFlags( IS_MOVED ); SetMsgPanel( aItem ); SetCrossHairPosition( aItem->Text().GetTextPosition() ); m_canvas->MoveCursorToCrossHair(); m_canvas->SetMouseCapture( MoveDimensionText, AbortMoveDimensionText ); SetCurItem( aItem ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); }
/* Add a new pad to aModule. */ void PCB_BASE_FRAME::AddPad( MODULE* aModule, bool draw ) { m_Pcb->m_Status_Pcb = 0; aModule->SetLastEditTime(); D_PAD* pad = new D_PAD( aModule ); // Add the new pad to end of the module pad list. aModule->Pads().PushBack( pad ); // Update the pad properties, // and keep NETINFO_LIST::ORPHANED as net info // which is the default when nets cannot be handled. Import_Pad_Settings( pad, false ); pad->SetPosition( GetCrossHairPosition() ); // Set the relative pad position // ( pad position for module orient, 0, and relative to the module position) wxPoint pos0 = pad->GetPosition() - aModule->GetPosition(); RotatePoint( &pos0, -aModule->GetOrientation() ); pad->SetPos0( pos0 ); /* NPTH pads take empty pad number (since they can't be connected), * other pads get incremented from the last one edited */ wxString padName; if( pad->GetAttribute() != PAD_ATTRIB_HOLE_NOT_PLATED ) { padName = GetNextPadName( GetDesignSettings() .m_Pad_Master.GetPadName() ); } pad->SetPadName( padName ); GetDesignSettings().m_Pad_Master.SetPadName( padName ); aModule->CalculateBoundingBox(); SetMsgPanel( pad ); if( draw ) m_canvas->RefreshDrawingRect( aModule->GetBoundingBox() ); }
void PCB_BASE_FRAME::UpdateMsgPanel() { BOARD_ITEM* item = GetScreen()->GetCurItem(); MSG_PANEL_ITEMS items; if( item ) { item->GetMsgPanelInfo( items ); } else // show general information about the board { if( IsGalCanvasActive() ) GetGalCanvas()->GetMsgPanelInfo( items ); else m_Pcb->GetMsgPanelInfo( items ); } SetMsgPanel( items ); }
/** * Function Compile_Ratsnest * Create the entire board ratsnest. * Must be called after a board change (changes for * pads, footprints or a read netlist ). * @param aDC = the current device context (can be NULL) * @param aDisplayStatus : if true, display the computation results */ void PCB_BASE_FRAME::Compile_Ratsnest( wxDC* aDC, bool aDisplayStatus ) { wxString msg; GetBoard()->m_Status_Pcb = 0; // we want a full ratsnest computation, from the scratch ClearMsgPanel(); // Rebuild the full pads and net info list RecalculateAllTracksNetcode(); if( aDisplayStatus ) { msg.Printf( wxT( " %d" ), m_Pcb->GetPadCount() ); AppendMsgPanel( wxT( "Pads" ), msg, RED ); msg.Printf( wxT( " %d" ), m_Pcb->GetNetCount() ); AppendMsgPanel( wxT( "Nets" ), msg, CYAN ); } /* Compute the full ratsnest * which can be see like all the possible links or logical connections. * some of them are active (no track connected) and others are inactive * (when tracks connect pads) * This full ratsnest is not modified by track editing. * It changes only when a netlist is read, or footprints are modified */ Build_Board_Ratsnest(); // Compute the pad connections due to the existing tracks (physical connections) TestConnections(); /* Compute the active ratsnest, i.e. the unconnected links */ TestForActiveLinksInRatsnest( 0 ); // Redraw the active ratsnest ( if enabled ) if( GetBoard()->IsElementVisible(RATSNEST_VISIBLE) && aDC ) DrawGeneralRatsnest( aDC, 0 ); if( aDisplayStatus ) SetMsgPanel( m_Pcb ); }
void PCB_EDIT_FRAME::Begin_Self( wxDC* DC ) { if( s_inductor_pattern.m_Flag ) { m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCapture( NULL, NULL ); wxString errorMessage; // Prepare parameters for inductor // s_inductor_pattern.m_Start is already initialized, // when s_inductor_pattern.m_Flag == false s_inductor_pattern.m_Width = GetDesignSettings().GetCurrentTrackWidth(); s_inductor_pattern.m_End = GetCrossHairPosition(); MODULE* footprint = CreateMicrowaveInductor( this, errorMessage ); if( footprint ) { SetMsgPanel( footprint ); footprint->Draw( m_canvas, DC, GR_OR ); } else if( !errorMessage.IsEmpty() ) DisplayError( this, errorMessage ); return; } s_inductor_pattern.m_Start = GetCrossHairPosition(); s_inductor_pattern.m_End = s_inductor_pattern.m_Start; s_inductor_pattern.m_Flag = true; // Update the initial coordinates. GetScreen()->m_O_Curseur = GetCrossHairPosition(); UpdateStatusBar(); m_canvas->SetMouseCapture( ShowBoundingBoxMicroWaveInductor, Exit_Self ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); }
void PCB_EDIT_FRAME::FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC ) { if( aTextePcb == NULL ) return; aTextePcb->Draw( m_canvas, aDC, GR_XOR ); aTextePcb->Flip( aTextePcb->GetTextPosition() ); aTextePcb->Draw( m_canvas, aDC, GR_XOR ); SetMsgPanel( aTextePcb ); if( aTextePcb->GetFlags() == 0 ) // i.e. not edited, or moved SaveCopyInUndoList( aTextePcb, UR_FLIPPED, aTextePcb->GetTextPosition() ); else // set edit flag, for the current command aTextePcb->SetFlags( IN_EDIT ); OnModify(); #ifdef USE_WX_OVERLAY m_canvas->Refresh(); #endif }
// Rotate selected pad 90 degrees. void PCB_BASE_FRAME::RotatePad( D_PAD* aPad, wxDC* DC ) { if( aPad == NULL ) return; MODULE* module = aPad->GetParent(); module->SetLastEditTime(); OnModify(); if( DC ) module->Draw( m_canvas, DC, GR_XOR ); wxSize sz = aPad->GetSize(); EXCHG( sz.x, sz.y ); aPad->SetSize( sz ); sz = aPad->GetDrillSize(); EXCHG( sz.x, sz.y ); aPad->SetDrillSize( sz ); wxPoint pt = aPad->GetOffset(); EXCHG( pt.x, pt.y ); aPad->SetOffset( pt ); aPad->SetOffset( wxPoint( aPad->GetOffset().x, -aPad->GetOffset().y ) ); sz = aPad->GetDelta(); EXCHG( sz.x, sz.y ); sz.x = -sz.x; aPad->SetDelta( sz ); module->CalculateBoundingBox(); SetMsgPanel( aPad ); if( DC ) module->Draw( m_canvas, DC, GR_OR ); }
/* Exports the current pad settings to board design settings. */ void PCB_BASE_FRAME::Export_Pad_Settings( D_PAD* aPad ) { if( aPad == NULL ) return; SetMsgPanel( aPad ); D_PAD& mp = GetDesignSettings().m_Pad_Master; mp.SetShape( aPad->GetShape() ); mp.SetAttribute( aPad->GetAttribute() ); mp.SetLayerSet( aPad->GetLayerSet() ); mp.SetOrientation( aPad->GetOrientation() - aPad->GetParent()->GetOrientation() ); mp.SetSize( aPad->GetSize() ); mp.SetDelta( aPad->GetDelta() ); mp.SetOffset( aPad->GetOffset() ); mp.SetDrillSize( aPad->GetDrillSize() ); mp.SetDrillShape( aPad->GetDrillShape() ); }
/* Set or reset (true or false) Lock attribute of aModule or all modules if aModule == NULL */ void PCB_EDIT_FRAME::LockModule( MODULE* aModule, bool aLocked ) { if( aModule ) { aModule->SetLocked( aLocked ); SetMsgPanel( aModule ); OnModify(); } else { aModule = GetBoard()->m_Modules; for( ; aModule != NULL; aModule = aModule->Next() ) { if( WildCompareString( ModulesMaskSelection, aModule->GetReference() ) ) { aModule->SetLocked( aLocked ); OnModify(); } } } }
/* * FOOTPRINT_EDIT_FRAME::Function DlgGlobalChange_PadSettings * Function to change pad caracteristics for the given footprint * or alls footprints which look like the given footprint * Options are set by the opened dialog. * aPad is the pattern. The given footprint is the parent of this pad */ void FOOTPRINT_EDIT_FRAME::DlgGlobalChange_PadSettings( D_PAD* aPad ) { int diag; if( aPad == NULL ) aPad = &GetDesignSettings().m_Pad_Master; MODULE* module = aPad->GetParent(); if( module == NULL ) { DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) ); return; } SetMsgPanel( module ); { DIALOG_GLOBAL_PADS_EDITION dlg( this, aPad ); dlg.m_buttonIdModules->Enable( false ); diag = dlg.ShowModal(); } if( diag == -1 ) return; bool edit_Same_Modules = false; if( diag == 1 ) edit_Same_Modules = true; GlobalChange_PadSettings( aPad, edit_Same_Modules, DIALOG_GLOBAL_PADS_EDITION::m_Pad_Shape_Filter, DIALOG_GLOBAL_PADS_EDITION::m_Pad_Orient_Filter, DIALOG_GLOBAL_PADS_EDITION::m_Pad_Layer_Filter, true, false ); }
/* Add a new graphical text to the active module (footprint) * Note there always are 2 mandatory texts: reference and value. * New texts have the member TEXTE_MODULE.GetType() set to TEXT_is_DIVERS */ TEXTE_MODULE* FOOTPRINT_EDIT_FRAME::CreateTextModule( MODULE* aModule, wxDC* aDC ) { TEXTE_MODULE* text = new TEXTE_MODULE( aModule ); text->SetFlags( IS_NEW ); GetDesignSettings().m_ModuleTextWidth = Clamp_Text_PenSize( GetDesignSettings().m_ModuleTextWidth, std::min( GetDesignSettings().m_ModuleTextSize.x, GetDesignSettings().m_ModuleTextSize.y ), true ); text->SetTextSize( GetDesignSettings().m_ModuleTextSize ); text->SetThickness( GetDesignSettings().m_ModuleTextWidth ); text->SetPosition( GetCrossHairPosition() ); if( LSET::AllTechMask().test( GetActiveLayer() ) ) // i.e. a possible layer for a text text->SetLayer( GetActiveLayer() ); InstallTextModOptionsFrame( text, NULL ); m_canvas->MoveCursorToCrossHair(); if( text->GetText().IsEmpty() ) { delete text; return NULL; } // Add the new text object to the beginning of the footprint draw list. if( aModule ) aModule->GraphicalItems().PushFront( text ); text->ClearFlags(); if( aDC ) text->Draw( m_canvas, aDC, GR_OR ); SetMsgPanel( text ); return text; }