EDA_SchComponentStruct * WinEDA_SchematicFrame::Load_Component(wxDC * DC, const wxString & libname, wxArrayString & HistoryList, bool UseLibBrowser) /**************************************************************************/ /* Fonction de chargement et placement d'un composant */ { int ii; LibDrawField * Field; EDA_LibComponentStruct *Entry = NULL; EDA_SchComponentStruct * DrawLibItem; LibraryStruct *Library = NULL; wxString Name, keys, msg; g_ItemToRepeat = NULL; DrawPanel->m_IgnoreMouseEvents = TRUE; /* Ask for a component name or key words */ Name = GetComponentName(this, HistoryList, _("Component selection:"), UseLibBrowser ? SelectFromLibBrowser : NULL); Name.MakeUpper(); if( Name == "" ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; /* annulation de commande */ } if ( libname != "" ) { Library = g_LibraryList; while (Library) { if( Library->m_Name == libname ) break; Library = Library->m_Pnext; } } if( Name[0] == '=' ) { keys = Name.AfterFirst('='); if( DataBaseGetName(this, keys, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } else if( Name == "*" ) { if( GetNameOfPartToLoad(this, Library, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } else if( (Name.Contains("?")) || (Name.Contains("*")) ) { if( DataBaseGetName(this, keys, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); Entry = FindLibPart(Name.GetData(), libname, FIND_ROOT); if( Entry == NULL) { msg = _("Failed to find part ") + Name + _(" in library"); DisplayError(this, msg, 10); DrawLibItem = NULL; return NULL; } AddHistoryComponentName(HistoryList, Name); m_CurrentScreen->ManageCurseur = ShowWhileMoving ; m_CurrentScreen->ForceCloseManageCurseur = ExitPlaceCmp; DrawLibItem = new EDA_SchComponentStruct(m_CurrentScreen->m_Curseur); DrawLibItem->m_Multi = 1; /* Selection de l'unite 1 dans le boitier */ DrawLibItem->m_Convert = 1; DrawLibItem->m_ChipName = strdup(Name); DrawLibItem->m_TimeStamp = GetTimeStamp(); DrawLibItem->m_Flags = IS_NEW | IS_MOVED; /* Init champ Valeur */ DrawLibItem->m_Field[VALUE].m_Pos.x = Entry->m_Name.m_Pos.x + DrawLibItem->m_Pos.x; DrawLibItem->m_Field[VALUE].m_Pos.y = Entry->m_Name.m_Pos.y + DrawLibItem->m_Pos.y; DrawLibItem->m_Field[VALUE].m_Orient = Entry->m_Name.m_Orient; DrawLibItem->m_Field[VALUE].m_Size = Entry->m_Name.m_Size; DrawLibItem->m_Field[VALUE].m_Text = DrawLibItem->m_ChipName; DrawLibItem->m_Field[VALUE].m_Attributs = Entry->m_Name.m_Attributs; DrawLibItem->m_Field[VALUE].m_HJustify = Entry->m_Name.m_HJustify; DrawLibItem->m_Field[VALUE].m_VJustify = Entry->m_Name.m_VJustify; msg = Entry->m_Prefix.m_Text; if ( msg == "" ) msg = "U"; msg += "?"; /* Init champ Reference */ DrawLibItem->m_Field[REFERENCE].m_Pos.x = Entry->m_Prefix.m_Pos.x + DrawLibItem->m_Pos.x; DrawLibItem->m_Field[REFERENCE].m_Pos.y = Entry->m_Prefix.m_Pos.y + DrawLibItem->m_Pos.y; DrawLibItem->m_Field[REFERENCE].m_Orient = Entry->m_Prefix.m_Orient; DrawLibItem->m_Field[REFERENCE].m_Size = Entry->m_Prefix.m_Size; DrawLibItem->m_Field[REFERENCE].m_Text = msg; DrawLibItem->m_Field[REFERENCE].m_Attributs = Entry->m_Prefix.m_Attributs; DrawLibItem->m_Field[REFERENCE].m_HJustify = Entry->m_Prefix.m_HJustify; DrawLibItem->m_Field[REFERENCE].m_VJustify = Entry->m_Prefix.m_VJustify; /* Init des autres champs si predefinis dans la librairie */ for( Field = Entry->Fields; Field != NULL; Field = (LibDrawField*)Field->Pnext ) { if( Field->m_Text == "" ) continue; ii = Field->m_FieldId; if( ii < 2 ) continue; if( ii >= NUMBER_OF_FIELDS ) continue; DrawLibItem->m_Field[ii].m_Pos.x += Field->m_Pos.x; DrawLibItem->m_Field[ii].m_Pos.y += Field->m_Pos.y; DrawLibItem->m_Field[ii].m_Size = Field->m_Size; DrawLibItem->m_Field[ii].m_Attributs = Field->m_Attributs; DrawLibItem->m_Field[ii].m_Orient = Field->m_Orient; DrawLibItem->m_Field[ii].m_Text = Field->m_Text; DrawLibItem->m_Field[ii].m_HJustify = Field->m_HJustify; DrawLibItem->m_Field[ii].m_VJustify = Field->m_VJustify; } /* Trace du composant */ DrawStructsInGhost(DrawPanel, DC, DrawLibItem, 0, 0 ); MsgPanel->EraseMsgBox(); DrawLibItem->Display_Infos(this); return DrawLibItem; }
MODULE* PCB_BASE_FRAME::LoadModuleFromLibrary( const wxString& aLibrary, FP_LIB_TABLE* aTable, bool aUseFootprintViewer, wxDC* aDC ) { MODULE* module = NULL; wxPoint curspos = GetCrossHairPosition(); wxString moduleName, keys; wxString libName = aLibrary; bool allowWildSeach = true; static wxArrayString HistoryList; static wxString lastComponentName; // Ask for a component name or key words DIALOG_GET_COMPONENT dlg( this, HistoryList, _( "Load Module" ), aUseFootprintViewer ); dlg.SetComponentName( lastComponentName ); if( dlg.ShowModal() == wxID_CANCEL ) return NULL; if( dlg.m_GetExtraFunction ) { // SelectFootprintFromLibBrowser() returns the "full" footprint name, i.e. // <lib_name>/<footprint name> or FPID format "lib_name:fp_name:rev#" moduleName = SelectFootprintFromLibBrowser(); } else { moduleName = dlg.GetComponentName(); } if( moduleName.IsEmpty() ) // Cancel command { m_canvas->MoveCursorToCrossHair(); return NULL; } if( dlg.IsKeyword() ) // Selection by keywords { allowWildSeach = false; keys = moduleName; moduleName = SelectFootprint( this, libName, wxEmptyString, keys, aTable ); if( moduleName.IsEmpty() ) // Cancel command { m_canvas->MoveCursorToCrossHair(); return NULL; } } else if( moduleName.Contains( wxT( "?" ) ) || moduleName.Contains( wxT( "*" ) ) ) // Selection wild card { allowWildSeach = false; moduleName = SelectFootprint( this, libName, moduleName, wxEmptyString, aTable ); if( moduleName.IsEmpty() ) { m_canvas->MoveCursorToCrossHair(); return NULL; // Cancel command. } } FPID fpid; wxCHECK_MSG( fpid.Parse( moduleName ) < 0, NULL, wxString::Format( wxT( "Could not parse FPID string '%s'." ), GetChars( moduleName ) ) ); try { module = loadFootprint( fpid ); } catch( const IO_ERROR& ioe ) { wxLogDebug( wxT( "An error occurred attemping to load footprint '%s'.\n\nError: %s" ), fpid.Format().c_str(), GetChars( ioe.errorText ) ); } if( !module && allowWildSeach ) // Search with wild card { allowWildSeach = false; wxString wildname = wxChar( '*' ) + moduleName + wxChar( '*' ); moduleName = wildname; moduleName = SelectFootprint( this, libName, moduleName, wxEmptyString, aTable ); if( moduleName.IsEmpty() ) { m_canvas->MoveCursorToCrossHair(); return NULL; // Cancel command. } else { FPID fpid; wxCHECK_MSG( fpid.Parse( moduleName ) < 0, NULL, wxString::Format( wxT( "Could not parse FPID string '%s'." ), GetChars( moduleName ) ) ); try { module = loadFootprint( fpid ); } catch( const IO_ERROR& ioe ) { wxLogDebug( wxT( "An error occurred attemping to load footprint '%s'.\n\nError: %s" ), fpid.Format().c_str(), GetChars( ioe.errorText ) ); } } } SetCrossHairPosition( curspos ); m_canvas->MoveCursorToCrossHair(); if( module ) { GetBoard()->Add( module, ADD_APPEND ); lastComponentName = moduleName; AddHistoryComponentName( HistoryList, moduleName ); module->SetFlags( IS_NEW ); module->SetLink( 0 ); module->SetPosition( curspos ); module->SetTimeStamp( GetNewTimeStamp() ); GetBoard()->m_Status_Pcb = 0; // Put it on FRONT layer, // (Can be stored flipped if the lib is an archive built from a board) if( module->IsFlipped() ) module->Flip( module->GetPosition() ); // Place it in orientation 0, // even if it is not saved with orientation 0 in lib // (Can happen if the lib is an archive built from a board) Rotate_Module( NULL, module, 0, false ); RecalculateAllTracksNetcode(); if( aDC ) module->Draw( m_canvas, aDC, GR_OR ); } return module; }
EDA_SchComponentStruct * WinEDA_SchematicFrame::Load_Component(wxDC * DC, const wxString & libname, wxArrayString & HistoryList, bool UseLibBrowser) /**************************************************************************/ /* load from a library and place a component if libname != "", search in lib "libname" else search in all loaded libs */ { int ii, CmpCount = 0; LibDrawField * Field; EDA_LibComponentStruct *Entry = NULL; EDA_SchComponentStruct * DrawLibItem = NULL; LibraryStruct *Library = NULL; wxString Name, keys, msg; bool AllowWildSeach = TRUE; g_ItemToRepeat = NULL; DrawPanel->m_IgnoreMouseEvents = TRUE; if ( ! libname.IsEmpty() ) { Library = g_LibraryList; while (Library) { if( Library->m_Name == libname ) { CmpCount = Library->m_NumOfParts; break; } Library = Library->m_Pnext; } } else { LibraryStruct * lib = g_LibraryList; while (lib) { CmpCount += lib->m_NumOfParts; lib = lib->m_Pnext; } } /* Ask for a component name or key words */ msg.Printf (_("component selection (%d items loaded):"), CmpCount); Name = GetComponentName(this, HistoryList, msg, UseLibBrowser ? SelectFromLibBrowser : NULL); Name.MakeUpper(); if( Name.IsEmpty() ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; /* annulation de commande */ } if( Name.GetChar(0) == '=' ) { AllowWildSeach = FALSE; keys = Name.AfterFirst('='); if( DataBaseGetName(this, keys, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } else if( Name == wxT("*") ) { AllowWildSeach = FALSE; if( GetNameOfPartToLoad(this, Library, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } else if( Name.Contains( wxT("?")) || Name.Contains( wxT("*")) ) { AllowWildSeach = FALSE; if( DataBaseGetName(this, keys, Name) == 0 ) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } Entry = FindLibPart(Name.GetData(), libname, FIND_ROOT); if( (Entry == NULL) && AllowWildSeach ) /* Attemp to search with wildcard */ { AllowWildSeach = FALSE; wxString wildname = wxChar('*') + Name + wxChar('*'); Name = wildname; if( DataBaseGetName(this, keys, Name) ) Entry = FindLibPart(Name.GetData(), libname, FIND_ROOT); if( Entry == NULL) { DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); return NULL; } } DrawPanel->m_IgnoreMouseEvents = FALSE; DrawPanel->MouseToCursorSchema(); if( Entry == NULL) { msg = _("Failed to find part ") + Name + _(" in library"); DisplayError(this, msg, 10); return NULL; } AddHistoryComponentName(HistoryList, Name); m_CurrentScreen->ManageCurseur = ShowWhileMoving ; m_CurrentScreen->ForceCloseManageCurseur = ExitPlaceCmp; DrawLibItem = new EDA_SchComponentStruct(m_CurrentScreen->m_Curseur); DrawLibItem->m_Multi = 1; /* Selection de l'unite 1 dans le boitier */ DrawLibItem->m_Convert = 1; DrawLibItem->m_ChipName = Name; DrawLibItem->m_TimeStamp = GetTimeStamp(); DrawLibItem->m_Flags = IS_NEW | IS_MOVED; /* Init champ Valeur */ DrawLibItem->m_Field[VALUE].m_Pos.x = Entry->m_Name.m_Pos.x + DrawLibItem->m_Pos.x; DrawLibItem->m_Field[VALUE].m_Pos.y = Entry->m_Name.m_Pos.y + DrawLibItem->m_Pos.y; DrawLibItem->m_Field[VALUE].m_Orient = Entry->m_Name.m_Orient; DrawLibItem->m_Field[VALUE].m_Size = Entry->m_Name.m_Size; DrawLibItem->m_Field[VALUE].m_Text = DrawLibItem->m_ChipName; DrawLibItem->m_Field[VALUE].m_Attributs = Entry->m_Name.m_Attributs; DrawLibItem->m_Field[VALUE].m_HJustify = Entry->m_Name.m_HJustify; DrawLibItem->m_Field[VALUE].m_VJustify = Entry->m_Name.m_VJustify; msg = Entry->m_Prefix.m_Text; if ( msg.IsEmpty() ) msg = wxT("U"); msg += wxT("?"); /* Init champ Reference */ DrawLibItem->m_Field[REFERENCE].m_Pos.x = Entry->m_Prefix.m_Pos.x + DrawLibItem->m_Pos.x; DrawLibItem->m_Field[REFERENCE].m_Pos.y = Entry->m_Prefix.m_Pos.y + DrawLibItem->m_Pos.y; DrawLibItem->m_Field[REFERENCE].m_Orient = Entry->m_Prefix.m_Orient; DrawLibItem->m_Field[REFERENCE].m_Size = Entry->m_Prefix.m_Size; DrawLibItem->m_Field[REFERENCE].m_Text = msg; DrawLibItem->m_Field[REFERENCE].m_Attributs = Entry->m_Prefix.m_Attributs; DrawLibItem->m_Field[REFERENCE].m_HJustify = Entry->m_Prefix.m_HJustify; DrawLibItem->m_Field[REFERENCE].m_VJustify = Entry->m_Prefix.m_VJustify; /* Init des autres champs si predefinis dans la librairie */ for( Field = Entry->Fields; Field != NULL; Field = (LibDrawField*)Field->Pnext ) { if( Field->m_Text.IsEmpty() ) continue; ii = Field->m_FieldId; if( ii < 2 ) continue; if( ii >= NUMBER_OF_FIELDS ) continue; DrawLibItem->m_Field[ii].m_Pos.x += Field->m_Pos.x; DrawLibItem->m_Field[ii].m_Pos.y += Field->m_Pos.y; DrawLibItem->m_Field[ii].m_Size = Field->m_Size; DrawLibItem->m_Field[ii].m_Attributs = Field->m_Attributs; DrawLibItem->m_Field[ii].m_Orient = Field->m_Orient; DrawLibItem->m_Field[ii].m_Text = Field->m_Text; DrawLibItem->m_Field[ii].m_HJustify = Field->m_HJustify; DrawLibItem->m_Field[ii].m_VJustify = Field->m_VJustify; } /* Trace du composant */ DrawStructsInGhost(DrawPanel, DC, DrawLibItem, 0, 0 ); MsgPanel->EraseMsgBox(); DrawLibItem->Display_Infos(this); return DrawLibItem; }
MODULE * WinEDA_BasePcbFrame::Load_Module_From_Library(const wxString & library, wxDC * DC) /****************************************************************************/ /* Permet de charger un module directement a partir de la librairie */ { MODULE * module; wxPoint curspos = m_CurrentScreen->m_Curseur; wxString ModuleName, keys; static wxArrayString HistoryList; bool AllowWildSeach = TRUE; /* Ask for a component name or key words */ ModuleName = GetComponentName(this, HistoryList, _("Module name:"), NULL); ModuleName.MakeUpper(); if( ModuleName.IsEmpty() ) /* Cancel command */ { DrawPanel->MouseToCursorSchema(); return NULL; } if( ModuleName[0] == '=' ) // Selection by keywords { AllowWildSeach = FALSE; keys = ModuleName.AfterFirst('='); ModuleName = Select_1_Module_From_List(this, library, wxEmptyString, keys); if( ModuleName.IsEmpty() ) /* Cancel command */ { DrawPanel->MouseToCursorSchema(); return NULL; } } else if( (ModuleName.Contains(wxT("?"))) || (ModuleName.Contains(wxT("*"))) ) // Selection wild card { AllowWildSeach = FALSE; ModuleName = Select_1_Module_From_List(this, library, ModuleName, wxEmptyString); if( ModuleName.IsEmpty() ) { DrawPanel->MouseToCursorSchema(); return NULL; /* annulation de commande */ } } module = Get_Librairie_Module(this, library, ModuleName, FALSE); if( (module == NULL) && AllowWildSeach ) /* Attemp to search with wildcard */ { AllowWildSeach = FALSE; wxString wildname = wxChar('*') + ModuleName + wxChar('*'); ModuleName = wildname; ModuleName = Select_1_Module_From_List(this, library, ModuleName, wxEmptyString); if( ModuleName.IsEmpty() ) { DrawPanel->MouseToCursorSchema(); return NULL; /* annulation de commande */ } else module = Get_Librairie_Module(this, library, ModuleName, TRUE); } m_CurrentScreen->m_Curseur = curspos; DrawPanel->MouseToCursorSchema(); if( module ) { AddHistoryComponentName(HistoryList, ModuleName); module->m_Flags = IS_NEW; module->m_Link = 0; module->m_TimeStamp = GetTimeStamp(); m_Pcb->m_Status_Pcb = 0 ; module->SetPosition(curspos); build_liste_pads(); module->Draw(DrawPanel, DC, wxPoint(0,0), GR_OR); } return module; }