1594 lines
47 KiB
C++
1594 lines
47 KiB
C++
|
/****************************************************/
|
|||
|
/* BLOCK.CPP */
|
|||
|
/* Gestion des Operations sur Blocks et Effacements */
|
|||
|
/****************************************************/
|
|||
|
|
|||
|
#include "fctsys.h"
|
|||
|
#include "gr_basic.h"
|
|||
|
|
|||
|
#include "common.h"
|
|||
|
#include "program.h"
|
|||
|
#include "libcmp.h"
|
|||
|
#include "general.h"
|
|||
|
|
|||
|
#include "protos.h"
|
|||
|
|
|||
|
/* Variables Locales */
|
|||
|
|
|||
|
/* Fonctions exportees */
|
|||
|
|
|||
|
/* Fonctions Locales */
|
|||
|
static EDA_BaseStruct * CopyStruct(WinEDA_DrawPanel * panel, wxDC * DC, BASE_SCREEN * screen,
|
|||
|
EDA_BaseStruct *DrawStruct);
|
|||
|
static void CollectStructsToDrag(SCH_SCREEN * screen);
|
|||
|
static void AddPickedItem(SCH_SCREEN * screen, int px, int py );
|
|||
|
static LibEDA_BaseStruct * GetNextPinPosition( EDA_SchComponentStruct * DrawLibItem,
|
|||
|
int * px, int * py );
|
|||
|
static void DrawMovingBlockOutlines(WinEDA_DrawPanel * panel, wxDC * DC, bool erase);
|
|||
|
static EDA_BaseStruct * SaveStructListForPaste(EDA_BaseStruct *DrawStruct);
|
|||
|
static bool MirrorStruct(WinEDA_DrawPanel * panel, wxDC * DC, EDA_BaseStruct *DrawStruct, wxPoint & Center);
|
|||
|
static void MirrorOneStruct(EDA_BaseStruct *DrawStruct, wxPoint & Center);
|
|||
|
|
|||
|
/*************************************************************************/
|
|||
|
int WinEDA_SchematicFrame::ReturnBlockCommand(int key)
|
|||
|
/*************************************************************************/
|
|||
|
/* Return the block command (BLOCK_MOVE, BLOCK_COPY...) corresponding to
|
|||
|
the key (ALT, SHIFT ALT ..)
|
|||
|
*/
|
|||
|
{
|
|||
|
int cmd;
|
|||
|
|
|||
|
switch ( key )
|
|||
|
{
|
|||
|
default:
|
|||
|
cmd = key & 0xFF;
|
|||
|
break;
|
|||
|
|
|||
|
case 0:
|
|||
|
cmd = BLOCK_MOVE;
|
|||
|
break;
|
|||
|
|
|||
|
case GR_KB_ALT:
|
|||
|
case GR_KB_SHIFT:
|
|||
|
cmd = BLOCK_COPY;
|
|||
|
break;
|
|||
|
|
|||
|
case GR_KB_CTRL:
|
|||
|
cmd = BLOCK_DRAG;
|
|||
|
break;
|
|||
|
|
|||
|
case GR_KB_SHIFTCTRL:
|
|||
|
cmd = BLOCK_DELETE;
|
|||
|
break;
|
|||
|
|
|||
|
case MOUSE_MIDDLE:
|
|||
|
cmd = BLOCK_ZOOM;
|
|||
|
break;
|
|||
|
}
|
|||
|
return cmd;
|
|||
|
}
|
|||
|
|
|||
|
/*************************************************/
|
|||
|
void WinEDA_SchematicFrame::InitBlockPasteInfos()
|
|||
|
/*************************************************/
|
|||
|
/* Init the parameters used by the block paste command
|
|||
|
*/
|
|||
|
{
|
|||
|
DrawBlockStruct * block = & GetScreen()->BlockLocate;
|
|||
|
|
|||
|
block->m_BlockDrawStruct = g_BlockSaveDataList;
|
|||
|
DrawPanel->ManageCurseur = DrawMovingBlockOutlines;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/******************************************************/
|
|||
|
void WinEDA_SchematicFrame::HandleBlockPlace(wxDC * DC)
|
|||
|
/******************************************************/
|
|||
|
/* Routine to handle the BLOCK PLACE commande
|
|||
|
Last routine for block operation for:
|
|||
|
- block move & drag
|
|||
|
- block copie & paste
|
|||
|
*/
|
|||
|
{
|
|||
|
bool err = FALSE;
|
|||
|
DrawBlockStruct * block = & GetScreen()->BlockLocate;
|
|||
|
EDA_BaseStruct * NewStruct = NULL;
|
|||
|
|
|||
|
if(DrawPanel->ManageCurseur == NULL)
|
|||
|
{
|
|||
|
err = TRUE;
|
|||
|
DisplayError(this, wxT("HandleBlockPLace() : ManageCurseur = NULL") );
|
|||
|
}
|
|||
|
|
|||
|
if(block->m_BlockDrawStruct == NULL)
|
|||
|
{
|
|||
|
wxString msg;
|
|||
|
err = TRUE;
|
|||
|
msg.Printf( wxT("HandleBlockPLace() : m_BlockDrawStruct = NULL (cmd %d, state %d)"),
|
|||
|
block->m_Command, block->m_State);
|
|||
|
DisplayError(this, msg );
|
|||
|
}
|
|||
|
|
|||
|
block->m_State = STATE_BLOCK_STOP;
|
|||
|
|
|||
|
switch(block->m_Command )
|
|||
|
{
|
|||
|
case BLOCK_IDLE:
|
|||
|
err = TRUE;
|
|||
|
break;
|
|||
|
case BLOCK_DRAG: /* Drag */
|
|||
|
case BLOCK_MOVE: /* Move */
|
|||
|
if ( DrawPanel->ManageCurseur )
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
|
|||
|
SaveCopyInUndoList(block->m_BlockDrawStruct, IS_CHANGED);
|
|||
|
|
|||
|
MoveStruct(DrawPanel, DC, block->m_BlockDrawStruct);
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_COPY: /* Copy */
|
|||
|
case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
|
|||
|
if ( DrawPanel->ManageCurseur )
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
|
|||
|
NewStruct = CopyStruct(DrawPanel, DC, GetScreen(), block->m_BlockDrawStruct);
|
|||
|
|
|||
|
SaveCopyInUndoList(NewStruct,
|
|||
|
(block->m_Command == BLOCK_PRESELECT_MOVE) ? IS_CHANGED : IS_NEW);
|
|||
|
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_PASTE: /* Paste (recopie du dernier bloc sauve */
|
|||
|
if ( DrawPanel->ManageCurseur )
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
PasteStruct(DC);
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_ZOOM: // Handled by HandleBlockEnd()
|
|||
|
case BLOCK_DELETE:
|
|||
|
case BLOCK_SAVE:
|
|||
|
case BLOCK_ROTATE:
|
|||
|
case BLOCK_MIRROR_X:
|
|||
|
case BLOCK_MIRROR_Y:
|
|||
|
case BLOCK_INVERT:
|
|||
|
case BLOCK_ABORT:
|
|||
|
case BLOCK_SELECT_ITEMS_ONLY:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
GetScreen()->SetModify();
|
|||
|
|
|||
|
/* clear struct.m_Flags */
|
|||
|
EDA_BaseStruct * Struct;
|
|||
|
for(Struct = GetScreen()->EEDrawList; Struct != NULL; Struct=Struct->Pnext)
|
|||
|
Struct->m_Flags = 0;
|
|||
|
|
|||
|
DrawPanel->ManageCurseur = NULL;
|
|||
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|||
|
block->m_Flags = 0;
|
|||
|
block->m_State = STATE_NO_BLOCK;
|
|||
|
block->m_Command = BLOCK_IDLE;
|
|||
|
GetScreen()->m_CurrentItem = NULL;
|
|||
|
|
|||
|
TestDanglingEnds(GetScreen()->EEDrawList, DC);
|
|||
|
|
|||
|
if ( block->m_BlockDrawStruct )
|
|||
|
{
|
|||
|
DisplayError(this, wxT("HandleBlockPLace() error: DrawStruct != Null") );
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
}
|
|||
|
|
|||
|
SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
|
|||
|
}
|
|||
|
|
|||
|
/****************************************************/
|
|||
|
int WinEDA_SchematicFrame::HandleBlockEnd(wxDC * DC)
|
|||
|
/****************************************************/
|
|||
|
/* Routine de gestion de la commande BLOCK END
|
|||
|
retourne :
|
|||
|
0 si aucun composant selectionne
|
|||
|
1 sinon
|
|||
|
-1 si commande termin<EFBFBD>e et composants trouv<EFBFBD>s (block delete, block save)
|
|||
|
*/
|
|||
|
{
|
|||
|
int ii = 0;
|
|||
|
bool zoom_command = FALSE;
|
|||
|
DrawBlockStruct * block = & GetScreen()->BlockLocate;
|
|||
|
|
|||
|
if ( block->m_BlockDrawStruct )
|
|||
|
{
|
|||
|
BlockState state = block->m_State;
|
|||
|
CmdBlockType command = block->m_Command;
|
|||
|
if ( DrawPanel->ForceCloseManageCurseur )
|
|||
|
DrawPanel->ForceCloseManageCurseur(DrawPanel, DC);
|
|||
|
block->m_State = state;
|
|||
|
block->m_Command = command;
|
|||
|
DrawPanel->ManageCurseur = DrawAndSizingBlockOutlines;
|
|||
|
DrawPanel->ForceCloseManageCurseur = AbortBlockCurrentCommand;
|
|||
|
GetScreen()->m_Curseur.x = block->GetRight();
|
|||
|
GetScreen()->m_Curseur.y = block->GetBottom();
|
|||
|
if ( block->m_Command != BLOCK_ABORT )
|
|||
|
DrawPanel->MouseToCursorSchema();
|
|||
|
}
|
|||
|
|
|||
|
if(DrawPanel->ManageCurseur != NULL)
|
|||
|
switch( block->m_Command )
|
|||
|
{
|
|||
|
case BLOCK_IDLE:
|
|||
|
DisplayError(this, wxT("Error in HandleBlockPLace()") );
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_DRAG: /* Drag */
|
|||
|
BreakSegmentOnJunction(GetScreen() );
|
|||
|
case BLOCK_MOVE: /* Move */
|
|||
|
case BLOCK_COPY: /* Copy */
|
|||
|
block->m_BlockDrawStruct =
|
|||
|
PickStruct(GetScreen()->BlockLocate, GetScreen()->EEDrawList, SEARCHALL);
|
|||
|
case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
ii = 1;
|
|||
|
CollectStructsToDrag(GetScreen());
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
DrawPanel->ManageCurseur = DrawMovingBlockOutlines;
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
block->m_State = STATE_BLOCK_MOVE;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
DrawPanel->ManageCurseur = NULL;
|
|||
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_DELETE: /* Delete */
|
|||
|
block->m_BlockDrawStruct =
|
|||
|
PickStruct(GetScreen()->BlockLocate,
|
|||
|
GetScreen()->EEDrawList, SEARCHALL);
|
|||
|
DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
ii = -1;
|
|||
|
DeleteStruct(DrawPanel, DC, block->m_BlockDrawStruct);
|
|||
|
GetScreen()->SetModify();
|
|||
|
}
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
TestDanglingEnds(GetScreen()->EEDrawList, DC);
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_SAVE: /* Save */
|
|||
|
block->m_BlockDrawStruct =
|
|||
|
PickStruct(GetScreen()->BlockLocate,
|
|||
|
GetScreen()->EEDrawList, SEARCHALL);
|
|||
|
DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
wxPoint oldpos = GetScreen()->m_Curseur;
|
|||
|
GetScreen()->m_Curseur = wxPoint(0,0);
|
|||
|
EDA_BaseStruct *DrawStructCopy =
|
|||
|
SaveStructListForPaste(block->m_BlockDrawStruct);
|
|||
|
PlaceStruct( GetScreen(), DrawStructCopy);
|
|||
|
GetScreen()->m_Curseur = oldpos;
|
|||
|
ii = -1;
|
|||
|
}
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_PASTE:
|
|||
|
block->m_State = STATE_BLOCK_MOVE;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_INVERT: /* pcbnew only! */
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_ROTATE:
|
|||
|
case BLOCK_MIRROR_X:
|
|||
|
case BLOCK_MIRROR_Y:
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_ZOOM: /* Window Zoom */
|
|||
|
zoom_command = TRUE;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_SELECT_ITEMS_ONLY: /* Not used */
|
|||
|
case BLOCK_ABORT: /* not executed here */
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if ( block->m_Command == BLOCK_ABORT )
|
|||
|
{ /* clear struct.m_Flags */
|
|||
|
EDA_BaseStruct * Struct;
|
|||
|
for(Struct = GetScreen()->EEDrawList; Struct != NULL; Struct=Struct->Pnext)
|
|||
|
Struct->m_Flags = 0;
|
|||
|
}
|
|||
|
|
|||
|
if ( ii <= 0 )
|
|||
|
{
|
|||
|
block->m_Flags = 0;
|
|||
|
block->m_State = STATE_NO_BLOCK;
|
|||
|
block->m_Command = BLOCK_IDLE;
|
|||
|
DrawPanel->ManageCurseur = NULL;
|
|||
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|||
|
GetScreen()->m_CurrentItem = NULL;
|
|||
|
SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
|
|||
|
}
|
|||
|
|
|||
|
if ( zoom_command)
|
|||
|
Window_Zoom( GetScreen()->BlockLocate);
|
|||
|
|
|||
|
return(ii);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***********************************************************************/
|
|||
|
void WinEDA_SchematicFrame::HandleBlockEndByPopUp(int Command, wxDC * DC)
|
|||
|
/***********************************************************************/
|
|||
|
/* Routine de gestion de la commande BLOCK END by PopUp
|
|||
|
Appelee apres HandleBlockEnd.
|
|||
|
A partir de la commande bloc move, peut executer une commande autre que bloc move.
|
|||
|
*/
|
|||
|
{
|
|||
|
int ii = 0;
|
|||
|
DrawBlockStruct * block = & GetScreen()->BlockLocate;
|
|||
|
|
|||
|
if( block->m_Command != BLOCK_MOVE ) return;
|
|||
|
if( Command == BLOCK_MOVE ) return;
|
|||
|
|
|||
|
block->m_Command = (CmdBlockType) Command;
|
|||
|
block->SetMessageBlock(this);
|
|||
|
|
|||
|
switch( block->m_Command )
|
|||
|
{
|
|||
|
case BLOCK_COPY: /* move to copy */
|
|||
|
block->m_State = STATE_BLOCK_MOVE;
|
|||
|
ii = 1;
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_DRAG: /* move to Drag */
|
|||
|
/* Effacement de la liste des structures de pointage,
|
|||
|
qui est devenue erronnee */
|
|||
|
if(DrawPanel->ManageCurseur)
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct )
|
|||
|
{
|
|||
|
if(block->m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{ /* Delete the picked wrapper if this is a picked list. */
|
|||
|
DrawPickedStruct * PickedList;
|
|||
|
PickedList = (DrawPickedStruct*)block->m_BlockDrawStruct;
|
|||
|
PickedList->DeleteWrapperList();
|
|||
|
}
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
}
|
|||
|
BreakSegmentOnJunction(GetScreen() );
|
|||
|
block->m_BlockDrawStruct =
|
|||
|
PickStruct(GetScreen()->BlockLocate,
|
|||
|
GetScreen()->EEDrawList, SEARCHALL);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
ii = 1;
|
|||
|
CollectStructsToDrag(GetScreen());
|
|||
|
if(DrawPanel->ManageCurseur)
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
block->m_State = STATE_BLOCK_MOVE;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_DELETE: /* move to Delete */
|
|||
|
if(DrawPanel->ManageCurseur)
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
ii = -1;
|
|||
|
DeleteStruct(DrawPanel, DC, block->m_BlockDrawStruct);
|
|||
|
GetScreen()->SetModify();
|
|||
|
}
|
|||
|
TestDanglingEnds(GetScreen()->EEDrawList, DC);
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_SAVE: /* Save */
|
|||
|
if(DrawPanel->ManageCurseur)
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
wxPoint oldpos = GetScreen()->m_Curseur;
|
|||
|
GetScreen()->m_Curseur = wxPoint(0,0);
|
|||
|
EDA_BaseStruct *DrawStructCopy =
|
|||
|
SaveStructListForPaste(block->m_BlockDrawStruct);
|
|||
|
PlaceStruct( GetScreen(), DrawStructCopy);
|
|||
|
GetScreen()->m_Curseur = oldpos;
|
|||
|
ii = -1;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_ZOOM: /* Window Zoom */
|
|||
|
DrawPanel->ForceCloseManageCurseur(DrawPanel, DC);
|
|||
|
DrawPanel->SetCursor(DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor);
|
|||
|
Window_Zoom( GetScreen()->BlockLocate);
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
case BLOCK_ROTATE:
|
|||
|
break;
|
|||
|
|
|||
|
case BLOCK_MIRROR_X:
|
|||
|
case BLOCK_MIRROR_Y:
|
|||
|
if(DrawPanel->ManageCurseur)
|
|||
|
DrawPanel->ManageCurseur(DrawPanel, DC, FALSE);
|
|||
|
if( block->m_BlockDrawStruct != NULL)
|
|||
|
{
|
|||
|
SaveCopyInUndoList(block->m_BlockDrawStruct, IS_CHANGED);
|
|||
|
|
|||
|
ii = -1;
|
|||
|
/* Compute the mirror centre and put it on grid */
|
|||
|
wxPoint Center = block->Centre();
|
|||
|
PutOnGrid(&Center);
|
|||
|
MirrorStruct(DrawPanel, DC, block->m_BlockDrawStruct, Center);
|
|||
|
GetScreen()->SetModify();
|
|||
|
}
|
|||
|
TestDanglingEnds(GetScreen()->EEDrawList, DC);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if ( ii <= 0 )
|
|||
|
{
|
|||
|
block->m_BlockDrawStruct = NULL;
|
|||
|
block->m_Flags = 0;
|
|||
|
block->m_State = STATE_NO_BLOCK;
|
|||
|
block->m_Command = BLOCK_IDLE;
|
|||
|
DrawPanel->ManageCurseur = NULL;
|
|||
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|||
|
GetScreen()->m_CurrentItem = NULL;
|
|||
|
SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
static void DrawMovingBlockOutlines(WinEDA_DrawPanel * panel, wxDC * DC,
|
|||
|
bool erase )
|
|||
|
/************************************************************************/
|
|||
|
/* Retrace le contour du block de recherche de structures
|
|||
|
L'ensemble du block suit le curseur
|
|||
|
*/
|
|||
|
{
|
|||
|
DrawBlockStruct * PtBlock;
|
|||
|
DrawPickedStruct *PickedList;
|
|||
|
BASE_SCREEN * screen = panel->m_Parent->GetScreen();
|
|||
|
|
|||
|
PtBlock = &panel->GetScreen()->BlockLocate;
|
|||
|
GRSetDrawMode(DC, g_XorMode);
|
|||
|
|
|||
|
/* Effacement ancien cadre */
|
|||
|
if( erase && PtBlock->m_BlockDrawStruct)
|
|||
|
{
|
|||
|
PtBlock->Offset(PtBlock->m_MoveVector);
|
|||
|
PtBlock->Draw(panel, DC);
|
|||
|
PtBlock->Offset( -PtBlock->m_MoveVector.x, -PtBlock->m_MoveVector.y);
|
|||
|
|
|||
|
/* Effacement ancien affichage */
|
|||
|
if(PtBlock->m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
PickedList = (DrawPickedStruct *) PtBlock->m_BlockDrawStruct;
|
|||
|
while (PickedList)
|
|||
|
{
|
|||
|
DrawStructsInGhost(panel, DC, PickedList->m_PickedStruct, PtBlock->m_MoveVector.x, PtBlock->m_MoveVector.y);
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
}
|
|||
|
else DrawStructsInGhost(panel, DC, PtBlock->m_BlockDrawStruct, PtBlock->m_MoveVector.x, PtBlock->m_MoveVector.y);
|
|||
|
}
|
|||
|
|
|||
|
/* Redessin nouvel affichage */
|
|||
|
|
|||
|
PtBlock->m_MoveVector.x = screen->m_Curseur.x - PtBlock->m_BlockLastCursorPosition.x;
|
|||
|
PtBlock->m_MoveVector.y = screen->m_Curseur.y - PtBlock->m_BlockLastCursorPosition.y;
|
|||
|
|
|||
|
GRSetDrawMode(DC, g_XorMode);
|
|||
|
PtBlock->Offset(PtBlock->m_MoveVector);
|
|||
|
PtBlock->Draw(panel, DC);
|
|||
|
PtBlock->Offset( -PtBlock->m_MoveVector.x, -PtBlock->m_MoveVector.y);
|
|||
|
|
|||
|
if(PtBlock->m_BlockDrawStruct )
|
|||
|
{
|
|||
|
if(PtBlock->m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
PickedList = (DrawPickedStruct *) PtBlock->m_BlockDrawStruct;
|
|||
|
while (PickedList)
|
|||
|
{
|
|||
|
DrawStructsInGhost(panel, DC, PickedList->m_PickedStruct, PtBlock->m_MoveVector.x, PtBlock->m_MoveVector.y);
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
}
|
|||
|
else DrawStructsInGhost(panel, DC, PtBlock->m_BlockDrawStruct, PtBlock->m_MoveVector.x, PtBlock->m_MoveVector.y);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************************
|
|||
|
* Routine to move an object(s) to a new position. *
|
|||
|
* If DrawStruct is of type DrawPickedStruct, a list of objects picked is *
|
|||
|
* assumed, otherwise exactly one structure is assumed been picked. *
|
|||
|
*****************************************************************************/
|
|||
|
bool MoveStruct(WinEDA_DrawPanel * panel, wxDC * DC, EDA_BaseStruct *DrawStruct)
|
|||
|
{
|
|||
|
DrawPickedStruct *PickedList = NULL;
|
|||
|
|
|||
|
if ( !DrawStruct ) return FALSE;
|
|||
|
|
|||
|
if(DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
if ( DC )
|
|||
|
RedrawStructList(panel, DC, DrawStruct, g_XorMode);
|
|||
|
PlaceStruct(panel->GetScreen(), DrawStruct); /* Place it in its new position. */
|
|||
|
if ( DC )
|
|||
|
RedrawStructList(panel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
|
|||
|
/* Free the wrapper DrawPickedStruct chain: */
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
PickedList->DeleteWrapperList();
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
if ( DC )
|
|||
|
RedrawOneStruct(panel, DC, DrawStruct, g_XorMode);
|
|||
|
PlaceStruct(panel->GetScreen(), DrawStruct); /* Place it in its new position. */
|
|||
|
if ( DC )
|
|||
|
RedrawOneStruct(panel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static void MirrorYPoint(wxPoint & point, wxPoint & Center)
|
|||
|
{
|
|||
|
point.x -= Center.x;
|
|||
|
point.x = - point.x;
|
|||
|
point.x += Center.x;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************/
|
|||
|
void MirrorOneStruct(EDA_BaseStruct *DrawStruct, wxPoint & Center)
|
|||
|
/**************************************************************/
|
|||
|
/* Given a structure rotate it to 90 degrees refer to the Center point.
|
|||
|
*/
|
|||
|
{
|
|||
|
int dx, ii, *Points;
|
|||
|
DrawPolylineStruct *DrawPoly;
|
|||
|
DrawJunctionStruct *DrawConnect;
|
|||
|
EDA_DrawLineStruct *DrawSegment;
|
|||
|
DrawBusEntryStruct *DrawRaccord;
|
|||
|
EDA_SchComponentStruct *DrawLibItem;
|
|||
|
DrawSheetStruct *DrawSheet;
|
|||
|
DrawSheetLabelStruct *DrawSheetLabel;
|
|||
|
DrawMarkerStruct * DrawMarker;
|
|||
|
DrawNoConnectStruct * DrawNoConnect;
|
|||
|
DrawTextStruct * DrawText;
|
|||
|
wxPoint px;
|
|||
|
|
|||
|
if ( !DrawStruct ) return;
|
|||
|
|
|||
|
switch (DrawStruct->m_StructType)
|
|||
|
{
|
|||
|
case TYPE_NOT_INIT:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
DrawPoly = (DrawPolylineStruct *) DrawStruct;
|
|||
|
Points = DrawPoly->m_Points;
|
|||
|
for (ii = 0; ii < DrawPoly->m_NumOfPoints; ii++)
|
|||
|
{
|
|||
|
wxPoint point;
|
|||
|
point.x = Points[ii * 2]; point.y = Points[ii * 2 + 1];
|
|||
|
MirrorYPoint(point, Center);
|
|||
|
Points[ii * 2] = point.x; Points[ii * 2 + 1] = point.y;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
DrawSegment = (EDA_DrawLineStruct *) DrawStruct;
|
|||
|
if( (DrawSegment->m_Flags & STARTPOINT) == 0 )
|
|||
|
{
|
|||
|
MirrorYPoint(DrawSegment->m_Start, Center);
|
|||
|
}
|
|||
|
if( (DrawSegment->m_Flags & ENDPOINT) == 0 )
|
|||
|
{
|
|||
|
MirrorYPoint(DrawSegment->m_End, Center);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
DrawRaccord = (DrawBusEntryStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawRaccord->m_Pos, Center);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
DrawConnect = (DrawJunctionStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawConnect->m_Pos, Center);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
DrawMarker = (DrawMarkerStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawMarker->m_Pos, Center);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
DrawNoConnect = (DrawNoConnectStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawNoConnect->m_Pos, Center);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
// Text is not really mirrored; it is moved to a suitable position
|
|||
|
// which is the closest position for a true mirrored text
|
|||
|
// The center position is mirrored and the text is moved for half horizontal len
|
|||
|
DrawText = (DrawTextStruct *) DrawStruct;
|
|||
|
px = DrawText->m_Pos;
|
|||
|
if( DrawText->m_Orient == 0 ) /* horizontal text */
|
|||
|
dx = DrawText->Len_Size() / 2;
|
|||
|
else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/
|
|||
|
dx = - DrawText->Len_Size() / 2;
|
|||
|
else dx = 0;
|
|||
|
px.x += dx;
|
|||
|
MirrorYPoint(px, Center);
|
|||
|
px.x -= dx;
|
|||
|
|
|||
|
EDA_Appl->SchematicFrame->PutOnGrid(&px);
|
|||
|
DrawText->m_Pos.x = px.x;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
// Text is not really mirrored: Orientation is changed
|
|||
|
DrawText = (DrawGlobalLabelStruct *) DrawStruct;
|
|||
|
if( DrawText->m_Orient == 0 ) /* horizontal text */
|
|||
|
DrawText->m_Orient = 2;
|
|||
|
else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/
|
|||
|
DrawText->m_Orient = 0;
|
|||
|
|
|||
|
px = DrawText->m_Pos;
|
|||
|
MirrorYPoint(px, Center);
|
|||
|
EDA_Appl->SchematicFrame->PutOnGrid(&px);
|
|||
|
DrawText->m_Pos.x = px.x;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
DrawLibItem = (EDA_SchComponentStruct *) DrawStruct;
|
|||
|
dx = DrawLibItem->m_Pos.x;
|
|||
|
EDA_Appl->SchematicFrame->CmpRotationMiroir( DrawLibItem,
|
|||
|
NULL, CMP_MIROIR_Y );
|
|||
|
MirrorYPoint(DrawLibItem->m_Pos, Center);
|
|||
|
dx -= DrawLibItem->m_Pos.x;
|
|||
|
for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
|
|||
|
{ /* move the fields to the new position because the component itself has moved */
|
|||
|
DrawLibItem->m_Field[ii].m_Pos.x -= dx;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
DrawSheet = (DrawSheetStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawSheet->m_Pos, Center);
|
|||
|
DrawSheet->m_Pos.x -= DrawSheet->m_Size.x;
|
|||
|
|
|||
|
DrawSheetLabel = DrawSheet->m_Label;
|
|||
|
while( DrawSheetLabel != NULL )
|
|||
|
{
|
|||
|
MirrorYPoint(DrawSheetLabel->m_Pos, Center);
|
|||
|
DrawSheetLabel->m_Edge = DrawSheetLabel->m_Edge ? 0 : 1;
|
|||
|
DrawSheetLabel = (DrawSheetLabelStruct*)DrawSheetLabel->Pnext;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
DrawSheetLabel = (DrawSheetLabelStruct *) DrawStruct;
|
|||
|
MirrorYPoint(DrawSheetLabel->m_Pos, Center);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE : break;
|
|||
|
|
|||
|
default: break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************************
|
|||
|
* Routine to Mirror an object(s). *
|
|||
|
* If DrawStruct is of type DrawPickedStruct, a list of objects picked is *
|
|||
|
* assumed, otherwise exactly one structure is assumed been picked. *
|
|||
|
*****************************************************************************/
|
|||
|
bool MirrorStruct(WinEDA_DrawPanel * panel, wxDC * DC, EDA_BaseStruct *DrawStruct, wxPoint & Center)
|
|||
|
{
|
|||
|
DrawPickedStruct *PickedList = NULL;
|
|||
|
DrawPickedStruct *DrawStructs;
|
|||
|
if ( !DrawStruct ) return FALSE;
|
|||
|
|
|||
|
if(DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
if ( DC )
|
|||
|
RedrawStructList(panel, DC, DrawStruct, g_XorMode);
|
|||
|
DrawStructs = (DrawPickedStruct *) DrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
MirrorOneStruct(DrawStructs->m_PickedStruct, Center);
|
|||
|
DrawStructs->m_PickedStruct->m_Flags = 0;
|
|||
|
DrawStructs = (DrawPickedStruct *)DrawStructs->Pnext;
|
|||
|
}
|
|||
|
if ( DC )
|
|||
|
RedrawStructList(panel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
|
|||
|
/* Free the wrapper DrawPickedStruct chain: */
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
PickedList->DeleteWrapperList();
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
if ( DC )
|
|||
|
RedrawOneStruct(panel, DC, DrawStruct, g_XorMode);
|
|||
|
MirrorOneStruct(DrawStruct, Center); /* Place it in its new position. */
|
|||
|
if ( DC )
|
|||
|
RedrawOneStruct(panel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
DrawStruct->m_Flags = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************************/
|
|||
|
static EDA_BaseStruct * CopyStruct(WinEDA_DrawPanel * panel, wxDC * DC, BASE_SCREEN * screen,
|
|||
|
EDA_BaseStruct *DrawStruct)
|
|||
|
/*****************************************************************************/
|
|||
|
/* Routine to copy a new entity of an object and reposition it.
|
|||
|
If DrawStruct is of type DrawPickedStruct, a list of objects picked is
|
|||
|
assumed, otherwise exactly one structure is assumed been picked.
|
|||
|
Return the new created struct
|
|||
|
*/
|
|||
|
{
|
|||
|
EDA_BaseStruct *NewDrawStruct;
|
|||
|
DrawPickedStruct *PickedList = NULL;
|
|||
|
|
|||
|
if ( !DrawStruct ) return FALSE;
|
|||
|
|
|||
|
NewDrawStruct = DuplicateStruct(DrawStruct);
|
|||
|
if ( NewDrawStruct == NULL ) return NULL;
|
|||
|
|
|||
|
PlaceStruct( screen, NewDrawStruct);
|
|||
|
/* Draw the new structure and chain it in: */
|
|||
|
if (NewDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
PickedList = (DrawPickedStruct *) NewDrawStruct;
|
|||
|
while (PickedList) // Clear annotation for new components
|
|||
|
{
|
|||
|
EDA_BaseStruct * Struct = PickedList->m_PickedStruct;
|
|||
|
switch ( Struct->m_StructType )
|
|||
|
{
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
{
|
|||
|
((EDA_SchComponentStruct*)Struct)->m_TimeStamp = GetTimeStamp();
|
|||
|
((EDA_SchComponentStruct*)Struct)->ClearAnnotation();
|
|||
|
}
|
|||
|
break;
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
{
|
|||
|
DrawSheetStruct * sheet = (DrawSheetStruct*)Struct;
|
|||
|
sheet->m_TimeStamp = GetTimeStamp();
|
|||
|
sheet->m_UndoList = NULL;
|
|||
|
sheet->m_RedoList = NULL;
|
|||
|
sheet->EEDrawList = NULL;
|
|||
|
sheet->m_Son = NULL;
|
|||
|
sheet->m_SheetName.Printf(wxT("%8.8lX"), sheet->m_TimeStamp);
|
|||
|
sheet->m_FileName = sheet->m_SheetName + wxT(".sch");
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
SetStructFather(Struct, screen);
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
RedrawStructList(panel, DC, NewDrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
/* Chain the new items */
|
|||
|
PickedList = (DrawPickedStruct *) NewDrawStruct;
|
|||
|
while (PickedList)
|
|||
|
{
|
|||
|
PickedList->m_PickedStruct->Pnext = screen->EEDrawList;
|
|||
|
screen->EEDrawList = PickedList->m_PickedStruct;
|
|||
|
PickedList = PickedList->Next();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
switch(NewDrawStruct->m_StructType)
|
|||
|
{
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE:
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
default:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
{
|
|||
|
DrawSheetStruct * sheet = (DrawSheetStruct*)NewDrawStruct;
|
|||
|
sheet->m_TimeStamp = GetTimeStamp();
|
|||
|
sheet->m_UndoList = NULL;
|
|||
|
sheet->m_RedoList = NULL;
|
|||
|
sheet->EEDrawList = NULL;
|
|||
|
sheet->m_Son = NULL;
|
|||
|
sheet->m_SheetName.Printf(wxT("%8.8lX"), sheet->m_TimeStamp);
|
|||
|
sheet->m_FileName = sheet->m_SheetName + wxT(".sch");
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
((EDA_SchComponentStruct*)NewDrawStruct)->m_TimeStamp = GetTimeStamp();
|
|||
|
((EDA_SchComponentStruct*)NewDrawStruct)->ClearAnnotation();
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
RedrawOneStruct(panel, DC, NewDrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
|
|||
|
SetStructFather(NewDrawStruct, screen);
|
|||
|
NewDrawStruct->Pnext = screen->EEDrawList;
|
|||
|
screen->EEDrawList = NewDrawStruct;
|
|||
|
}
|
|||
|
|
|||
|
/* Free the original DrawPickedStruct chain: */
|
|||
|
if (DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
PickedList->DeleteWrapperList();
|
|||
|
}
|
|||
|
|
|||
|
return NewDrawStruct;
|
|||
|
}
|
|||
|
|
|||
|
/*********************************************************************************/
|
|||
|
void DeleteStruct(WinEDA_DrawPanel * panel, wxDC * DC, EDA_BaseStruct *DrawStruct)
|
|||
|
/*********************************************************************************/
|
|||
|
/* Routine to delete an object from global drawing object list.
|
|||
|
Object is put in Undo list
|
|||
|
*/
|
|||
|
{
|
|||
|
SCH_SCREEN * screen = (SCH_SCREEN *)panel->GetScreen();
|
|||
|
DrawPickedStruct *PickedList = NULL;
|
|||
|
WinEDA_SchematicFrame * frame = (WinEDA_SchematicFrame *) panel->m_Parent;
|
|||
|
|
|||
|
if ( !DrawStruct ) return;
|
|||
|
|
|||
|
|
|||
|
if (DrawStruct->m_StructType == DRAW_SHEETLABEL_STRUCT_TYPE)
|
|||
|
{ /* Cette stucture est rattachee a une feuille, et n'est pas
|
|||
|
accessible par la liste globale directement */
|
|||
|
frame->SaveCopyInUndoList(((DrawSheetLabelStruct*) DrawStruct)->m_Parent, IS_CHANGED);
|
|||
|
frame->DeleteSheetLabel(DC, (DrawSheetLabelStruct*) DrawStruct);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
/* Unlink all picked structs from current EEDrawList */
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
while (PickedList)
|
|||
|
{
|
|||
|
screen->RemoveFromDrawList(PickedList->m_PickedStruct);
|
|||
|
PickedList->m_PickedStruct->Pnext =
|
|||
|
PickedList->m_PickedStruct->Pback = NULL;
|
|||
|
PickedList->m_PickedStruct->m_Flags = IS_DELETED;
|
|||
|
PickedList = PickedList->Next();
|
|||
|
}
|
|||
|
RedrawStructList(panel, DC, DrawStruct, g_XorMode);
|
|||
|
|
|||
|
/* Removed items are put to the Undo list */
|
|||
|
frame->SaveCopyInUndoList(DrawStruct, IS_DELETED);
|
|||
|
}
|
|||
|
|
|||
|
else /* structure classique */
|
|||
|
{
|
|||
|
screen->RemoveFromDrawList(DrawStruct);
|
|||
|
|
|||
|
RedrawOneStruct(panel, DC, DrawStruct, g_XorMode);
|
|||
|
/* Unlink the structure */
|
|||
|
DrawStruct->Pnext = DrawStruct->Pback = NULL; // Only one struct -> no link
|
|||
|
frame->SaveCopyInUndoList(DrawStruct, IS_DELETED);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*****************************************************************/
|
|||
|
EDA_BaseStruct * SaveStructListForPaste(EDA_BaseStruct *DrawStruct)
|
|||
|
/*****************************************************************/
|
|||
|
|
|||
|
/* Routine to Save an object from global drawing object list.
|
|||
|
This routine is the same as delete but:
|
|||
|
- the original list is NOT removed.
|
|||
|
- List is saved in g_BlockSaveDataList
|
|||
|
*/
|
|||
|
{
|
|||
|
DrawPickedStruct *PickedList;
|
|||
|
EDA_BaseStruct *DrawStructCopy;
|
|||
|
|
|||
|
if ( !DrawStruct ) return NULL;
|
|||
|
|
|||
|
/* Make a copy of the original picked item. */
|
|||
|
DrawStructCopy = DuplicateStruct(DrawStruct);
|
|||
|
|
|||
|
if (DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
/* Delete the picked wrapper if this is a picked list. */
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
PickedList->DeleteWrapperList();
|
|||
|
}
|
|||
|
|
|||
|
/* And delete old list and save the new list: */
|
|||
|
if (g_BlockSaveDataList ) /* Delete last deleted item or item list */
|
|||
|
{
|
|||
|
EDA_BaseStruct * item = g_BlockSaveDataList, * next_item;
|
|||
|
while (item)
|
|||
|
{
|
|||
|
next_item = item->Pnext;
|
|||
|
delete item;
|
|||
|
item = next_item;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
g_BlockSaveDataList = DrawStructCopy;
|
|||
|
DrawStructCopy->m_Parent = NULL;
|
|||
|
|
|||
|
return DrawStructCopy;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************************
|
|||
|
* Routine to paste a structure from the g_BlockSaveDataList stack. *
|
|||
|
* This routine is the same as undelete but original list is NOT removed. *
|
|||
|
*****************************************************************************/
|
|||
|
void WinEDA_SchematicFrame::PasteStruct(wxDC * DC)
|
|||
|
{
|
|||
|
EDA_BaseStruct *DrawStruct;
|
|||
|
DrawPickedStruct *PickedList = NULL;
|
|||
|
|
|||
|
if (g_BlockSaveDataList == NULL)
|
|||
|
{
|
|||
|
DisplayError(this, wxT("No struct to paste") );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DrawStruct = DuplicateStruct(g_BlockSaveDataList);
|
|||
|
|
|||
|
PlaceStruct( GetScreen(), DrawStruct);
|
|||
|
|
|||
|
RedrawStructList(DrawPanel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
|
|||
|
// Clear annotation and init new time stamp for the new components:
|
|||
|
if (DrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
for(PickedList = (DrawPickedStruct *) DrawStruct; PickedList != NULL; ) // Clear annotation for new components
|
|||
|
{
|
|||
|
EDA_BaseStruct * Struct = PickedList->m_PickedStruct;
|
|||
|
if ( Struct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE )
|
|||
|
{
|
|||
|
((EDA_SchComponentStruct*)Struct)->m_TimeStamp = GetTimeStamp();
|
|||
|
((EDA_SchComponentStruct*)Struct)->ClearAnnotation();
|
|||
|
SetStructFather(Struct, GetScreen());
|
|||
|
}
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
RedrawStructList(DrawPanel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
for(PickedList = (DrawPickedStruct *) DrawStruct; PickedList != NULL; )
|
|||
|
{
|
|||
|
EDA_BaseStruct * Struct = PickedList->m_PickedStruct;
|
|||
|
Struct->Pnext = GetScreen()->EEDrawList;
|
|||
|
SetStructFather(Struct, GetScreen());
|
|||
|
GetScreen()->EEDrawList = Struct;
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
/* Save wrapper list in undo stack */
|
|||
|
SaveCopyInUndoList(DrawStruct, IS_NEW);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if ( DrawStruct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE )
|
|||
|
{
|
|||
|
((EDA_SchComponentStruct*)DrawStruct)->m_TimeStamp = GetTimeStamp();
|
|||
|
((EDA_SchComponentStruct*)DrawStruct)->ClearAnnotation();
|
|||
|
}
|
|||
|
SetStructFather(DrawStruct, GetScreen());
|
|||
|
RedrawOneStruct(DrawPanel, DC, DrawStruct, GR_DEFAULT_DRAWMODE);
|
|||
|
DrawStruct->Pnext = GetScreen()->EEDrawList;
|
|||
|
GetScreen()->EEDrawList = DrawStruct;
|
|||
|
SaveCopyInUndoList(DrawStruct, IS_NEW);
|
|||
|
}
|
|||
|
|
|||
|
/* clear .m_Flags member for all items */
|
|||
|
EDA_BaseStruct * Struct;
|
|||
|
for(Struct = GetScreen()->EEDrawList; Struct != NULL; Struct=Struct->Pnext)
|
|||
|
Struct->m_Flags = 0;
|
|||
|
GetScreen()->SetModify();
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************************
|
|||
|
* Routine to place a given object. *
|
|||
|
*****************************************************************************/
|
|||
|
bool PlaceStruct( BASE_SCREEN * screen, EDA_BaseStruct *DrawStruct)
|
|||
|
{
|
|||
|
DrawPickedStruct * DrawStructs;
|
|||
|
wxPoint move_vector;
|
|||
|
|
|||
|
if ( !DrawStruct ) return FALSE;
|
|||
|
|
|||
|
move_vector.x = screen->m_Curseur.x -
|
|||
|
screen->BlockLocate.m_BlockLastCursorPosition.x;
|
|||
|
move_vector.y = screen->m_Curseur.y -
|
|||
|
screen->BlockLocate.m_BlockLastCursorPosition.y;
|
|||
|
|
|||
|
switch (DrawStruct->m_StructType)
|
|||
|
{
|
|||
|
default:
|
|||
|
case TYPE_NOT_INIT:
|
|||
|
return FALSE;
|
|||
|
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
MoveOneStruct(DrawStruct, move_vector);
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE:
|
|||
|
DrawStructs = (DrawPickedStruct *) DrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
MoveOneStruct(DrawStructs->m_PickedStruct, move_vector);
|
|||
|
DrawStructs = (DrawPickedStruct *)DrawStructs->Pnext;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
/**************************************************************************/
|
|||
|
void MoveOneStruct(EDA_BaseStruct *DrawStruct, const wxPoint & move_vector)
|
|||
|
/*************************************************************************/
|
|||
|
/* Given a structure move it by Dx, Dy.
|
|||
|
*/
|
|||
|
{
|
|||
|
int ii, *Points;
|
|||
|
DrawPolylineStruct *DrawPoly;
|
|||
|
DrawJunctionStruct *DrawConnect;
|
|||
|
EDA_DrawLineStruct *DrawSegment;
|
|||
|
DrawBusEntryStruct *DrawRaccord;
|
|||
|
EDA_SchComponentStruct *DrawLibItem;
|
|||
|
DrawSheetStruct *DrawSheet;
|
|||
|
DrawSheetLabelStruct *DrawSheetLabel;
|
|||
|
DrawMarkerStruct * DrawMarker;
|
|||
|
DrawNoConnectStruct * DrawNoConnect;
|
|||
|
|
|||
|
if ( !DrawStruct ) return;
|
|||
|
|
|||
|
switch (DrawStruct->m_StructType)
|
|||
|
{
|
|||
|
case TYPE_NOT_INIT:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
DrawPoly = (DrawPolylineStruct *) DrawStruct;
|
|||
|
Points = DrawPoly->m_Points;
|
|||
|
for (ii = 0; ii < DrawPoly->m_NumOfPoints; ii++)
|
|||
|
{
|
|||
|
Points[ii * 2] += move_vector.x;
|
|||
|
Points[ii * 2 + 1] += move_vector.y;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
DrawSegment = (EDA_DrawLineStruct *) DrawStruct;
|
|||
|
if( (DrawSegment->m_Flags & STARTPOINT) == 0 )
|
|||
|
{
|
|||
|
DrawSegment->m_Start += move_vector;
|
|||
|
}
|
|||
|
if( (DrawSegment->m_Flags & ENDPOINT) == 0 )
|
|||
|
{
|
|||
|
DrawSegment->m_End += move_vector;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
DrawRaccord = (DrawBusEntryStruct *) DrawStruct;
|
|||
|
DrawRaccord->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
DrawConnect = (DrawJunctionStruct *) DrawStruct;
|
|||
|
DrawConnect->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
DrawMarker = (DrawMarkerStruct *) DrawStruct;
|
|||
|
DrawMarker->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
DrawNoConnect = (DrawNoConnectStruct *) DrawStruct;
|
|||
|
DrawNoConnect->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
#define DrawText ((DrawTextStruct *) DrawStruct)
|
|||
|
DrawText->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
#define DrawLabel ((DrawLabelStruct *) DrawStruct)
|
|||
|
DrawLabel->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
#define DrawGlobalLabel ((DrawGlobalLabelStruct *) DrawStruct)
|
|||
|
DrawGlobalLabel->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
DrawLibItem = (EDA_SchComponentStruct *) DrawStruct;
|
|||
|
DrawLibItem->m_Pos += move_vector;
|
|||
|
for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
|
|||
|
{
|
|||
|
DrawLibItem->m_Field[ii].m_Pos += move_vector;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
DrawSheet = (DrawSheetStruct *) DrawStruct;
|
|||
|
DrawSheet->m_Pos += move_vector;
|
|||
|
DrawSheetLabel = DrawSheet->m_Label;
|
|||
|
while( DrawSheetLabel != NULL )
|
|||
|
{
|
|||
|
DrawSheetLabel->m_Pos += move_vector;
|
|||
|
DrawSheetLabel = DrawSheetLabel->Next();
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
DrawSheetLabel = (DrawSheetLabelStruct *) DrawStruct;
|
|||
|
DrawSheetLabel->m_Pos += move_vector;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE : break;
|
|||
|
|
|||
|
default: break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************/
|
|||
|
EDA_BaseStruct * DuplicateStruct(EDA_BaseStruct *DrawStruct)
|
|||
|
/************************************************************/
|
|||
|
/* Routine to create a new copy of given struct.
|
|||
|
The new object is not put in draw list (not linked)
|
|||
|
*/
|
|||
|
{
|
|||
|
EDA_BaseStruct *NewDrawStruct = NULL;
|
|||
|
|
|||
|
if ( DrawStruct == NULL )
|
|||
|
{
|
|||
|
DisplayError(NULL, wxT("DuplicateStruct error: NULL struct") );
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
switch (DrawStruct->m_StructType)
|
|||
|
{
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawPolylineStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((EDA_DrawLineStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawBusEntryStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawJunctionStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawMarkerStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawNoConnectStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawTextStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawLabelStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawGlobalLabelStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((EDA_SchComponentStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
NewDrawStruct = ((DrawSheetStruct*)DrawStruct)->GenCopy();
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE:
|
|||
|
{
|
|||
|
DrawPickedStruct *NewPickedItem, *PickedList = NULL,
|
|||
|
*LastPickedItem = NULL;
|
|||
|
PickedList = (DrawPickedStruct *) DrawStruct;
|
|||
|
while (PickedList)
|
|||
|
{
|
|||
|
NewPickedItem = new DrawPickedStruct();
|
|||
|
if (NewDrawStruct == NULL) NewDrawStruct = NewPickedItem;
|
|||
|
if (LastPickedItem ) LastPickedItem->Pnext = NewPickedItem;
|
|||
|
LastPickedItem = NewPickedItem;
|
|||
|
NewPickedItem->m_PickedStruct =
|
|||
|
DuplicateStruct(PickedList->m_PickedStruct);
|
|||
|
PickedList = (DrawPickedStruct *)PickedList->Pnext;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
case DRAW_PART_TEXT_STRUCT_TYPE:
|
|||
|
case SCREEN_STRUCT_TYPE:
|
|||
|
default:
|
|||
|
{
|
|||
|
wxString msg;
|
|||
|
msg << wxT("DuplicateStruct error: unexpected StructType ") <<
|
|||
|
DrawStruct->m_StructType << wxT(" ") << DrawStruct->ReturnClassName();
|
|||
|
DisplayError(NULL, msg);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
NewDrawStruct->m_Image = DrawStruct;
|
|||
|
return NewDrawStruct;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/****************************************************/
|
|||
|
static void CollectStructsToDrag(SCH_SCREEN * screen)
|
|||
|
/****************************************************/
|
|||
|
{
|
|||
|
DrawPickedStruct * DrawStructs, *FirstPicked;
|
|||
|
EDA_BaseStruct * Struct;
|
|||
|
EDA_DrawLineStruct* SegmStruct;
|
|||
|
int ox, oy, fx, fy;
|
|||
|
|
|||
|
/* Set membre .m_Flags des segments */
|
|||
|
for(Struct = screen->EEDrawList; Struct != NULL; Struct=Struct->Pnext)
|
|||
|
Struct->m_Flags = 0;
|
|||
|
|
|||
|
if(screen->BlockLocate.m_BlockDrawStruct->m_StructType == DRAW_SEGMENT_STRUCT_TYPE )
|
|||
|
screen->BlockLocate.m_BlockDrawStruct->m_Flags = SELECTED;
|
|||
|
|
|||
|
else if (screen->BlockLocate.m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE )
|
|||
|
{
|
|||
|
DrawStructs = (DrawPickedStruct *) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
Struct = DrawStructs->m_PickedStruct;
|
|||
|
DrawStructs = (DrawPickedStruct *)DrawStructs->Pnext;
|
|||
|
Struct->m_Flags = SELECTED;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( screen->BlockLocate.m_Command != BLOCK_DRAG ) return;
|
|||
|
|
|||
|
ox = screen->BlockLocate.GetX();
|
|||
|
oy = screen->BlockLocate.GetY();
|
|||
|
fx = screen->BlockLocate.GetRight();
|
|||
|
fy = screen->BlockLocate.GetBottom();
|
|||
|
|
|||
|
if (fx < ox) EXCHG(fx, ox);
|
|||
|
if (fy < oy) EXCHG(fy, oy);
|
|||
|
|
|||
|
/* Pour Drag Block: remise sous forme de liste de structure, s'il n'y
|
|||
|
a qu'un seul element ( pour homogeneiser les traitements ulterieurs */
|
|||
|
if(screen->BlockLocate.m_BlockDrawStruct->m_StructType != DRAW_PICK_ITEM_STRUCT_TYPE )
|
|||
|
{
|
|||
|
DrawStructs = new DrawPickedStruct(screen->BlockLocate.m_BlockDrawStruct);
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = DrawStructs;
|
|||
|
}
|
|||
|
|
|||
|
/* Suppression du deplacement des extremites de segments hors cadre
|
|||
|
de selection */
|
|||
|
DrawStructs = (DrawPickedStruct *) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
Struct = DrawStructs->m_PickedStruct;
|
|||
|
DrawStructs = (DrawPickedStruct *)DrawStructs->Pnext;
|
|||
|
if( Struct->m_StructType == DRAW_SEGMENT_STRUCT_TYPE)
|
|||
|
{
|
|||
|
SegmStruct = (EDA_DrawLineStruct*)Struct;
|
|||
|
if( (SegmStruct->m_Start.x < ox) || (SegmStruct->m_Start.x > fx) ||
|
|||
|
(SegmStruct->m_Start.y < oy) || (SegmStruct->m_Start.y > fy) )
|
|||
|
SegmStruct->m_Flags |= STARTPOINT;
|
|||
|
|
|||
|
if( (SegmStruct->m_End.x < ox) || (SegmStruct->m_End.x > fx) ||
|
|||
|
(SegmStruct->m_End.y < oy) || (SegmStruct->m_End.y > fy) )
|
|||
|
SegmStruct->m_Flags |= ENDPOINT;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Recherche des elements complementaires a "dragger", c'est a dire les
|
|||
|
fils et connexions hors bloc relies a des pins ou entries elles meme
|
|||
|
draggees */
|
|||
|
|
|||
|
FirstPicked = DrawStructs = (DrawPickedStruct*)screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
Struct = DrawStructs->m_PickedStruct;
|
|||
|
DrawStructs = (DrawPickedStruct * )DrawStructs->Pnext;
|
|||
|
if( Struct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE)
|
|||
|
{
|
|||
|
LibEDA_BaseStruct *DrawItem;
|
|||
|
int x, y;
|
|||
|
DrawItem = GetNextPinPosition( (EDA_SchComponentStruct*)Struct, &x, &y);
|
|||
|
while ( DrawItem )
|
|||
|
{
|
|||
|
if( (x < ox) || (x > fx) || (y < oy) || (y > fy) )
|
|||
|
AddPickedItem(screen, x, y);
|
|||
|
|
|||
|
DrawItem = GetNextPinPosition( NULL, &x, &y);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( Struct->m_StructType == DRAW_SHEET_STRUCT_TYPE)
|
|||
|
{
|
|||
|
DrawSheetLabelStruct * SLabel = ((DrawSheetStruct*)Struct)->m_Label;
|
|||
|
while(SLabel)
|
|||
|
{
|
|||
|
if( SLabel->m_StructType == DRAW_SHEETLABEL_STRUCT_TYPE )
|
|||
|
AddPickedItem(screen, SLabel->m_Pos.x, SLabel->m_Pos.y);
|
|||
|
SLabel = (DrawSheetLabelStruct*)SLabel->Pnext;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( Struct->m_StructType == DRAW_BUSENTRY_STRUCT_TYPE)
|
|||
|
{
|
|||
|
DrawBusEntryStruct * item = (DrawBusEntryStruct*)Struct;
|
|||
|
AddPickedItem(screen, item->m_Pos.x, item->m_Pos.y);
|
|||
|
AddPickedItem(screen, item->m_End().x, item->m_End().y);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/******************************************************************/
|
|||
|
static void AddPickedItem( SCH_SCREEN * screen, int px, int py )
|
|||
|
/******************************************************************/
|
|||
|
{
|
|||
|
DrawPickedStruct * DrawStructs;
|
|||
|
EDA_BaseStruct * Struct;
|
|||
|
|
|||
|
/* Examen de la liste des elements deja selectionnes */
|
|||
|
DrawStructs = (DrawPickedStruct *) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
while (DrawStructs)
|
|||
|
{
|
|||
|
Struct = DrawStructs->m_PickedStruct;
|
|||
|
DrawStructs = (DrawPickedStruct *)DrawStructs->Pnext;
|
|||
|
switch( Struct->m_StructType )
|
|||
|
{
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((EDA_DrawLineStruct*)Struct)
|
|||
|
if( (STRUCT->m_Start.x == px) && (STRUCT->m_Start.y == py) )
|
|||
|
STRUCT->m_Flags &= ~STARTPOINT;
|
|||
|
|
|||
|
if( (STRUCT->m_End.x == px) && (STRUCT->m_End.y == py) )
|
|||
|
STRUCT->m_Flags &= ~ENDPOINT;
|
|||
|
break;
|
|||
|
default: break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Examen de la liste des elements non selectionnes */
|
|||
|
|
|||
|
Struct = screen->EEDrawList;
|
|||
|
while ( Struct )
|
|||
|
{
|
|||
|
switch (Struct->m_StructType)
|
|||
|
{
|
|||
|
case TYPE_NOT_INIT:
|
|||
|
break;
|
|||
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((DrawJunctionStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( STRUCT->m_Pos.x != px ) break;
|
|||
|
if( STRUCT->m_Pos.y != py ) break;
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((EDA_DrawLineStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( (STRUCT->m_Start.x == px ) && ( STRUCT->m_Start.y == py ) )
|
|||
|
{
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*)DrawStructs;
|
|||
|
Struct->m_Flags = SELECTED | ENDPOINT | STARTPOINT;
|
|||
|
Struct->m_Flags &= ~STARTPOINT;
|
|||
|
}
|
|||
|
else if( (STRUCT->m_End.x == px ) && ( STRUCT->m_End.y == py ) )
|
|||
|
{
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
Struct->m_Flags = SELECTED | ENDPOINT | STARTPOINT;
|
|||
|
Struct->m_Flags &= ~ENDPOINT;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_TEXT_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_LABEL_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((DrawLabelStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( STRUCT->m_Pos.x != px ) break;
|
|||
|
if( STRUCT->m_Pos.y != py ) break;
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
Struct->m_Flags |= SELECTED;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((DrawGlobalLabelStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( STRUCT->m_Pos.x != px ) break;
|
|||
|
if( STRUCT->m_Pos.y != py ) break;
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
Struct->m_Flags |= SELECTED;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_LIB_ITEM_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEET_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_SHEETLABEL_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_PICK_ITEM_STRUCT_TYPE:
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_MARKER_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((DrawMarkerStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( STRUCT->m_Pos.x != px ) break;
|
|||
|
if( STRUCT->m_Pos.y != py ) break;
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
Struct->m_Flags |= SELECTED;
|
|||
|
break;
|
|||
|
|
|||
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|||
|
#undef STRUCT
|
|||
|
#define STRUCT ((DrawNoConnectStruct*)Struct)
|
|||
|
if( Struct->m_Flags & SELECTED ) break; /* Deja en liste */
|
|||
|
if( STRUCT->m_Pos.x != px ) break;
|
|||
|
if( STRUCT->m_Pos.y != py ) break;
|
|||
|
DrawStructs = new DrawPickedStruct(Struct);
|
|||
|
DrawStructs->Pnext =
|
|||
|
(DrawPickedStruct*) screen->BlockLocate.m_BlockDrawStruct;
|
|||
|
screen->BlockLocate.m_BlockDrawStruct = (EDA_BaseStruct*) DrawStructs;
|
|||
|
Struct->m_Flags |= SELECTED;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
Struct = Struct->Pnext;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*********************************************************************************/
|
|||
|
static LibEDA_BaseStruct * GetNextPinPosition( EDA_SchComponentStruct * DrawLibItem,
|
|||
|
int * px, int * py )
|
|||
|
/*********************************************************************************/
|
|||
|
{
|
|||
|
EDA_LibComponentStruct *Entry;
|
|||
|
static LibEDA_BaseStruct *NextItem;
|
|||
|
static int Multi, convert, PartX, PartY, TransMat[2][2];
|
|||
|
LibEDA_BaseStruct *DEntry;
|
|||
|
int x2, y2, orient;
|
|||
|
LibDrawPin * Pin;
|
|||
|
|
|||
|
if( DrawLibItem )
|
|||
|
{
|
|||
|
NextItem = NULL;
|
|||
|
if((Entry = FindLibPart(DrawLibItem->m_ChipName.GetData(),wxEmptyString,FIND_ROOT)) == NULL)
|
|||
|
return(NULL);
|
|||
|
DEntry = Entry->m_Drawings;
|
|||
|
Multi = DrawLibItem->m_Multi;
|
|||
|
convert = DrawLibItem->m_Convert;
|
|||
|
PartX = DrawLibItem->m_Pos.x;
|
|||
|
PartY = DrawLibItem->m_Pos.y;
|
|||
|
memcpy(TransMat, DrawLibItem->m_Transform, sizeof(TransMat) );
|
|||
|
}
|
|||
|
else DEntry = NextItem;
|
|||
|
|
|||
|
for( ; DEntry != NULL; DEntry = DEntry->Next())
|
|||
|
{
|
|||
|
/* Elimination des elements non relatifs a l'unite */
|
|||
|
if( Multi && DEntry->m_Unit && (DEntry->m_Unit != Multi) ) continue;
|
|||
|
if( convert && DEntry->m_Convert && (DEntry->m_Convert != convert) )
|
|||
|
continue;
|
|||
|
if( DEntry->m_StructType != COMPONENT_PIN_DRAW_TYPE ) continue;
|
|||
|
|
|||
|
Pin = (LibDrawPin * ) DEntry;
|
|||
|
|
|||
|
/* Calcul de l'orientation reelle de la Pin */
|
|||
|
orient = Pin->ReturnPinDrawOrient(TransMat);
|
|||
|
|
|||
|
/* Calcul de la position du point de reference */
|
|||
|
x2 = PartX + (TransMat[0][0] * Pin->m_Pos.x)
|
|||
|
+ (TransMat[0][1] * Pin->m_Pos.y);
|
|||
|
y2 = PartY + (TransMat[1][0] * Pin->m_Pos.x)
|
|||
|
+ (TransMat[1][1] * Pin->m_Pos.y);
|
|||
|
*px = x2; *py = y2;
|
|||
|
NextItem = DEntry->Next();
|
|||
|
return(DEntry);
|
|||
|
}
|
|||
|
|
|||
|
NextItem = NULL;
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
|