fixed crashes in eeschema, modedit and 3D display

This commit is contained in:
charras 2009-08-04 18:21:32 +00:00
parent 058bc4fd10
commit 54a541f22c
11 changed files with 126 additions and 90 deletions

View File

@ -491,17 +491,6 @@ void Pcb3D_GLCanvas::OnPaint( wxPaintEvent& event )
/*************************************************/
{
wxPaintDC dc( this );
// Set the OpenGL viewport according to the client size of this canvas.
// This is done here rather than in a wxSizeEvent handler because our
// OpenGL rendering context (and thus viewport setting) is used with
// multiple canvases: If we updated the viewport in the wxSizeEvent
// handler, changing the size of one canvas causes a viewport setting that
// is wrong when next another canvas is repainted.
const wxSize ClientSize = GetClientSize();
glViewport( 0, 0, ClientSize.x, ClientSize.y );
Redraw();
event.Skip();
}
@ -529,6 +518,24 @@ void Pcb3D_GLCanvas::InitGL()
m_init = TRUE;
g_Parm_3D_Visu.m_Zoom = 1.0;
ZBottom = 1.0; ZTop = 10.0;
glDisable( GL_CULL_FACE ); // show back faces
glEnable( GL_DEPTH_TEST ); // Enable z-buferring
glEnable( GL_LINE_SMOOTH );
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
/* speedups */
glEnable( GL_DITHER );
glShadeModel( GL_SMOOTH );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_FASTEST );
/* blend */
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
}
/* set viewing projection */
@ -558,23 +565,6 @@ void Pcb3D_GLCanvas::InitGL()
SetLights();
glDisable( GL_CULL_FACE ); // show back faces
glEnable( GL_DEPTH_TEST ); // Enable z-buferring
glEnable( GL_LINE_SMOOTH );
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
/* speedups */
glEnable( GL_DITHER );
glShadeModel( GL_SMOOTH );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_FASTEST );
/* blend */
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
}

View File

@ -49,6 +49,17 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
#else
SetCurrent( );
#endif
// Set the OpenGL viewport according to the client size of this canvas.
// This is done here rather than in a wxSizeEvent handler because our
// OpenGL rendering context (and thus viewport setting) is used with
// multiple canvases: If we updated the viewport in the wxSizeEvent
// handler, changing the size of one canvas causes a viewport setting that
// is wrong when next another canvas is repainted.
const wxSize ClientSize = GetClientSize();
// *MUST* be called after SetCurrent( ):
glViewport( 0, 0, ClientSize.x, ClientSize.y );
InitGL();
glMatrixMode( GL_MODELVIEW ); /* position viewer */

View File

@ -73,15 +73,11 @@ WinEDA3D_DrawFrame::WinEDA3D_DrawFrame( WinEDA_BasePcbFrame* parent,
ReCreateMenuBar();
ReCreateHToolbar();
// ReCreateAuxiliaryToolbar();
// ReCreateAuxiliaryToolbar();
ReCreateVToolbar();
// Make a Pcb3D_GLCanvas
m_Canvas = new Pcb3D_GLCanvas( this );
/* init OpenGL once */
m_Canvas->InitGL();
}
@ -204,8 +200,8 @@ void WinEDA3D_DrawFrame::Process_Zoom( wxCommandEvent& event )
return;
}
m_Canvas->DisplayStatus();
m_Canvas->Refresh( FALSE );
m_Canvas->DisplayStatus();
}
@ -337,8 +333,8 @@ void WinEDA3D_DrawFrame::Process_Special_Functions( wxCommandEvent& event )
return;
}
m_Canvas->DisplayStatus();
m_Canvas->Refresh( true );
m_Canvas->DisplayStatus();
}
@ -348,9 +344,9 @@ void WinEDA3D_DrawFrame::NewDisplay()
{
m_Canvas->ClearLists();
m_Canvas->CreateDrawGL_List();
m_Canvas->InitGL();
m_Canvas->DisplayStatus();
// m_Canvas->InitGL();
m_Canvas->Refresh( true );
m_Canvas->DisplayStatus();
}

View File

@ -208,12 +208,22 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItem,
* saved in Undo List (for Undo or Redo commands, saved wires will be exchanged with current wire list
*/
{
/* Does not save a null item.
* but if aCommandType == UR_WIRE_IMAGE, we must save null item.
* It happens for the first wire entered in schematic:
* To undo this first command, the previous state is a NULL item,
* and we accept this
*/
if( aItem == NULL && (aCommandType != UR_WIRE_IMAGE) ) // Nothing to save
return;
SCH_ITEM* CopyOfItem;
PICKED_ITEMS_LIST* commandToUndo = new PICKED_ITEMS_LIST();
commandToUndo->m_TransformPoint = aTransformPoint;
ITEM_PICKER itemWrapper( aItem, aCommandType );
itemWrapper.m_PickedItemType = aItem->Type();
if( aItem )
itemWrapper.m_PickedItemType = aItem->Type();
switch( aCommandType )
{
@ -270,6 +280,8 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ )
{
SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetPickedItem( ii );
if( item == NULL )
continue;
UndoRedoOpType command = aItemsList.GetPickedItemStatus( ii );
if( command == UR_UNSPECIFIED )
{
@ -332,8 +344,8 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bo
{
ITEM_PICKER itemWrapper = aList->GetItemWrapper( ii );
item = (SCH_ITEM*) itemWrapper.m_PickedItem;
wxASSERT( item );
item->m_Flags = 0;
if ( item )
item->m_Flags = 0;
SCH_ITEM* image = (SCH_ITEM*) itemWrapper.m_Link;
switch( itemWrapper.m_UndoRedoStatus )
{

View File

@ -313,6 +313,9 @@ void WinEDA_PcbFrame::SaveCopyInUndoList( BOARD_ITEM* aItem,
*
*/
{
if( aItem == NULL ) // Nothing to save
return;
BOARD_ITEM* CopyOfItem;
PICKED_ITEMS_LIST* commandToUndo = new PICKED_ITEMS_LIST();

View File

@ -40,8 +40,9 @@ EDGE_MODULE::~EDGE_MODULE()
/********************************************/
void EDGE_MODULE:: Copy( EDGE_MODULE* source ) // copy structure
void EDGE_MODULE::Copy( EDGE_MODULE* source )
/********************************************/
// copy structure
{
if( source == NULL )
return;

View File

@ -39,12 +39,11 @@ MODULE::MODULE( BOARD* parent ) :
m_LastEdit_Time = time( NULL );
m_Reference = new TEXTE_MODULE( this, TEXT_is_REFERENCE );
// m_Reference->SetBack( this );
m_Value = new TEXTE_MODULE( this, TEXT_is_VALUE );
// m_Value->SetBack( this );
m_3D_Drawings.PushBack( new S3D_MASTER( this ) ); // Reserve one void 3D entry
// Reserve one void 3D entry, to avoid problems with void list
m_3D_Drawings.PushBack( new S3D_MASTER( this ) );
}
@ -139,7 +138,9 @@ void MODULE::Copy( MODULE* aModule )
}
/* Copy auxiliary data: 3D_Drawings info */
m_3D_Drawings.DeleteAll();
m_3D_Drawings.DeleteAll();
// Ensure there is one (or more) item in m_3D_Drawings
m_3D_Drawings.PushBack( new S3D_MASTER( this ) ); // push a void item
for( S3D_MASTER* item = aModule->m_3D_Drawings; item; item = item->Next() )
{
if ( item->m_Shape3DName.IsEmpty() ) // do not copy empty shapes.
@ -861,8 +862,11 @@ void MODULE::DisplayInfo( WinEDA_DrawFrame* frame )
Affiche_1_Parametre( frame, pos, _( "Module" ), m_LibRef, BLUE );
pos += 9;
Affiche_1_Parametre( frame, pos, _( "3D-Shape" ),
m_3D_Drawings->m_Shape3DName, RED );
if( m_3D_Drawings != NULL )
msg = m_3D_Drawings->m_Shape3DName;
else
msg = _("No 3D shape");
Affiche_1_Parametre( frame, pos, _( "3D-Shape" ), msg, RED );
pos += 14;
wxString doc = _( "Doc: " ) + m_Doc;

View File

@ -108,14 +108,17 @@ void WinEDA_ModulePropertiesFrame::CreateControls()
/* creation des autres formes 3D */
Panel3D_Ctrl* panel3D = m_Panel3D, * nextpanel3D;
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
draw3D = (S3D_MASTER*) draw3D->Next();
for( ; draw3D != NULL; draw3D = (S3D_MASTER*) draw3D->Next() )
if( draw3D )
{
nextpanel3D = new Panel3D_Ctrl( this, m_NoteBook, -1, draw3D );
m_NoteBook->AddPage( nextpanel3D, _( "3D settings" ), FALSE );
panel3D->m_Pnext = nextpanel3D;
nextpanel3D->m_Pback = panel3D;
panel3D = nextpanel3D;
draw3D = (S3D_MASTER*) draw3D->Next();
for( ; draw3D != NULL; draw3D = (S3D_MASTER*) draw3D->Next() )
{
nextpanel3D = new Panel3D_Ctrl( this, m_NoteBook, -1, draw3D );
m_NoteBook->AddPage( nextpanel3D, _( "3D settings" ), FALSE );
panel3D->m_Pnext = nextpanel3D;
nextpanel3D->m_Pback = panel3D;
panel3D = nextpanel3D;
}
}
/* Creation des boutons de commande */
@ -596,38 +599,42 @@ void WinEDA_ModulePropertiesFrame::OnOkClick( wxCommandEvent& event )
if( m_Keyword )
m_CurrentModule->m_KeyWord = m_Keyword->GetValue();
/* Mise a jour des parametres 3D */
/* Update 3D shape list */
Panel3D_Ctrl* panel3D = m_Panel3D;
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
S3D_MASTER* nextdraw3D;
for( ; panel3D != NULL; panel3D = panel3D->m_Pnext )
{
draw3D->m_Shape3DName = panel3D->m_3D_ShapeName->GetValue();
wxString name3D = panel3D->m_3D_ShapeName->GetValue();;
if( name3D.IsEmpty() )
continue;
if( draw3D == NULL )
{
draw3D = new S3D_MASTER( draw3D );
m_CurrentModule->m_3D_Drawings.Append( draw3D );
}
draw3D->m_Shape3DName = name3D;
draw3D->m_MatScale = panel3D->m_3D_Scale->GetValue();
draw3D->m_MatRotation = panel3D->m_3D_Rotation->GetValue();
draw3D->m_MatPosition = panel3D->m_3D_Offset->GetValue();
if( ( draw3D->m_Shape3DName.IsEmpty() )
&& (draw3D != m_CurrentModule->m_3D_Drawings) )
continue;
if( (draw3D->Next() == NULL) && panel3D->m_Pnext )
{
nextdraw3D = new S3D_MASTER( draw3D );
// insert after draw3D, therefore pass ->Next() to insert before the next.
m_CurrentModule->m_3D_Drawings.Insert( nextdraw3D, draw3D->Next() );
}
draw3D = (S3D_MASTER*) draw3D->Next();
}
// Remove old extra 3D shapes
S3D_MASTER* nextdraw3D;
for( ; draw3D != NULL; draw3D = nextdraw3D )
{
nextdraw3D = (S3D_MASTER*) draw3D->Next();
delete m_CurrentModule->m_3D_Drawings.Remove( draw3D );
}
// Fill shape list with one void entry, if no entry
if( m_CurrentModule->m_3D_Drawings == NULL )
m_CurrentModule->m_3D_Drawings.PushBack( new S3D_MASTER( m_CurrentModule ) );
m_CurrentModule->Set_Rectangle_Encadrement();
m_Parent->GetScreen()->SetModify();

View File

@ -27,7 +27,6 @@ BOARD_ITEM* WinEDA_ModuleEditFrame::ModeditLocateAndDisplay( int aHotKeyCode )
if( GetBoard()->m_Modules == NULL )
return NULL;
GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide();
// Assign to scanList the proper item types desired based on tool type

View File

@ -113,15 +113,17 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
break;
case ID_MODEDIT_DELETE_ITEM_BUTT:
if( !DrawStruct || (DrawStruct->m_Flags == 0) )
if( DrawStruct && (DrawStruct->m_Flags != 0) ) // Item in edit, cannot delete it
break;
DrawStruct = ModeditLocateAndDisplay();
if( DrawStruct == NULL || (DrawStruct->m_Flags != 0) )
break;
if( DrawStruct->Type() != TYPE_MODULE) //GetBoard()->m_Modules ) // Cannot delete the module itself
{
DrawStruct = ModeditLocateAndDisplay();
if( DrawStruct && (DrawStruct->m_Flags == 0) )
{
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
RemoveStruct( DrawStruct );
SetCurItem( DrawStruct = NULL );
}
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
RemoveStruct( DrawStruct );
DrawStruct = NULL;
SetCurItem( NULL );
}
break;

View File

@ -56,14 +56,14 @@ void WinEDA_ModuleEditFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
UndoRedoOpType aTypeCommand,
const wxPoint& aTransformPoint )
{
// Currently Unused in modedit
// Currently unused in modedit, because the module itself is saved for each change
wxMessageBox( wxT( "SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList..) not yet in use" ) );
}
/*********************************************************/
/********************************************************************************/
void WinEDA_ModuleEditFrame::GetComponentFromRedoList( wxCommandEvent& event )
/*********************************************************/
/********************************************************************************/
/* Redo the last edition:
* - Place the current edited library component in undo list
@ -73,18 +73,24 @@ void WinEDA_ModuleEditFrame::GetComponentFromRedoList( wxCommandEvent& event )
if( GetScreen()->GetRedoCommandCount() <= 0 )
return;
// Save current module state in undo list
PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
ITEM_PICKER wrapper( GetBoard()->m_Modules.PopFront(), UR_MODEDIT );
MODULE * module = GetBoard()->m_Modules.PopFront();
ITEM_PICKER wrapper( module, UR_MODEDIT );
lastcmd->PushItem( wrapper );
GetScreen()->PushCommandToUndoList( lastcmd );
// Retrieve last module state from undo list
lastcmd = GetScreen()->PopCommandFromRedoList();
wrapper = lastcmd->PopItem();
module = (MODULE *)wrapper.m_PickedItem;
delete lastcmd;
GetBoard()->Add( (MODULE*) wrapper.m_PickedItem );
if( module )
GetBoard()->Add( module );
SetCurItem( NULL );
SetCurItem( NULL );;
GetScreen()->SetModify();
ReCreateHToolbar();
SetToolbars();
@ -104,21 +110,26 @@ void WinEDA_ModuleEditFrame::GetComponentFromUndoList( wxCommandEvent& event )
if( GetScreen()->GetUndoCommandCount() <= 0 )
return;
// Save current module state in redo list
PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
ITEM_PICKER wrapper( GetBoard()->m_Modules.PopFront(), UR_MODEDIT );
MODULE * module = GetBoard()->m_Modules.PopFront();
ITEM_PICKER wrapper( module, UR_MODEDIT );
lastcmd->PushItem( wrapper );
GetScreen()->PushCommandToRedoList( lastcmd );
// Retrieve last module state from undo list
lastcmd = GetScreen()->PopCommandFromUndoList();
wrapper = lastcmd->PopItem();
module = (MODULE *)wrapper.m_PickedItem;
delete lastcmd;
if( wrapper.m_PickedItem )
GetBoard()->Add( (MODULE*) wrapper.m_PickedItem, ADD_APPEND );
if( module )
GetBoard()->Add( module, ADD_APPEND );
SetCurItem( NULL );;
GetScreen()->SetModify();
SetCurItem( NULL );;
ReCreateHToolbar();
SetToolbars();
DrawPanel->Refresh();