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()); }
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()); }
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(); }
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()); }
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; }
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(); } }
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(); }
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(); } }
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()); }
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; } } }
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 ); }
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 ); } }
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; }
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() ); } }
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; } }
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. */ }