Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
eec9f1f4
Commit
eec9f1f4
authored
Nov 02, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed track delete bug
parent
959919dd
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
286 additions
and
191 deletions
+286
-191
change_log.txt
change_log.txt
+28
-12
class_track.cpp
pcbnew/class_track.cpp
+2
-0
class_track.h
pcbnew/class_track.h
+9
-6
deltrack.cpp
pcbnew/deltrack.cpp
+10
-2
drag.h
pcbnew/drag.h
+33
-29
dragsegm.cpp
pcbnew/dragsegm.cpp
+177
-136
hotkeys.cpp
pcbnew/hotkeys.cpp
+27
-6
No files found.
change_log.txt
View file @
eec9f1f4
...
...
@@ -4,14 +4,30 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2007-Nov-032 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
2007-Nov-2 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew
fixed a crashing bug which happened if you "dragged" a module with
tracks. Then deleted one of the pad connected tracks, then deleted the
next track attached to the first one. Memory was being corrupted because
PcbGeneralLocate() and display was not being called on the 2nd track to
be deleted because the m_Flags test:
bool ItemFree = (GetCurItem()==0 || GetCurItem()->m_Flags==0);
was returning false. Solution was to SetCurItem(NULL) after deleting a
TRACK. This makes sense, SetCurItem() is used for designating a "selected"
item, and a deleted TRACK is not even in the BOARD anymore and should not
be selected or selectable. I think this bug may have been causing spurious
crashes for the last couple of months.
2007-Nov-02 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+all:
solved: eeschema, pcbnew and cvpcb did not find libraries when they were
in the default library path, but in a subdirectory
(this is because the default path was not added to the name if the name had
already a path)
solved: eeschema, pcbnew and cvpcb did not find libraries when they were
in the default library path, but in a subdirectory
(this is because the default path was not added to the name if the name had
already a path)
2007-Nov-02 UPDATE Geoff Harland <gharlandau@yahoo.com.au>
...
...
@@ -49,11 +65,11 @@ email address.
2007-Oct-31 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+kicad:
rename mdiframe.cpp to mainframe.cpp
create commandframe.cpp to handle the command frame (which have the 4 "fast launch" buttons)
rename mdiframe.cpp to mainframe.cpp
create commandframe.cpp to handle the command frame (which have the 4 "fast launch" buttons)
2007-Oct-31 UPDATE Dick Hollenbeck <dick
elbeck@yahoo
.com>
2007-Oct-31 UPDATE Dick Hollenbeck <dick
@softplc
.com>
================================================================================
+ all
* Added Doxygen configuration file, whose standard name is Doxyfile. Output
...
...
@@ -1124,7 +1140,7 @@ email address.
better hotkey.cpp (code cleaning and info messages)
2007-June-19 UPDATE Dick Hollenbeck <dick
elbeck@yahoo
.com>
2007-June-19 UPDATE Dick Hollenbeck <dick
@softplc
.com>
================================================================================
+ pcbnew
After locking a module with 'L', update the status window with the locked
...
...
@@ -1140,7 +1156,7 @@ email address.
add install targets for resources and docs
2007-June-15 UPDATE Dick Hollenbeck <dick
elbeck@yahoo
.com>
2007-June-15 UPDATE Dick Hollenbeck <dick
@softplc
.com>
================================================================================
+ pcbnew
** only modules on the present layer are subject to individual module
...
...
@@ -1194,7 +1210,7 @@ email address.
line e.g. "make -f makefile.gtk KICAD_STATIC_LINK=0"
2007-June-11 UPDATE Dick Hollenbeck <dick
elbeck@yahoo
.com>
2007-June-11 UPDATE Dick Hollenbeck <dick
@softplc
.com>
================================================================================
+ Started this change log file.
...
...
pcbnew/class_track.cpp
View file @
eec9f1f4
...
...
@@ -447,6 +447,7 @@ TRACK* TRACK::GetBestInsertPoint( BOARD* Pcb )
/* Traitement du debut de liste */
if
(
track
==
NULL
)
return
NULL
;
/* No tracks ! */
if
(
GetNet
()
<
track
->
GetNet
()
)
/* no net code or net code = 0 (track not connected) */
return
NULL
;
...
...
@@ -454,6 +455,7 @@ TRACK* TRACK::GetBestInsertPoint( BOARD* Pcb )
{
if
(
NextTrack
->
GetNet
()
>
this
->
GetNet
()
)
break
;
track
=
NextTrack
;
}
...
...
pcbnew/class_track.h
View file @
eec9f1f4
...
...
@@ -68,25 +68,28 @@ public:
*/
bool
Save
(
FILE
*
aFile
)
const
;
/**
* Function Insert
* inserts a TRACK, SEGVIA or SEGZONE into its proper list, either at the
* inserts a single TRACK, SEGVIA or SEGZONE, or a list of such,
* into the proper list within a BOARD, either at the
* list's front or immediately after the InsertPoint.
* If Insertpoint == NULL, then insert at the beginning of the proper list.
* If InsertPoint != NULL, then insert immediately after InsertPoint.
* TRACKs and SEGVIAs are put on the m_Track list, SEGZONE on the m_Zone list.
* @param aPcb The BOARD to insert into.
* @param InsertPoint See above
*/
void
Insert
(
BOARD
*
Pcb
,
BOARD_ITEM
*
InsertPoint
);
void
Insert
(
BOARD
*
a
Pcb
,
BOARD_ITEM
*
InsertPoint
);
/**
* Function GetBestInsertPoint
* searches the "best" insertion point within the track linked list.
* The best point is the of the corresponding net code section.
* The best point is the begging of the corresponding net code section.
* (The BOARD::m_Track and BOARD::m_Zone lists are sorted by netcode.)
* @param aPcb The BOARD to search for the insertion point.
* @return TRACK* - the item found in the linked list (or NULL if no track)
*/
TRACK
*
GetBestInsertPoint
(
BOARD
*
Pcb
);
TRACK
*
GetBestInsertPoint
(
BOARD
*
a
Pcb
);
/* Search (within the track linked list) the first segment matching the netcode
* ( the linked list is always sorted by net codes )
...
...
pcbnew/deltrack.cpp
View file @
eec9f1f4
...
...
@@ -31,6 +31,14 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track )
if
(
Track
==
NULL
)
return
NULL
;
if
(
Track
->
GetState
(
DELETED
)
)
{
#if defined(DEBUG)
printf
(
"WinEDA_PcbFrame::Delete_Segment(): bug deleted already deleted TRACK
\n
"
);
#endif
return
NULL
;
}
if
(
Track
->
m_Flags
&
IS_NEW
)
// Trace en cours, on peut effacer le dernier segment
{
...
...
@@ -48,7 +56,8 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track )
g_TrackSegmentCount
--
;
if
(
g_TwoSegmentTrackBuild
)
{
// g_CurrentTrackSegment->Pback must not be a via, or we want delete also the via
{
// g_CurrentTrackSegment->Pback must not be a via, or we want delete also the via
if
(
(
g_TrackSegmentCount
>=
2
)
&&
(
g_CurrentTrackSegment
->
Type
()
!=
TYPEVIA
)
&&
(
g_CurrentTrackSegment
->
Pback
->
Type
()
==
TYPEVIA
)
)
...
...
@@ -132,7 +141,6 @@ void WinEDA_PcbFrame::Delete_Track( wxDC* DC, TRACK* Track )
Supprime_Une_Piste
(
DC
,
Track
);
GetScreen
()
->
SetModify
();
test_1_net_connexion
(
DC
,
current_net_code
);
m_Pcb
->
Display_Infos
(
this
);
}
}
...
...
pcbnew/drag.h
View file @
eec9f1f4
/***************************************************************/
/* Edition des Modules: Structures et variables de gestion des */
/* fonctions de "DRAG" des segments de piste */
/***************************************************************/
/***************************************************************/
/* Edition des Modules: Structures et variables de gestion des */
/* fonctions de "DRAG" des segments de piste */
/***************************************************************/
/*** Class to handle a list of track segments to drag ***/
class
DRAG_SEGM
{
public
:
DRAG_SEGM
*
Pnext
;
/* Pointeur de chainage */
TRACK
*
m_Segm
;
/* pointeur sur le segment a "dragger */
D_PAD
*
m_Pad_Start
;
/* pointeur sur le Pad origine si origine segment sur pad */
D_PAD
*
m_Pad_End
;
/* pointeur sur le Pad fin si fin segment sur pad */
int
m_Flag
;
/* indicateur divers */
DRAG_SEGM
*
Pnext
;
/* Pointeur de chainage */
TRACK
*
m_Segm
;
/* pointeur sur le segment a "dragger */
D_PAD
*
m_Pad_Start
;
/* pointeur sur le Pad origine si origine segment sur pad */
D_PAD
*
m_Pad_End
;
/* pointeur sur le Pad fin si fin segment sur pad */
int
m_Flag
;
/* indicateur divers */
private
:
wxPoint
m_StartInitialValue
;
wxPoint
m_EndInitialValue
;
/* For abort: initial m_Start and m_End values for m_Segm */
wxPoint
m_StartInitialValue
;
wxPoint
m_EndInitialValue
;
/* For abort: initial m_Start and m_End values for m_Segm */
public
:
DRAG_SEGM
(
TRACK
*
segm
);
~
DRAG_SEGM
();
public
:
void
SetInitialValues
();
DRAG_SEGM
(
TRACK
*
segm
);
~
DRAG_SEGM
();
void
SetInitialValues
();
};
/* Variables */
/* Variables */
eda_global
DRAG_SEGM
*
g_DragSegmentList
;
/* pointe le debut de la liste
des structures DRAG_SEGM */
eda_global
DRAG_SEGM
*
g_DragSegmentList
;
/* pointe le debut de la liste
*
des structures DRAG_SEGM */
/* routines specifiques */
void
Dessine_Segments_Dragges
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
);
void
Build_Drag_Liste
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
MODULE
*
Module
);
void
Build_1_Pad_SegmentsToDrag
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
D_PAD
*
PtPad
);
void
Collect_TrackSegmentsToDrag
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
wxPoint
&
point
,
int
MasqueLayer
,
int
net_code
);
void
EraseDragListe
();
void
AddSegmentToDragList
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
int
flag
,
TRACK
*
Track
);
/* Add the segment"Track" to the drag list, and erase it from screen
flag = STARTPOINT (if the point to drag is the start point of Track) or ENDPOINT */
void
Dessine_Segments_Dragges
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
);
void
Build_Drag_Liste
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
MODULE
*
Module
);
void
Build_1_Pad_SegmentsToDrag
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
D_PAD
*
PtPad
);
void
Collect_TrackSegmentsToDrag
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
wxPoint
&
point
,
int
MasqueLayer
,
int
net_code
);
void
EraseDragListe
();
/* Add the segment"Track" to the drag list, and erase it from screen
* flag = STARTPOINT (if the point to drag is the start point of Track)
* or ENDPOINT
*/
void
AddSegmentToDragList
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
int
flag
,
TRACK
*
Track
);
pcbnew/dragsegm.cpp
View file @
eec9f1f4
This diff is collapsed.
Click to expand it.
pcbnew/hotkeys.cpp
View file @
eec9f1f4
...
...
@@ -313,14 +313,24 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
// don't let backspace delete modules!!
if
(
DrawStruct
&&
(
DrawStruct
->
Type
()
==
TYPETRACK
||
DrawStruct
->
Type
()
==
TYPEVIA
)
)
||
DrawStruct
->
Type
()
==
TYPEVIA
)
)
{
Delete_Segment
(
DC
,
(
TRACK
*
)
DrawStruct
);
SetCurItem
(
NULL
);
// this is an exception to the new rule that only the "selected" item
// gets its Infos displayed, but we cannot "select" a deleted item.
DrawStruct
->
Display_Infos
(
this
);
}
GetScreen
()
->
SetModify
();
}
else
if
(
GetCurItem
()
->
Type
()
==
TYPETRACK
)
{
// then an element is being edited - remove the last segment.
SetCurItem
(
Delete_Segment
(
DC
,
(
TRACK
*
)
GetCurItem
()
)
);
Delete_Segment
(
DC
,
(
TRACK
*
)
GetCurItem
()
);
SetCurItem
(
NULL
);
// this is an exception to the new rule that only the "selected" item
// gets its Infos displayed, but we cannot "select" a deleted item.
DrawStruct
->
Display_Infos
(
this
);
GetScreen
()
->
SetModify
();
}
}
...
...
@@ -385,6 +395,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
return
;
if
(
(
GetCurItem
()
->
m_Flags
&
IS_NEW
)
==
0
)
return
;
Other_Layer_Route
(
(
TRACK
*
)
GetCurItem
(),
DC
);
// place via and switch layer
if
(
DisplayOpt
.
ContrastModeDisplay
)
GetScreen
()
->
SetRefreshReq
();
...
...
@@ -564,25 +575,33 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct )
* Delete the module.
*/
{
bool
ItemFree
=
(
GetCurItem
()
==
NULL
)
||
(
GetCurItem
()
->
m_Flags
==
0
);
bool
ItemFree
=
(
GetCurItem
()
==
NULL
)
||
(
GetCurItem
()
->
m_Flags
==
0
);
switch
(
m_ID_current_state
)
{
case
ID_TRACK_BUTT
:
if
(
GetScreen
()
->
m_Active_Layer
>
LAST_COPPER_LAYER
)
return
FALSE
;
if
(
ItemFree
)
{
DrawStruct
=
PcbGeneralLocateAndDisplay
();
if
(
DrawStruct
&&
DrawStruct
->
Type
()
!=
TYPETRACK
)
return
FALSE
;
Delete_Track
(
DC
,
(
TRACK
*
)
DrawStruct
);
SetCurItem
(
NULL
);
// this is an exception to the rule that only the "selected" item
// gets its Infos displayed, but we cannot "select" a deleted item.
DrawStruct
->
Display_Infos
(
this
);
}
else
if
(
GetCurItem
()
->
Type
()
==
TYPETRACK
)
{
SetCurItem
(
Delete_Segment
(
DC
,
(
TRACK
*
)
GetCurItem
()
)
);
Delete_Segment
(
DC
,
(
TRACK
*
)
GetCurItem
()
);
SetCurItem
(
NULL
);
// this is an exception to the new rule that only the "selected" item
// gets its Infos displayed, but we cannot "select" a deleted item.
DrawStruct
->
Display_Infos
(
this
);
GetScreen
()
->
SetModify
();
return
TRUE
;
}
...
...
@@ -594,8 +613,10 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct )
MODULE
*
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_ON_GRILLE
);
if
(
module
==
NULL
)
return
FALSE
;
if
(
!
IsOK
(
this
,
_
(
"Delete module?"
)
)
)
return
FALSE
;
RemoveStruct
(
module
,
DC
);
}
else
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment