From 06c9f9c8551206afcba0cb521208624d2746ee2d Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Mon, 1 Oct 2007 15:37:42 +0000 Subject: [PATCH] enhancements in pcbnew to eeschema cross-probing. removed change in drc.cpp --- change_log.txt | 14 ++ common/edaappl.cpp | 6 +- eeschema/block.cpp | 6 +- eeschema/cleanup.cpp | 2 +- eeschema/controle.cpp | 83 +++++-- eeschema/delsheet.cpp | 2 +- eeschema/dialog_eeschema_config.cpp | 4 +- eeschema/eeconfig.cpp | 8 +- eeschema/eeschema.cpp | 22 +- eeschema/find.cpp | 342 +++++++++++++++++++++++----- eeschema/getpart.cpp | 6 +- eeschema/libframe.cpp | 2 +- eeschema/locate.cpp | 57 ++++- eeschema/protos.h | 2 + eeschema/schedit.cpp | 20 +- eeschema/schframe.cpp | 6 +- eeschema/symbdraw.cpp | 2 +- eeschema/viewlib_frame.cpp | 2 +- include/appl_wxstruct.h | 6 +- include/wxstruct.h | 198 ++++++++-------- pcbnew/controle.cpp | 61 ++--- pcbnew/drc.cpp | 153 +++++++------ pcbnew/edit.cpp | 94 ++++++-- share/drawframe.cpp | 27 ++- 24 files changed, 757 insertions(+), 368 deletions(-) diff --git a/change_log.txt b/change_log.txt index a854c44ecd..3e36dbf2b2 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,19 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-Oct-01 UPDATE Jean-Pierre Charras +================================================================================ ++ pcbnew/eeschema + Cross-probing pcbnew to eeschema: + A left click on a pad in pcbnew moves the eeschema cursor on the corresponding component pin + A left click on a footprint ref or value in pcbnew moves the eeschema cursor on the corresponding component ref or value + A left ckick on a footprint moves the eeschema cursor on the corresponding component anchor ++ pcbnew + removed drc.cpp change line 584, and translate comments in english. + nothing broken: + -> a pad with its netcode = 0 means the pad ** must be left unconnected ** (not attached to * a net). + -> a track with its netcode = 0 means the track is not attached to a net (cannot be connected to any pad). + 2007-Sep-30 UPDATE Dick Hollenbeck ================================================================================ @@ -22,6 +35,7 @@ email address. * beautification, house keeping. + 2007-Sep-29 UPDATE Jean-Pierre Charras ================================================================================ + pcbnew diff --git a/common/edaappl.cpp b/common/edaappl.cpp index d1240e360d..6fdb75f398 100644 --- a/common/edaappl.cpp +++ b/common/edaappl.cpp @@ -62,9 +62,9 @@ WinEDA_App::WinEDA_App() m_MainFrame = NULL; m_PcbFrame = NULL; m_ModuleEditFrame = NULL; // Edition des modules - SchematicFrame = NULL; // Edition des Schemas - LibeditFrame = NULL; // Edition des composants - ViewlibFrame = NULL; // Visualisation des composants + m_SchematicFrame = NULL; // Edition des Schemas + m_LibeditFrame = NULL; // Edition des composants + m_ViewlibFrame = NULL; // Visualisation des composants m_CvpcbFrame = NULL; m_GerberFrame = NULL; // ecran de visualisation GERBER diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 0652b2bb71..7b7c77241d 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -681,7 +681,7 @@ void MirrorOneStruct( EDA_BaseStruct* DrawStruct, wxPoint& Center ) MirrorYPoint( px, Center ); px.x -= dx; - EDA_Appl->SchematicFrame->PutOnGrid( &px ); + EDA_Appl->m_SchematicFrame->PutOnGrid( &px ); DrawText->m_Pos.x = px.x; break; @@ -696,14 +696,14 @@ void MirrorOneStruct( EDA_BaseStruct* DrawStruct, wxPoint& Center ) px = DrawText->m_Pos; MirrorYPoint( px, Center ); - EDA_Appl->SchematicFrame->PutOnGrid( &px ); + EDA_Appl->m_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, + EDA_Appl->m_SchematicFrame->CmpRotationMiroir( DrawLibItem, NULL, CMP_MIROIR_Y ); MirrorYPoint( DrawLibItem->m_Pos, Center ); dx -= DrawLibItem->m_Pos.x; diff --git a/eeschema/cleanup.cpp b/eeschema/cleanup.cpp index 56efb19247..cc19f27b14 100644 --- a/eeschema/cleanup.cpp +++ b/eeschema/cleanup.cpp @@ -63,7 +63,7 @@ bool SCH_SCREEN::SchematicCleanUp( wxDC* DC ) } } - EDA_Appl->SchematicFrame->TestDanglingEnds( EEDrawList, DC ); + EDA_Appl->m_SchematicFrame->TestDanglingEnds( EEDrawList, DC ); return Modify; } diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp index 8d85b10f07..6c7790fa53 100644 --- a/eeschema/controle.cpp +++ b/eeschema/controle.cpp @@ -22,33 +22,71 @@ /* variables externes */ - -/**********************************/ +/***************************************************************/ void RemoteCommand( const char* cmdline ) -/**********************************/ +/***************************************************************/ -/* Read a remote command sent from pcbnew, so when user selects a module +/** Read a remote command sent by pcbnew (via a socket connection) , so when user selects a module * or pin in pcbnew, eeschema shows that same component or pin. + * The cursor is put on the item + * @param cmdline = received command from pcbnew + * commands are: + * $PART: "reference" put cursor on component + * $PART: "reference" $REF: "ref" put cursor on reference component + * $PART: "reference" $VAL: "value" put cursor on value component + * $PART: "reference" $PAD: "pin name" put cursor on the component pin */ { - char line[1024]; - char* idcmd; - char* text; + char line[1024]; + char* idcmd; + char* text; + WinEDA_SchematicFrame* frame = EDA_Appl->m_SchematicFrame; + wxString part_ref, msg; strncpy( line, cmdline, sizeof(line) - 1 ); idcmd = strtok( line, " \n\r" ); - text = strtok( NULL, " \n\r" ); + text = strtok( NULL, "\"\n\r" ); if( (idcmd == NULL) || (text == NULL) ) return; - if( strcmp( idcmd, "$PART:" ) == 0 ) + if( strcmp( idcmd, "$PART:" ) != 0 ) + return; + + part_ref = CONV_FROM_UTF8( text ); + + /* look for a complement */ + idcmd = strtok( NULL, " \n\r" ); + if( idcmd == NULL ) // component only { - WinEDA_SchematicFrame* frame = EDA_Appl->SchematicFrame; - - wxString msg = CONV_FROM_UTF8( text ); - frame->FindSchematicItem( msg, 1, false ); + frame->FindComponentAndItem( part_ref, true, 0, wxEmptyString, false ); + return; } + + text = strtok( NULL, "\"\n\r" ); + if( text == NULL ) + return; + + msg = CONV_FROM_UTF8( text ); + + if( strcmp( idcmd, "$REF:" ) == 0 ) + { + frame->FindComponentAndItem( part_ref, true, 2, msg, false ); + } + + + else if( strcmp( idcmd, "$VAL:" ) == 0 ) + { + frame->FindComponentAndItem( part_ref, true, 3, msg, false ); + } + + else if( strcmp( idcmd, "$PAD:" ) == 0 ) + { + frame->FindComponentAndItem( part_ref, true, 1, msg, false ); + } + + else + frame->FindComponentAndItem( part_ref, true, 0, wxEmptyString, false ); } @@ -76,7 +114,7 @@ SchematicGeneralLocateAndDisplay( bool IncludePin ) wxPoint mouse_position = GetScreen()->m_MousePosition; LibDrawPin* Pin = NULL; EDA_SchComponentStruct* LibItem = NULL; - char Line[1024]; + char Line[1024]; DrawStruct = SchematicGeneralLocateAndDisplay( mouse_position, IncludePin ); if( !DrawStruct && ( mouse_position != GetScreen()->m_Curseur) ) @@ -101,7 +139,7 @@ SchematicGeneralLocateAndDisplay( bool IncludePin ) case DRAW_LIB_ITEM_STRUCT_TYPE: Pin = LocateAnyPin( m_CurrentScreen->EEDrawList, GetScreen()->m_Curseur, &LibItem ); if( Pin ) - break; // Priority is probing a pin first + break; // Priority is probing a pin first LibItem = (EDA_SchComponentStruct*) DrawStruct; sprintf( Line, "$PART: %s", CONV_TO_UTF8( LibItem->m_Field[REFERENCE].m_Text ) ); SendCommand( MSG_TO_PCB, Line ); @@ -157,16 +195,16 @@ SchematicGeneralLocateAndDisplay( const wxPoint& refpoint, bool IncludePin ) * return: * an EDA_BaseStruct pointer on the item * a Null pointer if no item found - * + * * For some items, caracteristics are displayed on the screen. */ { EDA_BaseStruct* DrawStruct; LibDrawPin* Pin; EDA_SchComponentStruct* LibItem; - wxString Text; - wxString msg; - int ii; + wxString Text; + wxString msg; + int ii; DrawStruct = PickStruct( refpoint, GetScreen()->EEDrawList, MARKERITEM ); if( DrawStruct ) @@ -317,17 +355,17 @@ void WinEDA_DrawFrame::GeneralControle( wxDC* DC, wxPoint MousePositionInPixels curpos = m_CurrentScreen->m_Curseur; break; - case EDA_ZOOM_IN_FROM_MOUSE: + case EDA_ZOOM_IN_FROM_MOUSE: OnZoom( ID_ZOOM_PLUS_KEY ); curpos = m_CurrentScreen->m_Curseur; break; - case EDA_ZOOM_OUT_FROM_MOUSE: + case EDA_ZOOM_OUT_FROM_MOUSE: OnZoom( ID_ZOOM_MOINS_KEY ); curpos = m_CurrentScreen->m_Curseur; break; - case EDA_ZOOM_CENTER_FROM_MOUSE: + case EDA_ZOOM_CENTER_FROM_MOUSE: OnZoom( ID_ZOOM_CENTER_KEY ); curpos = m_CurrentScreen->m_Curseur; break; @@ -396,5 +434,4 @@ void WinEDA_DrawFrame::GeneralControle( wxDC* DC, wxPoint MousePositionInPixels } Affiche_Status_Box(); /* Affichage des coord curseur */ - } diff --git a/eeschema/delsheet.cpp b/eeschema/delsheet.cpp index 2b90c6a67f..fbaedcfcaf 100644 --- a/eeschema/delsheet.cpp +++ b/eeschema/delsheet.cpp @@ -24,7 +24,7 @@ void DeleteSubHierarchy(DrawSheetStruct * FirstSheet, bool confirm_deletion) { EDA_BaseStruct *DrawStruct; EDA_BaseStruct *EEDrawList; -WinEDA_SchematicFrame * frame = EDA_Appl->SchematicFrame; +WinEDA_SchematicFrame * frame = EDA_Appl->m_SchematicFrame; wxString msg; if( FirstSheet == NULL ) return; diff --git a/eeschema/dialog_eeschema_config.cpp b/eeschema/dialog_eeschema_config.cpp index d523740dff..119f2791a9 100644 --- a/eeschema/dialog_eeschema_config.cpp +++ b/eeschema/dialog_eeschema_config.cpp @@ -295,8 +295,8 @@ void KiConfigEeschemaFrame::OnCloseWindow(wxCloseEvent & event) if ( m_LibListChanged ) { LoadLibraries(m_Parent); - if ( m_Parent->m_Parent->ViewlibFrame ) - m_Parent->m_Parent->ViewlibFrame->ReCreateListLib(); + if ( m_Parent->m_Parent->m_ViewlibFrame ) + m_Parent->m_Parent->m_ViewlibFrame->ReCreateListLib(); } EndModal(0); } diff --git a/eeschema/eeconfig.cpp b/eeschema/eeconfig.cpp index 5e8f7e68f1..00f1f961f8 100644 --- a/eeschema/eeconfig.cpp +++ b/eeschema/eeconfig.cpp @@ -159,13 +159,13 @@ wxArrayString liblist_tmp = g_LibName_List; g_LibName_List.Add( wxT("device") ); } - if ( EDA_Appl->SchematicFrame ) + if ( EDA_Appl->m_SchematicFrame ) { - EDA_Appl->SchematicFrame->SetDrawBgColor(g_DrawBgColor); - EDA_Appl->SchematicFrame->m_Draw_Grid = g_ShowGrid; + EDA_Appl->m_SchematicFrame->SetDrawBgColor(g_DrawBgColor); + EDA_Appl->m_SchematicFrame->m_Draw_Grid = g_ShowGrid; } - LoadLibraries(EDA_Appl->SchematicFrame); + LoadLibraries(EDA_Appl->m_SchematicFrame); return IsRead; } diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp index 358a866286..d52c9148c1 100644 --- a/eeschema/eeschema.cpp +++ b/eeschema/eeschema.cpp @@ -66,41 +66,41 @@ bool WinEDA_App::OnInit() /* init EESCHEMA */ GetSettings(); // read current setup SeedLayers(); - Read_Hotkey_Config( SchematicFrame, false ); /* Must be called before creating the main frame + Read_Hotkey_Config( m_SchematicFrame, false ); /* Must be called before creating the main frame * in order to display the real hotkeys in menus * or tool tips */ // Create main frame (schematic frame) : - SchematicFrame = new WinEDA_SchematicFrame( NULL, this, + m_SchematicFrame = new WinEDA_SchematicFrame( NULL, this, wxT( "EESchema" ), wxPoint( 0, 0 ), wxSize( 600, 400 ) ); - SetTopWindow( SchematicFrame ); - SchematicFrame->Show( TRUE ); + SetTopWindow( m_SchematicFrame ); + m_SchematicFrame->Show( TRUE ); - if( CreateServer( SchematicFrame, KICAD_SCH_PORT_SERVICE_NUMBER ) ) + if( CreateServer( m_SchematicFrame, KICAD_SCH_PORT_SERVICE_NUMBER ) ) { // RemoteCommand is in controle.cpp and is called when PCBNEW // sends EESCHEMA a command SetupServerFunction( RemoteCommand ); } - SchematicFrame->Zoom_Automatique( TRUE ); + m_SchematicFrame->Zoom_Automatique( TRUE ); /* Load file specified in the command line. */ if( !FFileName.IsEmpty() ) { ChangeFileNameExt( FFileName, g_SchExtBuffer ); wxSetWorkingDirectory( wxPathOnly( FFileName ) ); - if( SchematicFrame->DrawPanel ) - if( SchematicFrame->LoadOneEEProject( FFileName, FALSE ) <= 0 ) - SchematicFrame->DrawPanel->Refresh( TRUE ); // File not found or error + if( m_SchematicFrame->DrawPanel ) + if( m_SchematicFrame->LoadOneEEProject( FFileName, FALSE ) <= 0 ) + m_SchematicFrame->DrawPanel->Refresh( TRUE ); // File not found or error } else { Read_Config( wxEmptyString, TRUE ); // Read config file ici si pas de fichier a charger - if( SchematicFrame->DrawPanel ) - SchematicFrame->DrawPanel->Refresh( TRUE ); + if( m_SchematicFrame->DrawPanel ) + m_SchematicFrame->DrawPanel->Refresh( TRUE ); } return TRUE; diff --git a/eeschema/find.cpp b/eeschema/find.cpp index 730c043af5..87ed79979a 100644 --- a/eeschema/find.cpp +++ b/eeschema/find.cpp @@ -56,6 +56,213 @@ void WinEDA_FindFrame::FindMarker( wxCommandEvent& event ) } +/************************************************************************/ +EDA_BaseStruct* WinEDA_SchematicFrame::FindComponentAndItem( + const wxString& component_reference, bool Find_in_hierarchy, + int SearchType, + const wxString& text_to_find, + bool mouseWarp ) +/************************************************************************/ + +/** + * Function FindComponentAndItem + * finds a Component in the schematic, and an item in this component. + * @param pattern The text to search for, either in value, reference or elsewhere. + * @param Find_in_hierarchy: false => Search is made in current sheet + * true => the whole hierarchy + * @param SearchType: 0 => find component + * 1 => find pin + * 2 => find ref + * 3 => find value + * >= 4 => unused (same as 0) + * @param mouseWarp If true, then move the mouse cursor to the item. + */ +{ + SCH_SCREEN* Screen, * ScreenWithComponentFound = NULL; + EDA_BaseStruct* DrawList = NULL; + EDA_SchComponentStruct* Component = NULL; + wxSize DrawAreaSize = DrawPanel->GetClientSize(); + wxPoint pos, curpos; + bool DoCenterAndRedraw = FALSE; + bool NotFound = true; + wxString msg; + LibDrawPin* pin; + + EDA_ScreenList ScreenList( NULL ); + + Screen = ScreenList.GetFirst(); + if( !Find_in_hierarchy ) + Screen = (SCH_SCREEN*) m_CurrentScreen; + + for( ; Screen != NULL; Screen = ScreenList.GetNext() ) + { + DrawList = Screen->EEDrawList; + for( ; (DrawList != NULL) && (NotFound == true); DrawList = DrawList->Pnext ) + { + if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE ) + { + EDA_SchComponentStruct* pSch; + pSch = (EDA_SchComponentStruct*) DrawList; + if( component_reference.CmpNoCase( pSch->m_Field[REFERENCE].m_Text ) == 0 ) + { + Component = pSch; + ScreenWithComponentFound = Screen; + + switch( SearchType ) + { + default: + case 0: // Find component only + NotFound = FALSE; + pos = pSch->m_Pos; + break; + + case 1: // find a pin + pos = pSch->m_Pos; // temporary: will be changed if the pin is found + pin = LocatePinByNumber( text_to_find, pSch ); + if( pin == NULL ) + break; + NotFound = FALSE; + pos += pin->m_Pos; + break; + + case 2: // find reference + NotFound = FALSE; + pos = pSch->m_Field[REFERENCE].m_Pos; + break; + + case 3: // find value + pos = pSch->m_Pos; + if( text_to_find.CmpNoCase( pSch->m_Field[VALUE].m_Text ) != 0 ) + break; + NotFound = FALSE; + pos = pSch->m_Field[VALUE].m_Pos; + break; + } + } + } + } + + if( (Find_in_hierarchy == FALSE) || (NotFound == FALSE) ) + break; + } + + if( Component ) + { + Screen = ScreenWithComponentFound; + if( Screen != GetScreen() ) + { + Screen->SetZoom( GetScreen()->GetZoom() ); + m_CurrentScreen = ActiveScreen = Screen; + DoCenterAndRedraw = TRUE; + } + wxPoint delta; + pos -= Component->m_Pos; + + delta.x = Component->m_Transform[0][0] * pos.x + Component->m_Transform[0][1] * pos.y; + delta.y = Component->m_Transform[1][0] * pos.x + Component->m_Transform[1][1] * pos.y; + + pos = delta + Component->m_Pos; + + wxPoint old_cursor_position = Screen->m_Curseur; + Screen->m_Curseur = pos; + + curpos = DrawPanel->CursorScreenPosition(); + + DrawPanel->GetViewStart( + &m_CurrentScreen->m_StartVisu.x, + &m_CurrentScreen->m_StartVisu.y ); + + // calcul des coord curseur avec origine = screen + curpos.x -= m_CurrentScreen->m_StartVisu.x; + curpos.y -= m_CurrentScreen->m_StartVisu.y; + + /* Il y a peut-etre necessite de recadrer le dessin: */ + #define MARGIN 30 + if( (curpos.x <= MARGIN) || (curpos.x >= DrawAreaSize.x - MARGIN) + || (curpos.y <= MARGIN) || (curpos.y >= DrawAreaSize.y - MARGIN) ) + { + DoCenterAndRedraw = true;; + } + #undef MARGIN + + if ( DoCenterAndRedraw ) + Recadre_Trace( mouseWarp ); + else + { + wxClientDC dc( DrawPanel ); + + DrawPanel->PrepareGraphicContext( &dc ); + + EXCHG( old_cursor_position, Screen->m_Curseur ); + DrawPanel->CursorOff( &dc ); + + if( mouseWarp ) + GRMouseWarp( DrawPanel, curpos ); + + EXCHG( old_cursor_position, Screen->m_Curseur ); + + DrawPanel->CursorOn( &dc ); + } + } + + + /* Print diaq */ + wxString msg_item; + msg = component_reference; + + switch( SearchType ) + { + default: + case 0: + break; // Find component only + + case 1: // find a pin + msg_item = _( "Pin " ) + text_to_find; + break; + + case 2: // find reference + msg_item = _( "Ref " ) + text_to_find; + break; + + case 3: // find value + msg_item = _( "Value " ) + text_to_find; + break; + + case 4: // find field. todo + msg_item = _( "Field " ) + text_to_find; + break; + } + + if( Component ) + { + if( !NotFound ) + { + if( !msg_item.IsEmpty() ) + msg += wxT( " " ) + msg_item; + msg += _( " Found" ); + } + else + { + msg += _( " Found" ); + if( !msg_item.IsEmpty() ) + { + msg += wxT( " but " ) + msg_item + _( " not found" ); + } + } + } + else + { + if( !msg_item.IsEmpty() ) + msg += wxT( " " ) + msg_item; + msg += _( " not found" ); + } + + Affiche_Message( msg ); + + return DrawList; +} + + /*****************************************************************/ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) /*****************************************************************/ @@ -71,9 +278,9 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) int StartCount; bool NotFound; wxPoint firstpos, pos; - wxSize size = DrawPanel->GetClientSize(); + wxSize DrawAreaSize = DrawPanel->GetClientSize(); wxPoint curpos, old_cursor_position; - bool force_recadre = FALSE; + bool DoCenterAndRedraw = FALSE; wxString msg, WildText; g_LastSearchIsMarker = TRUE; @@ -95,7 +302,7 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) Marker = (DrawMarkerStruct*) DrawList; NotFound = FALSE; pos = Marker->m_Pos; - if( FirstScreen == NULL ) /* First item found */ + if( FirstScreen == NULL ) /* First item found */ { FirstScreen = Screen; firstpos = pos; FirstStruct = DrawList; @@ -104,9 +311,9 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) StartCount++; if( s_MarkerCount >= StartCount ) { - NotFound = TRUE; /* Search for other markers */ + NotFound = TRUE; /* Search for other markers */ } - else /* We have found s_MarkerCount markers -> Ok */ + else /* We have found s_MarkerCount markers -> Ok */ { Struct = DrawList; s_MarkerCount++; break; } @@ -118,8 +325,8 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) break; } - if( NotFound && FirstScreen ) // markers are found, but we have reach the last marker */ - { // After the last marker, the first marker is used */ + if( NotFound && FirstScreen ) // markers are found, but we have reach the last marker */ + { // After the last marker, the first marker is used */ NotFound = FALSE; Screen = FirstScreen; Struct = FirstStruct; pos = firstpos; s_MarkerCount = 1; @@ -131,7 +338,7 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) { Screen->SetZoom( GetScreen()->GetZoom() ); m_CurrentScreen = ActiveScreen = Screen; - force_recadre = TRUE; + DoCenterAndRedraw = TRUE; } old_cursor_position = Screen->m_Curseur; @@ -144,12 +351,17 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindMarker( int SearchType ) curpos.x -= m_CurrentScreen->m_StartVisu.x; curpos.y -= m_CurrentScreen->m_StartVisu.y; - // reposition the window if the chosen marker is off screen. - if( (curpos.x <= 0) || (curpos.x >= size.x - 1) - || (curpos.y <= 0) || (curpos.y >= size.y) || force_recadre ) + // reposition the window if the chosen marker is off screen. + #define MARGIN 30 + if( (curpos.x <= MARGIN) || (curpos.x >= DrawAreaSize.x - MARGIN) + || (curpos.y <= MARGIN) || (curpos.y >= DrawAreaSize.y - MARGIN) ) { - Recadre_Trace( TRUE ); + DoCenterAndRedraw = true;; } + #undef MARGIN + + if( DoCenterAndRedraw ) + Recadre_Trace( TRUE ); else { wxClientDC dc( DrawPanel ); @@ -218,9 +430,9 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( bool NotFound; wxPoint firstpos, pos, old_cursor_position; static int Find_in_hierarchy; - wxSize size = DrawPanel->GetClientSize(); + wxSize DrawAreaSize = DrawPanel->GetClientSize(); wxPoint curpos; - bool force_recadre = FALSE; + bool DoCenterAndRedraw = FALSE; wxString msg, WildText; g_LastSearchIsMarker = FALSE; @@ -240,8 +452,8 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( if( SearchType != 2 ) s_ItemsCount = 0; - WildText = s_OldStringFound; - NotFound = TRUE; + WildText = s_OldStringFound; + NotFound = TRUE; StartCount = 0; EDA_ScreenList ScreenList( NULL ); @@ -258,8 +470,8 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( switch( DrawList->Type() ) { case DRAW_LIB_ITEM_STRUCT_TYPE: - EDA_SchComponentStruct* pSch; - pSch = (EDA_SchComponentStruct*) DrawList; + EDA_SchComponentStruct * pSch; + pSch = (EDA_SchComponentStruct*) DrawList; if( WildCompareString( WildText, pSch->m_Field[REFERENCE].m_Text, FALSE ) ) { NotFound = FALSE; @@ -276,8 +488,8 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( case DRAW_LABEL_STRUCT_TYPE: case DRAW_GLOBAL_LABEL_STRUCT_TYPE: case DRAW_TEXT_STRUCT_TYPE: - DrawTextStruct* pDraw; - pDraw = (DrawTextStruct*) DrawList; + DrawTextStruct * pDraw; + pDraw = (DrawTextStruct*) DrawList; if( WildCompareString( WildText, pDraw->m_Text, FALSE ) ) { NotFound = FALSE; @@ -289,11 +501,11 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( break; } - if( NotFound == FALSE ) /* Item found ! */ + if( NotFound == FALSE ) /* Item found ! */ { - if( FirstScreen == NULL ) /* First Item found */ + if( FirstScreen == NULL ) /* First Item found */ { - FirstScreen = Screen; + FirstScreen = Screen; firstpos = pos; FirstStruct = DrawList; } @@ -305,8 +517,8 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( } else { - Struct = DrawList; - s_ItemsCount++; + Struct = DrawList; + s_ItemsCount++; break; } } @@ -314,20 +526,20 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( break; DrawList = DrawList->Pnext; } - + if( NotFound == FALSE ) break; - + if( Find_in_hierarchy == FALSE ) break; } if( NotFound && FirstScreen ) { - NotFound = FALSE; - Screen = FirstScreen; + NotFound = FALSE; + Screen = FirstScreen; Struct = FirstStruct; - pos = firstpos; + pos = firstpos; s_ItemsCount = 1; } @@ -337,33 +549,33 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( { Screen->SetZoom( GetScreen()->GetZoom() ); m_CurrentScreen = ActiveScreen = Screen; - force_recadre = TRUE; + DoCenterAndRedraw = TRUE; } - /* If the struct found is a DRAW_LIB_ITEM_STRUCT_TYPE type, + /* the struct is a DRAW_LIB_ITEM_STRUCT_TYPE type, * coordinates must be computed according to its orientation matrix */ if( Struct->Type() == DRAW_LIB_ITEM_STRUCT_TYPE ) { - EDA_SchComponentStruct* pSch = (EDA_SchComponentStruct*) Struct; + EDA_SchComponentStruct* pSch = (EDA_SchComponentStruct*) Struct; - pos.x -= pSch->m_Pos.x; + pos.x -= pSch->m_Pos.x; pos.y -= pSch->m_Pos.y; - - ii = pSch->m_Transform[0][0] * pos.x + pSch->m_Transform[0][1] * pos.y; - jj = pSch->m_Transform[1][0] * pos.x + pSch->m_Transform[1][1] * pos.y; - - pos.x = ii + pSch->m_Pos.x; + + ii = pSch->m_Transform[0][0] * pos.x + pSch->m_Transform[0][1] * pos.y; + jj = pSch->m_Transform[1][0] * pos.x + pSch->m_Transform[1][1] * pos.y; + + pos.x = ii + pSch->m_Pos.x; pos.y = jj + pSch->m_Pos.y; } old_cursor_position = Screen->m_Curseur; Screen->m_Curseur = pos; - + curpos = DrawPanel->CursorScreenPosition(); - - DrawPanel->GetViewStart( - &m_CurrentScreen->m_StartVisu.x, + + DrawPanel->GetViewStart( + &m_CurrentScreen->m_StartVisu.x, &m_CurrentScreen->m_StartVisu.y ); // calcul des coord curseur avec origine = screen @@ -371,25 +583,29 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( curpos.y -= m_CurrentScreen->m_StartVisu.y; /* Il y a peut-etre necessite de recadrer le dessin: */ - if( (curpos.x <= 0) || (curpos.x >= size.x - 1) - || (curpos.y <= 0) || (curpos.y >= size.y) || force_recadre ) + #define MARGIN 30 + if( (curpos.x <= MARGIN) || (curpos.x >= DrawAreaSize.x - MARGIN) + || (curpos.y <= MARGIN) || (curpos.y >= DrawAreaSize.y - MARGIN) ) { - Recadre_Trace( mouseWarp ); + DoCenterAndRedraw = true; } + + if ( DoCenterAndRedraw ) + Recadre_Trace( mouseWarp ); else { wxClientDC dc( DrawPanel ); DrawPanel->PrepareGraphicContext( &dc ); - + EXCHG( old_cursor_position, Screen->m_Curseur ); DrawPanel->CursorOff( &dc ); - + if( mouseWarp ) GRMouseWarp( DrawPanel, curpos ); - + EXCHG( old_cursor_position, Screen->m_Curseur ); - + DrawPanel->CursorOn( &dc ); } @@ -399,10 +615,10 @@ EDA_BaseStruct* WinEDA_SchematicFrame::FindSchematicItem( else { Affiche_Message( wxEmptyString ); - - if( !mouseWarp ) + + if( !mouseWarp ) { - // if called from RemoteCommand() don't popup the dialog which + // if called from RemoteCommand() don't popup the dialog which // needs to be dismissed, user is in PCBNEW, and does'nt want to // bother with dismissing the dialog in EESCHEMA. msg = WildText + _( " Not Found" ); @@ -421,11 +637,11 @@ void WinEDA_FindFrame::LocatePartInLibs( wxCommandEvent& event ) /* Recherche exhaustive d'un composant en librairies, meme non chargees */ { - wxString Text, FindList; - const wxChar** ListNames; - LibraryStruct* Lib = NULL; + wxString Text, FindList; + const wxChar** ListNames; + LibraryStruct* Lib = NULL; EDA_LibComponentStruct* LibEntry; - bool FoundInLib = FALSE; // True si reference trouvee ailleurs qu'en cache + bool FoundInLib = FALSE; // True si reference trouvee ailleurs qu'en cache Text = m_NewTextCtrl->GetValue(); if( Text.IsEmpty() ) @@ -444,7 +660,7 @@ void WinEDA_FindFrame::LocatePartInLibs( wxCommandEvent& event ) ListNames = GetLibNames(); nbitems = 0; - for( ii = 0; ii < NumOfLibs; ii++ ) /* Recherche de la librairie */ + for( ii = 0; ii < NumOfLibs; ii++ ) /* Recherche de la librairie */ { bool IsLibCache; Lib = FindLibrary( ListNames[ii] ); @@ -503,9 +719,9 @@ int WinEDA_FindFrame::ExploreAllLibraries( const wxString& wildmask, wxString& F /***************************************************************************************/ { wxString FullFileName; - FILE* file; - int nbitems = 0, LineNum = 0; - char Line[2048], * name; + FILE* file; + int nbitems = 0, LineNum = 0; + char Line[2048], * name; FullFileName = MakeFileName( g_RealLibDirBuffer, wxT( "*" ), g_LibExtBuffer ); @@ -519,7 +735,7 @@ int WinEDA_FindFrame::ExploreAllLibraries( const wxString& wildmask, wxString& F while( GetLine( file, Line, &LineNum, sizeof(Line) ) ) { if( strnicmp( Line, "DEF", 3 ) == 0 ) - { + { /* Read one DEF part from library: DEF 74LS00 U 0 30 Y Y 4 0 N */ strtok( Line, " \t\r\n" ); name = strtok( NULL, " \t\r\n" ); @@ -534,7 +750,7 @@ int WinEDA_FindFrame::ExploreAllLibraries( const wxString& wildmask, wxString& F } } else if( strnicmp( Line, "ALIAS", 5 ) == 0 ) - { + { /* Read one ALIAS part from library: ALIAS 74HC00 74HCT00 7400 74LS37 */ strtok( Line, " \t\r\n" ); while( ( name = strtok( NULL, " \t\r\n" ) ) != NULL ) diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index a59c6d5943..d5f19e9f23 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -31,14 +31,14 @@ wxString SelectFromLibBrowser( WinEDA_DrawFrame* parent ) WinEDA_ViewlibFrame* Viewer; wxSemaphore semaphore( 0, 1 ); - Viewer = parent->m_Parent->ViewlibFrame; + Viewer = parent->m_Parent->m_ViewlibFrame; /* Close the current Lib browser, if open, and open a new one, in "modal" mode */ if( Viewer ) Viewer->Destroy(); - Viewer = parent->m_Parent->ViewlibFrame = new + Viewer = parent->m_Parent->m_ViewlibFrame = new WinEDA_ViewlibFrame( - parent->m_Parent->SchematicFrame, + parent->m_Parent->m_SchematicFrame, parent->m_Parent, NULL, &semaphore ); diff --git a/eeschema/libframe.cpp b/eeschema/libframe.cpp index ced06e8183..cb25887b3f 100644 --- a/eeschema/libframe.cpp +++ b/eeschema/libframe.cpp @@ -88,7 +88,7 @@ WinEDA_LibeditFrame::WinEDA_LibeditFrame( wxWindow* father, WinEDA_LibeditFrame::~WinEDA_LibeditFrame() /**********************************************/ { - m_Parent->LibeditFrame = NULL; + m_Parent->m_LibeditFrame = NULL; m_CurrentScreen = ScreenSch; } diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index ba69c26643..181a1a8520 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -1036,6 +1036,57 @@ int distance( int dx, int dy, int spot_cX, int spot_cY, int seuil ) return 0; } +/*******************************************************************/ +LibDrawPin* LocatePinByNumber( const wxString & ePin_Number, + EDA_SchComponentStruct* eComponent ) +/*******************************************************************/ + +/** Find a PIN in a component + * @param pin_number = pin number (string) + * @param pin_number = pin number (string) + * @return a pointer on the pin, or NULL if not found + */ +{ + LibEDA_BaseStruct* DrawItem; + EDA_LibComponentStruct* Entry; + LibDrawPin* Pin; + int Unit, Convert; + + Entry = FindLibPart(eComponent->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); + if( Entry == NULL ) + return NULL; + + if( Entry->Type != ROOT ) + { + DisplayError( NULL, wxT( "LocatePinByNumber() error: Entry is ALIAS" ) ); + return NULL; + } + + Unit = eComponent->m_Multi; + Convert = eComponent->m_Convert; + + DrawItem = Entry->m_Drawings; + for( ; DrawItem != NULL; DrawItem = DrawItem->Next() ) + { + if( DrawItem->Type() == COMPONENT_PIN_DRAW_TYPE ) /* Pin Trouvee */ + { + Pin = (LibDrawPin*) DrawItem; + + if( Unit && DrawItem->m_Unit && (DrawItem->m_Unit != Unit) ) + continue; + + if( Convert && DrawItem->m_Convert && (DrawItem->m_Convert != Convert) ) + continue; + wxString pNumber; + Pin->ReturnPinStringNum( pNumber ); + if ( ePin_Number == pNumber ) + return Pin; + } + } + + return NULL; +} + /*******************************************************************/ LibEDA_BaseStruct* LocatePin( const wxPoint& RefPos, @@ -1047,12 +1098,6 @@ LibEDA_BaseStruct* LocatePin( const wxPoint& RefPos, * retourne un pointeur sur la pin, ou NULL si pas trouve * Si Unit = 0, le numero d'unite n'est pas teste * Si convert = 0, le numero convert n'est pas teste - * - * m_Transform = matrice de transformation. - * Si NULL: matrice de transformation " normale" [1 , 0 , 0 , -1] - * (la matrice de transformation " normale" etant [1 , 0 , 0 , -1] - * la coord dy doit etre inversee). - * PartX, PartY: coordonnees de positionnement du composant */ { LibEDA_BaseStruct* DrawItem; diff --git a/eeschema/protos.h b/eeschema/protos.h index 52b71784c5..3cf215af78 100644 --- a/eeschema/protos.h +++ b/eeschema/protos.h @@ -118,6 +118,8 @@ bool DrawStructInBox(int x1, int y1, int x2, int y2, /*************/ /* LOCATE.CPP */ /*************/ +LibDrawPin* LocatePinByNumber( const wxString & ePin_Number, + EDA_SchComponentStruct* eComponent ); EDA_SchComponentStruct * LocateSmallestComponent( SCH_SCREEN * Screen ); /* Recherche du plus petit (en surface) composant pointe par la souris */ diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 1f96981fc8..09b8e38c63 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -182,19 +182,19 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_TO_LIBRARY: - if( m_Parent->LibeditFrame ) + if( m_Parent->m_LibeditFrame ) { - m_Parent->LibeditFrame->Show( TRUE ); + m_Parent->m_LibeditFrame->Show( TRUE ); } else { - m_Parent->LibeditFrame = new - WinEDA_LibeditFrame( m_Parent->SchematicFrame, + m_Parent->m_LibeditFrame = new + WinEDA_LibeditFrame( m_Parent->m_SchematicFrame, m_Parent, wxT( "Library Editor" ), wxPoint( -1, -1 ), wxSize( 600, 400 ) ); ActiveScreen = ScreenLib; - m_Parent->LibeditFrame->AdjustScrollBars(); + m_Parent->m_LibeditFrame->AdjustScrollBars(); } break; @@ -229,15 +229,15 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) } case ID_TO_LIBVIEW: - if( m_Parent->ViewlibFrame ) + if( m_Parent->m_ViewlibFrame ) { - m_Parent->ViewlibFrame->Show( TRUE ); + m_Parent->m_ViewlibFrame->Show( TRUE ); } else { - m_Parent->ViewlibFrame = new - WinEDA_ViewlibFrame( m_Parent->SchematicFrame, m_Parent ); - m_Parent->ViewlibFrame->AdjustScrollBars(); + m_Parent->m_ViewlibFrame = new + WinEDA_ViewlibFrame( m_Parent->m_SchematicFrame, m_Parent ); + m_Parent->m_ViewlibFrame->AdjustScrollBars(); } break; diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index c1ac04a55c..c25e92eac6 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -154,7 +154,7 @@ WinEDA_SchematicFrame:: WinEDA_SchematicFrame(wxWindow * father, WinEDA_App *par WinEDA_SchematicFrame::~WinEDA_SchematicFrame() { - m_Parent->SchematicFrame = NULL; + m_Parent->m_SchematicFrame = NULL; m_CurrentScreen = ScreenSch; } @@ -164,9 +164,9 @@ void WinEDA_SchematicFrame::OnCloseWindow(wxCloseEvent & Event) { SCH_SCREEN * screen; - if ( m_Parent->LibeditFrame ) // Can close component editor ? + if ( m_Parent->m_LibeditFrame ) // Can close component editor ? { - if ( ! m_Parent->LibeditFrame->Close() ) return; + if ( ! m_Parent->m_LibeditFrame->Close() ) return; } screen = ScreenSch ; diff --git a/eeschema/symbdraw.cpp b/eeschema/symbdraw.cpp index 1e8b36334d..6020d872fd 100644 --- a/eeschema/symbdraw.cpp +++ b/eeschema/symbdraw.cpp @@ -793,7 +793,7 @@ static void ComputeArc( LibDrawArc* DrawItem, wxPoint ArcCentre ) wxString msg; angle = DrawItem->t2 - DrawItem->t1; msg.Printf( _( "Arc %.1f deg" ), (float) angle / 10 ); - EDA_Appl->LibeditFrame->PrintMsg( msg ); + EDA_Appl->m_LibeditFrame->PrintMsg( msg ); while( (DrawItem->t2 - DrawItem->t1) >= 1800 ) { diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index 393ecdc641..ef27d8e9f8 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -109,7 +109,7 @@ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame(wxWindow * father, WinEDA_App *parent, WinEDA_ViewlibFrame::~WinEDA_ViewlibFrame() { delete m_CurrentScreen; - m_Parent->ViewlibFrame = NULL; + m_Parent->m_ViewlibFrame = NULL; } /*****************************************************************/ diff --git a/include/appl_wxstruct.h b/include/appl_wxstruct.h index 66880056fe..f897299dda 100644 --- a/include/appl_wxstruct.h +++ b/include/appl_wxstruct.h @@ -30,9 +30,9 @@ public: WinEDA_PcbFrame* m_PcbFrame; WinEDA_ModuleEditFrame* m_ModuleEditFrame; WinEDA_GerberFrame* m_GerberFrame; - WinEDA_SchematicFrame* SchematicFrame; // Edition des Schemas - WinEDA_LibeditFrame* LibeditFrame; // Edition des composants - WinEDA_ViewlibFrame* ViewlibFrame; // Visualisation des composants + WinEDA_SchematicFrame* m_SchematicFrame; // Edition des Schemas + WinEDA_LibeditFrame* m_LibeditFrame; // Edition des composants + WinEDA_ViewlibFrame* m_ViewlibFrame; // Visualisation des composants WinEDA_CvpcbFrame* m_CvpcbFrame; wxPoint m_HelpPos; diff --git a/include/wxstruct.h b/include/wxstruct.h index fe90dda143..9f27f82584 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -171,15 +171,19 @@ public: WinEDA_BasicFrame() { } // Should throw!! #endif ~WinEDA_BasicFrame(); - + void GetKicadHelp( wxCommandEvent& event ); void GetKicadAbout( wxCommandEvent& event ); void PrintMsg( const wxString& text ); void GetSettings(); void SaveSettings(); - int WriteHotkeyConfigFile(const wxString & Filename, struct Ki_HotkeyInfoSectionDescriptor * DescList, bool verbose); - int ReadHotkeyConfigFile(const wxString & Filename, struct Ki_HotkeyInfoSectionDescriptor * DescList, bool verbose); - void SetLanguage( wxCommandEvent& event ); + int WriteHotkeyConfigFile( const wxString& Filename, + struct Ki_HotkeyInfoSectionDescriptor* DescList, + bool verbose ); + int ReadHotkeyConfigFile( const wxString& Filename, + struct Ki_HotkeyInfoSectionDescriptor* DescList, + bool verbose ); + void SetLanguage( wxCommandEvent& event ); void ProcessFontPreferences( int id ); wxString GetLastProject( int rang ); @@ -215,7 +219,7 @@ public: int m_InternalUnits; // nombre d'unites internes pour 1 pouce // = 1000 pour schema, = 10000 pour PCB - + int m_UnitType; // Internal Unit type (0 = inch) bool m_Draw_Axis; // TRUE pour avoir les axes dessines bool m_Draw_Grid; // TRUE pour avoir la grille dessinee @@ -235,8 +239,8 @@ public: const wxPoint& pos, const wxSize& size ); ~WinEDA_DrawFrame(); - - BASE_SCREEN* GetScreen() { return m_CurrentScreen; } + + BASE_SCREEN* GetScreen() { return m_CurrentScreen; } void OnMenuOpen( wxMenuEvent& event ); void OnMouseEvent( wxMouseEvent& event ); @@ -244,6 +248,7 @@ public: void AddFontSelectionMenu( wxMenu* main_menu ); void ProcessFontPreferences( wxCommandEvent& event ); + void Affiche_Message( const wxString& message ); void EraseMsgBox(); void Process_PageSettings( wxCommandEvent& event ); @@ -339,10 +344,10 @@ public: bool m_DisplayPcbTrackFill; /* FALSE = sketch , TRUE = rempli */ WinEDA3D_DrawFrame* m_Draw3DFrame; -protected: +protected: GENERAL_COLLECTOR* m_Collector; - - + + public: WinEDA_BasePcbFrame( wxWindow* father, WinEDA_App* parent, int idtype, const wxString& title, @@ -361,7 +366,7 @@ public: virtual void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ) = 0; virtual void ReCreateMenuBar(); - PCB_SCREEN* GetScreen() { return (PCB_SCREEN*) m_CurrentScreen; } + PCB_SCREEN* GetScreen() { return (PCB_SCREEN*) m_CurrentScreen; } int BestZoom(); // Retourne le meilleur zoom void Show3D_Frame( wxCommandEvent& event ); @@ -377,39 +382,40 @@ private: virtual void GetComponentFromUndoList(); virtual void GetComponentFromRedoList(); - -public: - // Read/write fonctions: - EDA_BaseStruct* ReadDrawSegmentDescr( FILE* File, int* LineNum ); - int ReadListeSegmentDescr( wxDC* DC, FILE* File, - TRACK* PtSegm, int StructType, - int* LineNum, int NumSegm ); - int ReadSetup( FILE* File, int* LineNum ); - int ReadGeneralDescrPcb( wxDC* DC, FILE* File, int* LineNum ); +public: + + // Read/write fonctions: + EDA_BaseStruct* ReadDrawSegmentDescr( FILE* File, int* LineNum ); + int ReadListeSegmentDescr( wxDC* DC, FILE* File, + TRACK* PtSegm, int StructType, + int* LineNum, int NumSegm ); + + int ReadSetup( FILE* File, int* LineNum ); + int ReadGeneralDescrPcb( wxDC* DC, FILE* File, int* LineNum ); // Gestion du PCB - bool Clear_Pcb( wxDC* DC, bool query ); - + bool Clear_Pcb( wxDC* DC, bool query ); + /** * Function PcbGeneralLocateAndDisplay * searches for an item under the mouse cursor. * Items are searched first on the current working layer. * If nothing found, an item will be searched without layer restriction. If * more than one item is found meeting the current working layer criterion, then - * a popup menu is shown which allows the user to pick which item he/she is + * a popup menu is shown which allows the user to pick which item he/she is * interested in. Once an item is chosen, then it is make the "current item" * and the status window is updated to reflect this. * * @param aHotKeyCode The hotkey which relates to the caller and determines the - * type of search to be performed. If zero, then the mouse tools will be + * type of search to be performed. If zero, then the mouse tools will be * tested instead. */ - BOARD_ITEM* PcbGeneralLocateAndDisplay( int aHotKeyCode = 0 ); - - BOARD_ITEM* Locate( int typeloc, int LayerSearch ); - void ProcessItemSelection( wxCommandEvent& event ); - + BOARD_ITEM* PcbGeneralLocateAndDisplay( int aHotKeyCode = 0 ); + + BOARD_ITEM* Locate( int typeloc, int LayerSearch ); + void ProcessItemSelection( wxCommandEvent& event ); + /** * Function SetCurItem * sets the currently selected item and displays it in the MsgPanel. @@ -419,18 +425,18 @@ public: * of selecting an item to displaying it using BOARD_ITEM::Display_Infos(). * @param aItem The BOARD_ITEM to make the selected item or NULL if none. */ - void SetCurItem( BOARD_ITEM* aItem ); - BOARD_ITEM* GetCurItem(); - + void SetCurItem( BOARD_ITEM* aItem ); + BOARD_ITEM* GetCurItem(); + /** * Function GetCollectorsGuide * @return GENERAL_COLLECTORS_GUIDE - that considers the global configuration options. */ - GENERAL_COLLECTORS_GUIDE GetCollectorsGuide(); - + GENERAL_COLLECTORS_GUIDE GetCollectorsGuide(); + // Gestion du curseur - void place_marqueur( wxDC* DC, const wxPoint& pos, char* pt_bitmap, - int DrawMode, int color, int type ); + void place_marqueur( wxDC* DC, const wxPoint& pos, char* pt_bitmap, + int DrawMode, int color, int type ); /* Place un repere sur l'ecran au point de coordonnees PCB pos */ @@ -480,11 +486,11 @@ public: // Chargement de modules MODULE* Get_Librairie_Module( wxWindow* winaff, const wxString& library, const wxString& ModuleName, bool show_msg_err ); - + wxString Select_1_Module_From_List( WinEDA_DrawFrame* active_window, const wxString& Library, const wxString& Mask, const wxString& KeyWord ); - + MODULE* Load_Module_From_Library( const wxString& library, wxDC* DC ); // Gestion des chevelus (ratsnest) @@ -497,7 +503,7 @@ public: void DrawGeneralRatsnest( wxDC* DC, int net_code = 0 ); void trace_ratsnest_pad( wxDC* DC ); void recalcule_pad_net_code();/* Routine de - * calcul et de mise a jour des net_codes des PADS */ + * calcul et de mise a jour des net_codes des PADS */ void build_liste_pads(); int* build_ratsnest_pad( EDA_BaseStruct* ref, const wxPoint& refpos, bool init ); @@ -540,7 +546,7 @@ public: // divers void AddHistory( int value, KICAD_T type ); // Add value in data list history void InstallGridFrame( const wxPoint& pos ); - + DECLARE_EVENT_TABLE() }; @@ -550,7 +556,6 @@ public: /*****************************************************/ class WinEDA_PcbFrame : public WinEDA_BasePcbFrame { - public: WinEDAChoiceBox* m_SelLayerBox; WinEDAChoiceBox* m_SelTrackWidthBox; @@ -561,13 +566,13 @@ private: bool m_SelViaSizeBox_Changed; wxMenu* m_FilesMenu; - // we'll use lower case function names for private member functions. - void createPopUpMenuForFootprints( MODULE* aModule, wxMenu* aPopMenu ); - void createPopUpMenuForFpTexts( TEXTE_MODULE* aText, wxMenu* aPopMenu ); - void createPopUpMenuForFpPads( D_PAD* aPad, wxMenu* aPopMenu ); - void createPopupMenuForTracks( TRACK* aTrack, wxMenu* aPopMenu ); - void createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu ); - void createPopUpBlockMenu( wxMenu* menu ); + // we'll use lower case function names for private member functions. + void createPopUpMenuForFootprints( MODULE* aModule, wxMenu* aPopMenu ); + void createPopUpMenuForFpTexts( TEXTE_MODULE* aText, wxMenu* aPopMenu ); + void createPopUpMenuForFpPads( D_PAD* aPad, wxMenu* aPopMenu ); + void createPopupMenuForTracks( TRACK* aTrack, wxMenu* aPopMenu ); + void createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu ); + void createPopUpBlockMenu( wxMenu* menu ); public: WinEDA_PcbFrame( wxWindow* father, WinEDA_App* parent, const wxString& title, @@ -584,7 +589,7 @@ public: void OnCloseWindow( wxCloseEvent& Event ); void Process_Special_Functions( wxCommandEvent& event ); - + void ProcessMuWaveFunctions( wxCommandEvent& event ); void MuWaveCommand( wxDC* DC, const wxPoint& MousePos ); @@ -599,7 +604,7 @@ public: void PrepareLayerIndicator(); void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); - + /** * Function OnRightClick * populates a popup menu with the choices appropriate for the current context. @@ -608,7 +613,7 @@ public: * @param aPopMenu The menu to add to. */ void OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ); - + void OnSelectOptionToolbar( wxCommandEvent& event ); void ToolOnRightClick( wxCommandEvent& event ); @@ -822,8 +827,7 @@ public: EDA_BaseStruct* GerberGeneralLocateAndDisplay(); EDA_BaseStruct* Locate( int typeloc ); - - + void SetToolbars(); void Process_Settings( wxCommandEvent& event ); @@ -989,7 +993,6 @@ enum fl_rot_cmp { CMP_ORIENT_270, // orientation -90, pas de miroir CMP_MIROIR_X = 0x100, // miroir selon axe X CMP_MIROIR_Y = 0x200 // miroir selon axe Y - }; class WinEDA_SchematicFrame : public WinEDA_DrawFrame @@ -1006,34 +1009,43 @@ public: ~WinEDA_SchematicFrame(); - void OnCloseWindow( wxCloseEvent& Event ); - void Process_Special_Functions( wxCommandEvent& event ); - void Process_Config( wxCommandEvent& event ); - void Save_Config( wxWindow* displayframe ); + void OnCloseWindow( wxCloseEvent& Event ); + void Process_Special_Functions( wxCommandEvent& event ); + void Process_Config( wxCommandEvent& event ); + void Save_Config( wxWindow* displayframe ); - void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); - void ReCreateHToolbar(); - void ReCreateVToolbar(); - void ReCreateOptToolbar(); - void ReCreateMenuBar(); - void SetToolbars(); - void OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct ); + void ReCreateHToolbar(); + void ReCreateVToolbar(); + void ReCreateOptToolbar(); + void ReCreateMenuBar(); + void SetToolbars(); + void OnHotKey( wxDC* DC, + int hotkey, + EDA_BaseStruct* DrawStruct ); SCH_SCREEN* GetScreen() { return (SCH_SCREEN*) m_CurrentScreen; } - void InstallConfigFrame( const wxPoint& pos ); + void InstallConfigFrame( const wxPoint& pos ); - void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); - void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); - void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); - void OnSelectOptionToolbar( wxCommandEvent& event ); - void ToolOnRightClick( wxCommandEvent& event ); - int BestZoom(); // Retourne le meilleur zoom + void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); + void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); + void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); + void OnSelectOptionToolbar( wxCommandEvent& event ); + void ToolOnRightClick( wxCommandEvent& event ); + int BestZoom(); // Retourne le meilleur zoom - EDA_BaseStruct* SchematicGeneralLocateAndDisplay( bool IncludePin = TRUE ); - EDA_BaseStruct* SchematicGeneralLocateAndDisplay( const wxPoint& refpoint, - bool IncludePin ); + EDA_BaseStruct* SchematicGeneralLocateAndDisplay( + bool IncludePin = TRUE ); + EDA_BaseStruct* SchematicGeneralLocateAndDisplay( + const wxPoint& refpoint, + bool IncludePin ); + EDA_BaseStruct* WinEDA_SchematicFrame:: FindComponentAndItem( + const wxString& component_reference, bool Find_in_hierarchy, + int SearchType, + const wxString& text_to_find, + bool mouseWarp ); /* netlist generation */ void* BuildNetListBase(); @@ -1053,6 +1065,7 @@ public: bool LoadOneSheet( SCH_SCREEN* screen, const wxString& FullFileName ); // General search: + /** * Function FindSchematicItem * finds a string in the schematic. @@ -1062,8 +1075,10 @@ public: * 2 => or for the next item * @param mouseWarp If true, then move the mouse cursor to the item. */ - EDA_BaseStruct* FindSchematicItem( const wxString& pattern, int SearchType, bool mouseWarp=true ); - + EDA_BaseStruct* FindSchematicItem( const wxString& pattern, + int SearchType, + bool mouseWarp = true ); + EDA_BaseStruct* FindMarker( int SearchType ); private: @@ -1198,19 +1213,20 @@ public: ~WinEDA_LibeditFrame(); - void Process_Special_Functions( wxCommandEvent& event ); - void DisplayLibInfos(); - void RedrawActiveWindow( wxDC* DC, bool EraseBg ); - void OnCloseWindow( wxCloseEvent& Event ); - void ReCreateHToolbar(); - void ReCreateVToolbar(); - void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); - void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); - int BestZoom(); // Retourne le meilleur zoom - void SetToolbars(); - void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); + void Process_Special_Functions( wxCommandEvent& event ); + void DisplayLibInfos(); + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + void OnCloseWindow( wxCloseEvent& Event ); + void ReCreateHToolbar(); + void ReCreateVToolbar(); + void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); + void OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); + int BestZoom(); // Retourne le meilleur zoom + void SetToolbars(); + void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); + SCH_SCREEN* GetScreen() { return (SCH_SCREEN*) m_CurrentScreen; } - void OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct ); + void OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct ); private: @@ -1584,13 +1600,13 @@ public: const wxChar** m_ItemList; private: - void (*m_MoveFct)(wxString & Text); + void (*m_MoveFct)( wxString & Text ); public: WinEDAListBox( WinEDA_DrawFrame* parent, const wxString& title, const wxChar** ItemList, const wxString& RefText, - void (* movefct)(wxString& Text) = NULL, + void(* movefct)(wxString& Text) = NULL, const wxColour& colour = wxNullColour, wxPoint dialog_position = wxDefaultPosition ); ~WinEDAListBox(); diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index a73b2c8f0d..8df9625896 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -17,23 +17,26 @@ #include "bitmaps.h" -/****************************************/ -void RemoteCommand( const char* cmdline ) -/****************************************/ +/*******************************************/ +void RemoteCommand( const char* cmdline ) +/*******************************************/ -/* Read a remote command send by eeschema via a socket, +/** Read a remote command send by eeschema via a socket, * port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) + * @param cmdline = received command from eeschema + * Commands are + * $PART: "reference" put cursor on component + * $PIN: "pin name" $PART: "reference" put cursor on the footprint pin */ { char line[1024]; wxString msg; char* idcmd; char* text; - WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; MODULE* module = 0; + WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; strncpy( line, cmdline, sizeof(line) - 1 ); - msg = CONV_FROM_UTF8( line ); idcmd = strtok( line, " \n\r" ); text = strtok( NULL, " \n\r" ); @@ -104,6 +107,7 @@ void RemoteCommand( const char* cmdline ) msg.Printf( _( "Pin %s (module %s) not found" ), pinName.GetData(), modName.GetData() ); else msg.Printf( _( "Locate Pin %s (module %s)" ), pinName.GetData(), modName.GetData() ); + frame->Affiche_Message( msg ); } @@ -180,9 +184,9 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) break; default: - scanList = DisplayOpt.DisplayZones ? - GENERAL_COLLECTOR::AllBoardItems : - GENERAL_COLLECTOR::AllButZones; + scanList = DisplayOpt.DisplayZones ? + GENERAL_COLLECTOR::AllBoardItems : + GENERAL_COLLECTOR::AllButZones; break; } } @@ -203,31 +207,33 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) break; default: - scanList = DisplayOpt.DisplayZones ? - GENERAL_COLLECTOR::AllBoardItems : - GENERAL_COLLECTOR::AllButZones; + scanList = DisplayOpt.DisplayZones ? + GENERAL_COLLECTOR::AllBoardItems : + GENERAL_COLLECTOR::AllButZones; } } m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide ); -#if 0 +#if 0 + // debugging: print out the collected items, showing their priority order too. - for( int i=0; iGetCount(); ++i ) + for( int i = 0; iGetCount(); ++i ) (*m_Collector)[i]->Show( 0, std::cout ); -#endif + +#endif /* Remove redundancies: most of time, zones are found twice, * because zones are filled twice ( once by by horizontal and once by vertical segments ) */ unsigned long timestampzone = 0; - + for( int ii = 0; ii < m_Collector->GetCount(); ii++ ) { item = (*m_Collector)[ii]; if( item->Type() != TYPEZONE ) continue; - + /* Found a TYPE ZONE */ if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found { @@ -243,22 +249,21 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) item = (*m_Collector)[0]; SetCurItem( item ); } - // If the count is 2, and first item is a pad or moduletext, and the 2nd item is its parent module: else if( m_Collector->GetCount() == 2 - && ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == TYPETEXTEMODULE ) - && (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()== (*m_Collector)[1] ) + && ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == + TYPETEXTEMODULE ) + && (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()== + (*m_Collector)[1] ) { item = (*m_Collector)[0]; SetCurItem( item ); } - // if all are modules, find the smallest one amoung the primary choices else if( ( item = AllAreModulesAndReturnSmallestIfSo( m_Collector ) ) != NULL ) { SetCurItem( item ); } - else // we can't figure out which item user wants, do popup menu so user can choose { wxMenu itemMenu; @@ -281,12 +286,12 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) } /* @todo: rather than assignment to TRUE, these should be increment and decrement operators throughout _everywhere_. - That way we can handle nesting. - But I tried that and found there cases where the assignment to TRUE (converted to a m_IgnoreMouseEvents++ ) - was not balanced with the -- (now m_IgnoreMouseEvents=FALSE), so I had to revert. - Somebody should track down these and make them balanced. - DrawPanel->m_IgnoreMouseEvents = TRUE; - */ + * That way we can handle nesting. + * But I tried that and found there cases where the assignment to TRUE (converted to a m_IgnoreMouseEvents++ ) + * was not balanced with the -- (now m_IgnoreMouseEvents=FALSE), so I had to revert. + * Somebody should track down these and make them balanced. + * DrawPanel->m_IgnoreMouseEvents = TRUE; + */ // this menu's handler is void WinEDA_BasePcbFrame::ProcessItemSelection() // and it calls SetCurItem() which in turn calls Display_Infos() on the item. diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index e5ad7ce315..09b9ec2966 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -53,7 +53,7 @@ static void Affiche_Erreur_DRC( WinEDA_DrawPanel* panel, wxDC* DC, /*******************************************/ -/* Frame d'option et execution DRC general */ +/* function relatives to the DRC control */ /*******************************************/ #include "dialog_drc.cpp" @@ -206,10 +206,7 @@ void WinEDA_DrcFrame::DelDRCMarkers( wxCommandEvent& event ) void WinEDA_PcbFrame::Install_Test_DRC_Frame( wxDC* DC ) /******************************************************/ -/* Test des isolements : teste les isolements des pistes et place un - * marqueur sur les divers segments en defaut - * Principe: - * Appelle la routine drc() pour chaque segment de piste existant +/* install a dialog box to handle the general DRC control */ { AbortDrc = FALSE; @@ -223,10 +220,9 @@ void WinEDA_PcbFrame::Install_Test_DRC_Frame( wxDC* DC ) int WinEDA_PcbFrame::Test_DRC( wxDC* DC, bool TestPad2Pad, bool TestZone ) /************************************************************************/ -/* Test des isolements : teste les isolements des pistes et place un - * marqueur sur les divers segments en defaut - * Principe: - * Appelle la routine drc() pour chaque segment de piste existant +/* Test DRC : + * Run a drc control for each pad and track segment + * Put a marker on pad or track end which have a drc problem */ { int ii, jj, old_net; @@ -253,10 +249,10 @@ int WinEDA_PcbFrame::Test_DRC( wxDC* DC, bool TestPad2Pad, bool TestZone ) m_CurrentScreen->SetRefreshReq(); - /* Effacement des anciens marqueurs */ + /* Delete previous markers */ Erase_Marqueurs(); - if( TestPad2Pad ) /* Test DRC des pads entre eux */ + if( TestPad2Pad ) /* First test: Test DRC between pads (no track)*/ { Line.Printf( wxT( "%d" ), m_Pcb->m_NbPads ); Affiche_1_Parametre( this, PRINT_NB_PAD_POS, wxT( "NbPad" ), Line, RED ); @@ -373,7 +369,7 @@ int WinEDA_PcbFrame::Test_DRC( wxDC* DC, bool TestPad2Pad, bool TestZone ) } } - /* Test zone segments segments */ + /* Test zone segments */ if( TestZone ) { m_Pcb->m_NbSegmZone = 0; @@ -494,15 +490,12 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, TRACK* pt_segment, TRACK* StartBuffer, int show_err ) /***********************************************************************/ -/* - * Teste le segment en cours de trace: - * pt_segment = pointeur sur segment a controler - * StartBuffer = adresse de la zone des pistes a controler - * (typiquement m_Pcb->m_Track) - * show_err (flag) si 0 pas d'affichage d'erreur sur ecran - * retourne : - * BAD_DRC (1) si Violation DRC - * OK_DRC (0) si OK +/** + * Test the current segment: + * @param pt_segment = current segment to test + * @param StartBuffer = track buffer to test (usually m_Pcb->m_Track) + * @param show_err (flag) si 0 pas d'affichage d'erreur sur ecran + * @return : BAD_DRC (1) if DRC error or OK_DRC (0) if OK */ { int ii; @@ -526,31 +519,34 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, net_code_ref = pt_segment->m_NetCode; segm_angle = 0; + /* for a non horizontal or vertical segment Compute the segment angle + in 0,1 degrees and its lenght */ if( dx || dy ) { - /* calcul de l'angle d'inclinaison en 0,1 degre */ + /* Compute the segment angle in 0,1 degrees */ segm_angle = ArcTangente( dy, dx ); - /* Calcul de la longueur du segment en segm_long : dx = longueur */ - RotatePoint( &dx, &dy, segm_angle ); /* segm_long = longueur, yf = 0 */ + /* Compute the segment lenght: we build an equivalent rotated segment, + this segment is horizontal, therefore dx = lenght */ + RotatePoint( &dx, &dy, segm_angle ); /* dx = lenght, dy = 0 */ } - /* Ici le segment a ete tourne de segm_angle, et est horizontal, dx > 0 */ segm_long = dx; /******************************************/ /* Phase 1 : test DRC track to pads :*/ /******************************************/ - /* calcul de la distance min aux pads : */ + /* Compute the min distance to pads : */ w_dist = (unsigned) (pt_segment->m_Width >> 1 ); for( ii = 0; ii < frame->m_Pcb->m_NbPads; ii++ ) { D_PAD* pt_pad = frame->m_Pcb->m_Pads[ii]; - /* Pas de probleme si les pads sont en surface autre que la couche, - * sauf si le trou de percage gene (cas des pastilles perc�s simple - * face sur CI double face */ + /* No problem if pads are on an other layer, + * But if a drill hole exists (a pad on a single layer can have a hole!) + * we must test the hole + */ if( (pt_pad->m_Masque_Layer & MaskLayer ) == 0 ) { /* We must test the pad hole. In order to use the function "TestClearanceSegmToPad", @@ -579,9 +575,10 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, continue; } - /* Le pad doit faire partie d'un net mais pas de probleme - * si le pad est du meme net */ - if( /*pt_pad->m_NetCode &&*/ net_code_ref == pt_pad->m_NetCode ) + /* The pad must be in a net (i.e pt_pad->m_NetCode != 0 ) + * but no problem if the pad netcode is the current netcode (same net) */ + if( pt_pad->m_NetCode && // the pad must be connected + net_code_ref == pt_pad->m_NetCode ) // the pad net is the same as current net -> Ok continue; /* Test DRC pour les pads */ @@ -591,7 +588,7 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, if( TestClearanceSegmToPad( pt_pad, w_dist, g_DesignSettings.m_TrackClearence ) == OK_DRC ) continue; - /* extremite sur pad ou defaut d'isolation trouve */ + /* Drc error found! */ else { ErrorsDRC_Count++; @@ -603,20 +600,20 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, } /**********************************************/ - /* Phase 2 : test DRC avec les autres pistes :*/ + /* Phase 2: test DRC with other track segments */ /**********************************************/ - /* Ici le segment de reference est sur l'axe X */ + /* At this point the reference segment is the X axis */ - /* Comparaison du segment de reference aux autres segments de piste */ + /* Test the reference segment with other track segments */ pttrack = StartBuffer; for( ; pttrack != NULL; pttrack = (TRACK*) pttrack->Pnext ) { - //pas de probleme si le segment a tester est du meme net: + //No problem if segments have the meme net code: if( net_code_ref == pttrack->m_NetCode ) continue; - //pas de probleme si le segment a tester est sur une autre couche : + // No problem if segment are on different layers : if( ( MaskLayer & pttrack->ReturnMaskLayer() ) == 0 ) continue; @@ -626,7 +623,7 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, w_dist += pttrack->m_Width >> 1; w_dist += g_DesignSettings.m_TrackClearence; - /* si le segment de reference est une via, le traitement est ici */ + /* If the reference segment is a via, we test it here */ if( pt_segment->Type() == TYPEVIA ) { int orgx, orgy; // origine du repere d'axe X = segment a comparer @@ -650,12 +647,12 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, return BAD_DRC; } } - else /* Tst distance de via a segment */ + else /* Tst drc via / segment */ { - /* calcul de l'angle */ + /* Compute l'angle */ angle = ArcTangente( dy, dx ); - /* Calcul des coord dans le nouveau repere */ + /* Compute new coordinates ( the segment become horizontal) */ RotatePoint( &dx, &dy, angle ); RotatePoint( &x0, &y0, angle ); @@ -675,8 +672,10 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, continue; } - /* calcule x0,y0, xf,yf = coord de debut et fin du segment de piste - * a tester, dans le repere axe X = segment de reference */ + /* We compute x0,y0, xf,yf = starting and ending point coordinates for the segment to test + * in the new axis : the new X axis is the reference segment + * We must translate and rotate the segment to test + */ x0 = pttrack->m_Start.x - org_X; y0 = pttrack->m_Start.y - org_Y; @@ -697,20 +696,20 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, } - /* - * le segment de reference est Horizontal, par suite des modifs d'axe. - * 3 cas : segment a comparer parallele, perp ou incline + /* We have changed axis: + * the reference segment is Horizontal. + * 3 cases : the segment to test can be parallel, perpendicular or have an other direction */ - if( y0 == yf ) // segments paralleles + if( y0 == yf ) // parallel segments { if( abs( y0 ) >= w_dist ) continue; if( x0 > xf ) EXCHG( x0, xf ); /* pour que x0 <= xf */ - if( x0 > (-w_dist) && x0 < (segm_long + w_dist) ) /* Risque de defaut */ + if( x0 > (-w_dist) && x0 < (segm_long + w_dist) ) /* possible error drc */ { - /* test fin tenant compte des formes arrondies des extremites */ + /* Fine test : we consider the rounded shape of the ends */ if( x0 >= 0 && x0 <= segm_long ) { ErrorsDRC_Count++; @@ -738,7 +737,7 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, } if( xf > (-w_dist) && xf < (segm_long + w_dist) ) { - /* test fin tenant compte des formes arrondies des extremites */ + /* Fine test : we consider the rounded shape of the ends */ if( xf >= 0 && xf <= segm_long ) { ErrorsDRC_Count++; @@ -773,12 +772,12 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, return BAD_DRC; } } - else if( x0 == xf ) // segments perpendiculaires + else if( x0 == xf ) // perpendicular segments { if( ( x0 <= (-w_dist) ) || ( x0 >= (segm_long + w_dist) ) ) continue; - /* test si les segments se croisent */ + /* Test is segments are crossing */ if( y0 > yf ) EXCHG( y0, yf ); if( (y0 < 0) && (yf > 0) ) @@ -789,8 +788,7 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, return BAD_DRC; } - /* ici l'erreur est due a une extremite pres d'une extremite du segm - * de reference */ + /* At this point the drc error is due to an end near a reference segm end */ if( TestMarginToCircle( x0, y0, w_dist, segm_long ) == BAD_DRC ) { ErrorsDRC_Count++; @@ -810,17 +808,17 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, { int bflag = OK_DRC; /* calcul de la "surface de securite du segment de reference */ - /* premiere passe : la piste est assimilee a un rectangle */ + /* First rought 'and fast) test : the track segment is like a rectangle */ xcliplo = ycliplo = -w_dist; xcliphi = segm_long + w_dist; ycliphi = w_dist; bflag = Tst_Ligne( x0, y0, xf, yf ); - if( bflag == BAD_DRC ) + if( bflag == BAD_DRC ) /* A fine test is needed because a serment is not exactly a rectangle + it has rounded ends */ { - /* 2eme passe : la piste a des extremites arrondies. - * Si le defaut de drc est du a une extremite : le calcul - * est affine pour tenir compte de cet arrondi */ + /* 2eme passe : the track has rounded ends. + * we must a fine test for each rounded end and the rectangular zone */ xcliplo = 0; xcliphi = segm_long; bflag = Tst_Ligne( x0, y0, xf, yf ); @@ -837,9 +835,9 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, 9 ); return BAD_DRC; } - else // L'erreur est due a une extremite du segment de reference: + else // The drc error is due to the starting or the ending point of the reference segment { - // il faut tester les extremites de ce segment + // Test the starting and the ending point int angle, rx0, ry0, rxf, ryf; x0 = pttrack->m_Start.x; y0 = pttrack->m_Start.y; @@ -850,14 +848,14 @@ int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC, dx = xf - x0; dy = yf - y0; - /* calcul de l'angle d'inclinaison en 0,1 degre */ + /* Compute the segment orientation (angle) en 0,1 degre */ angle = ArcTangente( dy, dx ); - /* Calcul de la longueur du segment: dx = longueur */ + /* Compute the segment lenght: dx = longueur */ RotatePoint( &dx, &dy, angle ); - /* calcul des coord du segment de reference ds le repere - * d'axe X = segment courant en tst */ + /* Comute the reference segment coordinates relatives to a + * X axis = current tested segment */ rx0 = pt_segment->m_Start.x - x0; ry0 = pt_segment->m_Start.y - y0; rxf = pt_segment->m_End.x - x0; @@ -908,9 +906,14 @@ static bool Test_Pad_to_Pads_Drc( WinEDA_BasePcbFrame* frame, bool show_err ) /*****************************************************************************/ -/* Teste l'isolation de pad_ref avec les autres pads. - * end_buffer = upper limit of the pad list. - * max_size = size of the biggest pad (used to stop the test when the X distance is > max_size) +/** Test the drc between pad_ref and other pads. + * the pad list must be sorted by x coordinate + * @param frame = current active frame + * @param DC = current DC + * @param pad_ref = pad to test + * @param end_buffer = upper limit of the pad list. + * @param max_size = size of the biggest pad (used to stop the test when the X distance is > max_size) + * @param show_err if true, display a marker and amessage. */ { int MaskLayer; @@ -931,24 +934,24 @@ static bool Test_Pad_to_Pads_Drc( WinEDA_BasePcbFrame* frame, if( pad->m_Pos.x > x_limite ) break; - /* Pas de probleme si les pads ne sont pas sur les memes couches cuivre*/ + /* No probleme if pads are on different copper layers */ if( (pad->m_Masque_Layer & MaskLayer ) == 0 ) continue; - /* Le pad doit faire partie d'un net, - * mais pas de probleme si les pads sont du meme net */ + /* The pad must be in a net (i.e pt_pad->m_NetCode != 0 ), + * But noe probleme if pads have the same netcode (same net)*/ if( pad->m_NetCode && (pad_ref->m_NetCode == pad->m_NetCode) ) continue; - /* pas de pb si les pads sont du meme module et - * de la meme reference ( pads multiples ) */ + /* No proble if pads are from the same footprint + * and have the same pad number ( equivalent pads ) */ if( (pad->m_Parent == pad_ref->m_Parent) && (pad->m_NumPadName == pad_ref->m_NumPadName) ) continue; if( Pad_to_Pad_Isol( pad_ref, pad, g_DesignSettings.m_TrackClearence ) == OK_DRC ) continue; - else /* defaut d'isolation trouve */ + else /* here we have a drc error! */ { ErrorsDRC_Count++; if( show_err ) diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index ab0da2a50c..d104acd946 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -15,36 +15,78 @@ #include "eda_dde.h" - static void Process_Move_Item( WinEDA_PcbFrame* frame, EDA_BaseStruct* DrawStruct, wxDC* DC ); // see wxstruct.h +/**************************************************************************/ void WinEDA_PcbFrame::SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ) +/**************************************************************************/ +/** Send a remote command to eeschema via a socket, + * @param objectToSync = item to be located on schematic (module, pin or text) + * Commands are + * $PART: "reference" put cursor on component anchor + * $PART: "reference" $PAD: "pad number" put cursor on the component pin + * $PART: "reference" $REF: "reference" put cursor on the component ref + * $PART: "reference" $VAL: "value" put cursor on the component value + */ { - char cmd[1024]; - MODULE* module = NULL; - - if ( objectToSync == NULL ) + char cmd[1024]; + const char* text_key; + MODULE* module = NULL; + D_PAD* pad; + TEXTE_MODULE* text_mod; + wxString msg; + + if( objectToSync == NULL ) return; - if( objectToSync->Type() == TYPEMODULE ) + switch( objectToSync->Type() ) + { + case TYPEMODULE: module = (MODULE*) objectToSync; - else if( objectToSync->Type() == TYPEPAD ) - module = (MODULE*) objectToSync->GetParent(); - else if( objectToSync->Type() == TYPETEXTEMODULE ) - module = (MODULE*) objectToSync->GetParent(); + sprintf( cmd, "$PART: \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ) ); + break; + + case TYPEPAD: + module = (MODULE*) objectToSync->m_Parent; + pad = (D_PAD*) objectToSync; + msg = pad->ReturnStringPadName(); + sprintf( cmd, "$PART: \"%s\" $PAD: \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ), + CONV_TO_UTF8( msg ) ); + break; + + case TYPETEXTEMODULE: + #define REFERENCE 0 + #define VALUE 1 + module = (MODULE*) objectToSync->m_Parent; + text_mod = (TEXTE_MODULE*) objectToSync; + if( text_mod->m_Type == REFERENCE ) + text_key = "$REF:"; + else if( text_mod->m_Type == VALUE ) + text_key = "$VAL:"; + else + break; + + sprintf( cmd, "$PART: \"%s\" %s \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ), + text_key, + CONV_TO_UTF8( text_mod->m_Text ) ); + break; + + default: + break; + } - // ask only for the reference for now, maybe pins later. if( module ) { - sprintf( cmd, "$PART: %s", CONV_TO_UTF8(module->m_Reference->m_Text) ); SendCommand( MSG_TO_SCH, cmd ); } } - /*********************************************************************/ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) /*********************************************************************/ @@ -59,7 +101,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->CursorOff( &dc ); DrawPanel->PrepareGraphicContext( &dc ); - + wxGetMousePosition( &pos.x, &pos.y ); pos.y += 20; @@ -189,12 +231,12 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_OPEN_MODULE_EDITOR: if( m_Parent->m_ModuleEditFrame == NULL ) { - m_Parent->m_ModuleEditFrame = + m_Parent->m_ModuleEditFrame = new WinEDA_ModuleEditFrame( this, - m_Parent, _( "Module Editor" ), - wxPoint( -1, - -1 ), - wxSize( 600, 400 ) ); + m_Parent, _( "Module Editor" ), + wxPoint( -1, + -1 ), + wxSize( 600, 400 ) ); m_Parent->m_ModuleEditFrame->Show( TRUE ); m_Parent->m_ModuleEditFrame->Zoom_Automatique( TRUE ); } @@ -262,6 +304,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_GET_TOOLS: + // InstalloolsFrame(this, wxPoint(-1,-1) ); break; @@ -336,6 +379,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_END_LINE: DrawPanel->MouseToCursorSchema(); + // EndSegment(&dc); break; @@ -519,7 +563,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) // If the current Item is a pad, text module ...: Get the parent if( GetCurItem()->Type() != TYPEMODULE ) SetCurItem( GetCurItem()->GetParent() ); - + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; if( Delete_Module( (MODULE*) GetCurItem(), &dc ) ) @@ -534,7 +578,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) // If the current Item is a pad, text module ...: Get the parent if( GetCurItem()->Type() != TYPEMODULE ) SetCurItem( GetCurItem()->GetParent() ); - + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; Rotate_Module( &dc, (MODULE*) GetCurItem(), -900, TRUE ); @@ -564,6 +608,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_EDIT_MODULE: + // If the current Item is a pad, text module ...: Get the parent if( GetCurItem()->Type() != TYPEMODULE ) SetCurItem( GetCurItem()->GetParent() ); @@ -624,7 +669,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_DELETE_TEXTMODULE: - DeleteTextModule( (TEXTE_MODULE*) GetCurItem(), &dc ); + DeleteTextModule( (TEXTE_MODULE*) GetCurItem(), &dc ); SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; @@ -752,7 +797,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) ) { SetCurItem( Del_SegmEdgeZone( &dc, - (EDGE_ZONE*) GetCurItem() ) ); + (EDGE_ZONE*) GetCurItem() ) ); } break; @@ -931,6 +976,7 @@ static void Process_Move_Item( WinEDA_PcbFrame* frame, } } + /***************************************************************/ void WinEDA_PcbFrame::RemoveStruct( EDA_BaseStruct* Item, wxDC* DC ) /***************************************************************/ @@ -987,7 +1033,7 @@ void WinEDA_PcbFrame::RemoveStruct( EDA_BaseStruct* Item, wxDC* DC ) { wxString Line; Line.Printf( wxT( "Remove: StructType %d Inattendu" ), - Item->Type() ); + Item->Type() ); DisplayError( this, Line ); } break; diff --git a/share/drawframe.cpp b/share/drawframe.cpp index 4e2d46993b..8ed10f4842 100644 --- a/share/drawframe.cpp +++ b/share/drawframe.cpp @@ -56,7 +56,7 @@ WinEDA_DrawFrame::WinEDA_DrawFrame( wxWindow* father, int idtype, DrawPanel = NULL; MsgPanel = NULL; m_CurrentScreen = NULL; - m_MenuBar = NULL; // menu du haut d'ecran + m_MenuBar = NULL; // main meun frame m_ID_current_state = 0; m_HTOOL_current_state = 0; m_Draw_Axis = FALSE; // TRUE pour avoir les axes dessines @@ -66,8 +66,8 @@ WinEDA_DrawFrame::WinEDA_DrawFrame( wxWindow* father, int idtype, m_Draw_Auxiliary_Axis = FALSE; // TRUE pour avoir les axes auxiliares dessines m_UnitType = INTERNAL_UNIT_TYPE; // Internal unit = inch - // nombre d'unites internes pour 1 pouce - // = 1000 pour schema, = 10000 pour PCB + // Internal units per inch + // = 1000 for schema, = 10000 for PCB m_InternalUnits = EESCHEMA_INTERNAL_UNIT; if( (m_Ident == PCB_FRAME) || (m_Ident == GERBER_FRAME) || (m_Ident == CVPCB_DISPLAY_FRAME) @@ -111,7 +111,7 @@ WinEDA_DrawFrame::WinEDA_DrawFrame( wxWindow* father, int idtype, WinEDA_DrawFrame::~WinEDA_DrawFrame() /****************************************/ { - if( DrawPanel ) // for WinEDA3D_DrawFrame DrawPanel == NULL ! + if( DrawPanel ) // Required: in WinEDA3D_DrawFrame, DrawPanel == NULL ! m_Parent->m_EDA_Config->Write( wxT( "AutoPAN" ), DrawPanel->m_AutoPAN_Enable ); } @@ -177,7 +177,7 @@ void WinEDA_DrawFrame::Affiche_Message( const wxString& message ) /**************************************************************/ /* - * Affiche un message en bas de l'ecran + * Dispaly the meesage on yhe bottomon the frame */ { SetStatusText( message ); @@ -216,40 +216,45 @@ void WinEDA_DrawFrame::OnMenuOpen( wxMenuEvent& event ) /*******************************************************/ -void WinEDA_DrawFrame::ReCreateAuxiliaryToolbar() // fonction virtuelle +void WinEDA_DrawFrame::ReCreateAuxiliaryToolbar() /*******************************************************/ +// Virtual function { } /********************************************/ -void WinEDA_DrawFrame::ReCreateMenuBar() // fonction virtuelle +void WinEDA_DrawFrame::ReCreateMenuBar() /********************************************/ +// Virtual function { } /****************************************************/ void WinEDA_DrawFrame::OnHotKey( wxDC* DC, int hotkey, - EDA_BaseStruct* DrawStruct ) // fonction virtuelle + EDA_BaseStruct* DrawStruct ) /****************************************************/ +// Virtual function { } /**************************************************************/ -void WinEDA_DrawFrame::ToolOnRightClick( wxCommandEvent& event ) // fonction virtuelle +void WinEDA_DrawFrame::ToolOnRightClick( wxCommandEvent& event ) /**************************************************************/ +// Virtual function { } /********************************************************/ -void WinEDA_DrawFrame::OnSelectGrid( wxCommandEvent& event ) // fonction virtuelle +void WinEDA_DrawFrame::OnSelectGrid( wxCommandEvent& event ) /********************************************************/ +// Virtual function { if( m_SelGridBox == NULL ) - return; //Ne devrait pas se produire! + return; // Should not occurs int id = m_SelGridBox->GetChoice(); if( id < 0 )