see my 2007-Sep-20 change_log.txt

This commit is contained in:
dickelbeck 2007-09-20 21:06:49 +00:00
parent 33939aebd9
commit 664a1f727b
20 changed files with 5187 additions and 4471 deletions

View File

@ -4,6 +4,14 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2007-Sep-20 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ 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 <jean-pierre.charras@inpg.fr> 2007-sept-20 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================ ================================================================================
+ all + all

View File

@ -555,3 +555,29 @@ EDA_BaseStruct* BASE_SCREEN::GetItemFromRedoList()
return item; 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 ) << "</" << GetClass().Lower().mb_str() << ">\n";
}
#endif

View File

@ -188,11 +188,14 @@ void EDA_BaseStruct::Show( int nestLevel, std::ostream& os )
// for now, make it look like XML: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n"; NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n";
/*
EDA_BaseStruct* kid = m_Son; EDA_BaseStruct* kid = m_Son;
for( ; kid; kid = kid->Pnext ) for( ; kid; kid = kid->Pnext )
{ {
kid->Show( nestLevel+1, os ); kid->Show( nestLevel+1, os );
} }
*/
NestedSpace( nestLevel+1, os ) << "Need ::Show() override, shown class is using EDA_BaseStruct::Show()\n";
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n"; NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }

View File

@ -28,11 +28,12 @@ static bool SortByPosition = TRUE;
/**************************************/ /**************************************/
void ReAnnotatePowerSymbolsOnly() 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: /* Used to reannotate the power symbols, before testing erc or computing netlist
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 */ /* Build the screen list */
@ -70,6 +71,7 @@ void InstallAnnotateFrame(WinEDA_SchematicFrame *parent, wxPoint & pos)
/******************************************************************/ /******************************************************************/
{ {
WinEDA_AnnotateFrame* frame = new WinEDA_AnnotateFrame( parent ); WinEDA_AnnotateFrame* frame = new WinEDA_AnnotateFrame( parent );
frame->ShowModal(); frame->Destroy(); frame->ShowModal(); frame->Destroy();
} }
@ -77,9 +79,10 @@ void InstallAnnotateFrame(WinEDA_SchematicFrame *parent, wxPoint & pos)
/******************************************************************/ /******************************************************************/
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. * 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. * All the components or the new ones only will be annotated.
*/ */
{ {
int NbSheet, ii, NbOfCmp; int NbSheet, ii, NbOfCmp;
@ -92,12 +95,15 @@ CmpListStruct * BaseListeCmp;
SortByPosition = (m_AnnotSortCmpCtrl->GetSelection() == 0) ? TRUE : FALSE; SortByPosition = (m_AnnotSortCmpCtrl->GetSelection() == 0) ? TRUE : FALSE;
/* If it is an annotation for all the components, reset previous annotation: */ /* If it is an annotation for all the components, reset previous annotation: */
if( m_AnnotNewCmpCtrl->GetSelection() == 0 ) DeleteAnnotation(event); if( m_AnnotNewCmpCtrl->GetSelection() == 0 )
if (m_Abort ) return; DeleteAnnotation( event );
if( m_Abort )
return;
/* Build the screen list */ /* Build the screen list */
EDA_ScreenList ScreenList( NULL ); EDA_ScreenList ScreenList( NULL );
NbSheet = ScreenList.GetCount(); NbSheet = ScreenList.GetCount();
/* Update the sheet number, sheet count and date */ /* Update the sheet number, sheet count and date */
@ -114,7 +120,8 @@ CmpListStruct * BaseListeCmp;
NbOfCmp += ListeComposants( NULL, screen, screen->m_SheetNumber ); NbOfCmp += ListeComposants( NULL, screen, screen->m_SheetNumber );
} }
} }
else NbOfCmp = ListeComposants(NULL, screen, screen->m_SheetNumber); else
NbOfCmp = ListeComposants( NULL, screen, screen->m_SheetNumber );
if( NbOfCmp == 0 ) if( NbOfCmp == 0 )
return; return;
@ -133,7 +140,8 @@ CmpListStruct * BaseListeCmp;
screen, screen->m_SheetNumber ); screen, screen->m_SheetNumber );
} }
} }
else ii = ListeComposants(BaseListeCmp, screen, screen->m_SheetNumber); else
ii = ListeComposants( BaseListeCmp, screen, screen->m_SheetNumber );
if( ii != NbOfCmp ) if( ii != NbOfCmp )
DisplayError( this, wxT( "Internal error in AnnotateComponents()" ) ); DisplayError( this, wxT( "Internal error in AnnotateComponents()" ) );
@ -161,8 +169,9 @@ CmpListStruct * BaseListeCmp;
/********************************************************************/ /********************************************************************/
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 /* 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; int NbSheet;
@ -179,6 +188,7 @@ EDA_SchComponentStruct *DrawLibItem;
/* Build the screen list */ /* Build the screen list */
EDA_ScreenList ScreenList( NULL ); EDA_ScreenList ScreenList( NULL );
NbSheet = ScreenList.GetCount(); NbSheet = ScreenList.GetCount();
/* Update the sheet number, sheet count and date */ /* Update the sheet number, sheet count and date */
@ -186,8 +196,10 @@ EDA_SchComponentStruct *DrawLibItem;
ScreenSch->SetModify(); ScreenSch->SetModify();
if( AnnotProject == TRUE ) screen = ScreenList.GetFirst(); if( AnnotProject == TRUE )
else screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen; screen = ScreenList.GetFirst();
else
screen = (SCH_SCREEN*) m_Parent->m_CurrentScreen;
for( ; screen != NULL; screen = ScreenList.GetNext() ) for( ; screen != NULL; screen = ScreenList.GetNext() )
{ {
@ -200,7 +212,9 @@ EDA_SchComponentStruct *DrawLibItem;
DrawLibItem->ClearAnnotation(); DrawLibItem->ClearAnnotation();
} }
} }
if( ! AnnotProject ) break;
if( !AnnotProject )
break;
} }
m_Parent->DrawPanel->Refresh( TRUE ); m_Parent->DrawPanel->Refresh( TRUE );
@ -211,8 +225,9 @@ EDA_SchComponentStruct *DrawLibItem;
/************************************************************************************/ /************************************************************************************/
int ListeComposants( CmpListStruct* BaseListeCmp, SCH_SCREEN* screen, int NumSheet ) int ListeComposants( CmpListStruct* BaseListeCmp, SCH_SCREEN* screen, int NumSheet )
/***********************************************************************************/ /***********************************************************************************/
/* if BaseListeCmp == NULL : Components counting /* if BaseListeCmp == NULL : Components counting
else update data table BaseListeCmp * else update data table BaseListeCmp
*/ */
{ {
int NbrCmp = 0; int NbrCmp = 0;
@ -236,7 +251,8 @@ EDA_LibComponentStruct *Entry;
case DRAW_LIB_ITEM_STRUCT_TYPE: case DRAW_LIB_ITEM_STRUCT_TYPE:
DrawLibItem = (EDA_SchComponentStruct*) DrawList; DrawLibItem = (EDA_SchComponentStruct*) DrawList;
Entry = FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); Entry = FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
if( Entry == NULL) break; if( Entry == NULL )
break;
if( BaseListeCmp == NULL ) /* Items counting only */ if( BaseListeCmp == NULL ) /* Items counting only */
{ {
NbrCmp++; break; NbrCmp++; break;
@ -279,44 +295,58 @@ EDA_LibComponentStruct *Entry;
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 /* function used par qsort() for sorting the list
Composants are sorted * Composants are sorted
by reference * by reference
if same reference: by value * if same reference: by value
if same value: by unit number * if same value: by unit number
if same unit number, by sheet * if same unit number, by sheet
if same sheet, by time stamp * if same sheet, by time stamp
**/ **/
{ {
int ii; int ii;
ii = strnicmp( Objet1->m_TextRef, Objet2->m_TextRef, 32 ); ii = strnicmp( Objet1->m_TextRef, Objet2->m_TextRef, 32 );
if ( SortByPosition == TRUE ) { 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 )
if ( ii == 0 ) ii = Objet1->m_Pos.x - Objet2->m_Pos.x; ii = Objet1->m_Sheet - Objet2->m_Sheet;
if ( ii == 0 ) ii = Objet1->m_Pos.y - Objet2->m_Pos.y; if( ii == 0 )
} else { ii = Objet1->m_Unit - Objet2->m_Unit;
if ( ii == 0 ) ii = strnicmp( Objet1->m_TextValue, Objet2->m_TextValue, 32 ); if( ii == 0 )
if ( ii == 0 ) ii = Objet1->m_Unit - Objet2->m_Unit; ii = Objet1->m_Pos.x - Objet2->m_Pos.x;
if ( ii == 0 ) ii = Objet1->m_Sheet - Objet2->m_Sheet; 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; if( ii == 0 )
ii = Objet1->m_TimeStamp - Objet2->m_TimeStamp;
return(ii); 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) /* Update the reference component for the schematic project (or the current sheet)
*/ */
{ {
@ -330,29 +360,31 @@ EDA_SchComponentStruct *DrawLibItem;
Text = BaseListeCmp[ii].m_TextRef; Text = BaseListeCmp[ii].m_TextRef;
DrawLibItem = BaseListeCmp[ii].m_Cmp; DrawLibItem = BaseListeCmp[ii].m_Cmp;
if ( BaseListeCmp[ii].m_NumRef < 0 ) strcat( Text, "?" ); if( BaseListeCmp[ii].m_NumRef < 0 )
else sprintf( Text + strlen(Text),"%d",BaseListeCmp[ii].m_NumRef ); strcat( Text, "?" );
else
sprintf( Text + strlen( Text ), "%d", BaseListeCmp[ii].m_NumRef );
DrawLibItem->m_Field[REFERENCE].m_Text = CONV_FROM_UTF8( Text ); DrawLibItem->m_Field[REFERENCE].m_Text = CONV_FROM_UTF8( Text );
DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit; DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit;
DrawLibItem->m_RefIdNumber = BaseListeCmp[ii].m_NumRef; DrawLibItem->m_RefIdNumber = BaseListeCmp[ii].m_NumRef;
if ( DrawLibItem->m_RefIdNumber < 0 ) DrawLibItem->m_RefIdNumber = 0; 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 /* Modifie dans BaseListeCmp la reference des composants en supprimant la
partie nombre de la partie texte. * partie nombre de la partie texte.
Place le nombre dans .m_NumRef * Place le nombre dans .m_NumRef
Pour les composants multiples non encore annotes, met .m_Unit a sa valeur max * Pour les composants multiples non encore annotes, met .m_Unit a sa valeur max
Utilise: * Utilise:
BaseListeCmp * BaseListeCmp
NbOfCmp * NbOfCmp
*/ */
{ {
int ii, ll; int ii, ll;
@ -399,8 +431,9 @@ char * Text;
/*****************************************************************************/ /*****************************************************************************/
static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp ) static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
/*****************************************************************************/ /*****************************************************************************/
/* Compute the reference number for components without reference number /* Compute the reference number for components without reference number
Compute .m_NumRef member * Compute .m_NumRef member
*/ */
{ {
int ii, jj, LastReferenceNumber, NumberOfUnits, Unit; int ii, jj, LastReferenceNumber, NumberOfUnits, Unit;
@ -422,7 +455,8 @@ CmpListStruct * ObjRef, * ObjToTest;
for( ii = 0; ii < NbOfCmp; ii++ ) for( ii = 0; ii < NbOfCmp; ii++ )
{ {
ObjRef = &BaseListeCmp[ii]; ObjRef = &BaseListeCmp[ii];
if( BaseListeCmp[ii].m_Flag ) continue; if( BaseListeCmp[ii].m_Flag )
continue;
Text = BaseListeCmp[ii].m_TextRef; Text = BaseListeCmp[ii].m_TextRef;
if( strnicmp( RefText, Text, 32 ) != 0 ) /* Nouveau Identificateur */ if( strnicmp( RefText, Text, 32 ) != 0 ) /* Nouveau Identificateur */
@ -459,19 +493,24 @@ CmpListStruct * ObjRef, * ObjToTest;
for( Unit = 1; Unit <= NumberOfUnits; Unit++ ) for( Unit = 1; Unit <= NumberOfUnits; Unit++ )
{ {
if( BaseListeCmp[ii].m_Unit == Unit ) continue; if( BaseListeCmp[ii].m_Unit == Unit )
continue;
jj = ExistUnit( BaseListeCmp + ii, Unit, BaseListeCmp, NbOfCmp ); jj = ExistUnit( BaseListeCmp + ii, Unit, BaseListeCmp, NbOfCmp );
if ( jj >= 0 ) continue; /* Unit exists for this reference */ if( jj >= 0 )
continue; /* Unit exists for this reference */
/* Search a component to annotate ( same prefix, same value) */ /* Search a component to annotate ( same prefix, same value) */
for( jj = ii + 1; jj < NbOfCmp; jj++ ) for( jj = ii + 1; jj < NbOfCmp; jj++ )
{ {
ObjToTest = &BaseListeCmp[jj]; ObjToTest = &BaseListeCmp[jj];
if( BaseListeCmp[jj].m_Flag ) continue; if( BaseListeCmp[jj].m_Flag )
continue;
Text = BaseListeCmp[jj].m_TextRef; Text = BaseListeCmp[jj].m_TextRef;
if( strnicmp(RefText, Text, 32) != 0 ) break; // references are different if( strnicmp( RefText, Text, 32 ) != 0 )
break; // references are different
Text = BaseListeCmp[jj].m_TextValue; Text = BaseListeCmp[jj].m_TextValue;
if( strnicmp(ValText, Text, 32) != 0 ) break; // values are different if( strnicmp( ValText, Text, 32 ) != 0 )
break; // values are different
if( !BaseListeCmp[jj].m_IsNew ) if( !BaseListeCmp[jj].m_IsNew )
{ {
//BaseListeCmp[jj].m_Flag = 1; //BaseListeCmp[jj].m_Flag = 1;
@ -495,9 +534,10 @@ CmpListStruct * ObjRef, * ObjToTest;
/*************************************************************************************************/ /*************************************************************************************************/
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 /* Recherche le plus grand numero de reference dans les composants
de meme prefixe de reference que celui pointe par Objet * de meme prefixe de reference que celui pointe par Objet
la liste des composants est supposee triee * la liste des composants est supposee triee
*/ */
{ {
CmpListStruct* LastObjet = BaseListeCmp + NbOfCmp; CmpListStruct* LastObjet = BaseListeCmp + NbOfCmp;
@ -509,9 +549,11 @@ const char * RefText;
{ {
if( strnicmp( RefText, Objet->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ if( strnicmp( RefText, Objet->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */
break; break;
if( LastNumber < Objet->m_NumRef ) LastNumber = Objet->m_NumRef; if( LastNumber < Objet->m_NumRef )
LastNumber = Objet->m_NumRef;
} }
return(LastNumber);
return LastNumber;
} }
@ -519,11 +561,12 @@ const char * RefText;
static int ExistUnit( CmpListStruct* Objet, int Unit, static int ExistUnit( CmpListStruct* Objet, int Unit,
CmpListStruct* BaseListeCmp, int NbOfCmp ) CmpListStruct* BaseListeCmp, int NbOfCmp )
/****************************************************************/ /****************************************************************/
/* Recherche dans la liste triee des composants, pour les composants /* Recherche dans la liste triee des composants, pour les composants
multiples s'il existe pour le composant de reference Objet, * multiples s'il existe pour le composant de reference Objet,
une unite de numero Unit * une unite de numero Unit
Retourne index dans BaseListeCmp si oui * Retourne index dans BaseListeCmp si oui
retourne -1 si non * retourne -1 si non
*/ */
{ {
CmpListStruct* EndList = BaseListeCmp + NbOfCmp; CmpListStruct* EndList = BaseListeCmp + NbOfCmp;
@ -536,26 +579,31 @@ CmpListStruct *ItemToTest;
NumRef = Objet->m_NumRef; NumRef = Objet->m_NumRef;
for( ItemToTest = BaseListeCmp, ii = 0; ItemToTest < EndList; ItemToTest++, ii++ ) for( ItemToTest = BaseListeCmp, ii = 0; ItemToTest < EndList; ItemToTest++, ii++ )
{ {
if ( Objet == ItemToTest ) continue; if( Objet == ItemToTest )
if ( ItemToTest->m_IsNew ) continue; /* non affecte */ continue;
if ( ItemToTest->m_NumRef != NumRef ) continue; if( ItemToTest->m_IsNew )
continue; /* non affecte */
if( ItemToTest->m_NumRef != NumRef )
continue;
if( strnicmp( RefText, ItemToTest->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ if( strnicmp( RefText, ItemToTest->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */
continue; continue;
if( ItemToTest->m_Unit == Unit ) if( ItemToTest->m_Unit == Unit )
{ {
return(ii); return ii;
} }
} }
return(-1);
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) /* Retourne le nombre de composants non annotés ou de meme référence (doublés)
Si OneSheetOnly : recherche sur le schema courant * Si OneSheetOnly : recherche sur le schema courant
sinon: recherche sur toute la hierarchie * sinon: recherche sur toute la hierarchie
*/ */
{ {
int NbSheet, ii, NumSheet = 1, error, NbOfCmp; int NbSheet, ii, NumSheet = 1, error, NbOfCmp;
@ -566,6 +614,7 @@ wxString msg, cmpref;
/* build tje screen list */ /* build tje screen list */
EDA_ScreenList ScreenList( NULL ); EDA_ScreenList ScreenList( NULL );
NbSheet = ScreenList.GetCount(); NbSheet = ScreenList.GetCount();
/* Update the sheet number, sheet count and date */ /* Update the sheet number, sheet count and date */
@ -582,12 +631,13 @@ wxString msg, cmpref;
NbOfCmp += ListeComposants( NULL, screen, NumSheet ); NbOfCmp += ListeComposants( NULL, screen, NumSheet );
} }
} }
else NbOfCmp = ListeComposants(NULL, screen, NumSheet); else
NbOfCmp = ListeComposants( NULL, screen, NumSheet );
if( NbOfCmp == 0 ) if( NbOfCmp == 0 )
{ {
wxBell(); wxBell();
return(0); return 0;
} }
ii = sizeof(CmpListStruct) * NbOfCmp; ii = sizeof(CmpListStruct) * NbOfCmp;
@ -622,8 +672,10 @@ wxString msg, cmpref;
msg.Empty(); Buff.Empty(); msg.Empty(); Buff.Empty();
if( ListeCmp[ii].m_IsNew ) if( ListeCmp[ii].m_IsNew )
{ {
if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; if( ListeCmp[ii].m_NumRef >= 0 )
else Buff = wxT("?"); Buff << ListeCmp[ii].m_NumRef;
else
Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "item not annotated: %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "item not annotated: %s%s" ), cmpref.GetData(), Buff.GetData() );
@ -638,8 +690,10 @@ wxString msg, cmpref;
if( MAX( ListeCmp[ii].m_NbParts, 1 ) < ListeCmp[ii].m_Unit ) // Annotate error if( MAX( ListeCmp[ii].m_NbParts, 1 ) < ListeCmp[ii].m_Unit ) // Annotate error
{ {
if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; if( ListeCmp[ii].m_NumRef >= 0 )
else Buff = wxT("?"); Buff << ListeCmp[ii].m_NumRef;
else
Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Error item %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "Error item %s%s" ), cmpref.GetData(), Buff.GetData() );
@ -652,23 +706,25 @@ wxString msg, cmpref;
} }
} }
if ( error ) return error; if( error )
return error;
/* comptage des elements doublés (si tous sont annotés) */ /* comptage des elements doublés (si tous sont annotés) */
for( ii = 0; (ii < NbOfCmp - 1) && (error < 4); ii++ ) for( ii = 0; (ii < NbOfCmp - 1) && (error < 4); ii++ )
{ {
msg.Empty(); Buff.Empty(); msg.Empty(); Buff.Empty();
if( (stricmp(ListeCmp[ii].m_TextRef,ListeCmp[ii+1].m_TextRef) != 0) || if( (stricmp( ListeCmp[ii].m_TextRef, ListeCmp[ii + 1].m_TextRef ) != 0)
( ListeCmp[ii].m_NumRef != ListeCmp[ii+1].m_NumRef ) ) || ( ListeCmp[ii].m_NumRef != ListeCmp[ii + 1].m_NumRef ) )
continue; continue;
/* Meme reference trouvée */ /* Meme reference trouvée */
/* Il y a erreur si meme unite */ /* Il y a erreur si meme unite */
if( ListeCmp[ii].m_Unit == ListeCmp[ii + 1].m_Unit ) if( ListeCmp[ii].m_Unit == ListeCmp[ii + 1].m_Unit )
{ {
if( ListeCmp[ii].m_NumRef >= 0 )
if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; Buff << ListeCmp[ii].m_NumRef;
else Buff = wxT("?"); else
Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Multiple item %s%s" ), msg.Printf( _( "Multiple item %s%s" ),
@ -684,12 +740,13 @@ wxString msg, cmpref;
} }
/* Il y a erreur si unites differentes mais nombre de parts differentes /* Il y a erreur si unites differentes mais nombre de parts differentes
par boitier (ex U3 ( 1 part) et U3B sont incompatibles) */ * par boitier (ex U3 ( 1 part) et U3B sont incompatibles) */
if( ListeCmp[ii].m_NbParts != ListeCmp[ii + 1].m_NbParts ) if( ListeCmp[ii].m_NbParts != ListeCmp[ii + 1].m_NbParts )
{ {
if( ListeCmp[ii].m_NumRef >= 0 )
if( ListeCmp[ii].m_NumRef >= 0 ) Buff << ListeCmp[ii].m_NumRef; Buff << ListeCmp[ii].m_NumRef;
else Buff = wxT("?"); else
Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Multiple item %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "Multiple item %s%s" ), cmpref.GetData(), Buff.GetData() );
@ -715,7 +772,8 @@ wxString msg, cmpref;
msg.Printf( _( "Diff values for %s%d%c (%s) and %s%d%c (%s)" ), 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, cmpref.GetData(), ListeCmp[ii].m_NumRef, ListeCmp[ii].m_Unit + 'A' - 1,
cmpvalue.GetData(), cmpvalue.GetData(),
nextcmpref.GetData(), ListeCmp[ii+1].m_NumRef, ListeCmp[ii+1].m_Unit+'A'-1, nextcmpref.GetData(
), ListeCmp[ii + 1].m_NumRef, ListeCmp[ii + 1].m_Unit + 'A' - 1,
nextcmpvalue.GetData() ); nextcmpvalue.GetData() );
DisplayError( frame, msg ); DisplayError( frame, msg );
@ -724,7 +782,5 @@ wxString msg, cmpref;
} }
MyFree( ListeCmp ); MyFree( ListeCmp );
return(error); return error;
} }

View File

@ -90,12 +90,12 @@ class SCH_SCREEN : public BASE_SCREEN
public: public:
SCH_SCREEN( int idtype, KICAD_T aType = SCREEN_STRUCT_TYPE ); SCH_SCREEN( int idtype, KICAD_T aType = SCREEN_STRUCT_TYPE );
~SCH_SCREEN(); ~SCH_SCREEN();
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT("SCH_SCREEN"); return wxT("SCH_SCREEN");
} }
void FreeDrawList(); // Free EESchema drawing list (does not delete the sub hierarchies) void FreeDrawList(); // Free EESchema drawing list (does not delete the sub hierarchies)
void Place( WinEDA_DrawFrame* frame, wxDC* DC ) { }; void Place( WinEDA_DrawFrame* frame, wxDC* DC ) { };

View File

@ -23,9 +23,10 @@ static int TstAlignSegment(EDA_DrawLineStruct* RefSegm, EDA_DrawLineStruct* TstS
/*******************************************/ /*******************************************/
bool SCH_SCREEN::SchematicCleanUp( wxDC* DC ) bool SCH_SCREEN::SchematicCleanUp( wxDC* DC )
/*******************************************/ /*******************************************/
/* Routine de nettoyage: /* Routine de nettoyage:
- regroupe les segments de fils (ou de bus) alignes en 1 seul segment * - regroupe les segments de fils (ou de bus) alignes en 1 seul segment
- Detecte les objets identiques superposes * - Detecte les objets identiques superposes
*/ */
{ {
EDA_BaseStruct* DrawList, * TstDrawList; EDA_BaseStruct* DrawList, * TstDrawList;
@ -53,12 +54,15 @@ bool Modify = FALSE;
TstDrawList = EEDrawList; TstDrawList = EEDrawList;
Modify = TRUE; Modify = TRUE;
} }
else TstDrawList = TstDrawList->Pnext; else
TstDrawList = TstDrawList->Pnext;
} }
else TstDrawList = TstDrawList->Pnext; else
TstDrawList = TstDrawList->Pnext;
} }
} }
} }
EDA_Appl->SchematicFrame->TestDanglingEnds( EEDrawList, DC ); EDA_Appl->SchematicFrame->TestDanglingEnds( EEDrawList, DC );
return Modify; return Modify;
} }
@ -67,8 +71,9 @@ bool Modify = FALSE;
/***********************************************/ /***********************************************/
void BreakSegmentOnJunction( SCH_SCREEN* Screen ) void BreakSegmentOnJunction( SCH_SCREEN* Screen )
/************************************************/ /************************************************/
/* Routine creant des debuts / fin de segment (BUS ou WIRES) sur les jonctions /* 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;
@ -122,10 +127,11 @@ EDA_BaseStruct *DrawList;
DrawPickedStruct* BreakSegment( SCH_SCREEN* screen, DrawPickedStruct* BreakSegment( SCH_SCREEN* screen,
wxPoint breakpoint, bool PutInUndoList ) wxPoint breakpoint, bool PutInUndoList )
/*********************************************************/ /*********************************************************/
/* Coupe un segment ( BUS, WIRE ) en 2 au point breakpoint, /* Coupe un segment ( BUS, WIRE ) en 2 au point breakpoint,
- si ce point est sur le segment * - si ce point est sur le segment
- extremites non comprises * - extremites non comprises
If PutInUndoList == TRUE, create a list of modifictions, for undo command * If PutInUndoList == TRUE, create a list of modifictions, for undo command
*/ */
{ {
EDA_BaseStruct* DrawList; EDA_BaseStruct* DrawList;
@ -144,14 +150,18 @@ DrawPickedStruct * List = NULL;
fx = segment->m_End.x; fy = segment->m_End.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 ) if( distance( fx - ox, fy - oy, breakpoint.x - ox, breakpoint.y - oy, 0 ) == 0 )
break; break;
/* Segment connecte: doit etre coupe en 2 si px,py n'est /* Segment connecte: doit etre coupe en 2 si px,py n'est
pas une extremite */ * pas une extremite */
if( (ox == breakpoint.x) && (oy == breakpoint.y ) ) break; if( (ox == breakpoint.x) && (oy == breakpoint.y ) )
if( (fx == breakpoint.x) && (fy == breakpoint.y ) ) break; break;
if( (fx == breakpoint.x) && (fy == breakpoint.y ) )
break;
/* Ici il faut couper le segment en 2 */ /* Ici il faut couper le segment en 2 */
if( PutInUndoList ) // First: put copy of the old segment in undo list if( PutInUndoList ) // First: put copy of the old segment in undo list
{ {
DrawPickedStruct* wrapper = new DrawPickedStruct(); DrawPickedStruct* wrapper = new DrawPickedStruct();
wrapper->m_Flags = IS_CHANGED; wrapper->m_Flags = IS_CHANGED;
wrapper->m_PickedStruct = segment->GenCopy(); wrapper->m_PickedStruct = segment->GenCopy();
wrapper->m_Image = segment; wrapper->m_Image = segment;
@ -168,6 +178,7 @@ DrawPickedStruct * List = NULL;
if( PutInUndoList ) if( PutInUndoList )
{ {
DrawPickedStruct* wrapper = new DrawPickedStruct(); DrawPickedStruct* wrapper = new DrawPickedStruct();
wrapper->m_Flags = IS_NEW; wrapper->m_Flags = IS_NEW;
wrapper->m_Image = NewSegment; wrapper->m_Image = NewSegment;
wrapper->Pnext = List; wrapper->Pnext = List;
@ -183,6 +194,7 @@ DrawPickedStruct * List = NULL;
default: default:
break; break;
} }
DrawList = DrawList->Pnext; DrawList = DrawList->Pnext;
} }
@ -190,19 +202,20 @@ DrawPickedStruct * List = NULL;
} }
/***********************************************************/ /***********************************************************/
static int TstAlignSegment( EDA_DrawLineStruct* RefSegm, static int TstAlignSegment( EDA_DrawLineStruct* RefSegm,
EDA_DrawLineStruct* TstSegm ) EDA_DrawLineStruct* TstSegm )
/***********************************************************/ /***********************************************************/
/* Search if the 2 segments RefSegm and TstSegm are on a line. /* Search if the 2 segments RefSegm and TstSegm are on a line.
Retourn 0 if no * Retourn 0 if no
1 if yes, and RefSegm is modified to be the equivalent segment * 1 if yes, and RefSegm is modified to be the equivalent segment
*/ */
{ {
if( RefSegm == TstSegm ) return(0); if( RefSegm == TstSegm )
if( RefSegm->m_Layer != TstSegm->m_Layer ) return(0); 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 // 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_Start == TstSegm->m_Start )
@ -232,7 +245,6 @@ static int TstAlignSegment( EDA_DrawLineStruct* RefSegm,
return 1; return 1;
} }
} }
else if( RefSegm->m_Start.x == RefSegm->m_End.x ) // Vertical segment else if( RefSegm->m_Start.x == RefSegm->m_End.x ) // Vertical segment
{ {
if( TstSegm->m_Start.x == TstSegm->m_End.x ) if( TstSegm->m_Start.x == TstSegm->m_End.x )
@ -241,10 +253,10 @@ static int TstAlignSegment( EDA_DrawLineStruct* RefSegm,
return 1; return 1;
} }
} }
else else
{ {
if (atan2(RefSegm->m_Start.x - RefSegm->m_End.x, RefSegm->m_Start.y - RefSegm->m_End.y) == 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 ) ) atan2( TstSegm->m_Start.x - TstSegm->m_End.x, TstSegm->m_Start.y - TstSegm->m_End.y ) )
{ {
RefSegm->m_End = TstSegm->m_End; RefSegm->m_End = TstSegm->m_End;
@ -252,6 +264,5 @@ static int TstAlignSegment( EDA_DrawLineStruct* RefSegm,
} }
} }
return(0); return 0;
} }

View File

@ -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 */ /* 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 << '"' << ">" <<
" <start" << m_Start << "/>" <<
" <end" << m_End << "/>" <<
"</" << GetClass().Lower().mb_str() << ">\n";
}
#endif
/****************************/ /****************************/
/* Class DrawPolylineStruct */ /* Class DrawPolylineStruct */
/****************************/ /****************************/

View File

@ -27,51 +27,77 @@ DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint & pos):
EDA_BaseStruct( struct_type ) EDA_BaseStruct( struct_type )
/***********************************************************************************/ /***********************************************************************************/
{ {
m_Layer = 0;
m_Pos = pos; m_Pos = pos;
m_TimeStamp = 0; m_TimeStamp = 0;
} }
/************************************/ /************************************/
DrawPartStruct::~DrawPartStruct() 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 /* Return the default field name from its index (REFERENCE, VALUE ..)
for I18n * FieldDefaultNameList is not static, because we want the text translation
* for I18n
*/ */
{ {
wxString FieldDefaultNameList[] = { // avoid unnecessarily copying wxStrings.
static const wxString FieldDefaultNameList[] = {
_( "Ref" ), /* Reference of part, i.e. "IC21" */ _( "Ref" ), /* Reference of part, i.e. "IC21" */
_( "Value" ), /* Value of part, i.e. "3.3K" */ _( "Value" ), /* Value of part, i.e. "3.3K" */
_( "Footprint" ), /* Footprint, used by cvpcb or pcbnew, i.e. "16DIP300" */ _( "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" */ _( "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*/ _( "Field1" ), /* User fields (1 to n) have an editable name*/
_( "Field2" ),
_( "Field3" ),
_( "Field4" ),
_( "Field5" ),
_( "Field6" ),
_( "Field7" ),
_( "Field8" ),
wxT( "badFieldNdx!" ) // error, and "sentinel" value
}; };
int ii = FieldNumber;
if ( ii > FIELD1 ) ii = FIELD1;
wxString FieldName = FieldDefaultNameList[ii];
if (FieldNumber >= FIELD1 ) FieldName << (FieldNumber - FIELD1 + 1); if( (unsigned) aFieldNdx > FIELD8 ) // catches < 0 also
return FieldName; 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; // avoid unnecessarily copying wxStrings.
if ( (FieldNumber < FIELD1) || FieldName.IsEmpty() ) if( aFieldNdx < FIELD1 || m_Field[aFieldNdx].m_Name.IsEmpty() )
FieldName = ReturnDefaultFieldName(FieldNumber); return ReturnDefaultFieldName( aFieldNdx );
return FieldName;
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;
} }
@ -81,10 +107,12 @@ EDA_SchComponentStruct::EDA_SchComponentStruct(const wxPoint & pos):
/*******************************************************************/ /*******************************************************************/
{ {
int ii; int ii;
m_Multi = 0; /* In multi unit chip - which unit to draw. */ m_Multi = 0; /* In multi unit chip - which unit to draw. */
m_RefIdNumber = 0; m_RefIdNumber = 0;
m_FlagControlMulti = 0; m_FlagControlMulti = 0;
m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */ m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */
/* The rotation/mirror transformation matrix. pos normal*/ /* The rotation/mirror transformation matrix. pos normal*/
m_Transform[0][0] = 1; m_Transform[0][0] = 1;
m_Transform[0][1] = 0; m_Transform[0][1] = 0;
@ -104,7 +132,6 @@ int ii;
m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART; m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART;
m_PinIsDangling = NULL; m_PinIsDangling = NULL;
} }
@ -115,11 +142,13 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox()
EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
EDA_Rect BoundaryBox; EDA_Rect BoundaryBox;
int x0, xm, y0, ym; int x0, xm, y0, ym;
/* Get the basic Boundary box */ /* Get the basic Boundary box */
if( Entry ) if( Entry )
{ {
BoundaryBox = Entry->GetBoundaryBox( m_Multi, m_Convert ); BoundaryBox = Entry->GetBoundaryBox( m_Multi, m_Convert );
x0 = BoundaryBox.GetX(); xm = BoundaryBox.GetRight(); x0 = BoundaryBox.GetX(); xm = BoundaryBox.GetRight();
// We must reverse Y values, because matrix orientation // We must reverse Y values, because matrix orientation
// suppose Y axis normal for the library items coordinates, // suppose Y axis normal for the library items coordinates,
// m_Transform reverse Y values, but BoundaryBox ais already reversed! // m_Transform reverse Y values, but BoundaryBox ais already reversed!
@ -142,8 +171,11 @@ int x0, xm, y0, ym;
int y2 = m_Transform[1][0] * xm + m_Transform[1][1] * ym; int y2 = m_Transform[1][0] * xm + m_Transform[1][1] * ym;
// H and W must be > 0 for wxRect: // H and W must be > 0 for wxRect:
if ( x2 < x1 ) EXCHG( x2, x1 ); if( x2 < x1 )
if ( y2 < y1 ) EXCHG( y2, y1 ); EXCHG( x2, x1 );
if( y2 < y1 )
EXCHG( y2, y1 );
BoundaryBox.SetX( x1 ); BoundaryBox.SetY( y1 ); BoundaryBox.SetX( x1 ); BoundaryBox.SetY( y1 );
BoundaryBox.SetWidth( x2 - x1 ); BoundaryBox.SetWidth( x2 - x1 );
BoundaryBox.SetHeight( y2 - y1 ); BoundaryBox.SetHeight( y2 - y1 );
@ -156,8 +188,9 @@ int x0, xm, y0, ym;
/**************************************************************************/ /**************************************************************************/
void PartTextStruct::SwapData( PartTextStruct* copyitem ) void PartTextStruct::SwapData( PartTextStruct* copyitem )
/**************************************************************************/ /**************************************************************************/
/* Used if undo / redo command: /* 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_Text, copyitem->m_Text );
@ -176,11 +209,13 @@ void PartTextStruct::SwapData(PartTextStruct * copyitem)
EXCHG( m_TextDrawingsSize, copyitem->m_TextDrawingsSize ); 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: /* 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_Pos, copyitem->m_Pos );
@ -202,16 +237,19 @@ void EDA_SchComponentStruct::Place(WinEDA_DrawFrame * frame, wxDC * DC)
/***********************************************************************/ /***********************************************************************/
{ {
/* save old text in undo list */ /* save old text in undo list */
if ( g_ItemToUndoCopy && if( g_ItemToUndoCopy
(g_ItemToUndoCopy->Type() == Type()) && && ( g_ItemToUndoCopy->Type() == Type() )
((m_Flags & IS_NEW) == 0) ) && ( (m_Flags & IS_NEW) == 0 ) )
{ {
/* restore old values and save new ones */ /* restore old values and save new ones */
SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
/* save in undo list */ /* save in undo list */
( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( this, IS_CHANGED ); ( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( this, IS_CHANGED );
/* restore new values */ /* restore new values */
SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
delete g_ItemToUndoCopy; delete g_ItemToUndoCopy;
g_ItemToUndoCopy = NULL; g_ItemToUndoCopy = NULL;
} }
@ -223,6 +261,7 @@ void EDA_SchComponentStruct::Place(WinEDA_DrawFrame * frame, wxDC * DC)
/***************************************************/ /***************************************************/
void EDA_SchComponentStruct::ClearAnnotation() void EDA_SchComponentStruct::ClearAnnotation()
/***************************************************/ /***************************************************/
/* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1) /* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1)
*/ */
{ {
@ -230,6 +269,7 @@ void EDA_SchComponentStruct::ClearAnnotation()
while( isdigit( m_Field[REFERENCE].m_Text.Last() ) ) while( isdigit( m_Field[REFERENCE].m_Text.Last() ) )
m_Field[REFERENCE].m_Text.RemoveLast(); m_Field[REFERENCE].m_Text.RemoveLast();
if( m_Field[REFERENCE].m_Text.Last() != '?' ) if( m_Field[REFERENCE].m_Text.Last() != '?' )
m_Field[REFERENCE].m_Text.Append( '?' ); m_Field[REFERENCE].m_Text.Append( '?' );
@ -240,11 +280,13 @@ EDA_LibComponentStruct *Entry;
m_Multi = 1; m_Multi = 1;
} }
/**************************************************************/ /**************************************************************/
EDA_SchComponentStruct* EDA_SchComponentStruct::GenCopy() EDA_SchComponentStruct* EDA_SchComponentStruct::GenCopy()
/**************************************************************/ /**************************************************************/
{ {
EDA_SchComponentStruct* new_item = new EDA_SchComponentStruct( m_Pos ); EDA_SchComponentStruct* new_item = new EDA_SchComponentStruct( m_Pos );
int ii; int ii;
new_item->m_Multi = m_Multi; new_item->m_Multi = m_Multi;
@ -271,9 +313,10 @@ int ii;
/*****************************************************************/ /*****************************************************************/
void EDA_SchComponentStruct::SetRotationMiroir( int type_rotate ) void EDA_SchComponentStruct::SetRotationMiroir( int type_rotate )
/******************************************************************/ /******************************************************************/
/* Compute the new matrix transform for a schematic component /* Compute the new matrix transform for a schematic component
in order to have the requested transform (type_rotate = rot, mirror..) * in order to have the requested transform (type_rotate = rot, mirror..)
which is applied to the initial transform. * which is applied to the initial transform.
*/ */
{ {
int TempMat[2][2]; int TempMat[2][2];
@ -380,13 +423,13 @@ bool Transform = FALSE;
if( Transform ) if( Transform )
{/* The new matrix transform is the old matrix transform modified by the {/* The new matrix transform is the old matrix transform modified by the
requested transformation, which is the TempMat transform (rot, mirror ..) * requested transformation, which is the TempMat transform (rot, mirror ..)
in order to have (in term of matrix transform): * in order to have (in term of matrix transform):
transform coord = new_m_Transform * coord * transform coord = new_m_Transform * coord
where transform coord is the coord modified by new_m_Transform from the initial * where transform coord is the coord modified by new_m_Transform from the initial
value coord. * value coord.
new_m_Transform is computed (from old_m_Transform and TempMat) to have: * new_m_Transform is computed (from old_m_Transform and TempMat) to have:
transform coord = old_m_Transform * coord * TempMat * transform coord = old_m_Transform * coord * TempMat
*/ */
int NewMatrix[2][2]; int NewMatrix[2][2];
@ -466,7 +509,7 @@ bool found = FALSE;
if( found ) if( found )
{ {
return (type_rotate + ii); return type_rotate + ii;
} }
else else
{ {
@ -474,43 +517,87 @@ bool found = FALSE;
} }
} }
/***********************************************************************/ /***********************************************************************/
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 /* Renvoie la coordonnée du point coord, en fonction de l'orientation
du composant (rotation, miroir). * du composant (rotation, miroir).
Les coord sont toujours relatives à l'ancre (coord 0,0) du composant * Les coord sont toujours relatives à l'ancre (coord 0,0) du composant
*/ */
{ {
wxPoint screenpos; wxPoint screenpos;
screenpos.x = m_Transform[0][0] * coord.x + m_Transform[0][1] * coord.y; 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; screenpos.y = m_Transform[1][0] * coord.x + m_Transform[1][1] * coord.y;
return screenpos; 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<NUMBER_OF_FIELDS; ++i )
{
wxString value = GetFieldValue( i );
if( !value.IsEmpty() )
{
NestedSpace( nestLevel+1, os ) << "<field" <<
" name=\"" << ReturnFieldName(i).mb_str() << '"' <<
" value=\"" << value.mb_str() << "\"/>\n";
}
}
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
}
#endif
/***************************************************************************/ /***************************************************************************/
PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) : PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) :
EDA_BaseStruct(DRAW_PART_TEXT_STRUCT_TYPE), EDA_BaseStruct( DRAW_PART_TEXT_STRUCT_TYPE ), EDA_TextStruct( text )
EDA_TextStruct(text)
/***************************************************************************/ /***************************************************************************/
{ {
m_Pos = pos; m_Pos = pos;
m_FieldId = 0; m_FieldId = 0;
} }
/************************************/ /************************************/
PartTextStruct::~PartTextStruct() PartTextStruct::~PartTextStruct()
/************************************/ /************************************/
{ {
} }
/***********************************************************/ /***********************************************************/
void PartTextStruct::PartTextCopy( PartTextStruct* target ) void PartTextStruct::PartTextCopy( PartTextStruct* target )
/***********************************************************/ /***********************************************************/
{ {
target->m_Text = m_Text; target->m_Text = m_Text;
if ( m_FieldId >= FIELD1 )target->m_Name = m_Name; if( m_FieldId >= FIELD1 )
target->m_Name = m_Name;
target->m_Layer = m_Layer; target->m_Layer = m_Layer;
target->m_Pos = m_Pos; target->m_Pos = m_Pos;
target->m_Size = m_Size; target->m_Size = m_Size;
@ -526,11 +613,13 @@ void PartTextStruct::PartTextCopy(PartTextStruct * target)
/*********************************/ /*********************************/
bool PartTextStruct::IsVoid() bool PartTextStruct::IsVoid()
/*********************************/ /*********************************/
/* return True if The field is void, i.e.: /* return True if The field is void, i.e.:
contains wxEmptyString or "~" * contains wxEmptyString or "~"
*/ */
{ {
if ( m_Text.IsEmpty() || m_Text == wxT("~") ) return TRUE; if( m_Text.IsEmpty() || m_Text == wxT( "~" ) )
return TRUE;
return FALSE; return FALSE;
} }
@ -538,10 +627,11 @@ bool PartTextStruct::IsVoid()
/********************************************/ /********************************************/
EDA_Rect PartTextStruct::GetBoundaryBox() 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 ...
/* return
* EDA_Rect contains the real (user coordinates) boundary box for a text field,
* according to the component position, rotation, mirror ...
*
*/ */
{ {
EDA_Rect BoundaryBox; EDA_Rect BoundaryBox;
@ -582,12 +672,16 @@ EDA_SchComponentStruct * DrawLibItem = (EDA_SchComponentStruct *) m_Parent;
/* If the component orientation is +/- 90 deg, the text orienation must be changed */ /* If the component orientation is +/- 90 deg, the text orienation must be changed */
if( DrawLibItem->m_Transform[0][1] ) if( DrawLibItem->m_Transform[0][1] )
{ {
if ( orient == TEXT_ORIENT_HORIZ) orient = TEXT_ORIENT_VERT; if( orient == TEXT_ORIENT_HORIZ )
else orient = TEXT_ORIENT_HORIZ; orient = TEXT_ORIENT_VERT;
else
orient = TEXT_ORIENT_HORIZ;
/* is it mirrored (for text justify)*/ /* is it mirrored (for text justify)*/
EXCHG( hjustify, vjustify ); EXCHG( hjustify, vjustify );
if (DrawLibItem->m_Transform[1][0] < 0 ) vjustify = - vjustify; if( DrawLibItem->m_Transform[1][0] < 0 )
if (DrawLibItem->m_Transform[0][1] > 0 ) hjustify = - hjustify; vjustify = -vjustify;
if( DrawLibItem->m_Transform[0][1] > 0 )
hjustify = -hjustify;
} }
else /* component horizontal: is it mirrored (for text justify)*/ else /* component horizontal: is it mirrored (for text justify)*/
{ {
@ -597,28 +691,34 @@ EDA_SchComponentStruct * DrawLibItem = (EDA_SchComponentStruct *) m_Parent;
vjustify = -vjustify; vjustify = -vjustify;
} }
if ( orient == TEXT_ORIENT_VERT ) EXCHG(dx, dy); if( orient == TEXT_ORIENT_VERT )
EXCHG( dx, dy );
switch( hjustify ) switch( hjustify )
{ {
case GR_TEXT_HJUSTIFY_CENTER: case GR_TEXT_HJUSTIFY_CENTER:
x1 = x2 - (dx / 2); x1 = x2 - (dx / 2);
break; break;
case GR_TEXT_HJUSTIFY_RIGHT: case GR_TEXT_HJUSTIFY_RIGHT:
x1 = x2 - dx; x1 = x2 - dx;
break; break;
default: default:
x1 = x2; x1 = x2;
break; break;
} }
switch( vjustify ) switch( vjustify )
{ {
case GR_TEXT_VJUSTIFY_CENTER: case GR_TEXT_VJUSTIFY_CENTER:
y1 = y2 - (dy / 2); y1 = y2 - (dy / 2);
break; break;
case GR_TEXT_VJUSTIFY_BOTTOM: case GR_TEXT_VJUSTIFY_BOTTOM:
y1 = y2 - dy; y1 = y2 - dy;
break; break;
default: default:
y1 = y2; y1 = y2;
break; break;

View File

@ -15,7 +15,7 @@
/* Definition de la representation du composant */ /* Definition de la representation du composant */
#define NUMBER_OF_FIELDS 12 /* Nombre de champs de texte affectes au 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" */ REFERENCE = 0, /* Champ Reference of part, i.e. "IC21" */
VALUE, /* Champ Value of part, i.e. "3.3K" */ VALUE, /* Champ Value of part, i.e. "3.3K" */
FOOTPRINT, /* Champ Name Module PCB, i.e. "16DIP300" */ FOOTPRINT, /* Champ Name Module PCB, i.e. "16DIP300" */
@ -28,7 +28,7 @@ typedef enum {
FIELD6, FIELD6,
FIELD7, FIELD7,
FIELD8 FIELD8
} NumFieldType; };
/* Class to manage component fields. /* Class to manage component fields.
@ -46,9 +46,10 @@ public:
public: public:
PartTextStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); PartTextStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString );
~PartTextStruct(); ~PartTextStruct();
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "PartTextStruct" ); return wxT( "PartText" );
} }
@ -77,10 +78,18 @@ public:
public: public:
DrawPartStruct( KICAD_T struct_type, const wxPoint &pos ); DrawPartStruct( KICAD_T struct_type, const wxPoint &pos );
~DrawPartStruct(); ~DrawPartStruct();
virtual wxString GetClass() const 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,18 +110,29 @@ public:
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "EDA_SchComponentStruct" ); return wxT( "EDA_SchComponent" );
} }
EDA_SchComponentStruct* GenCopy( void ); EDA_SchComponentStruct* GenCopy();
void SetRotationMiroir( int type ); void SetRotationMiroir( int type );
int GetRotationMiroir(); int GetRotationMiroir();
wxPoint GetScreenCoord( const wxPoint& coord ); wxPoint GetScreenCoord( const wxPoint& coord );
void Display_Infos( WinEDA_DrawFrame* frame ); void Display_Infos( WinEDA_DrawFrame* frame );
void ClearAnnotation(); void ClearAnnotation();
EDA_Rect GetBoundaryBox(); 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, virtual void Draw( WinEDA_DrawPanel* panel,
wxDC* DC, wxDC* DC,
@ -122,6 +142,17 @@ public:
void SwapData( EDA_SchComponentStruct* copyitem ); void SwapData( EDA_SchComponentStruct* copyitem );
virtual void Place( WinEDA_DrawFrame* frame, wxDC* DC ); 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
}; };

View File

@ -24,7 +24,6 @@ enum id_libedit {
}; };
/* Routines locales */ /* Routines locales */
/* Variables locales */ /* Variables locales */
@ -33,12 +32,12 @@ extern int CurrentUnit;
/* Classe de la frame des propriétés d'un composant en librairie */ /* 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 /* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés
d'un composant le librairie. * d'un composant le librairie.
On peut éditer: * On peut éditer:
Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) * Texte dimensions et justification de tous les champs (Ref, Val, et autres champs)
Documentation et mots clefs * Documentation et mots clefs
Nombre de part par boitier * Nombre de part par boitier
et autres propriérés générales * et autres propriérés générales
*/ */
#include "dialog_edit_component_in_lib.cpp" #include "dialog_edit_component_in_lib.cpp"
@ -52,16 +51,20 @@ wxPoint fpos = pos;
WinEDA_PartPropertiesFrame* frame = WinEDA_PartPropertiesFrame* frame =
new WinEDA_PartPropertiesFrame( this ); new WinEDA_PartPropertiesFrame( this );
int IsModified = frame->ShowModal(); frame->Destroy();
if ( IsModified ) Refresh();
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 /* 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;
@ -80,11 +83,14 @@ int id = Field->m_FieldId;
m_FieldVJustify[id] = 0; m_FieldVJustify[id] = 0;
else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP )
m_FieldVJustify[id] = 2; m_FieldVJustify[id] = 2;
else m_FieldVJustify[id] = 1; else
m_FieldVJustify[id] = 1;
m_FieldText[id] = Field->m_Text; m_FieldText[id] = Field->m_Text;
if ( id >= FIELD1 ) m_FieldName[id] = Field->m_Name; if( id >= FIELD1 )
m_FieldName[id] = Field->m_Name;
m_FieldPosition[id] = Field->m_Pos; m_FieldPosition[id] = Field->m_Pos;
// Note: the Y axis for components in lib is from bottom to top // 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 // 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_FieldPosition[id].y = -m_FieldPosition[id].y;
@ -95,21 +101,27 @@ int id = Field->m_FieldId;
/***************************************************************************/ /***************************************************************************/
void WinEDA_PartPropertiesFrame::CopyBufferToFieldData( LibDrawField* Field ) void WinEDA_PartPropertiesFrame::CopyBufferToFieldData( LibDrawField* Field )
/***************************************************************************/ /***************************************************************************/
/* Copy data from buffers(name, attributes, size, position... )to the /* 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, int hjustify[3] = {
GR_TEXT_HJUSTIFY_RIGHT }; GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER,
int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER, GR_TEXT_HJUSTIFY_RIGHT
GR_TEXT_VJUSTIFY_TOP }; };
int vjustify[3] = {
GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER,
GR_TEXT_VJUSTIFY_TOP
};
int ii = Field->m_FieldId; 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 ) ) if( ii >= FIELD1 && m_FieldName[ii] != ReturnDefaultFieldName( ii ) )
Field->m_Name = m_FieldName[ii]; Field->m_Name = m_FieldName[ii];
else Field->m_Name.Empty(); else
Field->m_Name.Empty();
Field->m_Size.x = Field->m_Size.y = m_FieldSize[ii]; Field->m_Size.x = Field->m_Size.y = m_FieldSize[ii];
Field->m_HJustify = hjustify[m_FieldHJustify[ii]]; Field->m_HJustify = hjustify[m_FieldHJustify[ii]];
@ -120,16 +132,19 @@ int ii = Field->m_FieldId;
Field->m_Attributs |= TEXT_NO_VISIBLE; Field->m_Attributs |= TEXT_NO_VISIBLE;
Field->m_Orient = m_FieldOrient[ii] ? 1 : 0; Field->m_Orient = m_FieldOrient[ii] ? 1 : 0;
Field->m_Pos = m_FieldPosition[ii]; Field->m_Pos = m_FieldPosition[ii];
// Note: the Y axis for components in lib is from bottom to top // 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 // 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_Pos.y = -Field->m_Pos.y;
} }
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::InitBuffers() void WinEDA_PartPropertiesFrame::InitBuffers()
/*****************************************************/ /*****************************************************/
/* Init the buffers to a default value, /* 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;
@ -184,6 +199,7 @@ int ii;
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelAlias() void WinEDA_PartPropertiesFrame::BuildPanelAlias()
/*****************************************************/ /*****************************************************/
/* create the panel for component alias list editing /* create the panel for component alias list editing
*/ */
{ {
@ -191,11 +207,14 @@ wxButton * Button;
m_PanelAlias->SetFont( *g_DialogFont ); m_PanelAlias->SetFont( *g_DialogFont );
wxBoxSizer* PanelAliasBoxSizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* PanelAliasBoxSizer = new wxBoxSizer( wxHORIZONTAL );
m_PanelAlias->SetSizer( PanelAliasBoxSizer ); m_PanelAlias->SetSizer( PanelAliasBoxSizer );
wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelAliasBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); PanelAliasBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 );
wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ) ); wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ) );
Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); Msg->SetForegroundColour( wxColour( 200, 0, 0 ) );
LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
@ -204,24 +223,30 @@ wxButton * Button;
wxDefaultPosition, wxSize( 200, 250 ), wxDefaultPosition, wxSize( 200, 250 ),
0, NULL, 0, NULL,
wxLB_ALWAYS_SB | wxLB_SINGLE ); wxLB_ALWAYS_SB | wxLB_SINGLE );
LeftBoxSizer->Add( m_PartAliasList, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); LeftBoxSizer->Add( m_PartAliasList, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelAliasBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); PanelAliasBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ) ); Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ) );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 );
m_ButtonDeleteOneAlias = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS, m_ButtonDeleteOneAlias = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS,
_( "Delete" ) ); _( "Delete" ) );
m_ButtonDeleteOneAlias->SetForegroundColour( *wxRED ); m_ButtonDeleteOneAlias->SetForegroundColour( *wxRED );
RightBoxSizer->Add( m_ButtonDeleteOneAlias, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( m_ButtonDeleteOneAlias, 0, wxGROW | wxALL, 5 );
m_ButtonDeleteAllAlias = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS, m_ButtonDeleteAllAlias = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS,
_( "Delete All" ) ); _( "Delete All" ) );
m_ButtonDeleteAllAlias->SetForegroundColour( *wxRED ); m_ButtonDeleteAllAlias->SetForegroundColour( *wxRED );
if ( ! CurrentAliasName.IsEmpty() ) m_ButtonDeleteAllAlias->Enable(FALSE); if( !CurrentAliasName.IsEmpty() )
m_ButtonDeleteAllAlias->Enable( FALSE );
RightBoxSizer->Add( m_ButtonDeleteAllAlias, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( m_ButtonDeleteAllAlias, 0, wxGROW | wxALL, 5 );
@ -243,21 +268,30 @@ wxButton * Button;
/*****************************************************************/ /*****************************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelFootprintFilter() void WinEDA_PartPropertiesFrame::BuildPanelFootprintFilter()
/*****************************************************************/ /*****************************************************************/
/* create the panel for footprint filtering in cvpcb list /* 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 ); m_PanelFootprintFilter->SetFont( *g_DialogFont );
wxBoxSizer* PanelFpFilterBoxSizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* PanelFpFilterBoxSizer = new wxBoxSizer( wxHORIZONTAL );
m_PanelFootprintFilter->SetSizer( PanelFpFilterBoxSizer ); m_PanelFootprintFilter->SetSizer( PanelFpFilterBoxSizer );
wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelFpFilterBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); PanelFpFilterBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 );
wxStaticText * Msg = new wxStaticText(m_PanelFootprintFilter, -1, _("Footprints")); wxStaticText* Msg = new wxStaticText( m_PanelFootprintFilter, -1, _(
"Footprints" ) );
Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); Msg->SetForegroundColour( wxColour( 200, 0, 0 ) );
LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); LeftBoxSizer->Add( Msg, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
@ -266,22 +300,33 @@ wxBoxSizer * PanelFpFilterBoxSizer = new wxBoxSizer(wxHORIZONTAL);
wxDefaultPosition, wxSize( 200, 250 ), wxDefaultPosition, wxSize( 200, 250 ),
0, NULL, 0, NULL,
wxLB_ALWAYS_SB | wxLB_SINGLE ); wxLB_ALWAYS_SB | wxLB_SINGLE );
LeftBoxSizer->Add( m_FootprintFilterListBox, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); LeftBoxSizer->Add( m_FootprintFilterListBox, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelFpFilterBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); PanelFpFilterBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
wxButton * Button = new wxButton(m_PanelFootprintFilter, ID_ADD_FOOTPRINT_FILTER, _("Add")); wxButton* Button = new wxButton( m_PanelFootprintFilter,
ID_ADD_FOOTPRINT_FILTER, _(
"Add" ) );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 );
m_ButtonDeleteOneFootprintFilter = new wxButton(m_PanelFootprintFilter, ID_DELETE_ONE_FOOTPRINT_FILTER, m_ButtonDeleteOneFootprintFilter = new wxButton( m_PanelFootprintFilter,
_("Delete")); ID_DELETE_ONE_FOOTPRINT_FILTER,
_(
"Delete" ) );
m_ButtonDeleteOneFootprintFilter->SetForegroundColour( *wxRED ); m_ButtonDeleteOneFootprintFilter->SetForegroundColour( *wxRED );
RightBoxSizer->Add( m_ButtonDeleteOneFootprintFilter, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( m_ButtonDeleteOneFootprintFilter, 0, wxGROW | wxALL, 5 );
m_ButtonDeleteAllFootprintFilter = new wxButton(m_PanelFootprintFilter, ID_DELETE_ALL_FOOTPRINT_FILTER, m_ButtonDeleteAllFootprintFilter = new wxButton( m_PanelFootprintFilter,
_("Delete All")); ID_DELETE_ALL_FOOTPRINT_FILTER,
_(
"Delete All" ) );
m_ButtonDeleteAllFootprintFilter->SetForegroundColour( *wxRED ); m_ButtonDeleteAllFootprintFilter->SetForegroundColour( *wxRED );
RightBoxSizer->Add( m_ButtonDeleteAllFootprintFilter, 0, wxGROW | wxALL, 5 ); RightBoxSizer->Add( m_ButtonDeleteAllFootprintFilter, 0, wxGROW | wxALL, 5 );
@ -301,10 +346,10 @@ wxBoxSizer * PanelFpFilterBoxSizer = new wxBoxSizer(wxHORIZONTAL);
} }
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelDoc() void WinEDA_PartPropertiesFrame::BuildPanelDoc()
/*****************************************************/ /*****************************************************/
/* create the panel for component doc editing /* create the panel for component doc editing
*/ */
{ {
@ -324,7 +369,8 @@ wxString msg_text;
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD]; msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD];
else else
{ {
if (CurrentLibEntry ) msg_text = CurrentLibEntry->m_KeyWord; if( CurrentLibEntry )
msg_text = CurrentLibEntry->m_KeyWord;
} }
m_Keywords->SetValue( msg_text ); m_Keywords->SetValue( msg_text );
@ -333,59 +379,75 @@ wxString msg_text;
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME]; msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME];
else else
{ {
if (CurrentLibEntry) msg_text = CurrentLibEntry->m_DocFile; if( CurrentLibEntry )
msg_text = CurrentLibEntry->m_DocFile;
} }
m_Docfile->SetValue( msg_text ); m_Docfile->SetValue( msg_text );
if ( m_AliasLocation < 0 ) m_ButtonCopyDoc->Enable(FALSE); if( m_AliasLocation < 0 )
m_ButtonCopyDoc->Enable( FALSE );
} }
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelBasic() void WinEDA_PartPropertiesFrame::BuildPanelBasic()
/*****************************************************/ /*****************************************************/
/* create the basic panel for component properties editing /* 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" ) ); AsConvertButt = new wxCheckBox( m_PanelBasic, -1, _( "As Convert" ) );
if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE);
if( g_AsDeMorgan )
AsConvertButt->SetValue( TRUE );
m_OptionsBoxSizer->Add( AsConvertButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); m_OptionsBoxSizer->Add( AsConvertButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ) ); ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ) );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if ( CurrentLibEntry->m_DrawPinNum ) ShowPinNumButt->SetValue(TRUE); if( CurrentLibEntry->m_DrawPinNum )
ShowPinNumButt->SetValue( TRUE );
} }
else ShowPinNumButt->SetValue(TRUE); else
ShowPinNumButt->SetValue( TRUE );
m_OptionsBoxSizer->Add( ShowPinNumButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); m_OptionsBoxSizer->Add( ShowPinNumButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ) ); ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ) );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if( CurrentLibEntry->m_DrawPinName ) ShowPinNameButt->SetValue(TRUE); if( CurrentLibEntry->m_DrawPinName )
ShowPinNameButt->SetValue( TRUE );
} }
else ShowPinNameButt->SetValue(TRUE); else
ShowPinNameButt->SetValue( TRUE );
m_OptionsBoxSizer->Add( ShowPinNameButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); m_OptionsBoxSizer->Add( ShowPinNameButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ) ); m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ) );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if ( CurrentLibEntry->m_TextInside ) m_PinsNameInsideButt->SetValue(TRUE); if( CurrentLibEntry->m_TextInside )
m_PinsNameInsideButt->SetValue( TRUE );
} }
else m_PinsNameInsideButt->SetValue(TRUE); else
m_PinsNameInsideButt->SetValue( TRUE );
m_OptionsBoxSizer->Add( m_PinsNameInsideButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); m_OptionsBoxSizer->Add( m_PinsNameInsideButt, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
int number, number_of_units; int number, number_of_units;
if ( CurrentLibEntry ) number_of_units = CurrentLibEntry->m_UnitCount; if( CurrentLibEntry )
else number_of_units = 1; number_of_units = CurrentLibEntry->m_UnitCount;
else
number_of_units = 1;
SelNumberOfUnits->SetValue( number_of_units ); SelNumberOfUnits->SetValue( number_of_units );
if( CurrentLibEntry && CurrentLibEntry->m_TextInside ) if( CurrentLibEntry && CurrentLibEntry->m_TextInside )
number = CurrentLibEntry->m_TextInside; number = CurrentLibEntry->m_TextInside;
else number = 40; else
number = 40;
m_SetSkew->SetValue( number ); m_SetSkew->SetValue( number );
if( CurrentLibEntry ) if( CurrentLibEntry )
@ -401,11 +463,13 @@ void WinEDA_PartPropertiesFrame::BuildPanelBasic()
} }
} }
/*********************************************************/ /*********************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelEditField() void WinEDA_PartPropertiesFrame::BuildPanelEditField()
/**********************************************************/ /**********************************************************/
/* Create and build the panel managing the fields (REF, VALUE ...) /* Create and build the panel managing the fields (REF, VALUE ...)
of the component * of the component
*/ */
{ {
wxString Hjustify_list[] = wxString Hjustify_list[] =
@ -415,30 +479,39 @@ wxString Vjustify_list[] =
int FieldId = m_CurrentFieldId; int FieldId = m_CurrentFieldId;
m_PanelField = new wxPanel( m_NoteBook, ID_PANEL_FIELD ); m_PanelField = new wxPanel( m_NoteBook, ID_PANEL_FIELD );
m_PanelField->SetFont( *g_DialogFont ); m_PanelField->SetFont( *g_DialogFont );
m_NoteBook->AddPage( m_PanelField, _( "Fields" ), FALSE ); m_NoteBook->AddPage( m_PanelField, _( "Fields" ), FALSE );
wxBoxSizer* PanelFieldBoxSizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* PanelFieldBoxSizer = new wxBoxSizer( wxHORIZONTAL );
m_PanelField->SetSizer( PanelFieldBoxSizer ); m_PanelField->SetSizer( PanelFieldBoxSizer );
wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelFieldBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); PanelFieldBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 );
wxBoxSizer* MiddleBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* MiddleBoxSizer = new wxBoxSizer( wxVERTICAL );
PanelFieldBoxSizer->Add( MiddleBoxSizer, 0, wxGROW | wxALL, 5 ); PanelFieldBoxSizer->Add( MiddleBoxSizer, 0, wxGROW | wxALL, 5 );
m_ShowFieldTextCtrl = new wxCheckBox( m_PanelField, -1, m_ShowFieldTextCtrl = new wxCheckBox( m_PanelField, -1,
_( "Show Text" ) ); _( "Show Text" ) );
LeftBoxSizer->Add( m_ShowFieldTextCtrl, 0, wxGROW | wxALL, 5 ); LeftBoxSizer->Add( m_ShowFieldTextCtrl, 0, wxGROW | wxALL, 5 );
m_VorientFieldTextCtrl = new wxCheckBox( m_PanelField, -1, m_VorientFieldTextCtrl = new wxCheckBox( m_PanelField, -1,
_( "Vertical" ) ); _( "Vertical" ) );
LeftBoxSizer->Add( m_VorientFieldTextCtrl, 0, wxGROW | wxALL, 5 ); LeftBoxSizer->Add( m_VorientFieldTextCtrl, 0, wxGROW | wxALL, 5 );
// Create the box for field name display or edition // Create the box for field name display or edition
m_FieldNameCtrl = new WinEDA_EnterText( m_PanelField, m_FieldNameCtrl = new WinEDA_EnterText( m_PanelField,
_( "Field Name:" ), m_FieldName[FieldId], _( "Field Name:" ), m_FieldName[FieldId],
LeftBoxSizer, wxSize( 200, -1 ) ); LeftBoxSizer, wxSize( 200, -1 ) );
if ( FieldId < FIELD1 ) m_FieldNameCtrl->Enable(FALSE );
else m_FieldNameCtrl->Enable( TRUE ); if( FieldId < FIELD1 )
m_FieldNameCtrl->Enable( FALSE );
else
m_FieldNameCtrl->Enable( TRUE );
// Create the box for text editing (text, size) // Create the box for text editing (text, size)
m_FieldTextCtrl = new WinEDA_GraphicTextCtrl( m_PanelField, m_FieldTextCtrl = new WinEDA_GraphicTextCtrl( m_PanelField,
@ -455,12 +528,14 @@ int FieldId = m_CurrentFieldId;
m_FieldHJustifyCtrl = new wxRadioBox( m_PanelField, -1, m_FieldHJustifyCtrl = new wxRadioBox( m_PanelField, -1,
_( "Hor Justify" ), wxDefaultPosition, wxDefaultSize, _( "Hor Justify" ), wxDefaultPosition, wxDefaultSize,
3, Hjustify_list, 1, wxRA_SPECIFY_COLS ); 3, Hjustify_list, 1, wxRA_SPECIFY_COLS );
m_FieldHJustifyCtrl->SetSelection( 1 ); m_FieldHJustifyCtrl->SetSelection( 1 );
MiddleBoxSizer->Add( m_FieldHJustifyCtrl, 0, wxGROW | wxALL, 5 ); MiddleBoxSizer->Add( m_FieldHJustifyCtrl, 0, wxGROW | wxALL, 5 );
m_FieldVJustifyCtrl = new wxRadioBox( m_PanelField, -1, m_FieldVJustifyCtrl = new wxRadioBox( m_PanelField, -1,
_( "Vert Justify" ), wxDefaultPosition, wxDefaultSize, _( "Vert Justify" ), wxDefaultPosition, wxDefaultSize,
3, Vjustify_list, 1, wxRA_SPECIFY_COLS ); 3, Vjustify_list, 1, wxRA_SPECIFY_COLS );
m_FieldVJustifyCtrl->SetSelection( 1 ); m_FieldVJustifyCtrl->SetSelection( 1 );
MiddleBoxSizer->Add( m_FieldVJustifyCtrl, 0, wxGROW | wxALL, 5 ); MiddleBoxSizer->Add( m_FieldVJustifyCtrl, 0, wxGROW | wxALL, 5 );
@ -470,23 +545,26 @@ wxString fieldnamelist[NUMBER_OF_FIELDS];
{ {
if( m_FieldName[ii].IsEmpty() ) if( m_FieldName[ii].IsEmpty() )
fieldnamelist[ii] = ReturnDefaultFieldName( ii ); fieldnamelist[ii] = ReturnDefaultFieldName( ii );
else fieldnamelist[ii] = m_FieldName[ii]; else
fieldnamelist[ii] = m_FieldName[ii];
} }
m_FieldSelection = new wxRadioBox( m_PanelField, ID_ON_SELECT_FIELD, m_FieldSelection = new wxRadioBox( m_PanelField, ID_ON_SELECT_FIELD,
_( "Field to edit" ), wxDefaultPosition, wxDefaultSize, _( "Field to edit" ), wxDefaultPosition, wxDefaultSize,
NUMBER_OF_FIELDS, fieldnamelist, 2, wxRA_SPECIFY_COLS ); NUMBER_OF_FIELDS, fieldnamelist, 2, wxRA_SPECIFY_COLS );
PanelFieldBoxSizer->Add( m_FieldSelection, 0, wxGROW | wxALL, 5 ); PanelFieldBoxSizer->Add( m_FieldSelection, 0, wxGROW | wxALL, 5 );
CopyDataToPanelField(); CopyDataToPanelField();
} }
/****************************************************************/ /****************************************************************/
void WinEDA_PartPropertiesFrame::CopyDataToPanelField() void WinEDA_PartPropertiesFrame::CopyDataToPanelField()
/****************************************************************/ /****************************************************************/
/* Set the values displayed on the panel field according to /* 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;
@ -495,15 +573,19 @@ int FieldId = m_CurrentFieldId;
{ {
if( !m_FieldName[ii].IsEmpty() ) if( !m_FieldName[ii].IsEmpty() )
m_FieldSelection->SetString( ii, m_FieldName[ii] ); m_FieldSelection->SetString( ii, m_FieldName[ii] );
else m_FieldSelection->SetString(ii, ReturnDefaultFieldName(ii)); else
m_FieldSelection->SetString( ii, ReturnDefaultFieldName( ii ) );
} }
if( m_FieldFlags[FieldId] ) if( m_FieldFlags[FieldId] )
m_ShowFieldTextCtrl->SetValue( TRUE ); m_ShowFieldTextCtrl->SetValue( TRUE );
else m_ShowFieldTextCtrl->SetValue(FALSE); else
m_ShowFieldTextCtrl->SetValue( FALSE );
if ( m_FieldOrient[FieldId] ) m_VorientFieldTextCtrl->SetValue(TRUE); if( m_FieldOrient[FieldId] )
else m_VorientFieldTextCtrl->SetValue(FALSE); m_VorientFieldTextCtrl->SetValue( TRUE );
else
m_VorientFieldTextCtrl->SetValue( FALSE );
m_FieldHJustifyCtrl->SetSelection( m_FieldHJustify[FieldId] ); m_FieldHJustifyCtrl->SetSelection( m_FieldHJustify[FieldId] );
@ -512,18 +594,21 @@ int FieldId = m_CurrentFieldId;
m_FieldPositionCtrl->SetValue( m_FieldPosition[FieldId].x, m_FieldPosition[FieldId].y ); m_FieldPositionCtrl->SetValue( m_FieldPosition[FieldId].x, m_FieldPosition[FieldId].y );
m_FieldNameCtrl->SetValue( m_FieldName[FieldId] ); m_FieldNameCtrl->SetValue( m_FieldName[FieldId] );
if ( FieldId < FIELD1 ) m_FieldNameCtrl->Enable(FALSE ); if( FieldId < FIELD1 )
else m_FieldNameCtrl->Enable( TRUE ); m_FieldNameCtrl->Enable( FALSE );
else
m_FieldNameCtrl->Enable( TRUE );
m_FieldTextCtrl->SetValue( m_FieldText[FieldId] ); // display new text field m_FieldTextCtrl->SetValue( m_FieldText[FieldId] ); // display new text field
m_FieldTextCtrl->SetValue( m_FieldSize[FieldId] ); // display new size field m_FieldTextCtrl->SetValue( m_FieldSize[FieldId] ); // display new size field
} }
/****************************************************************/ /****************************************************************/
void WinEDA_PartPropertiesFrame::CopyPanelFieldToData() void WinEDA_PartPropertiesFrame::CopyPanelFieldToData()
/****************************************************************/ /****************************************************************/
/* Copy the values displayed on the panel field to the buffers according to /* 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;
@ -542,8 +627,9 @@ int id = m_CurrentFieldId;
/********************************************************************/ /********************************************************************/
void WinEDA_PartPropertiesFrame::SelectNewField( wxCommandEvent& event ) void WinEDA_PartPropertiesFrame::SelectNewField( wxCommandEvent& event )
/********************************************************************/ /********************************************************************/
/* called when changing the current field selected /* 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(); CopyPanelFieldToData();
@ -551,9 +637,11 @@ void WinEDA_PartPropertiesFrame::SelectNewField(wxCommandEvent& event)
CopyDataToPanelField(); CopyDataToPanelField();
} }
/**************************************************************************/ /**************************************************************************/
void WinEDA_PartPropertiesFrame::PartPropertiesAccept( wxCommandEvent& event ) void WinEDA_PartPropertiesFrame::PartPropertiesAccept( wxCommandEvent& event )
/**************************************************************************/ /**************************************************************************/
/* Updaye the current component parameters /* Updaye the current component parameters
*/ */
{ {
@ -570,7 +658,7 @@ int ii, jj;
CopyPanelFieldToData(); CopyPanelFieldToData();
/* A new name could be entered in VALUE field. /* A new name could be entered in VALUE field.
Must not be an existing alias name in alias list box */ * Must not be an existing alias name in alias list box */
jj = m_PartAliasList->GetCount(); jj = m_PartAliasList->GetCount();
wxString newvalue = m_FieldText[VALUE]; wxString newvalue = m_FieldText[VALUE];
for( ii = 0; ii < jj; ii++ ) for( ii = 0; ii < jj; ii++ )
@ -591,7 +679,6 @@ int ii, jj;
CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); CurrentLibEntry->m_KeyWord = m_Keywords->GetValue();
CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); CurrentLibEntry->m_DocFile = m_Docfile->GetValue();
} }
else else
{ {
CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue(); CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue();
@ -630,13 +717,13 @@ int ii, jj;
if( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) 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); 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 // Void fields for REFERENCE and VALUE are not allowed
if( m_FieldText[REFERENCE].IsEmpty() ) if( m_FieldText[REFERENCE].IsEmpty() )
{ {
@ -667,14 +754,17 @@ int ii, jj;
if( Field->m_FieldId == ii ) if( Field->m_FieldId == ii )
{ {
CopyBufferToFieldData( Field ); CopyBufferToFieldData( Field );
// An old field exists; delete it if void // An old field exists; delete it if void
if( Field->m_Text.IsEmpty() ) if( Field->m_Text.IsEmpty() )
{ {
if( ii < FIELD1 || Field->m_Name.IsEmpty() ) if( ii < FIELD1 || Field->m_Name.IsEmpty() )
{ {
delete Field; delete Field;
if ( previousField ) previousField->Pnext = NextField; if( previousField )
else CurrentLibEntry->Fields = NextField; previousField->Pnext = NextField;
else
CurrentLibEntry->Fields = NextField;
} }
} }
break; break;
@ -687,12 +777,14 @@ int ii, jj;
if( Field == NULL ) // Do not exists: must be created if not void if( Field == NULL ) // Do not exists: must be created if not void
{ {
bool create = FALSE; bool create = FALSE;
if ( ! m_FieldText[ii].IsEmpty() ) create = TRUE; if( !m_FieldText[ii].IsEmpty() )
create = TRUE;
if( !m_FieldName[ii].IsEmpty() && ( m_FieldName[ii] != ReturnDefaultFieldName( ii ) ) ) if( !m_FieldName[ii].IsEmpty() && ( m_FieldName[ii] != ReturnDefaultFieldName( ii ) ) )
create = TRUE; create = TRUE;
if( create ) if( create )
{ {
Field = new LibDrawField( ii ); Field = new LibDrawField( ii );
CopyBufferToFieldData( Field ); CopyBufferToFieldData( Field );
Field->Pnext = CurrentLibEntry->Fields; Field->Pnext = CurrentLibEntry->Fields;
CurrentLibEntry->Fields = Field; CurrentLibEntry->Fields = Field;
@ -701,14 +793,15 @@ int ii, jj;
} }
/* for a user field (FieldId >= FIELD1), if a field value is void, /* 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 * 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 */ * (we do not see anything...) and in schematic this text is like a void text */
{ {
LibDrawField* Field = CurrentLibEntry->Fields; LibDrawField* Field = CurrentLibEntry->Fields;
while( Field ) while( Field )
{ {
if( Field->m_FieldId >= FIELD1 ) if( Field->m_FieldId >= FIELD1 )
if ( Field->m_Text.IsEmpty() ) Field->m_Text = wxT("~"); if( Field->m_Text.IsEmpty() )
Field->m_Text = wxT( "~" );
Field = (LibDrawField*) Field->Pnext; Field = (LibDrawField*) Field->Pnext;
} }
} }
@ -722,7 +815,8 @@ int ii, jj;
if( !g_AsDeMorgan ) if( !g_AsDeMorgan )
{ {
g_AsDeMorgan = 1; g_AsDeMorgan = 1;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; if( SetUnsetConvert() )
m_RecreateToolbar = TRUE;
} }
} }
else else
@ -730,7 +824,8 @@ int ii, jj;
if( g_AsDeMorgan ) if( g_AsDeMorgan )
{ {
g_AsDeMorgan = 0; g_AsDeMorgan = 0;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; if( SetUnsetConvert() )
m_RecreateToolbar = TRUE;
} }
} }
@ -748,12 +843,13 @@ int ii, jj;
CurrentLibEntry->m_Options = ENTRY_NORMAL; CurrentLibEntry->m_Options = ENTRY_NORMAL;
/* Set the option "Units locked". /* Set the option "Units locked".
Obviously, cannot be TRUE if there is only one part */ * Obviously, cannot be TRUE if there is only one part */
CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue();
if( CurrentLibEntry->m_UnitCount <= 1 ) if( CurrentLibEntry->m_UnitCount <= 1 )
CurrentLibEntry->m_UnitSelectionLocked = FALSE; CurrentLibEntry->m_UnitSelectionLocked = FALSE;
if ( m_RecreateToolbar ) m_Parent->ReCreateHToolbar(); if( m_RecreateToolbar )
m_Parent->ReCreateHToolbar();
m_Parent->DisplayLibInfos(); m_Parent->DisplayLibInfos();
@ -771,20 +867,22 @@ int ii, jj;
void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) ) void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) )
/******************************************************************************/ /******************************************************************************/
{ {
if( CurrentLibEntry == NULL ) return; if( CurrentLibEntry == NULL )
if ( CurrentAliasName.IsEmpty() ) return; return;
if( CurrentAliasName.IsEmpty() )
return;
m_Doc->SetValue( CurrentLibEntry->m_Doc ); m_Doc->SetValue( CurrentLibEntry->m_Doc );
m_Docfile->SetValue( CurrentLibEntry->m_DocFile ); m_Docfile->SetValue( CurrentLibEntry->m_DocFile );
m_Keywords->SetValue( CurrentLibEntry->m_KeyWord ); m_Keywords->SetValue( CurrentLibEntry->m_KeyWord );
} }
/**********************************************************/ /**********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart( void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
/**********************************************************/ /**********************************************************/
{ {
CurrentAliasName.Empty(); CurrentAliasName.Empty();
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
@ -796,22 +894,25 @@ void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart(
m_ButtonDeleteOneAlias->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 /* 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;
wxString aliasname; 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( "_" ) ); Line.Replace( wxT( " " ), wxT( "_" ) );
aliasname = Line; aliasname = Line;
@ -833,12 +934,14 @@ wxString aliasname;
} }
m_PartAliasList->Append( aliasname ); m_PartAliasList->Append( aliasname );
if ( CurrentAliasName.IsEmpty() ) m_ButtonDeleteAllAlias->Enable(TRUE); if( CurrentAliasName.IsEmpty() )
m_ButtonDeleteAllAlias->Enable( TRUE );
m_ButtonDeleteOneAlias->Enable( TRUE ); m_ButtonDeleteOneAlias->Enable( TRUE );
m_RecreateToolbar = TRUE; m_RecreateToolbar = TRUE;
} }
/********************************************************/ /********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAliasOfPart( void WinEDA_PartPropertiesFrame::DeleteAliasOfPart(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
@ -846,7 +949,8 @@ void WinEDA_PartPropertiesFrame::DeleteAliasOfPart(
{ {
wxString aliasname = m_PartAliasList->GetStringSelection(); wxString aliasname = m_PartAliasList->GetStringSelection();
if ( aliasname.IsEmpty() ) return; if( aliasname.IsEmpty() )
return;
if( aliasname == CurrentAliasName ) if( aliasname == CurrentAliasName )
{ {
wxString msg = CurrentAliasName + _( " is Current Selected Alias!" ); wxString msg = CurrentAliasName + _( " is Current Selected Alias!" );
@ -866,25 +970,27 @@ wxString aliasname = m_PartAliasList->GetStringSelection();
} }
/********************************************************************/ /********************************************************************/
bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit ) bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit )
/********************************************************************/ /********************************************************************/
/* Routine de modification du nombre d'unites par package pour le /* Routine de modification du nombre d'unites par package pour le
composant courant; * composant courant;
*/ */
{ {
int OldNumUnits, ii, FlagDel = -1; int OldNumUnits, ii, FlagDel = -1;
LibEDA_BaseStruct* DrawItem, * NextDrawItem; LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( CurrentLibEntry == NULL ) return FALSE; if( CurrentLibEntry == NULL )
return FALSE;
/* Si pas de changement: termine */ /* Si pas de changement: termine */
if ( CurrentLibEntry->m_UnitCount == MaxUnit ) return FALSE; if( CurrentLibEntry->m_UnitCount == MaxUnit )
return FALSE;
OldNumUnits = CurrentLibEntry->m_UnitCount; OldNumUnits = CurrentLibEntry->m_UnitCount;
if ( OldNumUnits < 1 ) OldNumUnits = 1; if( OldNumUnits < 1 )
OldNumUnits = 1;
CurrentLibEntry->m_UnitCount = MaxUnit; CurrentLibEntry->m_UnitCount = MaxUnit;
@ -903,7 +1009,8 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( IsOK( this, _( "Delete units" ) ) ) if( IsOK( this, _( "Delete units" ) ) )
{ {
/* Si part selectee n'existe plus: selection 1ere unit */ /* Si part selectee n'existe plus: selection 1ere unit */
if( CurrentUnit > MaxUnit ) CurrentUnit = 1; if( CurrentUnit > MaxUnit )
CurrentUnit = 1;
FlagDel = 1; FlagDel = 1;
} }
else else
@ -918,6 +1025,7 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
DrawItem, 0 ); DrawItem, 0 );
} }
} }
return TRUE; return TRUE;
} }
@ -946,8 +1054,9 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
/*****************************************************/ /*****************************************************/
bool WinEDA_PartPropertiesFrame::SetUnsetConvert() bool WinEDA_PartPropertiesFrame::SetUnsetConvert()
/*****************************************************/ /*****************************************************/
/* crée ou efface (selon option AsConvert) les éléments /* 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; int FlagDel = 0;
@ -956,11 +1065,13 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
if( g_AsDeMorgan ) /* Representation convertie a creer */ if( g_AsDeMorgan ) /* Representation convertie a creer */
{ {
/* Traitement des elements a ajouter ( pins seulement ) */ /* Traitement des elements a ajouter ( pins seulement ) */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; if( CurrentLibEntry )
DrawItem = CurrentLibEntry->m_Drawings;
for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) for( ; DrawItem != NULL; DrawItem = DrawItem->Next() )
{ {
/* Duplication des items pour autres elements */ /* Duplication des items pour autres elements */
if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) continue; if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE )
continue;
if( DrawItem->m_Convert == 1 ) if( DrawItem->m_Convert == 1 )
{ {
if( FlagDel == 0 ) if( FlagDel == 0 )
@ -982,11 +1093,11 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
} }
} }
} }
else /* Representation convertie a supprimer */ else /* Representation convertie a supprimer */
{ {
/* Traitement des elements à supprimer */ /* Traitement des elements à supprimer */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; if( CurrentLibEntry )
DrawItem = CurrentLibEntry->m_Drawings;
for( ; DrawItem != NULL; DrawItem = NextDrawItem ) for( ; DrawItem != NULL; DrawItem = NextDrawItem )
{ {
NextDrawItem = DrawItem->Next(); NextDrawItem = DrawItem->Next();
@ -1006,18 +1117,24 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
} }
} }
m_Parent->GetScreen()->SetModify(); m_Parent->GetScreen()->SetModify();
DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, DrawItem, 0); DeleteOneLibraryDrawStruct( m_Parent->DrawPanel,
NULL,
CurrentLibEntry,
DrawItem,
0 );
} }
} }
} }
return TRUE; return TRUE;
} }
/****************************************************************************/ /****************************************************************************/
void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event ) void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event )
/****************************************************************************/ /****************************************************************************/
{ {
wxString FullFileName, mask; wxString FullFileName, mask;
wxString docpath( g_RealLibDirBuffer ), filename; wxString docpath( g_RealLibDirBuffer ), filename;
docpath += wxT( "doc" ); docpath += wxT( "doc" );
@ -1032,7 +1149,8 @@ wxString docpath(g_RealLibDirBuffer), filename;
wxFD_OPEN, wxFD_OPEN,
TRUE TRUE
); );
if ( FullFileName.IsEmpty() ) return; if( FullFileName.IsEmpty() )
return;
// Suppression du chemin par defaut pour le fichier de doc: // Suppression du chemin par defaut pour le fichier de doc:
filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString ); filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString );
@ -1045,7 +1163,6 @@ void WinEDA_PartPropertiesFrame::DeleteAllFootprintFilter(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
/**********************************************************/ /**********************************************************/
{ {
if( IsOK( this, _( "Ok to Delete FootprintFilter LIST" ) ) ) if( IsOK( this, _( "Ok to Delete FootprintFilter LIST" ) ) )
{ {
m_FootprintFilterListBox->Clear(); m_FootprintFilterListBox->Clear();
@ -1054,18 +1171,22 @@ void WinEDA_PartPropertiesFrame::DeleteAllFootprintFilter(
} }
} }
/*******************************************************************************/ /*******************************************************************************/
void WinEDA_PartPropertiesFrame::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) ) void WinEDA_PartPropertiesFrame::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) )
/*******************************************************************************/ /*******************************************************************************/
/* Add a new name to the alias list box /* 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( "_" ) );
@ -1085,12 +1206,14 @@ wxString Line;
m_ButtonDeleteOneFootprintFilter->Enable( TRUE ); m_ButtonDeleteOneFootprintFilter->Enable( TRUE );
} }
/********************************************************/ /********************************************************/
void WinEDA_PartPropertiesFrame::DeleteOneFootprintFilter( void WinEDA_PartPropertiesFrame::DeleteOneFootprintFilter(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
/********************************************************/ /********************************************************/
{ {
int ii = m_FootprintFilterListBox->GetSelection(); int ii = m_FootprintFilterListBox->GetSelection();
m_FootprintFilterListBox->Delete( ii ); m_FootprintFilterListBox->Delete( ii );
if( !CurrentLibEntry || (m_FootprintFilterListBox->GetCount() == 0) ) if( !CurrentLibEntry || (m_FootprintFilterListBox->GetCount() == 0) )
@ -1099,5 +1222,3 @@ int ii = m_FootprintFilterListBox->GetSelection();
m_ButtonDeleteOneFootprintFilter->Enable( FALSE ); m_ButtonDeleteOneFootprintFilter->Enable( FALSE );
} }
} }

View File

@ -20,8 +20,8 @@
#include "dialog_erc.h" #include "dialog_erc.h"
/* On teste /* On teste
1 - conflits entre pins connectees ( ex: 2 sorties connectees ) * 1 - conflits entre pins connectees ( ex: 2 sorties connectees )
2 - les imperatifs minimaux ( 1 entree doit etre connectee a une sortie ) * 2 - les imperatifs minimaux ( 1 entree doit etre connectee a une sortie )
*/ */
@ -46,16 +46,16 @@ static void TestLabel(WinEDA_DrawPanel * panel, wxDC * DC,
int WriteFichierERC = FALSE; int WriteFichierERC = FALSE;
/* Tableau des types de conflit : /* Tableau des types de conflit :
PIN_INPUT, PIN_OUTPUT, PIN_BIDI, PIN_TRISTATE, PIN_PASSIVE, * PIN_INPUT, PIN_OUTPUT, PIN_BIDI, PIN_TRISTATE, PIN_PASSIVE,
PIN_UNSPECIFIED, PIN_POWER_IN, PIN_POWER_OUT, PIN_OPENCOLLECTOR, * PIN_UNSPECIFIED, PIN_POWER_IN, PIN_POWER_OUT, PIN_OPENCOLLECTOR,
PIN_OPENEMITTER, PIN_NC * PIN_OPENEMITTER, PIN_NC
*/ */
#define OK 0 #define OK 0
#define WAR 1 // utilisé aussi dans eeredraw #define WAR 1 // utilisé aussi dans eeredraw
#define ERR 2 #define ERR 2
#define UNC 3 #define UNC 3
static wxChar * CommentERC_H[] = static const wxChar* CommentERC_H[] =
{ {
wxT( "Input Pin...." ), wxT( "Input Pin...." ),
wxT( "Output Pin..." ), wxT( "Output Pin..." ),
@ -70,7 +70,7 @@ static wxChar * CommentERC_H[] =
wxT( "No Conn......" ), wxT( "No Conn......" ),
NULL NULL
}; };
static wxChar * CommentERC_V[] = static const wxChar* CommentERC_V[] =
{ {
wxT( "Input Pin" ), wxT( "Input Pin" ),
wxT( "Output Pin" ), wxT( "Output Pin" ),
@ -88,15 +88,15 @@ static wxChar * CommentERC_V[] =
/* Look up table which gives the diag for a pair of connected pins /* Look up table which gives the diag for a pair of connected pins
Can be modified by ERC options. * Can be modified by ERC options.
at start up: must be loaded by DefaultDiagErc * at start up: must be loaded by DefaultDiagErc
*/ */
static int DiagErc[PIN_NMAX][PIN_NMAX]; 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 /* Default Look up table which gives the diag for a pair of connected pins
Same as DiagErc, but cannot be modified * Same as DiagErc, but cannot be modified
Used to init or reset DiagErc * Used to init or reset DiagErc
*/ */
static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] = static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] =
{ /* I, O, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ { /* I, O, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */
@ -121,13 +121,13 @@ static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] =
#define NOC 0 /* Pin isolee, non connectee */ #define NOC 0 /* Pin isolee, non connectee */
/* Look up table which gives the minimal drive for a pair of connected pins on a net /* 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) * 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, or NOD (Not Driven) or DRV (DRIven)
*
Can be updated to NET_NC only if the previous state is NOC * 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 are OK when their final state is NET_NC or DRV
Nets with the state NOD have no source signal * Nets with the state NOD have no source signal
*/ */
static int MinimalReq[PIN_NMAX][PIN_NMAX] = static int MinimalReq[PIN_NMAX][PIN_NMAX] =
{ /* In, Out, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ { /* In, Out, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */
@ -145,15 +145,15 @@ static int MinimalReq[PIN_NMAX][PIN_NMAX] =
}; };
/*************************************************************/ /*************************************************************/
void InstallErcFrame( WinEDA_SchematicFrame* parent, wxPoint& pos ) void InstallErcFrame( WinEDA_SchematicFrame* parent, wxPoint& pos )
/*************************************************************/ /*************************************************************/
/* Install function for the ERC dialog frame /* Install function for the ERC dialog frame
*/ */
{ {
WinEDA_ErcFrame* frame = new WinEDA_ErcFrame( parent ); WinEDA_ErcFrame* frame = new WinEDA_ErcFrame( parent );
frame->ShowModal(); frame->Destroy(); frame->ShowModal(); frame->Destroy();
} }
@ -161,11 +161,13 @@ void InstallErcFrame(WinEDA_SchematicFrame *parent, wxPoint & pos)
/*********************************************/ /*********************************************/
void WinEDA_ErcFrame::ReBuildMatrixPanel() void WinEDA_ErcFrame::ReBuildMatrixPanel()
/*********************************************/ /*********************************************/
/* Build or rebuild the panel showing the ERC matrix /* Build or rebuild the panel showing the ERC matrix
*/ */
{ {
int ii, jj, event_id, text_height; int ii, jj, event_id, text_height;
wxPoint pos, BoxMatrixPosition; wxPoint pos, BoxMatrixPosition;
#define BITMAP_SIZE 19 #define BITMAP_SIZE 19
int bitmap_size = BITMAP_SIZE; int bitmap_size = BITMAP_SIZE;
wxStaticText* text; wxStaticText* text;
@ -180,14 +182,17 @@ wxSize BoxMatrixMinSize;
// Get the current text size : // Get the current text size :
text = new wxStaticText( m_PanelERCOptions, -1, wxT( "W" ), pos ); // this is a dummy text text = new wxStaticText( m_PanelERCOptions, -1, wxT( "W" ), pos ); // this is a dummy text
text_height = text->GetRect().GetHeight(); text_height = text->GetRect().GetHeight();
bitmap_size = MAX( bitmap_size, text_height ); bitmap_size = MAX( bitmap_size, text_height );
delete text; delete text;
// compute the Y pos interval: // compute the Y pos interval:
BoxMatrixMinSize.y = ( bitmap_size * (PIN_NMAX + 1) ) + 5; BoxMatrixMinSize.y = ( bitmap_size * (PIN_NMAX + 1) ) + 5;
GetSizer()->Fit( this ); GetSizer()->Fit( this );
GetSizer()->SetSizeHints( this ); GetSizer()->SetSizeHints( this );
pos = m_MatrixSizer->GetPosition(); pos = m_MatrixSizer->GetPosition();
// Size computation is not made in constructor, in some wxWidgets version, // 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 // and m_BoxSizerForERC_Opt position is always 0,0. and we can't use it
pos.x = MAX( pos.x, 5 ); pos.x = MAX( pos.x, 5 );
@ -203,12 +208,15 @@ wxSize BoxMatrixMinSize;
{ {
y = pos.y + (ii * bitmap_size); y = pos.y + (ii * bitmap_size);
text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_H[ii], wxPoint( 5, y ) ); text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_H[ii], wxPoint( 5, y ) );
x = text->GetRect().GetRight(); x = text->GetRect().GetRight();
pos.x = MAX( pos.x, x ); pos.x = MAX( pos.x, x );
} }
pos.x += 5; pos.x += 5;
} }
else pos = m_ButtonList[0][0]->GetPosition(); else
pos = m_ButtonList[0][0]->GetPosition();
for( ii = 0; ii < PIN_NMAX; ii++ ) for( ii = 0; ii < PIN_NMAX; ii++ )
{ {
@ -222,10 +230,12 @@ wxSize BoxMatrixMinSize;
wxPoint txtpos; wxPoint txtpos;
txtpos.x = x + 4; txtpos.y = y - bitmap_size; txtpos.x = x + 4; txtpos.y = y - bitmap_size;
text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_V[ii], txtpos ); text = new wxStaticText( m_PanelERCOptions, -1, CommentERC_V[ii], txtpos );
BoxMatrixMinSize.x = MAX( BoxMatrixMinSize.x, text->GetRect().GetRight() ); BoxMatrixMinSize.x = MAX( BoxMatrixMinSize.x, text->GetRect().GetRight() );
} }
event_id = ID_MATRIX_0 + ii + (jj * PIN_NMAX); event_id = ID_MATRIX_0 + ii + (jj * PIN_NMAX);
delete m_ButtonList[ii][jj]; delete m_ButtonList[ii][jj];
switch( diag ) switch( diag )
{ {
case OK: case OK:
@ -233,6 +243,7 @@ wxSize BoxMatrixMinSize;
event_id, event_id,
wxBitmap (green_xpm), wxBitmap (green_xpm),
wxPoint (x, y) ); wxPoint (x, y) );
break; break;
case WAR: case WAR:
@ -240,6 +251,7 @@ wxSize BoxMatrixMinSize;
event_id, event_id,
wxBitmap (warning_xpm), wxBitmap (warning_xpm),
wxPoint (x, y) ); wxPoint (x, y) );
break; break;
case ERR: case ERR:
@ -247,6 +259,7 @@ wxSize BoxMatrixMinSize;
event_id, event_id,
wxBitmap (error_xpm), wxBitmap (error_xpm),
wxPoint (x, y) ); wxPoint (x, y) );
break; break;
} }
} }
@ -267,7 +280,11 @@ wxSize BoxMatrixMinSize;
void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
/**************************************************/ /**************************************************/
{ {
ObjetNetListStruct * NetItemRef, * OldItem, * StartNet, * Lim; ObjetNetListStruct* NetItemRef;
ObjetNetListStruct* OldItem;
ObjetNetListStruct* StartNet;
ObjetNetListStruct* Lim;
int NetNbItems, MinConn; int NetNbItems, MinConn;
if( !DiagErcTableInit ) if( !DiagErcTableInit )
@ -297,12 +314,14 @@ wxClientDC dc(m_Parent->DrawPanel);
/* Cleanup the entire hierarchy */ /* Cleanup the entire hierarchy */
EDA_ScreenList ScreenList( NULL ); EDA_ScreenList ScreenList( NULL );
for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() )
{ {
bool ModifyWires; bool ModifyWires;
ModifyWires = Screen->SchematicCleanUp( NULL ); ModifyWires = Screen->SchematicCleanUp( NULL );
/* if wire list has changed, delete Udo Redo list to avoid /* if wire list has changed, delete Udo Redo list to avoid
pointers on deleted data problems */ * pointers on deleted data problems */
if( ModifyWires ) if( ModifyWires )
Screen->ClearUndoRedoList(); Screen->ClearUndoRedoList();
} }
@ -316,14 +335,19 @@ wxClientDC dc(m_Parent->DrawPanel);
for( NetItemRef = g_TabObjNet; NetItemRef < Lim; NetItemRef++ ) for( NetItemRef = g_TabObjNet; NetItemRef < Lim; NetItemRef++ )
NetItemRef->m_FlagOfConnection = (IsConnectType) 0; NetItemRef->m_FlagOfConnection = (IsConnectType) 0;
NetNbItems = 0; MinConn = NOC; NetNbItems = 0;
MinConn = NOC;
StartNet = OldItem = NetItemRef = g_TabObjNet; StartNet = OldItem = NetItemRef = g_TabObjNet;
for( ; NetItemRef < Lim; NetItemRef++ ) for( ; NetItemRef < Lim; NetItemRef++ )
{ {
/* Tst changement de net */ /* Tst changement de net */
if( OldItem->m_NetCode != NetItemRef->m_NetCode ) if( OldItem->m_NetCode != NetItemRef->m_NetCode )
{ {
MinConn = NOC; NetNbItems = 0; StartNet = NetItemRef; MinConn = NOC;
NetNbItems = 0;
StartNet = NetItemRef;
} }
switch( NetItemRef->m_Type ) switch( NetItemRef->m_Type )
@ -354,6 +378,7 @@ wxClientDC dc(m_Parent->DrawPanel);
NetItemRef, StartNet, &NetNbItems, &MinConn ); NetItemRef, StartNet, &NetNbItems, &MinConn );
break; break;
} }
OldItem = NetItemRef; OldItem = NetItemRef;
} }
@ -384,7 +409,8 @@ wxClientDC dc(m_Parent->DrawPanel);
wxFD_SAVE, wxFD_SAVE,
TRUE TRUE
); );
if ( ErcFullFileName.IsEmpty()) return; if( ErcFullFileName.IsEmpty() )
return;
if( WriteDiagnosticERC( ErcFullFileName ) ) if( WriteDiagnosticERC( ErcFullFileName ) )
{ {
@ -400,11 +426,13 @@ wxClientDC dc(m_Parent->DrawPanel);
/***********************************************************/ /***********************************************************/
void WinEDA_ErcFrame::DelERCMarkers( wxCommandEvent& event ) void WinEDA_ErcFrame::DelERCMarkers( wxCommandEvent& event )
/***********************************************************/ /***********************************************************/
/* Delete the old ERC markers, over the whole hierarchy /* Delete the old ERC markers, over the whole hierarchy
*/ */
{ {
EDA_BaseStruct* DrawStruct; EDA_BaseStruct* DrawStruct;
DrawMarkerStruct* Marker; DrawMarkerStruct* Marker;
wxClientDC dc( m_Parent->DrawPanel ); wxClientDC dc( m_Parent->DrawPanel );
m_Parent->DrawPanel->PrepareGraphicContext( &dc ); m_Parent->DrawPanel->PrepareGraphicContext( &dc );
@ -413,12 +441,14 @@ wxClientDC dc(m_Parent->DrawPanel);
DrawStruct = m_Parent->GetScreen()->EEDrawList; DrawStruct = m_Parent->GetScreen()->EEDrawList;
for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext )
{ {
if(DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) continue; if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE )
continue;
/* Marqueur trouve */ /* Marqueur trouve */
Marker = (DrawMarkerStruct*) DrawStruct; Marker = (DrawMarkerStruct*) DrawStruct;
if( Marker->m_Type == MARQ_ERC ) if( Marker->m_Type == MARQ_ERC )
RedrawOneStruct( m_Parent->DrawPanel, &dc, Marker, g_XorMode ); RedrawOneStruct( m_Parent->DrawPanel, &dc, Marker, g_XorMode );
} }
/* Suppression en memoire des marqueurs ERC */ /* Suppression en memoire des marqueurs ERC */
DeleteAllMarkers( MARQ_ERC ); DeleteAllMarkers( MARQ_ERC );
} }
@ -427,6 +457,7 @@ wxClientDC dc(m_Parent->DrawPanel);
/**************************************************************/ /**************************************************************/
void WinEDA_ErcFrame::ResetDefaultERCDiag( wxCommandEvent& event ) void WinEDA_ErcFrame::ResetDefaultERCDiag( wxCommandEvent& event )
/**************************************************************/ /**************************************************************/
/* Remet aux valeurs par defaut la matrice de diagnostic /* Remet aux valeurs par defaut la matrice de diagnostic
*/ */
{ {
@ -434,9 +465,11 @@ void WinEDA_ErcFrame::ResetDefaultERCDiag(wxCommandEvent& event)
ReBuildMatrixPanel(); 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 /* Change the error level for the pressed button, on the matrix table
*/ */
{ {
@ -453,6 +486,7 @@ wxPoint pos;
x = ii / PIN_NMAX; y = ii % PIN_NMAX; x = ii / PIN_NMAX; y = ii % PIN_NMAX;
level = DiagErc[y][x]; level = DiagErc[y][x];
switch( level ) switch( level )
{ {
case OK: case OK:
@ -469,7 +503,6 @@ wxPoint pos;
level = OK; level = OK;
new_bitmap_xpm = green_xpm; new_bitmap_xpm = green_xpm;
break; break;
} }
if( new_bitmap_xpm ) if( new_bitmap_xpm )
@ -477,6 +510,7 @@ wxPoint pos;
delete Butt; delete Butt;
Butt = new wxBitmapButton( m_PanelERCOptions, id, Butt = new wxBitmapButton( m_PanelERCOptions, id,
wxBitmap (new_bitmap_xpm), pos ); wxBitmap (new_bitmap_xpm), pos );
m_ButtonList[y][x] = Butt; m_ButtonList[y][x] = Butt;
DiagErc[y][x] = DiagErc[x][y] = level; DiagErc[y][x] = DiagErc[x][y] = level;
} }
@ -489,9 +523,10 @@ static void Diagnose(WinEDA_DrawPanel * panel, wxDC * DC,
ObjetNetListStruct* NetItemTst, ObjetNetListStruct* NetItemTst,
int MinConn, int Diag ) int MinConn, int Diag )
/********************************************************/ /********************************************************/
/* Routine de creation du marqueur ERC correspondant au conflit electrique /* Routine de creation du marqueur ERC correspondant au conflit electrique
entre NetItemRef et NetItemTst * entre NetItemRef et NetItemTst
si MinConn < 0: Traitement des erreurs sur labels * si MinConn < 0: Traitement des erreurs sur labels
*/ */
{ {
DrawMarkerStruct* Marker = NULL; DrawMarkerStruct* Marker = NULL;
@ -499,10 +534,12 @@ wxString DiagLevel;
SCH_SCREEN* screen; SCH_SCREEN* screen;
int ii, jj; int ii, jj;
if( Diag == OK ) return; if( Diag == OK )
return;
/* Creation du nouveau marqueur type Erreur ERC */ /* Creation du nouveau marqueur type Erreur ERC */
Marker = new DrawMarkerStruct( NetItemRef->m_Start, wxEmptyString ); Marker = new DrawMarkerStruct( NetItemRef->m_Start, wxEmptyString );
Marker->m_Type = MARQ_ERC; Marker->m_Type = MARQ_ERC;
Marker->m_MarkFlags = WAR; Marker->m_MarkFlags = WAR;
screen = NetItemRef->m_Screen; screen = NetItemRef->m_Screen;
@ -513,16 +550,18 @@ int ii, jj;
if( MinConn < 0 ) // Traitement des erreurs sur labels if( MinConn < 0 ) // Traitement des erreurs sur labels
{ {
if( (NetItemRef->m_Type == NET_GLOBLABEL) || if( (NetItemRef->m_Type == NET_GLOBLABEL)
(NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) || (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) )
{ {
Marker->m_Comment.Printf( _( "Warning GLabel %s not connected to SheetLabel" ), Marker->m_Comment.Printf( _( "Warning GLabel %s not connected to SheetLabel" ),
NetItemRef->m_Label->GetData() ); NetItemRef->m_Label->GetData() );
} }
else Marker->m_Comment.Printf( _("Warning SheetLabel %s not connected to GLabel"), else
Marker->m_Comment.Printf( _( "Warning SheetLabel %s not connected to GLabel" ),
NetItemRef->m_Label->GetData() ); NetItemRef->m_Label->GetData() );
if( screen == panel->GetScreen() ) RedrawOneStruct(panel, DC, Marker, GR_COPY); if( screen == panel->GetScreen() )
RedrawOneStruct( panel, DC, Marker, GR_COPY );
return; return;
} }
@ -556,7 +595,6 @@ int ii, jj;
RedrawOneStruct( panel, DC, Marker, GR_COPY ); RedrawOneStruct( panel, DC, Marker, GR_COPY );
return; return;
} }
} }
if( NetItemTst ) /* Erreur entre 2 pins */ if( NetItemTst ) /* Erreur entre 2 pins */
@ -570,8 +608,9 @@ int ii, jj;
g_EESchemaVar.NbWarningErc--; g_EESchemaVar.NbWarningErc--;
} }
Marker->m_Comment.Printf( _(
Marker->m_Comment.Printf( _("%s: Pin %s connected to Pin %s (net %d)"), DiagLevel.GetData(), "%s: Pin %s connected to Pin %s (net %d)" ),
DiagLevel.GetData(),
MsgPinElectricType[ii], MsgPinElectricType[ii],
MsgPinElectricType[jj], NetItemRef->m_NetCode ); MsgPinElectricType[jj], NetItemRef->m_NetCode );
@ -587,16 +626,20 @@ static void TestOthersItems(WinEDA_DrawPanel * panel, wxDC * DC,
ObjetNetListStruct* netstart, ObjetNetListStruct* netstart,
int* NetNbItems, int* MinConnexion ) int* NetNbItems, int* MinConnexion )
/********************************************************************/ /********************************************************************/
/* Routine testant les conflits electriques entre /* Routine testant les conflits electriques entre
NetItemRef * NetItemRef
et les autres items du meme net * et les autres items du meme net
*/ */
{ {
ObjetNetListStruct * NetItemTst, * Lim; ObjetNetListStruct* NetItemTst;
ObjetNetListStruct* Lim;
int ref_elect_type, jj, erc = OK, local_minconn; int ref_elect_type, jj, erc = OK, local_minconn;
/* Analyse de la table des connexions : */ /* Analyse de la table des connexions : */
Lim = g_TabObjNet + g_NbrObjNet; // pointe la fin de la liste Lim = g_TabObjNet + g_NbrObjNet; // pointe la fin de la liste
ref_elect_type = NetItemRef->m_ElectricalType; ref_elect_type = NetItemRef->m_ElectricalType;
NetItemTst = netstart; NetItemTst = netstart;
@ -605,14 +648,15 @@ int ref_elect_type, jj, erc = OK, local_minconn;
/* Examen de la liste des Pins connectees a NetItemRef */ /* Examen de la liste des Pins connectees a NetItemRef */
for( ; ; NetItemTst++ ) for( ; ; NetItemTst++ )
{ {
if ( NetItemRef == NetItemTst ) continue; if( NetItemRef == NetItemTst )
continue;
/* Est - on toujours dans le meme net ? */ /* Est - on toujours dans le meme net ? */
if( (NetItemTst >= Lim) || // fin de liste (donc fin de net) if( (NetItemTst >= Lim) // fin de liste (donc fin de net)
(NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) // fin de net || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) // fin de net
{ /* Fin de netcode trouve: Tst connexion minimum */ { /* Fin de netcode trouve: Tst connexion minimum */
if( (*MinConnexion < NET_NC ) && if( (*MinConnexion < NET_NC )
(local_minconn < NET_NC ) ) /* pin non connectée ou non pilotee */ && (local_minconn < NET_NC ) ) /* pin non connectée ou non pilotee */
{ {
Diagnose( panel, DC, NetItemRef, NULL, local_minconn, WAR ); Diagnose( panel, DC, NetItemRef, NULL, local_minconn, WAR );
*MinConnexion = DRV; // inhibition autres messages de ce type pour ce net *MinConnexion = DRV; // inhibition autres messages de ce type pour ce net
@ -642,7 +686,9 @@ int ref_elect_type, jj, erc = OK, local_minconn;
jj = NetItemTst->m_ElectricalType; jj = NetItemTst->m_ElectricalType;
local_minconn = MAX( MinimalReq[ref_elect_type][jj], local_minconn ); local_minconn = MAX( MinimalReq[ref_elect_type][jj], local_minconn );
if ( NetItemTst <= NetItemRef ) break; if( NetItemTst <= NetItemRef )
break;
*NetNbItems += 1; *NetNbItems += 1;
if( erc == OK ) // 1 marqueur par pin maxi if( erc == OK ) // 1 marqueur par pin maxi
{ {
@ -665,6 +711,7 @@ int ref_elect_type, jj, erc = OK, local_minconn;
/********************************************************/ /********************************************************/
static bool WriteDiagnosticERC( const wxString& FullFileName ) static bool WriteDiagnosticERC( const wxString& FullFileName )
/*********************************************************/ /*********************************************************/
/* Create the Diagnostic file (<xxx>.erc file) /* Create the Diagnostic file (<xxx>.erc file)
*/ */
{ {
@ -675,19 +722,24 @@ static FILE * OutErc;
DrawSheetStruct* Sheet; DrawSheetStruct* Sheet;
wxString msg; wxString msg;
if( (OutErc = wxFopen( FullFileName, wxT("wt"))) == NULL ) return FALSE; if( ( OutErc = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL )
return FALSE;
DateAndTime( Line ); DateAndTime( Line );
msg = _( "ERC control" ); msg = _( "ERC control" );
fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8( msg ), Line ); fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8( msg ), Line );
EDA_ScreenList ScreenList( NULL ); EDA_ScreenList ScreenList( NULL );
for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() ) for( SCH_SCREEN* Screen = ScreenList.GetFirst(); Screen != NULL; Screen = ScreenList.GetNext() )
{ {
Sheet = (DrawSheetStruct*) Screen; Sheet = (DrawSheetStruct*) Screen;
msg.Printf( _( "\n***** Sheet %d (%s)\n" ), msg.Printf( _( "\n***** Sheet %d (%s)\n" ),
Sheet->m_SheetNumber, Sheet->m_SheetNumber,
Screen == ScreenSch ? _( "Root" ) : Sheet->m_SheetName.GetData() ); Screen == ScreenSch ? _( "Root" ) : Sheet->m_SheetName.GetData() );
fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
DrawStruct = Screen->EEDrawList; DrawStruct = Screen->EEDrawList;
@ -698,15 +750,19 @@ wxString msg;
/* Marqueur trouve */ /* Marqueur trouve */
Marker = (DrawMarkerStruct*) DrawStruct; Marker = (DrawMarkerStruct*) DrawStruct;
if( Marker->m_Type != MARQ_ERC ) continue; if( Marker->m_Type != MARQ_ERC )
continue;
/* Write diag marqueur */ /* Write diag marqueur */
msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ), msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ),
Marker->GetComment().GetData(), Marker->GetComment().GetData(),
(float) Marker->m_Pos.x / 1000, (float) Marker->m_Pos.x / 1000,
(float) Marker->m_Pos.y / 1000 ); (float) Marker->m_Pos.y / 1000 );
fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
} }
} }
msg.Printf( _( "\n >> Errors ERC: %d\n" ), g_EESchemaVar.NbErrorErc ); msg.Printf( _( "\n >> Errors ERC: %d\n" ), g_EESchemaVar.NbErrorErc );
fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
fclose( OutErc ); fclose( OutErc );
@ -719,8 +775,9 @@ wxString msg;
void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC, void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC,
ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet ) ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet )
/***********************************************************************/ /***********************************************************************/
/* Routine controlant qu'un sheetLabel est bien connecte a un Glabel de la /* Routine controlant qu'un sheetLabel est bien connecte a un Glabel de la
sous-feuille correspondante * sous-feuille correspondante
*/ */
{ {
ObjetNetListStruct* NetItemTst, * Lim; ObjetNetListStruct* NetItemTst, * Lim;
@ -734,21 +791,24 @@ int erc = 1;
/* Examen de la liste des Labels connectees a NetItemRef */ /* Examen de la liste des Labels connectees a NetItemRef */
for( ; ; NetItemTst++ ) for( ; ; NetItemTst++ )
{ {
if( NetItemTst == NetItemRef ) continue; if( NetItemTst == NetItemRef )
continue;
/* Est - on toujours dans le meme net ? */ /* Est - on toujours dans le meme net ? */
if( ( NetItemTst == Lim ) || if( ( NetItemTst == Lim )
( NetItemRef->m_NetCode != NetItemTst->m_NetCode ) ) || ( NetItemRef->m_NetCode != NetItemTst->m_NetCode ) )
{ /* Fin de netcode trouve */ {
/* Fin de netcode trouve */
if( erc ) if( erc )
{ /* GLabel ou SheetLabel orphelin */ {
/* GLabel ou SheetLabel orphelin */
Diagnose( panel, DC, NetItemRef, NULL, -1, WAR ); Diagnose( panel, DC, NetItemRef, NULL, -1, WAR );
} }
return; return;
} }
if( (NetItemRef->m_Type == NET_GLOBLABEL) || if( (NetItemRef->m_Type == NET_GLOBLABEL)
(NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) ) || (NetItemRef->m_Type == NET_GLOBBUSLABELMEMBER) )
{ {
switch( NetItemTst->m_Type ) switch( NetItemTst->m_Type )
{ {
@ -774,7 +834,6 @@ int erc = 1;
break; break;
} }
} }
else else
{ {
switch( NetItemTst->m_Type ) switch( NetItemTst->m_Type )
@ -803,5 +862,3 @@ int erc = 1;
} }
} }
} }

View File

@ -52,13 +52,14 @@ enum id_libedit {
/************************************************/ /************************************************/
class WinEDA_PartPropertiesFrame : public wxDialog class WinEDA_PartPropertiesFrame : public wxDialog
/************************************************/ /************************************************/
/* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés /* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés
d'un composant le librairie. * d'un composant le librairie.
On peut éditer: * On peut éditer:
Texte dimensions et justification de tous les champs (Ref, Val, et autres champs) * Texte dimensions et justification de tous les champs (Ref, Val, et autres champs)
Documentation et mots clefs * Documentation et mots clefs
Nombre de part par boitier * Nombre de part par boitier
et autres propriérés générales * et autres propriérés générales
*/ */
{ {
private: private:
@ -97,6 +98,7 @@ private:
public: public:
// Constructor and destructor // Constructor and destructor
WinEDA_PartPropertiesFrame( WinEDA_LibeditFrame * parent, wxPoint & pos ); WinEDA_PartPropertiesFrame( WinEDA_LibeditFrame * parent, wxPoint & pos );
~WinEDA_PartPropertiesFrame() ~WinEDA_PartPropertiesFrame()
@ -139,6 +141,7 @@ wxPoint fpos = pos;
WinEDA_PartPropertiesFrame* frame = WinEDA_PartPropertiesFrame* frame =
new WinEDA_PartPropertiesFrame( this, fpos ); new WinEDA_PartPropertiesFrame( this, fpos );
frame->ShowModal(); frame->Destroy(); frame->ShowModal(); frame->Destroy();
} }
@ -199,11 +202,12 @@ int ii;
Field = (LibDrawField*) Field->Pnext; Field = (LibDrawField*) Field->Pnext;
} }
} }
else
else SetTitle(_("Lib Component Properties")); SetTitle( _( "Lib Component Properties" ) );
m_NoteBook = new wxNotebook( this, ID_LIBEDIT_NOTEBOOK, m_NoteBook = new wxNotebook( this, ID_LIBEDIT_NOTEBOOK,
wxDefaultPosition, wxSize (XSIZE - 6, YSIZE - 70) ); wxDefaultPosition, wxSize (XSIZE - 6, YSIZE - 70) );
SetFont( *g_DialogFont ); SetFont( *g_DialogFont );
m_NoteBook->SetAutoLayout( TRUE ); m_NoteBook->SetAutoLayout( TRUE );
c = new wxLayoutConstraints; c = new wxLayoutConstraints;
@ -217,6 +221,7 @@ int ii;
pos.x = 50; pos.y = YSIZE - 60; pos.x = 50; pos.y = YSIZE - 60;
Button = new wxButton( this, ID_CLOSE_PART_PROPERTIES, Button = new wxButton( this, ID_CLOSE_PART_PROPERTIES,
_( "Cancel" ), pos ); _( "Cancel" ), pos );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
c = new wxLayoutConstraints; c = new wxLayoutConstraints;
c->left.SameAs( this, wxLeft, 20 ); c->left.SameAs( this, wxLeft, 20 );
@ -228,6 +233,7 @@ int ii;
pos.x += Button->GetDefaultSize().x + 70; pos.x += Button->GetDefaultSize().x + 70;
Button = new wxButton( this, ID_ACCEPT_PART_PROPERTIES, Button = new wxButton( this, ID_ACCEPT_PART_PROPERTIES,
_( "Ok" ), pos ); _( "Ok" ), pos );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
c = new wxLayoutConstraints; c = new wxLayoutConstraints;
c->right.SameAs( this, wxRight, 20 ); c->right.SameAs( this, wxRight, 20 );
@ -250,12 +256,15 @@ int ii;
m_NoteBook->AddPage( m_PanelAlias, _( "Alias" ), FALSE ); m_NoteBook->AddPage( m_PanelAlias, _( "Alias" ), FALSE );
// Add panel Fields // Add panel Fields
for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++) BuildPanelEditField(ii); for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
BuildPanelEditField( ii );
} }
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelAlias() void WinEDA_PartPropertiesFrame::BuildPanelAlias()
/*****************************************************/ /*****************************************************/
/* create the panel for component alias list editing /* create the panel for component alias list editing
*/ */
{ {
@ -263,6 +272,7 @@ wxPoint pos;
wxButton* Button; wxButton* Button;
m_PanelAlias = new wxPanel( m_NoteBook, -1 ); m_PanelAlias = new wxPanel( m_NoteBook, -1 );
m_PanelAlias->SetFont( *g_DialogFont ); m_PanelAlias->SetFont( *g_DialogFont );
wxLayoutConstraints* c = new wxLayoutConstraints; wxLayoutConstraints* c = new wxLayoutConstraints;
c->left.SameAs( m_NoteBook, wxLeft ); c->left.SameAs( m_NoteBook, wxLeft );
@ -272,18 +282,22 @@ wxButton * Button;
pos.x = 200; pos.y = 70; pos.x = 200; pos.y = 70;
Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ), pos ); Button = new wxButton( m_PanelAlias, ID_ADD_ALIAS, _( "Add" ), pos );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
pos.y += Button->GetSize().y + 10; pos.y += Button->GetSize().y + 10;
Button = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS, Button = new wxButton( m_PanelAlias, ID_DELETE_ONE_ALIAS,
_( "Delete" ), pos ); _( "Delete" ), pos );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
pos.y += Button->GetSize().y + 10; pos.y += Button->GetSize().y + 10;
Button = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS, Button = new wxButton( m_PanelAlias, ID_DELETE_ALL_ALIAS,
_( "Delete All" ), pos ); _( "Delete All" ), pos );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
if ( ! CurrentAliasName.IsEmpty() ) Button->Enable(FALSE); if( !CurrentAliasName.IsEmpty() )
Button->Enable( FALSE );
pos.x = 5; pos.y = 30; pos.x = 5; pos.y = 30;
m_PartAliasList = new wxListBox( m_PanelAlias, m_PartAliasList = new wxListBox( m_PanelAlias,
@ -291,8 +305,10 @@ wxButton * Button;
pos, wxSize( 160, 170 ), pos, wxSize( 160, 170 ),
0, NULL, 0, NULL,
wxLB_ALWAYS_SB | wxLB_SINGLE ); wxLB_ALWAYS_SB | wxLB_SINGLE );
wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ), wxStaticText* Msg = new wxStaticText( m_PanelAlias, -1, _( "Alias" ),
wxPoint (pos.x, pos.y - 20) ); wxPoint (pos.x, pos.y - 20) );
Msg->SetForegroundColour( wxColour( 200, 0, 0 ) ); Msg->SetForegroundColour( wxColour( 200, 0, 0 ) );
/* lecture des noms des alias */ /* lecture des noms des alias */
@ -307,6 +323,7 @@ wxButton * Button;
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelDoc() void WinEDA_PartPropertiesFrame::BuildPanelDoc()
/*****************************************************/ /*****************************************************/
/* create the panel for component doc editing /* create the panel for component doc editing
*/ */
{ {
@ -315,6 +332,7 @@ wxButton * Button;
wxString msg_text; wxString msg_text;
m_PanelDoc = new wxPanel( m_NoteBook, -1 ); m_PanelDoc = new wxPanel( m_NoteBook, -1 );
m_PanelDoc->SetFont( *g_DialogFont ); m_PanelDoc->SetFont( *g_DialogFont );
wxLayoutConstraints* c = new wxLayoutConstraints; wxLayoutConstraints* c = new wxLayoutConstraints;
c->left.SameAs( m_NoteBook, wxLeft ); c->left.SameAs( m_NoteBook, wxLeft );
@ -337,6 +355,7 @@ wxString msg_text;
msg_text += CurrentLibEntry->m_Name.m_Text; msg_text += CurrentLibEntry->m_Name.m_Text;
} }
wxStaticText* text = new wxStaticText( m_PanelDoc, -1, msg_text, pos ); wxStaticText* text = new wxStaticText( m_PanelDoc, -1, msg_text, pos );
text->SetForegroundColour( *wxBLUE ); text->SetForegroundColour( *wxBLUE );
} }
@ -358,18 +377,21 @@ wxString msg_text;
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD]; msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_KEYWORD];
else else
{ {
if (CurrentLibEntry ) msg_text = CurrentLibEntry->m_KeyWord; if( CurrentLibEntry )
msg_text = CurrentLibEntry->m_KeyWord;
} }
m_Keywords = new WinEDA_EnterText( m_PanelDoc, m_Keywords = new WinEDA_EnterText( m_PanelDoc,
_( "Keywords:" ), msg_text, _( "Keywords:" ), msg_text,
pos, wxSize( 285, -1 ) ); pos, wxSize( 285, -1 ) );
pos.y += 40; pos.y += 40;
msg_text.Empty(); msg_text.Empty();
if( m_AliasLocation >= 0 ) if( m_AliasLocation >= 0 )
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME]; msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC_FILENAME];
else else
{ {
if (CurrentLibEntry) msg_text = CurrentLibEntry->m_DocFile; if( CurrentLibEntry )
msg_text = CurrentLibEntry->m_DocFile;
} }
m_Docfile = new WinEDA_EnterText( m_PanelDoc, m_Docfile = new WinEDA_EnterText( m_PanelDoc,
_( "DocFileName:" ), msg_text, _( "DocFileName:" ), msg_text,
@ -378,11 +400,14 @@ wxString msg_text;
pos.y += 40; pos.y += 40;
Button = new wxButton( m_PanelDoc, ID_COPY_DOC_TO_ALIAS, Button = new wxButton( m_PanelDoc, ID_COPY_DOC_TO_ALIAS,
_( "Copy Doc" ), pos ); _( "Copy Doc" ), pos );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
if ( m_AliasLocation < 0 ) Button->Enable(FALSE); if( m_AliasLocation < 0 )
Button->Enable( FALSE );
Button = new wxButton( m_PanelDoc, ID_BROWSE_DOC_FILES, Button = new wxButton( m_PanelDoc, ID_BROWSE_DOC_FILES,
_( "Browse DocFiles" ), wxPoint (pos.x + 140, pos.y) ); _( "Browse DocFiles" ), wxPoint (pos.x + 140, pos.y) );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
} }
@ -390,12 +415,14 @@ wxString msg_text;
/*****************************************************/ /*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelBasic() void WinEDA_PartPropertiesFrame::BuildPanelBasic()
/*****************************************************/ /*****************************************************/
/* create the basic panel for component properties editing /* create the basic panel for component properties editing
*/ */
{ {
wxPoint pos; wxPoint pos;
m_PanelBasic = new wxPanel( m_NoteBook, ID_PANEL_BASIC ); m_PanelBasic = new wxPanel( m_NoteBook, ID_PANEL_BASIC );
m_PanelBasic->SetFont( *g_DialogFont ); m_PanelBasic->SetFont( *g_DialogFont );
wxLayoutConstraints* c = new wxLayoutConstraints; wxLayoutConstraints* c = new wxLayoutConstraints;
c->left.SameAs( m_NoteBook, wxLeft ); c->left.SameAs( m_NoteBook, wxLeft );
@ -408,54 +435,71 @@ wxPoint pos;
pos.x = 10; pos.y += 22; pos.x = 10; pos.y += 22;
AsConvertButt = new wxCheckBox( m_PanelBasic, -1, _( "As Convert" ), pos ); AsConvertButt = new wxCheckBox( m_PanelBasic, -1, _( "As Convert" ), pos );
if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE);
if( g_AsDeMorgan )
AsConvertButt->SetValue( TRUE );
pos.y += 20; pos.y += 20;
ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ), pos ); ShowPinNumButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Num" ), pos );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if ( CurrentLibEntry->m_DrawPinNum ) ShowPinNumButt->SetValue(TRUE); if( CurrentLibEntry->m_DrawPinNum )
ShowPinNumButt->SetValue( TRUE );
} }
else ShowPinNumButt->SetValue(TRUE); else
ShowPinNumButt->SetValue( TRUE );
pos.y += 20; pos.y += 20;
ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ), pos ); ShowPinNameButt = new wxCheckBox( m_PanelBasic, -1, _( "Show Pin Name" ), pos );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if( CurrentLibEntry->m_DrawPinName ) ShowPinNameButt->SetValue(TRUE); if( CurrentLibEntry->m_DrawPinName )
ShowPinNameButt->SetValue( TRUE );
} }
else ShowPinNameButt->SetValue(TRUE); else
ShowPinNameButt->SetValue( TRUE );
pos.y += 20; pos.y += 20;
m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ), pos ); m_PinsNameInsideButt = new wxCheckBox( m_PanelBasic, -1, _( "Pin Name Inside" ), pos );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if ( CurrentLibEntry->m_TextInside ) m_PinsNameInsideButt->SetValue(TRUE); if( CurrentLibEntry->m_TextInside )
m_PinsNameInsideButt->SetValue( TRUE );
} }
else m_PinsNameInsideButt->SetValue(TRUE); else
m_PinsNameInsideButt->SetValue( TRUE );
pos.y += 40; pos.y += 40;
new wxStaticText( m_PanelBasic, -1, _( "Number of Units:" ), pos ); new wxStaticText( m_PanelBasic, -1, _( "Number of Units:" ), pos );
pos.y += 15; pos.y += 15;
wxString number; wxString number;
if ( CurrentLibEntry ) number.Printf( wxT("%d"), CurrentLibEntry->m_UnitCount); if( CurrentLibEntry )
else number = wxT("1"); number.Printf( wxT( "%d" ), CurrentLibEntry->m_UnitCount );
else
number = wxT( "1" );
SelNumberOfUnits = new wxSpinCtrl( m_PanelBasic, -1, number, pos, SelNumberOfUnits = new wxSpinCtrl( m_PanelBasic, -1, number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 16 ); 1, 16 );
pos.y -= 15; pos.x += 180; pos.y -= 15; pos.x += 180;
new wxStaticText( m_PanelBasic, -1, _( "Skew:" ), pos ); new wxStaticText( m_PanelBasic, -1, _( "Skew:" ), pos );
pos.y += 15; pos.y += 15;
if( CurrentLibEntry && CurrentLibEntry->m_TextInside ) if( CurrentLibEntry && CurrentLibEntry->m_TextInside )
number.Printf( wxT( "%d" ), CurrentLibEntry->m_TextInside ); number.Printf( wxT( "%d" ), CurrentLibEntry->m_TextInside );
else number = wxT("40"); else
number = wxT( "40" );
m_SetSkew = new wxSpinCtrl( m_PanelBasic, -1, number, pos, m_SetSkew = new wxSpinCtrl( m_PanelBasic, -1, number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP, wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 100 ); 1, 100 );
pos.x = 5; pos.y += 40; pos.x = 5; pos.y += 40;
m_OptionPower = new wxCheckBox( m_PanelBasic, -1, _( "Power Symbol" ), pos ); m_OptionPower = new wxCheckBox( m_PanelBasic, -1, _( "Power Symbol" ), pos );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if( CurrentLibEntry->m_Options == ENTRY_POWER ) if( CurrentLibEntry->m_Options == ENTRY_POWER )
@ -464,15 +508,17 @@ wxPoint pos;
pos.y = m_OptionPower->GetRect().GetBottom() + 10; pos.y = m_OptionPower->GetRect().GetBottom() + 10;
m_OptionPartsLocked = new wxCheckBox( m_PanelBasic, -1, _( "Parts are locked" ), pos ); m_OptionPartsLocked = new wxCheckBox( m_PanelBasic, -1, _( "Parts are locked" ), pos );
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
if( CurrentLibEntry->m_UnitSelectionLocked ) if( CurrentLibEntry->m_UnitSelectionLocked )
m_OptionPartsLocked->SetValue( TRUE ); m_OptionPartsLocked->SetValue( TRUE );
} }
if ( number == wxT("1") ) m_OptionPartsLocked->Enable(FALSE); if( number == wxT( "1" ) )
m_OptionPartsLocked->Enable( FALSE );
} }
/****************************************************************/ /****************************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelEditField( int fieldId ) void WinEDA_PartPropertiesFrame::BuildPanelEditField( int fieldId )
/****************************************************************/ /****************************************************************/
@ -487,6 +533,7 @@ wxString Vjustify_list[] =
int ii = fieldId; int ii = fieldId;
PanelField[ii] = new wxPanel( m_NoteBook, ID_PANEL_REFERENCE + ii ); PanelField[ii] = new wxPanel( m_NoteBook, ID_PANEL_REFERENCE + ii );
PanelField[ii]->SetFont( *g_DialogFont ); PanelField[ii]->SetFont( *g_DialogFont );
wxLayoutConstraints* c = new wxLayoutConstraints; wxLayoutConstraints* c = new wxLayoutConstraints;
c->left.SameAs( m_NoteBook, wxLeft ); c->left.SameAs( m_NoteBook, wxLeft );
@ -498,6 +545,7 @@ int ii = fieldId;
pos.x = 10; pos.y = 10; pos.x = 10; pos.y = 10;
ShowFieldText[ii] = new wxCheckBox( PanelField[ii], -1, ShowFieldText[ii] = new wxCheckBox( PanelField[ii], -1,
_( "Show Text" ), pos ); _( "Show Text" ), pos );
if( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 ) if( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 )
ShowFieldText[ii]->SetValue( TRUE ); ShowFieldText[ii]->SetValue( TRUE );
@ -505,12 +553,15 @@ int ii = fieldId;
pos.y += yy + 5; pos.y += yy + 5;
VorientFieldText[ii] = new wxCheckBox( PanelField[ii], -1, VorientFieldText[ii] = new wxCheckBox( PanelField[ii], -1,
_( "Vertical" ), pos ); _( "Vertical" ), pos );
if ( FieldOrient[ii] ) VorientFieldText[ii]->SetValue(TRUE);
if( FieldOrient[ii] )
VorientFieldText[ii]->SetValue( TRUE );
pos.x = 150; pos.y = 5; pos.x = 150; pos.y = 5;
FieldHJustify[ii] = new wxRadioBox( PanelField[ii], -1, FieldHJustify[ii] = new wxRadioBox( PanelField[ii], -1,
_( "Hor Justify" ), pos, wxDefaultSize, _( "Hor Justify" ), pos, wxDefaultSize,
3, Hjustify_list, 1, wxRA_SPECIFY_COLS ); 3, Hjustify_list, 1, wxRA_SPECIFY_COLS );
FieldHJustify[ii]->GetSize( &xx, &yy ); FieldHJustify[ii]->GetSize( &xx, &yy );
FieldHJustify[ii]->SetSelection( 1 ); FieldHJustify[ii]->SetSelection( 1 );
@ -518,11 +569,13 @@ int ii = fieldId;
FieldVJustify[ii] = new wxRadioBox( PanelField[ii], -1, FieldVJustify[ii] = new wxRadioBox( PanelField[ii], -1,
_( "Vert Justify" ), pos, wxDefaultSize, _( "Vert Justify" ), pos, wxDefaultSize,
3, Vjustify_list, 1, wxRA_SPECIFY_COLS ); 3, Vjustify_list, 1, wxRA_SPECIFY_COLS );
FieldVJustify[ii]->SetSelection( 1 ); FieldVJustify[ii]->SetSelection( 1 );
wxPoint txtpos; wxPoint txtpos;
pos.x = 10; pos.y = 70; pos.x = 10; pos.y = 70;
#define POSY_OFFSET 70 #define POSY_OFFSET 70
switch( ii ) switch( ii )
{ {
case REFERENCE: case REFERENCE:
@ -539,18 +592,27 @@ int ii = fieldId;
else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP )
FieldVJustify[ii]->SetSelection( 2 ); FieldVJustify[ii]->SetSelection( 2 );
} }
else txtpos = wxPoint(0,0); else
txtpos = wxPoint( 0, 0 );
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_( "Pos" ), txtpos, _( "Pos" ), txtpos,
g_UnitMetric, pos ); g_UnitMetric, pos );
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl(
PanelField[ii],
DrawPartStruct::ReturnFieldName (ii), DrawPartStruct::ReturnFieldName (ii),
CurrentLibEntry ? CurrentLibEntry ?
CurrentLibEntry->m_Prefix.m_Text.GetData() : wxT("U"), CurrentLibEntry->m_Prefix.m_Text.GetData ()
CurrentLibEntry ? CurrentLibEntry->m_Prefix.m_Size.x : DEFAULT_TEXT_SIZE, : wxT(
"U" ),
CurrentLibEntry ? CurrentLibEntry->
m_Prefix.m_Size.x : DEFAULT_TEXT_SIZE,
g_UnitMetric, g_UnitMetric,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), wxPoint (pos.x, pos.y +
200, TRUE); FieldPosition[ii]->GetDimension ().y + POSY_OFFSET),
200,
TRUE );
break; break;
case VALUE: case VALUE:
@ -567,17 +629,25 @@ int ii = fieldId;
else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) else if( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP )
FieldVJustify[ii]->SetSelection( 2 ); FieldVJustify[ii]->SetSelection( 2 );
} }
else txtpos = wxPoint(0,0); else
txtpos = wxPoint( 0, 0 );
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_( "Pos" ), txtpos, _( "Pos" ), txtpos,
g_UnitMetric, pos ); g_UnitMetric, pos );
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl(
PanelField[ii],
DrawPartStruct::ReturnFieldName (ii), DrawPartStruct::ReturnFieldName (ii),
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Text.GetData() : NULL, CurrentLibEntry ? CurrentLibEntry->m_Name.
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Size.x : DEFAULT_TEXT_SIZE, m_Text.GetData () : NULL,
CurrentLibEntry ? CurrentLibEntry->m_Name.
m_Size.x : DEFAULT_TEXT_SIZE,
g_UnitMetric, g_UnitMetric,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), wxPoint (pos.x, pos.y +
200, TRUE); FieldPosition[ii]->GetDimension ().y + POSY_OFFSET),
200,
TRUE );
break; break;
default: default:
@ -587,6 +657,7 @@ int ii = fieldId;
fsize = DEFAULT_TEXT_SIZE;; fsize = DEFAULT_TEXT_SIZE;;
Field = NULL; Field = NULL;
fpos = wxPoint( 0, 0 ); fpos = wxPoint( 0, 0 );
//recherche du Field de FieldId correspondant, s'il existe //recherche du Field de FieldId correspondant, s'il existe
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
@ -615,12 +686,18 @@ int ii = fieldId;
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii], FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_( "Pos" ), fpos, _( "Pos" ), fpos,
g_UnitMetric, pos ); g_UnitMetric, pos );
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl(
PanelField[ii],
DrawPartStruct::ReturnFieldName (ii), DrawPartStruct::ReturnFieldName (ii),
ftext, fsize, ftext,
fsize,
g_UnitMetric, g_UnitMetric,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET), wxPoint (pos.x, pos.y +
200, TRUE); FieldPosition[ii]->GetDimension ().y + POSY_OFFSET),
200,
TRUE );
break; break;
} }
} }
@ -634,17 +711,23 @@ void WinEDA_PartPropertiesFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
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 /* Met a jour les differents parametres pour le composant en cours d'édition
*/ */
{ {
int ii, jj; int ii, jj;
int hjustify[3] = { GR_TEXT_HJUSTIFY_LEFT , GR_TEXT_HJUSTIFY_CENTER, int hjustify[3] = {
GR_TEXT_HJUSTIFY_RIGHT }; GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER,
int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER, GR_TEXT_HJUSTIFY_RIGHT
GR_TEXT_VJUSTIFY_TOP }; };
int vjustify[3] = {
GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER,
GR_TEXT_VJUSTIFY_TOP
};
if( CurrentLibEntry == NULL ) if( CurrentLibEntry == NULL )
{ {
@ -656,7 +739,7 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
m_Parent->SaveCopyInUndoList(); m_Parent->SaveCopyInUndoList();
/* A new name could be entered in VALUE field. /* A new name could be entered in VALUE field.
Must not be an existing alias name in alias list box */ * Must not be an existing alias name in alias list box */
jj = m_PartAliasList->GetCount(); jj = m_PartAliasList->GetCount();
wxString newvalue = FieldTextCtrl[VALUE]->GetText(); wxString newvalue = FieldTextCtrl[VALUE]->GetText();
for( ii = 0; ii < jj; ii++ ) for( ii = 0; ii < jj; ii++ )
@ -677,7 +760,6 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
CurrentLibEntry->m_KeyWord = m_Keywords->GetValue(); CurrentLibEntry->m_KeyWord = m_Keywords->GetValue();
CurrentLibEntry->m_DocFile = m_Docfile->GetValue(); CurrentLibEntry->m_DocFile = m_Docfile->GetValue();
} }
else else
{ {
CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue(); CurrentLibEntry->m_AliasList[m_AliasLocation + ALIAS_DOC] = m_Doc->GetValue();
@ -716,13 +798,13 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
if( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position) 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); for( ii = 0; ii < ALIAS_NEXT; ii++ )
CurrentLibEntry->m_AliasList.RemoveAt( kk );
kkmax = CurrentLibEntry->m_AliasList.GetCount(); kkmax = CurrentLibEntry->m_AliasList.GetCount();
} }
} }
if( !FieldTextCtrl[REFERENCE]->GetText().IsEmpty() ) if( !FieldTextCtrl[REFERENCE]->GetText().IsEmpty() )
{ {
CurrentLibEntry->m_Prefix.m_Text = FieldTextCtrl[REFERENCE]->GetText(); CurrentLibEntry->m_Prefix.m_Text = FieldTextCtrl[REFERENCE]->GetText();
@ -789,8 +871,10 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
if( Field->m_Text.IsEmpty() ) // An old field exists; new is void, delete it if( Field->m_Text.IsEmpty() ) // An old field exists; new is void, delete it
{ {
delete Field; delete Field;
if ( previousField ) previousField->Pnext = NextField; if( previousField )
else CurrentLibEntry->Fields = NextField; previousField->Pnext = NextField;
else
CurrentLibEntry->Fields = NextField;
} }
break; break;
} }
@ -802,6 +886,7 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
if( (Field == NULL) && ( !FieldTextCtrl[ii]->GetText().IsEmpty() ) ) if( (Field == NULL) && ( !FieldTextCtrl[ii]->GetText().IsEmpty() ) )
{ // Do not exists: must be created { // Do not exists: must be created
Field = new LibDrawField( ii ); Field = new LibDrawField( ii );
Field->m_Text = FieldTextCtrl[ii]->GetText(); Field->m_Text = FieldTextCtrl[ii]->GetText();
Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize(); Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize();
if( ShowFieldText[Field->m_FieldId]->GetValue() ) if( ShowFieldText[Field->m_FieldId]->GetValue() )
@ -826,7 +911,8 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
if( !g_AsDeMorgan ) if( !g_AsDeMorgan )
{ {
g_AsDeMorgan = 1; g_AsDeMorgan = 1;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; if( SetUnsetConvert() )
m_RecreateToolbar = TRUE;
} }
} }
else else
@ -834,7 +920,8 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
if( g_AsDeMorgan ) if( g_AsDeMorgan )
{ {
g_AsDeMorgan = 0; g_AsDeMorgan = 0;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE; if( SetUnsetConvert() )
m_RecreateToolbar = TRUE;
} }
} }
@ -852,12 +939,13 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
CurrentLibEntry->m_Options = ENTRY_NORMAL; CurrentLibEntry->m_Options = ENTRY_NORMAL;
/* Set the option "Units locked". /* Set the option "Units locked".
Obviously, cannot be TRUE if there is only one part */ * Obviously, cannot be TRUE if there is only one part */
CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue(); CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue();
if( CurrentLibEntry->m_UnitCount <= 1 ) if( CurrentLibEntry->m_UnitCount <= 1 )
CurrentLibEntry->m_UnitSelectionLocked = FALSE; CurrentLibEntry->m_UnitSelectionLocked = FALSE;
if ( m_RecreateToolbar ) m_Parent->ReCreateHToolbar(); if( m_RecreateToolbar )
m_Parent->ReCreateHToolbar();
m_Parent->DisplayLibInfos(); m_Parent->DisplayLibInfos();
@ -869,20 +957,22 @@ int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) ) void WinEDA_PartPropertiesFrame::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) )
/******************************************************************************/ /******************************************************************************/
{ {
if( CurrentLibEntry == NULL ) return; if( CurrentLibEntry == NULL )
if ( CurrentAliasName.IsEmpty() ) return; return;
if( CurrentAliasName.IsEmpty() )
return;
m_Doc->SetValue( CurrentLibEntry->m_Doc ); m_Doc->SetValue( CurrentLibEntry->m_Doc );
m_Docfile->SetValue( CurrentLibEntry->m_DocFile ); m_Docfile->SetValue( CurrentLibEntry->m_DocFile );
m_Keywords->SetValue( CurrentLibEntry->m_KeyWord ); m_Keywords->SetValue( CurrentLibEntry->m_KeyWord );
} }
/**********************************************************/ /**********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart( void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
/**********************************************************/ /**********************************************************/
{ {
CurrentAliasName.Empty(); CurrentAliasName.Empty();
if( CurrentLibEntry ) if( CurrentLibEntry )
{ {
@ -892,22 +982,25 @@ void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart(
m_RecreateToolbar = TRUE; 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 /* 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;
wxString aliasname; 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( "_" ) ); Line.Replace( wxT( " " ), wxT( "_" ) );
aliasname = Line; aliasname = Line;
@ -933,6 +1026,7 @@ wxString aliasname;
m_RecreateToolbar = TRUE; m_RecreateToolbar = TRUE;
} }
/********************************************************/ /********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAliasOfPart( void WinEDA_PartPropertiesFrame::DeleteAliasOfPart(
wxCommandEvent& WXUNUSED (event) ) wxCommandEvent& WXUNUSED (event) )
@ -940,7 +1034,8 @@ void WinEDA_PartPropertiesFrame::DeleteAliasOfPart(
{ {
wxString aliasname = m_PartAliasList->GetStringSelection(); wxString aliasname = m_PartAliasList->GetStringSelection();
if ( aliasname.IsEmpty() ) return; if( aliasname.IsEmpty() )
return;
if( aliasname == CurrentAliasName ) if( aliasname == CurrentAliasName )
{ {
wxString msg = CurrentAliasName + _( " is Current Selected Alias!" ); wxString msg = CurrentAliasName + _( " is Current Selected Alias!" );
@ -955,25 +1050,27 @@ wxString aliasname = m_PartAliasList->GetStringSelection();
} }
/********************************************************************/ /********************************************************************/
bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit ) bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage( int MaxUnit )
/********************************************************************/ /********************************************************************/
/* Routine de modification du nombre d'unites par package pour le /* Routine de modification du nombre d'unites par package pour le
composant courant; * composant courant;
*/ */
{ {
int OldNumUnits, ii, FlagDel = -1; int OldNumUnits, ii, FlagDel = -1;
LibEDA_BaseStruct* DrawItem, * NextDrawItem; LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( CurrentLibEntry == NULL ) return FALSE; if( CurrentLibEntry == NULL )
return FALSE;
/* Si pas de changement: termine */ /* Si pas de changement: termine */
if ( CurrentLibEntry->m_UnitCount == MaxUnit ) return FALSE; if( CurrentLibEntry->m_UnitCount == MaxUnit )
return FALSE;
OldNumUnits = CurrentLibEntry->m_UnitCount; OldNumUnits = CurrentLibEntry->m_UnitCount;
if ( OldNumUnits < 1 ) OldNumUnits = 1; if( OldNumUnits < 1 )
OldNumUnits = 1;
CurrentLibEntry->m_UnitCount = MaxUnit; CurrentLibEntry->m_UnitCount = MaxUnit;
@ -992,7 +1089,8 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( IsOK( this, _( "Delete units" ) ) ) if( IsOK( this, _( "Delete units" ) ) )
{ {
/* Si part selectee n'existe plus: selection 1ere unit */ /* Si part selectee n'existe plus: selection 1ere unit */
if( CurrentUnit > MaxUnit ) CurrentUnit = 1; if( CurrentUnit > MaxUnit )
CurrentUnit = 1;
FlagDel = 1; FlagDel = 1;
} }
else else
@ -1007,6 +1105,7 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
DrawItem, 0 ); DrawItem, 0 );
} }
} }
return TRUE; return TRUE;
} }
@ -1035,8 +1134,9 @@ LibEDA_BaseStruct* DrawItem, * NextDrawItem;
/*****************************************************/ /*****************************************************/
bool WinEDA_PartPropertiesFrame::SetUnsetConvert() bool WinEDA_PartPropertiesFrame::SetUnsetConvert()
/*****************************************************/ /*****************************************************/
/* crée ou efface (selon option AsConvert) les éléments /* 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; int FlagDel = 0;
@ -1045,11 +1145,13 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
if( g_AsDeMorgan ) /* Representation convertie a creer */ if( g_AsDeMorgan ) /* Representation convertie a creer */
{ {
/* Traitement des elements a ajouter ( pins seulement ) */ /* Traitement des elements a ajouter ( pins seulement ) */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; if( CurrentLibEntry )
DrawItem = CurrentLibEntry->m_Drawings;
for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) for( ; DrawItem != NULL; DrawItem = DrawItem->Next() )
{ {
/* Duplication des items pour autres elements */ /* Duplication des items pour autres elements */
if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) continue; if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE )
continue;
if( DrawItem->m_Convert == 1 ) if( DrawItem->m_Convert == 1 )
{ {
if( FlagDel == 0 ) if( FlagDel == 0 )
@ -1071,11 +1173,11 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
} }
} }
} }
else /* Representation convertie a supprimer */ else /* Representation convertie a supprimer */
{ {
/* Traitement des elements à supprimer */ /* Traitement des elements à supprimer */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings; if( CurrentLibEntry )
DrawItem = CurrentLibEntry->m_Drawings;
for( ; DrawItem != NULL; DrawItem = NextDrawItem ) for( ; DrawItem != NULL; DrawItem = NextDrawItem )
{ {
NextDrawItem = DrawItem->Next(); NextDrawItem = DrawItem->Next();
@ -1095,18 +1197,24 @@ LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
} }
} }
m_Parent->GetScreen()->SetModify(); m_Parent->GetScreen()->SetModify();
DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, DrawItem, 0); DeleteOneLibraryDrawStruct( m_Parent->DrawPanel,
NULL,
CurrentLibEntry,
DrawItem,
0 );
} }
} }
} }
return TRUE; return TRUE;
} }
/****************************************************************************/ /****************************************************************************/
void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event ) void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile( wxCommandEvent& event )
/****************************************************************************/ /****************************************************************************/
{ {
wxString FullFileName; wxString FullFileName;
wxString docpath( g_RealLibDirBuffer ), filename; wxString docpath( g_RealLibDirBuffer ), filename;
docpath += wxT( "doc" ); docpath += wxT( "doc" );
@ -1120,7 +1228,8 @@ wxString docpath(g_RealLibDirBuffer), filename;
wxFD_OPEN, wxFD_OPEN,
TRUE TRUE
); );
if ( FullFileName.IsEmpty() ) return; if( FullFileName.IsEmpty() )
return;
// Suppression du chemin par defaut pour le fichier de doc: // Suppression du chemin par defaut pour le fichier de doc:
filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString ); filename = MakeReducedFileName( FullFileName, docpath, wxEmptyString );

View File

@ -272,8 +272,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F
if( !Failed ) if( !Failed )
{ {
PolylineStruct->Pnext = screen->EEDrawList; PolylineStruct->Pnext = screen->EEDrawList;
screen->EEDrawList = (EDA_BaseStruct*) screen->EEDrawList = (EDA_BaseStruct*) PolylineStruct;
PolylineStruct;
} }
break; break;
@ -441,6 +440,10 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F
screen->EEDrawList = Phead; screen->EEDrawList = Phead;
#if defined(DEBUG)
screen->Show( 0, std::cout );
#endif
fclose( f ); fclose( f );
TestDanglingEnds( screen->EEDrawList, NULL ); TestDanglingEnds( screen->EEDrawList, NULL );

View File

@ -13,21 +13,22 @@
#include "protos.h" #include "protos.h"
/* Routines locales */ /* Routines locales */
static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus ); static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus );
static void SheetLabelConnection( ObjetNetListStruct* SheetLabel ); static void SheetLabelConnection( ObjetNetListStruct* SheetLabel );
static int ListeObjetConnection(WinEDA_SchematicFrame * frame, SCH_SCREEN *screen, ObjetNetListStruct *ObjNet); static int ListeObjetConnection( WinEDA_SchematicFrame* frame,
SCH_SCREEN* screen,
ObjetNetListStruct* ObjNet );
static int ConvertBusToMembers( ObjetNetListStruct* ObjNet ); static int ConvertBusToMembers( ObjetNetListStruct* ObjNet );
static void PointToPointConnect( ObjetNetListStruct* RefObj, int IsBus, static void PointToPointConnect( ObjetNetListStruct* RefObj, int IsBus,
int start ); int start );
static void SegmentToPointConnect( ObjetNetListStruct* Jonction, int IsBus, static void SegmentToPointConnect( ObjetNetListStruct* Jonction, int IsBus,
int start ); int start );
static void LabelConnection( ObjetNetListStruct* Label ); static void LabelConnection( ObjetNetListStruct* Label );
static int TriNetCode(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2); static int TriNetCode( const void* o1, const void* o2 );
static void ConnectBusLabels( ObjetNetListStruct* Label, int NbItems ); static void ConnectBusLabels( ObjetNetListStruct* Label, int NbItems );
static void SetUnconnectedFlag( ObjetNetListStruct* ObjNet, int NbItems ); static void SetUnconnectedFlag( ObjetNetListStruct* ObjNet, int NbItems );
static int TriBySheet(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2); static int TriBySheet( const void* o1, const void* o2 );
/* Variable locales */ /* Variable locales */
static int FirstNumWireBus, LastNumWireBus, RootBusNameLength; static int FirstNumWireBus, LastNumWireBus, RootBusNameLength;
@ -35,15 +36,15 @@ static int LastNetCode, LastBusNetCode;
static int s_PassNumber; 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 * Routine de liberation memoire des tableaux utilises pour le calcul
de la netliste * de la netliste
TabNetItems = pointeur sur le tableau principal (liste des items ) * TabNetItems = pointeur sur le tableau principal (liste des items )
NbrNetItems = nombre d'elements * NbrNetItems = nombre d'elements
*/ */
{ {
int i; int i;
@ -63,6 +64,7 @@ int i;
case NET_PINLABEL: case NET_PINLABEL:
case NET_NOCONNECT: case NET_NOCONNECT:
break; break;
case NET_GLOBBUSLABELMEMBER: case NET_GLOBBUSLABELMEMBER:
case NET_SHEETBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER:
case NET_BUSLABELMEMBER: case NET_BUSLABELMEMBER:
@ -74,24 +76,26 @@ int i;
MyFree( TabNetItems ); MyFree( TabNetItems );
} }
/*****************************************************/ /*****************************************************/
void* WinEDA_SchematicFrame::BuildNetListBase() void* WinEDA_SchematicFrame::BuildNetListBase()
/*****************************************************/ /*****************************************************/
/* Routine qui construit le tableau des elements connectes du projet /* Routine qui construit le tableau des elements connectes du projet
met a jour: * met a jour:
g_TabObjNet * g_TabObjNet
g_NbrObjNet * g_NbrObjNet
*/ */
{ {
int NetNumber, SheetNumber; int NetNumber, SheetNumber;
int i, istart, NetCode; int i, istart, NetCode;
SCH_SCREEN* screen; SCH_SCREEN* screen;
ObjetNetListStruct * BaseTabObjNet;
wxString msg; wxString msg;
wxBusyCursor Busy; wxBusyCursor Busy;
NetNumber = 1; NetNumber = 1;
s_PassNumber = 0; s_PassNumber = 0;
MsgPanel->EraseMsgBox(); MsgPanel->EraseMsgBox();
Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, LIGHTRED ); Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, LIGHTRED );
@ -116,20 +120,24 @@ wxBusyCursor Busy;
if( g_NbrObjNet == 0 ) if( g_NbrObjNet == 0 )
{ {
DisplayError( this, _( "No component" ), 20 ); DisplayError( this, _( "No component" ), 20 );
return(NULL); return NULL;
} }
i = sizeof(ObjetNetListStruct) * g_NbrObjNet; i = sizeof(ObjetNetListStruct) * g_NbrObjNet;
BaseTabObjNet = g_TabObjNet = (ObjetNetListStruct *) MyZMalloc(i); g_TabObjNet = (ObjetNetListStruct*) MyZMalloc( i );
if( BaseTabObjNet == NULL ) return(NULL); 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++; s_PassNumber++;
Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, RED ); Affiche_1_Parametre( this, 1, _( "List" ), wxEmptyString, RED );
for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
screen = ScreenList.GetFirst();
for( ObjetNetListStruct* baseTabObjNet = g_TabObjNet;
screen != NULL; screen = ScreenList.GetNext() )
{ {
g_TabObjNet += ListeObjetConnection(this, screen, g_TabObjNet ); baseTabObjNet += ListeObjetConnection( this, screen, baseTabObjNet );
} }
Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED ); Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED );
@ -140,14 +148,13 @@ wxBusyCursor Busy;
/* Recherche des connections pour les Segments et les Pins */ /* Recherche des connections pour les Segments et les Pins */
/* Tri du Tableau des objets de Net par Sheet */ /* Tri du Tableau des objets de Net par Sheet */
qsort(BaseTabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriBySheet );
(int (*)(const void *, const void *)) 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; SheetNumber = g_TabObjNet[0].m_SheetNumber;
LastNetCode = LastBusNetCode = 1; LastNetCode = LastBusNetCode = 1;
for( i = istart = 0; i < g_NbrObjNet; i++ ) for( i = istart = 0; i < g_NbrObjNet; i++ )
{ {
if( g_TabObjNet[i].m_SheetNumber != SheetNumber ) if( g_TabObjNet[i].m_SheetNumber != SheetNumber )
@ -161,7 +168,9 @@ wxBusyCursor Busy;
case NET_PINLABEL: case NET_PINLABEL:
case NET_SHEETLABEL: case NET_SHEETLABEL:
case NET_NOCONNECT: case NET_NOCONNECT:
if ( g_TabObjNet[i].m_NetCode != 0 ) break; /* Deja connecte */ if( g_TabObjNet[i].m_NetCode != 0 )
break; /* Deja connecte */
case NET_SEGMENT: case NET_SEGMENT:
/* Controle des connexions type point a point ( Sans BUS ) */ /* Controle des connexions type point a point ( Sans BUS ) */
if( g_TabObjNet[i].m_NetCode == 0 ) if( g_TabObjNet[i].m_NetCode == 0 )
@ -202,7 +211,9 @@ wxBusyCursor Busy;
break; break;
case NET_SHEETBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER:
if ( g_TabObjNet[i].m_BusNetCode != 0 ) break; /* Deja connecte */ if( g_TabObjNet[i].m_BusNetCode != 0 )
break; /* Deja connecte */
case NET_BUS: case NET_BUS:
/* Controle des connexions type point a point mode BUS */ /* Controle des connexions type point a point mode BUS */
if( g_TabObjNet[i].m_BusNetCode == 0 ) if( g_TabObjNet[i].m_BusNetCode == 0 )
@ -223,9 +234,9 @@ wxBusyCursor Busy;
} }
SegmentToPointConnect( g_TabObjNet + i, ISBUS, istart ); SegmentToPointConnect( g_TabObjNet + i, ISBUS, istart );
break; break;
}
}
}
}
Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), CYAN ); Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), CYAN );
/* Mise a jour des NetCodes des Bus Labels connectes par les Bus */ /* Mise a jour des NetCodes des Bus Labels connectes par les Bus */
@ -253,6 +264,7 @@ wxBusyCursor Busy;
case NET_GLOBBUSLABELMEMBER: case NET_GLOBBUSLABELMEMBER:
LabelConnection( g_TabObjNet + i ); LabelConnection( g_TabObjNet + i );
break; break;
case NET_SHEETBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER:
break; break;
} }
@ -266,14 +278,13 @@ wxBusyCursor Busy;
for( i = 0; i < g_NbrObjNet; i++ ) for( i = 0; i < g_NbrObjNet; i++ )
{ {
if( (g_TabObjNet[i].m_Type == NET_SHEETLABEL ) || if( (g_TabObjNet[i].m_Type == NET_SHEETLABEL )
( g_TabObjNet[i].m_Type == NET_SHEETBUSLABELMEMBER ) ) || ( g_TabObjNet[i].m_Type == NET_SHEETBUSLABELMEMBER ) )
SheetLabelConnection( g_TabObjNet + i ); SheetLabelConnection( g_TabObjNet + i );
} }
/* Tri du Tableau des objets de Net par NetCode */ /* Tri du Tableau des objets de Net par NetCode */
qsort(g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriNetCode );
(int (*)(const void *, const void *)) TriNetCode);
Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED ); Affiche_1_Parametre( this, -1, wxEmptyString, _( "Done" ), RED );
@ -292,11 +303,12 @@ wxBusyCursor Busy;
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 */ /* Affectation du m_FlagOfConnection en fonction de connection ou non */
SetUnconnectedFlag( BaseTabObjNet, g_NbrObjNet); SetUnconnectedFlag( g_TabObjNet, g_NbrObjNet );
return( (void*) BaseTabObjNet); return (void*) g_TabObjNet;
} }
/************************************************************* /*************************************************************
* Routine qui connecte les sous feuilles par les sheetLabels * * Routine qui connecte les sous feuilles par les sheetLabels *
**************************************************************/ **************************************************************/
@ -305,38 +317,48 @@ static void SheetLabelConnection(ObjetNetListStruct *SheetLabel)
int i; int i;
ObjetNetListStruct* ObjetNet; 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 /* Comparaison du SheetLabel avec les GLABELS de la sous feuille
pour regroupement des NetCodes */ * pour regroupement des NetCodes */
for( i = 0, ObjetNet = g_TabObjNet; i < g_NbrObjNet; i++ ) for( i = 0, ObjetNet = g_TabObjNet; i < g_NbrObjNet; i++ )
{ {
if( ObjetNet[i].m_SheetNumber != SheetLabel->m_NumInclude ) continue; if( ObjetNet[i].m_SheetNumber != SheetLabel->m_NumInclude )
if( (ObjetNet[i].m_Type != NET_GLOBLABEL ) && continue;
(ObjetNet[i].m_Type != NET_GLOBBUSLABELMEMBER ) )
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; 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 */ /* Propagation du Netcode a tous les Objets de meme NetCode */
if( ObjetNet[i].m_NetCode ) if( ObjetNet[i].m_NetCode )
PropageNetCode( ObjetNet[i].m_NetCode, SheetLabel->m_NetCode, 0 ); PropageNetCode( ObjetNet[i].m_NetCode, SheetLabel->m_NetCode, 0 );
else ObjetNet[i].m_NetCode = SheetLabel->m_NetCode; else
ObjetNet[i].m_NetCode = SheetLabel->m_NetCode;
} }
} }
/*****************************************************************************/ /*****************************************************************************/
static int ListeObjetConnection( WinEDA_SchematicFrame* frame, SCH_SCREEN* screen, static int ListeObjetConnection( WinEDA_SchematicFrame* frame, SCH_SCREEN* screen,
ObjetNetListStruct* ObjNet ) ObjetNetListStruct* ObjNet )
/*****************************************************************************/ /*****************************************************************************/
/* Routine generant la liste des objets relatifs aux connection /* Routine generant la liste des objets relatifs aux connection
entree: * entree:
screen: pointeur sur l'ecran a traiter * screen: pointeur sur l'ecran a traiter
ObjNet: * ObjNet:
si NULL: la routine compte seulement le nombre des objets * si NULL: la routine compte seulement le nombre des objets
sinon: pointe le tableau a remplir * sinon: pointe le tableau a remplir
*/ */
{ {
int ii, NbrItem = 0, NumSheet; int ii, NbrItem = 0, NumSheet;
@ -349,9 +371,9 @@ DrawSheetLabelStruct *SheetLabel;
int NumInclude; int NumInclude;
NumSheet = screen->m_SheetNumber; NumSheet = screen->m_SheetNumber;
DrawList = screen->EEDrawList;
while ( DrawList ) DrawList = screen->EEDrawList;
for( ; DrawList; DrawList = DrawList->Pnext )
{ {
switch( DrawList->Type() ) switch( DrawList->Type() )
{ {
@ -360,8 +382,8 @@ int NumInclude;
#define STRUCT ( (EDA_DrawLineStruct*) DrawList ) #define STRUCT ( (EDA_DrawLineStruct*) DrawList )
if( ObjNet ) if( ObjNet )
{ {
if ( (STRUCT->m_Layer != LAYER_BUS) && if( (STRUCT->m_Layer != LAYER_BUS)
(STRUCT->m_Layer != LAYER_WIRE) ) && (STRUCT->m_Layer != LAYER_WIRE) )
break; break;
ObjNet[NbrItem].m_Comp = STRUCT; ObjNet[NbrItem].m_Comp = STRUCT;
@ -369,6 +391,7 @@ int NumInclude;
ObjNet[NbrItem].m_SheetNumber = NumSheet; ObjNet[NbrItem].m_SheetNumber = NumSheet;
ObjNet[NbrItem].m_Start = STRUCT->m_Start; ObjNet[NbrItem].m_Start = STRUCT->m_Start;
ObjNet[NbrItem].m_End = STRUCT->m_End; ObjNet[NbrItem].m_End = STRUCT->m_End;
if( STRUCT->m_Layer == LAYER_BUS ) if( STRUCT->m_Layer == LAYER_BUS )
{ {
ObjNet[NbrItem].m_Type = NET_BUS; ObjNet[NbrItem].m_Type = NET_BUS;
@ -420,14 +443,18 @@ int NumInclude;
ObjNet[NbrItem].m_Comp = STRUCT; ObjNet[NbrItem].m_Comp = STRUCT;
ObjNet[NbrItem].m_Screen = screen; ObjNet[NbrItem].m_Screen = screen;
ObjNet[NbrItem].m_Type = NET_LABEL; ObjNet[NbrItem].m_Type = NET_LABEL;
if( STRUCT->m_Layer == LAYER_GLOBLABEL ) if( STRUCT->m_Layer == LAYER_GLOBLABEL )
ObjNet[NbrItem].m_Type = NET_GLOBLABEL; ObjNet[NbrItem].m_Type = NET_GLOBLABEL;
ObjNet[NbrItem].m_Label = &STRUCT->m_Text; ObjNet[NbrItem].m_Label = &STRUCT->m_Text;
ObjNet[NbrItem].m_SheetNumber = NumSheet; ObjNet[NbrItem].m_SheetNumber = NumSheet;
ObjNet[NbrItem].m_Start = STRUCT->m_Pos; ObjNet[NbrItem].m_Start = STRUCT->m_Pos;
ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start;
/* Si c'est un Bus, eclatement en Label */ /* Si c'est un Bus, eclatement en Label */
if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); if( ii )
ConvertBusToMembers( ObjNet + NbrItem );
} }
NbrItem += ii + 1; NbrItem += ii + 1;
break; break;
@ -441,38 +468,57 @@ int NumInclude;
ObjNet[NbrItem].m_Comp = STRUCT; ObjNet[NbrItem].m_Comp = STRUCT;
ObjNet[NbrItem].m_Screen = screen; ObjNet[NbrItem].m_Screen = screen;
ObjNet[NbrItem].m_Type = NET_LABEL; ObjNet[NbrItem].m_Type = NET_LABEL;
if( STRUCT->m_Layer == LAYER_GLOBLABEL ) if( STRUCT->m_Layer == LAYER_GLOBLABEL )
ObjNet[NbrItem].m_Type = NET_GLOBLABEL; ObjNet[NbrItem].m_Type = NET_GLOBLABEL;
ObjNet[NbrItem].m_Label = &STRUCT->m_Text; ObjNet[NbrItem].m_Label = &STRUCT->m_Text;
ObjNet[NbrItem].m_SheetNumber = NumSheet; ObjNet[NbrItem].m_SheetNumber = NumSheet;
ObjNet[NbrItem].m_Start = STRUCT->m_Pos; ObjNet[NbrItem].m_Start = STRUCT->m_Pos;
ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start;
/* Si c'est un Bus, eclatement en Label */ /* Si c'est un Bus, eclatement en Label */
if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); if( ii )
ConvertBusToMembers( ObjNet + NbrItem );
} }
NbrItem += ii + 1; NbrItem += ii + 1;
break; break;
case DRAW_LIB_ITEM_STRUCT_TYPE: case DRAW_LIB_ITEM_STRUCT_TYPE:
DrawLibItem = (EDA_SchComponentStruct*) DrawList; DrawLibItem = (EDA_SchComponentStruct*) DrawList;
memcpy( TransMat, DrawLibItem->m_Transform, sizeof(TransMat) ); memcpy( TransMat, DrawLibItem->m_Transform, sizeof(TransMat) );
PartX = DrawLibItem->m_Pos.x; PartY = DrawLibItem->m_Pos.y;
PartX = DrawLibItem->m_Pos.x;
PartY = DrawLibItem->m_Pos.y;
Entry = FindLibPart( DrawLibItem->m_ChipName, wxEmptyString, FIND_ROOT ); Entry = FindLibPart( DrawLibItem->m_ChipName, wxEmptyString, FIND_ROOT );
if( Entry == NULL) break; if( Entry == NULL )
if(Entry->m_Drawings == NULL) break ; break;
if( Entry->m_Drawings == NULL )
break;
DEntry = Entry->m_Drawings; DEntry = Entry->m_Drawings;
for( ; DEntry != NULL; DEntry = DEntry->Next() ) for( ; DEntry != NULL; DEntry = DEntry->Next() )
{ {
LibDrawPin* Pin = (LibDrawPin*) DEntry; LibDrawPin* Pin = (LibDrawPin*) DEntry;
if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE) continue; if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE )
if( DEntry->m_Unit && continue;
(DEntry->m_Unit != DrawLibItem->m_Multi) ) continue;
if( DEntry->m_Convert && if( DEntry->m_Unit
(DEntry->m_Convert != DrawLibItem->m_Convert)) continue; && (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 x2 = PartX + TransMat[0][0] * Pin->m_Pos.x
+ TransMat[0][1] * Pin->m_Pos.y; + TransMat[0][1] * Pin->m_Pos.y;
y2 = PartY + TransMat[1][0] * Pin->m_Pos.x y2 = PartY + TransMat[1][0] * Pin->m_Pos.x
+ TransMat[1][1] * Pin->m_Pos.y; + TransMat[1][1] * Pin->m_Pos.y;
@ -492,9 +538,10 @@ int NumInclude;
} }
NbrItem++; NbrItem++;
if( ( (int) Pin->m_PinType == (int) PIN_POWER_IN ) && if( ( (int) Pin->m_PinType == (int) PIN_POWER_IN )
( Pin->m_Attributs & PINNOTDRAW ) ) && ( Pin->m_Attributs & PINNOTDRAW ) )
{ /* Il y a un PIN_LABEL Associe */ {
/* Il y a un PIN_LABEL Associe */
if( ObjNet ) if( ObjNet )
{ {
ObjNet[NbrItem].m_Comp = NULL; ObjNet[NbrItem].m_Comp = NULL;
@ -509,6 +556,7 @@ int NumInclude;
NbrItem++; NbrItem++;
} }
} }
break; break;
case DRAW_PICK_ITEM_STRUCT_TYPE: case DRAW_PICK_ITEM_STRUCT_TYPE:
@ -540,11 +588,14 @@ int NumInclude;
ObjNet[NbrItem].m_NumInclude = NumInclude; ObjNet[NbrItem].m_NumInclude = NumInclude;
ObjNet[NbrItem].m_Start = SheetLabel->m_Pos; ObjNet[NbrItem].m_Start = SheetLabel->m_Pos;
ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start; ObjNet[NbrItem].m_End = ObjNet[NbrItem].m_Start;
/* Si c'est un Bus, eclatement en Label */ /* Si c'est un Bus, eclatement en Label */
if ( ii ) ConvertBusToMembers(ObjNet + NbrItem); if( ii )
ConvertBusToMembers( ObjNet + NbrItem );
} }
NbrItem += ii + 1; NbrItem += ii + 1;
} }
break; break;
case DRAW_SHEETLABEL_STRUCT_TYPE: case DRAW_SHEETLABEL_STRUCT_TYPE:
@ -560,22 +611,21 @@ int NumInclude;
break; break;
} }
} }
DrawList = DrawList->Pnext;
} }
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 /* Routine qui analyse les labels type xxBUSLABELMEMBER
Propage les Netcodes entre labels correspondants ( c'est a dire lorsque * Propage les Netcodes entre labels correspondants ( c'est a dire lorsque
leur numero de membre est identique) lorsqu'ils sont connectes * leur numero de membre est identique) lorsqu'ils sont connectes
globalement par leur BusNetCode * globalement par leur BusNetCode
Utilise et met a jour la variable LastNetCode * Utilise et met a jour la variable LastNetCode
*/ */
{ {
ObjetNetListStruct* LabelInTst, * Lim; ObjetNetListStruct* LabelInTst, * Lim;
@ -584,22 +634,28 @@ ObjetNetListStruct *LabelInTst, *Lim;
for( ; Label < Lim; Label++ ) for( ; Label < Lim; Label++ )
{ {
if( (Label->m_Type == NET_SHEETBUSLABELMEMBER) || if( (Label->m_Type == NET_SHEETBUSLABELMEMBER)
(Label->m_Type == NET_BUSLABELMEMBER) || || (Label->m_Type == NET_BUSLABELMEMBER)
(Label->m_Type == NET_GLOBBUSLABELMEMBER) ) || (Label->m_Type == NET_GLOBBUSLABELMEMBER) )
{ {
if( Label->m_NetCode == 0 ) if( Label->m_NetCode == 0 )
{ {
Label->m_NetCode = LastNetCode; LastNetCode++; Label->m_NetCode = LastNetCode;
LastNetCode++;
} }
for( LabelInTst = Label + 1; LabelInTst < Lim; LabelInTst++ ) for( LabelInTst = Label + 1; LabelInTst < Lim; LabelInTst++ )
{ {
if( (LabelInTst->m_Type == NET_SHEETBUSLABELMEMBER) || if( (LabelInTst->m_Type == NET_SHEETBUSLABELMEMBER)
(LabelInTst->m_Type == NET_BUSLABELMEMBER) || || (LabelInTst->m_Type == NET_BUSLABELMEMBER)
(LabelInTst->m_Type == NET_GLOBBUSLABELMEMBER) ) || (LabelInTst->m_Type == NET_GLOBBUSLABELMEMBER) )
{ {
if( LabelInTst->m_BusNetCode != Label->m_BusNetCode ) continue; if( LabelInTst->m_BusNetCode != Label->m_BusNetCode )
if( LabelInTst->m_Member != Label->m_Member ) continue; continue;
if( LabelInTst->m_Member != Label->m_Member )
continue;
if( LabelInTst->m_NetCode == 0 ) if( LabelInTst->m_NetCode == 0 )
LabelInTst->m_NetCode = Label->m_NetCode; LabelInTst->m_NetCode = Label->m_NetCode;
else else
@ -616,9 +672,9 @@ int IsBusLabel( const wxString & LabelDrawList )
/**************************************************/ /**************************************************/
/* Routine qui verifie si le Label a une notation de type Bus /* Routine qui verifie si le Label a une notation de type Bus
Retourne 0 si non * Retourne 0 si non
nombre de membres si oui * nombre de membres si oui
met a jour FirstNumWireBus, LastNumWireBus et RootBusNameLength * met a jour FirstNumWireBus, LastNumWireBus et RootBusNameLength
*/ */
{ {
@ -630,7 +686,9 @@ bool error = FALSE;
/* Search for '[' because a bus label is like "busname[nn..mm]" */ /* Search for '[' because a bus label is like "busname[nn..mm]" */
ii = LabelDrawList.Find( '[' ); ii = LabelDrawList.Find( '[' );
if ( ii < 0 ) return(0); if( ii < 0 )
return 0;
Num = (unsigned) ii; Num = (unsigned) ii;
FirstNumWireBus = LastNumWireBus = 9; FirstNumWireBus = LastNumWireBus = 9;
@ -642,21 +700,28 @@ bool error = FALSE;
Num++; Num++;
} }
if ( ! BufLine.ToLong(&tmp) ) error = TRUE;; if( !BufLine.ToLong( &tmp ) )
error = TRUE;
FirstNumWireBus = tmp; FirstNumWireBus = tmp;
while( LabelDrawList[Num] == '.' && Num < LabelDrawList.Len() ) while( LabelDrawList[Num] == '.' && Num < LabelDrawList.Len() )
Num++; Num++;
BufLine.Empty(); BufLine.Empty();
while( LabelDrawList[Num] != ']' && Num < LabelDrawList.Len() ) while( LabelDrawList[Num] != ']' && Num < LabelDrawList.Len() )
{ {
BufLine.Append( LabelDrawList[Num] ); BufLine.Append( LabelDrawList[Num] );
Num++; Num++;
} }
if ( ! BufLine.ToLong(&tmp) ) error = TRUE;;
if( !BufLine.ToLong( &tmp ) )
error = TRUE;;
LastNumWireBus = tmp; LastNumWireBus = tmp;
if( FirstNumWireBus < 0 ) FirstNumWireBus = 0; if( FirstNumWireBus < 0 )
if( LastNumWireBus < 0 ) LastNumWireBus = 0; FirstNumWireBus = 0;
if( LastNumWireBus < 0 )
LastNumWireBus = 0;
if( FirstNumWireBus > LastNumWireBus ) if( FirstNumWireBus > LastNumWireBus )
{ {
EXCHG( FirstNumWireBus, LastNumWireBus ); EXCHG( FirstNumWireBus, LastNumWireBus );
@ -667,22 +732,23 @@ bool error = FALSE;
wxString msg = _( "Bad Bus Label: " ) + LabelDrawList; wxString msg = _( "Bad Bus Label: " ) + LabelDrawList;
DisplayError( NULL, msg ); DisplayError( NULL, msg );
} }
return(LastNumWireBus - FirstNumWireBus + 1 ); 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, /* 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 * et qui cree les structures avec le type NET_GLOBBUSLABELMEMBER, NET_BUSLABELMEMBER
ou NET_SHEETBUSLABELMEMBER * ou NET_SHEETBUSLABELMEMBER
entree = pointeur sur l'ObjetNetListStruct initialise corresp au buslabel * entree = pointeur sur l'ObjetNetListStruct initialise corresp au buslabel
suppose que FirstNumWireBus, LastNumWireBus et RootBusNameLength sont a jour * suppose que FirstNumWireBus, LastNumWireBus et RootBusNameLength sont a jour
modifie l'ObjetNetListStruct de base et remplit les suivants * modifie l'ObjetNetListStruct de base et remplit les suivants
m_Label is a pointer to a new wxString * m_Label is a pointer to a new wxString
m_Label must be deallocated by the user (only for a NET_GLOBBUSLABELMEMBER, * m_Label must be deallocated by the user (only for a NET_GLOBBUSLABELMEMBER,
NET_BUSLABELMEMBER or a NET_SHEETBUSLABELMEMBER object type) * NET_BUSLABELMEMBER or a NET_SHEETBUSLABELMEMBER object type)
*/ */
{ {
int NumItem, BusMember; int NumItem, BusMember;
@ -692,42 +758,50 @@ wxString BufLine;
BusLabel->m_Type = NET_GLOBBUSLABELMEMBER; BusLabel->m_Type = NET_GLOBBUSLABELMEMBER;
else if( BusLabel->m_Type == NET_SHEETLABEL ) else if( BusLabel->m_Type == NET_SHEETLABEL )
BusLabel->m_Type = NET_SHEETBUSLABELMEMBER; BusLabel->m_Type = NET_SHEETBUSLABELMEMBER;
else BusLabel->m_Type = NET_BUSLABELMEMBER; else
BusLabel->m_Type = NET_BUSLABELMEMBER;
/* Convertion du BusLabel en la racine du Label + le numero du fil */ /* Convertion du BusLabel en la racine du Label + le numero du fil */
BufLine = BusLabel->m_Label->Left( RootBusNameLength ); BufLine = BusLabel->m_Label->Left( RootBusNameLength );
BusMember = FirstNumWireBus; BusMember = FirstNumWireBus;
BufLine << BusMember; BufLine << BusMember;
BusLabel->m_Label = new wxString( BufLine ); BusLabel->m_Label = new wxString( BufLine );
BusLabel->m_Member = BusMember; BusLabel->m_Member = BusMember;
NumItem = 1; NumItem = 1;
for( BusMember++; BusMember <= LastNumWireBus; BusMember++ ) for( BusMember++; BusMember <= LastNumWireBus; BusMember++ )
{ {
*(BusLabel + 1) = *BusLabel; BusLabel++; NumItem++; *(BusLabel + 1) = *BusLabel; BusLabel++; NumItem++;
/* Convertion du BusLabel en la racine du Label + le numero du fil */ /* Convertion du BusLabel en la racine du Label + le numero du fil */
BufLine = BusLabel->m_Label->Left( RootBusNameLength ); BufLine = BusLabel->m_Label->Left( RootBusNameLength );
BufLine << BusMember; BufLine << BusMember;
BusLabel->m_Label = new wxString( BufLine ); BusLabel->m_Label = new wxString( BufLine );
BusLabel->m_Member = BusMember; BusLabel->m_Member = BusMember;
} }
return( NumItem);
return NumItem;
} }
/**********************************************************************/ /**********************************************************************/
static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus ) static void PropageNetCode( int OldNetCode, int NewNetCode, int IsBus )
/**********************************************************************/ /**********************************************************************/
/* PropageNetCode propage le netcode NewNetCode sur tous les elements /* PropageNetCode propage le netcode NewNetCode sur tous les elements
appartenant a l'ancien netcode OldNetCode * appartenant a l'ancien netcode OldNetCode
Si IsBus == 0; c'est le membre NetCode qui est propage * Si IsBus == 0; c'est le membre NetCode qui est propage
Si IsBus != 0; c'est le membre BusNetCode qui est propage * Si IsBus != 0; c'est le membre BusNetCode qui est propage
*/ */
{ {
int jj; int jj;
ObjetNetListStruct* Objet = g_TabObjNet; ObjetNetListStruct* Objet = g_TabObjNet;
if( OldNetCode == NewNetCode ) return; if( OldNetCode == NewNetCode )
return;
if( IsBus == 0 ) /* Propagation du NetCode */ if( IsBus == 0 ) /* Propagation du NetCode */
{ {
@ -739,7 +813,6 @@ ObjetNetListStruct * Objet = g_TabObjNet;
} }
} }
} }
else /* Propagation du BusNetCode */ else /* Propagation du BusNetCode */
{ {
for( jj = 0; jj < g_NbrObjNet; jj++, Objet++ ) for( jj = 0; jj < g_NbrObjNet; jj++, Objet++ )
@ -752,26 +825,28 @@ ObjetNetListStruct * Objet = g_TabObjNet;
} }
} }
/***************************************************************************/ /***************************************************************************/
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 /* Routine qui verifie si l'element *Ref est connecte a
d'autres elements de la liste des objets du schema, selon le mode Point * d'autres elements de la liste des objets du schema, selon le mode Point
a point ( Extremites superposees ) * a point ( Extremites superposees )
*
si IsBus: * si IsBus:
la connexion ne met en jeu que des elements type bus * la connexion ne met en jeu que des elements type bus
( BUS ou BUSLABEL ou JONCTION ) * ( BUS ou BUSLABEL ou JONCTION )
sinon * sinon
la connexion ne met en jeu que des elements type non bus * la connexion ne met en jeu que des elements type non bus
( autres que BUS ou BUSLABEL ) * ( autres que BUS ou BUSLABEL )
*
L'objet Ref doit avoir un NetCode valide. * L'objet Ref doit avoir un NetCode valide.
*
La liste des objets est supposee classe par NumSheet Croissants, * La liste des objets est supposee classe par NumSheet Croissants,
et la recherche se fait a partir de l'element start, 1er element * et la recherche se fait a partir de l'element start, 1er element
de la feuille de schema * de la feuille de schema
( il ne peut y avoir connexion physique entre elements de differentes sheets) * ( il ne peut y avoir connexion physique entre elements de differentes sheets)
*/ */
{ {
int i, NetCode; int i, NetCode;
@ -782,7 +857,8 @@ if ( IsBus == 0 ) /* Objets autres que BUS et BUSLABELS */
NetCode = Ref->m_NetCode; NetCode = Ref->m_NetCode;
for( i = start; i < g_NbrObjNet; i++ ) for( i = start; i < g_NbrObjNet; i++ )
{ {
if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) break; if( Point[i].m_SheetNumber > Ref->m_SheetNumber )
break;
switch( Point[i].m_Type ) switch( Point[i].m_Type )
{ {
@ -794,15 +870,21 @@ if ( IsBus == 0 ) /* Objets autres que BUS et BUSLABELS */
case NET_PINLABEL: case NET_PINLABEL:
case NET_JONCTION: case NET_JONCTION:
case NET_NOCONNECT: case NET_NOCONNECT:
if( (((Ref->m_Start.x == Point[i].m_Start.x) && (Ref->m_Start.y == Point[i].m_Start.y))) || if( ( ( (Ref->m_Start.x == Point[i].m_Start.x) &&
(((Ref->m_Start.x == Point[i].m_End.x) && (Ref->m_Start.y == Point[i].m_End.y))) || (Ref->m_Start.y == Point[i].m_Start.y) ) )
(((Ref->m_End.x == Point[i].m_Start.x) && (Ref->m_End.y == Point[i].m_Start.y))) || || ( ( (Ref->m_Start.x == Point[i].m_End.x) &&
(((Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y))) ) (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; if( Point[i].m_NetCode == 0 )
else PropageNetCode( Point[i].m_NetCode, NetCode , 0); Point[i].m_NetCode = NetCode;
else
PropageNetCode( Point[i].m_NetCode, NetCode, 0 );
} }
break; break;
case NET_BUS: case NET_BUS:
case NET_BUSLABELMEMBER: case NET_BUSLABELMEMBER:
case NET_SHEETBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER:
@ -816,7 +898,8 @@ else /* Objets type BUS et BUSLABELS ( et JONCTIONS )*/
NetCode = Ref->m_BusNetCode; NetCode = Ref->m_BusNetCode;
for( i = start; i < g_NbrObjNet; i++ ) for( i = start; i < g_NbrObjNet; i++ )
{ {
if( Point[i].m_SheetNumber > Ref->m_SheetNumber ) break; if( Point[i].m_SheetNumber > Ref->m_SheetNumber )
break;
switch( Point[i].m_Type ) switch( Point[i].m_Type )
{ {
@ -834,14 +917,18 @@ else /* Objets type BUS et BUSLABELS ( et JONCTIONS )*/
case NET_SHEETBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER:
case NET_GLOBBUSLABELMEMBER: case NET_GLOBBUSLABELMEMBER:
case NET_JONCTION: case NET_JONCTION:
if( (((Ref->m_Start.x == Point[i].m_Start.x) && (Ref->m_Start.y == Point[i].m_Start.y))) || if( ( ( (Ref->m_Start.x == Point[i].m_Start.x) &&
(((Ref->m_Start.x == Point[i].m_End.x) && (Ref->m_Start.y == Point[i].m_End.y))) || (Ref->m_Start.y == Point[i].m_Start.y) ) )
(((Ref->m_End.x == Point[i].m_Start.x) && (Ref->m_End.y == Point[i].m_Start.y))) || || ( ( (Ref->m_Start.x == Point[i].m_End.x) &&
(((Ref->m_End.x == Point[i].m_End.x) && (Ref->m_End.y == Point[i].m_End.y))) ) (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 ) if( Point[i].m_BusNetCode == 0 )
Point[i].m_BusNetCode = NetCode; Point[i].m_BusNetCode = NetCode;
else PropageNetCode( Point[i].m_BusNetCode, NetCode,1 ); else
PropageNetCode( Point[i].m_BusNetCode, NetCode, 1 );
} }
break; break;
} }
@ -854,14 +941,15 @@ else /* Objets type BUS et BUSLABELS ( et JONCTIONS )*/
static void SegmentToPointConnect( ObjetNetListStruct* Jonction, static void SegmentToPointConnect( ObjetNetListStruct* Jonction,
int IsBus, int start ) int IsBus, int start )
/***************************************************************/ /***************************************************************/
/* /*
Routine qui recherche si un point (jonction) est connecte a des segments, * Routine qui recherche si un point (jonction) est connecte a des segments,
et regroupe les NetCodes des objets connectes a la jonction. * et regroupe les NetCodes des objets connectes a la jonction.
Le point de jonction doit avoir un netcode valide * Le point de jonction doit avoir un netcode valide
La liste des objets est supposee classe par NumSheet Croissants, * La liste des objets est supposee classe par NumSheet Croissants,
et la recherche se fait a partir de l'element start, 1er element * et la recherche se fait a partir de l'element start, 1er element
de la feuille de schema * de la feuille de schema
( il ne peut y avoir connexion physique entre elements de differentes sheets) * ( il ne peut y avoir connexion physique entre elements de differentes sheets)
*/ */
{ {
int i; int i;
@ -869,15 +957,18 @@ ObjetNetListStruct *Segment = g_TabObjNet;
for( i = start; i < g_NbrObjNet; i++ ) for( i = start; i < g_NbrObjNet; i++ )
{ {
if( Segment[i].m_SheetNumber > Jonction->m_SheetNumber ) break; if( Segment[i].m_SheetNumber > Jonction->m_SheetNumber )
break;
if( IsBus == 0 ) if( IsBus == 0 )
{ {
if ( Segment[i].m_Type != NET_SEGMENT ) continue; if( Segment[i].m_Type != NET_SEGMENT )
continue;
} }
else else
{ {
if ( Segment[i].m_Type != NET_BUS ) continue; if( Segment[i].m_Type != NET_BUS )
continue;
} }
if( SegmentIntersect( Segment[i].m_Start.x, Segment[i].m_Start.y, if( SegmentIntersect( Segment[i].m_Start.x, Segment[i].m_Start.y,
@ -890,19 +981,22 @@ ObjetNetListStruct *Segment = g_TabObjNet;
if( Segment[i].m_NetCode ) if( Segment[i].m_NetCode )
PropageNetCode( Segment[i].m_NetCode, PropageNetCode( Segment[i].m_NetCode,
Jonction->m_NetCode, IsBus ); Jonction->m_NetCode, IsBus );
else Segment[i].m_NetCode = Jonction->m_NetCode; else
Segment[i].m_NetCode = Jonction->m_NetCode;
} }
else else
{ {
if( Segment[i].m_BusNetCode ) if( Segment[i].m_BusNetCode )
PropageNetCode( Segment[i].m_BusNetCode, PropageNetCode( Segment[i].m_BusNetCode,
Jonction->m_BusNetCode, IsBus ); Jonction->m_BusNetCode, IsBus );
else Segment[i].m_BusNetCode = Jonction->m_BusNetCode; else
Segment[i].m_BusNetCode = Jonction->m_BusNetCode;
} }
} }
} }
} }
/***************************************************************** /*****************************************************************
* Routine qui connecte les groupes d'objets si labels identiques * * Routine qui connecte les groupes d'objets si labels identiques *
*******************************************************************/ *******************************************************************/
@ -911,66 +1005,80 @@ static void LabelConnection(ObjetNetListStruct *LabelRef)
int i, NetCode; int i, NetCode;
ObjetNetListStruct* ObjetNet; 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++ ) for( i = 0; i < g_NbrObjNet; i++ )
{ {
NetCode = ObjetNet[i].m_NetCode; NetCode = ObjetNet[i].m_NetCode;
if( NetCode == LabelRef->m_NetCode ) continue; if( NetCode == LabelRef->m_NetCode )
continue;
if( ObjetNet[i].m_SheetNumber != LabelRef->m_SheetNumber ) if( ObjetNet[i].m_SheetNumber != LabelRef->m_SheetNumber )
{ {
if (ObjetNet[i].m_Type != NET_PINLABEL ) continue; if( ObjetNet[i].m_Type != NET_PINLABEL )
continue;
} }
if( (ObjetNet[i].m_Type == NET_LABEL ) || if( (ObjetNet[i].m_Type == NET_LABEL )
(ObjetNet[i].m_Type == NET_GLOBLABEL ) || || (ObjetNet[i].m_Type == NET_GLOBLABEL )
(ObjetNet[i].m_Type == NET_BUSLABELMEMBER ) || || (ObjetNet[i].m_Type == NET_BUSLABELMEMBER )
(ObjetNet[i].m_Type == NET_GLOBBUSLABELMEMBER ) || || (ObjetNet[i].m_Type == NET_GLOBBUSLABELMEMBER )
(ObjetNet[i].m_Type == NET_PINLABEL ) ) || (ObjetNet[i].m_Type == NET_PINLABEL ) )
{ {
if( ObjetNet[i].m_Label->CmpNoCase(*LabelRef->m_Label) != 0) continue; 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 */ /* Propagation du Netcode a tous les Objets de meme NetCode */
if( ObjetNet[i].m_NetCode ) if( ObjetNet[i].m_NetCode )
PropageNetCode( ObjetNet[i].m_NetCode, LabelRef->m_NetCode, 0 ); PropageNetCode( ObjetNet[i].m_NetCode, LabelRef->m_NetCode, 0 );
else ObjetNet[i].m_NetCode = LabelRef->m_NetCode; else
ObjetNet[i].m_NetCode = LabelRef->m_NetCode;
} }
} }
} }
/****************************************************************************/ /****************************************************************************/
static int TriNetCode(ObjetNetListStruct *Objet1, ObjetNetListStruct *Objet2) static int TriNetCode( const void* o1, const void* o2 )
/****************************************************************************/ /****************************************************************************/
/* Routine de comparaison pour le tri par NetCode croissant /* 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 /* 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 /* 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* NetItemRef, * NetItemTst, * ItemPtr;
@ -980,28 +1088,33 @@ IsConnectType StateFlag;
NetStart = NetEnd = ListObj; NetStart = NetEnd = ListObj;
Lim = ListObj + NbItems;
NetItemRef = NetStart; NetItemRef = NetStart;
Nb = 0; StateFlag = UNCONNECT; Nb = 0;
StateFlag = UNCONNECT;
Lim = ListObj + NbItems;
for( ; NetItemRef < Lim; NetItemRef++ ) for( ; NetItemRef < Lim; NetItemRef++ )
{ {
if( NetItemRef->m_Type == NET_NOCONNECT ) if( NetItemRef->m_Type == NET_NOCONNECT )
if( StateFlag != CONNECT ) StateFlag = NOCONNECT; if( StateFlag != CONNECT )
StateFlag = NOCONNECT;
/* Analyse du net en cours */ /* Analyse du net en cours */
NetItemTst = NetItemRef + 1; NetItemTst = NetItemRef + 1;
if( (NetItemTst >= Lim) || if( (NetItemTst >= Lim)
(NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) )
{ /* Net analyse: mise a jour de m_FlagOfConnection */ {
/* Net analyse: mise a jour de m_FlagOfConnection */
NetEnd = NetItemTst; NetEnd = NetItemTst;
for( ItemPtr = NetStart; ItemPtr < NetEnd; ItemPtr++ ) for( ItemPtr = NetStart; ItemPtr < NetEnd; ItemPtr++ )
{ {
ItemPtr->m_FlagOfConnection = StateFlag; ItemPtr->m_FlagOfConnection = StateFlag;
} }
if(NetItemTst >= Lim) return;
if( NetItemTst >= Lim )
return;
/* Start Analyse Nouveau Net */ /* Start Analyse Nouveau Net */
StateFlag = UNCONNECT; StateFlag = UNCONNECT;
@ -1011,8 +1124,8 @@ IsConnectType StateFlag;
for( ; ; NetItemTst++ ) for( ; ; NetItemTst++ )
{ {
if( (NetItemTst >= Lim) || if( (NetItemTst >= Lim)
(NetItemRef->m_NetCode != NetItemTst->m_NetCode) ) || (NetItemRef->m_NetCode != NetItemTst->m_NetCode) )
break; break;
switch( NetItemTst->m_Type ) switch( NetItemTst->m_Type )
@ -1035,10 +1148,10 @@ IsConnectType StateFlag;
break; break;
case NET_NOCONNECT: case NET_NOCONNECT:
if( StateFlag != CONNECT ) StateFlag = NOCONNECT; if( StateFlag != CONNECT )
StateFlag = NOCONNECT;
break; break;
} }
} }
} }
} }

View File

@ -15,8 +15,7 @@
/* Indicateurs de type de netliste generee */ /* Indicateurs de type de netliste generee */
typedef enum typedef enum {
{
NET_TYPE_NOT_INIT = 0, NET_TYPE_NOT_INIT = 0,
NET_TYPE_PCBNEW, NET_TYPE_PCBNEW,
NET_TYPE_ORCADPCB2, NET_TYPE_ORCADPCB2,
@ -58,13 +57,14 @@ typedef enum { /* Valeur du Flag de connection */
CONNECT /* connexion normale */ CONNECT /* connexion normale */
} IsConnectType; } IsConnectType;
/* Structure decrivant 1 element de connexion (pour netlist ) */ /* Structure decrivant 1 element de connexion (pour netlist ) */
class ObjetNetListStruct class ObjetNetListStruct
{ {
public: public:
void* m_Comp; /* Pointeur sur la definition de l'objet */ void* m_Comp; /* Pointeur sur la definition de l'objet */
void* m_Link; /* Pour SheetLabelStruct: Pointeur sur la feuille de hierarchie void* m_Link; /* Pour SheetLabelStruct: Pointeur sur la feuille de hierarchie
Pour les Pins: pointeur sur le composant */ * Pour les Pins: pointeur sur le composant */
int m_Flag; /* flag pour calculs internes */ int m_Flag; /* flag pour calculs internes */
SCH_SCREEN* m_Screen; /* Ecran d'appartenance */ SCH_SCREEN* m_Screen; /* Ecran d'appartenance */
NetObjetType m_Type; NetObjetType m_Type;
@ -72,7 +72,7 @@ public:
int m_NetCode; /* pour elements simples */ int m_NetCode; /* pour elements simples */
int m_BusNetCode; /* pour connexions type bus */ int m_BusNetCode; /* pour connexions type bus */
int m_Member; /* pour les labels type BUSWIRE ( labels de bus eclate ) int m_Member; /* pour les labels type BUSWIRE ( labels de bus eclate )
numero de membre */ * numero de membre */
IsConnectType m_FlagOfConnection; IsConnectType m_FlagOfConnection;
int m_SheetNumber; /* Sheet number for this item */ 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)*/ int m_NumInclude; /* Numero de sous schema correpondant a la sheet (Gestion des GLabels et Pin Sheet)*/
@ -81,6 +81,7 @@ public:
wxPoint m_Start, m_End; wxPoint m_Start, m_End;
}; };
/* Structure decrivant 1 composant de la schematique (pour annotation ) */ /* Structure decrivant 1 composant de la schematique (pour annotation ) */
struct CmpListStruct struct CmpListStruct
{ {

View File

@ -75,9 +75,10 @@ public:
public: public:
EDA_DrawLineStruct( const wxPoint& pos, int layer ); EDA_DrawLineStruct( const wxPoint& pos, int layer );
~EDA_DrawLineStruct() { } ~EDA_DrawLineStruct() { }
virtual wxString GetClass() const 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, virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode,
int Color = -1 ); 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(); ~DrawMarkerStruct();
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawMarkerStruct" ); return wxT( "DrawMarker" );
} }
@ -116,6 +128,16 @@ public:
wxString GetComment(); wxString GetComment();
virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int draw_mode, int Color = -1 ); 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() { } ~DrawNoConnectStruct() { }
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawNoConnectStruct" ); return wxT( "DrawNoConnect" );
} }
@ -154,9 +176,10 @@ public:
public: public:
DrawBusEntryStruct( const wxPoint& pos, int shape, int id ); DrawBusEntryStruct( const wxPoint& pos, int shape, int id );
~DrawBusEntryStruct() { } ~DrawBusEntryStruct() { }
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawBusEntryStruct" ); return wxT( "DrawBusEntry" );
} }
@ -177,9 +200,10 @@ public:
public: public:
DrawPolylineStruct( int layer ); DrawPolylineStruct( int layer );
~DrawPolylineStruct(); ~DrawPolylineStruct();
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawPolylineStruct" ); return wxT( "DrawPolyline" );
} }
@ -197,9 +221,10 @@ public:
public: public:
DrawJunctionStruct( const wxPoint& pos ); DrawJunctionStruct( const wxPoint& pos );
~DrawJunctionStruct() { } ~DrawJunctionStruct() { }
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawJunctionStruct" ); return wxT( "DrawJunction" );
} }
@ -209,8 +234,7 @@ public:
}; };
class DrawTextStruct : public EDA_BaseStruct class DrawTextStruct : public EDA_BaseStruct, public EDA_TextStruct
, public EDA_TextStruct
{ {
public: public:
int m_Layer; int m_Layer;
@ -224,7 +248,7 @@ public:
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawTextStruct" ); return wxT( "DrawText" );
} }
@ -248,7 +272,7 @@ public:
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawLabelStruct" ); return wxT( "DrawLabel" );
} }
}; };
@ -264,7 +288,7 @@ public:
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawGlobalLabelStruct" ); return wxT( "DrawGlobalLabel" );
} }
}; };

View File

@ -8,7 +8,7 @@ LibEDA_BaseStruct * LocatePin(const wxPoint & RefPos,
int Unit, int Convert, EDA_SchComponentStruct * DrawItem = NULL); int Unit, int Convert, EDA_SchComponentStruct * DrawItem = NULL);
/* Routine de localisation d'une PIN de la PartLib pointee par Entry */ /* Routine de localisation d'une PIN de la PartLib pointee par Entry */
wxString ReturnDefaultFieldName(int FieldNumber); const wxString& ReturnDefaultFieldName( int aFieldNdx );
/***************/ /***************/

View File

@ -215,7 +215,7 @@ private:
char m_FlagRefreshReq; /* indique que l'ecran doit redessine */ 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_FlagModified; // indique modif du PCB,utilise pour eviter une sortie sans sauvegarde
char m_FlagSave; // indique sauvegarde auto faite 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 */ /* Valeurs du pas de grille et du zoom */
public: public:
@ -260,17 +260,12 @@ public:
/** /**
* Function SetCurItem * Function SetCurItem
* sets the currently selected object, m_CurrentItem. * 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 * @param current Any object derived from EDA_BaseStruct
*/ */
void SetCurItem( EDA_BaseStruct* current ) void SetCurItem( EDA_BaseStruct* current ) { m_CurrentItem = current; }
{
m_CurrentItem = current;
}
EDA_BaseStruct* GetCurItem() const { return m_CurrentItem; } EDA_BaseStruct* GetCurItem() const { return m_CurrentItem; }
/* fonctions relatives au zoom */ /* fonctions relatives au zoom */
int GetZoom(); /* retourne le coeff de zoom */ int GetZoom(); /* retourne le coeff de zoom */
void SetZoom( int coeff ); /* ajuste le coeff de zoom a coeff */ void SetZoom( int coeff ); /* ajuste le coeff de zoom a coeff */
@ -313,6 +308,18 @@ public:
{ {
return wxT( "BASE_SCREEN" ); 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
}; };

View File

@ -441,10 +441,10 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
{ {
wxMenu itemMenu; wxMenu itemMenu;
int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() );
itemMenu.SetTitle( _("Selection Clarification") ); // does this work? not under Linux! itemMenu.SetTitle( _("Selection Clarification") ); // does this work? not under Linux!
int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() );
for( int i=0; i<limit; ++i ) for( int i=0; i<limit; ++i )
{ {
wxString text; wxString text;

View File

@ -124,6 +124,7 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
DrawPanel->CursorOff( &dc ); DrawPanel->CursorOff( &dc );
DrawPanel->m_CanStartBlock = -1; // Avoid to start a block coomand when clicking on menu 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 command in progress: Put the Cancel command (if needed) and End command
if( m_ID_current_state ) if( m_ID_current_state )
{ {
@ -161,13 +162,11 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
} }
/* Select a proper item */ /* Select a proper item */
if( (item == NULL) || (item->m_Flags == 0) ) if( !item || !item->m_Flags )
{ {
item = PcbGeneralLocateAndDisplay(); item = PcbGeneralLocateAndDisplay();
SetCurItem(item);
} }
item = GetCurItem();
if( item ) if( item )
flags = item->m_Flags; flags = item->m_Flags;
else else
@ -183,10 +182,18 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE )
{ {
aPopMenu->AppendSeparator(); aPopMenu->AppendSeparator();
if( !((MODULE*)item)->IsLocked() )
{
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, _( "Lock Module" ), ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, _( "Lock Module" ),
Locked_xpm ); Locked_xpm );
}
else
{
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FREE_MODULE, _( "Unlock Module" ), ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_AUTOPLACE_FREE_MODULE, _( "Unlock Module" ),
Unlocked_xpm ); Unlocked_xpm );
}
if( !flags ) if( !flags )
aPopMenu->Append( ID_POPUP_PCB_AUTOPLACE_CURRENT_MODULE, aPopMenu->Append( ID_POPUP_PCB_AUTOPLACE_CURRENT_MODULE,
_( "Auto place Module" ) ); _( "Auto place Module" ) );