Example #1
0
void WinEDA_SchematicFrame::SetBusEntryShape(wxDC * DC,
				DrawBusEntryStruct *BusEntry, int entry_shape)
/************************************************************/
{
	if ( BusEntry == NULL ) return;

	if ( GetScreen()->m_CurrentItem->m_StructType != DRAW_BUSENTRY_STRUCT_TYPE )
		{
		DisplayError(this, wxT("SetBusEntryType: Bad StructType") );
		return;
		}

	RedrawOneStruct(DrawPanel, DC, BusEntry, XOR_MODE);

	switch( entry_shape )
		{
		case '\\' :
			LastShape = '\\';
			BusEntry->m_Size.y = 100;
			break;

		case '/' :
			LastShape = '/';
			BusEntry->m_Size.y = -100;
			break;
		}

	TestDanglingEnds(GetScreen()->EEDrawList, NULL);
	RedrawOneStruct(DrawPanel, DC, BusEntry, XOR_MODE);
	SetFlagModify(GetScreen());
}
Example #2
0
void WinEDA_SchematicFrame::CmpRotationMiroir(
		EDA_SchComponentStruct * DrawComponent, wxDC * DC, int type_rotate )
/**************************************************************************/
/* Routine permettant les rotations et les miroirs d'un composant
	Si DC = NULL : pas de redessin
*/
{
	if ( DrawComponent == NULL ) return;

	/* Efface le trace precedent */
	if ( DC )
		{
		m_CurrentScreen->Trace_Curseur(DrawPanel, DC);
		if ( DrawComponent->m_Flags )
			DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
		else DrawLibPart(DrawPanel, DC, DrawComponent, XOR_MODE);
		}

	DrawComponent->SetRotationMiroir(type_rotate);

	/* Redessine le composant dans la nouvelle position */
	if ( DC )
		{
		if( DrawComponent->m_Flags )
			DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
		else DrawLibPart(DrawPanel, DC, DrawComponent, GR_DEFAULT_DRAWMODE);
		m_CurrentScreen->Trace_Curseur(DrawPanel, DC);
		}

	TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
	SetFlagModify(GetScreen());
}
Example #3
0
void SCH_EDIT_FRAME::OrientComponent( COMPONENT_ORIENTATION_T aOrientation )
{
    SCH_SCREEN*    screen = GetScreen();
    SCH_ITEM*      item = screen->GetCurItem();
    SCH_COMPONENT* component = (SCH_COMPONENT*) item;

    GetCanvas()->MoveCursorToCrossHair();

    if( item->GetFlags() == 0 )
        SetUndoItem( item );

    component->SetOrientation( aOrientation );

    m_canvas->CrossHairOn( );

    if( item->GetFlags() == 0 )
    {
        addCurrentItemToScreen();
        SchematicCleanUp();
    }

    TestDanglingEnds();

    RefreshItem( item );

    if( item->GetFlags() == 0 )
        OnModify();
}
Example #4
0
void WinEDA_SchematicFrame::ConvertPart(EDA_SchComponentStruct *DrawComponent,
			wxDC * DC)
/************************************************************************/
{
int ii;
EDA_LibComponentStruct *LibEntry;

	if (DrawComponent == NULL) return;

	LibEntry = FindLibPart(DrawComponent->m_ChipName, "", FIND_ROOT);
	if( LibEntry == NULL ) return;

	if( (ii = LookForConvertPart(LibEntry) ) < 2 )
	{
		DisplayError(this, "No Convert found", 10); return;
	}

	/* Efface le trace precedent */
	if ( DrawComponent->m_Flags )
		DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
	else DrawLibPart(DrawPanel, DC, DrawComponent, XOR_MODE);

	DrawComponent->m_Convert++;
	if( DrawComponent->m_Convert > ii ) DrawComponent->m_Convert = 1;

	/* Redessine le composant dans la nouvelle position */
	if( DrawComponent->m_Flags & IS_MOVED)
		DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
	else DrawLibPart(DrawPanel, DC, DrawComponent, GR_DEFAULT_DRAWMODE);

	TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
	SetFlagModify(GetScreen());
}
Example #5
0
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent )
{
    if( !aComponent )
        return;

    LIB_ID id = aComponent->GetLibId();
    LIB_PART* part = GetLibPart( id );

    if( part )
    {
        wxString msg;

        if( !part->HasConversion() )
        {
            msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ),
                        id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
            DisplayError( this,  msg );
            return;
        }

        STATUS_FLAGS savedFlags = aComponent->GetFlags();

        aComponent->SetConvert( aComponent->GetConvert() + 1 );

        // ensure m_Convert = 1 or 2
        // 1 = shape 1 = not converted
        // 2 = shape 2 = first converted shape
        // > 2 is not used but could be used for more shapes
        // like multiple shapes for a programmable component
        // When m_Convert = val max, return to the first shape
        if( aComponent->GetConvert() > LIB_ITEM::LIB_CONVERT::DEMORGAN )
            aComponent->SetConvert( LIB_ITEM::LIB_CONVERT::BASE );

        // The alternate symbol may cause a change in the connection status so test the
        // connections so the connection indicators are drawn correctly.
        aComponent->UpdatePins();
        TestDanglingEnds();
        aComponent->ClearFlags();
        aComponent->SetFlags( savedFlags );   // Restore m_Flags (modified by SetConvert())

        // If selected make sure all the now-included pins are selected
        if( aComponent->IsSelected() )
            m_toolManager->RunAction( EE_ACTIONS::addItemToSel, true, aComponent );

        RefreshItem( aComponent );
        OnModify();
    }
}
bool SCH_SCREEN::SchematicCleanUp()
{
    bool      modified = false;

    for( SCH_ITEM* item = m_drawList.begin() ; item; item = item->Next() )
    {
        if( ( item->Type() != SCH_LINE_T ) && ( item->Type() != SCH_JUNCTION_T ) )
            continue;

        bool restart;

        for( SCH_ITEM* testItem = item->Next(); testItem; testItem = restart ? m_drawList.begin() : testItem->Next() )
        {
            restart = false;

            if( ( item->Type() == SCH_LINE_T ) && ( testItem->Type() == SCH_LINE_T ) )
            {
                SCH_LINE* line = (SCH_LINE*) item;

                if( line->MergeOverlap( (SCH_LINE*) testItem ) )
                {
                    // Keep the current flags, because the deleted segment can be flagged.
                    item->SetFlags( testItem->GetFlags() );
                    DeleteItem( testItem );
                    restart = true;
                    modified = true;
                }
            }
            else if ( ( ( item->Type() == SCH_JUNCTION_T )
                      && ( testItem->Type() == SCH_JUNCTION_T ) ) && ( testItem != item ) )
            {
                if ( testItem->HitTest( item->GetPosition() ) )
                {
                    // Keep the current flags, because the deleted segment can be flagged.
                    item->SetFlags( testItem->GetFlags() );
                    DeleteItem( testItem );
                    restart = true;
                    modified = true;
                }
            }
        }
    }

    TestDanglingEnds();

    return modified;
}
Example #7
0
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent )
{
    if( !aComponent )
        return;

    LIB_ID id = aComponent->GetLibId();
    LIB_PART* part = GetLibPart( id );

    if( part )
    {
        wxString msg;

        if( !part->HasConversion() )
        {
            msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ),
                        id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
            DisplayError( this,  msg );
            return;
        }

        STATUS_FLAGS flags = aComponent->GetFlags();

        aComponent->SetConvert( aComponent->GetConvert() + 1 );

        // ensure m_Convert = 0, 1 or 2
        // 0 and 1 = shape 1 = not converted
        // 2 = shape 2 = first converted shape
        // > 2 is not used but could be used for more shapes
        // like multiple shapes for a programmable component
        // When m_Convert = val max, return to the first shape
        if( aComponent->GetConvert() > 2 )
            aComponent->SetConvert( 1 );

        // The alternate symbol may cause a change in the connection status so test the
        // connections so the connection indicators are drawn correctly.
        aComponent->UpdatePins();
        TestDanglingEnds();
        aComponent->ClearFlags();
        aComponent->SetFlags( flags );   // Restore m_Flag (modified by SetConvert())

        RefreshItem( aComponent );
        OnModify();
    }
}
Example #8
0
void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent )
{
    SCH_SCREEN*    screen = GetScreen();
    SCH_ITEM*      item = screen->GetCurItem();
    SCH_COMPONENT* component = (SCH_COMPONENT*) item;

    GetCanvas()->MoveCursorToCrossHair();

    int unit = aEvent.GetId() + 1 - ID_POPUP_SCH_SELECT_UNIT1;

    LIB_PART* part = GetLibPart( component->GetLibId() );

    if( !part )
        return;

    int unitCount = part->GetUnitCount();

    if( unitCount <= 1 || component->GetUnit() == unit )
        return;

    if( unit > unitCount )
        unit = unitCount;

    STATUS_FLAGS flags = component->GetFlags();

    if( !flags )    // No command in progress: save in undo list
        SaveCopyInUndoList( component, UR_CHANGED );

    /* Update the unit number. */
    component->SetUnitSelection( g_CurrentSheet, unit );
    component->SetUnit( unit );
    component->ClearFlags();
    component->SetFlags( flags );   // Restore m_Flag modified by SetUnit()

    if( m_autoplaceFields )
        component->AutoAutoplaceFields( GetScreen() );

    TestDanglingEnds();

    RefreshItem( component );
    OnModify();
}
Example #9
0
void SCH_EDIT_FRAME::SelectUnit( SCH_COMPONENT* aComponent, int aUnit )
{
    GetCanvas()->MoveCursorToCrossHair();

    LIB_PART* part = GetLibPart( aComponent->GetLibId() );

    if( !part )
        return;

    int unitCount = part->GetUnitCount();

    if( unitCount <= 1 || aComponent->GetUnit() == aUnit )
        return;

    if( aUnit > unitCount )
        aUnit = unitCount;

    STATUS_FLAGS savedFlags = aComponent->GetFlags();

    if( !aComponent->GetEditFlags() )    // No command in progress: save in undo list
        SaveCopyInUndoList( aComponent, UR_CHANGED );

    /* Update the unit number. */
    aComponent->SetUnitSelection( g_CurrentSheet, aUnit );
    aComponent->SetUnit( aUnit );
    aComponent->ClearFlags();
    aComponent->SetFlags( savedFlags ); // Restore m_Flag modified by SetUnit()

    if( !aComponent->GetEditFlags() )   // No command in progress: update schematic
    {
        if( m_autoplaceFields )
            aComponent->AutoAutoplaceFields( GetScreen() );

        TestDanglingEnds();

        RefreshItem( aComponent );
        OnModify();
    }
}
Example #10
0
void WinEDA_SchematicFrame::SelPartUnit(EDA_SchComponentStruct *DrawComponent,
			int unit, wxDC * DC)
/************************************************************************/
/* Selection de l'unite dans les boitiers a multiples Parts */
{
int m_UnitCount;
EDA_LibComponentStruct * LibEntry;

	if (DrawComponent == NULL) return;

	LibEntry = FindLibPart(DrawComponent->m_ChipName, "", FIND_ROOT);
	if( LibEntry == NULL ) return;

	m_UnitCount = LibEntry->m_UnitCount;

	if( m_UnitCount <= 1 ) return;

	if( DrawComponent->m_Multi == unit ) return;
	if ( unit < 1 ) unit = 1;
	if ( unit > m_UnitCount ) unit = m_UnitCount;

	/* Efface le trace precedent */
	if ( DrawComponent->m_Flags )
		DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
	else DrawLibPart(DrawPanel, DC, DrawComponent, XOR_MODE);

	/* Mise a jour du numero d'unite */
	DrawComponent->m_Multi = unit;

	/* Redessine le composant dans la nouvelle position */
	if( DrawComponent->m_Flags )
		DrawStructsInGhost(DrawPanel, DC, DrawComponent, 0, 0 );
	else DrawLibPart(DrawPanel, DC, DrawComponent, GR_DEFAULT_DRAWMODE);

	TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
	SetFlagModify(GetScreen());
}
Example #11
0
void WinEDA_SchematicFrame::EndSegment(wxDC *DC)
{
DrawSegmentStruct * segment = (DrawSegmentStruct *)GetScreen()->m_CurrentItem;

	if ( GetScreen()->ManageCurseur == NULL ) return;
	if ( segment == NULL ) return;
	if ( (segment->m_Flags & IS_NEW) == 0) return;

	if( (segment->m_Start.x == segment->m_End.x) &&
		(segment->m_Start.y == segment->m_End.y) )	/* Structure inutile */
	{
		EraseStruct(segment, (SCH_SCREEN*)GetScreen());
		segment = NULL;
	}

	else
	{		/* Placement en liste generale */
		GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
		segment->Pnext = GetScreen()->EEDrawList;
		g_ItemToRepeat = GetScreen()->EEDrawList = segment;
		segment->m_Flags = 0;
	}

	/* Fin de trace */
	GetScreen()->ManageCurseur = NULL;
	GetScreen()->ForceCloseManageCurseur = NULL;
	GetScreen()->m_CurrentItem = NULL;

	TestDanglingEnds(GetScreen()->EEDrawList, DC);
	SetFlagModify(GetScreen());
	if( segment )
	{
		GetScreen()->Trace_Curseur(DrawPanel, DC);	// Erase schematic cursor
		RedrawOneStruct(DrawPanel,DC, segment, GR_DEFAULT_DRAWMODE);
		GetScreen()->Trace_Curseur(DrawPanel, DC);	// Display schematic cursor
	}
}
void WinEDA_SchematicFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
/**********************************************************************************/
/* Traite les commandes declenchée par le bouton gauche de la souris,
	quand un outil est deja selectionné
*/
{
EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem;

	if ( (m_ID_current_state == 0) || ( DrawStruct && DrawStruct->m_Flags ) )
		{
		DrawPanel->m_AutoPAN_Request = FALSE;
		g_ItemToRepeat = NULL;

		if ( DrawStruct && DrawStruct->m_Flags ) // Commande "POPUP" en cours
		{
			switch (DrawStruct->m_StructType )
			{
				case DRAW_SHEETLABEL_STRUCT_TYPE:
				case DRAW_SHEET_STRUCT_TYPE:
				case DRAW_BUSENTRY_STRUCT_TYPE:
				case DRAW_LABEL_STRUCT_TYPE:
				case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
				case DRAW_TEXT_STRUCT_TYPE:
				case DRAW_JUNCTION_STRUCT_TYPE:
				case DRAW_LIB_ITEM_STRUCT_TYPE:
				case DRAW_PART_TEXT_STRUCT_TYPE:
					DrawStruct->Place( this, DC);
					m_CurrentScreen->m_CurrentItem = NULL;
					TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
					return;

				case SCREEN_STRUCT_TYPE:
				case DRAW_PICK_ITEM_STRUCT_TYPE:
					DisplayError(this,
					"OnLeftClick err: unexpected type for Place");
					DrawStruct->m_Flags = 0;
					break;

				case DRAW_SEGMENT_STRUCT_TYPE:	// Segment peut-etre en cours de trace
					break;

				default:
					DisplayError(this,
					"WinEDA_SchematicFrame::OnLeftClick err: m_Flags != 0");
					DrawStruct->m_Flags = 0;
					break;
			}
		}
		else
		{
			DrawStruct = SchematicGeneralLocateAndDisplay();
		}
	}

	switch ( m_ID_current_state )
	{
		case 0:
			break;

		case ID_NO_SELECT_BUTT:
			break;

		case ID_HIERARCHY_PUSH_POP_BUTT:
			if ( DrawStruct && DrawStruct->m_Flags ) break;
			DrawStruct = SchematicGeneralLocateAndDisplay();
			if ( DrawStruct && (DrawStruct->m_StructType == DRAW_SHEET_STRUCT_TYPE) )
				{
				InstallNextScreen((DrawSheetStruct *) DrawStruct);
				}
			else InstallPreviousScreen();
			break;

		case ID_NOCONN_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
						g_ItemToRepeat = CreateNewNoConnectStruct(DC);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place(this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
			}
			TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			break;

		case ID_JUNCTION_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem = g_ItemToRepeat 
					= CreateNewJunctionStruct(DC, m_CurrentScreen->m_Curseur);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place(this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
			}
			TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			break;

		case ID_WIRETOBUS_ENTRY_BUTT:
		case ID_BUSTOBUS_ENTRY_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
					DrawStruct =
					CreateBusEntry(DC,
						(m_ID_current_state == ID_WIRETOBUS_ENTRY_BUTT) ?
						WIRE_TO_BUS : BUS_TO_BUS);
					DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place(this, DC);
				m_CurrentScreen->m_CurrentItem = NULL;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
			}
			break;

		case ID_SCHEMATIC_DELETE_ITEM_BUTT:
			LocateAndDeleteItem(this, DC);
			m_CurrentScreen->SetModify();
			m_CurrentScreen->m_CurrentItem = NULL;
			TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			break;

		case ID_WIRE_BUTT:
			BeginSegment(DC, LAYER_WIRE);
			DrawPanel->m_AutoPAN_Request = TRUE;
			break;

		case ID_BUS_BUTT:
			BeginSegment(DC, LAYER_BUS);
			DrawPanel->m_AutoPAN_Request = TRUE;
			break;

		case ID_LINE_COMMENT_BUTT:
			BeginSegment(DC, LAYER_NOTES);
			DrawPanel->m_AutoPAN_Request = TRUE;
			break;

		case ID_TEXT_COMMENT_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
						CreateNewText(DC, LAYER_NOTES);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place(this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
			}
			break;

		case ID_LABEL_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
					CreateNewText(DC, LAYER_LOCLABEL);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place( this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		case ID_GLABEL_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
					CreateNewText(DC, LAYER_GLOBLABEL);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place(this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		case ID_SHEET_SYMBOL_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem = CreateSheet(DC);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place( this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		case ID_IMPORT_GLABEL_BUTT:
		case ID_SHEET_LABEL_BUTT:
			if( (DrawStruct == NULL) ||	(DrawStruct->m_Flags == 0) )
				DrawStruct = SchematicGeneralLocateAndDisplay();

			if ( DrawStruct == NULL) break;

			if( (DrawStruct->m_StructType == DRAW_SHEET_STRUCT_TYPE) &&
				(DrawStruct->m_Flags == 0) )
				{
				if ( m_ID_current_state == ID_IMPORT_GLABEL_BUTT )
					m_CurrentScreen->m_CurrentItem =
					Import_PinSheet( (DrawSheetStruct *) DrawStruct, DC);
				else
					m_CurrentScreen->m_CurrentItem =
					Create_PinSheet( (DrawSheetStruct *) DrawStruct, DC);
				}
			else if( (DrawStruct->m_StructType == DRAW_SHEETLABEL_STRUCT_TYPE) &&
				(DrawStruct->m_Flags != 0) )
				{
				DrawStruct->Place(this, DC);
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
				}
			break;

		case ID_COMPONENT_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem = Load_Component(DC, "",
					s_CmpNameList, TRUE);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place( this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		case ID_PLACE_POWER_BUTT:
			if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
			{
				m_CurrentScreen->m_CurrentItem =
					Load_Component(DC, "power",s_PowerNameList, FALSE);
				DrawPanel->m_AutoPAN_Request = TRUE;
			}
			else
			{
				DrawStruct->Place( this, DC);
				DrawPanel->m_AutoPAN_Request = FALSE;
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		default :
		{
			SetToolID( 0, wxCURSOR_ARROW, "");
			wxString msg("WinEDA_SchematicFrame::OnLeftClick error state ");
			msg << m_ID_current_state;
			DisplayError(this, msg);
			break;
		}
	}
}
Example #13
0
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;

	if(GetScreen()->ManageCurseur == NULL)
		{
		err = TRUE;
		DisplayError(this, wxT("HandleBlockPLace() : ManageCurseur = NULL") );
		}

	if(GetScreen()->BlockLocate.m_BlockDrawStruct == NULL)
		{
		wxString msg;
		err = TRUE;
		msg.Printf( wxT("HandleBlockPLace() : m_BlockDrawStruct = NULL (cmd %d, state %d)"),
			GetScreen()->BlockLocate.m_Command, GetScreen()->BlockLocate.m_State);
		DisplayError(this, msg );
		}

	GetScreen()->BlockLocate.m_State = STATE_BLOCK_STOP;

	switch(GetScreen()->BlockLocate.m_Command )
		{
		case  BLOCK_IDLE:
			err = TRUE;
			break;
		case BLOCK_DRAG: /* Drag */
		case BLOCK_MOVE: /* Move */
			if ( GetScreen()->ManageCurseur )
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			MoveStruct(DrawPanel, DC, GetScreen()->BlockLocate.m_BlockDrawStruct);
			GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			break;

		case BLOCK_COPY: /* Copy */
		case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
			if ( GetScreen()->ManageCurseur )
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			CopyStruct(DrawPanel, DC, GetScreen(), GetScreen()->BlockLocate.m_BlockDrawStruct);
			GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			break;

		case BLOCK_PASTE: /* Paste (recopie du dernier bloc sauve */
			if ( GetScreen()->ManageCurseur )
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			PasteStruct(DC);
			GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			break;

		case BLOCK_ZOOM:	// Handled by HandleBlockEnd()
		case BLOCK_DELETE:
		case BLOCK_SAVE:
		case BLOCK_ROTATE:
		case BLOCK_INVERT:
		case BLOCK_ABORT:
		case BLOCK_SELECT_ITEMS_ONLY:
			break;
		}

	SetFlagModify(GetScreen());

	/* clear struct.m_Flags  */
	EDA_BaseStruct * Struct;
	for(Struct = GetScreen()->EEDrawList; Struct != NULL; Struct=Struct->Pnext)
		Struct->m_Flags = 0;

	GetScreen()->ManageCurseur = NULL;
	GetScreen()->ForceCloseManageCurseur = NULL;
	GetScreen()->BlockLocate.m_Flags = 0;
	GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK;
	GetScreen()->BlockLocate.m_Command =  BLOCK_IDLE;
	GetScreen()->m_CurrentItem = NULL;

	TestDanglingEnds(GetScreen()->EEDrawList, DC);

	if ( GetScreen()->BlockLocate.m_BlockDrawStruct )
		{
		DisplayError(this, wxT("HandleBlockPLace() error: DrawStruct != Null") );
		GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
		}

	SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
}
Example #14
0
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;

	if( GetScreen()->BlockLocate.m_Command != BLOCK_MOVE )  return;
	if( Command == BLOCK_MOVE ) return;

	GetScreen()->BlockLocate.m_Command = (CmdBlockType) Command;
	GetScreen()->BlockLocate.SetMessageBlock(this);

	switch( GetScreen()->BlockLocate.m_Command )
		{
		case BLOCK_COPY: /* move to copy */
			GetScreen()->BlockLocate.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(GetScreen()->ManageCurseur)
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct )
			{
				if(GetScreen()->BlockLocate.m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE)
				{	/* Delete the picked wrapper if this is a picked list. */
					DrawPickedStruct * PickedList;
					PickedList = (DrawPickedStruct*)GetScreen()->BlockLocate.m_BlockDrawStruct;
					PickedList->DeleteWrapperList();
				}
				GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			}
			BreakSegmentOnJunction(GetScreen() );
			GetScreen()->BlockLocate.m_BlockDrawStruct =
				PickStruct(GetScreen()->BlockLocate,
					GetScreen()->EEDrawList, SEARCHALL);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
			{
				ii = 1;
				CollectStructsToDrag(GetScreen());
				if(GetScreen()->ManageCurseur)
					GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
				GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE;
			}
			break;

		case BLOCK_DELETE: /* move to Delete */
			if(GetScreen()->ManageCurseur)
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
			{
				ii = -1;
				DeleteStruct(DrawPanel, DC, GetScreen()->BlockLocate.m_BlockDrawStruct);
				SetFlagModify(GetScreen());
			}
			TestDanglingEnds(GetScreen()->EEDrawList, DC);
			break;

		case BLOCK_SAVE: /* Save */
			if(GetScreen()->ManageCurseur)
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
				{
				wxPoint oldpos = GetScreen()->m_Curseur;
				GetScreen()->m_Curseur = wxPoint(0,0);
				EDA_BaseStruct *DrawStructCopy =
					SaveStructListForPaste(GetScreen()->BlockLocate.m_BlockDrawStruct);
				PlaceStruct( GetScreen(), DrawStructCopy);
				GetScreen()->m_Curseur = oldpos;
				ii = -1;
				}
			break;

		case BLOCK_ZOOM: /* Window Zoom */
			GetScreen()->ForceCloseManageCurseur(this, DC);
			DrawPanel->SetCursor(DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor);
			Window_Zoom( GetScreen()->BlockLocate);
			break;

		default:
			break;
		}

	if ( ii <= 0 )
	{
		GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
		GetScreen()->BlockLocate.m_Flags = 0;
		GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK;
		GetScreen()->BlockLocate.m_Command =  BLOCK_IDLE;
		GetScreen()->ManageCurseur = NULL;
		GetScreen()->ForceCloseManageCurseur = NULL;
		GetScreen()->m_CurrentItem = NULL;
		SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
	}

}
Example #15
0
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ée et composants trouvés (block delete, block save)
*/
{
int ii = 0;
bool zoom_command = FALSE;

	if ( GetScreen()->BlockLocate.m_BlockDrawStruct )
	{
		BlockState state = GetScreen()->BlockLocate.m_State;
		CmdBlockType command = GetScreen()->BlockLocate.m_Command;
		if ( GetScreen()->ForceCloseManageCurseur )
			GetScreen()->ForceCloseManageCurseur(this, DC);
		GetScreen()->BlockLocate.m_State =  state;
		GetScreen()->BlockLocate.m_Command = command;
		GetScreen()->ManageCurseur = DrawAndSizingBlockOutlines;
		GetScreen()->ForceCloseManageCurseur = AbortBlockCurrentCommand;
		GetScreen()->m_Curseur.x = GetScreen()->BlockLocate.GetRight();
		GetScreen()->m_Curseur.y = GetScreen()->BlockLocate.GetBottom();
		if ( GetScreen()->BlockLocate.m_Command != BLOCK_ABORT )
			DrawPanel->MouseToCursorSchema();
	}

	if(GetScreen()->ManageCurseur != NULL)
	  switch( GetScreen()->BlockLocate.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 */
			GetScreen()->BlockLocate.m_BlockDrawStruct =
				PickStruct(GetScreen()->BlockLocate,
					GetScreen()->EEDrawList, SEARCHALL);
		case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
			{
				ii = 1;
				CollectStructsToDrag(GetScreen());
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
				GetScreen()->ManageCurseur = DrawMovingBlockOutlines;
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
				GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE;
			}
			else
			{
				GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
				GetScreen()->ManageCurseur = NULL;
				GetScreen()->ForceCloseManageCurseur = NULL;
			}
			break;

		case BLOCK_DELETE: /* Delete */
			GetScreen()->BlockLocate.m_BlockDrawStruct =
				PickStruct(GetScreen()->BlockLocate,
					GetScreen()->EEDrawList, SEARCHALL);
			DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
			{
				ii = -1;
				DeleteStruct(DrawPanel, DC, GetScreen()->BlockLocate.m_BlockDrawStruct);
				SetFlagModify(GetScreen());
			}
			GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			TestDanglingEnds(GetScreen()->EEDrawList, DC);
			break;

		case BLOCK_SAVE: /* Save */
			GetScreen()->BlockLocate.m_BlockDrawStruct =
				PickStruct(GetScreen()->BlockLocate,
					GetScreen()->EEDrawList, SEARCHALL);
			DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE);
			if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL)
			{
				wxPoint oldpos = GetScreen()->m_Curseur;
				GetScreen()->m_Curseur = wxPoint(0,0);
				EDA_BaseStruct *DrawStructCopy =
					SaveStructListForPaste(GetScreen()->BlockLocate.m_BlockDrawStruct);
				PlaceStruct( GetScreen(), DrawStructCopy);
				GetScreen()->m_Curseur = oldpos;
				ii = -1;
			}
			GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
			break;

		case BLOCK_PASTE:
			GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE;
			break;

		case BLOCK_ROTATE:
		case BLOCK_INVERT: /* pcbnew only! */
			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 ( GetScreen()->BlockLocate.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 )
	{
		GetScreen()->BlockLocate.m_Flags = 0;
		GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK;
		GetScreen()->BlockLocate.m_Command =  BLOCK_IDLE;
		GetScreen()->ManageCurseur = NULL;
		GetScreen()->ForceCloseManageCurseur = NULL;
		GetScreen()->m_CurrentItem = NULL;
		SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString );
	}

	if ( zoom_command)
		Window_Zoom( GetScreen()->BlockLocate);

	return(ii);
}
bool SCH_SCREEN::SchematicCleanUp( EDA_DRAW_PANEL* aCanvas, wxDC* aDC )
{
    SCH_ITEM* item, * testItem;
    bool      modified = false;

    item = m_drawList.begin();

    for( ; item; item = item->Next() )
    {
        if( ( item->Type() != SCH_LINE_T ) && ( item->Type() != SCH_JUNCTION_T ) )
            continue;

        testItem = item->Next();

        while( testItem )
        {
            if( ( item->Type() == SCH_LINE_T ) && ( testItem->Type() == SCH_LINE_T ) )
            {
                SCH_LINE* line = (SCH_LINE*) item;

                if( line->MergeOverlap( (SCH_LINE*) testItem ) )
                {
                    // Keep the current flags, because the deleted segment can be flagged.
                    item->SetFlags( testItem->GetFlags() );
                    DeleteItem( testItem );
                    testItem = m_drawList.begin();
                    modified = true;
                }
                else
                {
                    testItem = testItem->Next();
                }
            }
            else if ( ( ( item->Type() == SCH_JUNCTION_T ) && ( testItem->Type() == SCH_JUNCTION_T ) ) && ( testItem != item ) )
            {
                if ( testItem->HitTest( item->GetPosition() ) )
                {
                    // Keep the current flags, because the deleted segment can be flagged.
                    item->SetFlags( testItem->GetFlags() );
                    DeleteItem( testItem );
                    testItem = m_drawList.begin();
                    modified = true;
                }
                else
                {
                    testItem = testItem->Next();
                }
            }
            else
            {
                testItem = testItem->Next();
            }
        }
    }

    TestDanglingEnds( aCanvas, aDC );

    if( aCanvas && modified )
        aCanvas->Refresh();

    return modified;
}
Example #17
0
void WinEDA_SchematicFrame::RepeatDrawItem(wxDC *DC)
/***************************************************/
/* Routine de recopie du dernier element dessine
	Les elements duplicables sont
		fils, bus, traits, textes, labels
		Les labels termines par un nombre seront incrementes 
*/
{
char Line[256];
int ox = 0, oy = 0;

	if( g_ItemToRepeat == NULL ) return;

	switch( g_ItemToRepeat->m_StructType )
		{
		case DRAW_JUNCTION_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawJunctionStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			break;

		case DRAW_NOCONNECT_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawNoConnectStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			break;

		case DRAW_TEXT_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawTextStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			/*** Increment du numero de label ***/
			strcpy(Line,STRUCT->GetText());
			IncrementLabelMember(Line);
			STRUCT->m_Text = Line;
			break;

 
		case DRAW_LABEL_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawLabelStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			/*** Increment du numero de label ***/
			strcpy(Line,STRUCT->GetText());
			IncrementLabelMember(Line);
			STRUCT->m_Text = Line;
			break;


		case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawGlobalLabelStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			/*** Increment du numero de label ***/
			strcpy(Line,STRUCT->GetText());
			IncrementLabelMember(Line);
			STRUCT->m_Text = Line;
			break;

		case DRAW_SEGMENT_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawSegmentStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Start.x += g_RepeatStep.x; ox = STRUCT->m_Start.x;
			STRUCT->m_Start.y += g_RepeatStep.y; oy = STRUCT->m_Start.y;
			STRUCT->m_End.x += g_RepeatStep.x;
			STRUCT->m_End.y += g_RepeatStep.y;
			break;

		case DRAW_RACCORD_STRUCT_TYPE:
			#undef STRUCT
			#define STRUCT ((DrawRaccordStruct*) g_ItemToRepeat)
			g_ItemToRepeat = STRUCT->GenCopy();
			STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x;
			STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y;
			break;

		default:
			g_ItemToRepeat = NULL;
			DisplayError(this, "Repeat Type Error", 10);
			break;
		}

	if ( g_ItemToRepeat )
		{
		g_ItemToRepeat->Pnext = GetScreen()->EEDrawList;
		GetScreen()->EEDrawList = g_ItemToRepeat;
		TestDanglingEnds(GetScreen()->EEDrawList, NULL);
		RedrawOneStruct(DrawPanel,DC, g_ItemToRepeat, GR_DEFAULT_DRAWMODE);
//		GetScreen()->Curseur.x = ox; GetScreen()->Curseur.x = oy; 
//		GRMouseWarp(DrawPanel, DrawPanel->CursorScreenPosition() );
		}
}
Example #18
0
void WinEDA_SchematicFrame::OnHotKey(wxDC * DC, int hotkey,
					EDA_BaseStruct * DrawStruct)
/***********************************************************/
/* Gestion des commandes rapides (Raccourcis claviers) concernant l'element
sous le courseur souris
 Les majuscules/minuscules sont indifferenciees
	touche DELETE: Effacement (tout element)
	touche R: Rotation (composant ou label)
	touche X: Miroir X (composant)
	touche Y: Miroir Y (composant)
	touche N: Orient 0 (composant)
	touche M: Start Move composant
*/
{
bool PopupOn = m_CurrentScreen->m_CurrentItem  &&
			m_CurrentScreen->m_CurrentItem->m_Flags;

	if ( hotkey == 0 ) return;

	switch (hotkey)
	{
		case WXK_DELETE:
		case WXK_NUMPAD_DELETE:
			if ( PopupOn ) break;
			LocateAndDeleteItem(this, DC);
			m_CurrentScreen->SetModify();
			m_CurrentScreen->m_CurrentItem = NULL;
			TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			break;

		case WXK_F5 :
			if ( g_LastSearchIsMarker ) WinEDA_SchematicFrame::FindMarker(1);
			else FindSchematicItem(wxEmptyString, 2);
			break;

		case 'r':	// Rotation
		case 'R':
			if ( DrawStruct == NULL )
			{
				DrawStruct = PickStruct( GetScreen()->m_Curseur,
					GetScreen()->EEDrawList, LIBITEM|TEXTITEM|LABELITEM );
				if ( DrawStruct == NULL ) break;
				if ( DrawStruct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE )
						DrawStruct = LocateSmallestComponent( GetScreen() );
				if ( DrawStruct == NULL ) break;
			}
			switch (DrawStruct->m_StructType)
			{
				case DRAW_LIB_ITEM_STRUCT_TYPE:
					CmpRotationMiroir(
						(EDA_SchComponentStruct *) DrawStruct, DC, CMP_ROTATE_COUNTERCLOCKWISE );
					break;

				case DRAW_TEXT_STRUCT_TYPE:
				case DRAW_LABEL_STRUCT_TYPE:
				case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
						ChangeTextOrient( (DrawTextStruct*)DrawStruct, DC);
						break;
			}
			break;

		case 'y':	// Mirror Y (drawlibpart)
		case 'Y':
			if ( DrawStruct == NULL )
				DrawStruct = LocateSmallestComponent( GetScreen() );
			if ( DrawStruct )
			{
				CmpRotationMiroir(
					(EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_Y );
			}
			break;

		case 'x':	// Mirror X (drawlibpart)
		case 'X':
			if ( DrawStruct == NULL )
				DrawStruct = LocateSmallestComponent( GetScreen() );
			if ( DrawStruct )
			{
				CmpRotationMiroir(
					(EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_X );
			}
			break;

		case 'n':
		case 'N':	// Orient 0, no mirror (drawlibpart)
			if ( DrawStruct == NULL )
				DrawStruct = LocateSmallestComponent( GetScreen() );
			if ( DrawStruct )
			{
				CmpRotationMiroir(
					(EDA_SchComponentStruct *) DrawStruct, DC, CMP_NORMAL );
				TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
			}
			break;

		case 'm':
		case 'M':	// Start move drawlibpart
			if ( PopupOn ) break;
			if ( DrawStruct == NULL )
				DrawStruct = LocateSmallestComponent( GetScreen() );
			if ( DrawStruct && (DrawStruct->m_Flags ==0) )
			{
				m_CurrentScreen->m_CurrentItem = DrawStruct;
				Process_Move_Item(m_CurrentScreen->m_CurrentItem, DC);
			}
			break;
	}
}
Example #19
0
bool WinEDA_SchematicFrame::LoadOneEEFile(BASE_SCREEN *screen, const wxString & FullFileName)
/**************************************************************************************/
/* Routine to load an EESchema file.
Returns TRUE if file has been loaded (at list partially.)
*/
{
char Line[1024], * SLine;
char Name1[256],
	Name2[256];
int ii, layer, orient, size;
wxPoint pos;
bool	Failed = FALSE;
EDA_BaseStruct *Phead, *Pnext;
DrawJunctionStruct *ConnectionStruct;
DrawPolylineStruct *PolylineStruct;
EDA_DrawLineStruct * SegmentStruct;
DrawBusEntryStruct * RaccordStruct;
DrawMarkerStruct * MarkerStruct;
DrawNoConnectStruct * NoConnectStruct;

FILE *f;

	if ( screen == NULL ) return FALSE;
	if( FullFileName.IsEmpty() ) return FALSE;

	screen->m_CurrentItem = NULL;

	LineCount = 1;
	if ((f = wxFopen(FullFileName, wxT("rt")) ) == NULL)
		{
		MsgDiag = _("Failed to open ") + FullFileName;
		DisplayError(this, MsgDiag);
		return FALSE;
		}

	MsgDiag = _("Loading ") + FullFileName;
	PrintMsg(MsgDiag);

	if (fgets(Line, 1024 - 1, f) == NULL ||
		strncmp(Line+9, SCHEMATIC_HEAD_STRING, sizeof(SCHEMATIC_HEAD_STRING) - 1)
		!= 0)
		{
		MsgDiag = FullFileName + _(" is NOT EESchema file");
		DisplayError(this, MsgDiag);
		fclose(f);
		return FALSE;
		}

	LineCount++;
	if(fgets(Line, 1024 - 1, f) == NULL || strncmp(Line, "LIBS:", 5) != 0)
		{
		MsgDiag =  FullFileName + _(" is NOT EESchema file");
		DisplayError(this, MsgDiag);
		fclose(f);
		return FALSE;
		}

	LoadLayers(f, &LineCount);

	while (!feof(f) && GetLine(f, Line, &LineCount, sizeof(Line)) != NULL)
	{
		SLine = Line;
		while( (*SLine != ' ' ) && *SLine ) SLine++;
		switch(Line[0])
		{
			case '$':		/* identification de bloc */
				if(Line[1] == 'C')
					{
					Failed = ReadPartDescr(this, Line, f, screen);
					}
				else if(Line[1] == 'S')
					{
					Failed = ReadSheetDescr(this, Line, f, screen);
					}
				else if(Line[1] == 'D')
					{
					Failed = ReadSchemaDescr(this, Line, f, screen);
					}
				break;

			case 'L':		/* Its a library item. */
				Failed = ReadPartDescr(this, Line, f, screen);
				break;  /* Fin lecture 1 composant */


			case 'W':	 /* Its a Segment (WIRE or BUS) item. */
				if( sscanf(SLine, "%s %s", Name1, Name2) != 2  )
					{
					MsgDiag.Printf(
					wxT("EESchema file Segment struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					break;
					}
				layer = LAYER_NOTES;
				if( Name1[0] == 'W' ) layer = LAYER_WIRE;
				if( Name1[0] == 'B' ) layer = LAYER_BUS;

				SegmentStruct = new EDA_DrawLineStruct(wxPoint(0,0),layer);

				LineCount++;
				if (fgets(Line, 256 - 1, f) == NULL ||
					sscanf(Line, "%d %d %d %d ",
							&SegmentStruct->m_Start.x,&SegmentStruct->m_Start.y,
							&SegmentStruct->m_End.x,&SegmentStruct->m_End.y) != 4 )
					{
					MsgDiag.Printf(
					 wxT("EESchema file Segment struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					delete SegmentStruct;
					break;
					}

				if (!Failed)
					{
					SegmentStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = (EDA_BaseStruct *) SegmentStruct;
					}
				break;


			case 'E':	 /* Its a Raccord (WIRE or BUS) item. */
				if( sscanf(SLine, "%s %s", Name1, Name2) != 2  )
					{
					MsgDiag.Printf(
					wxT("EESchema file Raccord struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					break;
					}

				ii = WIRE_TO_BUS;
				if( Name1[0] == 'B' ) ii = BUS_TO_BUS;
				RaccordStruct = new DrawBusEntryStruct(wxPoint(0,0), '\\', ii);
				LineCount++;
				if (fgets(Line, 256 - 1, f) == NULL ||
					sscanf(Line, "%d %d %d %d ",
							&RaccordStruct->m_Pos.x,&RaccordStruct->m_Pos.y,
							&RaccordStruct->m_Size.x,&RaccordStruct->m_Size.y) != 4 )
				{
					MsgDiag.Printf(
					wxT("EESchema file Raccord struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					delete RaccordStruct;
					break;
				}

				if (!Failed)
				{
					RaccordStruct->m_Size.x -= RaccordStruct->m_Pos.x;
					RaccordStruct->m_Size.y -= RaccordStruct->m_Pos.y;
					RaccordStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = RaccordStruct;
				}
				break;

			case 'P':	 /* Its a polyline item. */
				if (sscanf(SLine, "%s %s %d",  Name1, Name2, &ii) != 3 )
				{
					MsgDiag.Printf(
					wxT("EESchema file polyline struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					break;
				}
				layer = LAYER_NOTES;
				if( Name2[0] == 'W' ) layer = LAYER_WIRE;
				if( Name2[0] == 'B' ) layer = LAYER_BUS;

				PolylineStruct = new DrawPolylineStruct(layer);

				PolylineStruct->m_NumOfPoints = ii;
				PolylineStruct->m_Points = (int *) MyZMalloc(sizeof(int) * 2 *
							PolylineStruct->m_NumOfPoints);
				for (ii = 0; ii < PolylineStruct->m_NumOfPoints; ii++)
				{
					LineCount++;
					if (fgets(Line, 256 - 1, f) == NULL ||
					sscanf(Line, "%d %d", &PolylineStruct->m_Points[ii*2],
							 &PolylineStruct->m_Points[ii*2+1]) != 2)
					{
						MsgDiag.Printf(
						wxT("EESchema file polyline struct error at line %d, aborted"),
								LineCount);
						Failed = TRUE;
						delete  PolylineStruct;
						break;
					}
				}

				if (!Failed)
					{
					PolylineStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = (EDA_BaseStruct *)
										  PolylineStruct;
					}
				break;

			case 'C':					/* Its a connection item. */
				ConnectionStruct = new DrawJunctionStruct(wxPoint(0,0));
				if (sscanf(SLine, "%s %d %d", Name1,
					  &ConnectionStruct->m_Pos.x,
					  &ConnectionStruct->m_Pos.y) != 3)
					{
					MsgDiag.Printf(
					wxT("EESchema file connection struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					delete ConnectionStruct;
					}
				else
					{
					ConnectionStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = ConnectionStruct;
					}
				break;

			case 'N':					/* Its a NoConnect item. */
				if (sscanf(SLine, "%s %d %d", Name1, &pos.x, &pos.y) != 3)
					{
					MsgDiag.Printf(
					wxT("EESchema file NoConnect struct error at line %d, aborted"),
								LineCount);
					Failed = TRUE;
					}
				else
					{
					NoConnectStruct = new DrawNoConnectStruct(pos);
					NoConnectStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = NoConnectStruct;
					}
				break;

			case 'K':					/* Its a MarKer item. */
				if (sscanf(SLine, "%s %d %d", Name1, &pos.x, &pos.y) != 3)
					{
					MsgDiag.Printf(
					wxT("EESchema file marker struct error line %d, aborted"),
								LineCount);
					Failed = TRUE;
					}
				else
					{
					char * text;
					char BufLine[1024];
					MarkerStruct = new DrawMarkerStruct(pos,wxEmptyString);
					ii = ReadDelimitedText(BufLine, Line, 256 );
					MarkerStruct->m_Type = (TypeMarker)((Name1[0] & 255) - 'A');
					if( MarkerStruct->m_Type < 0 )
						MarkerStruct->m_Type = MARQ_UNSPEC;
					if ( ii ) MarkerStruct->m_Comment = CONV_FROM_UTF8(BufLine);
					text = strstr(Line," F=");
					if (text)
						{
						sscanf(text+3, "%X", &ii);
						MarkerStruct->m_MarkFlags = ii;
						}
					MarkerStruct->Pnext = screen->EEDrawList;
					screen->EEDrawList = MarkerStruct;
					}
				break;

			case 'T':					/* Its a text item. */
				{
				EDA_BaseStruct * Struct = NULL;
				*Name1 = *Name2 = 0;
				ii = sscanf(SLine, "%s %d %d %d %d %s",
					  Name1, &pos.x, &pos.y, &orient, &size, Name2);

				if( ii < 4 )
					{
					MsgDiag.Printf(
						wxT("EESchema file text struct error line %d, aborted"),
								LineCount);
					Failed = TRUE;
					}
				else if( fgets(Line, 256 - 1, f) == NULL )
					{
					LineCount++;
					MsgDiag.Printf(
						wxT("EESchema file text struct error line %d (No text), aborted"),
								LineCount);
					Failed = TRUE;
					}
				else
					{
					LineCount++;
					if( size == 0 ) size = DEFAULT_SIZE_TEXT;
					char * text = strtok(Line, "\n\r");
					if ( text == NULL ) break;

					if( Name1[0] == 'L' )
						{
						DrawLabelStruct * TextStruct =
							new DrawLabelStruct(pos, CONV_FROM_UTF8(text));
						TextStruct->m_Size.x = TextStruct->m_Size.y = size;
						TextStruct->m_Orient = orient;
						Struct = (EDA_BaseStruct*)TextStruct;
						}
					else if( Name1[0] == 'G' )
						{
						DrawGlobalLabelStruct * TextStruct =
								new DrawGlobalLabelStruct(pos, CONV_FROM_UTF8(text));
						Struct = (EDA_BaseStruct*)TextStruct;
						TextStruct->m_Size.x = TextStruct->m_Size.y = size;
						TextStruct->m_Orient = orient;
						if( stricmp(Name2,SheetLabelType[NET_OUTPUT]) == 0 )
							TextStruct->m_Shape = NET_OUTPUT;
						if( stricmp(Name2,SheetLabelType[NET_BIDI]) == 0 )
							TextStruct->m_Shape = NET_BIDI;
						if( stricmp(Name2,SheetLabelType[NET_TRISTATE]) == 0 )
							TextStruct->m_Shape = NET_TRISTATE;
						if( stricmp(Name2,SheetLabelType[NET_UNSPECIFIED]) == 0 )
							TextStruct->m_Shape = NET_UNSPECIFIED;
						}
					else
						{
						DrawTextStruct * TextStruct =
							new DrawTextStruct(pos, CONV_FROM_UTF8(text));
						TextStruct->m_Size.x = TextStruct->m_Size.y = size;
						TextStruct->m_Orient = orient;
						Struct = (EDA_BaseStruct*)TextStruct;
						}
					if (Struct )
						{
						Struct->Pnext = screen->EEDrawList;
						screen->EEDrawList = Struct;
						}
					}
				break;
				}

		default:
				Failed = FALSE;
				MsgDiag.Printf(
					wxT("EESchema file undef structdef at line %d, aborted"),
								LineCount);
				break;
		}

		if (Failed)
		{
			DisplayError(this, MsgDiag);
			break;
		}
	}

	/* EEDrawList was constructed in reverse order - reverse it back: */
	Phead = NULL;
	while (screen->EEDrawList)
		{
		Pnext = screen->EEDrawList;
		screen->EEDrawList = screen->EEDrawList->Pnext;
		Pnext->Pnext = Phead;
		Phead = Pnext;
		}
	screen->EEDrawList = Phead;

	fclose(f);

	TestDanglingEnds(screen->EEDrawList, NULL);
		
	return TRUE;	/* Although it may be that file is only partially loaded. */
}