From 664a1f727ba70f2e1ec6dc47e8ceda89a309584c Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Thu, 20 Sep 2007 21:06:49 +0000 Subject: [PATCH] see my 2007-Sep-20 change_log.txt --- change_log.txt | 32 +- common/base_screen.cpp | 26 + common/base_struct.cpp | 3 + eeschema/annotate.cpp | 1174 ++++++++-------- eeschema/class_screen.h | 2 +- eeschema/cleanup.cpp | 421 +++--- eeschema/cmpclass.cpp | 39 + eeschema/component_class.cpp | 974 +++++++------ eeschema/component_class.h | 45 +- eeschema/edit_component_in_lib.cpp | 1709 ++++++++++++----------- eeschema/erc.cpp | 1285 ++++++++--------- eeschema/libedpart.cpp | 1907 ++++++++++++++------------ eeschema/load_one_schematic_file.cpp | 7 +- eeschema/netlist.cpp | 1793 ++++++++++++------------ eeschema/netlist.h | 139 +- eeschema/program.h | 46 +- eeschema/protos.h | 2 +- include/drawpanel_wxstruct.h | 23 +- pcbnew/controle.cpp | 4 +- pcbnew/onrightclick.cpp | 27 +- 20 files changed, 5187 insertions(+), 4471 deletions(-) diff --git a/change_log.txt b/change_log.txt index 7996d7beb9..cf3d262358 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,12 +4,20 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-Sep-20 UPDATE Dick Hollenbeck +================================================================================ ++ eeschema + * beautify, add debug Show() functions, changed ReturnFieldName() + to return "const wxString&" for speed, added GetFieldValue(). + * tracking down questionable behavior (a bug?) in erc regarding pwr_flag, still looking + + 2007-sept-20 UPDATE Jean-Pierre Charras ================================================================================ + all - * hotkeys handling finished + * hotkeys handling finished + pcbnew - * bug fix: a subtle bug in place via : partial drc only was made. + * bug fix: a subtle bug in place via : partial drc only was made. 2007-Sep-14 UPDATE Dick Hollenbeck @@ -42,11 +50,11 @@ email address. 2007-sept-13 UPDATE Jean-Pierre Charras ================================================================================ + all - * EDA_BaseStruct.SetType() removed. - The m_StructType member of class EDA_BaseStruct is no more modified in kicad. - Now Virtual functions can be widely used. - * The old EDA_BaseStruct.ReturnClassName() was removed. - the virtual EDA_BaseStruct.GetClass() is used instead. + * EDA_BaseStruct.SetType() removed. + The m_StructType member of class EDA_BaseStruct is no more modified in kicad. + Now Virtual functions can be widely used. + * The old EDA_BaseStruct.ReturnClassName() was removed. + the virtual EDA_BaseStruct.GetClass() is used instead. + gerbview: hotkeys Ok. @@ -106,10 +114,10 @@ email address. ================================================================================ + eeschema & pcbnew Programmable hotkeys update. - some features are still subject to change (mainly path for config files: see 2007-aug-30 UPDATE)) - The preference menu has a command to create and reread config hotkey files. - the hotkey ? lists the current hotkeys. - + some features are still subject to change (mainly path for config files: see 2007-aug-30 UPDATE)) + The preference menu has a command to create and reread config hotkey files. + the hotkey ? lists the current hotkeys. + 2007-Sep-4 UPDATE Dick Hollenbeck ================================================================================ @@ -125,7 +133,7 @@ email address. 2007-sept-04 UPDATE Jean-Pierre Charras ================================================================================ + pcbnew - better comments in editrack-part2 (the todo remark solved) + better comments in editrack-part2 (the todo remark solved) + todo.txt: note about editrack-part2 modified (problem solved) diff --git a/common/base_screen.cpp b/common/base_screen.cpp index f10466fd75..195940b4d2 100644 --- a/common/base_screen.cpp +++ b/common/base_screen.cpp @@ -555,3 +555,29 @@ EDA_BaseStruct* BASE_SCREEN::GetItemFromRedoList() return item; } + +#if defined(DEBUG) +/** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ +void BASE_SCREEN::Show( int nestLevel, std::ostream& os ) +{ + EDA_BaseStruct* item = EEDrawList; + + // for now, make it look like XML, expand on this later. + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << + ">\n"; + + for( ; item; item = item->Next() ) + { + item->Show( nestLevel+1, os ); + } + + NestedSpace( nestLevel, os ) << "\n"; +} +#endif + \ No newline at end of file diff --git a/common/base_struct.cpp b/common/base_struct.cpp index 3be1d5db67..c09e44a55d 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -188,11 +188,14 @@ void EDA_BaseStruct::Show( int nestLevel, std::ostream& os ) // for now, make it look like XML: NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n"; + /* EDA_BaseStruct* kid = m_Son; for( ; kid; kid = kid->Pnext ) { kid->Show( nestLevel+1, os ); } + */ + NestedSpace( nestLevel+1, os ) << "Need ::Show() override, shown class is using EDA_BaseStruct::Show()\n"; NestedSpace( nestLevel, os ) << "\n"; } diff --git a/eeschema/annotate.cpp b/eeschema/annotate.cpp index 896c8e17ea..1158e9cc32 100644 --- a/eeschema/annotate.cpp +++ b/eeschema/annotate.cpp @@ -1,6 +1,6 @@ - /**************************************/ - /* annotate.cpp: component annotation */ - /**************************************/ +/**************************************/ +/* annotate.cpp: component annotation */ +/**************************************/ #include "annotate_dialog.cpp" @@ -8,723 +8,779 @@ #include "protos.h" /* fonctions exportees */ -int ListeComposants( CmpListStruct * BaseListeCmp, SCH_SCREEN *screen, int NumSheet); -int AnnotTriComposant(CmpListStruct *Objet1, CmpListStruct *Objet2); -void BreakReference( CmpListStruct * BaseListeCmp,int NbOfCmp ); +int ListeComposants( CmpListStruct* BaseListeCmp, SCH_SCREEN* screen, int NumSheet ); +int AnnotTriComposant( CmpListStruct* Objet1, CmpListStruct* Objet2 ); +void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp ); /* fonctions locales */ -static void ReAnnotateComponents( CmpListStruct * BaseListeCmp,int NbOfCmp ); -static void ComputeReferenceNumber( CmpListStruct * BaseListeCmp,int NbOfCmp); -static int GetLastReferenceNumber(CmpListStruct *Objet, CmpListStruct * BaseListeCmp, - int NbOfCmp); -static int ExistUnit(CmpListStruct *Objet, int Unit, - CmpListStruct * BaseListeCmp,int NbOfCmp); +static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp ); +static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp ); +static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseListeCmp, + int NbOfCmp ); +static int ExistUnit( CmpListStruct* Objet, int Unit, + CmpListStruct* BaseListeCmp, int NbOfCmp ); /* Variable locales */ -static bool AnnotProject = TRUE; +static bool AnnotProject = TRUE; static bool SortByPosition = TRUE; /**************************************/ void ReAnnotatePowerSymbolsOnly() /**************************************/ + /* Used to reannotate the power symbols, before testing erc or computing netlist -when a true component reannotation is not necessary - -In order to avoid conflicts the ref number start with a 0: - PWR with id 12 is named PWR12 in global annotation and PWR012 by the Power annotation -*/ + * when a true component reannotation is not necessary + * + * In order to avoid conflicts the ref number start with a 0: + * PWR with id 12 is named PWR12 in global annotation and PWR012 by the Power annotation + */ { - /* Build the screen list */ - EDA_ScreenList ScreenList(NULL); + /* Build the screen list */ + EDA_ScreenList ScreenList( NULL ); - /* Update the sheet number, sheet count and date */ - ScreenList.UpdateSheetNumberAndDate(); + /* Update the sheet number, sheet count and date */ + ScreenList.UpdateSheetNumberAndDate(); - SCH_SCREEN* screen; - int CmpNumber = 1; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - EDA_BaseStruct *DrawList = screen->EEDrawList; - for ( ; DrawList != NULL ; DrawList = DrawList->Pnext ) - { - if ( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) - continue; - EDA_SchComponentStruct * DrawLibItem = (EDA_SchComponentStruct *) DrawList; - EDA_LibComponentStruct * Entry = - FindLibPart(DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); - if ( (Entry == NULL) || (Entry->m_Options != ENTRY_POWER) ) - continue; - DrawLibItem->ClearAnnotation(); - DrawLibItem->m_RefIdNumber = CmpNumber; - DrawLibItem->m_Field[REFERENCE].m_Text.RemoveLast(); // Remove the '?' - DrawLibItem->m_Field[REFERENCE].m_Text << wxT("0") << CmpNumber; - CmpNumber++; - } - } + SCH_SCREEN* screen; + int CmpNumber = 1; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + EDA_BaseStruct* DrawList = screen->EEDrawList; + for( ; DrawList != NULL; DrawList = DrawList->Pnext ) + { + if( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) + continue; + EDA_SchComponentStruct* DrawLibItem = (EDA_SchComponentStruct*) DrawList; + EDA_LibComponentStruct* Entry = + FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + if( (Entry == NULL) || (Entry->m_Options != ENTRY_POWER) ) + continue; + DrawLibItem->ClearAnnotation(); + DrawLibItem->m_RefIdNumber = CmpNumber; + DrawLibItem->m_Field[REFERENCE].m_Text.RemoveLast(); // Remove the '?' + DrawLibItem->m_Field[REFERENCE].m_Text << wxT( "0" ) << CmpNumber; + CmpNumber++; + } + } } /******************************************************************/ -void InstallAnnotateFrame(WinEDA_SchematicFrame *parent, wxPoint & pos) +void InstallAnnotateFrame( WinEDA_SchematicFrame* parent, wxPoint& pos ) /******************************************************************/ { - WinEDA_AnnotateFrame * frame = new WinEDA_AnnotateFrame(parent); - frame->ShowModal(); frame->Destroy(); + WinEDA_AnnotateFrame* frame = new WinEDA_AnnotateFrame( parent ); + + frame->ShowModal(); frame->Destroy(); } /******************************************************************/ -void WinEDA_AnnotateFrame::AnnotateComponents(wxCommandEvent& event) +void WinEDA_AnnotateFrame::AnnotateComponents( wxCommandEvent& event ) /******************************************************************/ + /* - Compute the annotation of the components for the whole projeect, or the current sheet only. - All the components or the new ones only will be annotated. -*/ + * Compute the annotation of the components for the whole projeect, or the current sheet only. + * All the components or the new ones only will be annotated. + */ { -int NbSheet, ii , NbOfCmp; -SCH_SCREEN *screen; -CmpListStruct * BaseListeCmp; + int NbSheet, ii, NbOfCmp; + SCH_SCREEN* screen; + CmpListStruct* BaseListeCmp; - wxBusyCursor dummy; + wxBusyCursor dummy; - AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? TRUE : FALSE; - SortByPosition = (m_AnnotSortCmpCtrl->GetSelection() == 0) ? TRUE : FALSE; + AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? TRUE : FALSE; + SortByPosition = (m_AnnotSortCmpCtrl->GetSelection() == 0) ? TRUE : FALSE; - /* If it is an annotation for all the components, reset previous annotation: */ - if( m_AnnotNewCmpCtrl->GetSelection() == 0 ) DeleteAnnotation(event); - if (m_Abort ) return; + /* If it is an annotation for all the components, reset previous annotation: */ + if( m_AnnotNewCmpCtrl->GetSelection() == 0 ) + DeleteAnnotation( event ); + if( m_Abort ) + return; - /* Build the screen list */ - EDA_ScreenList ScreenList(NULL); - NbSheet = ScreenList.GetCount(); + /* Build the screen list */ + EDA_ScreenList ScreenList( NULL ); - /* Update the sheet number, sheet count and date */ - ScreenSch->SetModify(); - ScreenList.UpdateSheetNumberAndDate(); + NbSheet = ScreenList.GetCount(); - /* First pass: Component counting */ - screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; - if( AnnotProject == TRUE ) - { - NbOfCmp = 0; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - NbOfCmp += ListeComposants(NULL, screen, screen->m_SheetNumber); - } - } - else NbOfCmp = ListeComposants(NULL, screen, screen->m_SheetNumber); + /* Update the sheet number, sheet count and date */ + ScreenSch->SetModify(); + ScreenList.UpdateSheetNumberAndDate(); - if( NbOfCmp == 0 ) - return; + /* First pass: Component counting */ + screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; + if( AnnotProject == TRUE ) + { + NbOfCmp = 0; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + NbOfCmp += ListeComposants( NULL, screen, screen->m_SheetNumber ); + } + } + else + NbOfCmp = ListeComposants( NULL, screen, screen->m_SheetNumber ); - ii = sizeof(CmpListStruct) * NbOfCmp; - BaseListeCmp = (CmpListStruct *) MyZMalloc(ii); + if( NbOfCmp == 0 ) + return; - /* Second pass : Int data tables */ - screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; - if( AnnotProject == TRUE ) - { - ii = 0; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - ii += ListeComposants(BaseListeCmp + ii, - screen, screen->m_SheetNumber); - } - } - else ii = ListeComposants(BaseListeCmp, screen, screen->m_SheetNumber); + ii = sizeof(CmpListStruct) * NbOfCmp; + BaseListeCmp = (CmpListStruct*) MyZMalloc( ii ); - if( ii != NbOfCmp ) - DisplayError(this, wxT("Internal error in AnnotateComponents()")); + /* Second pass : Int data tables */ + screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; + if( AnnotProject == TRUE ) + { + ii = 0; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + ii += ListeComposants( BaseListeCmp + ii, + screen, screen->m_SheetNumber ); + } + } + else + ii = ListeComposants( BaseListeCmp, screen, screen->m_SheetNumber ); - /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ - BreakReference(BaseListeCmp, NbOfCmp); + if( ii != NbOfCmp ) + DisplayError( this, wxT( "Internal error in AnnotateComponents()" ) ); - qsort( BaseListeCmp, NbOfCmp, sizeof(CmpListStruct), - (int(*)(const void*, const void*))AnnotTriComposant); + /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ + BreakReference( BaseListeCmp, NbOfCmp ); - /* Recalcul des numeros de reference */ - ComputeReferenceNumber(BaseListeCmp, NbOfCmp); - ReAnnotateComponents(BaseListeCmp, NbOfCmp); + qsort( BaseListeCmp, NbOfCmp, sizeof(CmpListStruct), + ( int( * ) ( const void*, const void* ) )AnnotTriComposant ); - MyFree(BaseListeCmp); BaseListeCmp = NULL; + /* Recalcul des numeros de reference */ + ComputeReferenceNumber( BaseListeCmp, NbOfCmp ); + ReAnnotateComponents( BaseListeCmp, NbOfCmp ); - /* Final control */ - CheckAnnotate(m_Parent, AnnotProject ? FALSE : TRUE); + MyFree( BaseListeCmp ); BaseListeCmp = NULL; - m_Parent->DrawPanel->Refresh(TRUE); /* Refresh screen */ - Close(); + /* Final control */ + CheckAnnotate( m_Parent, AnnotProject ? FALSE : TRUE ); + + m_Parent->DrawPanel->Refresh( TRUE ); /* Refresh screen */ + Close(); } /********************************************************************/ -void WinEDA_AnnotateFrame::DeleteAnnotation(wxCommandEvent& event) +void WinEDA_AnnotateFrame::DeleteAnnotation( wxCommandEvent& event ) /********************************************************************/ + /* Clear the current annotation for the whole project or only for the current sheet - Update sheet number and number of sheets -*/ + * Update sheet number and number of sheets + */ { -int NbSheet; -SCH_SCREEN * screen; -EDA_SchComponentStruct *DrawLibItem; + int NbSheet; + SCH_SCREEN* screen; + EDA_SchComponentStruct* DrawLibItem; - if( !IsOK(this, _("Previous Annotation will be deleted. Continue ?") ) ) - { - m_Abort = TRUE; return; - } + if( !IsOK( this, _( "Previous Annotation will be deleted. Continue ?" ) ) ) + { + m_Abort = TRUE; return; + } - AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? TRUE : FALSE; - m_Abort = FALSE; + AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? TRUE : FALSE; + m_Abort = FALSE; - /* Build the screen list */ - EDA_ScreenList ScreenList(NULL); - NbSheet = ScreenList.GetCount(); + /* Build the screen list */ + EDA_ScreenList ScreenList( NULL ); - /* Update the sheet number, sheet count and date */ - ScreenList.UpdateSheetNumberAndDate(); + NbSheet = ScreenList.GetCount(); - ScreenSch->SetModify(); + /* Update the sheet number, sheet count and date */ + ScreenList.UpdateSheetNumberAndDate(); - if( AnnotProject == TRUE ) screen = ScreenList.GetFirst(); - else screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; + ScreenSch->SetModify(); - for ( ; screen != NULL; screen = ScreenList.GetNext() ) - { - EDA_BaseStruct *DrawList = screen->EEDrawList; - for ( ; DrawList != NULL ; DrawList = DrawList->Pnext ) - { - if ( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE ) - { - DrawLibItem = (EDA_SchComponentStruct *) DrawList; - DrawLibItem->ClearAnnotation(); - } - } - if( ! AnnotProject ) break; - } + if( AnnotProject == TRUE ) + screen = ScreenList.GetFirst(); + else + screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; - m_Parent->DrawPanel->Refresh(TRUE); - Close(); + for( ; screen != NULL; screen = ScreenList.GetNext() ) + { + EDA_BaseStruct* DrawList = screen->EEDrawList; + for( ; DrawList != NULL; DrawList = DrawList->Pnext ) + { + if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE ) + { + DrawLibItem = (EDA_SchComponentStruct*) DrawList; + DrawLibItem->ClearAnnotation(); + } + } + + if( !AnnotProject ) + break; + } + + m_Parent->DrawPanel->Refresh( TRUE ); + Close(); } /************************************************************************************/ -int ListeComposants(CmpListStruct * BaseListeCmp, SCH_SCREEN *screen, int NumSheet) +int ListeComposants( CmpListStruct* BaseListeCmp, SCH_SCREEN* screen, int NumSheet ) /***********************************************************************************/ + /* if BaseListeCmp == NULL : Components counting - else update data table BaseListeCmp -*/ + * else update data table BaseListeCmp + */ { -int NbrCmp = 0; -EDA_BaseStruct *DrawList = screen->EEDrawList; -EDA_SchComponentStruct *DrawLibItem; -EDA_LibComponentStruct *Entry; + int NbrCmp = 0; + EDA_BaseStruct* DrawList = screen->EEDrawList; + EDA_SchComponentStruct* DrawLibItem; + EDA_LibComponentStruct* Entry; - DrawList = screen->EEDrawList; + DrawList = screen->EEDrawList; - while ( DrawList ) - { - switch( DrawList->Type() ) - { - case DRAW_SEGMENT_STRUCT_TYPE : - case DRAW_JUNCTION_STRUCT_TYPE : - case DRAW_TEXT_STRUCT_TYPE : - case DRAW_LABEL_STRUCT_TYPE : - case DRAW_GLOBAL_LABEL_STRUCT_TYPE : - break; + while( DrawList ) + { + switch( DrawList->Type() ) + { + case DRAW_SEGMENT_STRUCT_TYPE: + case DRAW_JUNCTION_STRUCT_TYPE: + case DRAW_TEXT_STRUCT_TYPE: + case DRAW_LABEL_STRUCT_TYPE: + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + break; - case DRAW_LIB_ITEM_STRUCT_TYPE : - DrawLibItem = (EDA_SchComponentStruct *) DrawList; - Entry = FindLibPart(DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); - if( Entry == NULL) break; - if ( BaseListeCmp == NULL ) /* Items counting only */ - { - NbrCmp++; break; - } - BaseListeCmp[NbrCmp].m_Cmp = DrawLibItem; - BaseListeCmp[NbrCmp].m_NbParts = Entry->m_UnitCount; - BaseListeCmp[NbrCmp].m_Unit = DrawLibItem->m_Multi; - BaseListeCmp[NbrCmp].m_PartsLocked = Entry->m_UnitSelectionLocked; - BaseListeCmp[NbrCmp].m_Sheet = NumSheet; - BaseListeCmp[NbrCmp].m_IsNew = FALSE; - BaseListeCmp[NbrCmp].m_Pos = DrawLibItem->m_Pos; - BaseListeCmp[NbrCmp].m_TimeStamp = DrawLibItem->m_TimeStamp; - if( DrawLibItem->m_Field[REFERENCE].m_Text.IsEmpty() ) - DrawLibItem->m_Field[REFERENCE].m_Text = wxT("DefRef?"); - strncpy( BaseListeCmp[NbrCmp].m_TextRef, - CONV_TO_UTF8(DrawLibItem->m_Field[REFERENCE].m_Text), 32); + case DRAW_LIB_ITEM_STRUCT_TYPE: + DrawLibItem = (EDA_SchComponentStruct*) DrawList; + Entry = FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + if( Entry == NULL ) + break; + if( BaseListeCmp == NULL ) /* Items counting only */ + { + NbrCmp++; break; + } + BaseListeCmp[NbrCmp].m_Cmp = DrawLibItem; + BaseListeCmp[NbrCmp].m_NbParts = Entry->m_UnitCount; + BaseListeCmp[NbrCmp].m_Unit = DrawLibItem->m_Multi; + BaseListeCmp[NbrCmp].m_PartsLocked = Entry->m_UnitSelectionLocked; + BaseListeCmp[NbrCmp].m_Sheet = NumSheet; + BaseListeCmp[NbrCmp].m_IsNew = FALSE; + BaseListeCmp[NbrCmp].m_Pos = DrawLibItem->m_Pos; + BaseListeCmp[NbrCmp].m_TimeStamp = DrawLibItem->m_TimeStamp; + if( DrawLibItem->m_Field[REFERENCE].m_Text.IsEmpty() ) + DrawLibItem->m_Field[REFERENCE].m_Text = wxT( "DefRef?" ); + strncpy( BaseListeCmp[NbrCmp].m_TextRef, + CONV_TO_UTF8( DrawLibItem->m_Field[REFERENCE].m_Text ), 32 ); - BaseListeCmp[NbrCmp].m_NumRef = -1; + BaseListeCmp[NbrCmp].m_NumRef = -1; - if( DrawLibItem->m_Field[VALUE].m_Text.IsEmpty() ) - DrawLibItem->m_Field[VALUE].m_Text = wxT("~"); - strncpy( BaseListeCmp[NbrCmp].m_TextValue, - CONV_TO_UTF8(DrawLibItem->m_Field[VALUE].m_Text), 32); - NbrCmp++; - break; + if( DrawLibItem->m_Field[VALUE].m_Text.IsEmpty() ) + DrawLibItem->m_Field[VALUE].m_Text = wxT( "~" ); + strncpy( BaseListeCmp[NbrCmp].m_TextValue, + CONV_TO_UTF8( DrawLibItem->m_Field[VALUE].m_Text ), 32 ); + NbrCmp++; + break; - case DRAW_PICK_ITEM_STRUCT_TYPE : - case DRAW_POLYLINE_STRUCT_TYPE : - case DRAW_BUSENTRY_STRUCT_TYPE : - case DRAW_SHEET_STRUCT_TYPE : - case DRAW_SHEETLABEL_STRUCT_TYPE : - case DRAW_MARKER_STRUCT_TYPE : - case DRAW_NOCONNECT_STRUCT_TYPE : - break; + case DRAW_PICK_ITEM_STRUCT_TYPE: + case DRAW_POLYLINE_STRUCT_TYPE: + case DRAW_BUSENTRY_STRUCT_TYPE: + case DRAW_SHEET_STRUCT_TYPE: + case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_MARKER_STRUCT_TYPE: + case DRAW_NOCONNECT_STRUCT_TYPE: + break; - default : - break; - } + default: + break; + } - DrawList = DrawList->Pnext; - } + DrawList = DrawList->Pnext; + } -return(NbrCmp); + return NbrCmp; } + /*****************************************************************/ -int AnnotTriComposant(CmpListStruct *Objet1, CmpListStruct *Objet2) +int AnnotTriComposant( CmpListStruct* Objet1, CmpListStruct* Objet2 ) /****************************************************************/ + /* function used par qsort() for sorting the list - Composants are sorted - by reference - if same reference: by value - if same value: by unit number - if same unit number, by sheet - if same sheet, by time stamp -**/ + * Composants are sorted + * by reference + * if same reference: by value + * if same value: by unit number + * if same unit number, by sheet + * if same sheet, by time stamp + **/ { -int ii; + int ii; - ii = strnicmp( Objet1->m_TextRef, Objet2->m_TextRef, 32 ); - if ( SortByPosition == TRUE ) { - if ( ii == 0 ) ii = Objet1->m_Sheet - Objet2->m_Sheet; - if ( ii == 0 ) ii = Objet1->m_Unit - Objet2->m_Unit; - if ( ii == 0 ) ii = Objet1->m_Pos.x - Objet2->m_Pos.x; - if ( ii == 0 ) ii = Objet1->m_Pos.y - Objet2->m_Pos.y; - } else { - if ( ii == 0 ) ii = strnicmp( Objet1->m_TextValue, Objet2->m_TextValue, 32 ); - if ( ii == 0 ) ii = Objet1->m_Unit - Objet2->m_Unit; - if ( ii == 0 ) ii = Objet1->m_Sheet - Objet2->m_Sheet; - } + ii = strnicmp( Objet1->m_TextRef, Objet2->m_TextRef, 32 ); + if( SortByPosition == TRUE ) + { + if( ii == 0 ) + ii = Objet1->m_Sheet - Objet2->m_Sheet; + if( ii == 0 ) + ii = Objet1->m_Unit - Objet2->m_Unit; + if( ii == 0 ) + ii = Objet1->m_Pos.x - Objet2->m_Pos.x; + if( ii == 0 ) + ii = Objet1->m_Pos.y - Objet2->m_Pos.y; + } + else + { + if( ii == 0 ) + ii = strnicmp( Objet1->m_TextValue, Objet2->m_TextValue, 32 ); + if( ii == 0 ) + ii = Objet1->m_Unit - Objet2->m_Unit; + if( ii == 0 ) + ii = Objet1->m_Sheet - Objet2->m_Sheet; + } - if ( ii == 0 ) ii = Objet1->m_TimeStamp - Objet2->m_TimeStamp; - - return(ii); + if( ii == 0 ) + ii = Objet1->m_TimeStamp - Objet2->m_TimeStamp; + + return ii; } /********************************************************************/ -static void ReAnnotateComponents( CmpListStruct * BaseListeCmp, int NbOfCmp) +static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp ) /********************************************************************/ + /* Update the reference component for the schematic project (or the current sheet) -*/ + */ { -int ii; -char *Text; -EDA_SchComponentStruct *DrawLibItem; + int ii; + char* Text; + EDA_SchComponentStruct* DrawLibItem; - /* Reattribution des numeros */ - for ( ii = 0; ii < NbOfCmp ; ii++ ) - { - Text = BaseListeCmp[ii].m_TextRef; - DrawLibItem = BaseListeCmp[ii].m_Cmp; + /* Reattribution des numeros */ + for( ii = 0; ii < NbOfCmp; ii++ ) + { + Text = BaseListeCmp[ii].m_TextRef; + DrawLibItem = BaseListeCmp[ii].m_Cmp; - if ( BaseListeCmp[ii].m_NumRef < 0 ) strcat( Text, "?" ); - else sprintf( Text + strlen(Text),"%d",BaseListeCmp[ii].m_NumRef ); + if( BaseListeCmp[ii].m_NumRef < 0 ) + strcat( Text, "?" ); + else + sprintf( Text + strlen( Text ), "%d", BaseListeCmp[ii].m_NumRef ); - DrawLibItem->m_Field[REFERENCE].m_Text = CONV_FROM_UTF8(Text); - DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit; - DrawLibItem->m_RefIdNumber = BaseListeCmp[ii].m_NumRef; - if ( DrawLibItem->m_RefIdNumber < 0 ) DrawLibItem->m_RefIdNumber = 0; - } + DrawLibItem->m_Field[REFERENCE].m_Text = CONV_FROM_UTF8( Text ); + DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit; + DrawLibItem->m_RefIdNumber = BaseListeCmp[ii].m_NumRef; + if( DrawLibItem->m_RefIdNumber < 0 ) + DrawLibItem->m_RefIdNumber = 0; + } } - /**************************************************************/ -void BreakReference( CmpListStruct * BaseListeCmp, int NbOfCmp) +void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp ) /**************************************************************/ /* Modifie dans BaseListeCmp la reference des composants en supprimant la - partie nombre de la partie texte. -Place le nombre dans .m_NumRef -Pour les composants multiples non encore annotes, met .m_Unit a sa valeur max - Utilise: - BaseListeCmp - NbOfCmp -*/ + * partie nombre de la partie texte. + * Place le nombre dans .m_NumRef + * Pour les composants multiples non encore annotes, met .m_Unit a sa valeur max + * Utilise: + * BaseListeCmp + * NbOfCmp + */ { -int ii, ll; -char * Text; + int ii, ll; + char* Text; - /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ - for ( ii = 0; ii < NbOfCmp ; ii++ ) - { - BaseListeCmp[ii].m_NumRef = - 1; - Text = BaseListeCmp[ii].m_TextRef; - ll = strlen( Text ) - 1; - if( Text[ll] == '?' ) - { - BaseListeCmp[ii].m_IsNew = TRUE; - if ( ! BaseListeCmp[ii].m_PartsLocked ) - BaseListeCmp[ii].m_Unit = 0x7FFFFFFF; - Text[ll] = 0; continue; - } + /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ + for( ii = 0; ii < NbOfCmp; ii++ ) + { + BaseListeCmp[ii].m_NumRef = -1; + Text = BaseListeCmp[ii].m_TextRef; + ll = strlen( Text ) - 1; + if( Text[ll] == '?' ) + { + BaseListeCmp[ii].m_IsNew = TRUE; + if( !BaseListeCmp[ii].m_PartsLocked ) + BaseListeCmp[ii].m_Unit = 0x7FFFFFFF; + Text[ll] = 0; continue; + } - if( isdigit(Text[ll]) == 0 ) - { - BaseListeCmp[ii].m_IsNew = TRUE; - if ( ! BaseListeCmp[ii].m_PartsLocked ) - BaseListeCmp[ii].m_Unit = 0x7FFFFFFF; - continue; - } + if( isdigit( Text[ll] ) == 0 ) + { + BaseListeCmp[ii].m_IsNew = TRUE; + if( !BaseListeCmp[ii].m_PartsLocked ) + BaseListeCmp[ii].m_Unit = 0x7FFFFFFF; + continue; + } - while( ll >= 0 ) - { - if( (Text[ll] <= ' ' ) || isdigit(Text[ll]) ) - ll--; - else - { - if( isdigit(Text[ll+1]) ) - BaseListeCmp[ii].m_NumRef = atoi(& Text[ll+1]); - Text[ll+1] = 0; - break; - } - } - } + while( ll >= 0 ) + { + if( (Text[ll] <= ' ' ) || isdigit( Text[ll] ) ) + ll--; + else + { + if( isdigit( Text[ll + 1] ) ) + BaseListeCmp[ii].m_NumRef = atoi( &Text[ll + 1] ); + Text[ll + 1] = 0; + break; + } + } + } } /*****************************************************************************/ -static void ComputeReferenceNumber( CmpListStruct * BaseListeCmp, int NbOfCmp) +static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp ) /*****************************************************************************/ + /* Compute the reference number for components without reference number - Compute .m_NumRef member -*/ + * Compute .m_NumRef member + */ { -int ii, jj, LastReferenceNumber, NumberOfUnits, Unit; -char * Text, * RefText, *ValText; -CmpListStruct * ObjRef, * ObjToTest; + int ii, jj, LastReferenceNumber, NumberOfUnits, Unit; + char* Text, * RefText, * ValText; + CmpListStruct* ObjRef, * ObjToTest; - /* Components with an invisible reference (power...) always are re-annotated*/ - for ( ii = 0; ii < NbOfCmp ; ii++ ) - { - Text = BaseListeCmp[ii].m_TextRef; - if (*Text == '#') - { - BaseListeCmp[ii].m_IsNew = TRUE; - BaseListeCmp[ii].m_NumRef = 0; - } - } + /* Components with an invisible reference (power...) always are re-annotated*/ + for( ii = 0; ii < NbOfCmp; ii++ ) + { + Text = BaseListeCmp[ii].m_TextRef; + if( *Text == '#' ) + { + BaseListeCmp[ii].m_IsNew = TRUE; + BaseListeCmp[ii].m_NumRef = 0; + } + } - ValText = RefText = ""; LastReferenceNumber = 1; - for ( ii = 0; ii < NbOfCmp ; ii++ ) - { - ObjRef = & BaseListeCmp[ii]; - if( BaseListeCmp[ii].m_Flag ) continue; + ValText = RefText = ""; LastReferenceNumber = 1; + for( ii = 0; ii < NbOfCmp; ii++ ) + { + ObjRef = &BaseListeCmp[ii]; + if( BaseListeCmp[ii].m_Flag ) + continue; - Text = BaseListeCmp[ii].m_TextRef; - if( strnicmp(RefText, Text, 32) != 0 ) /* Nouveau Identificateur */ - { - RefText = BaseListeCmp[ii].m_TextRef; - LastReferenceNumber = GetLastReferenceNumber(BaseListeCmp + ii, BaseListeCmp, NbOfCmp); - } + Text = BaseListeCmp[ii].m_TextRef; + if( strnicmp( RefText, Text, 32 ) != 0 ) /* Nouveau Identificateur */ + { + RefText = BaseListeCmp[ii].m_TextRef; + LastReferenceNumber = GetLastReferenceNumber( BaseListeCmp + ii, BaseListeCmp, NbOfCmp ); + } - /* Annotation of mono-part components ( 1 part per package ) (trivial case)*/ - if( BaseListeCmp[ii].m_NbParts <= 1 ) - { - if ( BaseListeCmp[ii].m_IsNew ) - { - LastReferenceNumber++; - BaseListeCmp[ii].m_NumRef = LastReferenceNumber; - } - BaseListeCmp[ii].m_Unit = 1; - BaseListeCmp[ii].m_Flag = 1; - BaseListeCmp[ii].m_IsNew = FALSE; - continue; - } + /* Annotation of mono-part components ( 1 part per package ) (trivial case)*/ + if( BaseListeCmp[ii].m_NbParts <= 1 ) + { + if( BaseListeCmp[ii].m_IsNew ) + { + LastReferenceNumber++; + BaseListeCmp[ii].m_NumRef = LastReferenceNumber; + } + BaseListeCmp[ii].m_Unit = 1; + BaseListeCmp[ii].m_Flag = 1; + BaseListeCmp[ii].m_IsNew = FALSE; + continue; + } - /* Annotation of multi-part components ( n parts per package ) (complex case) */ - ValText = BaseListeCmp[ii].m_TextValue; - NumberOfUnits = BaseListeCmp[ii].m_NbParts; + /* Annotation of multi-part components ( n parts per package ) (complex case) */ + ValText = BaseListeCmp[ii].m_TextValue; + NumberOfUnits = BaseListeCmp[ii].m_NbParts; - if ( BaseListeCmp[ii].m_IsNew ) - { - LastReferenceNumber++; BaseListeCmp[ii].m_NumRef = LastReferenceNumber; - if ( ! BaseListeCmp[ii].m_PartsLocked ) - BaseListeCmp[ii].m_Unit = 1; - BaseListeCmp[ii].m_Flag = 1; - } + if( BaseListeCmp[ii].m_IsNew ) + { + LastReferenceNumber++; BaseListeCmp[ii].m_NumRef = LastReferenceNumber; + if( !BaseListeCmp[ii].m_PartsLocked ) + BaseListeCmp[ii].m_Unit = 1; + BaseListeCmp[ii].m_Flag = 1; + } - for( Unit = 1; Unit <= NumberOfUnits; Unit++ ) - { - if( BaseListeCmp[ii].m_Unit == Unit ) continue; - jj = ExistUnit( BaseListeCmp + ii , Unit, BaseListeCmp, NbOfCmp ); - if ( jj >= 0 ) continue; /* Unit exists for this reference */ + for( Unit = 1; Unit <= NumberOfUnits; Unit++ ) + { + if( BaseListeCmp[ii].m_Unit == Unit ) + continue; + jj = ExistUnit( BaseListeCmp + ii, Unit, BaseListeCmp, NbOfCmp ); + if( jj >= 0 ) + continue; /* Unit exists for this reference */ - /* Search a component to annotate ( same prefix, same value) */ - for ( jj = ii+1; jj < NbOfCmp ; jj++ ) - { - ObjToTest = &BaseListeCmp[jj]; - if( BaseListeCmp[jj].m_Flag ) continue; - Text = BaseListeCmp[jj].m_TextRef; - if( strnicmp(RefText, Text, 32) != 0 ) break; // references are different - Text = BaseListeCmp[jj].m_TextValue; - if( strnicmp(ValText, Text, 32) != 0 ) break; // values are different - if ( ! BaseListeCmp[jj].m_IsNew ) - { - //BaseListeCmp[jj].m_Flag = 1; - continue; - } - /* Component without reference number found, annotate it if possible */ - if ( ! BaseListeCmp[jj].m_PartsLocked || (BaseListeCmp[jj].m_Unit == Unit) ) - { - BaseListeCmp[jj].m_NumRef = BaseListeCmp[ii].m_NumRef; - BaseListeCmp[jj].m_Unit = Unit; - BaseListeCmp[jj].m_Flag = 1; - BaseListeCmp[jj].m_IsNew = FALSE; - break; - } - } - } - } + /* Search a component to annotate ( same prefix, same value) */ + for( jj = ii + 1; jj < NbOfCmp; jj++ ) + { + ObjToTest = &BaseListeCmp[jj]; + if( BaseListeCmp[jj].m_Flag ) + continue; + Text = BaseListeCmp[jj].m_TextRef; + if( strnicmp( RefText, Text, 32 ) != 0 ) + break; // references are different + Text = BaseListeCmp[jj].m_TextValue; + if( strnicmp( ValText, Text, 32 ) != 0 ) + break; // values are different + if( !BaseListeCmp[jj].m_IsNew ) + { + //BaseListeCmp[jj].m_Flag = 1; + continue; + } + /* Component without reference number found, annotate it if possible */ + if( !BaseListeCmp[jj].m_PartsLocked || (BaseListeCmp[jj].m_Unit == Unit) ) + { + BaseListeCmp[jj].m_NumRef = BaseListeCmp[ii].m_NumRef; + BaseListeCmp[jj].m_Unit = Unit; + BaseListeCmp[jj].m_Flag = 1; + BaseListeCmp[jj].m_IsNew = FALSE; + break; + } + } + } + } } /*************************************************************************************************/ -static int GetLastReferenceNumber(CmpListStruct *Objet, CmpListStruct * BaseListeCmp, int NbOfCmp) +static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseListeCmp, int NbOfCmp ) /*************************************************************************************************/ -/* Recherche le plus grand numero de reference dans les composants - de meme prefixe de reference que celui pointe par Objet - la liste des composants est supposee triee -*/ -{ -CmpListStruct * LastObjet = BaseListeCmp + NbOfCmp; -int LastNumber = 0; -const char * RefText; - RefText = Objet->m_TextRef; - for ( ; Objet < LastObjet; Objet++ ) - { - if( strnicmp(RefText, Objet->m_TextRef, 32) != 0 ) /* Nouveau Identificateur */ - break; - if( LastNumber < Objet->m_NumRef ) LastNumber = Objet->m_NumRef; - } - return(LastNumber); +/* Recherche le plus grand numero de reference dans les composants + * de meme prefixe de reference que celui pointe par Objet + * la liste des composants est supposee triee + */ +{ + CmpListStruct* LastObjet = BaseListeCmp + NbOfCmp; + int LastNumber = 0; + const char* RefText; + + RefText = Objet->m_TextRef; + for( ; Objet < LastObjet; Objet++ ) + { + if( strnicmp( RefText, Objet->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ + break; + if( LastNumber < Objet->m_NumRef ) + LastNumber = Objet->m_NumRef; + } + + return LastNumber; } /*****************************************************************/ -static int ExistUnit(CmpListStruct *Objet, int Unit, - CmpListStruct * BaseListeCmp, int NbOfCmp) +static int ExistUnit( CmpListStruct* Objet, int Unit, + CmpListStruct* BaseListeCmp, int NbOfCmp ) /****************************************************************/ -/* Recherche dans la liste triee des composants, pour les composants - multiples s'il existe pour le composant de reference Objet, - une unite de numero Unit - Retourne index dans BaseListeCmp si oui - retourne -1 si non -*/ -{ -CmpListStruct * EndList = BaseListeCmp + NbOfCmp; -char * RefText, * ValText; -int NumRef, ii; -CmpListStruct *ItemToTest; - RefText = Objet->m_TextRef; - ValText = Objet->m_TextValue; - NumRef = Objet->m_NumRef; - for ( ItemToTest = BaseListeCmp, ii = 0; ItemToTest < EndList; ItemToTest++, ii++ ) - { - if ( Objet == ItemToTest ) continue; - if ( ItemToTest->m_IsNew ) continue; /* non affecte */ - if ( ItemToTest->m_NumRef != NumRef ) continue; - if( strnicmp(RefText, ItemToTest->m_TextRef, 32) != 0 ) /* Nouveau Identificateur */ - continue; - if( ItemToTest->m_Unit == Unit) - { - return(ii); - } - } - return(-1); +/* Recherche dans la liste triee des composants, pour les composants + * multiples s'il existe pour le composant de reference Objet, + * une unite de numero Unit + * Retourne index dans BaseListeCmp si oui + * retourne -1 si non + */ +{ + CmpListStruct* EndList = BaseListeCmp + NbOfCmp; + char* RefText, * ValText; + int NumRef, ii; + CmpListStruct* ItemToTest; + + RefText = Objet->m_TextRef; + ValText = Objet->m_TextValue; + NumRef = Objet->m_NumRef; + for( ItemToTest = BaseListeCmp, ii = 0; ItemToTest < EndList; ItemToTest++, ii++ ) + { + if( Objet == ItemToTest ) + continue; + if( ItemToTest->m_IsNew ) + continue; /* non affecte */ + if( ItemToTest->m_NumRef != NumRef ) + continue; + if( strnicmp( RefText, ItemToTest->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ + continue; + if( ItemToTest->m_Unit == Unit ) + { + return ii; + } + } + + return -1; } + /******************************************************************/ -int CheckAnnotate(WinEDA_SchematicFrame * frame, bool OneSheetOnly) +int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly ) /******************************************************************/ /* Retourne le nombre de composants non annotés ou de meme référence (doublés) - Si OneSheetOnly : recherche sur le schema courant - sinon: recherche sur toute la hierarchie -*/ + * Si OneSheetOnly : recherche sur le schema courant + * sinon: recherche sur toute la hierarchie + */ { -int NbSheet, ii, NumSheet = 1, error, NbOfCmp; -SCH_SCREEN *screen; -CmpListStruct * ListeCmp = NULL; -wxString Buff; -wxString msg, cmpref; + int NbSheet, ii, NumSheet = 1, error, NbOfCmp; + SCH_SCREEN* screen; + CmpListStruct* ListeCmp = NULL; + wxString Buff; + wxString msg, cmpref; - /* build tje screen list */ - EDA_ScreenList ScreenList(NULL); - NbSheet = ScreenList.GetCount(); + /* build tje screen list */ + EDA_ScreenList ScreenList( NULL ); - /* Update the sheet number, sheet count and date */ - ScreenSch->SetModify(); - ScreenList.UpdateSheetNumberAndDate(); - - /* 1ere passe : Comptage du nombre de composants */ - screen = (SCH_SCREEN*) frame->m_CurrentScreen; - if( ! OneSheetOnly ) - { - NbOfCmp = 0; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - NbOfCmp += ListeComposants(NULL, screen, NumSheet); - } - } - else NbOfCmp = ListeComposants(NULL, screen, NumSheet); + NbSheet = ScreenList.GetCount(); - if( NbOfCmp == 0 ) - { - wxBell(); - return(0); - } + /* Update the sheet number, sheet count and date */ + ScreenSch->SetModify(); + ScreenList.UpdateSheetNumberAndDate(); - ii = sizeof(CmpListStruct) * NbOfCmp; - ListeCmp = (CmpListStruct *) MyZMalloc(ii); + /* 1ere passe : Comptage du nombre de composants */ + screen = (SCH_SCREEN*) frame->m_CurrentScreen; + if( !OneSheetOnly ) + { + NbOfCmp = 0; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + NbOfCmp += ListeComposants( NULL, screen, NumSheet ); + } + } + else + NbOfCmp = ListeComposants( NULL, screen, NumSheet ); - /* 2eme passe : Remplissage du tableau des caracteristiques */ - if( OneSheetOnly == 0 ) - { - ii = 0; screen = ScreenSch; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - ii += ListeComposants(ListeCmp + ii, screen, NumSheet); - } - } - else - { - screen = (SCH_SCREEN*) frame->m_CurrentScreen; - ListeComposants(ListeCmp, screen, NumSheet); - } + if( NbOfCmp == 0 ) + { + wxBell(); + return 0; + } - qsort( ListeCmp, NbOfCmp, sizeof(CmpListStruct), - (int(*)(const void*, const void*))AnnotTriComposant); + ii = sizeof(CmpListStruct) * NbOfCmp; + ListeCmp = (CmpListStruct*) MyZMalloc( ii ); + + /* 2eme passe : Remplissage du tableau des caracteristiques */ + if( OneSheetOnly == 0 ) + { + ii = 0; screen = ScreenSch; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + ii += ListeComposants( ListeCmp + ii, screen, NumSheet ); + } + } + else + { + screen = (SCH_SCREEN*) frame->m_CurrentScreen; + ListeComposants( ListeCmp, screen, NumSheet ); + } + + qsort( ListeCmp, NbOfCmp, sizeof(CmpListStruct), + ( int( * ) ( const void*, const void* ) )AnnotTriComposant ); - /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ - BreakReference(ListeCmp, NbOfCmp); + /* Separation des Numeros de la reference: IC1 -> IC, et 1 dans .m_NumRef */ + BreakReference( ListeCmp, NbOfCmp ); - /* comptage des elements non annotes */ - error = 0; - for( ii = 0; ii < NbOfCmp-1 ; ii++ ) - { - msg.Empty(); Buff.Empty(); - if ( ListeCmp[ii].m_IsNew ) - { - if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; - else Buff = wxT("?"); - cmpref = CONV_FROM_UTF8(ListeCmp[ii].m_TextRef); - msg.Printf( _("item not annotated: %s%s"), cmpref.GetData(), Buff.GetData()); + /* comptage des elements non annotes */ + error = 0; + for( ii = 0; ii < NbOfCmp - 1; ii++ ) + { + msg.Empty(); Buff.Empty(); + if( ListeCmp[ii].m_IsNew ) + { + if( ListeCmp[ii].m_NumRef >= 0 ) + Buff << ListeCmp[ii].m_NumRef; + else + Buff = wxT( "?" ); + cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); + msg.Printf( _( "item not annotated: %s%s" ), cmpref.GetData(), Buff.GetData() ); - if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) - { - Buff.Printf( _("( unit %d)"), ListeCmp[ii].m_Unit); - msg << Buff; - } - DisplayError(NULL, msg); - error++; break; - } + if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) + { + Buff.Printf( _( "( unit %d)" ), ListeCmp[ii].m_Unit ); + msg << Buff; + } + DisplayError( NULL, msg ); + error++; break; + } - if( MAX(ListeCmp[ii].m_NbParts, 1) < ListeCmp[ii].m_Unit ) // Annotate error - { - if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; - else Buff = wxT("?"); + if( MAX( ListeCmp[ii].m_NbParts, 1 ) < ListeCmp[ii].m_Unit ) // Annotate error + { + if( ListeCmp[ii].m_NumRef >= 0 ) + Buff << ListeCmp[ii].m_NumRef; + else + Buff = wxT( "?" ); - cmpref = CONV_FROM_UTF8(ListeCmp[ii].m_TextRef); - msg.Printf( _("Error item %s%s"), cmpref.GetData(), Buff.GetData()); + cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); + msg.Printf( _( "Error item %s%s" ), cmpref.GetData(), Buff.GetData() ); - Buff.Printf( _(" unit %d and no more than %d parts"), - ListeCmp[ii].m_Unit, ListeCmp[ii].m_NbParts); - msg << Buff; - DisplayError(frame, msg); - error++; break; - } - } + Buff.Printf( _( " unit %d and no more than %d parts" ), + ListeCmp[ii].m_Unit, ListeCmp[ii].m_NbParts ); + msg << Buff; + DisplayError( frame, msg ); + error++; break; + } + } - if ( error ) return error; + if( error ) + return error; - /* comptage des elements doublés (si tous sont annotés) */ - for( ii = 0; (ii < NbOfCmp-1) && (error < 4); ii++ ) - { - msg.Empty(); Buff.Empty(); - if( (stricmp(ListeCmp[ii].m_TextRef,ListeCmp[ii+1].m_TextRef) != 0) || - ( ListeCmp[ii].m_NumRef != ListeCmp[ii+1].m_NumRef ) ) - continue; - /* Meme reference trouvée */ + /* comptage des elements doublés (si tous sont annotés) */ + for( ii = 0; (ii < NbOfCmp - 1) && (error < 4); ii++ ) + { + msg.Empty(); Buff.Empty(); + if( (stricmp( ListeCmp[ii].m_TextRef, ListeCmp[ii + 1].m_TextRef ) != 0) + || ( ListeCmp[ii].m_NumRef != ListeCmp[ii + 1].m_NumRef ) ) + continue; + /* Meme reference trouvée */ - /* Il y a erreur si meme unite */ - if( ListeCmp[ii].m_Unit == ListeCmp[ii+1].m_Unit ) - { + /* Il y a erreur si meme unite */ + if( ListeCmp[ii].m_Unit == ListeCmp[ii + 1].m_Unit ) + { + if( ListeCmp[ii].m_NumRef >= 0 ) + Buff << ListeCmp[ii].m_NumRef; + else + Buff = wxT( "?" ); - if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; - else Buff = wxT("?"); + cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); + msg.Printf( _( "Multiple item %s%s" ), + cmpref.GetData(), Buff.GetData() ); - cmpref = CONV_FROM_UTF8(ListeCmp[ii].m_TextRef); - msg.Printf( _("Multiple item %s%s"), - cmpref.GetData(),Buff.GetData()); + if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) + { + Buff.Printf( _( " (unit %d)" ), ListeCmp[ii].m_Unit ); + msg << Buff; + } + DisplayError( frame, msg ); + error++; continue; + } - if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) - { - Buff.Printf( _(" (unit %d)"), ListeCmp[ii].m_Unit); - msg << Buff; - } - DisplayError(frame, msg); - error++; continue; - } + /* Il y a erreur si unites differentes mais nombre de parts differentes + * par boitier (ex U3 ( 1 part) et U3B sont incompatibles) */ + if( ListeCmp[ii].m_NbParts != ListeCmp[ii + 1].m_NbParts ) + { + if( ListeCmp[ii].m_NumRef >= 0 ) + Buff << ListeCmp[ii].m_NumRef; + else + Buff = wxT( "?" ); - /* Il y a erreur si unites differentes mais nombre de parts differentes - par boitier (ex U3 ( 1 part) et U3B sont incompatibles) */ - if( ListeCmp[ii].m_NbParts != ListeCmp[ii+1].m_NbParts ) - { + cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); + msg.Printf( _( "Multiple item %s%s" ), cmpref.GetData(), Buff.GetData() ); - if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; - else Buff = wxT("?"); + if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) + { + Buff.Printf( _( " (unit %d)" ), ListeCmp[ii].m_Unit ); + msg << Buff; + } - cmpref = CONV_FROM_UTF8(ListeCmp[ii].m_TextRef); - msg.Printf( _("Multiple item %s%s"), cmpref.GetData(), Buff.GetData()); + DisplayError( frame, msg ); + error++; + } - if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) - { - Buff.Printf( _(" (unit %d)"), ListeCmp[ii].m_Unit); - msg << Buff; - } + /* Il y a erreur si unites differentes ET valeurs différentes */ + if( stricmp( ListeCmp[ii].m_TextValue, ListeCmp[ii + 1].m_TextValue ) != 0 ) + { + wxString nextcmpref, cmpvalue, nextcmpvalue; + cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); + nextcmpref = CONV_FROM_UTF8( ListeCmp[ii + 1].m_TextRef ); + cmpvalue = CONV_FROM_UTF8( ListeCmp[ii].m_TextValue ); + nextcmpvalue = CONV_FROM_UTF8( ListeCmp[ii + 1].m_TextValue ); + msg.Printf( _( "Diff values for %s%d%c (%s) and %s%d%c (%s)" ), + cmpref.GetData(), ListeCmp[ii].m_NumRef, ListeCmp[ii].m_Unit + 'A' - 1, + cmpvalue.GetData(), + nextcmpref.GetData( + ), ListeCmp[ii + 1].m_NumRef, ListeCmp[ii + 1].m_Unit + 'A' - 1, + nextcmpvalue.GetData() ); - DisplayError(frame, msg); - error++; - } + DisplayError( frame, msg ); + error++; + } + } - /* Il y a erreur si unites differentes ET valeurs différentes */ - if( stricmp(ListeCmp[ii].m_TextValue,ListeCmp[ii+1].m_TextValue) != 0) - { - wxString nextcmpref, cmpvalue, nextcmpvalue; - cmpref = CONV_FROM_UTF8(ListeCmp[ii].m_TextRef); - nextcmpref = CONV_FROM_UTF8(ListeCmp[ii+1].m_TextRef); - cmpvalue = CONV_FROM_UTF8(ListeCmp[ii].m_TextValue); - nextcmpvalue = CONV_FROM_UTF8(ListeCmp[ii+1].m_TextValue); - msg.Printf( _("Diff values for %s%d%c (%s) and %s%d%c (%s)"), - cmpref.GetData(), ListeCmp[ii].m_NumRef, ListeCmp[ii].m_Unit+'A'-1, - cmpvalue.GetData(), - nextcmpref.GetData(), ListeCmp[ii+1].m_NumRef, ListeCmp[ii+1].m_Unit+'A'-1, - nextcmpvalue.GetData()); - - DisplayError(frame, msg); - error++; - } - } - - MyFree(ListeCmp); - return(error); + MyFree( ListeCmp ); + return error; } - - diff --git a/eeschema/class_screen.h b/eeschema/class_screen.h index 7c23cca07d..a2a45e716f 100644 --- a/eeschema/class_screen.h +++ b/eeschema/class_screen.h @@ -90,11 +90,11 @@ class SCH_SCREEN : public BASE_SCREEN public: SCH_SCREEN( int idtype, KICAD_T aType = SCREEN_STRUCT_TYPE ); ~SCH_SCREEN(); + virtual wxString GetClass() const { return wxT("SCH_SCREEN"); } - void FreeDrawList(); // Free EESchema drawing list (does not delete the sub hierarchies) diff --git a/eeschema/cleanup.cpp b/eeschema/cleanup.cpp index fa84f57d18..56efb19247 100644 --- a/eeschema/cleanup.cpp +++ b/eeschema/cleanup.cpp @@ -1,6 +1,6 @@ - /*********************************/ - /* Module de nettoyage du schema */ - /*********************************/ +/*********************************/ +/* Module de nettoyage du schema */ +/*********************************/ #include "fctsys.h" #include "gr_basic.h" @@ -15,243 +15,254 @@ /* Routines locales */ -static int TstAlignSegment(EDA_DrawLineStruct* RefSegm, EDA_DrawLineStruct* TstSegm); +static int TstAlignSegment( EDA_DrawLineStruct* RefSegm, EDA_DrawLineStruct* TstSegm ); /* Variable locales */ /*******************************************/ -bool SCH_SCREEN::SchematicCleanUp(wxDC * DC) +bool SCH_SCREEN::SchematicCleanUp( wxDC* DC ) /*******************************************/ -/* Routine de nettoyage: - - regroupe les segments de fils (ou de bus) alignes en 1 seul segment - - Detecte les objets identiques superposes -*/ -{ -EDA_BaseStruct *DrawList, * TstDrawList; -int flag; -bool Modify = FALSE; - DrawList = EEDrawList; - for ( ;DrawList != NULL; DrawList = DrawList->Pnext ) - { - if( DrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE ) - { - TstDrawList = DrawList->Pnext; - while ( TstDrawList ) - { - if( TstDrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE ) - { - flag = TstAlignSegment( (EDA_DrawLineStruct*)DrawList, - (EDA_DrawLineStruct*)TstDrawList); - if (flag ) /* Suppression de TstSegm */ - { - /* keep the bits set in .m_Flags, because the deleted segment can be flagged */ - DrawList->m_Flags |= TstDrawList->m_Flags; - EraseStruct(TstDrawList, this); - SetRefreshReq(); - TstDrawList = EEDrawList; - Modify = TRUE; - } - else TstDrawList = TstDrawList->Pnext; - } - else TstDrawList = TstDrawList->Pnext; - } - } - } - EDA_Appl->SchematicFrame->TestDanglingEnds(EEDrawList, DC); - return Modify; +/* Routine de nettoyage: + * - regroupe les segments de fils (ou de bus) alignes en 1 seul segment + * - Detecte les objets identiques superposes + */ +{ + EDA_BaseStruct* DrawList, * TstDrawList; + int flag; + bool Modify = FALSE; + + DrawList = EEDrawList; + for( ; DrawList != NULL; DrawList = DrawList->Pnext ) + { + if( DrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE ) + { + TstDrawList = DrawList->Pnext; + while( TstDrawList ) + { + if( TstDrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE ) + { + flag = TstAlignSegment( (EDA_DrawLineStruct*) DrawList, + (EDA_DrawLineStruct*) TstDrawList ); + if( flag ) /* Suppression de TstSegm */ + { + /* keep the bits set in .m_Flags, because the deleted segment can be flagged */ + DrawList->m_Flags |= TstDrawList->m_Flags; + EraseStruct( TstDrawList, this ); + SetRefreshReq(); + TstDrawList = EEDrawList; + Modify = TRUE; + } + else + TstDrawList = TstDrawList->Pnext; + } + else + TstDrawList = TstDrawList->Pnext; + } + } + } + + EDA_Appl->SchematicFrame->TestDanglingEnds( EEDrawList, DC ); + return Modify; } /***********************************************/ -void BreakSegmentOnJunction( SCH_SCREEN * Screen ) +void BreakSegmentOnJunction( SCH_SCREEN* Screen ) /************************************************/ + /* Routine creant des debuts / fin de segment (BUS ou WIRES) sur les jonctions -et les raccords -*/ + * et les raccords + */ { -EDA_BaseStruct *DrawList; + EDA_BaseStruct* DrawList; - if( Screen == NULL ) - { - DisplayError(NULL, wxT("BreakSegmentOnJunction() error: NULL screen")); - return; - } + if( Screen == NULL ) + { + DisplayError( NULL, wxT( "BreakSegmentOnJunction() error: NULL screen" ) ); + return; + } - DrawList = Screen->EEDrawList; - while ( DrawList ) - { - switch( DrawList->Type() ) - { - case DRAW_JUNCTION_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawJunctionStruct*)DrawList) - BreakSegment(Screen, STRUCT->m_Pos); - break; + DrawList = Screen->EEDrawList; + while( DrawList ) + { + switch( DrawList->Type() ) + { + case DRAW_JUNCTION_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawJunctionStruct*) DrawList ) + BreakSegment( Screen, STRUCT->m_Pos ); + break; - case DRAW_BUSENTRY_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawBusEntryStruct*)DrawList) - BreakSegment(Screen, STRUCT->m_Pos); - BreakSegment(Screen, STRUCT->m_End()); - break; + case DRAW_BUSENTRY_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawBusEntryStruct*) DrawList ) + BreakSegment( Screen, STRUCT->m_Pos ); + BreakSegment( Screen, STRUCT->m_End() ); + break; - case DRAW_SEGMENT_STRUCT_TYPE : - case DRAW_NOCONNECT_STRUCT_TYPE : - case DRAW_LABEL_STRUCT_TYPE : - case DRAW_GLOBAL_LABEL_STRUCT_TYPE : - case DRAW_LIB_ITEM_STRUCT_TYPE : - case DRAW_PICK_ITEM_STRUCT_TYPE : - case DRAW_POLYLINE_STRUCT_TYPE : - case DRAW_MARKER_STRUCT_TYPE : - case DRAW_TEXT_STRUCT_TYPE : - case DRAW_SHEET_STRUCT_TYPE : - case DRAW_SHEETLABEL_STRUCT_TYPE : - break; + case DRAW_SEGMENT_STRUCT_TYPE: + case DRAW_NOCONNECT_STRUCT_TYPE: + case DRAW_LABEL_STRUCT_TYPE: + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + case DRAW_LIB_ITEM_STRUCT_TYPE: + case DRAW_PICK_ITEM_STRUCT_TYPE: + case DRAW_POLYLINE_STRUCT_TYPE: + case DRAW_MARKER_STRUCT_TYPE: + case DRAW_TEXT_STRUCT_TYPE: + case DRAW_SHEET_STRUCT_TYPE: + case DRAW_SHEETLABEL_STRUCT_TYPE: + break; - default : - break; - } - DrawList = DrawList->Pnext; - } + default: + break; + } + DrawList = DrawList->Pnext; + } } /*********************************************************/ -DrawPickedStruct * BreakSegment(SCH_SCREEN * screen, - wxPoint breakpoint, bool PutInUndoList) +DrawPickedStruct* BreakSegment( SCH_SCREEN* screen, + wxPoint breakpoint, bool PutInUndoList ) /*********************************************************/ + /* Coupe un segment ( BUS, WIRE ) en 2 au point breakpoint, - - si ce point est sur le segment - - extremites non comprises - If PutInUndoList == TRUE, create a list of modifictions, for undo command -*/ + * - si ce point est sur le segment + * - extremites non comprises + * If PutInUndoList == TRUE, create a list of modifictions, for undo command + */ { -EDA_BaseStruct *DrawList; -EDA_DrawLineStruct * segment, * NewSegment; -int ox, oy, fx, fy; -DrawPickedStruct * List = NULL; - - DrawList = screen->EEDrawList; - while ( DrawList ) - { - switch( DrawList->Type() ) - { - case DRAW_SEGMENT_STRUCT_TYPE : - segment = (EDA_DrawLineStruct*)DrawList; - ox = segment->m_Start.x; oy = segment->m_Start.y; - fx = segment->m_End.x; fy = segment->m_End.y; - if( distance( fx - ox, fy - oy, breakpoint.x - ox, breakpoint.y - oy, 0 ) == 0 ) - break; - /* Segment connecte: doit etre coupe en 2 si px,py n'est - pas une extremite */ - if( (ox == breakpoint.x) && (oy == breakpoint.y ) ) break; - if( (fx == breakpoint.x) && (fy == breakpoint.y ) ) break; - /* Ici il faut couper le segment en 2 */ - if ( PutInUndoList ) // First: put copy of the old segment in undo list - { - DrawPickedStruct * wrapper = new DrawPickedStruct(); - wrapper->m_Flags = IS_CHANGED; - wrapper->m_PickedStruct = segment->GenCopy(); - wrapper->m_Image = segment; - wrapper->m_PickedStruct->m_Image = segment; - wrapper->Pnext = List; - List = wrapper; - } - NewSegment = segment->GenCopy(); - NewSegment->m_Start = breakpoint; - segment->m_End = NewSegment->m_Start; - NewSegment->Pnext = segment->Pnext; - segment->Pnext = NewSegment; - DrawList = NewSegment; - if ( PutInUndoList ) - { - DrawPickedStruct * wrapper = new DrawPickedStruct(); - wrapper->m_Flags = IS_NEW; - wrapper->m_Image = NewSegment; - wrapper->Pnext = List; - List = wrapper; - } - break; + EDA_BaseStruct* DrawList; + EDA_DrawLineStruct* segment, * NewSegment; + int ox, oy, fx, fy; + DrawPickedStruct* List = NULL; - case DRAW_JUNCTION_STRUCT_TYPE : - case DRAW_BUSENTRY_STRUCT_TYPE : - case DRAW_POLYLINE_STRUCT_TYPE : - break; + DrawList = screen->EEDrawList; + while( DrawList ) + { + switch( DrawList->Type() ) + { + case DRAW_SEGMENT_STRUCT_TYPE: + segment = (EDA_DrawLineStruct*) DrawList; + ox = segment->m_Start.x; oy = segment->m_Start.y; + fx = segment->m_End.x; fy = segment->m_End.y; + if( distance( fx - ox, fy - oy, breakpoint.x - ox, breakpoint.y - oy, 0 ) == 0 ) + break; - default : - break; - } - DrawList = DrawList->Pnext; - } - - return List; + /* Segment connecte: doit etre coupe en 2 si px,py n'est + * pas une extremite */ + if( (ox == breakpoint.x) && (oy == breakpoint.y ) ) + break; + if( (fx == breakpoint.x) && (fy == breakpoint.y ) ) + break; + /* Ici il faut couper le segment en 2 */ + if( PutInUndoList ) // First: put copy of the old segment in undo list + { + DrawPickedStruct* wrapper = new DrawPickedStruct(); + + wrapper->m_Flags = IS_CHANGED; + wrapper->m_PickedStruct = segment->GenCopy(); + wrapper->m_Image = segment; + wrapper->m_PickedStruct->m_Image = segment; + wrapper->Pnext = List; + List = wrapper; + } + NewSegment = segment->GenCopy(); + NewSegment->m_Start = breakpoint; + segment->m_End = NewSegment->m_Start; + NewSegment->Pnext = segment->Pnext; + segment->Pnext = NewSegment; + DrawList = NewSegment; + if( PutInUndoList ) + { + DrawPickedStruct* wrapper = new DrawPickedStruct(); + + wrapper->m_Flags = IS_NEW; + wrapper->m_Image = NewSegment; + wrapper->Pnext = List; + List = wrapper; + } + break; + + case DRAW_JUNCTION_STRUCT_TYPE: + case DRAW_BUSENTRY_STRUCT_TYPE: + case DRAW_POLYLINE_STRUCT_TYPE: + break; + + default: + break; + } + + DrawList = DrawList->Pnext; + } + + return List; } - /***********************************************************/ -static int TstAlignSegment( EDA_DrawLineStruct* RefSegm, - EDA_DrawLineStruct* TstSegm) +static int TstAlignSegment( EDA_DrawLineStruct* RefSegm, + EDA_DrawLineStruct* TstSegm ) /***********************************************************/ /* Search if the 2 segments RefSegm and TstSegm are on a line. - Retourn 0 if no - 1 if yes, and RefSegm is modified to be the equivalent segment -*/ + * Retourn 0 if no + * 1 if yes, and RefSegm is modified to be the equivalent segment + */ { - if( RefSegm == TstSegm ) return(0); - if( RefSegm->m_Layer != TstSegm->m_Layer ) return(0); - - // search for a common end, and modify coordinates to ensure RefSegm->m_End == TstSegm->m_Start - if ( RefSegm->m_Start == TstSegm->m_Start ) - { - if ( RefSegm->m_End == TstSegm->m_End ) // trivial case: RefSegm and TstSegm are identical - return 1; - EXCHG(RefSegm->m_Start, RefSegm->m_End); // at this point, RefSegm->m_End == TstSegm->m_Start - } - else if ( RefSegm->m_Start == TstSegm->m_End ) - { - EXCHG(RefSegm->m_Start, RefSegm->m_End); - EXCHG(TstSegm->m_Start, TstSegm->m_End); // at this point, RefSegm->m_End == TstSegm->m_Start - } - else if ( RefSegm->m_End == TstSegm->m_End ) - { - EXCHG(TstSegm->m_Start, TstSegm->m_End); // at this point, RefSegm->m_End == TstSegm->m_Start - } - else if ( RefSegm->m_End != TstSegm->m_Start ) // No common end point, segments cannot be merged - return 0; + if( RefSegm == TstSegm ) + return 0; + if( RefSegm->m_Layer != TstSegm->m_Layer ) + return 0; - /* Test alignment: */ - if ( RefSegm->m_Start.y == RefSegm->m_End.y ) // Horizontal segment - { - if ( TstSegm->m_Start.y == TstSegm->m_End.y ) - { - RefSegm->m_End = TstSegm->m_End; - return 1; - } - } - - else if ( RefSegm->m_Start.x == RefSegm->m_End.x ) // Vertical segment - { - if ( TstSegm->m_Start.x == TstSegm->m_End.x ) - { - RefSegm->m_End = TstSegm->m_End; - return 1; - } - } - - else - { - if (atan2(RefSegm->m_Start.x - RefSegm->m_End.x, RefSegm->m_Start.y - RefSegm->m_End.y) == - atan2(TstSegm->m_Start.x - TstSegm->m_End.x, TstSegm->m_Start.y - TstSegm->m_End.y) ) - { - RefSegm->m_End = TstSegm->m_End; - return 1; - } - } - - return(0); + // search for a common end, and modify coordinates to ensure RefSegm->m_End == TstSegm->m_Start + if( RefSegm->m_Start == TstSegm->m_Start ) + { + if( RefSegm->m_End == TstSegm->m_End ) // trivial case: RefSegm and TstSegm are identical + return 1; + EXCHG( RefSegm->m_Start, RefSegm->m_End ); // at this point, RefSegm->m_End == TstSegm->m_Start + } + else if( RefSegm->m_Start == TstSegm->m_End ) + { + EXCHG( RefSegm->m_Start, RefSegm->m_End ); + EXCHG( TstSegm->m_Start, TstSegm->m_End ); // at this point, RefSegm->m_End == TstSegm->m_Start + } + else if( RefSegm->m_End == TstSegm->m_End ) + { + EXCHG( TstSegm->m_Start, TstSegm->m_End ); // at this point, RefSegm->m_End == TstSegm->m_Start + } + else if( RefSegm->m_End != TstSegm->m_Start ) // No common end point, segments cannot be merged + return 0; + + /* Test alignment: */ + if( RefSegm->m_Start.y == RefSegm->m_End.y ) // Horizontal segment + { + if( TstSegm->m_Start.y == TstSegm->m_End.y ) + { + RefSegm->m_End = TstSegm->m_End; + return 1; + } + } + else if( RefSegm->m_Start.x == RefSegm->m_End.x ) // Vertical segment + { + if( TstSegm->m_Start.x == TstSegm->m_End.x ) + { + RefSegm->m_End = TstSegm->m_End; + return 1; + } + } + else + { + if( atan2( RefSegm->m_Start.x - RefSegm->m_End.x, RefSegm->m_Start.y - + RefSegm->m_End.y ) == + atan2( TstSegm->m_Start.x - TstSegm->m_End.x, TstSegm->m_Start.y - TstSegm->m_End.y ) ) + { + RefSegm->m_End = TstSegm->m_End; + return 1; + } + } + + return 0; } - diff --git a/eeschema/cmpclass.cpp b/eeschema/cmpclass.cpp index b702b8a88d..f7678eb997 100644 --- a/eeschema/cmpclass.cpp +++ b/eeschema/cmpclass.cpp @@ -143,6 +143,23 @@ wxString DrawMarkerStruct::GetComment() } +#if defined(DEBUG) +/** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ +void DrawMarkerStruct::Show( int nestLevel, std::ostream& os ) +{ + // for now, make it look like XML: + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos + << "/>\n"; +} +#endif + + /***************************/ /* Class EDA_DrawLineStruct */ /***************************/ @@ -201,6 +218,28 @@ bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos ) } +#if defined(DEBUG) +/** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ +void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os ) +{ + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << + " layer=\"" << m_Layer << '"' << + " width=\"" << m_Width << '"' << + " startIsDangling=\"" << m_StartIsDangling << '"' << + " endIsDangling=\"" << m_EndIsDangling << '"' << ">" << + " " << + " " << + "\n"; +} +#endif + + /****************************/ /* Class DrawPolylineStruct */ /****************************/ diff --git a/eeschema/component_class.cpp b/eeschema/component_class.cpp index e1d9a1ff4a..1abf758df3 100644 --- a/eeschema/component_class.cpp +++ b/eeschema/component_class.cpp @@ -17,94 +17,121 @@ #include "macros.h" - /***************************/ - /* class DrawPartStruct */ - /* class EDA_SchComponentStruct */ - /***************************/ +/***************************/ +/* class DrawPartStruct */ +/* class EDA_SchComponentStruct */ +/***************************/ /***********************************************************************************/ -DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint & pos): - EDA_BaseStruct(struct_type) +DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint& pos ) : + EDA_BaseStruct( struct_type ) /***********************************************************************************/ { - m_Pos = pos; - m_TimeStamp = 0; + m_Layer = 0; + m_Pos = pos; + m_TimeStamp = 0; } + /************************************/ DrawPartStruct::~DrawPartStruct() /************************************/ { } + /****************************************************************/ -wxString ReturnDefaultFieldName(int FieldNumber) +const wxString& ReturnDefaultFieldName( int aFieldNdx ) /****************************************************************/ -/* Return the defult ield name from its number (REFERENCE, VALUE ..) - FieldDefaultNameList is not static, because we want the text translation - for I18n -*/ + +/* Return the default field name from its index (REFERENCE, VALUE ..) + * FieldDefaultNameList is not static, because we want the text translation + * for I18n + */ { -wxString FieldDefaultNameList[] = { - _("Ref"), /* Reference of part, i.e. "IC21" */ - _("Value"), /* Value of part, i.e. "3.3K" */ - _("Footprint"), /* Footprint, used by cvpcb or pcbnew, i.e. "16DIP300" */ - _("Sheet"), /* for components which are a schematic file, schematic file name, i.e. "cnt16.sch" */ - _("Field") /* User fields (1 to n) have an editable name*/ - }; -int ii = FieldNumber; - if ( ii > FIELD1 ) ii = FIELD1; -wxString FieldName = FieldDefaultNameList[ii]; - - if (FieldNumber >= FIELD1 ) FieldName << (FieldNumber - FIELD1 + 1); - return FieldName; + // avoid unnecessarily copying wxStrings. + static const wxString FieldDefaultNameList[] = { + _( "Ref" ), /* Reference of part, i.e. "IC21" */ + _( "Value" ), /* Value of part, i.e. "3.3K" */ + _( "Footprint" ), /* Footprint, used by cvpcb or pcbnew, i.e. "16DIP300" */ + _( "Sheet" ), /* for components which are a schematic file, schematic file name, i.e. "cnt16.sch" */ + _( "Field1" ), /* User fields (1 to n) have an editable name*/ + _( "Field2" ), + _( "Field3" ), + _( "Field4" ), + _( "Field5" ), + _( "Field6" ), + _( "Field7" ), + _( "Field8" ), + wxT( "badFieldNdx!" ) // error, and "sentinel" value + }; + + if( (unsigned) aFieldNdx > FIELD8 ) // catches < 0 also + aFieldNdx = FIELD8+1; // return the sentinel text + + return FieldDefaultNameList[aFieldNdx]; } /****************************************************************/ -wxString EDA_SchComponentStruct::ReturnFieldName(int FieldNumber) +const wxString& EDA_SchComponentStruct::ReturnFieldName( int aFieldNdx ) const /****************************************************************/ -/* Return the Field name from its number (REFERENCE, VALUE ..) -*/ + +/* Return the Field name from its index (REFERENCE, VALUE ..) + */ { -wxString FieldName = m_Field[FieldNumber].m_Name; - - if ( (FieldNumber < FIELD1) || FieldName.IsEmpty() ) - FieldName = ReturnDefaultFieldName(FieldNumber); - return FieldName; + // avoid unnecessarily copying wxStrings. + + if( aFieldNdx < FIELD1 || m_Field[aFieldNdx].m_Name.IsEmpty() ) + return ReturnDefaultFieldName( aFieldNdx ); + + return m_Field[aFieldNdx].m_Name; +} + + +const wxString& EDA_SchComponentStruct::GetFieldValue( int aFieldNdx ) const +{ + // avoid unnecessarily copying wxStrings. + static const wxString myEmpty = wxEmptyString; + + if( (unsigned) aFieldNdx > FIELD8 || m_Field[aFieldNdx].m_Text.IsEmpty() ) + return myEmpty; + + return m_Field[aFieldNdx].m_Text; } /*******************************************************************/ -EDA_SchComponentStruct::EDA_SchComponentStruct(const wxPoint & pos): - DrawPartStruct(DRAW_LIB_ITEM_STRUCT_TYPE, pos) +EDA_SchComponentStruct::EDA_SchComponentStruct( const wxPoint& pos ) : + DrawPartStruct( DRAW_LIB_ITEM_STRUCT_TYPE, pos ) /*******************************************************************/ { -int ii; - m_Multi = 0; /* In multi unit chip - which unit to draw. */ - m_RefIdNumber = 0; - m_FlagControlMulti = 0; - m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */ - /* The rotation/mirror transformation matrix. pos normal*/ - m_Transform[0][0] = 1; - m_Transform[0][1] = 0; - m_Transform[1][0] = 0; - m_Transform[1][1] = -1; + int ii; - /* initialisation des Fields */ - for(ii = 0; ii < NUMBER_OF_FIELDS; ii++) - { - m_Field[ii].m_Pos = m_Pos; - m_Field[ii].m_Layer = LAYER_FIELDS; - m_Field[ii].m_FieldId = REFERENCE + ii; - m_Field[ii].m_Parent = this; - } + m_Multi = 0; /* In multi unit chip - which unit to draw. */ + m_RefIdNumber = 0; + m_FlagControlMulti = 0; + m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */ + + /* The rotation/mirror transformation matrix. pos normal*/ + m_Transform[0][0] = 1; + m_Transform[0][1] = 0; + m_Transform[1][0] = 0; + m_Transform[1][1] = -1; - m_Field[VALUE].m_Layer = LAYER_VALUEPART; - m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART; + /* initialisation des Fields */ + for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + { + m_Field[ii].m_Pos = m_Pos; + m_Field[ii].m_Layer = LAYER_FIELDS; + m_Field[ii].m_FieldId = REFERENCE + ii; + m_Field[ii].m_Parent = this; + } - m_PinIsDangling = NULL; + m_Field[VALUE].m_Layer = LAYER_VALUEPART; + m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART; + m_PinIsDangling = NULL; } @@ -112,301 +139,317 @@ int ii; EDA_Rect EDA_SchComponentStruct::GetBoundaryBox() /**********************************************************************/ { -EDA_LibComponentStruct * Entry = FindLibPart(m_ChipName.GetData(), wxEmptyString, FIND_ROOT); -EDA_Rect BoundaryBox; -int x0, xm, y0, ym; - /* Get the basic Boundary box */ - if ( Entry ) - { - BoundaryBox = Entry->GetBoundaryBox( m_Multi, m_Convert); - x0 = BoundaryBox.GetX(); xm = BoundaryBox.GetRight(); - // We must reverse Y values, because matrix orientation - // suppose Y axis normal for the library items coordinates, - // m_Transform reverse Y values, but BoundaryBox ais already reversed! - y0 = - BoundaryBox.GetY(); - ym = - BoundaryBox.GetBottom(); - } - else /* if lib Entry not found, give a reasonable size */ - { - x0 = y0 = -50; - xm = ym = 50; - } + EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + EDA_Rect BoundaryBox; + int x0, xm, y0, ym; - /* Compute the real Boundary box (rotated, mirrored ...)*/ - int x1 = m_Transform[0][0] * x0 + m_Transform[0][1] * y0; + /* Get the basic Boundary box */ + if( Entry ) + { + BoundaryBox = Entry->GetBoundaryBox( m_Multi, m_Convert ); + x0 = BoundaryBox.GetX(); xm = BoundaryBox.GetRight(); - int y1 = m_Transform[1][0] * x0 + m_Transform[1][1] * y0; + // We must reverse Y values, because matrix orientation + // suppose Y axis normal for the library items coordinates, + // m_Transform reverse Y values, but BoundaryBox ais already reversed! + y0 = -BoundaryBox.GetY(); + ym = -BoundaryBox.GetBottom(); + } + else /* if lib Entry not found, give a reasonable size */ + { + x0 = y0 = -50; + xm = ym = 50; + } - int x2 = m_Transform[0][0] * xm + m_Transform[0][1] * ym; + /* Compute the real Boundary box (rotated, mirrored ...)*/ + int x1 = m_Transform[0][0] * x0 + m_Transform[0][1] * y0; - int y2 = m_Transform[1][0] * xm + m_Transform[1][1] * ym; + int y1 = m_Transform[1][0] * x0 + m_Transform[1][1] * y0; - // H and W must be > 0 for wxRect: - if ( x2 < x1 ) EXCHG( x2, x1 ); - if ( y2 < y1 ) EXCHG( y2, y1 ); - BoundaryBox.SetX(x1); BoundaryBox.SetY(y1); - BoundaryBox.SetWidth(x2-x1); - BoundaryBox.SetHeight(y2-y1); + int x2 = m_Transform[0][0] * xm + m_Transform[0][1] * ym; - BoundaryBox.Offset(m_Pos); - return BoundaryBox; + int y2 = m_Transform[1][0] * xm + m_Transform[1][1] * ym; + + // H and W must be > 0 for wxRect: + if( x2 < x1 ) + EXCHG( x2, x1 ); + if( y2 < y1 ) + EXCHG( y2, y1 ); + + BoundaryBox.SetX( x1 ); BoundaryBox.SetY( y1 ); + BoundaryBox.SetWidth( x2 - x1 ); + BoundaryBox.SetHeight( y2 - y1 ); + + BoundaryBox.Offset( m_Pos ); + return BoundaryBox; } /**************************************************************************/ -void PartTextStruct::SwapData(PartTextStruct * copyitem) +void PartTextStruct::SwapData( PartTextStruct* copyitem ) /**************************************************************************/ + /* Used if undo / redo command: - swap data between this and copyitem -*/ + * swap data between this and copyitem + */ { - EXCHG(m_Text, copyitem->m_Text); - EXCHG(m_Layer, copyitem->m_Layer); - EXCHG(m_Pos, copyitem->m_Pos); - EXCHG(m_Size, copyitem->m_Size); - EXCHG(m_Width, copyitem->m_Width); - EXCHG(m_Orient, copyitem->m_Orient); - EXCHG(m_Miroir, copyitem->m_Miroir); - EXCHG(m_Attributs, copyitem->m_Attributs); - EXCHG(m_CharType, copyitem->m_CharType); - EXCHG(m_HJustify, copyitem->m_HJustify); - EXCHG(m_VJustify, copyitem->m_VJustify); - EXCHG(m_ZoomLevelDrawable, copyitem->m_ZoomLevelDrawable); - EXCHG(m_TextDrawings, copyitem->m_TextDrawings); - EXCHG(m_TextDrawingsSize, copyitem->m_TextDrawingsSize); + EXCHG( m_Text, copyitem->m_Text ); + EXCHG( m_Layer, copyitem->m_Layer ); + EXCHG( m_Pos, copyitem->m_Pos ); + EXCHG( m_Size, copyitem->m_Size ); + EXCHG( m_Width, copyitem->m_Width ); + EXCHG( m_Orient, copyitem->m_Orient ); + EXCHG( m_Miroir, copyitem->m_Miroir ); + EXCHG( m_Attributs, copyitem->m_Attributs ); + EXCHG( m_CharType, copyitem->m_CharType ); + EXCHG( m_HJustify, copyitem->m_HJustify ); + EXCHG( m_VJustify, copyitem->m_VJustify ); + EXCHG( m_ZoomLevelDrawable, copyitem->m_ZoomLevelDrawable ); + EXCHG( m_TextDrawings, copyitem->m_TextDrawings ); + EXCHG( m_TextDrawingsSize, copyitem->m_TextDrawingsSize ); } + /**************************************************************************/ -void EDA_SchComponentStruct::SwapData(EDA_SchComponentStruct * copyitem) +void EDA_SchComponentStruct::SwapData( EDA_SchComponentStruct* copyitem ) /**************************************************************************/ + /* Used if undo / redo command: - swap data between this and copyitem -*/ + * swap data between this and copyitem + */ { - EXCHG(m_Pos, copyitem->m_Pos); - EXCHG(m_Multi, copyitem->m_Multi); - EXCHG(m_Convert, copyitem->m_Convert); - EXCHG(m_Transform[0][0], copyitem->m_Transform[0][0]); - EXCHG(m_Transform[0][1], copyitem->m_Transform[0][1]); - EXCHG(m_Transform[1][0], copyitem->m_Transform[1][0]); - EXCHG(m_Transform[1][1], copyitem->m_Transform[1][1]); - for ( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) - { - m_Field[ii].SwapData(©item->m_Field[ii]); - } + EXCHG( m_Pos, copyitem->m_Pos ); + EXCHG( m_Multi, copyitem->m_Multi ); + EXCHG( m_Convert, copyitem->m_Convert ); + EXCHG( m_Transform[0][0], copyitem->m_Transform[0][0] ); + EXCHG( m_Transform[0][1], copyitem->m_Transform[0][1] ); + EXCHG( m_Transform[1][0], copyitem->m_Transform[1][0] ); + EXCHG( m_Transform[1][1], copyitem->m_Transform[1][1] ); + for( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + { + m_Field[ii].SwapData( ©item->m_Field[ii] ); + } } /***********************************************************************/ -void EDA_SchComponentStruct::Place(WinEDA_DrawFrame * frame, wxDC * DC) +void EDA_SchComponentStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) /***********************************************************************/ { - /* save old text in undo list */ - if ( g_ItemToUndoCopy && - (g_ItemToUndoCopy->Type() == Type()) && - ((m_Flags & IS_NEW) == 0) ) - { - /* restore old values and save new ones */ - SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy); - /* save in undo list */ - ((WinEDA_SchematicFrame*)frame)->SaveCopyInUndoList(this, IS_CHANGED); - /* restore new values */ - SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy); - delete g_ItemToUndoCopy; - g_ItemToUndoCopy = NULL; - } + /* save old text in undo list */ + if( g_ItemToUndoCopy + && ( g_ItemToUndoCopy->Type() == Type() ) + && ( (m_Flags & IS_NEW) == 0 ) ) + { + /* restore old values and save new ones */ + SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); + + /* save in undo list */ + ( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( this, IS_CHANGED ); + + /* restore new values */ + SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); + + delete g_ItemToUndoCopy; + g_ItemToUndoCopy = NULL; + } - EDA_BaseStruct::Place(frame, DC); + EDA_BaseStruct::Place( frame, DC ); } /***************************************************/ void EDA_SchComponentStruct::ClearAnnotation() /***************************************************/ + /* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1) -*/ + */ { - m_RefIdNumber = 0; + m_RefIdNumber = 0; - while ( isdigit(m_Field[REFERENCE].m_Text.Last() ) ) - m_Field[REFERENCE].m_Text.RemoveLast(); - if ( m_Field[REFERENCE].m_Text.Last() != '?' ) - m_Field[REFERENCE].m_Text.Append('?'); + while( isdigit( m_Field[REFERENCE].m_Text.Last() ) ) + m_Field[REFERENCE].m_Text.RemoveLast(); -EDA_LibComponentStruct *Entry; - Entry = FindLibPart(m_ChipName.GetData(),wxEmptyString,FIND_ROOT); + if( m_Field[REFERENCE].m_Text.Last() != '?' ) + m_Field[REFERENCE].m_Text.Append( '?' ); - if ( !Entry || ! Entry->m_UnitSelectionLocked ) - m_Multi = 1; + EDA_LibComponentStruct* Entry; + Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + + if( !Entry || !Entry->m_UnitSelectionLocked ) + m_Multi = 1; } + /**************************************************************/ -EDA_SchComponentStruct * EDA_SchComponentStruct::GenCopy() +EDA_SchComponentStruct* EDA_SchComponentStruct::GenCopy() /**************************************************************/ { -EDA_SchComponentStruct * new_item = new EDA_SchComponentStruct( m_Pos ); -int ii; + EDA_SchComponentStruct* new_item = new EDA_SchComponentStruct( m_Pos ); - new_item->m_Multi = m_Multi; - new_item->m_ChipName = m_ChipName; - new_item->m_FlagControlMulti = m_FlagControlMulti; - new_item->m_Convert = m_Convert; - new_item->m_Transform[0][0] = m_Transform[0][0]; - new_item->m_Transform[0][1] = m_Transform[0][1]; - new_item->m_Transform[1][0] = m_Transform[1][0]; - new_item->m_Transform[1][1] = m_Transform[1][1]; - new_item->m_TimeStamp = m_TimeStamp; + int ii; + + new_item->m_Multi = m_Multi; + new_item->m_ChipName = m_ChipName; + new_item->m_FlagControlMulti = m_FlagControlMulti; + new_item->m_Convert = m_Convert; + new_item->m_Transform[0][0] = m_Transform[0][0]; + new_item->m_Transform[0][1] = m_Transform[0][1]; + new_item->m_Transform[1][0] = m_Transform[1][0]; + new_item->m_Transform[1][1] = m_Transform[1][1]; + new_item->m_TimeStamp = m_TimeStamp; - /* initialisation des Fields */ - for(ii = 0; ii < NUMBER_OF_FIELDS; ii++) - { - m_Field[ii].PartTextCopy(& new_item->m_Field[ii]); - } + /* initialisation des Fields */ + for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + { + m_Field[ii].PartTextCopy( &new_item->m_Field[ii] ); + } - return new_item; + return new_item; } /*****************************************************************/ void EDA_SchComponentStruct::SetRotationMiroir( int type_rotate ) /******************************************************************/ + /* Compute the new matrix transform for a schematic component - in order to have the requested transform (type_rotate = rot, mirror..) - which is applied to the initial transform. -*/ + * in order to have the requested transform (type_rotate = rot, mirror..) + * which is applied to the initial transform. + */ { -int TempMat[2][2]; -bool Transform = FALSE; + int TempMat[2][2]; + bool Transform = FALSE; - switch (type_rotate) - { - case CMP_ORIENT_0: - case CMP_NORMAL: /* Position Initiale */ - m_Transform[0][0] = 1; - m_Transform[1][1] = -1; - m_Transform[1][0] = m_Transform[0][1] = 0; - break; + switch( type_rotate ) + { + case CMP_ORIENT_0: + case CMP_NORMAL: /* Position Initiale */ + m_Transform[0][0] = 1; + m_Transform[1][1] = -1; + m_Transform[1][0] = m_Transform[0][1] = 0; + break; - case CMP_ROTATE_CLOCKWISE: /* Rotate + */ - TempMat[0][0] = TempMat[1][1] = 0; - TempMat[0][1] = 1; - TempMat[1][0] = -1; - Transform = TRUE; - break; + case CMP_ROTATE_CLOCKWISE: /* Rotate + */ + TempMat[0][0] = TempMat[1][1] = 0; + TempMat[0][1] = 1; + TempMat[1][0] = -1; + Transform = TRUE; + break; - case CMP_ROTATE_COUNTERCLOCKWISE: /* Rotate - */ - TempMat[0][0] = TempMat[1][1] = 0; - TempMat[0][1] = -1; - TempMat[1][0] = 1; - Transform = TRUE; - break; + case CMP_ROTATE_COUNTERCLOCKWISE: /* Rotate - */ + TempMat[0][0] = TempMat[1][1] = 0; + TempMat[0][1] = -1; + TempMat[1][0] = 1; + Transform = TRUE; + break; - case CMP_MIROIR_Y: /* MirrorY */ - TempMat[0][0] = -1; - TempMat[1][1] = 1; - TempMat[0][1] = TempMat[1][0] = 0; - Transform = TRUE; - break; + case CMP_MIROIR_Y: /* MirrorY */ + TempMat[0][0] = -1; + TempMat[1][1] = 1; + TempMat[0][1] = TempMat[1][0] = 0; + Transform = TRUE; + break; - case CMP_MIROIR_X: /* MirrorX */ - TempMat[0][0] = 1; - TempMat[1][1] = -1; - TempMat[0][1] = TempMat[1][0] = 0; - Transform = TRUE; - break; + case CMP_MIROIR_X: /* MirrorX */ + TempMat[0][0] = 1; + TempMat[1][1] = -1; + TempMat[0][1] = TempMat[1][0] = 0; + Transform = TRUE; + break; - case CMP_ORIENT_90: - SetRotationMiroir( CMP_ORIENT_0 ); - SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); - break; + case CMP_ORIENT_90: + SetRotationMiroir( CMP_ORIENT_0 ); + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + break; - case CMP_ORIENT_180: - SetRotationMiroir( CMP_ORIENT_0 ); - SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); - SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); - break; + case CMP_ORIENT_180: + SetRotationMiroir( CMP_ORIENT_0 ); + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + break; - case CMP_ORIENT_270: - SetRotationMiroir( CMP_ORIENT_0 ); - SetRotationMiroir( CMP_ROTATE_CLOCKWISE ); - break; + case CMP_ORIENT_270: + SetRotationMiroir( CMP_ORIENT_0 ); + SetRotationMiroir( CMP_ROTATE_CLOCKWISE ); + break; - case (CMP_ORIENT_0+CMP_MIROIR_X): - SetRotationMiroir( CMP_ORIENT_0 ); - SetRotationMiroir( CMP_MIROIR_X ); - break; + case (CMP_ORIENT_0 + CMP_MIROIR_X): + SetRotationMiroir( CMP_ORIENT_0 ); + SetRotationMiroir( CMP_MIROIR_X ); + break; - case (CMP_ORIENT_0+CMP_MIROIR_Y): - SetRotationMiroir( CMP_ORIENT_0 ); - SetRotationMiroir( CMP_MIROIR_Y ); - break; + case (CMP_ORIENT_0 + CMP_MIROIR_Y): + SetRotationMiroir( CMP_ORIENT_0 ); + SetRotationMiroir( CMP_MIROIR_Y ); + break; - case (CMP_ORIENT_90+CMP_MIROIR_X): - SetRotationMiroir( CMP_ORIENT_90 ); - SetRotationMiroir( CMP_MIROIR_X ); - break; + case (CMP_ORIENT_90 + CMP_MIROIR_X): + SetRotationMiroir( CMP_ORIENT_90 ); + SetRotationMiroir( CMP_MIROIR_X ); + break; - case (CMP_ORIENT_90+CMP_MIROIR_Y): - SetRotationMiroir( CMP_ORIENT_90 ); - SetRotationMiroir( CMP_MIROIR_Y ); - break; + case (CMP_ORIENT_90 + CMP_MIROIR_Y): + SetRotationMiroir( CMP_ORIENT_90 ); + SetRotationMiroir( CMP_MIROIR_Y ); + break; - case (CMP_ORIENT_180+CMP_MIROIR_X): - SetRotationMiroir( CMP_ORIENT_180 ); - SetRotationMiroir( CMP_MIROIR_X ); - break; + case (CMP_ORIENT_180 + CMP_MIROIR_X): + SetRotationMiroir( CMP_ORIENT_180 ); + SetRotationMiroir( CMP_MIROIR_X ); + break; - case (CMP_ORIENT_180+CMP_MIROIR_Y): - SetRotationMiroir( CMP_ORIENT_180 ); - SetRotationMiroir( CMP_MIROIR_Y ); - break; + case (CMP_ORIENT_180 + CMP_MIROIR_Y): + SetRotationMiroir( CMP_ORIENT_180 ); + SetRotationMiroir( CMP_MIROIR_Y ); + break; - case (CMP_ORIENT_270+CMP_MIROIR_X): - SetRotationMiroir( CMP_ORIENT_270 ); - SetRotationMiroir( CMP_MIROIR_X ); - break; + case (CMP_ORIENT_270 + CMP_MIROIR_X): + SetRotationMiroir( CMP_ORIENT_270 ); + SetRotationMiroir( CMP_MIROIR_X ); + break; - case (CMP_ORIENT_270+CMP_MIROIR_Y): - SetRotationMiroir( CMP_ORIENT_270 ); - SetRotationMiroir( CMP_MIROIR_Y ); - break; + case (CMP_ORIENT_270 + CMP_MIROIR_Y): + SetRotationMiroir( CMP_ORIENT_270 ); + SetRotationMiroir( CMP_MIROIR_Y ); + break; - default: - Transform = FALSE; - DisplayError(NULL, wxT("SetRotateMiroir() error: ill value") ); - break; - } - - if ( Transform ) - {/* The new matrix transform is the old matrix transform modified by the - requested transformation, which is the TempMat transform (rot, mirror ..) - in order to have (in term of matrix transform): - transform coord = new_m_Transform * coord - where transform coord is the coord modified by new_m_Transform from the initial - value coord. - new_m_Transform is computed (from old_m_Transform and TempMat) to have: - transform coord = old_m_Transform * coord * TempMat - */ - int NewMatrix[2][2]; + default: + Transform = FALSE; + DisplayError( NULL, wxT( "SetRotateMiroir() error: ill value" ) ); + break; + } - NewMatrix[0][0] = m_Transform[0][0] * TempMat[0][0] + - m_Transform[1][0] * TempMat[0][1]; + if( Transform ) + {/* The new matrix transform is the old matrix transform modified by the + * requested transformation, which is the TempMat transform (rot, mirror ..) + * in order to have (in term of matrix transform): + * transform coord = new_m_Transform * coord + * where transform coord is the coord modified by new_m_Transform from the initial + * value coord. + * new_m_Transform is computed (from old_m_Transform and TempMat) to have: + * transform coord = old_m_Transform * coord * TempMat + */ + int NewMatrix[2][2]; - NewMatrix[0][1] = m_Transform[0][1] * TempMat[0][0] + - m_Transform[1][1] * TempMat[0][1]; + NewMatrix[0][0] = m_Transform[0][0] * TempMat[0][0] + + m_Transform[1][0] * TempMat[0][1]; - NewMatrix[1][0] = m_Transform[0][0] * TempMat[1][0] + - m_Transform[1][0] * TempMat[1][1]; + NewMatrix[0][1] = m_Transform[0][1] * TempMat[0][0] + + m_Transform[1][1] * TempMat[0][1]; - NewMatrix[1][1] = m_Transform[0][1] * TempMat[1][0] + - m_Transform[1][1] * TempMat[1][1]; + NewMatrix[1][0] = m_Transform[0][0] * TempMat[1][0] + + m_Transform[1][0] * TempMat[1][1]; - m_Transform[0][0] = NewMatrix[0][0]; - m_Transform[0][1] = NewMatrix[0][1]; - m_Transform[1][0] = NewMatrix[1][0]; - m_Transform[1][1] = NewMatrix[1][1]; - } + NewMatrix[1][1] = m_Transform[0][1] * TempMat[1][0] + + m_Transform[1][1] * TempMat[1][1]; + + m_Transform[0][0] = NewMatrix[0][0]; + m_Transform[0][1] = NewMatrix[0][1]; + m_Transform[1][0] = NewMatrix[1][0]; + m_Transform[1][1] = NewMatrix[1][1]; + } } @@ -414,220 +457,277 @@ bool Transform = FALSE; int EDA_SchComponentStruct::GetRotationMiroir() /****************************************************/ { -int type_rotate = CMP_ORIENT_0; -int TempMat[2][2], MatNormal[2][2]; -int ii; -bool found = FALSE; + int type_rotate = CMP_ORIENT_0; + int TempMat[2][2], MatNormal[2][2]; + int ii; + bool found = FALSE; - memcpy(TempMat, m_Transform, sizeof(TempMat)); - SetRotationMiroir(CMP_ORIENT_0); - memcpy(MatNormal, m_Transform, sizeof(MatNormal)); + memcpy( TempMat, m_Transform, sizeof(TempMat) ); + SetRotationMiroir( CMP_ORIENT_0 ); + memcpy( MatNormal, m_Transform, sizeof(MatNormal) ); - for ( ii = 0; ii < 4; ii++ ) - { - if ( memcmp(TempMat, m_Transform, sizeof(MatNormal)) == 0) - { - found = TRUE; break; - } - SetRotationMiroir(CMP_ROTATE_COUNTERCLOCKWISE); - } + for( ii = 0; ii < 4; ii++ ) + { + if( memcmp( TempMat, m_Transform, sizeof(MatNormal) ) == 0 ) + { + found = TRUE; break; + } + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + } - if ( ! found ) - { - type_rotate = CMP_MIROIR_X + CMP_ORIENT_0; - SetRotationMiroir(CMP_NORMAL); - SetRotationMiroir(CMP_MIROIR_X); - for ( ii = 0; ii < 4; ii++ ) - { - if ( memcmp(TempMat, m_Transform, sizeof(MatNormal)) == 0) - { - found = TRUE; break; - } - SetRotationMiroir(CMP_ROTATE_COUNTERCLOCKWISE); - } - } + if( !found ) + { + type_rotate = CMP_MIROIR_X + CMP_ORIENT_0; + SetRotationMiroir( CMP_NORMAL ); + SetRotationMiroir( CMP_MIROIR_X ); + for( ii = 0; ii < 4; ii++ ) + { + if( memcmp( TempMat, m_Transform, sizeof(MatNormal) ) == 0 ) + { + found = TRUE; break; + } + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + } + } - if ( ! found ) - { - type_rotate = CMP_MIROIR_Y + CMP_ORIENT_0; - SetRotationMiroir(CMP_NORMAL); - SetRotationMiroir(CMP_MIROIR_Y); - for ( ii = 0; ii < 4; ii++ ) - { - if ( memcmp(TempMat, m_Transform, sizeof(MatNormal)) == 0) - { - found = TRUE; break; - } - SetRotationMiroir(CMP_ROTATE_COUNTERCLOCKWISE); - } - } + if( !found ) + { + type_rotate = CMP_MIROIR_Y + CMP_ORIENT_0; + SetRotationMiroir( CMP_NORMAL ); + SetRotationMiroir( CMP_MIROIR_Y ); + for( ii = 0; ii < 4; ii++ ) + { + if( memcmp( TempMat, m_Transform, sizeof(MatNormal) ) == 0 ) + { + found = TRUE; break; + } + SetRotationMiroir( CMP_ROTATE_COUNTERCLOCKWISE ); + } + } - memcpy(m_Transform, TempMat, sizeof(m_Transform)); + memcpy( m_Transform, TempMat, sizeof(m_Transform) ); - if ( found ) - { - return (type_rotate + ii); - } - else - { - wxBell(); return CMP_NORMAL; - } + if( found ) + { + return type_rotate + ii; + } + else + { + wxBell(); return CMP_NORMAL; + } } + /***********************************************************************/ -wxPoint EDA_SchComponentStruct::GetScreenCoord(const wxPoint & coord) +wxPoint EDA_SchComponentStruct::GetScreenCoord( const wxPoint& coord ) /***********************************************************************/ + /* Renvoie la coordonnée du point coord, en fonction de l'orientation -du composant (rotation, miroir). - Les coord sont toujours relatives à l'ancre (coord 0,0) du composant -*/ + * du composant (rotation, miroir). + * Les coord sont toujours relatives à l'ancre (coord 0,0) du composant + */ { -wxPoint screenpos; - screenpos.x = m_Transform[0][0] * coord.x + m_Transform[0][1] * coord.y; - screenpos.y = m_Transform[1][0] * coord.x + m_Transform[1][1] * coord.y; - return screenpos; + wxPoint screenpos; + + screenpos.x = m_Transform[0][0] * coord.x + m_Transform[0][1] * coord.y; + screenpos.y = m_Transform[1][0] * coord.x + m_Transform[1][1] * coord.y; + return screenpos; } + +#if defined(DEBUG) +/** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ +void EDA_SchComponentStruct::Show( int nestLevel, std::ostream& os ) +{ + // for now, make it look like XML: + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << + " ref=\"" << GetReference().mb_str() << '"' << + " chipName=\"" << m_ChipName.mb_str() << '"' << + m_Pos << + " layer=\"" << m_Layer << '"' << + "/>\n"; + + // skip the reference, it's been output already. + for( int i=1; i\n"; + } + } + + NestedSpace( nestLevel, os ) << "\n"; +} +#endif + + + + /***************************************************************************/ -PartTextStruct::PartTextStruct(const wxPoint & pos, const wxString & text): - EDA_BaseStruct(DRAW_PART_TEXT_STRUCT_TYPE), - EDA_TextStruct(text) +PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) : + EDA_BaseStruct( DRAW_PART_TEXT_STRUCT_TYPE ), EDA_TextStruct( text ) /***************************************************************************/ { - m_Pos = pos; - m_FieldId = 0; + m_Pos = pos; + m_FieldId = 0; } + /************************************/ PartTextStruct::~PartTextStruct() /************************************/ { } + /***********************************************************/ -void PartTextStruct::PartTextCopy(PartTextStruct * target) +void PartTextStruct::PartTextCopy( PartTextStruct* target ) /***********************************************************/ { - target->m_Text = m_Text; - if ( m_FieldId >= FIELD1 )target->m_Name = m_Name; - target->m_Layer = m_Layer; - target->m_Pos = m_Pos; - target->m_Size = m_Size; - target->m_Attributs = m_Attributs; - target->m_FieldId = m_FieldId; - target->m_Orient = m_Orient; - target->m_HJustify = m_HJustify; - target->m_VJustify = m_VJustify; - target->m_Flags = m_Flags; + target->m_Text = m_Text; + if( m_FieldId >= FIELD1 ) + target->m_Name = m_Name; + target->m_Layer = m_Layer; + target->m_Pos = m_Pos; + target->m_Size = m_Size; + target->m_Attributs = m_Attributs; + target->m_FieldId = m_FieldId; + target->m_Orient = m_Orient; + target->m_HJustify = m_HJustify; + target->m_VJustify = m_VJustify; + target->m_Flags = m_Flags; } /*********************************/ bool PartTextStruct::IsVoid() /*********************************/ + /* return True if The field is void, i.e.: - contains wxEmptyString or "~" -*/ + * contains wxEmptyString or "~" + */ { - if ( m_Text.IsEmpty() || m_Text == wxT("~") ) return TRUE; - return FALSE; + if( m_Text.IsEmpty() || m_Text == wxT( "~" ) ) + return TRUE; + return FALSE; } /********************************************/ EDA_Rect PartTextStruct::GetBoundaryBox() /********************************************/ + /* return - EDA_Rect contains the real (user coordinates) boundary box for a text field, -according to the component position, rotation, mirror ... - -*/ + * EDA_Rect contains the real (user coordinates) boundary box for a text field, + * according to the component position, rotation, mirror ... + * + */ { -EDA_Rect BoundaryBox; -int hjustify, vjustify; -int textlen; -int orient; -int dx, dy, x1, y1, x2, y2; + EDA_Rect BoundaryBox; + int hjustify, vjustify; + int textlen; + int orient; + int dx, dy, x1, y1, x2, y2; -EDA_SchComponentStruct * DrawLibItem = (EDA_SchComponentStruct *) m_Parent; + EDA_SchComponentStruct* DrawLibItem = (EDA_SchComponentStruct*) m_Parent; - orient = m_Orient; - wxPoint pos = DrawLibItem->m_Pos; - x1 = m_Pos.x - pos.x; - y1 = m_Pos.y - pos.y; + orient = m_Orient; + wxPoint pos = DrawLibItem->m_Pos; + x1 = m_Pos.x - pos.x; + y1 = m_Pos.y - pos.y; - textlen = GetLength(); - if ( m_FieldId == REFERENCE ) // Real Text can be U1 or U1A - { - EDA_LibComponentStruct *Entry = - FindLibPart(DrawLibItem->m_ChipName.GetData(),wxEmptyString,FIND_ROOT); - if ( Entry && (Entry->m_UnitCount > 1) ) - textlen ++; // because U1 is show as U1A or U1B ... - } - dx = m_Size.x * textlen; + textlen = GetLength(); + if( m_FieldId == REFERENCE ) // Real Text can be U1 or U1A + { + EDA_LibComponentStruct* Entry = + FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + if( Entry && (Entry->m_UnitCount > 1) ) + textlen++; // because U1 is show as U1A or U1B ... + } + dx = m_Size.x * textlen; - // Real X Size is 10/9 char size because space between 2 chars is 1/10 X Size - dx = (dx * 10) / 9; + // Real X Size is 10/9 char size because space between 2 chars is 1/10 X Size + dx = (dx * 10) / 9; - dy = m_Size.y; - hjustify = m_HJustify; - vjustify = m_VJustify; + dy = m_Size.y; + hjustify = m_HJustify; + vjustify = m_VJustify; - x2 = pos.x + (DrawLibItem->m_Transform[0][0] * x1) - + (DrawLibItem->m_Transform[0][1] * y1); - y2 = pos.y + (DrawLibItem->m_Transform[1][0] * x1) - + (DrawLibItem->m_Transform[1][1] * y1); + x2 = pos.x + (DrawLibItem->m_Transform[0][0] * x1) + + (DrawLibItem->m_Transform[0][1] * y1); + y2 = pos.y + (DrawLibItem->m_Transform[1][0] * x1) + + (DrawLibItem->m_Transform[1][1] * y1); - /* If the component orientation is +/- 90 deg, the text orienation must be changed */ - if(DrawLibItem->m_Transform[0][1]) - { - if ( orient == TEXT_ORIENT_HORIZ) orient = TEXT_ORIENT_VERT; - else orient = TEXT_ORIENT_HORIZ; - /* is it mirrored (for text justify)*/ - EXCHG(hjustify, vjustify); - if (DrawLibItem->m_Transform[1][0] < 0 ) vjustify = - vjustify; - if (DrawLibItem->m_Transform[0][1] > 0 ) hjustify = - hjustify; - } - else /* component horizontal: is it mirrored (for text justify)*/ - { - if (DrawLibItem->m_Transform[0][0] < 0 ) - hjustify = - hjustify; - if (DrawLibItem->m_Transform[1][1] > 0 ) - vjustify = - vjustify; - } - - if ( orient == TEXT_ORIENT_VERT ) EXCHG(dx, dy); + /* If the component orientation is +/- 90 deg, the text orienation must be changed */ + if( DrawLibItem->m_Transform[0][1] ) + { + if( orient == TEXT_ORIENT_HORIZ ) + orient = TEXT_ORIENT_VERT; + else + orient = TEXT_ORIENT_HORIZ; + /* is it mirrored (for text justify)*/ + EXCHG( hjustify, vjustify ); + if( DrawLibItem->m_Transform[1][0] < 0 ) + vjustify = -vjustify; + if( DrawLibItem->m_Transform[0][1] > 0 ) + hjustify = -hjustify; + } + else /* component horizontal: is it mirrored (for text justify)*/ + { + if( DrawLibItem->m_Transform[0][0] < 0 ) + hjustify = -hjustify; + if( DrawLibItem->m_Transform[1][1] > 0 ) + vjustify = -vjustify; + } - switch ( hjustify ) - { - case GR_TEXT_HJUSTIFY_CENTER: - x1 = x2 - (dx/2); - break; - case GR_TEXT_HJUSTIFY_RIGHT: - x1 = x2 - dx; - break; - default: - x1 = x2; - break; - } - switch ( vjustify ) - { - case GR_TEXT_VJUSTIFY_CENTER: - y1 = y2 - (dy/2); - break; - case GR_TEXT_VJUSTIFY_BOTTOM: - y1 = y2 - dy; - break; - default: - y1 = y2; - break; - } + if( orient == TEXT_ORIENT_VERT ) + EXCHG( dx, dy ); - BoundaryBox.SetX(x1); - BoundaryBox.SetY(y1); - BoundaryBox.SetWidth(dx); - BoundaryBox.SetHeight(dy); + switch( hjustify ) + { + case GR_TEXT_HJUSTIFY_CENTER: + x1 = x2 - (dx / 2); + break; - return BoundaryBox; + case GR_TEXT_HJUSTIFY_RIGHT: + x1 = x2 - dx; + break; + + default: + x1 = x2; + break; + } + + switch( vjustify ) + { + case GR_TEXT_VJUSTIFY_CENTER: + y1 = y2 - (dy / 2); + break; + + case GR_TEXT_VJUSTIFY_BOTTOM: + y1 = y2 - dy; + break; + + default: + y1 = y2; + break; + } + + BoundaryBox.SetX( x1 ); + BoundaryBox.SetY( y1 ); + BoundaryBox.SetWidth( dx ); + BoundaryBox.SetHeight( dy ); + + return BoundaryBox; } diff --git a/eeschema/component_class.h b/eeschema/component_class.h index a0a9dd7d2c..9e563d3321 100644 --- a/eeschema/component_class.h +++ b/eeschema/component_class.h @@ -15,7 +15,7 @@ /* Definition de la representation du composant */ #define NUMBER_OF_FIELDS 12 /* Nombre de champs de texte affectes au composant */ -typedef enum { +enum NumFieldType { REFERENCE = 0, /* Champ Reference of part, i.e. "IC21" */ VALUE, /* Champ Value of part, i.e. "3.3K" */ FOOTPRINT, /* Champ Name Module PCB, i.e. "16DIP300" */ @@ -28,7 +28,7 @@ typedef enum { FIELD6, FIELD7, FIELD8 -} NumFieldType; +}; /* Class to manage component fields. @@ -46,9 +46,10 @@ public: public: PartTextStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); ~PartTextStruct(); + virtual wxString GetClass() const { - return wxT( "PartTextStruct" ); + return wxT( "PartText" ); } @@ -77,10 +78,18 @@ public: public: DrawPartStruct( KICAD_T struct_type, const wxPoint &pos ); ~DrawPartStruct(); + virtual wxString GetClass() const { - return wxT( "DrawPartStruct" ); + return wxT( "DrawPart" ); } + + + /** + * Function GetReference + * returns a reference to the Reference + */ + const wxString& GetReference() { return m_Field[REFERENCE].m_Text; } }; @@ -101,19 +110,30 @@ public: virtual wxString GetClass() const { - return wxT( "EDA_SchComponentStruct" ); + return wxT( "EDA_SchComponent" ); } - EDA_SchComponentStruct* GenCopy( void ); + EDA_SchComponentStruct* GenCopy(); void SetRotationMiroir( int type ); int GetRotationMiroir(); wxPoint GetScreenCoord( const wxPoint& coord ); void Display_Infos( WinEDA_DrawFrame* frame ); void ClearAnnotation(); EDA_Rect GetBoundaryBox(); - wxString ReturnFieldName( int FieldNumber ); + const wxString& ReturnFieldName( int aFieldNdx ) const; + + + /** + * Function GetFieldValue + * returns a reference to the field value. + * @param aFieldNdx An index into the array of fields, 0 - FIELD8 + * @return const wxString& - the field value or wxEmptyString + */ + const wxString& GetFieldValue( int aFieldNdx ) const; + + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, @@ -122,6 +142,17 @@ public: void SwapData( EDA_SchComponentStruct* copyitem ); virtual void Place( WinEDA_DrawFrame* frame, wxDC* DC ); + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ + void Show( int nestLevel, std::ostream& os ); +#endif }; diff --git a/eeschema/edit_component_in_lib.cpp b/eeschema/edit_component_in_lib.cpp index 957ea03b6a..603361484b 100644 --- a/eeschema/edit_component_in_lib.cpp +++ b/eeschema/edit_component_in_lib.cpp @@ -13,18 +13,17 @@ #include "protos.h" enum id_libedit { - ID_PANEL_ALIAS, - ID_PANEL_FIELD, - ID_COPY_DOC_TO_ALIAS, - ID_BROWSE_DOC_FILES, - ID_ADD_ALIAS, - ID_DELETE_ONE_ALIAS, - ID_DELETE_ALL_ALIAS, - ID_ON_SELECT_FIELD + ID_PANEL_ALIAS, + ID_PANEL_FIELD, + ID_COPY_DOC_TO_ALIAS, + ID_BROWSE_DOC_FILES, + ID_ADD_ALIAS, + ID_DELETE_ONE_ALIAS, + ID_DELETE_ALL_ALIAS, + ID_ON_SELECT_FIELD }; - /* Routines locales */ /* Variables locales */ @@ -33,1071 +32,1193 @@ extern int CurrentUnit; /* Classe de la frame des propriétés d'un composant en librairie */ /* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés -d'un composant le librairie. - On peut éditer: - Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) - Documentation et mots clefs - Nombre de part par boitier - et autres propriérés générales -*/ + * d'un composant le librairie. + * On peut éditer: + * Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) + * Documentation et mots clefs + * Nombre de part par boitier + * et autres propriérés générales + */ #include "dialog_edit_component_in_lib.cpp" /*****************************************************************/ -void WinEDA_LibeditFrame::InstallLibeditFrame(const wxPoint & pos) +void WinEDA_LibeditFrame::InstallLibeditFrame( const wxPoint& pos ) /*****************************************************************/ { -wxPoint fpos = pos; + wxPoint fpos = pos; - WinEDA_PartPropertiesFrame * frame = - new WinEDA_PartPropertiesFrame(this); - int IsModified = frame->ShowModal(); frame->Destroy(); - if ( IsModified ) Refresh(); + WinEDA_PartPropertiesFrame* frame = + new WinEDA_PartPropertiesFrame( this ); + int IsModified = frame->ShowModal(); frame->Destroy(); + + if( IsModified ) + Refresh(); } + /***************************************************************************/ -void WinEDA_PartPropertiesFrame::CopyFieldDataToBuffer(LibDrawField * Field) +void WinEDA_PartPropertiesFrame::CopyFieldDataToBuffer( LibDrawField* Field ) /***************************************************************************/ + /* copy the field data (name, attributes, size, position... to corresponding buffers -for editing -*/ + * for editing + */ { -int id = Field->m_FieldId; + int id = Field->m_FieldId; - m_FieldFlags[id] = (Field->m_Attributs & TEXT_NO_VISIBLE) ? 0 : 1; - m_FieldOrient[id] = Field->m_Orient; + m_FieldFlags[id] = (Field->m_Attributs & TEXT_NO_VISIBLE) ? 0 : 1; + m_FieldOrient[id] = Field->m_Orient; - if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT) - m_FieldHJustify[id] = 0; - else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT) - m_FieldHJustify[id] = 2; - else - m_FieldHJustify[id] = 1; + if( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) + m_FieldHJustify[id] = 0; + else if( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) + m_FieldHJustify[id] = 2; + else + m_FieldHJustify[id] = 1; - if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM) - m_FieldVJustify[id] = 0; - else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP) - m_FieldVJustify[id] = 2; - else m_FieldVJustify[id] = 1; + if( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) + m_FieldVJustify[id] = 0; + else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) + m_FieldVJustify[id] = 2; + else + m_FieldVJustify[id] = 1; - m_FieldText[id] = Field->m_Text; - if ( id >= FIELD1 ) m_FieldName[id] = Field->m_Name; - m_FieldPosition[id] = Field->m_Pos; - // Note: the Y axis for components in lib is from bottom to top - // and the screen axis is top to bottom: we must change the y coord sign for editing - m_FieldPosition[id].y = - m_FieldPosition[id].y; - m_FieldSize[id] = Field->m_Size.x; + m_FieldText[id] = Field->m_Text; + if( id >= FIELD1 ) + m_FieldName[id] = Field->m_Name; + m_FieldPosition[id] = Field->m_Pos; + + // Note: the Y axis for components in lib is from bottom to top + // and the screen axis is top to bottom: we must change the y coord sign for editing + m_FieldPosition[id].y = -m_FieldPosition[id].y; + m_FieldSize[id] = Field->m_Size.x; } /***************************************************************************/ -void WinEDA_PartPropertiesFrame::CopyBufferToFieldData(LibDrawField * Field) +void WinEDA_PartPropertiesFrame::CopyBufferToFieldData( LibDrawField* Field ) /***************************************************************************/ + /* Copy data from buffers(name, attributes, size, position... )to the -field "Field" -*/ + * field "Field" + */ { -int hjustify[3] = { GR_TEXT_HJUSTIFY_LEFT , GR_TEXT_HJUSTIFY_CENTER, - GR_TEXT_HJUSTIFY_RIGHT }; -int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER, - GR_TEXT_VJUSTIFY_TOP }; -int ii = Field->m_FieldId; + int hjustify[3] = { + GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER, + GR_TEXT_HJUSTIFY_RIGHT + }; + int vjustify[3] = { + GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER, + GR_TEXT_VJUSTIFY_TOP + }; + int ii = Field->m_FieldId; - Field->m_Text = m_FieldText[ii]; + Field->m_Text = m_FieldText[ii]; - if ( ii >= FIELD1 && m_FieldName[ii] != ReturnDefaultFieldName(ii) ) - Field->m_Name = m_FieldName[ii]; - else Field->m_Name.Empty(); + if( ii >= FIELD1 && m_FieldName[ii] != ReturnDefaultFieldName( ii ) ) + Field->m_Name = m_FieldName[ii]; + else + Field->m_Name.Empty(); - Field->m_Size.x = Field->m_Size.y = m_FieldSize[ii]; - Field->m_HJustify = hjustify[m_FieldHJustify[ii]]; - Field->m_VJustify = vjustify[m_FieldVJustify[ii]]; - if ( m_FieldFlags[ii] ) - Field->m_Attributs &= ~TEXT_NO_VISIBLE; - else - Field->m_Attributs |= TEXT_NO_VISIBLE; - Field->m_Orient = m_FieldOrient[ii] ? 1 : 0; - Field->m_Pos = m_FieldPosition[ii]; - // Note: the Y axis for components in lib is from bottom to top - // and the screen axis is top to bottom: we must change the y coord sign after editing - Field->m_Pos.y = - Field->m_Pos.y; + Field->m_Size.x = Field->m_Size.y = m_FieldSize[ii]; + Field->m_HJustify = hjustify[m_FieldHJustify[ii]]; + Field->m_VJustify = vjustify[m_FieldVJustify[ii]]; + if( m_FieldFlags[ii] ) + Field->m_Attributs &= ~TEXT_NO_VISIBLE; + else + Field->m_Attributs |= TEXT_NO_VISIBLE; + Field->m_Orient = m_FieldOrient[ii] ? 1 : 0; + Field->m_Pos = m_FieldPosition[ii]; + + // Note: the Y axis for components in lib is from bottom to top + // and the screen axis is top to bottom: we must change the y coord sign after editing + Field->m_Pos.y = -Field->m_Pos.y; } + /*****************************************************/ void WinEDA_PartPropertiesFrame::InitBuffers() /*****************************************************/ + /* Init the buffers to a default value, - or to values from CurrentLibEntry if CurrentLibEntry != NULL -*/ + * or to values from CurrentLibEntry if CurrentLibEntry != NULL + */ { -int ii; + int ii; - m_CurrentFieldId = REFERENCE; + m_CurrentFieldId = REFERENCE; - for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) - { - if ( ii < FIELD1 ) - m_FieldName[ii] = ReturnDefaultFieldName(ii); - m_FieldFlags[ii] = 1; - m_FieldOrient[ii] = 0; - m_FieldSize[ii] = DEFAULT_TEXT_SIZE; - m_FieldHJustify[ii] = 1; - m_FieldVJustify[ii] = 1; - } + for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + { + if( ii < FIELD1 ) + m_FieldName[ii] = ReturnDefaultFieldName( ii ); + m_FieldFlags[ii] = 1; + m_FieldOrient[ii] = 0; + m_FieldSize[ii] = DEFAULT_TEXT_SIZE; + m_FieldHJustify[ii] = 1; + m_FieldVJustify[ii] = 1; + } - m_AliasLocation = -1; - if ( CurrentLibEntry == NULL ) - { - m_Title = _("Lib Component Properties"); - return; - } + m_AliasLocation = -1; + if( CurrentLibEntry == NULL ) + { + m_Title = _( "Lib Component Properties" ); + return; + } - wxString msg_text = _("Properties for "); - if ( ! CurrentAliasName.IsEmpty() ) - { - m_AliasLocation = LocateAlias( CurrentLibEntry->m_AliasList, CurrentAliasName); - m_Title = msg_text + CurrentAliasName + - _("(alias of ") + - wxString(CurrentLibEntry->m_Name.m_Text) - + wxT(")"); - } - else - { - m_Title = msg_text + CurrentLibEntry->m_Name.m_Text; - CurrentAliasName.Empty(); - } + wxString msg_text = _( "Properties for " ); + if( !CurrentAliasName.IsEmpty() ) + { + m_AliasLocation = LocateAlias( CurrentLibEntry->m_AliasList, CurrentAliasName ); + m_Title = msg_text + CurrentAliasName + + _( "(alias of " ) + + wxString( CurrentLibEntry->m_Name.m_Text ) + + wxT( ")" ); + } + else + { + m_Title = msg_text + CurrentLibEntry->m_Name.m_Text; + CurrentAliasName.Empty(); + } - CopyFieldDataToBuffer(& CurrentLibEntry->m_Prefix); - CopyFieldDataToBuffer(& CurrentLibEntry->m_Name); + CopyFieldDataToBuffer( &CurrentLibEntry->m_Prefix ); + CopyFieldDataToBuffer( &CurrentLibEntry->m_Name ); - LibDrawField * Field = CurrentLibEntry->Fields; - while ( Field ) - { - CopyFieldDataToBuffer(Field); - Field = (LibDrawField*)Field->Pnext; - } + LibDrawField* Field = CurrentLibEntry->Fields; + while( Field ) + { + CopyFieldDataToBuffer( Field ); + Field = (LibDrawField*) Field->Pnext; + } } /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelAlias() /*****************************************************/ + /* create the panel for component alias list editing -*/ + */ { -wxButton * Button; + wxButton* Button; - m_PanelAlias->SetFont(*g_DialogFont); - wxBoxSizer * PanelAliasBoxSizer = new wxBoxSizer(wxHORIZONTAL); - m_PanelAlias->SetSizer(PanelAliasBoxSizer); - wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelAliasBoxSizer->Add(LeftBoxSizer, 0 , wxGROW|wxALL, 5); + m_PanelAlias->SetFont( *g_DialogFont ); + wxBoxSizer* PanelAliasBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - wxStaticText * Msg = new wxStaticText(m_PanelAlias, -1, _("Alias")); - Msg->SetForegroundColour(wxColour(200,0,0) ); - LeftBoxSizer->Add(Msg, 0 , wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); + m_PanelAlias->SetSizer( PanelAliasBoxSizer ); + wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - m_PartAliasList = new wxListBox(m_PanelAlias, - -1, - wxDefaultPosition, wxSize(200,250), - 0,NULL, - wxLB_ALWAYS_SB|wxLB_SINGLE); - LeftBoxSizer->Add(m_PartAliasList, 0 , wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + PanelAliasBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); - wxBoxSizer * RightBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelAliasBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ) ); - Button = new wxButton(m_PanelAlias, ID_ADD_ALIAS, _("Add")); - Button->SetForegroundColour(*wxBLUE); - RightBoxSizer->Add(Button, 0 , wxGROW|wxALL, 5); + Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); + LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); - m_ButtonDeleteOneAlias = new wxButton(m_PanelAlias, ID_DELETE_ONE_ALIAS, - _("Delete")); - m_ButtonDeleteOneAlias->SetForegroundColour(*wxRED); - RightBoxSizer->Add(m_ButtonDeleteOneAlias, 0 , wxGROW|wxALL, 5); + m_PartAliasList = new wxListBox( m_PanelAlias, + -1, + wxDefaultPosition, wxSize( 200, 250 ), + 0, NULL, + wxLB_ALWAYS_SB | wxLB_SINGLE ); - m_ButtonDeleteAllAlias = new wxButton(m_PanelAlias, ID_DELETE_ALL_ALIAS, - _("Delete All")); - m_ButtonDeleteAllAlias->SetForegroundColour(*wxRED); - if ( ! CurrentAliasName.IsEmpty() ) m_ButtonDeleteAllAlias->Enable(FALSE); - RightBoxSizer->Add(m_ButtonDeleteAllAlias, 0 , wxGROW|wxALL, 5); + LeftBoxSizer->Add( m_PartAliasList, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); + + wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); + + PanelAliasBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ) ); + + Button->SetForegroundColour( *wxBLUE ); + RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); + + m_ButtonDeleteOneAlias = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS, + _( "Delete" ) ); + + m_ButtonDeleteOneAlias->SetForegroundColour( *wxRED ); + RightBoxSizer->Add( m_ButtonDeleteOneAlias, 0, wxGROW | wxALL, 5 ); + + m_ButtonDeleteAllAlias = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS, + _( "Delete All" ) ); + + m_ButtonDeleteAllAlias->SetForegroundColour( *wxRED ); + if( !CurrentAliasName.IsEmpty() ) + m_ButtonDeleteAllAlias->Enable( FALSE ); + RightBoxSizer->Add( m_ButtonDeleteAllAlias, 0, wxGROW | wxALL, 5 ); - /* lecture des noms des alias */ - if ( CurrentLibEntry ) - { - for ( unsigned ii = 0; ii < CurrentLibEntry->m_AliasList.GetCount(); ii += ALIAS_NEXT) - m_PartAliasList->Append(CurrentLibEntry->m_AliasList[ii+ALIAS_NAME]); - } + /* lecture des noms des alias */ + if( CurrentLibEntry ) + { + for( unsigned ii = 0; ii < CurrentLibEntry->m_AliasList.GetCount(); ii += ALIAS_NEXT ) + m_PartAliasList->Append( CurrentLibEntry->m_AliasList[ii + ALIAS_NAME] ); + } - if ( (CurrentLibEntry == NULL) || (CurrentLibEntry->m_AliasList.GetCount() == 0) ) - { - m_ButtonDeleteAllAlias->Enable(FALSE); - m_ButtonDeleteOneAlias->Enable(FALSE); - } + if( (CurrentLibEntry == NULL) || (CurrentLibEntry->m_AliasList.GetCount() == 0) ) + { + m_ButtonDeleteAllAlias->Enable( FALSE ); + m_ButtonDeleteOneAlias->Enable( FALSE ); + } } /*****************************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelFootprintFilter() /*****************************************************************/ + /* create the panel for footprint filtering in cvpcb list -*/ + */ { + m_PanelFootprintFilter = new wxPanel( m_NoteBook, + -1, + wxDefaultPosition, + wxDefaultSize, + wxSUNKEN_BORDER | wxTAB_TRAVERSAL ); - m_PanelFootprintFilter = new wxPanel( m_NoteBook, -1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); - m_NoteBook->AddPage(m_PanelFootprintFilter, _("Footprint Filter")); + m_NoteBook->AddPage( m_PanelFootprintFilter, _( "Footprint Filter" ) ); - m_PanelFootprintFilter->SetFont(*g_DialogFont); - -wxBoxSizer * PanelFpFilterBoxSizer = new wxBoxSizer(wxHORIZONTAL); - m_PanelFootprintFilter->SetSizer(PanelFpFilterBoxSizer); - wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelFpFilterBoxSizer->Add(LeftBoxSizer, 0 , wxGROW|wxALL, 5); + m_PanelFootprintFilter->SetFont( *g_DialogFont ); - wxStaticText * Msg = new wxStaticText(m_PanelFootprintFilter, -1, _("Footprints")); - Msg->SetForegroundColour(wxColour(200,0,0) ); - LeftBoxSizer->Add(Msg, 0 , wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); + wxBoxSizer* PanelFpFilterBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - m_FootprintFilterListBox = new wxListBox(m_PanelFootprintFilter, - -1, - wxDefaultPosition, wxSize(200,250), - 0,NULL, - wxLB_ALWAYS_SB|wxLB_SINGLE); - LeftBoxSizer->Add(m_FootprintFilterListBox, 0 , wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + m_PanelFootprintFilter->SetSizer( PanelFpFilterBoxSizer ); + wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer * RightBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelFpFilterBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + PanelFpFilterBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); - wxButton * Button = new wxButton(m_PanelFootprintFilter, ID_ADD_FOOTPRINT_FILTER, _("Add")); - Button->SetForegroundColour(*wxBLUE); - RightBoxSizer->Add(Button, 0 , wxGROW|wxALL, 5); + wxStaticText* Msg = new wxStaticText( m_PanelFootprintFilter, -1, _( + "Footprints" ) ); - m_ButtonDeleteOneFootprintFilter = new wxButton(m_PanelFootprintFilter, ID_DELETE_ONE_FOOTPRINT_FILTER, - _("Delete")); - m_ButtonDeleteOneFootprintFilter->SetForegroundColour(*wxRED); - RightBoxSizer->Add(m_ButtonDeleteOneFootprintFilter, 0 , wxGROW|wxALL, 5); + Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); + LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); - m_ButtonDeleteAllFootprintFilter = new wxButton(m_PanelFootprintFilter, ID_DELETE_ALL_FOOTPRINT_FILTER, - _("Delete All")); - m_ButtonDeleteAllFootprintFilter->SetForegroundColour(*wxRED); - RightBoxSizer->Add(m_ButtonDeleteAllFootprintFilter, 0 , wxGROW|wxALL, 5); + m_FootprintFilterListBox = new wxListBox( m_PanelFootprintFilter, + -1, + wxDefaultPosition, wxSize( 200, 250 ), + 0, NULL, + wxLB_ALWAYS_SB | wxLB_SINGLE ); + + LeftBoxSizer->Add( m_FootprintFilterListBox, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); + + wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); + + PanelFpFilterBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + wxButton* Button = new wxButton( m_PanelFootprintFilter, + ID_ADD_FOOTPRINT_FILTER, _( + "Add" ) ); + + Button->SetForegroundColour( *wxBLUE ); + RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); + + m_ButtonDeleteOneFootprintFilter = new wxButton( m_PanelFootprintFilter, + ID_DELETE_ONE_FOOTPRINT_FILTER, + _( + "Delete" ) ); + + m_ButtonDeleteOneFootprintFilter->SetForegroundColour( *wxRED ); + RightBoxSizer->Add( m_ButtonDeleteOneFootprintFilter, 0, wxGROW | wxALL, 5 ); + + m_ButtonDeleteAllFootprintFilter = new wxButton( m_PanelFootprintFilter, + ID_DELETE_ALL_FOOTPRINT_FILTER, + _( + "Delete All" ) ); + + m_ButtonDeleteAllFootprintFilter->SetForegroundColour( *wxRED ); + RightBoxSizer->Add( m_ButtonDeleteAllFootprintFilter, 0, wxGROW | wxALL, 5 ); - /* Read the Footprint Filter list */ - if ( CurrentLibEntry ) - { - for ( unsigned ii = 0; ii < CurrentLibEntry->m_FootprintList.GetCount(); ii ++) - m_FootprintFilterListBox->Append(CurrentLibEntry->m_FootprintList[ii]); - } + /* Read the Footprint Filter list */ + if( CurrentLibEntry ) + { + for( unsigned ii = 0; ii < CurrentLibEntry->m_FootprintList.GetCount(); ii++ ) + m_FootprintFilterListBox->Append( CurrentLibEntry->m_FootprintList[ii] ); + } - if ( (CurrentLibEntry == NULL) || (CurrentLibEntry->m_FootprintList.GetCount() == 0) ) - { - m_ButtonDeleteAllFootprintFilter->Enable(FALSE); - m_ButtonDeleteOneFootprintFilter->Enable(FALSE); - } + if( (CurrentLibEntry == NULL) || (CurrentLibEntry->m_FootprintList.GetCount() == 0) ) + { + m_ButtonDeleteAllFootprintFilter->Enable( FALSE ); + m_ButtonDeleteOneFootprintFilter->Enable( FALSE ); + } } - /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelDoc() /*****************************************************/ + /* create the panel for component doc editing -*/ + */ { -wxString msg_text; + wxString msg_text; - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC]; - else - { - if (CurrentLibEntry && CurrentLibEntry->m_Doc) - msg_text = CurrentLibEntry->m_Doc; - } - m_Doc->SetValue( msg_text ); + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC]; + else + { + if( CurrentLibEntry && CurrentLibEntry->m_Doc ) + msg_text = CurrentLibEntry->m_Doc; + } + m_Doc->SetValue( msg_text ); - msg_text.Empty(); - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD]; - else - { - if (CurrentLibEntry ) msg_text = CurrentLibEntry->m_KeyWord; - } - m_Keywords->SetValue(msg_text); + msg_text.Empty(); + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD]; + else + { + if( CurrentLibEntry ) + msg_text = CurrentLibEntry->m_KeyWord; + } + m_Keywords->SetValue( msg_text ); - msg_text.Empty(); - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME]; - else - { - if (CurrentLibEntry) msg_text = CurrentLibEntry->m_DocFile; - } - m_Docfile->SetValue( msg_text ); - - if ( m_AliasLocation < 0 ) m_ButtonCopyDoc->Enable(FALSE); + msg_text.Empty(); + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME]; + else + { + if( CurrentLibEntry ) + msg_text = CurrentLibEntry->m_DocFile; + } + m_Docfile->SetValue( msg_text ); + if( m_AliasLocation < 0 ) + m_ButtonCopyDoc->Enable( FALSE ); } /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelBasic() /*****************************************************/ + /* create the basic panel for component properties editing -*/ + */ { - m_PanelBasic->SetFont(*g_DialogFont); + m_PanelBasic->SetFont( *g_DialogFont ); - AsConvertButt = new wxCheckBox(m_PanelBasic,-1, _("As Convert")); - if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE); - m_OptionsBoxSizer->Add(AsConvertButt, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + AsConvertButt = new wxCheckBox( m_PanelBasic, -1, _( "As Convert" ) ); - ShowPinNumButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Num")); - if ( CurrentLibEntry ) - { - if ( CurrentLibEntry->m_DrawPinNum ) ShowPinNumButt->SetValue(TRUE); - } - else ShowPinNumButt->SetValue(TRUE); - m_OptionsBoxSizer->Add(ShowPinNumButt, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + if( g_AsDeMorgan ) + AsConvertButt->SetValue( TRUE ); + m_OptionsBoxSizer->Add( AsConvertButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); - ShowPinNameButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Name")); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_DrawPinName ) ShowPinNameButt->SetValue(TRUE); - } - else ShowPinNameButt->SetValue(TRUE); - m_OptionsBoxSizer->Add(ShowPinNameButt, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ) ); - m_PinsNameInsideButt = new wxCheckBox(m_PanelBasic,-1, _("Pin Name Inside")); - if ( CurrentLibEntry ) - { - if ( CurrentLibEntry->m_TextInside ) m_PinsNameInsideButt->SetValue(TRUE); - } - else m_PinsNameInsideButt->SetValue(TRUE); - m_OptionsBoxSizer->Add(m_PinsNameInsideButt, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_DrawPinNum ) + ShowPinNumButt->SetValue( TRUE ); + } + else + ShowPinNumButt->SetValue( TRUE ); + m_OptionsBoxSizer->Add( ShowPinNumButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); - int number, number_of_units; - if ( CurrentLibEntry ) number_of_units = CurrentLibEntry->m_UnitCount; - else number_of_units = 1; - SelNumberOfUnits->SetValue(number_of_units); + ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ) ); - if ( CurrentLibEntry && CurrentLibEntry->m_TextInside) - number = CurrentLibEntry->m_TextInside; - else number = 40; - m_SetSkew->SetValue( number ); + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_DrawPinName ) + ShowPinNameButt->SetValue( TRUE ); + } + else + ShowPinNameButt->SetValue( TRUE ); + m_OptionsBoxSizer->Add( ShowPinNameButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_Options == ENTRY_POWER ) - m_OptionPower->SetValue(TRUE); - } + m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ) ); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_UnitSelectionLocked ) - m_OptionPartsLocked->SetValue(TRUE); - } + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_TextInside ) + m_PinsNameInsideButt->SetValue( TRUE ); + } + else + m_PinsNameInsideButt->SetValue( TRUE ); + m_OptionsBoxSizer->Add( m_PinsNameInsideButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); + + int number, number_of_units; + if( CurrentLibEntry ) + number_of_units = CurrentLibEntry->m_UnitCount; + else + number_of_units = 1; + SelNumberOfUnits->SetValue( number_of_units ); + + if( CurrentLibEntry && CurrentLibEntry->m_TextInside ) + number = CurrentLibEntry->m_TextInside; + else + number = 40; + m_SetSkew->SetValue( number ); + + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_Options == ENTRY_POWER ) + m_OptionPower->SetValue( TRUE ); + } + + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_UnitSelectionLocked ) + m_OptionPartsLocked->SetValue( TRUE ); + } } + /*********************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelEditField() /**********************************************************/ + /* Create and build the panel managing the fields (REF, VALUE ...) - of the component -*/ + * of the component + */ { -wxString Hjustify_list[] = - { _("Left justify"),_("Center"),_("Right justify")}; -wxString Vjustify_list[] = - { _("Bottom justify"),_("Center"),_("Top justify")}; -int FieldId = m_CurrentFieldId; + wxString Hjustify_list[] = + { _( "Left justify" ), _( "Center" ), _( "Right justify" ) }; + wxString Vjustify_list[] = + { _( "Bottom justify" ), _( "Center" ), _( "Top justify" ) }; + int FieldId = m_CurrentFieldId; - m_PanelField = new wxPanel(m_NoteBook, ID_PANEL_FIELD); - m_PanelField->SetFont(*g_DialogFont); - m_NoteBook->AddPage(m_PanelField, _("Fields"), FALSE); + m_PanelField = new wxPanel( m_NoteBook, ID_PANEL_FIELD ); - wxBoxSizer * PanelFieldBoxSizer = new wxBoxSizer(wxHORIZONTAL); - m_PanelField->SetSizer(PanelFieldBoxSizer); - wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelFieldBoxSizer->Add(LeftBoxSizer, 0 , wxGROW|wxALL, 5); - wxBoxSizer * MiddleBoxSizer = new wxBoxSizer(wxVERTICAL); - PanelFieldBoxSizer->Add(MiddleBoxSizer, 0 , wxGROW|wxALL, 5); + m_PanelField->SetFont( *g_DialogFont ); + m_NoteBook->AddPage( m_PanelField, _( "Fields" ), FALSE ); - m_ShowFieldTextCtrl = new wxCheckBox(m_PanelField,-1, - _("Show Text") ); - LeftBoxSizer->Add(m_ShowFieldTextCtrl, 0 , wxGROW|wxALL, 5); + wxBoxSizer* PanelFieldBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - m_VorientFieldTextCtrl = new wxCheckBox(m_PanelField,-1, - _("Vertical")); - LeftBoxSizer->Add(m_VorientFieldTextCtrl, 0 , wxGROW|wxALL, 5); + m_PanelField->SetSizer( PanelFieldBoxSizer ); + wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - // Create the box for field name display or edition - m_FieldNameCtrl = new WinEDA_EnterText( m_PanelField, - _("Field Name:"), m_FieldName[FieldId], - LeftBoxSizer, wxSize( 200, -1) ); - if ( FieldId < FIELD1 ) m_FieldNameCtrl->Enable(FALSE ); - else m_FieldNameCtrl->Enable( TRUE ); + PanelFieldBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); + wxBoxSizer* MiddleBoxSizer = new wxBoxSizer( wxVERTICAL ); - // Create the box for text editing (text, size) - m_FieldTextCtrl = new WinEDA_GraphicTextCtrl( m_PanelField, - _("Value:"), - m_FieldText[FieldId], m_FieldSize[FieldId], - g_UnitMetric, LeftBoxSizer, 200); + PanelFieldBoxSizer->Add( MiddleBoxSizer, 0, wxGROW | wxALL, 5 ); - // Create the box for text editing (position) - m_FieldPositionCtrl = new WinEDA_PositionCtrl( m_PanelField, - _("Pos"), m_FieldPosition[FieldId], - g_UnitMetric , LeftBoxSizer); + m_ShowFieldTextCtrl = new wxCheckBox( m_PanelField, -1, + _( "Show Text" ) ); + + LeftBoxSizer->Add( m_ShowFieldTextCtrl, 0, wxGROW | wxALL, 5 ); + + m_VorientFieldTextCtrl = new wxCheckBox( m_PanelField, -1, + _( "Vertical" ) ); + + LeftBoxSizer->Add( m_VorientFieldTextCtrl, 0, wxGROW | wxALL, 5 ); + + // Create the box for field name display or edition + m_FieldNameCtrl = new WinEDA_EnterText( m_PanelField, + _( "Field Name:" ), m_FieldName[FieldId], + LeftBoxSizer, wxSize( 200, -1 ) ); + + if( FieldId < FIELD1 ) + m_FieldNameCtrl->Enable( FALSE ); + else + m_FieldNameCtrl->Enable( TRUE ); + + // Create the box for text editing (text, size) + m_FieldTextCtrl = new WinEDA_GraphicTextCtrl( m_PanelField, + _( "Value:" ), + m_FieldText[FieldId], m_FieldSize[FieldId], + g_UnitMetric, LeftBoxSizer, 200 ); + + // Create the box for text editing (position) + m_FieldPositionCtrl = new WinEDA_PositionCtrl( m_PanelField, + _( "Pos" ), m_FieldPosition[FieldId], + g_UnitMetric, LeftBoxSizer ); - m_FieldHJustifyCtrl = new wxRadioBox(m_PanelField,-1, - _("Hor Justify"), wxDefaultPosition, wxDefaultSize, - 3,Hjustify_list, 1 , wxRA_SPECIFY_COLS); - m_FieldHJustifyCtrl->SetSelection(1); - MiddleBoxSizer->Add(m_FieldHJustifyCtrl, 0 , wxGROW|wxALL, 5); + m_FieldHJustifyCtrl = new wxRadioBox( m_PanelField, -1, + _( "Hor Justify" ), wxDefaultPosition, wxDefaultSize, + 3, Hjustify_list, 1, wxRA_SPECIFY_COLS ); - m_FieldVJustifyCtrl = new wxRadioBox(m_PanelField,-1, - _("Vert Justify"), wxDefaultPosition, wxDefaultSize, - 3,Vjustify_list, 1 , wxRA_SPECIFY_COLS); - m_FieldVJustifyCtrl->SetSelection(1); - MiddleBoxSizer->Add(m_FieldVJustifyCtrl, 0 , wxGROW|wxALL, 5); + m_FieldHJustifyCtrl->SetSelection( 1 ); + MiddleBoxSizer->Add( m_FieldHJustifyCtrl, 0, wxGROW | wxALL, 5 ); - // Create the field list -wxString fieldnamelist[NUMBER_OF_FIELDS]; - for ( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) - { - if ( m_FieldName[ii].IsEmpty() ) - fieldnamelist[ii] = ReturnDefaultFieldName(ii); - else fieldnamelist[ii] = m_FieldName[ii]; - } + m_FieldVJustifyCtrl = new wxRadioBox( m_PanelField, -1, + _( "Vert Justify" ), wxDefaultPosition, wxDefaultSize, + 3, Vjustify_list, 1, wxRA_SPECIFY_COLS ); - m_FieldSelection = new wxRadioBox(m_PanelField, ID_ON_SELECT_FIELD, - _("Field to edit"), wxDefaultPosition, wxDefaultSize, - NUMBER_OF_FIELDS, fieldnamelist, 2 , wxRA_SPECIFY_COLS); - PanelFieldBoxSizer->Add(m_FieldSelection, 0 , wxGROW|wxALL, 5); + m_FieldVJustifyCtrl->SetSelection( 1 ); + MiddleBoxSizer->Add( m_FieldVJustifyCtrl, 0, wxGROW | wxALL, 5 ); - CopyDataToPanelField(); + // Create the field list + wxString fieldnamelist[NUMBER_OF_FIELDS]; + for( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + { + if( m_FieldName[ii].IsEmpty() ) + fieldnamelist[ii] = ReturnDefaultFieldName( ii ); + else + fieldnamelist[ii] = m_FieldName[ii]; + } + m_FieldSelection = new wxRadioBox( m_PanelField, ID_ON_SELECT_FIELD, + _( "Field to edit" ), wxDefaultPosition, wxDefaultSize, + NUMBER_OF_FIELDS, fieldnamelist, 2, wxRA_SPECIFY_COLS ); + + PanelFieldBoxSizer->Add( m_FieldSelection, 0, wxGROW | wxALL, 5 ); + + CopyDataToPanelField(); } + /****************************************************************/ void WinEDA_PartPropertiesFrame::CopyDataToPanelField() /****************************************************************/ + /* Set the values displayed on the panel field according to - the current field number -*/ + * the current field number + */ { -int FieldId = m_CurrentFieldId; + int FieldId = m_CurrentFieldId; - for ( int ii = FIELD1; ii < NUMBER_OF_FIELDS; ii++ ) - { - if ( ! m_FieldName[ii].IsEmpty() ) - m_FieldSelection->SetString(ii, m_FieldName[ii]); - else m_FieldSelection->SetString(ii, ReturnDefaultFieldName(ii)); - } + for( int ii = FIELD1; ii < NUMBER_OF_FIELDS; ii++ ) + { + if( !m_FieldName[ii].IsEmpty() ) + m_FieldSelection->SetString( ii, m_FieldName[ii] ); + else + m_FieldSelection->SetString( ii, ReturnDefaultFieldName( ii ) ); + } - if ( m_FieldFlags[FieldId] ) - m_ShowFieldTextCtrl->SetValue(TRUE); - else m_ShowFieldTextCtrl->SetValue(FALSE); + if( m_FieldFlags[FieldId] ) + m_ShowFieldTextCtrl->SetValue( TRUE ); + else + m_ShowFieldTextCtrl->SetValue( FALSE ); - if ( m_FieldOrient[FieldId] ) m_VorientFieldTextCtrl->SetValue(TRUE); - else m_VorientFieldTextCtrl->SetValue(FALSE); + if( m_FieldOrient[FieldId] ) + m_VorientFieldTextCtrl->SetValue( TRUE ); + else + m_VorientFieldTextCtrl->SetValue( FALSE ); - m_FieldHJustifyCtrl->SetSelection(m_FieldHJustify[FieldId]); + m_FieldHJustifyCtrl->SetSelection( m_FieldHJustify[FieldId] ); - m_FieldVJustifyCtrl->SetSelection(m_FieldVJustify[FieldId]); + m_FieldVJustifyCtrl->SetSelection( m_FieldVJustify[FieldId] ); - m_FieldPositionCtrl->SetValue(m_FieldPosition[FieldId].x, m_FieldPosition[FieldId].y ); - - m_FieldNameCtrl->SetValue(m_FieldName[FieldId]); - if ( FieldId < FIELD1 ) m_FieldNameCtrl->Enable(FALSE ); - else m_FieldNameCtrl->Enable( TRUE ); - m_FieldTextCtrl->SetValue(m_FieldText[FieldId]); // display new text field - m_FieldTextCtrl->SetValue(m_FieldSize[FieldId]); // display new size field + m_FieldPositionCtrl->SetValue( m_FieldPosition[FieldId].x, m_FieldPosition[FieldId].y ); + m_FieldNameCtrl->SetValue( m_FieldName[FieldId] ); + if( FieldId < FIELD1 ) + m_FieldNameCtrl->Enable( FALSE ); + else + m_FieldNameCtrl->Enable( TRUE ); + m_FieldTextCtrl->SetValue( m_FieldText[FieldId] ); // display new text field + m_FieldTextCtrl->SetValue( m_FieldSize[FieldId] ); // display new size field } + /****************************************************************/ void WinEDA_PartPropertiesFrame::CopyPanelFieldToData() /****************************************************************/ + /* Copy the values displayed on the panel field to the buffers according to - the current field number -*/ + * the current field number + */ { -int id = m_CurrentFieldId; + int id = m_CurrentFieldId; - m_FieldFlags[id] = m_ShowFieldTextCtrl->GetValue(); - m_FieldOrient[id] = m_VorientFieldTextCtrl->GetValue(); - m_FieldHJustify[id] = m_FieldHJustifyCtrl->GetSelection(); - m_FieldVJustify[id] = m_FieldVJustifyCtrl->GetSelection(); - m_FieldText[id] = m_FieldTextCtrl->GetText(); - m_FieldName[id] = m_FieldNameCtrl->GetValue(); - m_FieldPosition[id] = m_FieldPositionCtrl->GetValue(); - m_FieldSize[id] = m_FieldTextCtrl->GetTextSize(); + m_FieldFlags[id] = m_ShowFieldTextCtrl->GetValue(); + m_FieldOrient[id] = m_VorientFieldTextCtrl->GetValue(); + m_FieldHJustify[id] = m_FieldHJustifyCtrl->GetSelection(); + m_FieldVJustify[id] = m_FieldVJustifyCtrl->GetSelection(); + m_FieldText[id] = m_FieldTextCtrl->GetText(); + m_FieldName[id] = m_FieldNameCtrl->GetValue(); + m_FieldPosition[id] = m_FieldPositionCtrl->GetValue(); + m_FieldSize[id] = m_FieldTextCtrl->GetTextSize(); } /********************************************************************/ -void WinEDA_PartPropertiesFrame::SelectNewField(wxCommandEvent& event) +void WinEDA_PartPropertiesFrame::SelectNewField( wxCommandEvent& event ) /********************************************************************/ + /* called when changing the current field selected - Save the current field settings in buffer and display the new one -*/ + * Save the current field settings in buffer and display the new one + */ { - CopyPanelFieldToData(); - m_CurrentFieldId = m_FieldSelection->GetSelection(); - CopyDataToPanelField(); + CopyPanelFieldToData(); + m_CurrentFieldId = m_FieldSelection->GetSelection(); + CopyDataToPanelField(); } + /**************************************************************************/ -void WinEDA_PartPropertiesFrame::PartPropertiesAccept(wxCommandEvent& event) +void WinEDA_PartPropertiesFrame::PartPropertiesAccept( wxCommandEvent& event ) /**************************************************************************/ + /* Updaye the current component parameters -*/ + */ { -int ii, jj; + int ii, jj; - if( CurrentLibEntry == NULL ) - { - Close(); return; - } + if( CurrentLibEntry == NULL ) + { + Close(); return; + } - m_Parent->m_CurrentScreen->SetModify(); - m_Parent->SaveCopyInUndoList(CurrentLibEntry); + m_Parent->m_CurrentScreen->SetModify(); + m_Parent->SaveCopyInUndoList( CurrentLibEntry ); - CopyPanelFieldToData(); + CopyPanelFieldToData(); - /* A new name could be entered in VALUE field. - Must not be an existing alias name in alias list box */ - jj = m_PartAliasList->GetCount(); - wxString newvalue = m_FieldText[VALUE]; - for ( ii = 0; ii < jj; ii++ ) - { - if( newvalue.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 ) - { - wxString msg; - msg.Printf( wxT("Alias %s exists!"), newvalue.GetData()); - DisplayError(this, msg); - return; - } - } + /* A new name could be entered in VALUE field. + * Must not be an existing alias name in alias list box */ + jj = m_PartAliasList->GetCount(); + wxString newvalue = m_FieldText[VALUE]; + for( ii = 0; ii < jj; ii++ ) + { + if( newvalue.CmpNoCase( m_PartAliasList->GetString( ii ).GetData() ) == 0 ) + { + wxString msg; + msg.Printf( wxT( "Alias %s exists!" ), newvalue.GetData() ); + DisplayError( this, msg ); + return; + } + } - /* Update the doc, keyword and doc filename strings */ - if ( m_AliasLocation < 0 ) - { - CurrentLibEntry->m_Doc = m_Doc->GetValue(); - CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); - CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); - } + /* Update the doc, keyword and doc filename strings */ + if( m_AliasLocation < 0 ) + { + CurrentLibEntry->m_Doc = m_Doc->GetValue(); + CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); + CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); + } + else + { + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue(); + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD] = m_Keywords->GetValue(); + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME] = m_Docfile->GetValue(); + } - else - { - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC] = m_Doc->GetValue(); - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD] = m_Keywords->GetValue(); - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME] = m_Docfile->GetValue(); - } + /* Update the alias list */ + /* 1 - Add names: test for a not existing name in old alias list: */ + jj = m_PartAliasList->GetCount(); + for( ii = 0; ii < jj; ii++ ) + { + if( LocateAlias( CurrentLibEntry->m_AliasList, m_PartAliasList->GetString( ii ) ) < 0 ) + { // new alias must be created + CurrentLibEntry->m_AliasList.Add( m_PartAliasList->GetString( ii ) ); + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void doc string + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void keyword list string + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void doc filename string + } + } - /* Update the alias list */ - /* 1 - Add names: test for a not existing name in old alias list: */ - jj = m_PartAliasList->GetCount(); - for ( ii = 0; ii < jj; ii++ ) - { - if ( LocateAlias( CurrentLibEntry->m_AliasList, m_PartAliasList->GetString(ii)) < 0 ) - { // new alias must be created - CurrentLibEntry->m_AliasList.Add(m_PartAliasList->GetString(ii)); - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc string - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void keyword list string - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc filename string - } - } + /* 2 - Remove delete names: test for an non existing name in new alias list: */ + int kk, kkmax = CurrentLibEntry->m_AliasList.GetCount(); + for( kk = 0; kk < kkmax; ) + { + jj = m_PartAliasList->GetCount(); + wxString aliasname = CurrentLibEntry->m_AliasList[kk]; + for( ii = 0; ii < jj; ii++ ) + { + if( aliasname.CmpNoCase( m_PartAliasList->GetString( ii ).GetData() ) == 0 ) + { + kk += ALIAS_NEXT; // Alias exist in new list. keep it and test next old name + break; + } + } - /* 2 - Remove delete names: test for an non existing name in new alias list: */ - int kk, kkmax = CurrentLibEntry->m_AliasList.GetCount(); - for ( kk = 0; kk < kkmax; ) - { - jj = m_PartAliasList->GetCount(); - wxString aliasname = CurrentLibEntry->m_AliasList[kk]; - for ( ii = 0; ii < jj; ii++ ) - { - if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 ) - { - kk += ALIAS_NEXT; // Alias exist in new list. keep it and test next old name - break; - } - } + if( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) + { + for( ii = 0; ii < ALIAS_NEXT; ii++ ) + CurrentLibEntry->m_AliasList.RemoveAt( kk ); - if ( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) - { - for( ii = 0; ii < ALIAS_NEXT; ii++ ) CurrentLibEntry->m_AliasList.RemoveAt(kk); - kkmax = CurrentLibEntry->m_AliasList.GetCount(); - } + kkmax = CurrentLibEntry->m_AliasList.GetCount(); + } + } - } + // Void fields for REFERENCE and VALUE are not allowed + if( m_FieldText[REFERENCE].IsEmpty() ) + { + m_FieldText[REFERENCE] = CurrentLibEntry->m_Prefix.m_Text; + } + + if( m_FieldText[VALUE].IsEmpty() ) + { + m_FieldText[VALUE] = CurrentLibEntry->m_Name.m_Text; + } + else + { + if( CurrentLibEntry->m_Name.m_Text != m_FieldText[VALUE] ) + m_RecreateToolbar = TRUE; + } - // Void fields for REFERENCE and VALUE are not allowed - if ( m_FieldText[REFERENCE].IsEmpty() ) - { - m_FieldText[REFERENCE] = CurrentLibEntry->m_Prefix.m_Text; - } + CopyBufferToFieldData( &CurrentLibEntry->m_Prefix ); + CopyBufferToFieldData( &CurrentLibEntry->m_Name ); - if ( m_FieldText[VALUE].IsEmpty() ) - { - m_FieldText[VALUE] = CurrentLibEntry->m_Name.m_Text; - } - else - { - if ( CurrentLibEntry->m_Name.m_Text != m_FieldText[VALUE] ) - m_RecreateToolbar = TRUE; - } + for( ii = FOOTPRINT; ii < NUMBER_OF_FIELDS; ii++ ) + { + LibDrawField* Field = CurrentLibEntry->Fields; + LibDrawField* NextField, * previousField = NULL; + while( Field ) + { + NextField = (LibDrawField*) Field->Pnext; + if( Field->m_FieldId == ii ) + { + CopyBufferToFieldData( Field ); + // An old field exists; delete it if void + if( Field->m_Text.IsEmpty() ) + { + if( ii < FIELD1 || Field->m_Name.IsEmpty() ) + { + delete Field; + if( previousField ) + previousField->Pnext = NextField; + else + CurrentLibEntry->Fields = NextField; + } + } + break; + } - CopyBufferToFieldData(& CurrentLibEntry->m_Prefix); - CopyBufferToFieldData(& CurrentLibEntry->m_Name); + previousField = Field; + Field = NextField; + } - for ( ii = FOOTPRINT; ii < NUMBER_OF_FIELDS; ii++ ) - { - LibDrawField * Field = CurrentLibEntry->Fields; - LibDrawField * NextField, * previousField = NULL; - while ( Field ) - { - NextField = (LibDrawField*)Field->Pnext; - if( Field->m_FieldId == ii ) - { - CopyBufferToFieldData(Field); - // An old field exists; delete it if void - if( Field->m_Text.IsEmpty() ) - { - if ( ii < FIELD1 || Field->m_Name.IsEmpty() ) - { - delete Field; - if ( previousField ) previousField->Pnext = NextField; - else CurrentLibEntry->Fields = NextField; - } - } - break; - } + if( Field == NULL ) // Do not exists: must be created if not void + { + bool create = FALSE; + if( !m_FieldText[ii].IsEmpty() ) + create = TRUE; + if( !m_FieldName[ii].IsEmpty() && ( m_FieldName[ii] != ReturnDefaultFieldName( ii ) ) ) + create = TRUE; + if( create ) + { + Field = new LibDrawField( ii ); - previousField = Field; - Field = NextField; - } + CopyBufferToFieldData( Field ); + Field->Pnext = CurrentLibEntry->Fields; + CurrentLibEntry->Fields = Field; + } + } + } - if ( Field == NULL) // Do not exists: must be created if not void - { - bool create = FALSE; - if ( ! m_FieldText[ii].IsEmpty() ) create = TRUE; - if ( ! m_FieldName[ii].IsEmpty() && (m_FieldName[ii] != ReturnDefaultFieldName(ii)) ) - create = TRUE; - if ( create ) - { - Field = new LibDrawField(ii); - CopyBufferToFieldData(Field); - Field->Pnext = CurrentLibEntry->Fields; - CurrentLibEntry->Fields = Field; - } - } - } + /* for a user field (FieldId >= FIELD1), if a field value is void, + * fill it with "~" because for a library componenta void field is not a very good idea + * (we do not see anything...) and in schematic this text is like a void text */ + { + LibDrawField* Field = CurrentLibEntry->Fields; + while( Field ) + { + if( Field->m_FieldId >= FIELD1 ) + if( Field->m_Text.IsEmpty() ) + Field->m_Text = wxT( "~" ); + Field = (LibDrawField*) Field->Pnext; + } + } - /* for a user field (FieldId >= FIELD1), if a field value is void, - fill it with "~" because for a library componenta void field is not a very good idea - (we do not see anything...) and in schematic this text is like a void text */ - { - LibDrawField * Field = CurrentLibEntry->Fields; - while ( Field ) - { - if( Field->m_FieldId >= FIELD1 ) - if ( Field->m_Text.IsEmpty() ) Field->m_Text = wxT("~"); - Field = (LibDrawField*)Field->Pnext; - } - } + ii = SelNumberOfUnits->GetValue(); + if( ChangeNbUnitsPerPackage( ii ) ) + m_RecreateToolbar = TRUE; - ii = SelNumberOfUnits->GetValue(); - if ( ChangeNbUnitsPerPackage(ii) ) - m_RecreateToolbar = TRUE; + if( AsConvertButt->GetValue() ) + { + if( !g_AsDeMorgan ) + { + g_AsDeMorgan = 1; + if( SetUnsetConvert() ) + m_RecreateToolbar = TRUE; + } + } + else + { + if( g_AsDeMorgan ) + { + g_AsDeMorgan = 0; + if( SetUnsetConvert() ) + m_RecreateToolbar = TRUE; + } + } - if ( AsConvertButt->GetValue() ) - { - if ( ! g_AsDeMorgan ) - { - g_AsDeMorgan = 1; - if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; - } - } - else - { - if ( g_AsDeMorgan ) - { - g_AsDeMorgan = 0; - if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; - } - } + CurrentLibEntry->m_DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0; + CurrentLibEntry->m_DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0; - CurrentLibEntry->m_DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0; - CurrentLibEntry->m_DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0; + if( m_PinsNameInsideButt->GetValue() == FALSE ) + CurrentLibEntry->m_TextInside = 0; + else + CurrentLibEntry->m_TextInside = m_SetSkew->GetValue(); - if ( m_PinsNameInsideButt->GetValue() == FALSE) - CurrentLibEntry->m_TextInside = 0; - else - CurrentLibEntry->m_TextInside = m_SetSkew->GetValue(); + if( m_OptionPower->GetValue() == TRUE ) + CurrentLibEntry->m_Options = ENTRY_POWER; + else + CurrentLibEntry->m_Options = ENTRY_NORMAL; - if ( m_OptionPower->GetValue() == TRUE) - CurrentLibEntry->m_Options = ENTRY_POWER; - else - CurrentLibEntry->m_Options = ENTRY_NORMAL; + /* Set the option "Units locked". + * Obviously, cannot be TRUE if there is only one part */ + CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); + if( CurrentLibEntry->m_UnitCount <= 1 ) + CurrentLibEntry->m_UnitSelectionLocked = FALSE; - /* Set the option "Units locked". - Obviously, cannot be TRUE if there is only one part */ - CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); - if ( CurrentLibEntry->m_UnitCount <= 1 ) - CurrentLibEntry->m_UnitSelectionLocked = FALSE; + if( m_RecreateToolbar ) + m_Parent->ReCreateHToolbar(); - if ( m_RecreateToolbar ) m_Parent->ReCreateHToolbar(); + m_Parent->DisplayLibInfos(); - m_Parent->DisplayLibInfos(); - - /* Update the footprint filter list */ - CurrentLibEntry->m_FootprintList.Clear(); - jj = m_FootprintFilterListBox->GetCount(); - for ( ii = 0; ii < jj; ii ++) - CurrentLibEntry->m_FootprintList.Add(m_FootprintFilterListBox->GetString(ii)); + /* Update the footprint filter list */ + CurrentLibEntry->m_FootprintList.Clear(); + jj = m_FootprintFilterListBox->GetCount(); + for( ii = 0; ii < jj; ii++ ) + CurrentLibEntry->m_FootprintList.Add( m_FootprintFilterListBox->GetString( ii ) ); - EndModal(1); + EndModal( 1 ); } /*******************************************************************************/ -void WinEDA_PartPropertiesFrame::CopyDocToAlias(wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) ) /******************************************************************************/ { - if( CurrentLibEntry == NULL ) return; - if ( CurrentAliasName.IsEmpty() ) return; + if( CurrentLibEntry == NULL ) + return; + if( CurrentAliasName.IsEmpty() ) + return; - m_Doc->SetValue(CurrentLibEntry->m_Doc); - m_Docfile->SetValue(CurrentLibEntry->m_DocFile); - m_Keywords->SetValue(CurrentLibEntry->m_KeyWord); + m_Doc->SetValue( CurrentLibEntry->m_Doc ); + m_Docfile->SetValue( CurrentLibEntry->m_DocFile ); + m_Keywords->SetValue( CurrentLibEntry->m_KeyWord ); } + /**********************************************************/ void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /**********************************************************/ { - - CurrentAliasName.Empty(); - if( CurrentLibEntry ) - { - if( IsOK(this, _("Ok to Delete Alias LIST") ) ) - { - m_PartAliasList->Clear(); - m_RecreateToolbar = TRUE; - m_ButtonDeleteAllAlias->Enable(FALSE); - m_ButtonDeleteOneAlias->Enable(FALSE); - } - } - + CurrentAliasName.Empty(); + if( CurrentLibEntry ) + { + if( IsOK( this, _( "Ok to Delete Alias LIST" ) ) ) + { + m_PartAliasList->Clear(); + m_RecreateToolbar = TRUE; + m_ButtonDeleteAllAlias->Enable( FALSE ); + m_ButtonDeleteOneAlias->Enable( FALSE ); + } + } } + /*******************************************************************************/ -void WinEDA_PartPropertiesFrame::AddAliasOfPart( wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::AddAliasOfPart( wxCommandEvent& WXUNUSED (event) ) /*******************************************************************************/ + /* Add a new name to the alias list box - New name cannot be the root name, and must not exists -*/ + * New name cannot be the root name, and must not exists + */ { -wxString Line; -wxString aliasname; + wxString Line; + wxString aliasname; - if(CurrentLibEntry == NULL) return; + if( CurrentLibEntry == NULL ) + return; - if( Get_Message(_("New alias:"),Line, this) != 0 ) return; + if( Get_Message( _( "New alias:" ), Line, this ) != 0 ) + return; - Line.Replace( wxT(" "), wxT("_") ); - aliasname = Line; + Line.Replace( wxT( " " ), wxT( "_" ) ); + aliasname = Line; - if ( CurrentLibEntry->m_Name.m_Text.CmpNoCase(Line) == 0 ) - { - DisplayError(this, _("This is the Root Part"), 10); return; - } + if( CurrentLibEntry->m_Name.m_Text.CmpNoCase( Line ) == 0 ) + { + DisplayError( this, _( "This is the Root Part" ), 10 ); return; + } - /* test for an existing name: */ - int ii, jj = m_PartAliasList->GetCount(); - for ( ii = 0; ii < jj; ii++ ) - { - if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii)) == 0 ) - { - DisplayError(this, _("Already in use"), 10); - return; - } - } + /* test for an existing name: */ + int ii, jj = m_PartAliasList->GetCount(); + for( ii = 0; ii < jj; ii++ ) + { + if( aliasname.CmpNoCase( m_PartAliasList->GetString( ii ) ) == 0 ) + { + DisplayError( this, _( "Already in use" ), 10 ); + return; + } + } - m_PartAliasList->Append(aliasname); - if ( CurrentAliasName.IsEmpty() ) m_ButtonDeleteAllAlias->Enable(TRUE); - m_ButtonDeleteOneAlias->Enable(TRUE); + m_PartAliasList->Append( aliasname ); + if( CurrentAliasName.IsEmpty() ) + m_ButtonDeleteAllAlias->Enable( TRUE ); + m_ButtonDeleteOneAlias->Enable( TRUE ); - m_RecreateToolbar = TRUE; + m_RecreateToolbar = TRUE; } + /********************************************************/ void WinEDA_PartPropertiesFrame::DeleteAliasOfPart( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /********************************************************/ { -wxString aliasname = m_PartAliasList->GetStringSelection(); + wxString aliasname = m_PartAliasList->GetStringSelection(); - if ( aliasname.IsEmpty() ) return; - if ( aliasname == CurrentAliasName ) - { - wxString msg = CurrentAliasName + _(" is Current Selected Alias!"); - DisplayError(this, msg ); - return; - } + if( aliasname.IsEmpty() ) + return; + if( aliasname == CurrentAliasName ) + { + wxString msg = CurrentAliasName + _( " is Current Selected Alias!" ); + DisplayError( this, msg ); + return; + } - int ii = m_PartAliasList->GetSelection(); - m_PartAliasList->Delete(ii); + int ii = m_PartAliasList->GetSelection(); + m_PartAliasList->Delete( ii ); - if ( ! CurrentLibEntry || (CurrentLibEntry->m_AliasList.GetCount() == 0) ) - { - m_ButtonDeleteAllAlias->Enable(FALSE); - m_ButtonDeleteOneAlias->Enable(FALSE); - } - m_RecreateToolbar = TRUE; + if( !CurrentLibEntry || (CurrentLibEntry->m_AliasList.GetCount() == 0) ) + { + m_ButtonDeleteAllAlias->Enable( FALSE ); + m_ButtonDeleteOneAlias->Enable( FALSE ); + } + m_RecreateToolbar = TRUE; } - - /********************************************************************/ -bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage(int MaxUnit) +bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit ) /********************************************************************/ + /* Routine de modification du nombre d'unites par package pour le - composant courant; -*/ + * composant courant; + */ { -int OldNumUnits, ii, FlagDel = -1; -LibEDA_BaseStruct* DrawItem, * NextDrawItem; + int OldNumUnits, ii, FlagDel = -1; + LibEDA_BaseStruct* DrawItem, * NextDrawItem; - if( CurrentLibEntry == NULL ) return FALSE; + if( CurrentLibEntry == NULL ) + return FALSE; - /* Si pas de changement: termine */ - if ( CurrentLibEntry->m_UnitCount == MaxUnit ) return FALSE; + /* Si pas de changement: termine */ + if( CurrentLibEntry->m_UnitCount == MaxUnit ) + return FALSE; - OldNumUnits = CurrentLibEntry->m_UnitCount; - if ( OldNumUnits < 1 ) OldNumUnits = 1; + OldNumUnits = CurrentLibEntry->m_UnitCount; + if( OldNumUnits < 1 ) + OldNumUnits = 1; - CurrentLibEntry->m_UnitCount = MaxUnit; + CurrentLibEntry->m_UnitCount = MaxUnit; - /* Traitement des unites enlevees ou rajoutees */ - if(OldNumUnits > CurrentLibEntry->m_UnitCount ) - { - DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = NextDrawItem) - { - NextDrawItem = DrawItem->Next(); - if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */ - { - if( FlagDel < 0 ) - { - if( IsOK(this, _("Delete units") ) ) - { - /* Si part selectee n'existe plus: selection 1ere unit */ - if( CurrentUnit > MaxUnit ) CurrentUnit = 1; - FlagDel = 1; - } - else - { - FlagDel = 0; - MaxUnit = OldNumUnits; - CurrentLibEntry->m_UnitCount = MaxUnit; - return FALSE; - } - } - DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, - DrawItem, 0); - } - } - return TRUE; - } + /* Traitement des unites enlevees ou rajoutees */ + if( OldNumUnits > CurrentLibEntry->m_UnitCount ) + { + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = NextDrawItem ) + { + NextDrawItem = DrawItem->Next(); + if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */ + { + if( FlagDel < 0 ) + { + if( IsOK( this, _( "Delete units" ) ) ) + { + /* Si part selectee n'existe plus: selection 1ere unit */ + if( CurrentUnit > MaxUnit ) + CurrentUnit = 1; + FlagDel = 1; + } + else + { + FlagDel = 0; + MaxUnit = OldNumUnits; + CurrentLibEntry->m_UnitCount = MaxUnit; + return FALSE; + } + } + DeleteOneLibraryDrawStruct( m_Parent->DrawPanel, NULL, CurrentLibEntry, + DrawItem, 0 ); + } + } - if(OldNumUnits < CurrentLibEntry->m_UnitCount ) - { - DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) - { - /* Duplication des items pour autres elements */ - if( DrawItem->m_Unit == 1 ) - { - for ( ii = OldNumUnits +1; ii <= MaxUnit; ii ++ ) - { - NextDrawItem = CopyDrawEntryStruct(this, DrawItem); - NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = NextDrawItem; - NextDrawItem->m_Unit = ii; - } - } - } - } - return TRUE; + return TRUE; + } + + if( OldNumUnits < CurrentLibEntry->m_UnitCount ) + { + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) + { + /* Duplication des items pour autres elements */ + if( DrawItem->m_Unit == 1 ) + { + for( ii = OldNumUnits + 1; ii <= MaxUnit; ii++ ) + { + NextDrawItem = CopyDrawEntryStruct( this, DrawItem ); + NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = NextDrawItem; + NextDrawItem->m_Unit = ii; + } + } + } + } + return TRUE; } /*****************************************************/ bool WinEDA_PartPropertiesFrame::SetUnsetConvert() /*****************************************************/ + /* crée ou efface (selon option AsConvert) les éléments - de la représentation convertie d'un composant -*/ + * de la représentation convertie d'un composant + */ { -int FlagDel = 0; -LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem; + int FlagDel = 0; + LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem; - if( g_AsDeMorgan ) /* Representation convertie a creer */ - { - /* Traitement des elements a ajouter ( pins seulement ) */ - if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) - { - /* Duplication des items pour autres elements */ - if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) continue; - if( DrawItem->m_Convert == 1 ) - { - if( FlagDel == 0 ) - { - if( IsOK(this, _("Create pins for Convert items")) ) - FlagDel = 1; - else - { - if( IsOK(this, _("Part as \"De Morgan\" anymore")) ) - return TRUE; + if( g_AsDeMorgan ) /* Representation convertie a creer */ + { + /* Traitement des elements a ajouter ( pins seulement ) */ + if( CurrentLibEntry ) + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) + { + /* Duplication des items pour autres elements */ + if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) + continue; + if( DrawItem->m_Convert == 1 ) + { + if( FlagDel == 0 ) + { + if( IsOK( this, _( "Create pins for Convert items" ) ) ) + FlagDel = 1; + else + { + if( IsOK( this, _( "Part as \"De Morgan\" anymore" ) ) ) + return TRUE; - g_AsDeMorgan = 0; return FALSE; - } - } - NextDrawItem = CopyDrawEntryStruct(this, DrawItem); - NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = NextDrawItem; - NextDrawItem->m_Convert = 2; - } - } - } - - else /* Representation convertie a supprimer */ - { - /* Traitement des elements à supprimer */ - if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = NextDrawItem) - { - NextDrawItem = DrawItem->Next(); - if( DrawItem->m_Convert > 1 ) /* Item a effacer */ - { - if( FlagDel == 0 ) - { - if( IsOK(this, _("Delete Convert items") ) ) - { - CurrentConvert = 1; - FlagDel = 1; - } - else - { - g_AsDeMorgan = 1; - return FALSE; - } - } - m_Parent->GetScreen()->SetModify(); - DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, DrawItem, 0); - } - } - } - return TRUE; + g_AsDeMorgan = 0; return FALSE; + } + } + NextDrawItem = CopyDrawEntryStruct( this, DrawItem ); + NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = NextDrawItem; + NextDrawItem->m_Convert = 2; + } + } + } + else /* Representation convertie a supprimer */ + { + /* Traitement des elements à supprimer */ + if( CurrentLibEntry ) + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = NextDrawItem ) + { + NextDrawItem = DrawItem->Next(); + if( DrawItem->m_Convert > 1 ) /* Item a effacer */ + { + if( FlagDel == 0 ) + { + if( IsOK( this, _( "Delete Convert items" ) ) ) + { + CurrentConvert = 1; + FlagDel = 1; + } + else + { + g_AsDeMorgan = 1; + return FALSE; + } + } + m_Parent->GetScreen()->SetModify(); + DeleteOneLibraryDrawStruct( m_Parent->DrawPanel, + NULL, + CurrentLibEntry, + DrawItem, + 0 ); + } + } + } + return TRUE; } + /****************************************************************************/ -void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile(wxCommandEvent& event) +void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event ) /****************************************************************************/ { -wxString FullFileName, mask; -wxString docpath(g_RealLibDirBuffer), filename; + wxString FullFileName, mask; - docpath += wxT("doc"); - docpath += STRING_DIR_SEP; - mask = wxT("*"); - FullFileName = EDA_FileSelector(_("Doc Files"), - docpath, /* Chemin par defaut */ - wxEmptyString, /* nom fichier par defaut */ - wxEmptyString, /* extension par defaut */ - mask, /* Masque d'affichage */ - this, - wxFD_OPEN, - TRUE - ); - if ( FullFileName.IsEmpty() ) return; + wxString docpath( g_RealLibDirBuffer ), filename; - // Suppression du chemin par defaut pour le fichier de doc: - filename = MakeReducedFileName(FullFileName,docpath, wxEmptyString); - m_Docfile->SetValue(filename); + docpath += wxT( "doc" ); + docpath += STRING_DIR_SEP; + mask = wxT( "*" ); + FullFileName = EDA_FileSelector( _( "Doc Files" ), + docpath, /* Chemin par defaut */ + wxEmptyString, /* nom fichier par defaut */ + wxEmptyString, /* extension par defaut */ + mask, /* Masque d'affichage */ + this, + wxFD_OPEN, + TRUE + ); + if( FullFileName.IsEmpty() ) + return; + + // Suppression du chemin par defaut pour le fichier de doc: + filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString ); + m_Docfile->SetValue( filename ); } /**********************************************************/ void WinEDA_PartPropertiesFrame::DeleteAllFootprintFilter( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /**********************************************************/ { - - if( IsOK(this, _("Ok to Delete FootprintFilter LIST") ) ) - { - m_FootprintFilterListBox->Clear(); - m_ButtonDeleteAllFootprintFilter->Enable(FALSE); - m_ButtonDeleteOneFootprintFilter->Enable(FALSE); - } + if( IsOK( this, _( "Ok to Delete FootprintFilter LIST" ) ) ) + { + m_FootprintFilterListBox->Clear(); + m_ButtonDeleteAllFootprintFilter->Enable( FALSE ); + m_ButtonDeleteOneFootprintFilter->Enable( FALSE ); + } } + /*******************************************************************************/ -void WinEDA_PartPropertiesFrame::AddFootprintFilter( wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) ) /*******************************************************************************/ + /* Add a new name to the alias list box - New name cannot be the root name, and must not exists -*/ + * New name cannot be the root name, and must not exists + */ { -wxString Line; + wxString Line; - if(CurrentLibEntry == NULL) return; + if( CurrentLibEntry == NULL ) + return; - if( Get_Message(_("New FootprintFilter:"),Line, this) != 0 ) return; + if( Get_Message( _( "New FootprintFilter:" ), Line, this ) != 0 ) + return; - Line.Replace( wxT(" "), wxT("_") ); + Line.Replace( wxT( " " ), wxT( "_" ) ); - /* test for an existing name: */ - int ii, jj = m_FootprintFilterListBox->GetCount(); - for ( ii = 0; ii < jj; ii++ ) - { - if( Line.CmpNoCase(m_FootprintFilterListBox->GetString(ii)) == 0 ) - { - DisplayError(this, _("Already in use"), 10); - return; - } - } + /* test for an existing name: */ + int ii, jj = m_FootprintFilterListBox->GetCount(); + for( ii = 0; ii < jj; ii++ ) + { + if( Line.CmpNoCase( m_FootprintFilterListBox->GetString( ii ) ) == 0 ) + { + DisplayError( this, _( "Already in use" ), 10 ); + return; + } + } - m_FootprintFilterListBox->Append(Line); - m_ButtonDeleteAllFootprintFilter->Enable(TRUE); - m_ButtonDeleteOneFootprintFilter->Enable(TRUE); + m_FootprintFilterListBox->Append( Line ); + m_ButtonDeleteAllFootprintFilter->Enable( TRUE ); + m_ButtonDeleteOneFootprintFilter->Enable( TRUE ); } + /********************************************************/ void WinEDA_PartPropertiesFrame::DeleteOneFootprintFilter( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /********************************************************/ { -int ii = m_FootprintFilterListBox->GetSelection(); - m_FootprintFilterListBox->Delete(ii); + int ii = m_FootprintFilterListBox->GetSelection(); - if ( ! CurrentLibEntry || (m_FootprintFilterListBox->GetCount() == 0) ) - { - m_ButtonDeleteAllFootprintFilter->Enable(FALSE); - m_ButtonDeleteOneFootprintFilter->Enable(FALSE); - } + m_FootprintFilterListBox->Delete( ii ); + + if( !CurrentLibEntry || (m_FootprintFilterListBox->GetCount() == 0) ) + { + m_ButtonDeleteAllFootprintFilter->Enable( FALSE ); + m_ButtonDeleteOneFootprintFilter->Enable( FALSE ); + } } - - diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index e1c995376c..68623bce2f 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -1,6 +1,6 @@ - /**************************************************/ - /* Module de tst "ERC" ( Electrical Rules Check ) */ - /**************************************************/ +/**************************************************/ +/* Module de tst "ERC" ( Electrical Rules Check ) */ +/**************************************************/ #include "fctsys.h" @@ -20,9 +20,9 @@ #include "dialog_erc.h" /* On teste - 1 - conflits entre pins connectees ( ex: 2 sorties connectees ) - 2 - les imperatifs minimaux ( 1 entree doit etre connectee a une sortie ) -*/ + * 1 - conflits entre pins connectees ( ex: 2 sorties connectees ) + * 2 - les imperatifs minimaux ( 1 entree doit etre connectee a une sortie ) + */ /* fonctions exportees */ @@ -30,778 +30,835 @@ /* fonctions importees */ /* fonctions locales */ -static bool WriteDiagnosticERC(const wxString & FullFileName); -static void Diagnose(WinEDA_DrawPanel * panel, wxDC * DC, - ObjetNetListStruct * NetItemRef, - ObjetNetListStruct * NetItemTst, int MinConnexion, int Diag); -static void TestOthersItems(WinEDA_DrawPanel * panel, - wxDC * DC, ObjetNetListStruct * NetItemRef, - ObjetNetListStruct * NetStart, - int * NetNbItems, int * MinConnexion ); -static void TestLabel(WinEDA_DrawPanel * panel, wxDC * DC, - ObjetNetListStruct * NetItemRef, - ObjetNetListStruct * StartNet); +static bool WriteDiagnosticERC( const wxString& FullFileName ); +static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, + ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* NetItemTst, int MinConnexion, int Diag ); +static void TestOthersItems( WinEDA_DrawPanel* panel, + wxDC* DC, ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* NetStart, + int* NetNbItems, int* MinConnexion ); +static void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC, + ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* StartNet ); /* Variable locales */ int WriteFichierERC = FALSE; /* Tableau des types de conflit : - PIN_INPUT, PIN_OUTPUT, PIN_BIDI, PIN_TRISTATE, PIN_PASSIVE, - PIN_UNSPECIFIED, PIN_POWER_IN, PIN_POWER_OUT, PIN_OPENCOLLECTOR, - PIN_OPENEMITTER, PIN_NC -*/ -#define OK 0 -#define WAR 1 // utilisé aussi dans eeredraw + * PIN_INPUT, PIN_OUTPUT, PIN_BIDI, PIN_TRISTATE, PIN_PASSIVE, + * PIN_UNSPECIFIED, PIN_POWER_IN, PIN_POWER_OUT, PIN_OPENCOLLECTOR, + * PIN_OPENEMITTER, PIN_NC + */ +#define OK 0 +#define WAR 1 // utilisé aussi dans eeredraw #define ERR 2 #define UNC 3 -static wxChar * CommentERC_H[] = +static const wxChar* CommentERC_H[] = { - wxT("Input Pin...."), - wxT("Output Pin..."), - wxT("BiDi Pin....."), - wxT("3 State Pin.."), - wxT("Passive Pin.."), - wxT("Unspec Pin..."), - wxT("Power IN Pin."), - wxT("PowerOUT Pin."), - wxT("Open Coll...."), - wxT("Open Emit...."), - wxT("No Conn......"), - NULL + wxT( "Input Pin...." ), + wxT( "Output Pin..." ), + wxT( "BiDi Pin....." ), + wxT( "3 State Pin.." ), + wxT( "Passive Pin.." ), + wxT( "Unspec Pin..." ), + wxT( "Power IN Pin." ), + wxT( "PowerOUT Pin." ), + wxT( "Open Coll...." ), + wxT( "Open Emit...." ), + wxT( "No Conn......" ), + NULL }; -static wxChar * CommentERC_V[] = +static const wxChar* CommentERC_V[] = { - wxT("Input Pin"), - wxT("Output Pin"), - wxT("BiDi Pin"), - wxT("3 State Pin"), - wxT("Passive Pin"), - wxT("Unspec Pin"), - wxT("Power IN Pin"), - wxT("PowerOUT Pin"), - wxT("Open Coll"), - wxT("Open Emit"), - wxT("No Conn"), - NULL + wxT( "Input Pin" ), + wxT( "Output Pin" ), + wxT( "BiDi Pin" ), + wxT( "3 State Pin" ), + wxT( "Passive Pin" ), + wxT( "Unspec Pin" ), + wxT( "Power IN Pin" ), + wxT( "PowerOUT Pin" ), + wxT( "Open Coll" ), + wxT( "Open Emit" ), + wxT( "No Conn" ), + NULL }; /* Look up table which gives the diag for a pair of connected pins - Can be modified by ERC options. - at start up: must be loaded by DefaultDiagErc -*/ + * Can be modified by ERC options. + * at start up: must be loaded by DefaultDiagErc + */ static int DiagErc[PIN_NMAX][PIN_NMAX]; -bool DiagErcTableInit; // go to TRUE after DiagErc init +bool DiagErcTableInit; // go to TRUE after DiagErc init /* Default Look up table which gives the diag for a pair of connected pins - Same as DiagErc, but cannot be modified - Used to init or reset DiagErc -*/ + * Same as DiagErc, but cannot be modified + * Used to init or reset DiagErc + */ static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] = { /* I, O, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ -/* I */ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, -/* O */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, ERR, ERR, WAR }, -/* Bi*/ { OK, OK, OK, OK, OK, WAR, OK, WAR, OK, WAR, WAR }, -/* 3S*/ { OK, WAR, OK, OK, OK, WAR, WAR, ERR, WAR, WAR, WAR }, -/*Pas*/ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, -/*UnS */{ WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR }, -/*PwrI*/{ OK, OK, OK, WAR, OK, WAR, OK, OK, OK, OK, ERR }, -/*PwrO*/{ OK, ERR, WAR, ERR, OK, WAR, OK, ERR, ERR, ERR, WAR }, -/* OC */{ OK, ERR, OK, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, -/* OE */{ OK, ERR, WAR, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, -/* NC */{ WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR } -} ; +/* I */ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, +/* O */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, ERR, ERR, WAR }, +/* Bi*/ { OK, OK, OK, OK, OK, WAR, OK, WAR, OK, WAR, WAR }, +/* 3S*/ { OK, WAR, OK, OK, OK, WAR, WAR, ERR, WAR, WAR, WAR }, +/*Pas*/ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, +/*UnS */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR }, +/*PwrI*/ { OK, OK, OK, WAR, OK, WAR, OK, OK, OK, OK, ERR }, +/*PwrO*/ { OK, ERR, WAR, ERR, OK, WAR, OK, ERR, ERR, ERR, WAR }, +/* OC */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, +/* OE */ { OK, ERR, WAR, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, +/* NC */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR } +}; /* Minimal connection table */ -#define DRV 3 /* Net driven by a signal (a pin output for instance) */ -#define NET_NC 2 /* Net "connected" to a "NoConnect symbol" */ -#define NOD 1 /* Net not driven ( Such as 2 or more connected inputs )*/ -#define NOC 0 /* Pin isolee, non connectee */ +#define DRV 3 /* Net driven by a signal (a pin output for instance) */ +#define NET_NC 2 /* Net "connected" to a "NoConnect symbol" */ +#define NOD 1 /* Net not driven ( Such as 2 or more connected inputs )*/ +#define NOC 0 /* Pin isolee, non connectee */ /* Look up table which gives the minimal drive for a pair of connected pins on a net - Initial state of a net is NOC (No Connection) - Can be updated to NET_NC, or NOD (Not Driven) or DRV (DRIven) - - Can be updated to NET_NC only if the previous state is NOC - - Nets are OK when their final state is NET_NC or DRV - Nets with the state NOD have no source signal -*/ + * Initial state of a net is NOC (No Connection) + * Can be updated to NET_NC, or NOD (Not Driven) or DRV (DRIven) + * + * Can be updated to NET_NC only if the previous state is NOC + * + * Nets are OK when their final state is NET_NC or DRV + * Nets with the state NOD have no source signal + */ static int MinimalReq[PIN_NMAX][PIN_NMAX] = - { /* In, Out, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ -/* In*/ { NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*Out*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, -/* Bi*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* 3S*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*Pas*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*UnS*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*PwrI*/{ NOD, DRV, NOD, NOD, NOD, NOD, NOD, DRV, NOD, NOD, NOC }, -/*PwrO*/{ DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, -/* OC*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* OE*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* NC*/ { NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC } -} ; - - +{ /* In, Out, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ +/* In*/ { NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*Out*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, +/* Bi*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* 3S*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*Pas*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*UnS*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*PwrI*/ { NOD, DRV, NOD, NOD, NOD, NOD, NOD, DRV, NOD, NOD, NOC }, +/*PwrO*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, +/* OC*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* OE*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* NC*/ { NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC } +}; /*************************************************************/ -void InstallErcFrame(WinEDA_SchematicFrame *parent, wxPoint & pos) +void InstallErcFrame( WinEDA_SchematicFrame* parent, wxPoint& pos ) /*************************************************************/ + /* Install function for the ERC dialog frame -*/ + */ { - WinEDA_ErcFrame * frame = new WinEDA_ErcFrame(parent); - frame->ShowModal(); frame->Destroy(); + WinEDA_ErcFrame* frame = new WinEDA_ErcFrame( parent ); + + frame->ShowModal(); frame->Destroy(); } /*********************************************/ void WinEDA_ErcFrame::ReBuildMatrixPanel() /*********************************************/ + /* Build or rebuild the panel showing the ERC matrix -*/ + */ { -int ii, jj, event_id, text_height; -wxPoint pos, BoxMatrixPosition; + int ii, jj, event_id, text_height; + wxPoint pos, BoxMatrixPosition; + #define BITMAP_SIZE 19 -int bitmap_size = BITMAP_SIZE; -wxStaticText * text; -int x, y; -wxSize BoxMatrixMinSize; + int bitmap_size = BITMAP_SIZE; + wxStaticText* text; + int x, y; + wxSize BoxMatrixMinSize; - if ( ! DiagErcTableInit ) - { - memcpy(DiagErc, DefaultDiagErc, sizeof (DefaultDiagErc)); - DiagErcTableInit = TRUE; - } + if( !DiagErcTableInit ) + { + memcpy( DiagErc, DefaultDiagErc, sizeof(DefaultDiagErc) ); + DiagErcTableInit = TRUE; + } - // Get the current text size : - text = new wxStaticText( m_PanelERCOptions,-1,wxT("W"), pos); // this is a dummy text - text_height = text->GetRect().GetHeight(); - bitmap_size = MAX(bitmap_size, text_height); - delete text; - // compute the Y pos interval: - BoxMatrixMinSize.y = (bitmap_size*(PIN_NMAX+1)) + 5; - GetSizer()->Fit(this); - GetSizer()->SetSizeHints(this); - pos = m_MatrixSizer->GetPosition(); - // Size computation is not made in constructor, in some wxWidgets version, - // and m_BoxSizerForERC_Opt position is always 0,0. and we can't use it - pos.x = MAX( pos.x, 5); - pos.y = MAX( pos.y, m_ResetOptButton->GetRect().GetHeight() + 30); + // Get the current text size : + text = new wxStaticText( m_PanelERCOptions, -1, wxT( "W" ), pos ); // this is a dummy text - BoxMatrixPosition = pos; - - pos.y += text_height; - - if ( m_Initialized == FALSE ) - { - for ( ii = 0; ii < PIN_NMAX; ii++ ) - { - y = pos.y + (ii * bitmap_size); - text = new wxStaticText( m_PanelERCOptions,-1,CommentERC_H[ii], wxPoint(5,y)); - x = text->GetRect().GetRight(); - pos.x = MAX(pos.x, x); - } - pos.x += 5; - } - else pos = m_ButtonList[0][0]->GetPosition(); + text_height = text->GetRect().GetHeight(); + bitmap_size = MAX( bitmap_size, text_height ); + delete text; - for ( ii = 0; ii < PIN_NMAX; ii++ ) - { - y = pos.y + (ii * bitmap_size); - for ( jj = 0; jj <= ii; jj++ ) - { - int diag = DiagErc[ii][jj]; - x = pos.x + (jj * bitmap_size); - if( (ii == jj) && ! m_Initialized ) - { - wxPoint txtpos; - txtpos.x = x + 4; txtpos.y = y - bitmap_size; - text = new wxStaticText( m_PanelERCOptions,-1,CommentERC_V[ii], txtpos); - BoxMatrixMinSize.x = MAX( BoxMatrixMinSize.x, text->GetRect().GetRight()); - } - event_id = ID_MATRIX_0 + ii + (jj * PIN_NMAX); - delete m_ButtonList[ii][jj]; - switch ( diag ) - { - case OK: - m_ButtonList[ii][jj] = new wxBitmapButton(m_PanelERCOptions, - event_id, - wxBitmap(green_xpm), - wxPoint(x,y) ); - break; + // compute the Y pos interval: + BoxMatrixMinSize.y = ( bitmap_size * (PIN_NMAX + 1) ) + 5; + GetSizer()->Fit( this ); + GetSizer()->SetSizeHints( this ); + pos = m_MatrixSizer->GetPosition(); - case WAR: - m_ButtonList[ii][jj] = new wxBitmapButton(m_PanelERCOptions, - event_id, - wxBitmap(warning_xpm), - wxPoint(x,y) ); - break; + // Size computation is not made in constructor, in some wxWidgets version, + // and m_BoxSizerForERC_Opt position is always 0,0. and we can't use it + pos.x = MAX( pos.x, 5 ); + pos.y = MAX( pos.y, m_ResetOptButton->GetRect().GetHeight() + 30 ); - case ERR: - m_ButtonList[ii][jj] = new wxBitmapButton(m_PanelERCOptions, - event_id, - wxBitmap(error_xpm), - wxPoint(x,y) ); - break; - } - } - } + BoxMatrixPosition = pos; - if ( !m_Initialized ) - { - BoxMatrixMinSize.x += 5; - m_MatrixSizer->SetMinSize(BoxMatrixMinSize); - BoxMatrixMinSize.y += BoxMatrixPosition.y; - m_PanelMatrixSizer->SetMinSize(BoxMatrixMinSize); - } - m_Initialized = TRUE; + pos.y += text_height; + + if( m_Initialized == FALSE ) + { + for( ii = 0; ii < PIN_NMAX; ii++ ) + { + y = pos.y + (ii * bitmap_size); + text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_H[ii], wxPoint( 5, y ) ); + + x = text->GetRect().GetRight(); + pos.x = MAX( pos.x, x ); + } + + pos.x += 5; + } + else + pos = m_ButtonList[0][0]->GetPosition(); + + for( ii = 0; ii < PIN_NMAX; ii++ ) + { + y = pos.y + (ii * bitmap_size); + for( jj = 0; jj <= ii; jj++ ) + { + int diag = DiagErc[ii][jj]; + x = pos.x + (jj * bitmap_size); + if( (ii == jj) && !m_Initialized ) + { + wxPoint txtpos; + txtpos.x = x + 4; txtpos.y = y - bitmap_size; + text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_V[ii], txtpos ); + + BoxMatrixMinSize.x = MAX( BoxMatrixMinSize.x, text->GetRect().GetRight() ); + } + event_id = ID_MATRIX_0 + ii + (jj * PIN_NMAX); + delete m_ButtonList[ii][jj]; + + switch( diag ) + { + case OK: + m_ButtonList[ii][jj] = new wxBitmapButton( m_PanelERCOptions, + event_id, + wxBitmap (green_xpm), + wxPoint (x, y) ); + + break; + + case WAR: + m_ButtonList[ii][jj] = new wxBitmapButton( m_PanelERCOptions, + event_id, + wxBitmap (warning_xpm), + wxPoint (x, y) ); + + break; + + case ERR: + m_ButtonList[ii][jj] = new wxBitmapButton( m_PanelERCOptions, + event_id, + wxBitmap (error_xpm), + wxPoint (x, y) ); + + break; + } + } + } + + if( !m_Initialized ) + { + BoxMatrixMinSize.x += 5; + m_MatrixSizer->SetMinSize( BoxMatrixMinSize ); + BoxMatrixMinSize.y += BoxMatrixPosition.y; + m_PanelMatrixSizer->SetMinSize( BoxMatrixMinSize ); + } + m_Initialized = TRUE; } /**************************************************/ -void WinEDA_ErcFrame::TestErc(wxCommandEvent& event) +void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) /**************************************************/ { -ObjetNetListStruct * NetItemRef, * OldItem, * StartNet, * Lim; -int NetNbItems, MinConn; + ObjetNetListStruct* NetItemRef; + ObjetNetListStruct* OldItem; + ObjetNetListStruct* StartNet; + ObjetNetListStruct* Lim; + + int NetNbItems, MinConn; - if ( ! DiagErcTableInit ) - { - memcpy(DiagErc, DefaultDiagErc, sizeof (DefaultDiagErc)); - DiagErcTableInit = TRUE; - } + if( !DiagErcTableInit ) + { + memcpy( DiagErc, DefaultDiagErc, sizeof(DefaultDiagErc) ); + DiagErcTableInit = TRUE; + } - WriteFichierERC = m_WriteResultOpt->GetValue(); + WriteFichierERC = m_WriteResultOpt->GetValue(); - ReAnnotatePowerSymbolsOnly(); - if( CheckAnnotate(m_Parent, 0) ) - { - DisplayError(this, _("Annotation Required!") ); - return; - } + ReAnnotatePowerSymbolsOnly(); + if( CheckAnnotate( m_Parent, 0 ) ) + { + DisplayError( this, _( "Annotation Required!" ) ); + return; + } - /* Effacement des anciens marqueurs DRC */ - DelERCMarkers(event); + /* Effacement des anciens marqueurs DRC */ + DelERCMarkers( event ); -wxClientDC dc(m_Parent->DrawPanel); + wxClientDC dc( m_Parent->DrawPanel ); - m_Parent->DrawPanel->PrepareGraphicContext(&dc); + m_Parent->DrawPanel->PrepareGraphicContext( &dc ); - g_EESchemaVar.NbErrorErc = 0; - g_EESchemaVar.NbWarningErc = 0; + g_EESchemaVar.NbErrorErc = 0; + g_EESchemaVar.NbWarningErc = 0; - /* Cleanup the entire hierarchy */ - EDA_ScreenList ScreenList(NULL); - for ( SCH_SCREEN * Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) - { - bool ModifyWires; - ModifyWires = Screen->SchematicCleanUp(NULL); - /* if wire list has changed, delete Udo Redo list to avoid - pointers on deleted data problems */ - if ( ModifyWires ) - Screen->ClearUndoRedoList(); - } + /* Cleanup the entire hierarchy */ + EDA_ScreenList ScreenList( NULL ); - m_Parent->BuildNetListBase(); + for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) + { + bool ModifyWires; + ModifyWires = Screen->SchematicCleanUp( NULL ); - /* Analyse de la table des connexions : */ - Lim = g_TabObjNet + g_NbrObjNet; + /* if wire list has changed, delete Udo Redo list to avoid + * pointers on deleted data problems */ + if( ModifyWires ) + Screen->ClearUndoRedoList(); + } - /* Reset du flag m_FlagOfConnection, utilise par la suite */ - for (NetItemRef = g_TabObjNet; NetItemRef < Lim; NetItemRef ++ ) - NetItemRef->m_FlagOfConnection = (IsConnectType) 0; + m_Parent->BuildNetListBase(); - NetNbItems = 0; MinConn = NOC; - StartNet = OldItem = NetItemRef = g_TabObjNet; - for ( ; NetItemRef < Lim; NetItemRef ++ ) - { - /* Tst changement de net */ - if( OldItem->m_NetCode != NetItemRef->m_NetCode) - { - MinConn = NOC; NetNbItems = 0; StartNet = NetItemRef; - } + /* Analyse de la table des connexions : */ + Lim = g_TabObjNet + g_NbrObjNet; - switch ( NetItemRef->m_Type ) - { - case NET_SEGMENT: - case NET_BUS: - case NET_JONCTION: - case NET_LABEL: - case NET_BUSLABELMEMBER: - case NET_PINLABEL: - break; + /* Reset du flag m_FlagOfConnection, utilise par la suite */ + for( NetItemRef = g_TabObjNet; NetItemRef < Lim; NetItemRef++ ) + NetItemRef->m_FlagOfConnection = (IsConnectType) 0; - case NET_GLOBLABEL: - case NET_GLOBBUSLABELMEMBER: - case NET_SHEETLABEL: - case NET_SHEETBUSLABELMEMBER: - TestLabel(m_Parent->DrawPanel, &dc, NetItemRef, StartNet); - break; + NetNbItems = 0; + MinConn = NOC; + + StartNet = OldItem = NetItemRef = g_TabObjNet; + + for( ; NetItemRef < Lim; NetItemRef++ ) + { + /* Tst changement de net */ + if( OldItem->m_NetCode != NetItemRef->m_NetCode ) + { + MinConn = NOC; + NetNbItems = 0; + StartNet = NetItemRef; + } - case NET_NOCONNECT: - MinConn = NET_NC; - if( NetNbItems != 0 ) - Diagnose(m_Parent->DrawPanel, &dc, NetItemRef, NULL, MinConn, UNC); - break; + switch( NetItemRef->m_Type ) + { + case NET_SEGMENT: + case NET_BUS: + case NET_JONCTION: + case NET_LABEL: + case NET_BUSLABELMEMBER: + case NET_PINLABEL: + break; - case NET_PIN: - TestOthersItems(m_Parent->DrawPanel, &dc, - NetItemRef, StartNet, &NetNbItems , &MinConn); - break; - } - OldItem = NetItemRef; - } + case NET_GLOBLABEL: + case NET_GLOBBUSLABELMEMBER: + case NET_SHEETLABEL: + case NET_SHEETBUSLABELMEMBER: + TestLabel( m_Parent->DrawPanel, &dc, NetItemRef, StartNet ); + break; - FreeTabNetList(g_TabObjNet, g_NbrObjNet ); + case NET_NOCONNECT: + MinConn = NET_NC; + if( NetNbItems != 0 ) + Diagnose( m_Parent->DrawPanel, &dc, NetItemRef, NULL, MinConn, UNC ); + break; - wxString num; - num.Printf(wxT("%d"), g_EESchemaVar.NbErrorErc); - m_TotalErrCount->SetLabel(num); + case NET_PIN: + TestOthersItems( m_Parent->DrawPanel, &dc, + NetItemRef, StartNet, &NetNbItems, &MinConn ); + break; + } - num.Printf(wxT("%d"), g_EESchemaVar.NbErrorErc-g_EESchemaVar.NbWarningErc); - m_LastErrCount->SetLabel(num); + OldItem = NetItemRef; + } - num.Printf(wxT("%d"), g_EESchemaVar.NbWarningErc); - m_LastWarningCount->SetLabel(num); + FreeTabNetList( g_TabObjNet, g_NbrObjNet ); - /* Generation ouverture fichier diag */ - if( WriteFichierERC == TRUE ) - { - wxString ErcFullFileName; - ErcFullFileName = ScreenSch->m_FileName; - ChangeFileNameExt(ErcFullFileName, wxT(".erc")); - ErcFullFileName = EDA_FileSelector(_("ERC file:"), - wxEmptyString, /* Chemin par defaut */ - ErcFullFileName, /* nom fichier par defaut */ - wxT(".erc"), /* extension par defaut */ - wxT("*.erc"), /* Masque d'affichage */ - this, - wxFD_SAVE, - TRUE - ); - if ( ErcFullFileName.IsEmpty()) return; + wxString num; + num.Printf( wxT( "%d" ), g_EESchemaVar.NbErrorErc ); + m_TotalErrCount->SetLabel( num ); - if ( WriteDiagnosticERC(ErcFullFileName) ) - { - Close(TRUE); - wxString editorname = GetEditorName(); - AddDelimiterString(ErcFullFileName); - ExecuteFile(this, editorname, ErcFullFileName); - } - } + num.Printf( wxT( "%d" ), g_EESchemaVar.NbErrorErc - g_EESchemaVar.NbWarningErc ); + m_LastErrCount->SetLabel( num ); + + num.Printf( wxT( "%d" ), g_EESchemaVar.NbWarningErc ); + m_LastWarningCount->SetLabel( num ); + + /* Generation ouverture fichier diag */ + if( WriteFichierERC == TRUE ) + { + wxString ErcFullFileName; + ErcFullFileName = ScreenSch->m_FileName; + ChangeFileNameExt( ErcFullFileName, wxT( ".erc" ) ); + ErcFullFileName = EDA_FileSelector( _( "ERC file:" ), + wxEmptyString, /* Chemin par defaut */ + ErcFullFileName, /* nom fichier par defaut */ + wxT( ".erc" ), /* extension par defaut */ + wxT( "*.erc" ), /* Masque d'affichage */ + this, + wxFD_SAVE, + TRUE + ); + if( ErcFullFileName.IsEmpty() ) + return; + + if( WriteDiagnosticERC( ErcFullFileName ) ) + { + Close( TRUE ); + wxString editorname = GetEditorName(); + AddDelimiterString( ErcFullFileName ); + ExecuteFile( this, editorname, ErcFullFileName ); + } + } } /***********************************************************/ -void WinEDA_ErcFrame::DelERCMarkers(wxCommandEvent& event) +void WinEDA_ErcFrame::DelERCMarkers( wxCommandEvent& event ) /***********************************************************/ + /* Delete the old ERC markers, over the whole hierarchy -*/ + */ { -EDA_BaseStruct * DrawStruct; -DrawMarkerStruct * Marker; -wxClientDC dc(m_Parent->DrawPanel); + EDA_BaseStruct* DrawStruct; + DrawMarkerStruct* Marker; - m_Parent->DrawPanel->PrepareGraphicContext(&dc); + wxClientDC dc( m_Parent->DrawPanel ); - // Delete markers for the current screen - DrawStruct = m_Parent->GetScreen()->EEDrawList; - for ( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) - { - if(DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) continue; - /* Marqueur trouve */ - Marker = (DrawMarkerStruct * ) DrawStruct; - if( Marker->m_Type == MARQ_ERC ) - RedrawOneStruct(m_Parent->DrawPanel, &dc, Marker, g_XorMode); - } - /* Suppression en memoire des marqueurs ERC */ - DeleteAllMarkers(MARQ_ERC); + m_Parent->DrawPanel->PrepareGraphicContext( &dc ); + + // Delete markers for the current screen + DrawStruct = m_Parent->GetScreen()->EEDrawList; + for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) + { + if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) + continue; + /* Marqueur trouve */ + Marker = (DrawMarkerStruct*) DrawStruct; + if( Marker->m_Type == MARQ_ERC ) + RedrawOneStruct( m_Parent->DrawPanel, &dc, Marker, g_XorMode ); + } + + /* Suppression en memoire des marqueurs ERC */ + DeleteAllMarkers( MARQ_ERC ); } /**************************************************************/ -void WinEDA_ErcFrame::ResetDefaultERCDiag(wxCommandEvent& event) +void WinEDA_ErcFrame::ResetDefaultERCDiag( wxCommandEvent& event ) /**************************************************************/ + /* Remet aux valeurs par defaut la matrice de diagnostic -*/ + */ { - memcpy(DiagErc,DefaultDiagErc, sizeof(DiagErc) ); - ReBuildMatrixPanel(); + memcpy( DiagErc, DefaultDiagErc, sizeof(DiagErc) ); + ReBuildMatrixPanel(); } + /************************************************************/ -void WinEDA_ErcFrame::ChangeErrorLevel(wxCommandEvent& event) +void WinEDA_ErcFrame::ChangeErrorLevel( wxCommandEvent& event ) /************************************************************/ + /* Change the error level for the pressed button, on the matrix table -*/ + */ { -int id, level, ii, x, y; -wxBitmapButton * Butt; -char ** new_bitmap_xpm = NULL; -wxPoint pos; + int id, level, ii, x, y; + wxBitmapButton* Butt; + char** new_bitmap_xpm = NULL; + wxPoint pos; - id = event.GetId(); - ii = id - ID_MATRIX_0; - Butt = (wxBitmapButton*) event.GetEventObject(); - pos = Butt->GetPosition(); + id = event.GetId(); + ii = id - ID_MATRIX_0; + Butt = (wxBitmapButton*) event.GetEventObject(); + pos = Butt->GetPosition(); - x = ii /PIN_NMAX; y = ii % PIN_NMAX; + x = ii / PIN_NMAX; y = ii % PIN_NMAX; - level = DiagErc[y][x]; - switch (level ) - { - case OK: - level = WAR; - new_bitmap_xpm = warning_xpm; - break; + level = DiagErc[y][x]; - case WAR : - level = ERR; - new_bitmap_xpm = error_xpm; - break; + switch( level ) + { + case OK: + level = WAR; + new_bitmap_xpm = warning_xpm; + break; - case ERR: - level = OK; - new_bitmap_xpm = green_xpm; - break; + case WAR: + level = ERR; + new_bitmap_xpm = error_xpm; + break; - } + case ERR: + level = OK; + new_bitmap_xpm = green_xpm; + break; + } - if ( new_bitmap_xpm ) - { - delete Butt; - Butt = new wxBitmapButton(m_PanelERCOptions, id, - wxBitmap(new_bitmap_xpm), pos); - m_ButtonList[y][x] = Butt; - DiagErc[y][x] = DiagErc[x][y] = level; - } + if( new_bitmap_xpm ) + { + delete Butt; + Butt = new wxBitmapButton( m_PanelERCOptions, id, + wxBitmap (new_bitmap_xpm), pos ); + + m_ButtonList[y][x] = Butt; + DiagErc[y][x] = DiagErc[x][y] = level; + } } /********************************************************/ -static void Diagnose(WinEDA_DrawPanel * panel, wxDC * DC, - ObjetNetListStruct * NetItemRef, - ObjetNetListStruct * NetItemTst, - int MinConn, int Diag) +static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, + ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* NetItemTst, + int MinConn, int Diag ) /********************************************************/ + /* Routine de creation du marqueur ERC correspondant au conflit electrique - entre NetItemRef et NetItemTst - si MinConn < 0: Traitement des erreurs sur labels -*/ + * entre NetItemRef et NetItemTst + * si MinConn < 0: Traitement des erreurs sur labels + */ { -DrawMarkerStruct * Marker = NULL; -wxString DiagLevel; -SCH_SCREEN * screen; -int ii, jj; + DrawMarkerStruct* Marker = NULL; + wxString DiagLevel; + SCH_SCREEN* screen; + int ii, jj; - if( Diag == OK ) return; + if( Diag == OK ) + return; - /* Creation du nouveau marqueur type Erreur ERC */ - Marker = new DrawMarkerStruct(NetItemRef->m_Start, wxEmptyString); - Marker->m_Type = MARQ_ERC; - Marker->m_MarkFlags = WAR; - screen = NetItemRef->m_Screen; - Marker->Pnext = screen->EEDrawList; - screen->EEDrawList = Marker; - g_EESchemaVar.NbErrorErc++; - g_EESchemaVar.NbWarningErc++; + /* Creation du nouveau marqueur type Erreur ERC */ + Marker = new DrawMarkerStruct( NetItemRef->m_Start, wxEmptyString ); - if( MinConn < 0 ) // Traitement des erreurs sur labels - { - if( (NetItemRef->m_Type == NET_GLOBLABEL) || - (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) - { - Marker->m_Comment.Printf( _("Warning GLabel %s not connected to SheetLabel"), - NetItemRef->m_Label->GetData()); - } - else Marker->m_Comment.Printf( _("Warning SheetLabel %s not connected to GLabel"), - NetItemRef->m_Label->GetData()); + Marker->m_Type = MARQ_ERC; + Marker->m_MarkFlags = WAR; + screen = NetItemRef->m_Screen; + Marker->Pnext = screen->EEDrawList; + screen->EEDrawList = Marker; + g_EESchemaVar.NbErrorErc++; + g_EESchemaVar.NbWarningErc++; - if( screen == panel->GetScreen() ) RedrawOneStruct(panel, DC, Marker, GR_COPY); - return; - } + if( MinConn < 0 ) // Traitement des erreurs sur labels + { + if( (NetItemRef->m_Type == NET_GLOBLABEL) + || (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) + { + Marker->m_Comment.Printf( _( "Warning GLabel %s not connected to SheetLabel" ), + NetItemRef->m_Label->GetData() ); + } + else + Marker->m_Comment.Printf( _( "Warning SheetLabel %s not connected to GLabel" ), + NetItemRef->m_Label->GetData() ); - ii = NetItemRef->m_ElectricalType; + if( screen == panel->GetScreen() ) + RedrawOneStruct( panel, DC, Marker, GR_COPY ); + return; + } - if( NetItemTst == NULL ) - { - if( MinConn == NOC ) /* 1 seul element dans le net */ - { - Marker->m_Comment.Printf( _("Warning Pin %s Unconnected"), MsgPinElectricType[ii]); - if( screen == panel->GetScreen() ) - RedrawOneStruct(panel, DC, Marker, GR_COPY); - return; - } + ii = NetItemRef->m_ElectricalType; - if( MinConn == NOD ) /* pas de pilotage du net */ - { - Marker->m_Comment.Printf( - _("Warning Pin %s not driven (Net %d)"), - MsgPinElectricType[ii], NetItemRef->m_NetCode); - if( screen == panel->GetScreen() ) - RedrawOneStruct(panel, DC, Marker, GR_COPY); - return; - } + if( NetItemTst == NULL ) + { + if( MinConn == NOC ) /* 1 seul element dans le net */ + { + Marker->m_Comment.Printf( _( "Warning Pin %s Unconnected" ), MsgPinElectricType[ii] ); + if( screen == panel->GetScreen() ) + RedrawOneStruct( panel, DC, Marker, GR_COPY ); + return; + } - if( Diag == UNC ) - { - Marker->m_Comment.Printf( - _("Warning More than 1 Pin connected to UnConnect symbol") ); - if( screen == panel->GetScreen() ) - RedrawOneStruct(panel, DC, Marker, GR_COPY); - return; - } + if( MinConn == NOD ) /* pas de pilotage du net */ + { + Marker->m_Comment.Printf( + _( "Warning Pin %s not driven (Net %d)" ), + MsgPinElectricType[ii], NetItemRef->m_NetCode ); + if( screen == panel->GetScreen() ) + RedrawOneStruct( panel, DC, Marker, GR_COPY ); + return; + } - } + if( Diag == UNC ) + { + Marker->m_Comment.Printf( + _( "Warning More than 1 Pin connected to UnConnect symbol" ) ); + if( screen == panel->GetScreen() ) + RedrawOneStruct( panel, DC, Marker, GR_COPY ); + return; + } + } - if( NetItemTst ) /* Erreur entre 2 pins */ - { - jj = NetItemTst->m_ElectricalType; - DiagLevel = _("Warning"); - if(Diag == ERR) - { - DiagLevel = _("Error"); - Marker->m_MarkFlags = ERR; - g_EESchemaVar.NbWarningErc--; - } + if( NetItemTst ) /* Erreur entre 2 pins */ + { + jj = NetItemTst->m_ElectricalType; + DiagLevel = _( "Warning" ); + if( Diag == ERR ) + { + DiagLevel = _( "Error" ); + Marker->m_MarkFlags = ERR; + g_EESchemaVar.NbWarningErc--; + } + Marker->m_Comment.Printf( _( + "%s: Pin %s connected to Pin %s (net %d)" ), + DiagLevel.GetData(), + MsgPinElectricType[ii], + MsgPinElectricType[jj], NetItemRef->m_NetCode ); - Marker->m_Comment.Printf( _("%s: Pin %s connected to Pin %s (net %d)"), DiagLevel.GetData(), - MsgPinElectricType[ii], - MsgPinElectricType[jj], NetItemRef->m_NetCode); - - if( screen == panel->GetScreen() ) - RedrawOneStruct(panel, DC, Marker, GR_COPY); - } + if( screen == panel->GetScreen() ) + RedrawOneStruct( panel, DC, Marker, GR_COPY ); + } } /********************************************************************/ -static void TestOthersItems(WinEDA_DrawPanel * panel, wxDC * DC, - ObjetNetListStruct * NetItemRef, - ObjetNetListStruct * netstart, - int * NetNbItems, int * MinConnexion) +static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC, + ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* netstart, + int* NetNbItems, int* MinConnexion ) /********************************************************************/ + /* Routine testant les conflits electriques entre - NetItemRef - et les autres items du meme net -*/ + * NetItemRef + * et les autres items du meme net + */ { -ObjetNetListStruct * NetItemTst, * Lim; -int ref_elect_type, jj, erc = OK, local_minconn; + ObjetNetListStruct* NetItemTst; + ObjetNetListStruct* Lim; + + int ref_elect_type, jj, erc = OK, local_minconn; - /* Analyse de la table des connexions : */ - Lim = g_TabObjNet + g_NbrObjNet; // pointe la fin de la liste - ref_elect_type = NetItemRef->m_ElectricalType; + /* Analyse de la table des connexions : */ + Lim = g_TabObjNet + g_NbrObjNet; // pointe la fin de la liste + + ref_elect_type = NetItemRef->m_ElectricalType; - NetItemTst = netstart; - local_minconn = NOC; + NetItemTst = netstart; + local_minconn = NOC; - /* Examen de la liste des Pins connectees a NetItemRef */ - for ( ; ; NetItemTst ++ ) - { - if ( NetItemRef == NetItemTst ) continue; + /* Examen de la liste des Pins connectees a NetItemRef */ + for( ; ; NetItemTst++ ) + { + if( NetItemRef == NetItemTst ) + continue; - /* Est - on toujours dans le meme net ? */ - if( (NetItemTst >= Lim) || // fin de liste (donc fin de net) - (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) // fin de net - { /* Fin de netcode trouve: Tst connexion minimum */ - if( (*MinConnexion < NET_NC ) && - (local_minconn < NET_NC ) ) /* pin non connectée ou non pilotee */ - { - Diagnose(panel, DC, NetItemRef, NULL, local_minconn, WAR); - * MinConnexion = DRV; // inhibition autres messages de ce type pour ce net - } - return; - } + /* Est - on toujours dans le meme net ? */ + if( (NetItemTst >= Lim) // fin de liste (donc fin de net) + || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) // fin de net + { /* Fin de netcode trouve: Tst connexion minimum */ + if( (*MinConnexion < NET_NC ) + && (local_minconn < NET_NC ) ) /* pin non connectée ou non pilotee */ + { + Diagnose( panel, DC, NetItemRef, NULL, local_minconn, WAR ); + *MinConnexion = DRV; // inhibition autres messages de ce type pour ce net + } + return; + } - switch ( NetItemTst->m_Type ) - { - case NET_SEGMENT: - case NET_BUS: - case NET_JONCTION: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_BUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_SHEETLABEL: - case NET_PINLABEL: - break; + switch( NetItemTst->m_Type ) + { + case NET_SEGMENT: + case NET_BUS: + case NET_JONCTION: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_BUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_SHEETLABEL: + case NET_PINLABEL: + break; - case NET_NOCONNECT: - local_minconn = MAX( NET_NC, local_minconn); - break; + case NET_NOCONNECT: + local_minconn = MAX( NET_NC, local_minconn ); + break; - case NET_PIN: - jj = NetItemTst->m_ElectricalType; - local_minconn = MAX( MinimalReq[ref_elect_type][jj], local_minconn ); + case NET_PIN: + jj = NetItemTst->m_ElectricalType; + local_minconn = MAX( MinimalReq[ref_elect_type][jj], local_minconn ); - if ( NetItemTst <= NetItemRef ) break; - *NetNbItems += 1; - if( erc == OK ) // 1 marqueur par pin maxi - { - erc = DiagErc[ref_elect_type][jj]; - if (erc != OK ) - { - if( NetItemTst->m_FlagOfConnection == 0 ) - { - Diagnose(panel, DC, NetItemRef, NetItemTst, 0, erc); - NetItemTst->m_FlagOfConnection = (IsConnectType) 1; - } - } - } - break; - } - } + if( NetItemTst <= NetItemRef ) + break; + + *NetNbItems += 1; + if( erc == OK ) // 1 marqueur par pin maxi + { + erc = DiagErc[ref_elect_type][jj]; + if( erc != OK ) + { + if( NetItemTst->m_FlagOfConnection == 0 ) + { + Diagnose( panel, DC, NetItemRef, NetItemTst, 0, erc ); + NetItemTst->m_FlagOfConnection = (IsConnectType) 1; + } + } + } + break; + } + } } /********************************************************/ -static bool WriteDiagnosticERC(const wxString & FullFileName) +static bool WriteDiagnosticERC( const wxString& FullFileName ) /*********************************************************/ + /* Create the Diagnostic file (.erc file) -*/ + */ { -EDA_BaseStruct * DrawStruct; -DrawMarkerStruct * Marker; -char Line[256]; -static FILE * OutErc; -DrawSheetStruct * Sheet; -wxString msg; + EDA_BaseStruct* DrawStruct; + DrawMarkerStruct* Marker; + char Line[256]; + static FILE* OutErc; + DrawSheetStruct* Sheet; + wxString msg; - if( (OutErc = wxFopen( FullFileName, wxT("wt"))) == NULL ) return FALSE; + if( ( OutErc = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL ) + return FALSE; - DateAndTime(Line); - msg = _("ERC control"); - fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8(msg), Line); + DateAndTime( Line ); + msg = _( "ERC control" ); + + fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8( msg ), Line ); - EDA_ScreenList ScreenList(NULL); - for ( SCH_SCREEN * Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) - { - Sheet = (DrawSheetStruct*) Screen; - msg.Printf( _("\n***** Sheet %d (%s)\n"), - Sheet->m_SheetNumber, - Screen == ScreenSch ? _("Root") : Sheet->m_SheetName.GetData()); - fprintf( OutErc, "%s", CONV_TO_UTF8(msg)); + EDA_ScreenList ScreenList( NULL ); - DrawStruct = Screen->EEDrawList; - for ( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext) - { - if(DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) - continue; + for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) + { + Sheet = (DrawSheetStruct*) Screen; + + msg.Printf( _( "\n***** Sheet %d (%s)\n" ), + Sheet->m_SheetNumber, + Screen == ScreenSch ? _( "Root" ) : Sheet->m_SheetName.GetData() ); + + fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); - /* Marqueur trouve */ - Marker = (DrawMarkerStruct * ) DrawStruct; - if( Marker->m_Type != MARQ_ERC ) continue; - /* Write diag marqueur */ - msg.Printf( _("ERC: %s (X= %2.3f inches, Y= %2.3f inches\n"), - Marker->GetComment().GetData(), - (float)Marker->m_Pos.x / 1000, - (float)Marker->m_Pos.y / 1000); - fprintf( OutErc, "%s", CONV_TO_UTF8(msg)); - } - } - msg.Printf( _("\n >> Errors ERC: %d\n"), g_EESchemaVar.NbErrorErc); - fprintf( OutErc, "%s", CONV_TO_UTF8(msg)); - fclose ( OutErc ); + DrawStruct = Screen->EEDrawList; + for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) + { + if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) + continue; - return TRUE; + /* Marqueur trouve */ + Marker = (DrawMarkerStruct*) DrawStruct; + if( Marker->m_Type != MARQ_ERC ) + continue; + + /* Write diag marqueur */ + msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ), + Marker->GetComment().GetData(), + (float) Marker->m_Pos.x / 1000, + (float) Marker->m_Pos.y / 1000 ); + + fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); + } + } + + msg.Printf( _( "\n >> Errors ERC: %d\n" ), g_EESchemaVar.NbErrorErc ); + fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); + fclose( OutErc ); + + return TRUE; } /***********************************************************************/ -void TestLabel(WinEDA_DrawPanel * panel, wxDC * DC, - ObjetNetListStruct * NetItemRef, ObjetNetListStruct * StartNet) +void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC, + ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet ) /***********************************************************************/ + /* Routine controlant qu'un sheetLabel est bien connecte a un Glabel de la -sous-feuille correspondante -*/ + * sous-feuille correspondante + */ { -ObjetNetListStruct * NetItemTst, * Lim; -int erc = 1; + ObjetNetListStruct* NetItemTst, * Lim; + int erc = 1; - /* Analyse de la table des connexions : */ - Lim = g_TabObjNet + g_NbrObjNet; + /* Analyse de la table des connexions : */ + Lim = g_TabObjNet + g_NbrObjNet; - NetItemTst = StartNet; + NetItemTst = StartNet; - /* Examen de la liste des Labels connectees a NetItemRef */ - for ( ; ; NetItemTst ++ ) - { - if( NetItemTst == NetItemRef ) continue; + /* Examen de la liste des Labels connectees a NetItemRef */ + for( ; ; NetItemTst++ ) + { + if( NetItemTst == NetItemRef ) + continue; - /* Est - on toujours dans le meme net ? */ - if( ( NetItemTst == Lim ) || - ( NetItemRef->m_NetCode != NetItemTst->m_NetCode ) ) - { /* Fin de netcode trouve */ - if( erc ) - { /* GLabel ou SheetLabel orphelin */ - Diagnose(panel, DC, NetItemRef, NULL, -1, WAR); - } - return; - } + /* Est - on toujours dans le meme net ? */ + if( ( NetItemTst == Lim ) + || ( NetItemRef->m_NetCode != NetItemTst->m_NetCode ) ) + { + /* Fin de netcode trouve */ + if( erc ) + { + /* GLabel ou SheetLabel orphelin */ + Diagnose( panel, DC, NetItemRef, NULL, -1, WAR ); + } + return; + } - if( (NetItemRef->m_Type == NET_GLOBLABEL) || - (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) - { - switch ( NetItemTst->m_Type ) - { - case NET_SEGMENT: - case NET_BUS: - case NET_JONCTION: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_BUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - case NET_PINLABEL: - case NET_NOCONNECT: - case NET_PIN: - break; + if( (NetItemRef->m_Type == NET_GLOBLABEL) + || (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) + { + switch( NetItemTst->m_Type ) + { + case NET_SEGMENT: + case NET_BUS: + case NET_JONCTION: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_BUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + case NET_PINLABEL: + case NET_NOCONNECT: + case NET_PIN: + break; - case NET_SHEETBUSLABELMEMBER: - case NET_SHEETLABEL: - /* Tst si le GLabel est bien dans la bonne sousfeuille */ - if( NetItemRef->m_SheetNumber == NetItemTst->m_NumInclude ) - { - erc = 0; - } - break; - } - } + case NET_SHEETBUSLABELMEMBER: + case NET_SHEETLABEL: + /* Tst si le GLabel est bien dans la bonne sousfeuille */ + if( NetItemRef->m_SheetNumber == NetItemTst->m_NumInclude ) + { + erc = 0; + } + break; + } + } + else + { + switch( NetItemTst->m_Type ) + { + case NET_SEGMENT: + case NET_BUS: + case NET_JONCTION: + case NET_LABEL: + case NET_BUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_SHEETLABEL: + case NET_PINLABEL: + case NET_NOCONNECT: + case NET_PIN: + break; - else - { - switch ( NetItemTst->m_Type ) - { - case NET_SEGMENT: - case NET_BUS: - case NET_JONCTION: - case NET_LABEL: - case NET_BUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_SHEETLABEL: - case NET_PINLABEL: - case NET_NOCONNECT: - case NET_PIN: - break; - - case NET_GLOBLABEL: - case NET_GLOBBUSLABELMEMBER: - /* Tst si le GLabel est bien dans la bonne sous-feuille */ - if( NetItemTst->m_SheetNumber == NetItemRef->m_NumInclude ) - { - erc = 0; - } - break; - } - } - } + case NET_GLOBLABEL: + case NET_GLOBBUSLABELMEMBER: + /* Tst si le GLabel est bien dans la bonne sous-feuille */ + if( NetItemTst->m_SheetNumber == NetItemRef->m_NumInclude ) + { + erc = 0; + } + break; + } + } + } } - - diff --git a/eeschema/libedpart.cpp b/eeschema/libedpart.cpp index 3186ac1171..c4e7ab7006 100644 --- a/eeschema/libedpart.cpp +++ b/eeschema/libedpart.cpp @@ -24,1105 +24,1214 @@ extern int CurrentUnit; /* Classe de la frame des propriétés d'un composant en librairie */ enum id_libedit { - ID_LIBEDIT_NOTEBOOK = 3200, - ID_PANEL_BASIC, - ID_PANEL_ALIAS, - ID_PANEL_REFERENCE, - ID_PANEL_VALUE, - ID_PANEL_FOOTPRINT, - ID_PANEL_SUBSCHEMATIC, - ID_PANEL_FIELD1, - ID_PANEL_FIELD2, - ID_PANEL_FIELD3, - ID_PANEL_FIELD4, - ID_PANEL_FIELD5, - ID_PANEL_FIELD6, - ID_PANEL_FIELD7, - ID_PANEL_FIELD8, - ID_CLOSE_PART_PROPERTIES, - ID_ACCEPT_PART_PROPERTIES, - ID_COPY_DOC_TO_ALIAS, - ID_BROWSE_DOC_FILES, - ID_ADD_ALIAS, - ID_DELETE_ONE_ALIAS, - ID_DELETE_ALL_ALIAS + ID_LIBEDIT_NOTEBOOK = 3200, + ID_PANEL_BASIC, + ID_PANEL_ALIAS, + ID_PANEL_REFERENCE, + ID_PANEL_VALUE, + ID_PANEL_FOOTPRINT, + ID_PANEL_SUBSCHEMATIC, + ID_PANEL_FIELD1, + ID_PANEL_FIELD2, + ID_PANEL_FIELD3, + ID_PANEL_FIELD4, + ID_PANEL_FIELD5, + ID_PANEL_FIELD6, + ID_PANEL_FIELD7, + ID_PANEL_FIELD8, + ID_CLOSE_PART_PROPERTIES, + ID_ACCEPT_PART_PROPERTIES, + ID_COPY_DOC_TO_ALIAS, + ID_BROWSE_DOC_FILES, + ID_ADD_ALIAS, + ID_DELETE_ONE_ALIAS, + ID_DELETE_ALL_ALIAS }; /************************************************/ -class WinEDA_PartPropertiesFrame: public wxDialog +class WinEDA_PartPropertiesFrame : public wxDialog /************************************************/ + /* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés -d'un composant le librairie. - On peut éditer: - Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) - Documentation et mots clefs - Nombre de part par boitier - et autres propriérés générales -*/ + * d'un composant le librairie. + * On peut éditer: + * Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) + * Documentation et mots clefs + * Nombre de part par boitier + * et autres propriérés générales + */ { private: - WinEDA_LibeditFrame * m_Parent; - wxNotebook* m_NoteBook; - wxListBox * m_PartAliasList; - wxPanel * m_PanelBasic; - wxPanel * m_PanelAlias; - wxPanel * m_PanelDoc; - wxPanel * PanelField[NUMBER_OF_FIELDS]; + WinEDA_LibeditFrame* m_Parent; + wxNotebook* m_NoteBook; + wxListBox* m_PartAliasList; + wxPanel* m_PanelBasic; + wxPanel* m_PanelAlias; + wxPanel* m_PanelDoc; + wxPanel* PanelField[NUMBER_OF_FIELDS]; - wxCheckBox * AsConvertButt; + wxCheckBox* AsConvertButt; - wxCheckBox * ShowFieldText[NUMBER_OF_FIELDS]; - wxCheckBox * VorientFieldText[NUMBER_OF_FIELDS]; - wxCheckBox * ShowPinNumButt; - wxCheckBox * ShowPinNameButt; - wxCheckBox * m_PinsNameInsideButt; - wxSpinCtrl * SelNumberOfUnits; - wxSpinCtrl * m_SetSkew; - wxCheckBox * m_OptionPower; - wxCheckBox * m_OptionPartsLocked; + wxCheckBox* ShowFieldText[NUMBER_OF_FIELDS]; + wxCheckBox* VorientFieldText[NUMBER_OF_FIELDS]; + wxCheckBox* ShowPinNumButt; + wxCheckBox* ShowPinNameButt; + wxCheckBox* m_PinsNameInsideButt; + wxSpinCtrl* SelNumberOfUnits; + wxSpinCtrl* m_SetSkew; + wxCheckBox* m_OptionPower; + wxCheckBox* m_OptionPartsLocked; - WinEDA_GraphicTextCtrl * FieldTextCtrl[NUMBER_OF_FIELDS]; - WinEDA_PositionCtrl * FieldPosition[NUMBER_OF_FIELDS]; - int FieldFlags[NUMBER_OF_FIELDS]; - int FieldOrient[NUMBER_OF_FIELDS]; - wxRadioBox * FieldHJustify[NUMBER_OF_FIELDS]; - wxRadioBox * FieldVJustify[NUMBER_OF_FIELDS]; - WinEDA_EnterText * m_Doc; - WinEDA_EnterText * m_Docfile; - WinEDA_EnterText * m_Keywords; - bool m_RecreateToolbar; - int m_AliasLocation; + WinEDA_GraphicTextCtrl* FieldTextCtrl[NUMBER_OF_FIELDS]; + WinEDA_PositionCtrl* FieldPosition[NUMBER_OF_FIELDS]; + int FieldFlags[NUMBER_OF_FIELDS]; + int FieldOrient[NUMBER_OF_FIELDS]; + wxRadioBox* FieldHJustify[NUMBER_OF_FIELDS]; + wxRadioBox* FieldVJustify[NUMBER_OF_FIELDS]; + WinEDA_EnterText* m_Doc; + WinEDA_EnterText* m_Docfile; + WinEDA_EnterText* m_Keywords; + bool m_RecreateToolbar; + int m_AliasLocation; public: - // Constructor and destructor - WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent, wxPoint& pos); - ~WinEDA_PartPropertiesFrame() - { - }; + + // Constructor and destructor + WinEDA_PartPropertiesFrame( WinEDA_LibeditFrame * parent, wxPoint & pos ); + ~WinEDA_PartPropertiesFrame() + { + }; private: - void BuildPanelBasic(); - void BuildPanelDoc(); - void BuildPanelAlias(); - void BuildPanelEditField(int fieldId); - void PartPropertiesAccept(wxCommandEvent& event); - void OnQuit(wxCommandEvent& event); - void DeleteAllAliasOfPart(wxCommandEvent& event); - void DeleteAliasOfPart(wxCommandEvent& event); - void AddAliasOfPart(wxCommandEvent& event); - bool ChangeNbUnitsPerPackage(int newUnit); - bool SetUnsetConvert(); - void CopyDocToAlias(wxCommandEvent& event); - void BrowseAndSelectDocFile(wxCommandEvent& event); + void BuildPanelBasic(); + void BuildPanelDoc(); + void BuildPanelAlias(); + void BuildPanelEditField( int fieldId ); + void PartPropertiesAccept( wxCommandEvent& event ); + void OnQuit( wxCommandEvent& event ); + void DeleteAllAliasOfPart( wxCommandEvent& event ); + void DeleteAliasOfPart( wxCommandEvent& event ); + void AddAliasOfPart( wxCommandEvent& event ); + bool ChangeNbUnitsPerPackage( int newUnit ); + bool SetUnsetConvert(); + void CopyDocToAlias( wxCommandEvent& event ); + void BrowseAndSelectDocFile( wxCommandEvent& event ); - DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; -BEGIN_EVENT_TABLE(WinEDA_PartPropertiesFrame, wxDialog) - EVT_BUTTON(ID_ACCEPT_PART_PROPERTIES, WinEDA_PartPropertiesFrame::PartPropertiesAccept) - EVT_BUTTON(ID_CLOSE_PART_PROPERTIES, WinEDA_PartPropertiesFrame::OnQuit) - EVT_BUTTON(ID_ADD_ALIAS, WinEDA_PartPropertiesFrame::AddAliasOfPart) - EVT_BUTTON(ID_DELETE_ONE_ALIAS, WinEDA_PartPropertiesFrame::DeleteAliasOfPart) - EVT_BUTTON(ID_DELETE_ALL_ALIAS, WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart) - EVT_BUTTON(ID_COPY_DOC_TO_ALIAS, WinEDA_PartPropertiesFrame::CopyDocToAlias) - EVT_BUTTON(ID_BROWSE_DOC_FILES, WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile) +BEGIN_EVENT_TABLE( WinEDA_PartPropertiesFrame, wxDialog ) +EVT_BUTTON( ID_ACCEPT_PART_PROPERTIES, WinEDA_PartPropertiesFrame::PartPropertiesAccept ) +EVT_BUTTON( ID_CLOSE_PART_PROPERTIES, WinEDA_PartPropertiesFrame::OnQuit ) +EVT_BUTTON( ID_ADD_ALIAS, WinEDA_PartPropertiesFrame::AddAliasOfPart ) +EVT_BUTTON( ID_DELETE_ONE_ALIAS, WinEDA_PartPropertiesFrame::DeleteAliasOfPart ) +EVT_BUTTON( ID_DELETE_ALL_ALIAS, WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart ) +EVT_BUTTON( ID_COPY_DOC_TO_ALIAS, WinEDA_PartPropertiesFrame::CopyDocToAlias ) +EVT_BUTTON( ID_BROWSE_DOC_FILES, WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile ) END_EVENT_TABLE() /*****************************************************************/ -void WinEDA_LibeditFrame::InstallLibeditFrame(const wxPoint & pos) +void WinEDA_LibeditFrame::InstallLibeditFrame( const wxPoint& pos ) /*****************************************************************/ { -wxPoint fpos = pos; + wxPoint fpos = pos; - WinEDA_PartPropertiesFrame * frame = - new WinEDA_PartPropertiesFrame(this, fpos); - frame->ShowModal(); frame->Destroy(); + WinEDA_PartPropertiesFrame* frame = + new WinEDA_PartPropertiesFrame( this, fpos ); + + frame->ShowModal(); frame->Destroy(); } #define XSIZE 370 #define YSIZE 385 /**********************************************************************************/ -WinEDA_PartPropertiesFrame::WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent, - wxPoint& framepos): - wxDialog(parent, -1, wxEmptyString, framepos, wxSize(XSIZE, YSIZE), - DIALOG_STYLE) +WinEDA_PartPropertiesFrame::WinEDA_PartPropertiesFrame( WinEDA_LibeditFrame* parent, + wxPoint& framepos ) : + wxDialog( parent, -1, wxEmptyString, framepos, wxSize( XSIZE, YSIZE ), + DIALOG_STYLE ) /**********************************************************************************/ { -wxPoint pos; -wxLayoutConstraints* c; -wxString msg_text; -wxButton * Button; -int ii; - - m_Parent = parent; - m_RecreateToolbar = FALSE; - SetFont(*g_DialogFont); + wxPoint pos; + wxLayoutConstraints* c; + wxString msg_text; + wxButton* Button; + int ii; - SetAutoLayout(TRUE); - - for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) - FieldFlags[ii] = 0; + m_Parent = parent; + m_RecreateToolbar = FALSE; + SetFont( *g_DialogFont ); - m_AliasLocation = -1; - if ( CurrentLibEntry ) - { - msg_text = _("Properties for "); - if ( ! CurrentAliasName.IsEmpty() ) - { - m_AliasLocation = LocateAlias( CurrentLibEntry->m_AliasList, CurrentAliasName); - SetTitle( msg_text + CurrentAliasName + - _("(alias of ") + - wxString(CurrentLibEntry->m_Name.m_Text) - + wxT(")") ); - } - else - { - SetTitle( msg_text + CurrentLibEntry->m_Name.m_Text ); - CurrentAliasName.Empty(); - } + SetAutoLayout( TRUE ); - FieldFlags[REFERENCE] = CurrentLibEntry->m_Prefix.m_Attributs; - FieldOrient[REFERENCE] = CurrentLibEntry->m_Prefix.m_Orient; + for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + FieldFlags[ii] = 0; - FieldFlags[VALUE] = CurrentLibEntry->m_Name.m_Attributs; - FieldOrient[VALUE] = CurrentLibEntry->m_Name.m_Orient; + m_AliasLocation = -1; + if( CurrentLibEntry ) + { + msg_text = _( "Properties for " ); + if( !CurrentAliasName.IsEmpty() ) + { + m_AliasLocation = LocateAlias( CurrentLibEntry->m_AliasList, CurrentAliasName ); + SetTitle( msg_text + CurrentAliasName + + _( "(alias of " ) + + wxString( CurrentLibEntry->m_Name.m_Text ) + + wxT( ")" ) ); + } + else + { + SetTitle( msg_text + CurrentLibEntry->m_Name.m_Text ); + CurrentAliasName.Empty(); + } - LibDrawField * Field = CurrentLibEntry->Fields; - while ( Field ) - { - FieldFlags[Field->m_FieldId] = Field->m_Attributs; - FieldOrient[Field->m_FieldId] = Field->m_Orient; - Field = (LibDrawField*)Field->Pnext; - } - } + FieldFlags[REFERENCE] = CurrentLibEntry->m_Prefix.m_Attributs; + FieldOrient[REFERENCE] = CurrentLibEntry->m_Prefix.m_Orient; - else SetTitle(_("Lib Component Properties")); + FieldFlags[VALUE] = CurrentLibEntry->m_Name.m_Attributs; + FieldOrient[VALUE] = CurrentLibEntry->m_Name.m_Orient; - m_NoteBook = new wxNotebook(this, ID_LIBEDIT_NOTEBOOK, - wxDefaultPosition,wxSize(XSIZE-6, YSIZE - 70) ); - SetFont(*g_DialogFont); - m_NoteBook->SetAutoLayout(TRUE); - c = new wxLayoutConstraints; - c->left.SameAs(this, wxLeft, 4); - c->right.SameAs(this, wxRight, 4); - c->top.SameAs(this, wxTop, 4); - c->bottom.SameAs(this, wxBottom, 40); - m_NoteBook->SetConstraints(c); + LibDrawField* Field = CurrentLibEntry->Fields; + while( Field ) + { + FieldFlags[Field->m_FieldId] = Field->m_Attributs; + FieldOrient[Field->m_FieldId] = Field->m_Orient; + Field = (LibDrawField*) Field->Pnext; + } + } + else + SetTitle( _( "Lib Component Properties" ) ); - /* Creation des boutons de commande */ - pos.x = 50; pos.y = YSIZE - 60; - Button = new wxButton(this, ID_CLOSE_PART_PROPERTIES, - _("Cancel"), pos); - Button->SetForegroundColour(*wxBLUE); - c = new wxLayoutConstraints; - c->left.SameAs(this, wxLeft, 20); - c->height.AsIs(); - c->width.AsIs(); - c->bottom.SameAs(this, wxBottom, 5); - Button->SetConstraints(c); + m_NoteBook = new wxNotebook( this, ID_LIBEDIT_NOTEBOOK, + wxDefaultPosition, wxSize (XSIZE - 6, YSIZE - 70) ); - pos.x += Button->GetDefaultSize().x + 70; - Button = new wxButton(this, ID_ACCEPT_PART_PROPERTIES, - _("Ok"), pos); - Button->SetForegroundColour(*wxRED); - c = new wxLayoutConstraints; - c->right.SameAs(this, wxRight, 20); - c->height.AsIs(); - c->width.AsIs(); - c->bottom.SameAs(this, wxBottom, 5); - Button->SetConstraints(c); + SetFont( *g_DialogFont ); + m_NoteBook->SetAutoLayout( TRUE ); + c = new wxLayoutConstraints; + c->left.SameAs( this, wxLeft, 4 ); + c->right.SameAs( this, wxRight, 4 ); + c->top.SameAs( this, wxTop, 4 ); + c->bottom.SameAs( this, wxBottom, 40 ); + m_NoteBook->SetConstraints( c ); - // Add panel Basic - BuildPanelBasic(); - m_NoteBook->AddPage(m_PanelBasic, _("Options"), TRUE); + /* Creation des boutons de commande */ + pos.x = 50; pos.y = YSIZE - 60; + Button = new wxButton( this, ID_CLOSE_PART_PROPERTIES, + _( "Cancel" ), pos ); - - // Add Panel Documentation - BuildPanelDoc(); - m_NoteBook->AddPage(m_PanelDoc, _("Doc"), FALSE); + Button->SetForegroundColour( *wxBLUE ); + c = new wxLayoutConstraints; + c->left.SameAs( this, wxLeft, 20 ); + c->height.AsIs(); + c->width.AsIs(); + c->bottom.SameAs( this, wxBottom, 5 ); + Button->SetConstraints( c ); - // Add Panel Alias List - BuildPanelAlias(); - m_NoteBook->AddPage(m_PanelAlias, _("Alias"), FALSE); + pos.x += Button->GetDefaultSize().x + 70; + Button = new wxButton( this, ID_ACCEPT_PART_PROPERTIES, + _( "Ok" ), pos ); - // Add panel Fields - for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++) BuildPanelEditField(ii); + Button->SetForegroundColour( *wxRED ); + c = new wxLayoutConstraints; + c->right.SameAs( this, wxRight, 20 ); + c->height.AsIs(); + c->width.AsIs(); + c->bottom.SameAs( this, wxBottom, 5 ); + Button->SetConstraints( c ); + + // Add panel Basic + BuildPanelBasic(); + m_NoteBook->AddPage( m_PanelBasic, _( "Options" ), TRUE ); + + + // Add Panel Documentation + BuildPanelDoc(); + m_NoteBook->AddPage( m_PanelDoc, _( "Doc" ), FALSE ); + + // Add Panel Alias List + BuildPanelAlias(); + m_NoteBook->AddPage( m_PanelAlias, _( "Alias" ), FALSE ); + + // Add panel Fields + for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) + BuildPanelEditField( ii ); } + /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelAlias() /*****************************************************/ + /* create the panel for component alias list editing -*/ + */ { -wxPoint pos; -wxButton * Button; + wxPoint pos; + wxButton* Button; - m_PanelAlias = new wxPanel(m_NoteBook, -1); - m_PanelAlias->SetFont(*g_DialogFont); - wxLayoutConstraints * c = new wxLayoutConstraints; - c->left.SameAs(m_NoteBook, wxLeft); - c->right.SameAs(m_NoteBook, wxRight); - c->bottom.SameAs(m_NoteBook, wxBottom); - m_PanelAlias->SetConstraints(c); + m_PanelAlias = new wxPanel( m_NoteBook, -1 ); - pos.x = 200; pos.y = 70; - Button = new wxButton(m_PanelAlias, ID_ADD_ALIAS, _("Add"), pos); - Button->SetForegroundColour(*wxBLUE); + m_PanelAlias->SetFont( *g_DialogFont ); + wxLayoutConstraints* c = new wxLayoutConstraints; + c->left.SameAs( m_NoteBook, wxLeft ); + c->right.SameAs( m_NoteBook, wxRight ); + c->bottom.SameAs( m_NoteBook, wxBottom ); + m_PanelAlias->SetConstraints( c ); - pos.y += Button->GetSize().y + 10; - Button = new wxButton(m_PanelAlias, ID_DELETE_ONE_ALIAS, - _("Delete"), pos); - Button->SetForegroundColour(*wxRED); + pos.x = 200; pos.y = 70; + Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ), pos ); - pos.y += Button->GetSize().y + 10; - Button = new wxButton(m_PanelAlias, ID_DELETE_ALL_ALIAS, - _("Delete All"), pos); - Button->SetForegroundColour(*wxRED); - if ( ! CurrentAliasName.IsEmpty() ) Button->Enable(FALSE); + Button->SetForegroundColour( *wxBLUE ); - pos.x = 5; pos.y = 30; - m_PartAliasList = new wxListBox(m_PanelAlias, - -1, - pos, wxSize(160,170), - 0,NULL, - wxLB_ALWAYS_SB|wxLB_SINGLE); - wxStaticText * Msg = new wxStaticText(m_PanelAlias, -1, _("Alias"), - wxPoint(pos.x,pos.y - 20) ); - Msg->SetForegroundColour(wxColour(200,0,0) ); + pos.y += Button->GetSize().y + 10; + Button = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS, + _( "Delete" ), pos ); - /* lecture des noms des alias */ - if ( CurrentLibEntry ) - { - for ( unsigned ii = 0; ii < CurrentLibEntry->m_AliasList.GetCount(); ii += ALIAS_NEXT) - m_PartAliasList->Append(CurrentLibEntry->m_AliasList[ii+ALIAS_NAME]); - } + Button->SetForegroundColour( *wxRED ); + + pos.y += Button->GetSize().y + 10; + Button = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS, + _( "Delete All" ), pos ); + + Button->SetForegroundColour( *wxRED ); + if( !CurrentAliasName.IsEmpty() ) + Button->Enable( FALSE ); + + pos.x = 5; pos.y = 30; + m_PartAliasList = new wxListBox( m_PanelAlias, + -1, + pos, wxSize( 160, 170 ), + 0, NULL, + wxLB_ALWAYS_SB | wxLB_SINGLE ); + + wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ), + wxPoint (pos.x, pos.y - 20) ); + + Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); + + /* lecture des noms des alias */ + if( CurrentLibEntry ) + { + for( unsigned ii = 0; ii < CurrentLibEntry->m_AliasList.GetCount(); ii += ALIAS_NEXT ) + m_PartAliasList->Append( CurrentLibEntry->m_AliasList[ii + ALIAS_NAME] ); + } } /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelDoc() /*****************************************************/ + /* create the panel for component doc editing -*/ + */ { -wxPoint pos; -wxButton * Button; -wxString msg_text; - - m_PanelDoc = new wxPanel(m_NoteBook, -1); - m_PanelDoc->SetFont(*g_DialogFont); - wxLayoutConstraints * c = new wxLayoutConstraints; - c->left.SameAs(m_NoteBook, wxLeft); - c->right.SameAs(m_NoteBook, wxRight); - c->bottom.SameAs(m_NoteBook, wxBottom); - m_PanelDoc->SetConstraints(c); + wxPoint pos; + wxButton* Button; + wxString msg_text; - pos.x = 5; pos.y = 15; + m_PanelDoc = new wxPanel( m_NoteBook, -1 ); - if ( CurrentLibEntry ) - { - msg_text = _("Properties for "); - if ( ! CurrentAliasName.IsEmpty() ) - { - msg_text += _("alias "); - msg_text += CurrentAliasName; - } - else - { - msg_text += CurrentLibEntry->m_Name.m_Text; - } - wxStaticText * text = new wxStaticText(m_PanelDoc, -1, msg_text, pos); - text->SetForegroundColour(*wxBLUE); - } + m_PanelDoc->SetFont( *g_DialogFont ); + wxLayoutConstraints* c = new wxLayoutConstraints; + c->left.SameAs( m_NoteBook, wxLeft ); + c->right.SameAs( m_NoteBook, wxRight ); + c->bottom.SameAs( m_NoteBook, wxBottom ); + m_PanelDoc->SetConstraints( c ); - pos.y += 30; - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC]; - else - { - if (CurrentLibEntry && CurrentLibEntry->m_Doc) - msg_text = CurrentLibEntry->m_Doc; - } - m_Doc = new WinEDA_EnterText(m_PanelDoc, - _("Doc:"), msg_text, - pos, wxSize(285,-1) ); + pos.x = 5; pos.y = 15; - pos.y += 40; - msg_text.Empty(); - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD]; - else - { - if (CurrentLibEntry ) msg_text = CurrentLibEntry->m_KeyWord; - } - m_Keywords = new WinEDA_EnterText(m_PanelDoc, - _("Keywords:"), msg_text, - pos, wxSize(285,-1) ); - pos.y += 40; - msg_text.Empty(); - if ( m_AliasLocation >= 0 ) - msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME]; - else - { - if (CurrentLibEntry) msg_text = CurrentLibEntry->m_DocFile; - } - m_Docfile = new WinEDA_EnterText(m_PanelDoc, - _("DocFileName:"), msg_text, - pos, wxSize(285,-1) ); + if( CurrentLibEntry ) + { + msg_text = _( "Properties for " ); + if( !CurrentAliasName.IsEmpty() ) + { + msg_text += _( "alias " ); + msg_text += CurrentAliasName; + } + else + { + msg_text += CurrentLibEntry->m_Name.m_Text; + } + wxStaticText* text = new wxStaticText( m_PanelDoc, -1, msg_text, pos ); - pos.y += 40; - Button = new wxButton(m_PanelDoc, ID_COPY_DOC_TO_ALIAS, - _("Copy Doc"), pos); - Button->SetForegroundColour(*wxRED); - if ( m_AliasLocation < 0 ) Button->Enable(FALSE); + text->SetForegroundColour( *wxBLUE ); + } - Button = new wxButton(m_PanelDoc, ID_BROWSE_DOC_FILES, - _("Browse DocFiles"), wxPoint(pos.x + 140, pos.y) ); - Button->SetForegroundColour(*wxBLUE); + pos.y += 30; + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC]; + else + { + if( CurrentLibEntry && CurrentLibEntry->m_Doc ) + msg_text = CurrentLibEntry->m_Doc; + } + m_Doc = new WinEDA_EnterText( m_PanelDoc, + _( "Doc:" ), msg_text, + pos, wxSize( 285, -1 ) ); + + pos.y += 40; + msg_text.Empty(); + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD]; + else + { + if( CurrentLibEntry ) + msg_text = CurrentLibEntry->m_KeyWord; + } + m_Keywords = new WinEDA_EnterText( m_PanelDoc, + _( "Keywords:" ), msg_text, + pos, wxSize( 285, -1 ) ); + + pos.y += 40; + msg_text.Empty(); + if( m_AliasLocation >= 0 ) + msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME]; + else + { + if( CurrentLibEntry ) + msg_text = CurrentLibEntry->m_DocFile; + } + m_Docfile = new WinEDA_EnterText( m_PanelDoc, + _( "DocFileName:" ), msg_text, + pos, wxSize( 285, -1 ) ); + + pos.y += 40; + Button = new wxButton( m_PanelDoc, ID_COPY_DOC_TO_ALIAS, + _( "Copy Doc" ), pos ); + + Button->SetForegroundColour( *wxRED ); + if( m_AliasLocation < 0 ) + Button->Enable( FALSE ); + + Button = new wxButton( m_PanelDoc, ID_BROWSE_DOC_FILES, + _( "Browse DocFiles" ), wxPoint (pos.x + 140, pos.y) ); + + Button->SetForegroundColour( *wxBLUE ); } /*****************************************************/ void WinEDA_PartPropertiesFrame::BuildPanelBasic() /*****************************************************/ + /* create the basic panel for component properties editing -*/ + */ { -wxPoint pos; - - m_PanelBasic = new wxPanel(m_NoteBook, ID_PANEL_BASIC); - m_PanelBasic->SetFont(*g_DialogFont); - wxLayoutConstraints * c = new wxLayoutConstraints; - c->left.SameAs(m_NoteBook, wxLeft); - c->right.SameAs(m_NoteBook, wxRight); - c->bottom.SameAs(m_NoteBook, wxBottom); - m_PanelBasic->SetConstraints(c); + wxPoint pos; - pos.x = 5; pos.y = 25; - new wxStaticBox(m_PanelBasic, -1,_("General :"), pos, wxSize(250, 120)); + m_PanelBasic = new wxPanel( m_NoteBook, ID_PANEL_BASIC ); - pos.x = 10; pos.y += 22; - AsConvertButt = new wxCheckBox(m_PanelBasic,-1, _("As Convert"), pos); - if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE); + m_PanelBasic->SetFont( *g_DialogFont ); + wxLayoutConstraints* c = new wxLayoutConstraints; + c->left.SameAs( m_NoteBook, wxLeft ); + c->right.SameAs( m_NoteBook, wxRight ); + c->bottom.SameAs( m_NoteBook, wxBottom ); + m_PanelBasic->SetConstraints( c ); - pos.y += 20; - ShowPinNumButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Num"), pos); - if ( CurrentLibEntry ) - { - if ( CurrentLibEntry->m_DrawPinNum ) ShowPinNumButt->SetValue(TRUE); - } - else ShowPinNumButt->SetValue(TRUE); + pos.x = 5; pos.y = 25; + new wxStaticBox( m_PanelBasic, -1, _( "General :" ), pos, wxSize( 250, 120 ) ); - pos.y += 20; - ShowPinNameButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Name"), pos); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_DrawPinName ) ShowPinNameButt->SetValue(TRUE); - } - else ShowPinNameButt->SetValue(TRUE); + pos.x = 10; pos.y += 22; + AsConvertButt = new wxCheckBox( m_PanelBasic, -1, _( "As Convert" ), pos ); - pos.y += 20; - m_PinsNameInsideButt = new wxCheckBox(m_PanelBasic,-1, _("Pin Name Inside"), pos); - if ( CurrentLibEntry ) - { - if ( CurrentLibEntry->m_TextInside ) m_PinsNameInsideButt->SetValue(TRUE); - } - else m_PinsNameInsideButt->SetValue(TRUE); + if( g_AsDeMorgan ) + AsConvertButt->SetValue( TRUE ); - pos.y += 40; - new wxStaticText(m_PanelBasic,-1,_("Number of Units:"), pos); - pos.y += 15; - wxString number; - if ( CurrentLibEntry ) number.Printf( wxT("%d"), CurrentLibEntry->m_UnitCount); - else number = wxT("1"); - SelNumberOfUnits = new wxSpinCtrl(m_PanelBasic,-1,number, pos, - wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, - 1, 16); + pos.y += 20; + ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ), pos ); - pos.y -= 15; pos.x += 180; - new wxStaticText(m_PanelBasic,-1,_("Skew:"), pos); - pos.y += 15; - if ( CurrentLibEntry && CurrentLibEntry->m_TextInside) - number.Printf( wxT("%d"), CurrentLibEntry->m_TextInside); - else number = wxT("40"); - m_SetSkew = new wxSpinCtrl(m_PanelBasic,-1,number, pos, - wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, - 1, 100); + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_DrawPinNum ) + ShowPinNumButt->SetValue( TRUE ); + } + else + ShowPinNumButt->SetValue( TRUE ); - pos.x = 5; pos.y += 40; - m_OptionPower = new wxCheckBox(m_PanelBasic,-1, _("Power Symbol"), pos); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_Options == ENTRY_POWER ) - m_OptionPower->SetValue(TRUE); - } - - pos.y = m_OptionPower->GetRect().GetBottom() + 10; - m_OptionPartsLocked = new wxCheckBox(m_PanelBasic,-1, _("Parts are locked"), pos); - if ( CurrentLibEntry ) - { - if( CurrentLibEntry->m_UnitSelectionLocked ) - m_OptionPartsLocked->SetValue(TRUE); - } - if ( number == wxT("1") ) m_OptionPartsLocked->Enable(FALSE); + pos.y += 20; + ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ), pos ); + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_DrawPinName ) + ShowPinNameButt->SetValue( TRUE ); + } + else + ShowPinNameButt->SetValue( TRUE ); + + pos.y += 20; + m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ), pos ); + + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_TextInside ) + m_PinsNameInsideButt->SetValue( TRUE ); + } + else + m_PinsNameInsideButt->SetValue( TRUE ); + + pos.y += 40; + new wxStaticText( m_PanelBasic, -1, _( "Number of Units:" ), pos ); + + pos.y += 15; + wxString number; + if( CurrentLibEntry ) + number.Printf( wxT( "%d" ), CurrentLibEntry->m_UnitCount ); + else + number = wxT( "1" ); + SelNumberOfUnits = new wxSpinCtrl( m_PanelBasic, -1, number, pos, + wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, + 1, 16 ); + + pos.y -= 15; pos.x += 180; + new wxStaticText( m_PanelBasic, -1, _( "Skew:" ), pos ); + + pos.y += 15; + if( CurrentLibEntry && CurrentLibEntry->m_TextInside ) + number.Printf( wxT( "%d" ), CurrentLibEntry->m_TextInside ); + else + number = wxT( "40" ); + m_SetSkew = new wxSpinCtrl( m_PanelBasic, -1, number, pos, + wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, + 1, 100 ); + + pos.x = 5; pos.y += 40; + m_OptionPower = new wxCheckBox( m_PanelBasic, -1, _( "Power Symbol" ), pos ); + + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_Options == ENTRY_POWER ) + m_OptionPower->SetValue( TRUE ); + } + + pos.y = m_OptionPower->GetRect().GetBottom() + 10; + m_OptionPartsLocked = new wxCheckBox( m_PanelBasic, -1, _( "Parts are locked" ), pos ); + + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_UnitSelectionLocked ) + m_OptionPartsLocked->SetValue( TRUE ); + } + if( number == wxT( "1" ) ) + m_OptionPartsLocked->Enable( FALSE ); } + /****************************************************************/ -void WinEDA_PartPropertiesFrame::BuildPanelEditField(int fieldId) +void WinEDA_PartPropertiesFrame::BuildPanelEditField( int fieldId ) /****************************************************************/ { -wxPoint pos; -int xx, yy; -LibDrawField * Field; -wxString Hjustify_list[] = - { _("Left justify"),_("Center"),_("Right justify")}; -wxString Vjustify_list[] = - { _("Bottom justify"),_("Center"),_("Top justify")}; -int ii = fieldId; + wxPoint pos; + int xx, yy; + LibDrawField* Field; + wxString Hjustify_list[] = + { _( "Left justify" ), _( "Center" ), _( "Right justify" ) }; + wxString Vjustify_list[] = + { _( "Bottom justify" ), _( "Center" ), _( "Top justify" ) }; + int ii = fieldId; - PanelField[ii] = new wxPanel(m_NoteBook, ID_PANEL_REFERENCE + ii); - PanelField[ii]->SetFont(*g_DialogFont); - wxLayoutConstraints * c = new wxLayoutConstraints; - c->left.SameAs(m_NoteBook, wxLeft); - c->right.SameAs(m_NoteBook, wxRight); - c->bottom.SameAs(m_NoteBook, wxBottom); - PanelField[ii]->SetConstraints(c); - m_NoteBook->AddPage(PanelField[ii], DrawPartStruct::ReturnFieldName(ii), FALSE); + PanelField[ii] = new wxPanel( m_NoteBook, ID_PANEL_REFERENCE + ii ); - pos.x = 10; pos.y = 10; - ShowFieldText[ii] = new wxCheckBox(PanelField[ii],-1, - _("Show Text"), pos); - if ( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 ) - ShowFieldText[ii]->SetValue(TRUE); + PanelField[ii]->SetFont( *g_DialogFont ); + wxLayoutConstraints* c = new wxLayoutConstraints; + c->left.SameAs( m_NoteBook, wxLeft ); + c->right.SameAs( m_NoteBook, wxRight ); + c->bottom.SameAs( m_NoteBook, wxBottom ); + PanelField[ii]->SetConstraints( c ); + m_NoteBook->AddPage( PanelField[ii], DrawPartStruct::ReturnFieldName( ii ), FALSE ); - ShowFieldText[ii]->GetSize(&xx, &yy); - pos.y += yy + 5; - VorientFieldText[ii] = new wxCheckBox(PanelField[ii],-1, - _("Vertical"), pos); - if ( FieldOrient[ii] ) VorientFieldText[ii]->SetValue(TRUE); + pos.x = 10; pos.y = 10; + ShowFieldText[ii] = new wxCheckBox( PanelField[ii], -1, + _( "Show Text" ), pos ); - pos.x = 150; pos.y = 5; - FieldHJustify[ii] = new wxRadioBox(PanelField[ii],-1, - _("Hor Justify"), pos, wxDefaultSize, - 3,Hjustify_list, 1 , wxRA_SPECIFY_COLS); - FieldHJustify[ii]->GetSize(&xx, &yy); - FieldHJustify[ii]->SetSelection(1); - - pos.y += yy + 5; - FieldVJustify[ii] = new wxRadioBox(PanelField[ii],-1, - _("Vert Justify"), pos, wxDefaultSize, - 3,Vjustify_list, 1 , wxRA_SPECIFY_COLS); - FieldVJustify[ii]->SetSelection(1); + if( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 ) + ShowFieldText[ii]->SetValue( TRUE ); - wxPoint txtpos; - pos.x = 10; pos.y = 70; + ShowFieldText[ii]->GetSize( &xx, &yy ); + pos.y += yy + 5; + VorientFieldText[ii] = new wxCheckBox( PanelField[ii], -1, + _( "Vertical" ), pos ); + + if( FieldOrient[ii] ) + VorientFieldText[ii]->SetValue( TRUE ); + + pos.x = 150; pos.y = 5; + FieldHJustify[ii] = new wxRadioBox( PanelField[ii], -1, + _( "Hor Justify" ), pos, wxDefaultSize, + 3, Hjustify_list, 1, wxRA_SPECIFY_COLS ); + + FieldHJustify[ii]->GetSize( &xx, &yy ); + FieldHJustify[ii]->SetSelection( 1 ); + + pos.y += yy + 5; + FieldVJustify[ii] = new wxRadioBox( PanelField[ii], -1, + _( "Vert Justify" ), pos, wxDefaultSize, + 3, Vjustify_list, 1, wxRA_SPECIFY_COLS ); + + FieldVJustify[ii]->SetSelection( 1 ); + + wxPoint txtpos; + pos.x = 10; pos.y = 70; #define POSY_OFFSET 70 - switch ( ii ) - { - case REFERENCE: - if ( CurrentLibEntry ) - { - Field = &CurrentLibEntry->m_Prefix; - txtpos = Field->m_Pos; - if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT) - FieldHJustify[ii]->SetSelection(0); - else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT) - FieldHJustify[ii]->SetSelection(2); - if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM) - FieldVJustify[ii]->SetSelection(0); - else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP) - FieldVJustify[ii]->SetSelection(2); - } - else txtpos = wxPoint(0,0); - FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], - _("Pos"), txtpos, - g_UnitMetric , pos ); - FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii], - DrawPartStruct::ReturnFieldName(ii), - CurrentLibEntry ? - CurrentLibEntry->m_Prefix.m_Text.GetData() : wxT("U"), - CurrentLibEntry ? CurrentLibEntry->m_Prefix.m_Size.x : DEFAULT_TEXT_SIZE, - g_UnitMetric , - wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), - 200, TRUE); - break; - case VALUE: - if ( CurrentLibEntry ) - { - Field = &CurrentLibEntry->m_Name; - txtpos = Field->m_Pos; - if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT) - FieldHJustify[ii]->SetSelection(0); - else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT) - FieldHJustify[ii]->SetSelection(2); - if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM) - FieldVJustify[ii]->SetSelection(0); - else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP) - FieldVJustify[ii]->SetSelection(2); - } - else txtpos = wxPoint(0,0); - FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], - _("Pos"), txtpos, - g_UnitMetric , pos); - FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii], - DrawPartStruct::ReturnFieldName(ii), - CurrentLibEntry ? CurrentLibEntry->m_Name.m_Text.GetData() : NULL, - CurrentLibEntry ? CurrentLibEntry->m_Name.m_Size.x : DEFAULT_TEXT_SIZE, - g_UnitMetric , - wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), - 200, TRUE); - break; - - default: - int fsize; - wxString ftext; - wxPoint fpos; - fsize = DEFAULT_TEXT_SIZE;; - Field = NULL; - fpos = wxPoint(0,0); - //recherche du Field de FieldId correspondant, s'il existe - if ( CurrentLibEntry ) - { - Field = CurrentLibEntry->Fields; - while ( Field ) - { - if( Field->m_FieldId == ii ) - { - fsize = Field->m_Size.x; - ftext = Field->m_Text; - fpos = Field->m_Pos; - if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT) - FieldHJustify[ii]->SetSelection(0); - else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT) - FieldHJustify[ii]->SetSelection(2); - if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM) - FieldVJustify[ii]->SetSelection(0); - else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP) - FieldVJustify[ii]->SetSelection(2); - break; - } - Field = (LibDrawField*)Field->Pnext; - } - } + switch( ii ) + { + case REFERENCE: + if( CurrentLibEntry ) + { + Field = &CurrentLibEntry->m_Prefix; + txtpos = Field->m_Pos; + if( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) + FieldHJustify[ii]->SetSelection( 0 ); + else if( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) + FieldHJustify[ii]->SetSelection( 2 ); + if( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) + FieldVJustify[ii]->SetSelection( 0 ); + else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) + FieldVJustify[ii]->SetSelection( 2 ); + } + else + txtpos = wxPoint( 0, 0 ); + FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], + _( "Pos" ), txtpos, + g_UnitMetric, pos ); - FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], - _("Pos"), fpos, - g_UnitMetric , pos); - FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii], - DrawPartStruct::ReturnFieldName(ii), - ftext, fsize, - g_UnitMetric , - wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), - 200, TRUE); - break; - } + FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( + PanelField[ii], + DrawPartStruct::ReturnFieldName (ii), + CurrentLibEntry ? + CurrentLibEntry->m_Prefix.m_Text.GetData () + : wxT( + "U" ), + CurrentLibEntry ? CurrentLibEntry-> + m_Prefix.m_Size.x : DEFAULT_TEXT_SIZE, + g_UnitMetric, + wxPoint (pos.x, pos.y + + FieldPosition[ii]->GetDimension ().y + POSY_OFFSET), + 200, + TRUE ); + + break; + + case VALUE: + if( CurrentLibEntry ) + { + Field = &CurrentLibEntry->m_Name; + txtpos = Field->m_Pos; + if( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) + FieldHJustify[ii]->SetSelection( 0 ); + else if( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) + FieldHJustify[ii]->SetSelection( 2 ); + if( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) + FieldVJustify[ii]->SetSelection( 0 ); + else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) + FieldVJustify[ii]->SetSelection( 2 ); + } + else + txtpos = wxPoint( 0, 0 ); + FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], + _( "Pos" ), txtpos, + g_UnitMetric, pos ); + + FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( + PanelField[ii], + DrawPartStruct::ReturnFieldName (ii), + CurrentLibEntry ? CurrentLibEntry->m_Name. + m_Text.GetData () : NULL, + CurrentLibEntry ? CurrentLibEntry->m_Name. + m_Size.x : DEFAULT_TEXT_SIZE, + g_UnitMetric, + wxPoint (pos.x, pos.y + + FieldPosition[ii]->GetDimension ().y + POSY_OFFSET), + 200, + TRUE ); + + break; + + default: + int fsize; + wxString ftext; + wxPoint fpos; + fsize = DEFAULT_TEXT_SIZE;; + Field = NULL; + fpos = wxPoint( 0, 0 ); + + //recherche du Field de FieldId correspondant, s'il existe + if( CurrentLibEntry ) + { + Field = CurrentLibEntry->Fields; + while( Field ) + { + if( Field->m_FieldId == ii ) + { + fsize = Field->m_Size.x; + ftext = Field->m_Text; + fpos = Field->m_Pos; + if( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) + FieldHJustify[ii]->SetSelection( 0 ); + else if( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) + FieldHJustify[ii]->SetSelection( 2 ); + if( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) + FieldVJustify[ii]->SetSelection( 0 ); + else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) + FieldVJustify[ii]->SetSelection( 2 ); + break; + } + Field = (LibDrawField*) Field->Pnext; + } + } + + FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], + _( "Pos" ), fpos, + g_UnitMetric, pos ); + + FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( + PanelField[ii], + DrawPartStruct::ReturnFieldName (ii), + ftext, + fsize, + g_UnitMetric, + wxPoint (pos.x, pos.y + + FieldPosition[ii]->GetDimension ().y + POSY_OFFSET), + 200, + TRUE ); + + break; + } } /************************************************************************/ -void WinEDA_PartPropertiesFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::OnQuit( wxCommandEvent& WXUNUSED (event) ) /************************************************************************/ { // true is to force the frame to close - Close(true); + Close( true ); } + /**************************************************************************/ -void WinEDA_PartPropertiesFrame::PartPropertiesAccept(wxCommandEvent& event) +void WinEDA_PartPropertiesFrame::PartPropertiesAccept( wxCommandEvent& event ) /**************************************************************************/ + /* Met a jour les differents parametres pour le composant en cours d'édition -*/ + */ { -int ii, jj; -int hjustify[3] = { GR_TEXT_HJUSTIFY_LEFT , GR_TEXT_HJUSTIFY_CENTER, - GR_TEXT_HJUSTIFY_RIGHT }; -int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER, - GR_TEXT_VJUSTIFY_TOP }; - - if( CurrentLibEntry == NULL ) - { - Close(); return; - } + int ii, jj; + int hjustify[3] = { + GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER, + GR_TEXT_HJUSTIFY_RIGHT + }; + int vjustify[3] = { + GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER, + GR_TEXT_VJUSTIFY_TOP + }; - m_Parent->m_CurrentScreen->SetModify(); - m_Parent->m_CurrentScreen->SetRefreshReq(); - m_Parent->SaveCopyInUndoList(); + if( CurrentLibEntry == NULL ) + { + Close(); return; + } - /* A new name could be entered in VALUE field. - Must not be an existing alias name in alias list box */ - jj = m_PartAliasList->GetCount(); - wxString newvalue = FieldTextCtrl[VALUE]->GetText(); - for ( ii = 0; ii < jj; ii++ ) - { - if( newvalue.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 ) - { - wxString msg; - msg.Printf( wxT("Alias %s exists!"), newvalue.GetData()); - DisplayError(this, msg); - return; - } - } + m_Parent->m_CurrentScreen->SetModify(); + m_Parent->m_CurrentScreen->SetRefreshReq(); + m_Parent->SaveCopyInUndoList(); - /* Update the doc, keyword and doc filename strings */ - if ( m_AliasLocation < 0 ) - { - CurrentLibEntry->m_Doc = m_Doc->GetValue(); - CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); - CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); - } + /* A new name could be entered in VALUE field. + * Must not be an existing alias name in alias list box */ + jj = m_PartAliasList->GetCount(); + wxString newvalue = FieldTextCtrl[VALUE]->GetText(); + for( ii = 0; ii < jj; ii++ ) + { + if( newvalue.CmpNoCase( m_PartAliasList->GetString( ii ).GetData() ) == 0 ) + { + wxString msg; + msg.Printf( wxT( "Alias %s exists!" ), newvalue.GetData() ); + DisplayError( this, msg ); + return; + } + } - else - { - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC] = m_Doc->GetValue(); - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD] = m_Keywords->GetValue(); - CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME] = m_Docfile->GetValue(); - } - - /* Update the alias list */ - /* 1 - Add names: test for a not existing name in old alias list: */ - jj = m_PartAliasList->GetCount(); - for ( ii = 0; ii < jj; ii++ ) - { - if ( LocateAlias( CurrentLibEntry->m_AliasList, m_PartAliasList->GetString(ii)) < 0 ) - { // new alias must be created - CurrentLibEntry->m_AliasList.Add(m_PartAliasList->GetString(ii)); - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc string - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void keyword list string - CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc filename string - } - } - - /* 2 - Remove delete names: test for an non existing name in new alias list: */ - int kk, kkmax = CurrentLibEntry->m_AliasList.GetCount(); - for ( kk = 0; kk < kkmax; ) - { - jj = m_PartAliasList->GetCount(); - wxString aliasname = CurrentLibEntry->m_AliasList[kk]; - for ( ii = 0; ii < jj; ii++ ) - { - if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 ) - { - kk += ALIAS_NEXT; // Alias exist in new list. keep it and test next old name - break; - } - } - - if ( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) - { - for( ii = 0; ii < ALIAS_NEXT; ii++ ) CurrentLibEntry->m_AliasList.RemoveAt(kk); - kkmax = CurrentLibEntry->m_AliasList.GetCount(); - } - - } - + /* Update the doc, keyword and doc filename strings */ + if( m_AliasLocation < 0 ) + { + CurrentLibEntry->m_Doc = m_Doc->GetValue(); + CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); + CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); + } + else + { + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue(); + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD] = m_Keywords->GetValue(); + CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME] = m_Docfile->GetValue(); + } - if ( ! FieldTextCtrl[REFERENCE]->GetText().IsEmpty() ) - { - CurrentLibEntry->m_Prefix.m_Text = FieldTextCtrl[REFERENCE]->GetText(); - } + /* Update the alias list */ + /* 1 - Add names: test for a not existing name in old alias list: */ + jj = m_PartAliasList->GetCount(); + for( ii = 0; ii < jj; ii++ ) + { + if( LocateAlias( CurrentLibEntry->m_AliasList, m_PartAliasList->GetString( ii ) ) < 0 ) + { // new alias must be created + CurrentLibEntry->m_AliasList.Add( m_PartAliasList->GetString( ii ) ); + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void doc string + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void keyword list string + CurrentLibEntry->m_AliasList.Add( wxEmptyString ); // Add a void doc filename string + } + } - if ( ! FieldTextCtrl[VALUE]->GetText().IsEmpty() ) - { - if ( CurrentLibEntry->m_Name.m_Text != FieldTextCtrl[VALUE]->GetText() ) - { - m_RecreateToolbar = TRUE; - CurrentLibEntry->m_Name.m_Text = FieldTextCtrl[VALUE]->GetText(); - } - } + /* 2 - Remove delete names: test for an non existing name in new alias list: */ + int kk, kkmax = CurrentLibEntry->m_AliasList.GetCount(); + for( kk = 0; kk < kkmax; ) + { + jj = m_PartAliasList->GetCount(); + wxString aliasname = CurrentLibEntry->m_AliasList[kk]; + for( ii = 0; ii < jj; ii++ ) + { + if( aliasname.CmpNoCase( m_PartAliasList->GetString( ii ).GetData() ) == 0 ) + { + kk += ALIAS_NEXT; // Alias exist in new list. keep it and test next old name + break; + } + } - CurrentLibEntry->m_Prefix.m_Size.x = - CurrentLibEntry->m_Prefix.m_Size.y = FieldTextCtrl[REFERENCE]->GetTextSize(); - CurrentLibEntry->m_Name.m_Size.x = - CurrentLibEntry->m_Name.m_Size.y = FieldTextCtrl[VALUE]->GetTextSize(); + if( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) + { + for( ii = 0; ii < ALIAS_NEXT; ii++ ) + CurrentLibEntry->m_AliasList.RemoveAt( kk ); - CurrentLibEntry->m_Prefix.m_Pos = FieldPosition[REFERENCE]->GetValue(); - CurrentLibEntry->m_Name.m_Pos = FieldPosition[VALUE]->GetValue(); + kkmax = CurrentLibEntry->m_AliasList.GetCount(); + } + } - CurrentLibEntry->m_Prefix.m_Orient = VorientFieldText[REFERENCE]->GetValue() ? 1 : 0; - CurrentLibEntry->m_Name.m_Orient = VorientFieldText[VALUE]->GetValue() ? 1 : 0; + if( !FieldTextCtrl[REFERENCE]->GetText().IsEmpty() ) + { + CurrentLibEntry->m_Prefix.m_Text = FieldTextCtrl[REFERENCE]->GetText(); + } - CurrentLibEntry->m_Prefix.m_HJustify = - hjustify[FieldHJustify[REFERENCE]->GetSelection()]; - CurrentLibEntry->m_Prefix.m_VJustify = - vjustify[FieldVJustify[REFERENCE]->GetSelection()]; - CurrentLibEntry->m_Name.m_HJustify = - hjustify[FieldHJustify[VALUE]->GetSelection()]; - CurrentLibEntry->m_Name.m_VJustify = - vjustify[FieldVJustify[VALUE]->GetSelection()]; + if( !FieldTextCtrl[VALUE]->GetText().IsEmpty() ) + { + if( CurrentLibEntry->m_Name.m_Text != FieldTextCtrl[VALUE]->GetText() ) + { + m_RecreateToolbar = TRUE; + CurrentLibEntry->m_Name.m_Text = FieldTextCtrl[VALUE]->GetText(); + } + } - if ( ShowFieldText[REFERENCE]->GetValue() ) - CurrentLibEntry->m_Prefix.m_Attributs &= ~TEXT_NO_VISIBLE; - else - CurrentLibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE; + CurrentLibEntry->m_Prefix.m_Size.x = + CurrentLibEntry->m_Prefix.m_Size.y = FieldTextCtrl[REFERENCE]->GetTextSize(); + CurrentLibEntry->m_Name.m_Size.x = + CurrentLibEntry->m_Name.m_Size.y = FieldTextCtrl[VALUE]->GetTextSize(); - if ( ShowFieldText[VALUE]->GetValue() ) - CurrentLibEntry->m_Name.m_Attributs &= ~TEXT_NO_VISIBLE; - else - CurrentLibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE; + CurrentLibEntry->m_Prefix.m_Pos = FieldPosition[REFERENCE]->GetValue(); + CurrentLibEntry->m_Name.m_Pos = FieldPosition[VALUE]->GetValue(); - for ( ii = FOOTPRINT; ii < NUMBER_OF_FIELDS; ii++ ) - { - LibDrawField * Field = CurrentLibEntry->Fields; - LibDrawField * NextField, * previousField = NULL; - while ( Field ) - { - NextField = (LibDrawField*)Field->Pnext; - if( Field->m_FieldId == ii ) - { - Field->m_Text = FieldTextCtrl[ii]->GetText(); - Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize(); - Field->m_HJustify = FieldHJustify[ii]->GetSelection(); - Field->m_VJustify = FieldVJustify[ii]->GetSelection(); - if ( ShowFieldText[ii]->GetValue() ) - Field->m_Attributs &= ~TEXT_NO_VISIBLE; - else - Field->m_Attributs |= TEXT_NO_VISIBLE; - Field->m_Orient = VorientFieldText[ii]->GetValue() ? 1 : 0; - Field->m_Pos = FieldPosition[ii]->GetValue(); - if( Field->m_Text.IsEmpty() ) // An old field exists; new is void, delete it - { - delete Field; - if ( previousField ) previousField->Pnext = NextField; - else CurrentLibEntry->Fields = NextField; - } - break; - } + CurrentLibEntry->m_Prefix.m_Orient = VorientFieldText[REFERENCE]->GetValue() ? 1 : 0; + CurrentLibEntry->m_Name.m_Orient = VorientFieldText[VALUE]->GetValue() ? 1 : 0; - previousField = Field; - Field = NextField; - } + CurrentLibEntry->m_Prefix.m_HJustify = + hjustify[FieldHJustify[REFERENCE]->GetSelection()]; + CurrentLibEntry->m_Prefix.m_VJustify = + vjustify[FieldVJustify[REFERENCE]->GetSelection()]; + CurrentLibEntry->m_Name.m_HJustify = + hjustify[FieldHJustify[VALUE]->GetSelection()]; + CurrentLibEntry->m_Name.m_VJustify = + vjustify[FieldVJustify[VALUE]->GetSelection()]; - if ( (Field == NULL) && ( ! FieldTextCtrl[ii]->GetText().IsEmpty() ) ) - { // Do not exists: must be created - Field = new LibDrawField(ii); - Field->m_Text = FieldTextCtrl[ii]->GetText(); - Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize(); - if ( ShowFieldText[Field->m_FieldId]->GetValue() ) - Field->m_Attributs &= ~TEXT_NO_VISIBLE; - else - Field->m_Attributs |= TEXT_NO_VISIBLE; - Field->m_Orient = VorientFieldText[Field->m_FieldId]->GetValue() ?1 : 0; - Field->m_Pos = FieldPosition[Field->m_FieldId]->GetValue(); - Field->m_HJustify = hjustify[FieldHJustify[Field->m_FieldId]->GetSelection()]; - Field->m_VJustify = vjustify[FieldVJustify[Field->m_FieldId]->GetSelection()]; - Field->Pnext = CurrentLibEntry->Fields; - CurrentLibEntry->Fields = Field; - } - } + if( ShowFieldText[REFERENCE]->GetValue() ) + CurrentLibEntry->m_Prefix.m_Attributs &= ~TEXT_NO_VISIBLE; + else + CurrentLibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE; - ii = SelNumberOfUnits->GetValue(); - if ( ChangeNbUnitsPerPackage(ii) ) - m_RecreateToolbar = TRUE; + if( ShowFieldText[VALUE]->GetValue() ) + CurrentLibEntry->m_Name.m_Attributs &= ~TEXT_NO_VISIBLE; + else + CurrentLibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE; - if ( AsConvertButt->GetValue() ) - { - if ( ! g_AsDeMorgan ) - { - g_AsDeMorgan = 1; - if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; - } - } - else - { - if ( g_AsDeMorgan ) - { - g_AsDeMorgan = 0; - if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; - } - } + for( ii = FOOTPRINT; ii < NUMBER_OF_FIELDS; ii++ ) + { + LibDrawField* Field = CurrentLibEntry->Fields; + LibDrawField* NextField, * previousField = NULL; + while( Field ) + { + NextField = (LibDrawField*) Field->Pnext; + if( Field->m_FieldId == ii ) + { + Field->m_Text = FieldTextCtrl[ii]->GetText(); + Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize(); + Field->m_HJustify = FieldHJustify[ii]->GetSelection(); + Field->m_VJustify = FieldVJustify[ii]->GetSelection(); + if( ShowFieldText[ii]->GetValue() ) + Field->m_Attributs &= ~TEXT_NO_VISIBLE; + else + Field->m_Attributs |= TEXT_NO_VISIBLE; + Field->m_Orient = VorientFieldText[ii]->GetValue() ? 1 : 0; + Field->m_Pos = FieldPosition[ii]->GetValue(); + if( Field->m_Text.IsEmpty() ) // An old field exists; new is void, delete it + { + delete Field; + if( previousField ) + previousField->Pnext = NextField; + else + CurrentLibEntry->Fields = NextField; + } + break; + } - CurrentLibEntry->m_DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0; - CurrentLibEntry->m_DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0; + previousField = Field; + Field = NextField; + } - if ( m_PinsNameInsideButt->GetValue() == FALSE) - CurrentLibEntry->m_TextInside = 0; - else - CurrentLibEntry->m_TextInside = m_SetSkew->GetValue(); + if( (Field == NULL) && ( !FieldTextCtrl[ii]->GetText().IsEmpty() ) ) + { // Do not exists: must be created + Field = new LibDrawField( ii ); - if ( m_OptionPower->GetValue() == TRUE) - CurrentLibEntry->m_Options = ENTRY_POWER; - else - CurrentLibEntry->m_Options = ENTRY_NORMAL; + Field->m_Text = FieldTextCtrl[ii]->GetText(); + Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize(); + if( ShowFieldText[Field->m_FieldId]->GetValue() ) + Field->m_Attributs &= ~TEXT_NO_VISIBLE; + else + Field->m_Attributs |= TEXT_NO_VISIBLE; + Field->m_Orient = VorientFieldText[Field->m_FieldId]->GetValue() ? 1 : 0; + Field->m_Pos = FieldPosition[Field->m_FieldId]->GetValue(); + Field->m_HJustify = hjustify[FieldHJustify[Field->m_FieldId]->GetSelection()]; + Field->m_VJustify = vjustify[FieldVJustify[Field->m_FieldId]->GetSelection()]; + Field->Pnext = CurrentLibEntry->Fields; + CurrentLibEntry->Fields = Field; + } + } - /* Set the option "Units locked". - Obviously, cannot be TRUE if there is only one part */ - CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); - if ( CurrentLibEntry->m_UnitCount <= 1 ) - CurrentLibEntry->m_UnitSelectionLocked = FALSE; - - if ( m_RecreateToolbar ) m_Parent->ReCreateHToolbar(); + ii = SelNumberOfUnits->GetValue(); + if( ChangeNbUnitsPerPackage( ii ) ) + m_RecreateToolbar = TRUE; - m_Parent->DisplayLibInfos(); + if( AsConvertButt->GetValue() ) + { + if( !g_AsDeMorgan ) + { + g_AsDeMorgan = 1; + if( SetUnsetConvert() ) + m_RecreateToolbar = TRUE; + } + } + else + { + if( g_AsDeMorgan ) + { + g_AsDeMorgan = 0; + if( SetUnsetConvert() ) + m_RecreateToolbar = TRUE; + } + } - Close(); + CurrentLibEntry->m_DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0; + CurrentLibEntry->m_DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0; + + if( m_PinsNameInsideButt->GetValue() == FALSE ) + CurrentLibEntry->m_TextInside = 0; + else + CurrentLibEntry->m_TextInside = m_SetSkew->GetValue(); + + if( m_OptionPower->GetValue() == TRUE ) + CurrentLibEntry->m_Options = ENTRY_POWER; + else + CurrentLibEntry->m_Options = ENTRY_NORMAL; + + /* Set the option "Units locked". + * Obviously, cannot be TRUE if there is only one part */ + CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); + if( CurrentLibEntry->m_UnitCount <= 1 ) + CurrentLibEntry->m_UnitSelectionLocked = FALSE; + + if( m_RecreateToolbar ) + m_Parent->ReCreateHToolbar(); + + m_Parent->DisplayLibInfos(); + + Close(); } /*******************************************************************************/ -void WinEDA_PartPropertiesFrame::CopyDocToAlias(wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) ) /******************************************************************************/ { - if( CurrentLibEntry == NULL ) return; - if ( CurrentAliasName.IsEmpty() ) return; + if( CurrentLibEntry == NULL ) + return; + if( CurrentAliasName.IsEmpty() ) + return; - m_Doc->SetValue(CurrentLibEntry->m_Doc); - m_Docfile->SetValue(CurrentLibEntry->m_DocFile); - m_Keywords->SetValue(CurrentLibEntry->m_KeyWord); + m_Doc->SetValue( CurrentLibEntry->m_Doc ); + m_Docfile->SetValue( CurrentLibEntry->m_DocFile ); + m_Keywords->SetValue( CurrentLibEntry->m_KeyWord ); } + /**********************************************************/ void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /**********************************************************/ { - - CurrentAliasName.Empty(); - if( CurrentLibEntry ) - { - if( IsOK(this, _("Ok to Delete Alias LIST") ) ) - { - m_PartAliasList->Clear(); - m_RecreateToolbar = TRUE; - } - } - + CurrentAliasName.Empty(); + if( CurrentLibEntry ) + { + if( IsOK( this, _( "Ok to Delete Alias LIST" ) ) ) + { + m_PartAliasList->Clear(); + m_RecreateToolbar = TRUE; + } + } } + /*******************************************************************************/ -void WinEDA_PartPropertiesFrame::AddAliasOfPart( wxCommandEvent& WXUNUSED(event)) +void WinEDA_PartPropertiesFrame::AddAliasOfPart( wxCommandEvent& WXUNUSED (event) ) /*******************************************************************************/ + /* Add a new name to the alias list box - New name cannot be the root name, and must not exists -*/ + * New name cannot be the root name, and must not exists + */ { -wxString Line; -wxString aliasname; + wxString Line; + wxString aliasname; - if(CurrentLibEntry == NULL) return; + if( CurrentLibEntry == NULL ) + return; - if( Get_Message(_("New alias:"),Line, this) != 0 ) return; + if( Get_Message( _( "New alias:" ), Line, this ) != 0 ) + return; - Line.Replace( wxT(" "), wxT("_") ); - aliasname = Line; + Line.Replace( wxT( " " ), wxT( "_" ) ); + aliasname = Line; - if ( CurrentLibEntry->m_Name.m_Text.CmpNoCase(Line) == 0 ) - { - DisplayError(this, _("This is the Root Part"), 10); return; - } - - /* test for an existing name: */ - int ii, jj = m_PartAliasList->GetCount(); - for ( ii = 0; ii < jj; ii++ ) - { - if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii)) == 0 ) - { - DisplayError(this, _("Already in use"), 10); - return; - } - } + if( CurrentLibEntry->m_Name.m_Text.CmpNoCase( Line ) == 0 ) + { + DisplayError( this, _( "This is the Root Part" ), 10 ); return; + } - m_PartAliasList->Append(aliasname); + /* test for an existing name: */ + int ii, jj = m_PartAliasList->GetCount(); + for( ii = 0; ii < jj; ii++ ) + { + if( aliasname.CmpNoCase( m_PartAliasList->GetString( ii ) ) == 0 ) + { + DisplayError( this, _( "Already in use" ), 10 ); + return; + } + } - m_RecreateToolbar = TRUE; + m_PartAliasList->Append( aliasname ); + + m_RecreateToolbar = TRUE; } + /********************************************************/ void WinEDA_PartPropertiesFrame::DeleteAliasOfPart( - wxCommandEvent& WXUNUSED(event)) + wxCommandEvent& WXUNUSED (event) ) /********************************************************/ { -wxString aliasname = m_PartAliasList->GetStringSelection(); + wxString aliasname = m_PartAliasList->GetStringSelection(); - if ( aliasname.IsEmpty() ) return; - if ( aliasname == CurrentAliasName ) - { - wxString msg = CurrentAliasName + _(" is Current Selected Alias!"); - DisplayError(this, msg ); - return; - } - - int ii = m_PartAliasList->GetSelection(); - m_PartAliasList->Delete(ii); + if( aliasname.IsEmpty() ) + return; + if( aliasname == CurrentAliasName ) + { + wxString msg = CurrentAliasName + _( " is Current Selected Alias!" ); + DisplayError( this, msg ); + return; + } - m_RecreateToolbar = TRUE; + int ii = m_PartAliasList->GetSelection(); + m_PartAliasList->Delete( ii ); + + m_RecreateToolbar = TRUE; } - - /********************************************************************/ -bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage(int MaxUnit) +bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit ) /********************************************************************/ + /* Routine de modification du nombre d'unites par package pour le - composant courant; -*/ + * composant courant; + */ { -int OldNumUnits, ii, FlagDel = -1; -LibEDA_BaseStruct* DrawItem, * NextDrawItem; + int OldNumUnits, ii, FlagDel = -1; + LibEDA_BaseStruct* DrawItem, * NextDrawItem; - if( CurrentLibEntry == NULL ) return FALSE; + if( CurrentLibEntry == NULL ) + return FALSE; - /* Si pas de changement: termine */ - if ( CurrentLibEntry->m_UnitCount == MaxUnit ) return FALSE; + /* Si pas de changement: termine */ + if( CurrentLibEntry->m_UnitCount == MaxUnit ) + return FALSE; - OldNumUnits = CurrentLibEntry->m_UnitCount; - if ( OldNumUnits < 1 ) OldNumUnits = 1; + OldNumUnits = CurrentLibEntry->m_UnitCount; + if( OldNumUnits < 1 ) + OldNumUnits = 1; - CurrentLibEntry->m_UnitCount = MaxUnit; + CurrentLibEntry->m_UnitCount = MaxUnit; - /* Traitement des unites enlevees ou rajoutees */ - if(OldNumUnits > CurrentLibEntry->m_UnitCount ) - { - DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = NextDrawItem) - { - NextDrawItem = DrawItem->Next(); - if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */ - { - if( FlagDel < 0 ) - { - if( IsOK(this, _("Delete units") ) ) - { - /* Si part selectee n'existe plus: selection 1ere unit */ - if( CurrentUnit > MaxUnit ) CurrentUnit = 1; - FlagDel = 1; - } - else - { - FlagDel = 0; - MaxUnit = OldNumUnits; - CurrentLibEntry->m_UnitCount = MaxUnit; - return FALSE; - } - } - DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, - DrawItem, 0); - } - } - return TRUE; - } + /* Traitement des unites enlevees ou rajoutees */ + if( OldNumUnits > CurrentLibEntry->m_UnitCount ) + { + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = NextDrawItem ) + { + NextDrawItem = DrawItem->Next(); + if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */ + { + if( FlagDel < 0 ) + { + if( IsOK( this, _( "Delete units" ) ) ) + { + /* Si part selectee n'existe plus: selection 1ere unit */ + if( CurrentUnit > MaxUnit ) + CurrentUnit = 1; + FlagDel = 1; + } + else + { + FlagDel = 0; + MaxUnit = OldNumUnits; + CurrentLibEntry->m_UnitCount = MaxUnit; + return FALSE; + } + } + DeleteOneLibraryDrawStruct( m_Parent->DrawPanel, NULL, CurrentLibEntry, + DrawItem, 0 ); + } + } - if(OldNumUnits < CurrentLibEntry->m_UnitCount ) - { - DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) - { - /* Duplication des items pour autres elements */ - if( DrawItem->m_Unit == 1 ) - { - for ( ii = OldNumUnits +1; ii <= MaxUnit; ii ++ ) - { - NextDrawItem = CopyDrawEntryStruct(this, DrawItem); - NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = NextDrawItem; - NextDrawItem->m_Unit = ii; - } - } - } - } - return TRUE; + return TRUE; + } + + if( OldNumUnits < CurrentLibEntry->m_UnitCount ) + { + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) + { + /* Duplication des items pour autres elements */ + if( DrawItem->m_Unit == 1 ) + { + for( ii = OldNumUnits + 1; ii <= MaxUnit; ii++ ) + { + NextDrawItem = CopyDrawEntryStruct( this, DrawItem ); + NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = NextDrawItem; + NextDrawItem->m_Unit = ii; + } + } + } + } + return TRUE; } /*****************************************************/ bool WinEDA_PartPropertiesFrame::SetUnsetConvert() /*****************************************************/ + /* crée ou efface (selon option AsConvert) les éléments - de la représentation convertie d'un composant -*/ + * de la représentation convertie d'un composant + */ { -int FlagDel = 0; -LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem; + int FlagDel = 0; + LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem; - if( g_AsDeMorgan ) /* Representation convertie a creer */ - { - /* Traitement des elements a ajouter ( pins seulement ) */ - if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) - { - /* Duplication des items pour autres elements */ - if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) continue; - if( DrawItem->m_Convert == 1 ) - { - if( FlagDel == 0 ) - { - if( IsOK(this, _("Create pins for Convert items")) ) - FlagDel = 1; - else - { - if( IsOK(this, _("Part as \"De Morgan\" anymore")) ) - return TRUE; + if( g_AsDeMorgan ) /* Representation convertie a creer */ + { + /* Traitement des elements a ajouter ( pins seulement ) */ + if( CurrentLibEntry ) + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) + { + /* Duplication des items pour autres elements */ + if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) + continue; + if( DrawItem->m_Convert == 1 ) + { + if( FlagDel == 0 ) + { + if( IsOK( this, _( "Create pins for Convert items" ) ) ) + FlagDel = 1; + else + { + if( IsOK( this, _( "Part as \"De Morgan\" anymore" ) ) ) + return TRUE; - g_AsDeMorgan = 0; return FALSE; - } - } - NextDrawItem = CopyDrawEntryStruct(this, DrawItem); - NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = NextDrawItem; - NextDrawItem->m_Convert = 2; - } - } - } - - else /* Representation convertie a supprimer */ - { - /* Traitement des elements à supprimer */ - if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; - for ( ; DrawItem != NULL; DrawItem = NextDrawItem) - { - NextDrawItem = DrawItem->Next(); - if( DrawItem->m_Convert > 1 ) /* Item a effacer */ - { - if( FlagDel == 0 ) - { - if( IsOK(this, _("Delete Convert items") ) ) - { - CurrentConvert = 1; - FlagDel = 1; - } - else - { - g_AsDeMorgan = 1; - return FALSE; - } - } - m_Parent->GetScreen()->SetModify(); - DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, DrawItem, 0); - } - } - } - return TRUE; + g_AsDeMorgan = 0; return FALSE; + } + } + NextDrawItem = CopyDrawEntryStruct( this, DrawItem ); + NextDrawItem->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = NextDrawItem; + NextDrawItem->m_Convert = 2; + } + } + } + else /* Representation convertie a supprimer */ + { + /* Traitement des elements à supprimer */ + if( CurrentLibEntry ) + DrawItem = CurrentLibEntry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = NextDrawItem ) + { + NextDrawItem = DrawItem->Next(); + if( DrawItem->m_Convert > 1 ) /* Item a effacer */ + { + if( FlagDel == 0 ) + { + if( IsOK( this, _( "Delete Convert items" ) ) ) + { + CurrentConvert = 1; + FlagDel = 1; + } + else + { + g_AsDeMorgan = 1; + return FALSE; + } + } + m_Parent->GetScreen()->SetModify(); + DeleteOneLibraryDrawStruct( m_Parent->DrawPanel, + NULL, + CurrentLibEntry, + DrawItem, + 0 ); + } + } + } + return TRUE; } + /****************************************************************************/ -void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile(wxCommandEvent& event) +void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event ) /****************************************************************************/ { -wxString FullFileName; -wxString docpath(g_RealLibDirBuffer), filename; - - docpath += wxT("doc"); - docpath += STRING_DIR_SEP; - FullFileName = EDA_FileSelector(_("Doc Files"), - docpath, /* Chemin par defaut */ - wxEmptyString, /* nom fichier par defaut */ - wxEmptyString, /* extension par defaut */ - wxEmptyString, /* Masque d'affichage */ - this, - wxFD_OPEN, - TRUE - ); - if ( FullFileName.IsEmpty() ) return; + wxString FullFileName; - // Suppression du chemin par defaut pour le fichier de doc: - filename = MakeReducedFileName(FullFileName,docpath, wxEmptyString); - m_Docfile->SetValue(filename); -} + wxString docpath( g_RealLibDirBuffer ), filename; + + docpath += wxT( "doc" ); + docpath += STRING_DIR_SEP; + FullFileName = EDA_FileSelector( _( "Doc Files" ), + docpath, /* Chemin par defaut */ + wxEmptyString, /* nom fichier par defaut */ + wxEmptyString, /* extension par defaut */ + wxEmptyString, /* Masque d'affichage */ + this, + wxFD_OPEN, + TRUE + ); + if( FullFileName.IsEmpty() ) + return; + + // Suppression du chemin par defaut pour le fichier de doc: + filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString ); + m_Docfile->SetValue( filename ); +} diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index 61a97e79b2..ee93c79486 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -272,8 +272,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F if( !Failed ) { PolylineStruct->Pnext = screen->EEDrawList; - screen->EEDrawList = (EDA_BaseStruct*) - PolylineStruct; + screen->EEDrawList = (EDA_BaseStruct*) PolylineStruct; } break; @@ -441,6 +440,10 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F screen->EEDrawList = Phead; +#if defined(DEBUG) + screen->Show( 0, std::cout ); +#endif + fclose( f ); TestDanglingEnds( screen->EEDrawList, NULL ); diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index 740e06b4d6..676570fad8 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -1,6 +1,6 @@ - /***********************************/ - /* Module de calcul de la Netliste */ - /***********************************/ +/***********************************/ +/* Module de calcul de la Netliste */ +/***********************************/ #include "fctsys.h" #include "gr_basic.h" @@ -9,25 +9,26 @@ #include "libcmp.h" #include "general.h" -#include "netlist.h" /* Definitions generales liees au calcul de netliste */ +#include "netlist.h" /* Definitions generales liees au calcul de netliste */ #include "protos.h" - /* Routines locales */ static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus ); -static void SheetLabelConnection(ObjetNetListStruct *SheetLabel); -static int ListeObjetConnection(WinEDA_SchematicFrame * frame, SCH_SCREEN *screen, ObjetNetListStruct *ObjNet); -static int ConvertBusToMembers(ObjetNetListStruct *ObjNet); -static void PointToPointConnect(ObjetNetListStruct *RefObj, int IsBus, - int start); -static void SegmentToPointConnect(ObjetNetListStruct *Jonction, int IsBus, - int start); -static void LabelConnection(ObjetNetListStruct *Label); -static int TriNetCode(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2); -static void ConnectBusLabels( ObjetNetListStruct *Label, int NbItems ); -static void SetUnconnectedFlag( ObjetNetListStruct *ObjNet, int NbItems ); -static int TriBySheet(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2); +static void SheetLabelConnection( ObjetNetListStruct* SheetLabel ); +static int ListeObjetConnection( WinEDA_SchematicFrame* frame, + SCH_SCREEN* screen, + ObjetNetListStruct* ObjNet ); +static int ConvertBusToMembers( ObjetNetListStruct* ObjNet ); +static void PointToPointConnect( ObjetNetListStruct* RefObj, int IsBus, + int start ); +static void SegmentToPointConnect( ObjetNetListStruct* Jonction, int IsBus, + int start ); +static void LabelConnection( ObjetNetListStruct* Label ); +static int TriNetCode( const void* o1, const void* o2 ); +static void ConnectBusLabels( ObjetNetListStruct* Label, int NbItems ); +static void SetUnconnectedFlag( ObjetNetListStruct* ObjNet, int NbItems ); +static int TriBySheet( const void* o1, const void* o2 ); /* Variable locales */ static int FirstNumWireBus, LastNumWireBus, RootBusNameLength; @@ -35,1010 +36,1122 @@ static int LastNetCode, LastBusNetCode; static int s_PassNumber; +/***********************************************************************/ +void FreeTabNetList( ObjetNetListStruct* TabNetItems, int NbrNetItems ) +/***********************************************************************/ -/***********************************************************************/ -void FreeTabNetList(ObjetNetListStruct * TabNetItems, int NbrNetItems) -/***********************************************************************/ /* - Routine de liberation memoire des tableaux utilises pour le calcul - de la netliste - TabNetItems = pointeur sur le tableau principal (liste des items ) - NbrNetItems = nombre d'elements -*/ + * Routine de liberation memoire des tableaux utilises pour le calcul + * de la netliste + * TabNetItems = pointeur sur le tableau principal (liste des items ) + * NbrNetItems = nombre d'elements + */ { -int i; + int i; - /* Liberation memoire des strings du champ Label reserve par ConvertBusToMembers */ - for (i = 0; i < NbrNetItems; i++) - { - switch( TabNetItems[i].m_Type ) - { - case NET_PIN: - case NET_SHEETLABEL: - case NET_SEGMENT: - case NET_JONCTION: - case NET_BUS: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_PINLABEL: - case NET_NOCONNECT: - break; - case NET_GLOBBUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_BUSLABELMEMBER: - delete TabNetItems[i].m_Label; - break; - } - } + /* Liberation memoire des strings du champ Label reserve par ConvertBusToMembers */ + for( i = 0; i < NbrNetItems; i++ ) + { + switch( TabNetItems[i].m_Type ) + { + case NET_PIN: + case NET_SHEETLABEL: + case NET_SEGMENT: + case NET_JONCTION: + case NET_BUS: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_PINLABEL: + case NET_NOCONNECT: + break; - MyFree(TabNetItems); + case NET_GLOBBUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_BUSLABELMEMBER: + delete TabNetItems[i].m_Label; + break; + } + } + + MyFree( TabNetItems ); } + /*****************************************************/ -void * WinEDA_SchematicFrame::BuildNetListBase() +void* WinEDA_SchematicFrame::BuildNetListBase() /*****************************************************/ + /* Routine qui construit le tableau des elements connectes du projet - met a jour: - g_TabObjNet - g_NbrObjNet -*/ + * met a jour: + * g_TabObjNet + * g_NbrObjNet + */ { -int NetNumber, SheetNumber; -int i, istart, NetCode; -SCH_SCREEN * screen; -ObjetNetListStruct * BaseTabObjNet; -wxString msg; -wxBusyCursor Busy; + int NetNumber, SheetNumber; + int i, istart, NetCode; + SCH_SCREEN* screen; + wxString msg; + wxBusyCursor Busy; - NetNumber = 1; - s_PassNumber = 0; - MsgPanel->EraseMsgBox(); - Affiche_1_Parametre(this, 1,_("List"), wxEmptyString, LIGHTRED); + NetNumber = 1; + s_PassNumber = 0; + + MsgPanel->EraseMsgBox(); + Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, LIGHTRED ); - /* Build the screen list */ - EDA_ScreenList ScreenList(NULL); + /* Build the screen list */ + EDA_ScreenList ScreenList( NULL ); - /* 1ere passe : Comptage du nombre d'objet de Net */ - g_NbrObjNet = 0; - g_TabObjNet = NULL; /* Init pour le 1er passage dans ListeObjetConnection */ + /* 1ere passe : Comptage du nombre d'objet de Net */ + g_NbrObjNet = 0; + g_TabObjNet = NULL; /* Init pour le 1er passage dans ListeObjetConnection */ - /* Update the sheet number, sheet count and date and count nelist items */ - ScreenSch->SetModify(); - int kk = 1; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - screen->m_SheetNumber = kk++; - screen->m_NumberOfSheet = ScreenList.GetCount(); - screen->m_Date = GenDate(); - g_NbrObjNet += ListeObjetConnection(this, screen, NULL); - } + /* Update the sheet number, sheet count and date and count nelist items */ + ScreenSch->SetModify(); + int kk = 1; + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + screen->m_SheetNumber = kk++; + screen->m_NumberOfSheet = ScreenList.GetCount(); + screen->m_Date = GenDate(); + g_NbrObjNet += ListeObjetConnection( this, screen, NULL ); + } - if( g_NbrObjNet == 0 ) - { - DisplayError(this, _("No component"), 20); - return(NULL); - } + if( g_NbrObjNet == 0 ) + { + DisplayError( this, _( "No component" ), 20 ); + return NULL; + } - i = sizeof(ObjetNetListStruct) * g_NbrObjNet; - BaseTabObjNet = g_TabObjNet = (ObjetNetListStruct *) MyZMalloc(i); - if( BaseTabObjNet == NULL ) return(NULL); + i = sizeof(ObjetNetListStruct) * g_NbrObjNet; + g_TabObjNet = (ObjetNetListStruct*) MyZMalloc( i ); + if( g_TabObjNet == NULL ) + return NULL; - /* 2eme passe : Remplissage des champs des structures des objets de Net */ + /* 2eme passe : Remplissage des champs des structures des objets de Net */ - s_PassNumber ++; - Affiche_1_Parametre(this, 1,_("List"), wxEmptyString,RED); - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - g_TabObjNet += ListeObjetConnection(this, screen, g_TabObjNet ); - } + s_PassNumber++; + Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, RED ); + + screen = ScreenList.GetFirst(); + for( ObjetNetListStruct* baseTabObjNet = g_TabObjNet; + screen != NULL; screen = ScreenList.GetNext() ) + { + baseTabObjNet += ListeObjetConnection( this, screen, baseTabObjNet ); + } - Affiche_1_Parametre(this, -1, wxEmptyString,_("Done"),RED); + Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED ); - msg.Printf( wxT("%d"), g_NbrObjNet); - Affiche_1_Parametre(this, 8, _("NbItems"),msg,GREEN); + msg.Printf( wxT( "%d" ), g_NbrObjNet ); + Affiche_1_Parametre( this, 8, _( "NbItems" ), msg, GREEN ); - /* Recherche des connections pour les Segments et les Pins */ - /* Tri du Tableau des objets de Net par Sheet */ + /* Recherche des connections pour les Segments et les Pins */ + /* Tri du Tableau des objets de Net par Sheet */ - qsort(BaseTabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), - (int (*)(const void *, const void *)) TriBySheet); + qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriBySheet ); - Affiche_1_Parametre(this, 18,_("Conn"), wxEmptyString,CYAN); + Affiche_1_Parametre( this, 18, _( "Conn" ), wxEmptyString, CYAN ); - g_TabObjNet = BaseTabObjNet; - SheetNumber = g_TabObjNet[0].m_SheetNumber; - LastNetCode = LastBusNetCode = 1; - for (i = istart = 0; i < g_NbrObjNet; i++) - { - if(g_TabObjNet[i].m_SheetNumber != SheetNumber ) - { - SheetNumber = g_TabObjNet[i].m_SheetNumber; istart = i; - } + SheetNumber = g_TabObjNet[0].m_SheetNumber; + LastNetCode = LastBusNetCode = 1; + + for( i = istart = 0; i < g_NbrObjNet; i++ ) + { + if( g_TabObjNet[i].m_SheetNumber != SheetNumber ) + { + SheetNumber = g_TabObjNet[i].m_SheetNumber; istart = i; + } - switch( g_TabObjNet[i].m_Type ) - { - case NET_PIN: - case NET_PINLABEL: - case NET_SHEETLABEL: - case NET_NOCONNECT: - if ( g_TabObjNet[i].m_NetCode != 0 ) break; /* Deja connecte */ - case NET_SEGMENT: - /* Controle des connexions type point a point ( Sans BUS ) */ - if( g_TabObjNet[i].m_NetCode == 0 ) - { - g_TabObjNet[i].m_NetCode = LastNetCode; - LastNetCode++; - } - PointToPointConnect(g_TabObjNet+i, 0, istart); - break; + switch( g_TabObjNet[i].m_Type ) + { + case NET_PIN: + case NET_PINLABEL: + case NET_SHEETLABEL: + case NET_NOCONNECT: + if( g_TabObjNet[i].m_NetCode != 0 ) + break; /* Deja connecte */ - case NET_JONCTION: - /* Controle des jonction , hors BUS */ - if( g_TabObjNet[i].m_NetCode == 0 ) - { - g_TabObjNet[i].m_NetCode = LastNetCode; - LastNetCode++; - } - SegmentToPointConnect( g_TabObjNet+i, 0, istart); + case NET_SEGMENT: + /* Controle des connexions type point a point ( Sans BUS ) */ + if( g_TabObjNet[i].m_NetCode == 0 ) + { + g_TabObjNet[i].m_NetCode = LastNetCode; + LastNetCode++; + } + PointToPointConnect( g_TabObjNet + i, 0, istart ); + break; - /* Controle des jonction , sur BUS */ - if( g_TabObjNet[i].m_BusNetCode == 0 ) - { - g_TabObjNet[i].m_BusNetCode = LastBusNetCode; - LastBusNetCode++; - } - SegmentToPointConnect( g_TabObjNet+i, ISBUS, istart ); - break; + case NET_JONCTION: + /* Controle des jonction , hors BUS */ + if( g_TabObjNet[i].m_NetCode == 0 ) + { + g_TabObjNet[i].m_NetCode = LastNetCode; + LastNetCode++; + } + SegmentToPointConnect( g_TabObjNet + i, 0, istart ); - case NET_LABEL: - case NET_GLOBLABEL: - /* Controle des connexions type jonction ( Sans BUS ) */ - if( g_TabObjNet[i].m_NetCode == 0 ) - { - g_TabObjNet[i].m_NetCode = LastNetCode; - LastNetCode++; - } - SegmentToPointConnect( g_TabObjNet+i, 0, istart ); - break; + /* Controle des jonction , sur BUS */ + if( g_TabObjNet[i].m_BusNetCode == 0 ) + { + g_TabObjNet[i].m_BusNetCode = LastBusNetCode; + LastBusNetCode++; + } + SegmentToPointConnect( g_TabObjNet + i, ISBUS, istart ); + break; - case NET_SHEETBUSLABELMEMBER: - if ( g_TabObjNet[i].m_BusNetCode != 0 ) break; /* Deja connecte */ - case NET_BUS: - /* Controle des connexions type point a point mode BUS */ - if( g_TabObjNet[i].m_BusNetCode == 0 ) - { - g_TabObjNet[i].m_BusNetCode = LastBusNetCode; - LastBusNetCode++; - } - PointToPointConnect(g_TabObjNet+i, ISBUS, istart); - break; + case NET_LABEL: + case NET_GLOBLABEL: + /* Controle des connexions type jonction ( Sans BUS ) */ + if( g_TabObjNet[i].m_NetCode == 0 ) + { + g_TabObjNet[i].m_NetCode = LastNetCode; + LastNetCode++; + } + SegmentToPointConnect( g_TabObjNet + i, 0, istart ); + break; - case NET_BUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - /* Controle des connexions semblables a des sur BUS */ - if( g_TabObjNet[i].m_NetCode == 0 ) - { - g_TabObjNet[i].m_BusNetCode = LastBusNetCode; - LastBusNetCode++; - } - SegmentToPointConnect( g_TabObjNet+i, ISBUS, istart); - break; + case NET_SHEETBUSLABELMEMBER: + if( g_TabObjNet[i].m_BusNetCode != 0 ) + break; /* Deja connecte */ - } - } - Affiche_1_Parametre(this, -1, wxEmptyString,_("Done"),CYAN); + case NET_BUS: + /* Controle des connexions type point a point mode BUS */ + if( g_TabObjNet[i].m_BusNetCode == 0 ) + { + g_TabObjNet[i].m_BusNetCode = LastBusNetCode; + LastBusNetCode++; + } + PointToPointConnect( g_TabObjNet + i, ISBUS, istart ); + break; - /* Mise a jour des NetCodes des Bus Labels connectes par les Bus */ - ConnectBusLabels( g_TabObjNet, g_NbrObjNet); + case NET_BUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + /* Controle des connexions semblables a des sur BUS */ + if( g_TabObjNet[i].m_NetCode == 0 ) + { + g_TabObjNet[i].m_BusNetCode = LastBusNetCode; + LastBusNetCode++; + } + SegmentToPointConnect( g_TabObjNet + i, ISBUS, istart ); + break; + } + } - Affiche_1_Parametre(this, 26,_("Labels"), wxEmptyString,CYAN); + Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), CYAN ); - /* Connections des groupes d'objets par labels identiques */ - for (i = 0; i < g_NbrObjNet; i++) - { - switch( g_TabObjNet[i].m_Type ) - { - case NET_PIN: - case NET_SHEETLABEL: - case NET_SEGMENT: - case NET_JONCTION: - case NET_BUS: - case NET_NOCONNECT: - break; + /* Mise a jour des NetCodes des Bus Labels connectes par les Bus */ + ConnectBusLabels( g_TabObjNet, g_NbrObjNet ); - case NET_LABEL: - case NET_GLOBLABEL: - case NET_PINLABEL: - case NET_BUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - LabelConnection( g_TabObjNet+i ); - break; - case NET_SHEETBUSLABELMEMBER: - break; - } - } + Affiche_1_Parametre( this, 26, _( "Labels" ), wxEmptyString, CYAN ); - Affiche_1_Parametre(this, -1, wxEmptyString,_("Done"),CYAN); + /* Connections des groupes d'objets par labels identiques */ + for( i = 0; i < g_NbrObjNet; i++ ) + { + switch( g_TabObjNet[i].m_Type ) + { + case NET_PIN: + case NET_SHEETLABEL: + case NET_SEGMENT: + case NET_JONCTION: + case NET_BUS: + case NET_NOCONNECT: + break; + + case NET_LABEL: + case NET_GLOBLABEL: + case NET_PINLABEL: + case NET_BUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + LabelConnection( g_TabObjNet + i ); + break; + + case NET_SHEETBUSLABELMEMBER: + break; + } + } + + Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), CYAN ); - /* Connexion des hierarchies */ - Affiche_1_Parametre(this, 36,_("Hierar."), wxEmptyString,LIGHTRED); + /* Connexion des hierarchies */ + Affiche_1_Parametre( this, 36, _( "Hierar." ), wxEmptyString, LIGHTRED ); - for (i = 0; i < g_NbrObjNet; i++) - { - if( (g_TabObjNet[i].m_Type == NET_SHEETLABEL ) || - ( g_TabObjNet[i].m_Type == NET_SHEETBUSLABELMEMBER ) ) - SheetLabelConnection(g_TabObjNet + i); - } + for( i = 0; i < g_NbrObjNet; i++ ) + { + if( (g_TabObjNet[i].m_Type == NET_SHEETLABEL ) + || ( g_TabObjNet[i].m_Type == NET_SHEETBUSLABELMEMBER ) ) + SheetLabelConnection( g_TabObjNet + i ); + } - /* Tri du Tableau des objets de Net par NetCode */ - qsort(g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), - (int (*)(const void *, const void *)) TriNetCode); + /* Tri du Tableau des objets de Net par NetCode */ + qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriNetCode ); - Affiche_1_Parametre(this, -1, wxEmptyString,_("Done"),RED); + Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED ); - /* Compression des numeros de NetCode a des valeurs consecutives */ - Affiche_1_Parametre(this, 46,_("Sorting"), wxEmptyString,GREEN); - LastNetCode = NetCode = 0; - for (i = 0; i < g_NbrObjNet; i++) - { - if(g_TabObjNet[i].m_NetCode != LastNetCode) - { - NetCode++; LastNetCode = g_TabObjNet[i].m_NetCode; - } - g_TabObjNet[i].m_NetCode = NetCode; - } + /* Compression des numeros de NetCode a des valeurs consecutives */ + Affiche_1_Parametre( this, 46, _( "Sorting" ), wxEmptyString, GREEN ); + LastNetCode = NetCode = 0; + for( i = 0; i < g_NbrObjNet; i++ ) + { + if( g_TabObjNet[i].m_NetCode != LastNetCode ) + { + NetCode++; LastNetCode = g_TabObjNet[i].m_NetCode; + } + g_TabObjNet[i].m_NetCode = NetCode; + } - Affiche_1_Parametre(this, -1, wxEmptyString,_("Done"),GREEN); + Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), GREEN ); - /* Affectation du m_FlagOfConnection en fonction de connection ou non */ - SetUnconnectedFlag( BaseTabObjNet, g_NbrObjNet); + /* Affectation du m_FlagOfConnection en fonction de connection ou non */ + SetUnconnectedFlag( g_TabObjNet, g_NbrObjNet ); - return( (void*) BaseTabObjNet); + return (void*) g_TabObjNet; } + /************************************************************* -* Routine qui connecte les sous feuilles par les sheetLabels * -**************************************************************/ -static void SheetLabelConnection(ObjetNetListStruct *SheetLabel) + * Routine qui connecte les sous feuilles par les sheetLabels * + **************************************************************/ +static void SheetLabelConnection( ObjetNetListStruct* SheetLabel ) { -int i; -ObjetNetListStruct *ObjetNet; + int i; + ObjetNetListStruct* ObjetNet; - if( SheetLabel->m_NetCode == 0 ) return; + if( SheetLabel->m_NetCode == 0 ) + return; - /* Calcul du numero de sous feuille correspondante au sheetlabel */ + /* Calcul du numero de sous feuille correspondante au sheetlabel */ - /* Comparaison du SheetLabel avec les GLABELS de la sous feuille - pour regroupement des NetCodes */ - for (i = 0, ObjetNet = g_TabObjNet; i < g_NbrObjNet; i++) - { - if( ObjetNet[i].m_SheetNumber != SheetLabel->m_NumInclude ) continue; - if( (ObjetNet[i].m_Type != NET_GLOBLABEL ) && - (ObjetNet[i].m_Type != NET_GLOBBUSLABELMEMBER ) ) - continue; - if( ObjetNet[i].m_NetCode == SheetLabel->m_NetCode ) continue; - if( ObjetNet[i].m_Label->CmpNoCase(*SheetLabel->m_Label) != 0) continue; + /* Comparaison du SheetLabel avec les GLABELS de la sous feuille + * pour regroupement des NetCodes */ + for( i = 0, ObjetNet = g_TabObjNet; i < g_NbrObjNet; i++ ) + { + if( ObjetNet[i].m_SheetNumber != SheetLabel->m_NumInclude ) + continue; + + if( (ObjetNet[i].m_Type != NET_GLOBLABEL ) + && (ObjetNet[i].m_Type != NET_GLOBBUSLABELMEMBER ) ) + continue; + + if( ObjetNet[i].m_NetCode == SheetLabel->m_NetCode ) + continue; + + if( ObjetNet[i].m_Label->CmpNoCase( *SheetLabel->m_Label ) != 0 ) + continue; - /* Propagation du Netcode a tous les Objets de meme NetCode */ - if( ObjetNet[i].m_NetCode ) - PropageNetCode(ObjetNet[i].m_NetCode, SheetLabel->m_NetCode, 0); - else ObjetNet[i].m_NetCode = SheetLabel->m_NetCode; - } + /* Propagation du Netcode a tous les Objets de meme NetCode */ + if( ObjetNet[i].m_NetCode ) + PropageNetCode( ObjetNet[i].m_NetCode, SheetLabel->m_NetCode, 0 ); + else + ObjetNet[i].m_NetCode = SheetLabel->m_NetCode; + } } + /*****************************************************************************/ -static int ListeObjetConnection(WinEDA_SchematicFrame * frame, SCH_SCREEN *screen, - ObjetNetListStruct *ObjNet) +static int ListeObjetConnection( WinEDA_SchematicFrame* frame, SCH_SCREEN* screen, + ObjetNetListStruct* ObjNet ) /*****************************************************************************/ + /* Routine generant la liste des objets relatifs aux connection - entree: - screen: pointeur sur l'ecran a traiter - ObjNet: - si NULL: la routine compte seulement le nombre des objets - sinon: pointe le tableau a remplir -*/ + * entree: + * screen: pointeur sur l'ecran a traiter + * ObjNet: + * si NULL: la routine compte seulement le nombre des objets + * sinon: pointe le tableau a remplir + */ { -int ii, NbrItem = 0, NumSheet; -EDA_BaseStruct *DrawList; -EDA_SchComponentStruct *DrawLibItem; -int TransMat[2][2], PartX, PartY, x2, y2; -EDA_LibComponentStruct *Entry; -LibEDA_BaseStruct *DEntry; -DrawSheetLabelStruct *SheetLabel; -int NumInclude; + int ii, NbrItem = 0, NumSheet; + EDA_BaseStruct* DrawList; + EDA_SchComponentStruct* DrawLibItem; + int TransMat[2][2], PartX, PartY, x2, y2; + EDA_LibComponentStruct* Entry; + LibEDA_BaseStruct* DEntry; + DrawSheetLabelStruct* SheetLabel; + int NumInclude; - NumSheet = screen->m_SheetNumber; - DrawList = screen->EEDrawList; + NumSheet = screen->m_SheetNumber; + + DrawList = screen->EEDrawList; + for( ; DrawList; DrawList = DrawList->Pnext ) + { + switch( DrawList->Type() ) + { + case DRAW_SEGMENT_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (EDA_DrawLineStruct*) DrawList ) + if( ObjNet ) + { + if( (STRUCT->m_Layer != LAYER_BUS) + && (STRUCT->m_Layer != LAYER_WIRE) ) + break; - while ( DrawList ) - { - switch( DrawList->Type() ) - { - case DRAW_SEGMENT_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((EDA_DrawLineStruct *) DrawList) - if( ObjNet) - { - if ( (STRUCT->m_Layer != LAYER_BUS) && - (STRUCT->m_Layer != LAYER_WIRE) ) - break; + ObjNet[NbrItem].m_Comp = STRUCT; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start = STRUCT->m_Start; + ObjNet[NbrItem].m_End = STRUCT->m_End; + + if( STRUCT->m_Layer == LAYER_BUS ) + { + ObjNet[NbrItem].m_Type = NET_BUS; + } + else /* Cas des WIRE */ + { + ObjNet[NbrItem].m_Type = NET_SEGMENT; + } + } + NbrItem++; + break; - ObjNet[NbrItem].m_Comp = STRUCT; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start = STRUCT->m_Start; - ObjNet[NbrItem].m_End = STRUCT->m_End; - if (STRUCT->m_Layer == LAYER_BUS) - { - ObjNet[NbrItem].m_Type = NET_BUS; - } - else /* Cas des WIRE */ - { - ObjNet[NbrItem].m_Type = NET_SEGMENT; - } - } - NbrItem++; - break; + case DRAW_JUNCTION_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawJunctionStruct*) DrawList ) + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = STRUCT; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_Type = NET_JONCTION; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start = STRUCT->m_Pos; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + } + NbrItem++; + break; - case DRAW_JUNCTION_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawJunctionStruct *) DrawList) - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = STRUCT; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_Type = NET_JONCTION; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start = STRUCT->m_Pos; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - } - NbrItem++; - break; + case DRAW_NOCONNECT_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawNoConnectStruct*) DrawList ) + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = STRUCT; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_Type = NET_NOCONNECT; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start = STRUCT->m_Pos; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + } + NbrItem++; + break; - case DRAW_NOCONNECT_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawNoConnectStruct *) DrawList) - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = STRUCT; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_Type = NET_NOCONNECT; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start = STRUCT->m_Pos; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - } - NbrItem++; - break; + case DRAW_LABEL_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawLabelStruct*) DrawList ) + ii = IsBusLabel( STRUCT->m_Text ); + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = STRUCT; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_Type = NET_LABEL; + + if( STRUCT->m_Layer == LAYER_GLOBLABEL ) + ObjNet[NbrItem].m_Type = NET_GLOBLABEL; + + ObjNet[NbrItem].m_Label = &STRUCT->m_Text; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start = STRUCT->m_Pos; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + + /* Si c'est un Bus, eclatement en Label */ + if( ii ) + ConvertBusToMembers( ObjNet + NbrItem ); + } + NbrItem += ii + 1; + break; - case DRAW_LABEL_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawLabelStruct *) DrawList) - ii = IsBusLabel( STRUCT->m_Text); - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = STRUCT; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_Type = NET_LABEL; - if (STRUCT->m_Layer == LAYER_GLOBLABEL) - ObjNet[NbrItem].m_Type = NET_GLOBLABEL; - ObjNet[NbrItem].m_Label = & STRUCT->m_Text; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start = STRUCT->m_Pos; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - /* Si c'est un Bus, eclatement en Label */ - if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); - } - NbrItem += ii+1; - break; + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawGlobalLabelStruct*) DrawList ) + ii = IsBusLabel( STRUCT->m_Text ); + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = STRUCT; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_Type = NET_LABEL; + + if( STRUCT->m_Layer == LAYER_GLOBLABEL ) + ObjNet[NbrItem].m_Type = NET_GLOBLABEL; + + ObjNet[NbrItem].m_Label = &STRUCT->m_Text; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start = STRUCT->m_Pos; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + + /* Si c'est un Bus, eclatement en Label */ + if( ii ) + ConvertBusToMembers( ObjNet + NbrItem ); + } + NbrItem += ii + 1; + break; - case DRAW_GLOBAL_LABEL_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawGlobalLabelStruct *) DrawList) - ii = IsBusLabel( STRUCT->m_Text); - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = STRUCT; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_Type = NET_LABEL; - if (STRUCT->m_Layer == LAYER_GLOBLABEL) - ObjNet[NbrItem].m_Type = NET_GLOBLABEL; - ObjNet[NbrItem].m_Label = & STRUCT->m_Text; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start = STRUCT->m_Pos; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - /* Si c'est un Bus, eclatement en Label */ - if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); - } - NbrItem += ii+1; - break; + case DRAW_LIB_ITEM_STRUCT_TYPE: + DrawLibItem = (EDA_SchComponentStruct*) DrawList; + + memcpy( TransMat, DrawLibItem->m_Transform, sizeof(TransMat) ); + + PartX = DrawLibItem->m_Pos.x; + PartY = DrawLibItem->m_Pos.y; + + Entry = FindLibPart( DrawLibItem->m_ChipName, wxEmptyString, FIND_ROOT ); - case DRAW_LIB_ITEM_STRUCT_TYPE : - DrawLibItem = (EDA_SchComponentStruct *) DrawList; - memcpy(TransMat, DrawLibItem->m_Transform, sizeof(TransMat)); - PartX = DrawLibItem->m_Pos.x; PartY = DrawLibItem->m_Pos.y; - Entry = FindLibPart(DrawLibItem->m_ChipName, wxEmptyString, FIND_ROOT); + if( Entry == NULL ) + break; + + if( Entry->m_Drawings == NULL ) + break; + + DEntry = Entry->m_Drawings; + + for( ; DEntry != NULL; DEntry = DEntry->Next() ) + { + LibDrawPin* Pin = (LibDrawPin*) DEntry; + if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE ) + continue; + + if( DEntry->m_Unit + && (DEntry->m_Unit != DrawLibItem->m_Multi) ) + continue; + + if( DEntry->m_Convert + && (DEntry->m_Convert != DrawLibItem->m_Convert) ) + continue; - if( Entry == NULL) break; - if(Entry->m_Drawings == NULL) break ; - DEntry = Entry->m_Drawings; - for ( ;DEntry != NULL; DEntry = DEntry->Next()) - { - LibDrawPin * Pin = (LibDrawPin *) DEntry; - if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE) continue; - if( DEntry->m_Unit && - (DEntry->m_Unit != DrawLibItem->m_Multi) ) continue; - if( DEntry->m_Convert && - (DEntry->m_Convert != DrawLibItem->m_Convert)) continue; + x2 = PartX + TransMat[0][0] * Pin->m_Pos.x + + TransMat[0][1] * Pin->m_Pos.y; + + y2 = PartY + TransMat[1][0] * Pin->m_Pos.x + + TransMat[1][1] * Pin->m_Pos.y; - x2 = PartX + TransMat[0][0] * Pin->m_Pos.x - + TransMat[0][1] * Pin->m_Pos.y; - y2 = PartY + TransMat[1][0] * Pin->m_Pos.x - + TransMat[1][1] * Pin->m_Pos.y; + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = DEntry; + ObjNet[NbrItem].m_Type = NET_PIN; + ObjNet[NbrItem].m_Link = DrawLibItem; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_ElectricalType = Pin->m_PinType; + ObjNet[NbrItem].m_PinNum = Pin->m_PinNum; + ObjNet[NbrItem].m_Label = &Pin->m_PinName; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Start.x = x2; + ObjNet[NbrItem].m_Start.y = y2; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + } + NbrItem++; - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = DEntry; - ObjNet[NbrItem].m_Type = NET_PIN; - ObjNet[NbrItem].m_Link = DrawLibItem; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_ElectricalType = Pin->m_PinType; - ObjNet[NbrItem].m_PinNum = Pin->m_PinNum; - ObjNet[NbrItem].m_Label = & Pin->m_PinName; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Start.x = x2; - ObjNet[NbrItem].m_Start.y = y2; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - } - NbrItem++; + if( ( (int) Pin->m_PinType == (int) PIN_POWER_IN ) + && ( Pin->m_Attributs & PINNOTDRAW ) ) + { + /* Il y a un PIN_LABEL Associe */ + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = NULL; + ObjNet[NbrItem].m_Type = NET_PINLABEL; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_Label = &Pin->m_PinName; + ObjNet[NbrItem].m_Start.x = x2; + ObjNet[NbrItem].m_Start.y = y2; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + } + NbrItem++; + } + } - if( ( (int) Pin->m_PinType == (int) PIN_POWER_IN ) && - ( Pin->m_Attributs & PINNOTDRAW ) ) - { /* Il y a un PIN_LABEL Associe */ - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = NULL; - ObjNet[NbrItem].m_Type = NET_PINLABEL; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_Label = & Pin->m_PinName; - ObjNet[NbrItem].m_Start.x = x2; - ObjNet[NbrItem].m_Start.y = y2; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - } - NbrItem++; - } - } - break; + break; - case DRAW_PICK_ITEM_STRUCT_TYPE : - case DRAW_POLYLINE_STRUCT_TYPE : - case DRAW_BUSENTRY_STRUCT_TYPE : - case DRAW_MARKER_STRUCT_TYPE : - case DRAW_TEXT_STRUCT_TYPE : - break; + case DRAW_PICK_ITEM_STRUCT_TYPE: + case DRAW_POLYLINE_STRUCT_TYPE: + case DRAW_BUSENTRY_STRUCT_TYPE: + case DRAW_MARKER_STRUCT_TYPE: + case DRAW_TEXT_STRUCT_TYPE: + break; - case DRAW_SHEET_STRUCT_TYPE : - #undef STRUCT - #define STRUCT ((DrawSheetStruct *) DrawList) - NumInclude = STRUCT->m_SheetNumber; + case DRAW_SHEET_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawSheetStruct*) DrawList ) + NumInclude = STRUCT->m_SheetNumber; - SheetLabel = STRUCT->m_Label; - for ( ; SheetLabel != NULL; - SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext) - { - ii = IsBusLabel(SheetLabel->m_Text); - if( ObjNet) - { - ObjNet[NbrItem].m_Comp = SheetLabel; - ObjNet[NbrItem].m_Link = DrawList; - ObjNet[NbrItem].m_Type = NET_SHEETLABEL; - ObjNet[NbrItem].m_Screen = screen; - ObjNet[NbrItem].m_ElectricalType = SheetLabel->m_Shape; - ObjNet[NbrItem].m_Label = & SheetLabel->m_Text; - ObjNet[NbrItem].m_SheetNumber = NumSheet; - ObjNet[NbrItem].m_NumInclude = NumInclude; - ObjNet[NbrItem].m_Start = SheetLabel->m_Pos; - ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; - /* Si c'est un Bus, eclatement en Label */ - if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); - } - NbrItem += ii+1; - } - break; + SheetLabel = STRUCT->m_Label; + for( ; SheetLabel != NULL; + SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext ) + { + ii = IsBusLabel( SheetLabel->m_Text ); + if( ObjNet ) + { + ObjNet[NbrItem].m_Comp = SheetLabel; + ObjNet[NbrItem].m_Link = DrawList; + ObjNet[NbrItem].m_Type = NET_SHEETLABEL; + ObjNet[NbrItem].m_Screen = screen; + ObjNet[NbrItem].m_ElectricalType = SheetLabel->m_Shape; + ObjNet[NbrItem].m_Label = &SheetLabel->m_Text; + ObjNet[NbrItem].m_SheetNumber = NumSheet; + ObjNet[NbrItem].m_NumInclude = NumInclude; + ObjNet[NbrItem].m_Start = SheetLabel->m_Pos; + ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; + + /* Si c'est un Bus, eclatement en Label */ + if( ii ) + ConvertBusToMembers( ObjNet + NbrItem ); + } + NbrItem += ii + 1; + } - case DRAW_SHEETLABEL_STRUCT_TYPE : - DisplayError(frame, wxT("Netlist: Type DRAW_SHEETLABEL inattendu")); - break; + break; - default: - { - wxString msg; - msg.Printf( wxT("Netlist: unexpected type struct %d"), - DrawList->Type()); - DisplayError(frame, msg); - break; - } - } + case DRAW_SHEETLABEL_STRUCT_TYPE: + DisplayError( frame, wxT( "Netlist: Type DRAW_SHEETLABEL inattendu" ) ); + break; - DrawList = DrawList->Pnext; - } + default: + { + wxString msg; + msg.Printf( wxT( "Netlist: unexpected type struct %d" ), + DrawList->Type() ); + DisplayError( frame, msg ); + break; + } + } + } -return(NbrItem); + return NbrItem; } /************************************************************************/ -static void ConnectBusLabels( ObjetNetListStruct *Label, int NbItems ) +static void ConnectBusLabels( ObjetNetListStruct* Label, int NbItems ) /************************************************************************/ + /* Routine qui analyse les labels type xxBUSLABELMEMBER - Propage les Netcodes entre labels correspondants ( c'est a dire lorsque - leur numero de membre est identique) lorsqu'ils sont connectes - globalement par leur BusNetCode - Utilise et met a jour la variable LastNetCode -*/ + * Propage les Netcodes entre labels correspondants ( c'est a dire lorsque + * leur numero de membre est identique) lorsqu'ils sont connectes + * globalement par leur BusNetCode + * Utilise et met a jour la variable LastNetCode + */ { -ObjetNetListStruct *LabelInTst, *Lim; + ObjetNetListStruct* LabelInTst, * Lim; - Lim = Label + NbItems; + Lim = Label + NbItems; - for ( ; Label < Lim; Label++) - { - if( (Label->m_Type == NET_SHEETBUSLABELMEMBER) || - (Label->m_Type == NET_BUSLABELMEMBER) || - (Label->m_Type == NET_GLOBBUSLABELMEMBER) ) - { - if( Label->m_NetCode == 0 ) - { - Label->m_NetCode = LastNetCode; LastNetCode++; - } - for ( LabelInTst = Label+1; LabelInTst < Lim; LabelInTst++) - { - if( (LabelInTst->m_Type == NET_SHEETBUSLABELMEMBER) || - (LabelInTst->m_Type == NET_BUSLABELMEMBER) || - (LabelInTst->m_Type == NET_GLOBBUSLABELMEMBER) ) - { - if( LabelInTst->m_BusNetCode != Label->m_BusNetCode ) continue; - if( LabelInTst->m_Member != Label->m_Member ) continue; - if( LabelInTst->m_NetCode == 0 ) - LabelInTst->m_NetCode = Label->m_NetCode; - else - PropageNetCode( LabelInTst->m_NetCode, Label->m_NetCode,0); - } - } - } - } + for( ; Label < Lim; Label++ ) + { + if( (Label->m_Type == NET_SHEETBUSLABELMEMBER) + || (Label->m_Type == NET_BUSLABELMEMBER) + || (Label->m_Type == NET_GLOBBUSLABELMEMBER) ) + { + if( Label->m_NetCode == 0 ) + { + Label->m_NetCode = LastNetCode; + LastNetCode++; + } + + for( LabelInTst = Label + 1; LabelInTst < Lim; LabelInTst++ ) + { + if( (LabelInTst->m_Type == NET_SHEETBUSLABELMEMBER) + || (LabelInTst->m_Type == NET_BUSLABELMEMBER) + || (LabelInTst->m_Type == NET_GLOBBUSLABELMEMBER) ) + { + if( LabelInTst->m_BusNetCode != Label->m_BusNetCode ) + continue; + + if( LabelInTst->m_Member != Label->m_Member ) + continue; + + if( LabelInTst->m_NetCode == 0 ) + LabelInTst->m_NetCode = Label->m_NetCode; + else + PropageNetCode( LabelInTst->m_NetCode, Label->m_NetCode, 0 ); + } + } + } + } } /**************************************************/ -int IsBusLabel( const wxString & LabelDrawList ) +int IsBusLabel( const wxString& LabelDrawList ) /**************************************************/ /* Routine qui verifie si le Label a une notation de type Bus - Retourne 0 si non - nombre de membres si oui - met a jour FirstNumWireBus, LastNumWireBus et RootBusNameLength -*/ + * Retourne 0 si non + * nombre de membres si oui + * met a jour FirstNumWireBus, LastNumWireBus et RootBusNameLength + */ { -unsigned Num; -int ii; -wxString BufLine; -long tmp; -bool error = FALSE; + unsigned Num; + int ii; + wxString BufLine; + long tmp; + bool error = FALSE; - /* Search for '[' because a bus label is like "busname[nn..mm]" */ - ii = LabelDrawList.Find('['); - if ( ii < 0 ) return(0); - Num = (unsigned) ii; - - FirstNumWireBus = LastNumWireBus = 9; - RootBusNameLength = Num; - Num++; - while ( LabelDrawList[Num] != '.' && Num < LabelDrawList.Len()) - { - BufLine.Append(LabelDrawList[Num]); - Num++; - } + /* Search for '[' because a bus label is like "busname[nn..mm]" */ + ii = LabelDrawList.Find( '[' ); + if( ii < 0 ) + return 0; + + Num = (unsigned) ii; - if ( ! BufLine.ToLong(&tmp) ) error = TRUE;; - FirstNumWireBus = tmp; - while ( LabelDrawList[Num] == '.' && Num < LabelDrawList.Len() ) - Num++; - BufLine.Empty(); - while ( LabelDrawList[Num] != ']' && Num < LabelDrawList.Len()) - { - BufLine.Append(LabelDrawList[Num]); - Num++; - } - if ( ! BufLine.ToLong(&tmp) ) error = TRUE;; - LastNumWireBus = tmp; + FirstNumWireBus = LastNumWireBus = 9; + RootBusNameLength = Num; + Num++; + while( LabelDrawList[Num] != '.' && Num < LabelDrawList.Len() ) + { + BufLine.Append( LabelDrawList[Num] ); + Num++; + } - if( FirstNumWireBus < 0 ) FirstNumWireBus = 0; - if( LastNumWireBus < 0 ) LastNumWireBus = 0; - if( FirstNumWireBus > LastNumWireBus ) - { - EXCHG( FirstNumWireBus, LastNumWireBus); - } + if( !BufLine.ToLong( &tmp ) ) + error = TRUE; + + FirstNumWireBus = tmp; + while( LabelDrawList[Num] == '.' && Num < LabelDrawList.Len() ) + Num++; - if ( error && (s_PassNumber == 0) ) - { - wxString msg = _("Bad Bus Label: ") + LabelDrawList; - DisplayError(NULL, msg); - } - return(LastNumWireBus - FirstNumWireBus + 1 ); + BufLine.Empty(); + while( LabelDrawList[Num] != ']' && Num < LabelDrawList.Len() ) + { + BufLine.Append( LabelDrawList[Num] ); + Num++; + } + + if( !BufLine.ToLong( &tmp ) ) + error = TRUE;; + LastNumWireBus = tmp; + + if( FirstNumWireBus < 0 ) + FirstNumWireBus = 0; + if( LastNumWireBus < 0 ) + LastNumWireBus = 0; + if( FirstNumWireBus > LastNumWireBus ) + { + EXCHG( FirstNumWireBus, LastNumWireBus ); + } + + if( error && (s_PassNumber == 0) ) + { + wxString msg = _( "Bad Bus Label: " ) + LabelDrawList; + DisplayError( NULL, msg ); + } + return LastNumWireBus - FirstNumWireBus + 1; } /***************************************************************/ -static int ConvertBusToMembers(ObjetNetListStruct * BusLabel) +static int ConvertBusToMembers( ObjetNetListStruct* BusLabel ) /***************************************************************/ + /* Routine qui eclate un label type Bus en autant de Label qu'il contient de membres, - et qui cree les structures avec le type NET_GLOBBUSLABELMEMBER, NET_BUSLABELMEMBER - ou NET_SHEETBUSLABELMEMBER - entree = pointeur sur l'ObjetNetListStruct initialise corresp au buslabel - suppose que FirstNumWireBus, LastNumWireBus et RootBusNameLength sont a jour - modifie l'ObjetNetListStruct de base et remplit les suivants - m_Label is a pointer to a new wxString - m_Label must be deallocated by the user (only for a NET_GLOBBUSLABELMEMBER, - NET_BUSLABELMEMBER or a NET_SHEETBUSLABELMEMBER object type) -*/ + * et qui cree les structures avec le type NET_GLOBBUSLABELMEMBER, NET_BUSLABELMEMBER + * ou NET_SHEETBUSLABELMEMBER + * entree = pointeur sur l'ObjetNetListStruct initialise corresp au buslabel + * suppose que FirstNumWireBus, LastNumWireBus et RootBusNameLength sont a jour + * modifie l'ObjetNetListStruct de base et remplit les suivants + * m_Label is a pointer to a new wxString + * m_Label must be deallocated by the user (only for a NET_GLOBBUSLABELMEMBER, + * NET_BUSLABELMEMBER or a NET_SHEETBUSLABELMEMBER object type) + */ { -int NumItem, BusMember; -wxString BufLine; + int NumItem, BusMember; + wxString BufLine; - if( BusLabel->m_Type == NET_GLOBLABEL ) - BusLabel->m_Type = NET_GLOBBUSLABELMEMBER; - else if (BusLabel->m_Type == NET_SHEETLABEL) - BusLabel->m_Type = NET_SHEETBUSLABELMEMBER; - else BusLabel->m_Type = NET_BUSLABELMEMBER; + if( BusLabel->m_Type == NET_GLOBLABEL ) + BusLabel->m_Type = NET_GLOBBUSLABELMEMBER; + else if( BusLabel->m_Type == NET_SHEETLABEL ) + BusLabel->m_Type = NET_SHEETBUSLABELMEMBER; + else + BusLabel->m_Type = NET_BUSLABELMEMBER; - /* Convertion du BusLabel en la racine du Label + le numero du fil */ - BufLine = BusLabel->m_Label->Left(RootBusNameLength); - BusMember = FirstNumWireBus; - BufLine << BusMember; - BusLabel->m_Label = new wxString(BufLine); - BusLabel->m_Member = BusMember; - NumItem = 1; + /* Convertion du BusLabel en la racine du Label + le numero du fil */ + BufLine = BusLabel->m_Label->Left( RootBusNameLength ); + BusMember = FirstNumWireBus; + BufLine << BusMember; + BusLabel->m_Label = new wxString( BufLine ); - for ( BusMember++; BusMember <= LastNumWireBus; BusMember++) - { - *(BusLabel+1) = *BusLabel; BusLabel ++; NumItem++; - /* Convertion du BusLabel en la racine du Label + le numero du fil */ - BufLine = BusLabel->m_Label->Left(RootBusNameLength); - BufLine << BusMember; - BusLabel->m_Label = new wxString(BufLine); - BusLabel->m_Member = BusMember; - } - return( NumItem); + BusLabel->m_Member = BusMember; + NumItem = 1; + + for( BusMember++; BusMember <= LastNumWireBus; BusMember++ ) + { + *(BusLabel + 1) = *BusLabel; BusLabel++; NumItem++; + + /* Convertion du BusLabel en la racine du Label + le numero du fil */ + BufLine = BusLabel->m_Label->Left( RootBusNameLength ); + BufLine << BusMember; + BusLabel->m_Label = new wxString( BufLine ); + + BusLabel->m_Member = BusMember; + } + + return NumItem; } + /**********************************************************************/ static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus ) /**********************************************************************/ + /* PropageNetCode propage le netcode NewNetCode sur tous les elements - appartenant a l'ancien netcode OldNetCode - Si IsBus == 0; c'est le membre NetCode qui est propage - Si IsBus != 0; c'est le membre BusNetCode qui est propage -*/ + * appartenant a l'ancien netcode OldNetCode + * Si IsBus == 0; c'est le membre NetCode qui est propage + * Si IsBus != 0; c'est le membre BusNetCode qui est propage + */ { -int jj; -ObjetNetListStruct * Objet = g_TabObjNet; + int jj; + ObjetNetListStruct* Objet = g_TabObjNet; - if( OldNetCode == NewNetCode ) return; + if( OldNetCode == NewNetCode ) + return; - if( IsBus == 0 ) /* Propagation du NetCode */ - { - for (jj = 0; jj < g_NbrObjNet; jj++, Objet++) - { - if ( Objet->m_NetCode == OldNetCode ) - { - Objet->m_NetCode = NewNetCode; - } - } - } - - else /* Propagation du BusNetCode */ - { - for (jj = 0; jj < g_NbrObjNet; jj++, Objet++) - { - if ( Objet->m_BusNetCode == OldNetCode ) - { - Objet->m_BusNetCode = NewNetCode; - } - } - } + if( IsBus == 0 ) /* Propagation du NetCode */ + { + for( jj = 0; jj < g_NbrObjNet; jj++, Objet++ ) + { + if( Objet->m_NetCode == OldNetCode ) + { + Objet->m_NetCode = NewNetCode; + } + } + } + else /* Propagation du BusNetCode */ + { + for( jj = 0; jj < g_NbrObjNet; jj++, Objet++ ) + { + if( Objet->m_BusNetCode == OldNetCode ) + { + Objet->m_BusNetCode = NewNetCode; + } + } + } } + /***************************************************************************/ -static void PointToPointConnect(ObjetNetListStruct *Ref, int IsBus, int start) +static void PointToPointConnect( ObjetNetListStruct* Ref, int IsBus, int start ) /***************************************************************************/ + /* Routine qui verifie si l'element *Ref est connecte a - d'autres elements de la liste des objets du schema, selon le mode Point - a point ( Extremites superposees ) - - si IsBus: - la connexion ne met en jeu que des elements type bus - ( BUS ou BUSLABEL ou JONCTION ) - sinon - la connexion ne met en jeu que des elements type non bus - ( autres que BUS ou BUSLABEL ) - - L'objet Ref doit avoir un NetCode valide. - - La liste des objets est supposee classe par NumSheet Croissants, - et la recherche se fait a partir de l'element start, 1er element - de la feuille de schema -( il ne peut y avoir connexion physique entre elements de differentes sheets) -*/ + * d'autres elements de la liste des objets du schema, selon le mode Point + * a point ( Extremites superposees ) + * + * si IsBus: + * la connexion ne met en jeu que des elements type bus + * ( BUS ou BUSLABEL ou JONCTION ) + * sinon + * la connexion ne met en jeu que des elements type non bus + * ( autres que BUS ou BUSLABEL ) + * + * L'objet Ref doit avoir un NetCode valide. + * + * La liste des objets est supposee classe par NumSheet Croissants, + * et la recherche se fait a partir de l'element start, 1er element + * de la feuille de schema + * ( il ne peut y avoir connexion physique entre elements de differentes sheets) + */ { -int i, NetCode; -ObjetNetListStruct *Point = g_TabObjNet; + int i, NetCode; + ObjetNetListStruct* Point = g_TabObjNet; -if ( IsBus == 0 ) /* Objets autres que BUS et BUSLABELS */ - { - NetCode = Ref->m_NetCode; - for (i = start; i < g_NbrObjNet; i++) - { - if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) break; + if( IsBus == 0 ) /* Objets autres que BUS et BUSLABELS */ + { + NetCode = Ref->m_NetCode; + for( i = start; i < g_NbrObjNet; i++ ) + { + if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) + break; - switch( Point[i].m_Type ) - { - case NET_SEGMENT: - case NET_PIN: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_SHEETLABEL: - case NET_PINLABEL: - case NET_JONCTION: - case NET_NOCONNECT: - if( (((Ref->m_Start.x == Point[i].m_Start.x) && (Ref->m_Start.y == Point[i].m_Start.y))) || - (((Ref->m_Start.x == Point[i].m_End.x) && (Ref->m_Start.y == Point[i].m_End.y))) || - (((Ref->m_End.x == Point[i].m_Start.x) && (Ref->m_End.y == Point[i].m_Start.y))) || - (((Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y))) ) - { - if( Point[i].m_NetCode == 0 ) Point[i].m_NetCode = NetCode; - else PropageNetCode( Point[i].m_NetCode, NetCode , 0); - } - break; - case NET_BUS: - case NET_BUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - break; - } - } - } -else /* Objets type BUS et BUSLABELS ( et JONCTIONS )*/ - { - NetCode = Ref->m_BusNetCode; - for (i = start; i < g_NbrObjNet; i++) - { - if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) break; + switch( Point[i].m_Type ) + { + case NET_SEGMENT: + case NET_PIN: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_SHEETLABEL: + case NET_PINLABEL: + case NET_JONCTION: + case NET_NOCONNECT: + if( ( ( (Ref->m_Start.x == Point[i].m_Start.x) && + (Ref->m_Start.y == Point[i].m_Start.y) ) ) + || ( ( (Ref->m_Start.x == Point[i].m_End.x) && + (Ref->m_Start.y == Point[i].m_End.y) ) ) + || ( ( (Ref->m_End.x == Point[i].m_Start.x) && + (Ref->m_End.y == Point[i].m_Start.y) ) ) + || ( ( (Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y) ) ) ) + { + if( Point[i].m_NetCode == 0 ) + Point[i].m_NetCode = NetCode; + else + PropageNetCode( Point[i].m_NetCode, NetCode, 0 ); + } + break; - switch( Point[i].m_Type ) - { - case NET_SEGMENT: - case NET_PIN: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_SHEETLABEL: - case NET_PINLABEL: - case NET_NOCONNECT: - break; + case NET_BUS: + case NET_BUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + break; + } + } + } + else /* Objets type BUS et BUSLABELS ( et JONCTIONS )*/ + { + NetCode = Ref->m_BusNetCode; + for( i = start; i < g_NbrObjNet; i++ ) + { + if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) + break; - case NET_BUS: - case NET_BUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - case NET_JONCTION: - if( (((Ref->m_Start.x == Point[i].m_Start.x) && (Ref->m_Start.y == Point[i].m_Start.y))) || - (((Ref->m_Start.x == Point[i].m_End.x) && (Ref->m_Start.y == Point[i].m_End.y))) || - (((Ref->m_End.x == Point[i].m_Start.x) && (Ref->m_End.y == Point[i].m_Start.y))) || - (((Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y))) ) - { - if( Point[i].m_BusNetCode == 0 ) - Point[i].m_BusNetCode = NetCode; - else PropageNetCode( Point[i].m_BusNetCode, NetCode,1 ); - } - break; - } - } - } + switch( Point[i].m_Type ) + { + case NET_SEGMENT: + case NET_PIN: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_SHEETLABEL: + case NET_PINLABEL: + case NET_NOCONNECT: + break; + + case NET_BUS: + case NET_BUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + case NET_JONCTION: + if( ( ( (Ref->m_Start.x == Point[i].m_Start.x) && + (Ref->m_Start.y == Point[i].m_Start.y) ) ) + || ( ( (Ref->m_Start.x == Point[i].m_End.x) && + (Ref->m_Start.y == Point[i].m_End.y) ) ) + || ( ( (Ref->m_End.x == Point[i].m_Start.x) && + (Ref->m_End.y == Point[i].m_Start.y) ) ) + || ( ( (Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y) ) ) ) + { + if( Point[i].m_BusNetCode == 0 ) + Point[i].m_BusNetCode = NetCode; + else + PropageNetCode( Point[i].m_BusNetCode, NetCode, 1 ); + } + break; + } + } + } } /**************************************************************/ -static void SegmentToPointConnect(ObjetNetListStruct *Jonction, - int IsBus, int start) +static void SegmentToPointConnect( ObjetNetListStruct* Jonction, + int IsBus, int start ) /***************************************************************/ + /* -Routine qui recherche si un point (jonction) est connecte a des segments, -et regroupe les NetCodes des objets connectes a la jonction. -Le point de jonction doit avoir un netcode valide - La liste des objets est supposee classe par NumSheet Croissants, - et la recherche se fait a partir de l'element start, 1er element - de la feuille de schema -( il ne peut y avoir connexion physique entre elements de differentes sheets) -*/ + * Routine qui recherche si un point (jonction) est connecte a des segments, + * et regroupe les NetCodes des objets connectes a la jonction. + * Le point de jonction doit avoir un netcode valide + * La liste des objets est supposee classe par NumSheet Croissants, + * et la recherche se fait a partir de l'element start, 1er element + * de la feuille de schema + * ( il ne peut y avoir connexion physique entre elements de differentes sheets) + */ { -int i; -ObjetNetListStruct *Segment = g_TabObjNet; + int i; + ObjetNetListStruct* Segment = g_TabObjNet; - for (i = start; i < g_NbrObjNet; i++) - { - if( Segment[i].m_SheetNumber > Jonction->m_SheetNumber ) break; + for( i = start; i < g_NbrObjNet; i++ ) + { + if( Segment[i].m_SheetNumber > Jonction->m_SheetNumber ) + break; - if( IsBus == 0) - { - if ( Segment[i].m_Type != NET_SEGMENT ) continue; - } - else - { - if ( Segment[i].m_Type != NET_BUS ) continue; - } + if( IsBus == 0 ) + { + if( Segment[i].m_Type != NET_SEGMENT ) + continue; + } + else + { + if( Segment[i].m_Type != NET_BUS ) + continue; + } - if ( SegmentIntersect(Segment[i].m_Start.x, Segment[i].m_Start.y, - Segment[i].m_End.x, Segment[i].m_End.y, - Jonction->m_Start.x, Jonction->m_Start.y) ) - { - /* Propagation du Netcode a tous les Objets de meme NetCode */ - if( IsBus == 0 ) - { - if( Segment[i].m_NetCode ) - PropageNetCode(Segment[i].m_NetCode, - Jonction->m_NetCode, IsBus); - else Segment[i].m_NetCode = Jonction->m_NetCode; - } - else - { - if( Segment[i].m_BusNetCode ) - PropageNetCode(Segment[i].m_BusNetCode, - Jonction->m_BusNetCode, IsBus); - else Segment[i].m_BusNetCode = Jonction->m_BusNetCode; - } - } - } + if( SegmentIntersect( Segment[i].m_Start.x, Segment[i].m_Start.y, + Segment[i].m_End.x, Segment[i].m_End.y, + Jonction->m_Start.x, Jonction->m_Start.y ) ) + { + /* Propagation du Netcode a tous les Objets de meme NetCode */ + if( IsBus == 0 ) + { + if( Segment[i].m_NetCode ) + PropageNetCode( Segment[i].m_NetCode, + Jonction->m_NetCode, IsBus ); + else + Segment[i].m_NetCode = Jonction->m_NetCode; + } + else + { + if( Segment[i].m_BusNetCode ) + PropageNetCode( Segment[i].m_BusNetCode, + Jonction->m_BusNetCode, IsBus ); + else + Segment[i].m_BusNetCode = Jonction->m_BusNetCode; + } + } + } } + /***************************************************************** -* Routine qui connecte les groupes d'objets si labels identiques * -*******************************************************************/ -static void LabelConnection(ObjetNetListStruct *LabelRef) + * Routine qui connecte les groupes d'objets si labels identiques * + *******************************************************************/ +static void LabelConnection( ObjetNetListStruct* LabelRef ) { -int i, NetCode; -ObjetNetListStruct *ObjetNet; + int i, NetCode; + ObjetNetListStruct* ObjetNet; - if( LabelRef->m_NetCode == 0 ) return; + if( LabelRef->m_NetCode == 0 ) + return; - ObjetNet = g_TabObjNet; + ObjetNet = g_TabObjNet; - for (i = 0; i < g_NbrObjNet; i++) - { - NetCode = ObjetNet[i].m_NetCode; - if( NetCode == LabelRef->m_NetCode ) continue; + for( i = 0; i < g_NbrObjNet; i++ ) + { + NetCode = ObjetNet[i].m_NetCode; + if( NetCode == LabelRef->m_NetCode ) + continue; - if( ObjetNet[i].m_SheetNumber != LabelRef->m_SheetNumber ) - { - if (ObjetNet[i].m_Type != NET_PINLABEL ) continue; - } + if( ObjetNet[i].m_SheetNumber != LabelRef->m_SheetNumber ) + { + if( ObjetNet[i].m_Type != NET_PINLABEL ) + continue; + } - if( (ObjetNet[i].m_Type == NET_LABEL ) || - (ObjetNet[i].m_Type == NET_GLOBLABEL ) || - (ObjetNet[i].m_Type == NET_BUSLABELMEMBER ) || - (ObjetNet[i].m_Type == NET_GLOBBUSLABELMEMBER ) || - (ObjetNet[i].m_Type == NET_PINLABEL ) ) - { - if( ObjetNet[i].m_Label->CmpNoCase(*LabelRef->m_Label) != 0) continue; + if( (ObjetNet[i].m_Type == NET_LABEL ) + || (ObjetNet[i].m_Type == NET_GLOBLABEL ) + || (ObjetNet[i].m_Type == NET_BUSLABELMEMBER ) + || (ObjetNet[i].m_Type == NET_GLOBBUSLABELMEMBER ) + || (ObjetNet[i].m_Type == NET_PINLABEL ) ) + { + if( ObjetNet[i].m_Label->CmpNoCase( *LabelRef->m_Label ) != 0 ) + continue; - /* Ici 2 labels identiques */ + /* Ici 2 labels identiques */ - /* Propagation du Netcode a tous les Objets de meme NetCode */ - if( ObjetNet[i].m_NetCode ) - PropageNetCode(ObjetNet[i].m_NetCode, LabelRef->m_NetCode, 0); - else ObjetNet[i].m_NetCode = LabelRef->m_NetCode; - } - } + /* Propagation du Netcode a tous les Objets de meme NetCode */ + if( ObjetNet[i].m_NetCode ) + PropageNetCode( ObjetNet[i].m_NetCode, LabelRef->m_NetCode, 0 ); + else + ObjetNet[i].m_NetCode = LabelRef->m_NetCode; + } + } } +/****************************************************************************/ +static int TriNetCode( const void* o1, const void* o2 ) +/****************************************************************************/ -/****************************************************************************/ -static int TriNetCode(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2) -/****************************************************************************/ /* Routine de comparaison pour le tri par NetCode croissant - du tableau des elements connectes ( TabPinSort ) par qsort() -*/ + * du tableau des elements connectes ( TabPinSort ) par qsort() + */ { - return (Objet1->m_NetCode - Objet2->m_NetCode); + ObjetNetListStruct* Objet1 = (ObjetNetListStruct*) o1; + ObjetNetListStruct* Objet2 = (ObjetNetListStruct*) o2; + + return Objet1->m_NetCode - Objet2->m_NetCode; } + /*****************************************************************************/ -static int TriBySheet(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2) +static int TriBySheet( const void* o1, const void* o2 ) /*****************************************************************************/ + /* Routine de comparaison pour le tri par NumSheet - du tableau des elements connectes ( TabPinSort ) par qsort() */ + * du tableau des elements connectes ( TabPinSort ) par qsort() */ { - return (Objet1->m_SheetNumber - Objet2->m_SheetNumber); + ObjetNetListStruct* Objet1 = (ObjetNetListStruct*) o1; + ObjetNetListStruct* Objet2 = (ObjetNetListStruct*) o2; + + return Objet1->m_SheetNumber - Objet2->m_SheetNumber; } /**********************************************************************/ -static void SetUnconnectedFlag( ObjetNetListStruct *ListObj, int NbItems ) +static void SetUnconnectedFlag( ObjetNetListStruct* ListObj, int NbItems ) /**********************************************************************/ + /* Routine positionnant le membre .FlagNoConnect des elements de - la liste des objets netliste, tries par ordre de NetCode -*/ + * la liste des objets netliste, tries par ordre de NetCode + */ { -ObjetNetListStruct * NetItemRef, * NetItemTst, *ItemPtr; -ObjetNetListStruct * NetStart, * NetEnd, * Lim; -int Nb; -IsConnectType StateFlag; + ObjetNetListStruct* NetItemRef, * NetItemTst, * ItemPtr; + ObjetNetListStruct* NetStart, * NetEnd, * Lim; + int Nb; + IsConnectType StateFlag; - NetStart = NetEnd = ListObj; - Lim = ListObj + NbItems; - NetItemRef = NetStart; - Nb = 0; StateFlag = UNCONNECT; + NetStart = NetEnd = ListObj; + NetItemRef = NetStart; + Nb = 0; + StateFlag = UNCONNECT; - for ( ; NetItemRef < Lim; NetItemRef++ ) - { - if( NetItemRef->m_Type == NET_NOCONNECT ) - if( StateFlag != CONNECT ) StateFlag = NOCONNECT; + Lim = ListObj + NbItems; + for( ; NetItemRef < Lim; NetItemRef++ ) + { + if( NetItemRef->m_Type == NET_NOCONNECT ) + if( StateFlag != CONNECT ) + StateFlag = NOCONNECT; - /* Analyse du net en cours */ - NetItemTst = NetItemRef + 1; + /* Analyse du net en cours */ + NetItemTst = NetItemRef + 1; - if( (NetItemTst >= Lim) || - (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) - { /* Net analyse: mise a jour de m_FlagOfConnection */ - NetEnd = NetItemTst; + if( (NetItemTst >= Lim) + || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) + { + /* Net analyse: mise a jour de m_FlagOfConnection */ + NetEnd = NetItemTst; - for( ItemPtr = NetStart; ItemPtr < NetEnd; ItemPtr++ ) - { - ItemPtr->m_FlagOfConnection = StateFlag; - } - if(NetItemTst >= Lim) return; + for( ItemPtr = NetStart; ItemPtr < NetEnd; ItemPtr++ ) + { + ItemPtr->m_FlagOfConnection = StateFlag; + } - /* Start Analyse Nouveau Net */ - StateFlag = UNCONNECT; - NetStart = NetItemTst; - continue; - } + if( NetItemTst >= Lim ) + return; - for ( ; ; NetItemTst ++) - { - if( (NetItemTst >= Lim) || - (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) - break; + /* Start Analyse Nouveau Net */ + StateFlag = UNCONNECT; + NetStart = NetItemTst; + continue; + } - switch( NetItemTst->m_Type ) - { - case NET_SEGMENT: - case NET_LABEL: - case NET_GLOBLABEL: - case NET_SHEETLABEL: - case NET_PINLABEL: - case NET_BUS: - case NET_BUSLABELMEMBER: - case NET_SHEETBUSLABELMEMBER: - case NET_GLOBBUSLABELMEMBER: - case NET_JONCTION: - break; + for( ; ; NetItemTst++ ) + { + if( (NetItemTst >= Lim) + || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) + break; - case NET_PIN: - if( NetItemRef->m_Type == NET_PIN ) - StateFlag = CONNECT; - break; + switch( NetItemTst->m_Type ) + { + case NET_SEGMENT: + case NET_LABEL: + case NET_GLOBLABEL: + case NET_SHEETLABEL: + case NET_PINLABEL: + case NET_BUS: + case NET_BUSLABELMEMBER: + case NET_SHEETBUSLABELMEMBER: + case NET_GLOBBUSLABELMEMBER: + case NET_JONCTION: + break; - case NET_NOCONNECT: - if( StateFlag != CONNECT ) StateFlag = NOCONNECT; - break; - } - } - } + case NET_PIN: + if( NetItemRef->m_Type == NET_PIN ) + StateFlag = CONNECT; + break; + + case NET_NOCONNECT: + if( StateFlag != CONNECT ) + StateFlag = NOCONNECT; + break; + } + } + } } - diff --git a/eeschema/netlist.h b/eeschema/netlist.h index f553902b07..d9dc6d1244 100644 --- a/eeschema/netlist.h +++ b/eeschema/netlist.h @@ -1,6 +1,6 @@ - /**********************************************/ - /* Module de calcul de la Netliste: netlist.h */ - /**********************************************/ +/**********************************************/ +/* Module de calcul de la Netliste: netlist.h */ +/**********************************************/ #ifndef _NETLIST_H_ #define _NETLIST_H_ @@ -15,98 +15,99 @@ /* Indicateurs de type de netliste generee */ -typedef enum - { - NET_TYPE_NOT_INIT = 0, - NET_TYPE_PCBNEW, - NET_TYPE_ORCADPCB2, - NET_TYPE_CADSTAR, - NET_TYPE_SPICE, - NET_TYPE_CUSTOM1, - NET_TYPE_CUSTOM2, - NET_TYPE_CUSTOM3, - NET_TYPE_CUSTOM4, - NET_TYPE_CUSTOM5, - NET_TYPE_CUSTOM6, - NET_TYPE_CUSTOM7, - NET_TYPE_CUSTOM8, - NET_TYPE_MAX - } TypeNetForm ; +typedef enum { + NET_TYPE_NOT_INIT = 0, + NET_TYPE_PCBNEW, + NET_TYPE_ORCADPCB2, + NET_TYPE_CADSTAR, + NET_TYPE_SPICE, + NET_TYPE_CUSTOM1, + NET_TYPE_CUSTOM2, + NET_TYPE_CUSTOM3, + NET_TYPE_CUSTOM4, + NET_TYPE_CUSTOM5, + NET_TYPE_CUSTOM6, + NET_TYPE_CUSTOM7, + NET_TYPE_CUSTOM8, + NET_TYPE_MAX +} TypeNetForm; /* Max pin number per component and footprint */ #define MAXPIN 5000 -typedef enum { /* Type des objets de Net */ - NET_SEGMENT, - NET_BUS, - NET_JONCTION, - NET_LABEL, - NET_GLOBLABEL, - NET_BUSLABELMEMBER, - NET_GLOBBUSLABELMEMBER, - NET_SHEETBUSLABELMEMBER, - NET_SHEETLABEL, - NET_PINLABEL, - NET_PIN, - NET_NOCONNECT +typedef enum { /* Type des objets de Net */ + NET_SEGMENT, + NET_BUS, + NET_JONCTION, + NET_LABEL, + NET_GLOBLABEL, + NET_BUSLABELMEMBER, + NET_GLOBBUSLABELMEMBER, + NET_SHEETBUSLABELMEMBER, + NET_SHEETLABEL, + NET_PINLABEL, + NET_PIN, + NET_NOCONNECT } NetObjetType; -typedef enum { /* Valeur du Flag de connection */ - UNCONNECT, /* Pin ou Label non connecte */ - NOCONNECT, /* Pin volontairement non connectee (Symb. NoConnect utilise) */ - CONNECT /* connexion normale */ +typedef enum { /* Valeur du Flag de connection */ + UNCONNECT, /* Pin ou Label non connecte */ + NOCONNECT, /* Pin volontairement non connectee (Symb. NoConnect utilise) */ + CONNECT /* connexion normale */ } IsConnectType; + /* Structure decrivant 1 element de connexion (pour netlist ) */ class ObjetNetListStruct { public: - void * m_Comp; /* Pointeur sur la definition de l'objet */ - void * m_Link; /* Pour SheetLabelStruct: Pointeur sur la feuille de hierarchie - Pour les Pins: pointeur sur le composant */ - int m_Flag; /* flag pour calculs internes */ - SCH_SCREEN * m_Screen; /* Ecran d'appartenance */ - NetObjetType m_Type; - int m_ElectricalType; /* Pour Pins et sheet labels: type electrique */ - int m_NetCode; /* pour elements simples */ - int m_BusNetCode; /* pour connexions type bus */ - int m_Member; /* pour les labels type BUSWIRE ( labels de bus eclate ) - numero de membre */ - IsConnectType m_FlagOfConnection; - int m_SheetNumber; /* Sheet number for this item */ - int m_NumInclude; /* Numero de sous schema correpondant a la sheet (Gestion des GLabels et Pin Sheet)*/ - long m_PinNum; /* numero de pin( 4 octets -> 4 codes ascii) */ - const wxString * m_Label; /* Tous types Labels:pointeur sur la wxString definissant le label */ - wxPoint m_Start, m_End; + void* m_Comp; /* Pointeur sur la definition de l'objet */ + void* m_Link; /* Pour SheetLabelStruct: Pointeur sur la feuille de hierarchie + * Pour les Pins: pointeur sur le composant */ + int m_Flag; /* flag pour calculs internes */ + SCH_SCREEN* m_Screen; /* Ecran d'appartenance */ + NetObjetType m_Type; + int m_ElectricalType; /* Pour Pins et sheet labels: type electrique */ + int m_NetCode; /* pour elements simples */ + int m_BusNetCode; /* pour connexions type bus */ + int m_Member; /* pour les labels type BUSWIRE ( labels de bus eclate ) + * numero de membre */ + IsConnectType m_FlagOfConnection; + int m_SheetNumber; /* Sheet number for this item */ + int m_NumInclude; /* Numero de sous schema correpondant a la sheet (Gestion des GLabels et Pin Sheet)*/ + long m_PinNum; /* numero de pin( 4 octets -> 4 codes ascii) */ + const wxString* m_Label; /* Tous types Labels:pointeur sur la wxString definissant le label */ + wxPoint m_Start, m_End; }; + /* Structure decrivant 1 composant de la schematique (pour annotation ) */ struct CmpListStruct { public: - EDA_SchComponentStruct * m_Cmp; /* Pointeur sur le composant */ - int m_NbParts; /* Nombre de parts par boitier */ - bool m_PartsLocked; // For multi part components: True if the part cannot be changed - int m_Unit; /* Numero de part */ - int m_Sheet; /* Numero de hierarchie */ - unsigned long m_TimeStamp; /* Signature temporelle */ - int m_IsNew; /* != 0 pour composants non annotes */ - char m_TextValue[32]; /* Valeur */ - char m_TextRef[32]; /* Reference ( hors numero ) */ - int m_NumRef; /* Numero de reference */ - int m_Flag; /* flag pour calculs internes */ - wxPoint m_Pos; /* position components */ + EDA_SchComponentStruct* m_Cmp; /* Pointeur sur le composant */ + int m_NbParts; /* Nombre de parts par boitier */ + bool m_PartsLocked; // For multi part components: True if the part cannot be changed + int m_Unit; /* Numero de part */ + int m_Sheet; /* Numero de hierarchie */ + unsigned long m_TimeStamp; /* Signature temporelle */ + int m_IsNew; /* != 0 pour composants non annotes */ + char m_TextValue[32]; /* Valeur */ + char m_TextRef[32]; /* Reference ( hors numero ) */ + int m_NumRef; /* Numero de reference */ + int m_Flag; /* flag pour calculs internes */ + wxPoint m_Pos; /* position components */ }; /* Global Variables */ eda_global int g_NbrObjNet; -eda_global ObjetNetListStruct *g_TabObjNet; +eda_global ObjetNetListStruct* g_TabObjNet; /* Prototypes: */ -void WriteNetList(WinEDA_SchematicFrame * frame, const wxString & FileNameNL, bool use_netnames); -void FreeTabNetList(ObjetNetListStruct * TabNetItems, int NbrNetItems); +void WriteNetList( WinEDA_SchematicFrame* frame, const wxString& FileNameNL, bool use_netnames ); +void FreeTabNetList( ObjetNetListStruct* TabNetItems, int NbrNetItems ); #endif diff --git a/eeschema/program.h b/eeschema/program.h index 80addfff38..0d84e4cffa 100644 --- a/eeschema/program.h +++ b/eeschema/program.h @@ -75,9 +75,10 @@ public: public: EDA_DrawLineStruct( const wxPoint& pos, int layer ); ~EDA_DrawLineStruct() { } + virtual wxString GetClass() const { - return wxT( "EDA_DrawLineStruct" ); + return wxT( "EDA_DrawLine" ); } @@ -92,6 +93,17 @@ public: virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ + void Show( int nestLevel, std::ostream& os ); +#endif }; @@ -108,7 +120,7 @@ public: ~DrawMarkerStruct(); virtual wxString GetClass() const { - return wxT( "DrawMarkerStruct" ); + return wxT( "DrawMarker" ); } @@ -116,6 +128,16 @@ public: wxString GetComment(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ + void Show( int nestLevel, std::ostream& os ); +#endif }; @@ -129,7 +151,7 @@ public: ~DrawNoConnectStruct() { } virtual wxString GetClass() const { - return wxT( "DrawNoConnectStruct" ); + return wxT( "DrawNoConnect" ); } @@ -154,9 +176,10 @@ public: public: DrawBusEntryStruct( const wxPoint& pos, int shape, int id ); ~DrawBusEntryStruct() { } + virtual wxString GetClass() const { - return wxT( "DrawBusEntryStruct" ); + return wxT( "DrawBusEntry" ); } @@ -177,9 +200,10 @@ public: public: DrawPolylineStruct( int layer ); ~DrawPolylineStruct(); + virtual wxString GetClass() const { - return wxT( "DrawPolylineStruct" ); + return wxT( "DrawPolyline" ); } @@ -197,9 +221,10 @@ public: public: DrawJunctionStruct( const wxPoint& pos ); ~DrawJunctionStruct() { } + virtual wxString GetClass() const { - return wxT( "DrawJunctionStruct" ); + return wxT( "DrawJunction" ); } @@ -209,8 +234,7 @@ public: }; -class DrawTextStruct : public EDA_BaseStruct - , public EDA_TextStruct +class DrawTextStruct : public EDA_BaseStruct, public EDA_TextStruct { public: int m_Layer; @@ -224,7 +248,7 @@ public: virtual wxString GetClass() const { - return wxT( "DrawTextStruct" ); + return wxT( "DrawText" ); } @@ -248,7 +272,7 @@ public: virtual wxString GetClass() const { - return wxT( "DrawLabelStruct" ); + return wxT( "DrawLabel" ); } }; @@ -264,7 +288,7 @@ public: virtual wxString GetClass() const { - return wxT( "DrawGlobalLabelStruct" ); + return wxT( "DrawGlobalLabel" ); } }; diff --git a/eeschema/protos.h b/eeschema/protos.h index 8267b5a153..52b71784c5 100644 --- a/eeschema/protos.h +++ b/eeschema/protos.h @@ -8,7 +8,7 @@ LibEDA_BaseStruct * LocatePin(const wxPoint & RefPos, int Unit, int Convert, EDA_SchComponentStruct * DrawItem = NULL); /* Routine de localisation d'une PIN de la PartLib pointee par Entry */ -wxString ReturnDefaultFieldName(int FieldNumber); +const wxString& ReturnDefaultFieldName( int aFieldNdx ); /***************/ diff --git a/include/drawpanel_wxstruct.h b/include/drawpanel_wxstruct.h index 4a46b950bb..483380ed70 100644 --- a/include/drawpanel_wxstruct.h +++ b/include/drawpanel_wxstruct.h @@ -215,7 +215,7 @@ private: char m_FlagRefreshReq; /* indique que l'ecran doit redessine */ char m_FlagModified; // indique modif du PCB,utilise pour eviter une sortie sans sauvegarde char m_FlagSave; // indique sauvegarde auto faite - EDA_BaseStruct* m_CurrentItem; ///< Current selected object + EDA_BaseStruct* m_CurrentItem; ///< Currently selected object /* Valeurs du pas de grille et du zoom */ public: @@ -260,16 +260,11 @@ public: /** * Function SetCurItem * sets the currently selected object, m_CurrentItem. - * This is intentionally not inlined so we can set breakpoints on the - * activity easier in base_screen.cpp. * @param current Any object derived from EDA_BaseStruct */ - void SetCurItem( EDA_BaseStruct* current ) - { - m_CurrentItem = current; - } - + void SetCurItem( EDA_BaseStruct* current ) { m_CurrentItem = current; } EDA_BaseStruct* GetCurItem() const { return m_CurrentItem; } + /* fonctions relatives au zoom */ int GetZoom(); /* retourne le coeff de zoom */ @@ -313,6 +308,18 @@ public: { return wxT( "BASE_SCREEN" ); } + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param nestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ + void Show( int nestLevel, std::ostream& os ); +#endif + }; diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index 2194872325..b092b43fd5 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -441,10 +441,10 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() { wxMenu itemMenu; - int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() ); - itemMenu.SetTitle( _("Selection Clarification") ); // does this work? not under Linux! + int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() ); + for( int i=0; iCursorOff( &dc ); DrawPanel->m_CanStartBlock = -1; // Avoid to start a block coomand when clicking on menu + // If command in progress: Put the Cancel command (if needed) and End command if( m_ID_current_state ) { @@ -160,14 +161,12 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) return; } - /* Select a proper item */ - if( (item == NULL) || (item->m_Flags == 0) ) + /* Select a proper item */ + if( !item || !item->m_Flags ) { item = PcbGeneralLocateAndDisplay(); - SetCurItem(item); } - item = GetCurItem(); if( item ) flags = item->m_Flags; else @@ -183,10 +182,18 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE ) { aPopMenu->AppendSeparator(); - ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, _( "Lock Module" ), - Locked_xpm ); - ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FREE_MODULE, _( "Unlock Module" ), - Unlocked_xpm ); + + if( !((MODULE*)item)->IsLocked() ) + { + ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, _( "Lock Module" ), + Locked_xpm ); + } + else + { + ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FREE_MODULE, _( "Unlock Module" ), + Unlocked_xpm ); + } + if( !flags ) aPopMenu->Append( ID_POPUP_PCB_AUTOPLACE_CURRENT_MODULE, _( "Auto place Module" ) );