small changes in editrack-part2.cpp (translation of some comments from french to english) are some explanations relatives to the todo remark

This commit is contained in:
CHARRAS 2007-09-04 14:28:20 +00:00
parent 9d650474dd
commit 2bd88d356c
5 changed files with 78 additions and 64 deletions

View File

@ -4,6 +4,12 @@ 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-sept-04 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+ pcbnew
better comments in editrack-part2 (the todo remark solved)
+ todo.txt: note about editrack-part2 modified (problem solved)
2007-Aug-31 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Aug-31 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================

View File

@ -21,9 +21,9 @@
static EDA_BaseStruct* CopyStruct( WinEDA_DrawPanel* panel, wxDC* DC, BASE_SCREEN* screen, static EDA_BaseStruct* CopyStruct( WinEDA_DrawPanel* panel, wxDC* DC, BASE_SCREEN* screen,
EDA_BaseStruct* DrawStruct ); EDA_BaseStruct* DrawStruct );
static void CollectStructsToDrag( SCH_SCREEN* screen ); static void CollectStructsToDrag( SCH_SCREEN* screen );
static void AddPickedItem( SCH_SCREEN* screen, int px, int py ); static void AddPickedItem( SCH_SCREEN* screen, wxPoint position );
static LibEDA_BaseStruct* GetNextPinPosition( EDA_SchComponentStruct* DrawLibItem, static LibEDA_BaseStruct* GetNextPinPosition( EDA_SchComponentStruct* DrawLibItem,
int* px, int* py ); wxPoint & position );
static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
static EDA_BaseStruct* SaveStructListForPaste( EDA_BaseStruct* DrawStruct ); static EDA_BaseStruct* SaveStructListForPaste( EDA_BaseStruct* DrawStruct );
static bool MirrorStruct( WinEDA_DrawPanel* panel, wxDC* DC, static bool MirrorStruct( WinEDA_DrawPanel* panel, wxDC* DC,
@ -1441,14 +1441,14 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
if( Struct->Type() == DRAW_LIB_ITEM_STRUCT_TYPE ) if( Struct->Type() == DRAW_LIB_ITEM_STRUCT_TYPE )
{ {
LibEDA_BaseStruct* DrawItem; LibEDA_BaseStruct* DrawItem;
int x, y; wxPoint pos;
DrawItem = GetNextPinPosition( (EDA_SchComponentStruct*) Struct, &x, &y ); DrawItem = GetNextPinPosition( (EDA_SchComponentStruct*) Struct, pos );
while( DrawItem ) while( DrawItem )
{ {
if( (x < ox) || (x > fx) || (y < oy) || (y > fy) ) if( (pos.x < ox) || (pos.x > fx) || (pos.y < oy) || (pos.y > fy) )
AddPickedItem( screen, x, y ); AddPickedItem( screen, pos );
DrawItem = GetNextPinPosition( NULL, &x, &y ); DrawItem = GetNextPinPosition( NULL, pos );
} }
} }
@ -1458,7 +1458,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
while( SLabel ) while( SLabel )
{ {
if( SLabel->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) if( SLabel->Type() == DRAW_SHEETLABEL_STRUCT_TYPE )
AddPickedItem( screen, SLabel->m_Pos.x, SLabel->m_Pos.y ); AddPickedItem( screen, SLabel->m_Pos );
SLabel = (DrawSheetLabelStruct*) SLabel->Pnext; SLabel = (DrawSheetLabelStruct*) SLabel->Pnext;
} }
} }
@ -1466,15 +1466,15 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
if( Struct->Type() == DRAW_BUSENTRY_STRUCT_TYPE ) if( Struct->Type() == DRAW_BUSENTRY_STRUCT_TYPE )
{ {
DrawBusEntryStruct* item = (DrawBusEntryStruct*) Struct; DrawBusEntryStruct* item = (DrawBusEntryStruct*) Struct;
AddPickedItem( screen, item->m_Pos.x, item->m_Pos.y ); AddPickedItem( screen, item->m_Pos );
AddPickedItem( screen, item->m_End().x, item->m_End().y ); AddPickedItem( screen, item->m_End() );
} }
} }
} }
/******************************************************************/ /******************************************************************/
static void AddPickedItem( SCH_SCREEN* screen, int px, int py ) static void AddPickedItem( SCH_SCREEN* screen, wxPoint position )
/******************************************************************/ /******************************************************************/
{ {
DrawPickedStruct* DrawStructs; DrawPickedStruct* DrawStructs;
@ -1492,10 +1492,10 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
case DRAW_SEGMENT_STRUCT_TYPE: case DRAW_SEGMENT_STRUCT_TYPE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (EDA_DrawLineStruct*) Struct ) #define STRUCT ( (EDA_DrawLineStruct*) Struct )
if( (STRUCT->m_Start.x == px) && (STRUCT->m_Start.y == py) ) if( STRUCT->m_Start == position )
STRUCT->m_Flags &= ~STARTPOINT; STRUCT->m_Flags &= ~STARTPOINT;
if( (STRUCT->m_End.x == px) && (STRUCT->m_End.y == py) ) if( STRUCT->m_End == position )
STRUCT->m_Flags &= ~ENDPOINT; STRUCT->m_Flags &= ~ENDPOINT;
break; break;
@ -1524,9 +1524,7 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#define STRUCT ( (DrawJunctionStruct*) Struct ) #define STRUCT ( (DrawJunctionStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Deja en liste */
if( STRUCT->m_Pos.x != px ) if( STRUCT->m_Pos != position )
break;
if( STRUCT->m_Pos.y != py )
break; break;
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1539,7 +1537,7 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#define STRUCT ( (EDA_DrawLineStruct*) Struct ) #define STRUCT ( (EDA_DrawLineStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Deja en liste */
if( (STRUCT->m_Start.x == px ) && ( STRUCT->m_Start.y == py ) ) if( STRUCT->m_Start == position )
{ {
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1548,7 +1546,7 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
Struct->m_Flags = SELECTED | ENDPOINT | STARTPOINT; Struct->m_Flags = SELECTED | ENDPOINT | STARTPOINT;
Struct->m_Flags &= ~STARTPOINT; Struct->m_Flags &= ~STARTPOINT;
} }
else if( (STRUCT->m_End.x == px ) && ( STRUCT->m_End.y == py ) ) else if( STRUCT->m_End == position )
{ {
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1569,10 +1567,8 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawLabelStruct*) Struct ) #define STRUCT ( (DrawLabelStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Already in list */
if( STRUCT->m_Pos.x != px ) if( STRUCT->m_Pos != position )
break;
if( STRUCT->m_Pos.y != py )
break; break;
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1585,10 +1581,8 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawGlobalLabelStruct*) Struct ) #define STRUCT ( (DrawGlobalLabelStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Already in list */
if( STRUCT->m_Pos.x != px ) if( STRUCT->m_Pos != position )
break;
if( STRUCT->m_Pos.y != py )
break; break;
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1613,10 +1607,8 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawMarkerStruct*) Struct ) #define STRUCT ( (DrawMarkerStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Already in list */
if( STRUCT->m_Pos.x != px ) if( STRUCT->m_Pos != position )
break;
if( STRUCT->m_Pos.y != py )
break; break;
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1629,10 +1621,8 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawNoConnectStruct*) Struct ) #define STRUCT ( (DrawNoConnectStruct*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Deja en liste */ break; /* Already in list */
if( STRUCT->m_Pos.x != px ) if( STRUCT->m_Pos != position )
break;
if( STRUCT->m_Pos.y != py )
break; break;
DrawStructs = new DrawPickedStruct( Struct ); DrawStructs = new DrawPickedStruct( Struct );
DrawStructs->Pnext = DrawStructs->Pnext =
@ -1651,14 +1641,14 @@ static void AddPickedItem( SCH_SCREEN* screen, int px, int py )
/*********************************************************************************/ /*********************************************************************************/
static LibEDA_BaseStruct* GetNextPinPosition( EDA_SchComponentStruct* DrawLibItem, static LibEDA_BaseStruct* GetNextPinPosition( EDA_SchComponentStruct* DrawLibItem,
int* px, int* py ) wxPoint & position )
/*********************************************************************************/ /*********************************************************************************/
{ {
EDA_LibComponentStruct* Entry; EDA_LibComponentStruct* Entry;
static LibEDA_BaseStruct* NextItem; static LibEDA_BaseStruct* NextItem;
static int Multi, convert, PartX, PartY, TransMat[2][2]; static int Multi, convert, PartX, PartY, TransMat[2][2];
LibEDA_BaseStruct* DEntry; LibEDA_BaseStruct* DEntry;
int x2, y2, orient; int orient;
LibDrawPin* Pin; LibDrawPin* Pin;
if( DrawLibItem ) if( DrawLibItem )
@ -1693,11 +1683,10 @@ static LibEDA_BaseStruct* GetNextPinPosition( EDA_SchComponentStruct* DrawLibIte
orient = Pin->ReturnPinDrawOrient( TransMat ); orient = Pin->ReturnPinDrawOrient( TransMat );
/* Calcul de la position du point de reference */ /* Calcul de la position du point de reference */
x2 = PartX + (TransMat[0][0] * Pin->m_Pos.x) position.x = 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) position.y = PartY + (TransMat[1][0] * Pin->m_Pos.x)
+ (TransMat[1][1] * Pin->m_Pos.y); + (TransMat[1][1] * Pin->m_Pos.y);
*px = x2; *py = y2;
NextItem = DEntry->Next(); NextItem = DEntry->Next();
return DEntry; return DEntry;
} }

View File

@ -90,12 +90,12 @@ static bool WriteGeneralDescrPcb( BOARD* Pcb, FILE* File )
{ {
int NbLayers; int NbLayers;
/* generation du masque des couches autorisees */ /* Print the copper layer count */
NbLayers = Pcb->m_BoardSettings->m_CopperLayerCount; NbLayers = Pcb->m_BoardSettings->m_CopperLayerCount;
fprintf( File, "$GENERAL\n" ); fprintf( File, "$GENERAL\n" );
fprintf( File, "LayerCount %d\n", NbLayers ); fprintf( File, "LayerCount %d\n", NbLayers );
/* Generation des coord du rectangle d'encadrement */ /* Compute and print the board bounding box */
Pcb->ComputeBoundaryBox(); Pcb->ComputeBoundaryBox();
fprintf( File, "Di %d %d %d %d\n", fprintf( File, "Di %d %d %d %d\n",
Pcb->m_BoundaryBox.GetX(), Pcb->m_BoundaryBox.GetY(), Pcb->m_BoundaryBox.GetX(), Pcb->m_BoundaryBox.GetY(),
@ -112,10 +112,11 @@ static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* File,
int* LayerLookUpTable ) int* LayerLookUpTable )
/*******************************************************************/ /*******************************************************************/
/* Routine de sauvegarde du PCB courant sous format ASCII /* Routine to save the board
* retourne * @param frame = pointer to the main frame
* 1 si OK * @param File = FILE * pointer to an already opened file
* 0 si sauvegarde non faite * @param LayerLookUpTable = look up table: pcbnew layer for each gerber layer
* @return 1 if OK, 0 if fail
*/ */
{ {
char Line[256]; char Line[256];
@ -260,7 +261,7 @@ static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* File,
delete Pcb; delete Pcb;
setlocale( LC_NUMERIC, "" ); // revert to the current locale setlocale( LC_NUMERIC, "" ); // revert to the current locale
wxEndBusyCursor(); wxEndBusyCursor();
return 1; return 1;
} }

View File

@ -157,8 +157,11 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
/****************************************************************/ /****************************************************************/
/* /*
* Change de couche active pour le routage. * if no track in progress :
* Si une piste est en cours de trace : placement d'une Via * swap the active layer between m_Route_Layer_TOP and m_Route_Layer_BOTTOM
* if a track is in progress :
* put (if possible, i.e. if no DRC problem) a Via on the end of the current
* track, swap the current active layer and start a new trac segment on the new layer
*/ */
{ {
TRACK* pt_segm; TRACK* pt_segm;
@ -177,7 +180,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
return; return;
} }
/* Les vias ne doivent pas etre inutilement empilees: */ /* Avoid more than one via on the current location: */
if( Locate_Via( m_Pcb, g_CurrentTrackSegment->m_End, g_CurrentTrackSegment->GetLayer() ) ) if( Locate_Via( m_Pcb, g_CurrentTrackSegment->m_End, g_CurrentTrackSegment->GetLayer() ) )
return; return;
pt_segm = g_FirstTrackSegment; pt_segm = g_FirstTrackSegment;
@ -188,17 +191,20 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
return; return;
} }
/* Test si segment possible a placer */ /* Is the current segment Ok (no DRC error) */
if( Drc_On ) if( Drc_On )
if( Drc( this, DC, g_CurrentTrackSegment, m_Pcb->m_Track, 1 ) == BAD_DRC ) if( Drc( this, DC, g_CurrentTrackSegment, m_Pcb->m_Track, 1 ) == BAD_DRC )
/* DRC error, the change layer is not made */
return; return;
/* save etat actuel pour regeneration si via impossible a placer */ /* Saving current state before placing a via.
If the via canot be placed this current state will be reused */
itmp = g_TrackSegmentCount; itmp = g_TrackSegmentCount;
Begin_Route( g_CurrentTrackSegment, DC ); Begin_Route( g_CurrentTrackSegment, DC );
DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
/* create the via */
Via = new SEGVIA( m_Pcb ); Via = new SEGVIA( m_Pcb );
Via->m_Flags = IS_NEW; Via->m_Flags = IS_NEW;
Via->m_Width = g_DesignSettings.m_CurrentViaSize; Via->m_Width = g_DesignSettings.m_CurrentViaSize;
@ -206,9 +212,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
Via->m_NetCode = g_HightLigth_NetCode; Via->m_NetCode = g_HightLigth_NetCode;
Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End; Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End;
Via->SetLayer( GetScreen()->m_Active_Layer ); int old_layer = GetScreen()->m_Active_Layer );
// Provisoirement. indicate the first layer (?)
//swap the layers. //swap the layers.
if( GetScreen()->m_Active_Layer != GetScreen()->m_Route_Layer_TOP ) if( GetScreen()->m_Active_Layer != GetScreen()->m_Route_Layer_TOP )
@ -216,36 +220,46 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
else else
GetScreen()->m_Active_Layer = GetScreen()->m_Route_Layer_BOTTOM; GetScreen()->m_Active_Layer = GetScreen()->m_Route_Layer_BOTTOM;
/* Adjust the via layer pair */
if( (Via->m_Shape & 15) == VIA_ENTERREE ) if( (Via->m_Shape & 15) == VIA_ENTERREE )
{ {
Via->SetLayer( Via->GetLayer() | GetScreen()->m_Active_Layer << 4 ); Via->SetLayer( old_layer | GetScreen()->m_Active_Layer << 4 );
} }
else if( (Via->m_Shape & 15) == VIA_BORGNE ) //blind via else if( (Via->m_Shape & 15) == VIA_BORGNE ) //blind via
{ // A revoir! ( la via devrait deboucher sur 1 cote ) { // A revoir! ( la via devrait deboucher sur 1 cote )
Via->SetLayer( Via->GetLayer() | GetScreen()->m_Active_Layer << 4 ); Via->SetLayer( old_layer | GetScreen()->m_Active_Layer << 4 );
} }
else else
Via->SetLayer( 0x0F ); Via->SetLayer( 0x0F ); // Usual via is from copper to component; layer pair is 0 and 0x0F
if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) ) if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) )
{ {
/* Via impossible a placer ici */ /* DRC fault: the Via cannot be placed here ... */
delete Via; delete Via;
GetScreen()->m_Active_Layer = g_CurrentTrackSegment->GetLayer(); GetScreen()->m_Active_Layer = old_layer;
DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
return; return;
} }
/* la via est OK et est inseree apres le segment courant */ /* A new via was created. It was Ok.
Put it in linked list, after the g_CurrentTrackSegment */
Via->Pback = g_CurrentTrackSegment; Via->Pback = g_CurrentTrackSegment;
g_CurrentTrackSegment->Pnext = Via; g_CurrentTrackSegment->Pnext = Via;
g_TrackSegmentCount++; g_TrackSegmentCount++;
// @todo: is this a memory leak bug? is g_CurrentTrackSegment's original lost or is it on some list? /* The g_CurrentTrackSegment is now in linked list and we need a new track segment
g_CurrentTrackSegment = g_CurrentTrackSegment->Copy(); after the via, starting at via location.
it will become the new curren segment (from via to the mouse cursor)
*/
g_CurrentTrackSegment = g_CurrentTrackSegment->Copy(); /* create a new segment
from the last entered segment, with the current width, flags, netcode, etc... values
layer, start and end point are not correct, and will be modified next */
g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer ); g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer ); // set the layer to the new value
/* the start point is the via position,
and the end point is the cursor which also is on the via (will change when moving mouse)
*/
g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End = Via->m_Start; g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End = Via->m_Start;
g_TrackSegmentCount++; g_TrackSegmentCount++;

View File

@ -3,11 +3,15 @@ Here are some source code maintenance tasks that need to be done, and maybe some
folks will see these items and volunteer to do them. folks will see these items and volunteer to do them.
*** Look at @todo in editrack-part2.cpp. Is this is a bug?
*** Look at @todo in editrack-part2.cpp. Is this is a bug? ** Done (JP Charras) **
Concerns: Concerns:
a) Isn't there a problem with losing the memory of the original? a) Isn't there a problem with losing the memory of the original?
b) If this is supposed to duplicate a SEGVIA to, then this call should be changed b) If this is supposed to duplicate a SEGVIA to, then this call should be changed
to the new TRACK::Copy(), i.e. g_CurrentTrackSegment->Copy() to the new TRACK::Copy(), i.e. g_CurrentTrackSegment->Copy()
>> (JP Charras:) No problem. the code is correct.
I have put comments to explain this code section and modified some line for a more intelligible code
*** Set up a DOXYGEN environment starting with a configuration file that: *** Set up a DOXYGEN environment starting with a configuration file that: