void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event ) { if( m_drawItem == NULL || m_drawItem->Type() != LIB_PIN_T ) return; STATUS_FLAGS item_flags = m_drawItem->GetFlags(); // save flags to restore them after editing LIB_PIN* pin = (LIB_PIN*) m_drawItem; DIALOG_LIB_EDIT_PIN dlg( this, pin ); wxString units = GetUnitsLabel( g_UserUnit ); dlg.SetDlgUnitsLabel( units ); dlg.SetOrientationList( LIB_PIN::GetOrientationNames(), LIB_PIN::GetOrientationSymbols() ); dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->GetOrientation() ) ); dlg.SetStyle( pin->GetShape() ); dlg.SetElectricalType( pin->GetType() ); dlg.SetPinName( pin->GetName() ); dlg.SetPinNameTextSize( StringFromValue( g_UserUnit, pin->GetNameTextSize() ) ); dlg.SetPinPositionX( StringFromValue( g_UserUnit, pin->GetPosition().x ) ); dlg.SetPinPositionY( StringFromValue( g_UserUnit, -pin->GetPosition().y ) ); dlg.SetPadName( pin->GetNumberString() ); dlg.SetPadNameTextSize( StringFromValue( g_UserUnit, pin->GetNumberTextSize() ) ); dlg.SetLength( StringFromValue( g_UserUnit, pin->GetLength() ) ); dlg.SetAddToAllParts( pin->GetUnit() == 0 ); dlg.SetAddToAllBodyStyles( pin->GetConvert() == 0 ); dlg.SetVisible( pin->IsVisible() ); /* This ugly hack fixes a bug in wxWidgets 2.8.7 and likely earlier * versions for the flex grid sizer in wxGTK that prevents the last * column from being sized correctly. It doesn't cause any problems * on win32 so it doesn't need to wrapped in ugly #ifdef __WXGTK__ * #endif. */ dlg.Layout(); dlg.Fit(); dlg.SetMinSize( dlg.GetSize() ); if( dlg.ShowModal() == wxID_CANCEL ) { if( pin->IsNew() ) { pin->SetFlags( IS_CANCELLED ); m_canvas->EndMouseCapture(); } return; } // Test the pin position validity: to avoid issues in schematic, // it must be on a 50 mils grid wxPoint pinpos; pinpos.x = ValueFromString( g_UserUnit, dlg.GetPinPositionX() ); pinpos.y = -ValueFromString( g_UserUnit, dlg.GetPinPositionY() ); const int acceptable_mingrid = 50; if( (pinpos.x % acceptable_mingrid) || (pinpos.y % acceptable_mingrid) ) { wxString msg; msg.Printf( _( "This pin is not on a %d mils grid\n" "It will be not easy to connect in schematic\n" "Do you want to continue?"), acceptable_mingrid ); if( !IsOK( this, msg ) ) return; } // Save the pin properties to use for the next new pin. LastPinNameSize = ValueFromString( g_UserUnit, dlg.GetPinNameTextSize() ); LastPinNumSize = ValueFromString( g_UserUnit, dlg.GetPadNameTextSize() ); LastPinOrient = LIB_PIN::GetOrientationCode( dlg.GetOrientation() ); LastPinLength = ValueFromString( g_UserUnit, dlg.GetLength() ); LastPinShape = dlg.GetStyle(); LastPinType = dlg.GetElectricalType(); LastPinCommonConvert = dlg.GetAddToAllBodyStyles(); LastPinCommonUnit = dlg.GetAddToAllParts(); LastPinVisible = dlg.GetVisible(); pin->EnableEditMode( true, m_editPinsPerPartOrConvert ); pin->SetName( dlg.GetPinName() ); pin->SetNameTextSize( GetLastPinNameSize() ); pin->SetNumber( dlg.GetPadName() ); pin->SetNumberTextSize( GetLastPinNumSize() ); pin->SetOrientation( LastPinOrient ); pin->SetLength( GetLastPinLength() ); pin->SetPinPosition( pinpos ); pin->SetType( LastPinType ); pin->SetShape( LastPinShape ); pin->SetConversion( ( LastPinCommonConvert ) ? 0 : m_convert ); pin->SetPartNumber( ( LastPinCommonUnit ) ? 0 : m_unit ); pin->SetVisible( LastPinVisible ); if( pin->IsModified() || pin->IsNew() ) { if( !pin->InEditMode() ) SaveCopyInUndoList( pin->GetParent() ); OnModify( ); MSG_PANEL_ITEMS items; pin->GetMsgPanelInfo( items ); SetMsgPanel( items ); m_canvas->Refresh(); } pin->EnableEditMode( false, m_editPinsPerPartOrConvert ); // Restore pin flags, that can be changed by the dialog editor pin->ClearFlags(); pin->SetFlags( item_flags ); }
// Create a new pin based on the previous pin with an incremented pin number. void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin ) { wxString msg; LIB_PART* part = GetCurPart(); if( !part || !SourcePin || SourcePin->Type() != LIB_PIN_T ) return; LIB_PIN* pin = (LIB_PIN*) SourcePin->Clone(); pin->ClearFlags(); pin->SetFlags( IS_NEW ); wxPoint step; switch( pin->GetOrientation() ) { case PIN_UP: step.x = GetRepeatPinStep(); break; case PIN_DOWN: step.x = GetRepeatPinStep(); break; case PIN_LEFT: step.y = - GetRepeatPinStep(); break; case PIN_RIGHT: step.y = - GetRepeatPinStep(); break; } pin->Move( pin->GetPosition() + step ); wxString nextName = pin->GetName(); IncrementLabelMember( nextName, GetRepeatDeltaLabel() ); pin->SetName( nextName ); pin->PinStringNum( msg ); IncrementLabelMember( msg, GetRepeatDeltaLabel() ); pin->SetPinNumFromString( msg ); m_drawItem = pin; if( SynchronizePins() ) pin->SetFlags( IS_LINKED ); wxPoint savepos = GetCrossHairPosition(); m_canvas->CrossHairOff( DC ); SetCrossHairPosition( wxPoint( pin->GetPosition().x, -pin->GetPosition().y ) ); // Add this new pin in list, and creates pins for others parts if needed m_drawItem = pin; ClearTempCopyComponent(); PlacePin(); m_lastDrawItem = pin; SetCrossHairPosition( savepos ); m_canvas->CrossHairOn( DC ); MSG_PANEL_ITEMS items; pin->GetMsgPanelInfo( items ); SetMsgPanel( items ); OnModify( ); }
void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event ) { LIB_PART* part = GetCurPart(); if( !part ) return; const int MIN_GRID_SIZE = 25; LIB_PINS pinList; part->GetPins( pinList ); if( pinList.size() == 0 ) { DisplayInfoMessage( this, _( "No pins!" ) ); return; } // Sort pins by pin num, so 2 duplicate pins // (pins with the same number) will be consecutive in list sort( pinList.begin(), pinList.end(), sort_by_pin_number ); // Test for duplicates: DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY, _( "Marker Information" ), wxDefaultPosition, wxSize( 750, 600 ) ); int dup_error = 0; for( unsigned ii = 1; ii < pinList.size(); ii++ ) { wxString stringPinNum, stringCurrPinNum; LIB_PIN* curr_pin = pinList[ii]; LIB_PIN* pin = pinList[ii - 1]; if( pin->GetNumber() != curr_pin->GetNumber() || pin->GetConvert() != curr_pin->GetConvert() || pin->GetUnit() != curr_pin->GetUnit() ) continue; dup_error++; pin->PinStringNum( stringPinNum ); /* TODO I dare someone to find a way to make happy translators on this thing! Lorenzo */ curr_pin->PinStringNum( stringCurrPinNum ); wxString msg = wxString::Format( _( "<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" " conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ), GetChars( stringCurrPinNum ), GetChars( curr_pin->GetName() ), curr_pin->GetPosition().x / 1000.0, -curr_pin->GetPosition().y / 1000.0, GetChars( stringPinNum ), GetChars( pin->GetName() ), pin->GetPosition().x / 1000.0, -pin->GetPosition().y / 1000.0 ); if( part->GetUnitCount() > 1 ) { msg += wxString::Format( _( " in part %c" ), 'A' + curr_pin->GetUnit() - 1 ); } if( m_showDeMorgan ) { if( curr_pin->GetConvert() ) msg += _( " of converted" ); else msg += _( " of normal" ); } msg += wxT( ".<br>" ); error_display.m_htmlWindow->AppendToPage( msg ); } // Test for off grid pins: int offgrid_error = 0; for( unsigned ii = 0; ii < pinList.size(); ii++ ) { LIB_PIN* pin = pinList[ii]; if( ( (pin->GetPosition().x % MIN_GRID_SIZE) == 0 ) && ( (pin->GetPosition().y % MIN_GRID_SIZE) == 0 ) ) continue; // "pin" is off grid here. offgrid_error++; wxString stringPinNum; pin->PinStringNum( stringPinNum ); wxString msg = wxString::Format( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ), GetChars( stringPinNum ), GetChars( pin->GetName() ), pin->GetPosition().x / 1000.0, -pin->GetPosition().y / 1000.0 ); if( part->GetUnitCount() > 1 ) { msg += wxString::Format( _( " in part %c" ), 'A' + pin->GetUnit() - 1 ); } if( m_showDeMorgan ) { if( pin->GetConvert() ) msg += _( " of converted" ); else msg += _( " of normal" ); } msg += wxT( ".<br>" ); error_display.m_htmlWindow->AppendToPage( msg ); } if( !dup_error && !offgrid_error ) DisplayInfoMessage( this, _( "No off grid or duplicate pins were found." ) ); else error_display.ShowModal(); }
void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event ) { if( m_drawItem == NULL || m_drawItem->Type() != LIB_PIN_T ) return; STATUS_FLAGS item_flags = m_drawItem->GetFlags(); // save flags to restore them after editing LIB_PIN* pin = (LIB_PIN*) m_drawItem; DIALOG_LIB_EDIT_PIN dlg( this, pin ); wxString units = GetUnitsLabel( g_UserUnit ); dlg.SetOrientationList( LIB_PIN::GetOrientationNames(), LIB_PIN::GetOrientationSymbols() ); dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->GetOrientation() ) ); dlg.SetStyleList( LIB_PIN::GetStyleNames(), LIB_PIN::GetStyleSymbols() ); dlg.SetStyle( LIB_PIN::GetStyleCodeIndex( pin->GetShape() ) ); dlg.SetElectricalTypeList( LIB_PIN::GetElectricalTypeNames(), LIB_PIN::GetElectricalTypeSymbols() ); dlg.SetElectricalType( pin->GetType() ); dlg.SetName( pin->GetName() ); dlg.SetNameTextSize( ReturnStringFromValue( g_UserUnit, pin->GetNameTextSize() ) ); dlg.SetNameTextSizeUnits( units ); dlg.SetPadName( pin->GetNumberString() ); dlg.SetPadNameTextSize( ReturnStringFromValue( g_UserUnit, pin->GetNumberTextSize() ) ); dlg.SetPadNameTextSizeUnits( units ); dlg.SetLength( ReturnStringFromValue( g_UserUnit, pin->GetLength() ) ); dlg.SetLengthUnits( units ); dlg.SetAddToAllParts( pin->GetUnit() == 0 ); dlg.SetAddToAllBodyStyles( pin->GetConvert() == 0 ); dlg.SetVisible( pin->IsVisible() ); /* This ugly hack fixes a bug in wxWidgets 2.8.7 and likely earlier * versions for the flex grid sizer in wxGTK that prevents the last * column from being sized correctly. It doesn't cause any problems * on win32 so it doesn't need to wrapped in ugly #ifdef __WXGTK__ * #endif. */ dlg.Layout(); dlg.Fit(); dlg.SetMinSize( dlg.GetSize() ); // dlg.SetLastSizeAndPosition(); // done in DIALOG_SHIM::Show() if( dlg.ShowModal() == wxID_CANCEL ) { if( pin->IsNew() ) { pin->SetFlags( IS_CANCELLED ); m_canvas->EndMouseCapture(); } return; } // Save the pin properties to use for the next new pin. LastPinNameSize = ReturnValueFromString( g_UserUnit, dlg.GetNameTextSize() ); LastPinNumSize = ReturnValueFromString( g_UserUnit, dlg.GetPadNameTextSize() ); LastPinOrient = LIB_PIN::GetOrientationCode( dlg.GetOrientation() ); LastPinLength = ReturnValueFromString( g_UserUnit, dlg.GetLength() ); LastPinShape = LIB_PIN::GetStyleCode( dlg.GetStyle() ); LastPinType = dlg.GetElectricalType(); LastPinCommonConvert = dlg.GetAddToAllBodyStyles(); LastPinCommonUnit = dlg.GetAddToAllParts(); LastPinVisible = dlg.GetVisible(); pin->EnableEditMode( true, m_editPinsPerPartOrConvert ); pin->SetName( dlg.GetName() ); pin->SetNameTextSize( LastPinNameSize ); pin->SetNumber( dlg.GetPadName() ); pin->SetNumberTextSize( LastPinNumSize ); pin->SetOrientation( LastPinOrient ); pin->SetLength( LastPinLength ); pin->SetType( LastPinType ); pin->SetShape( LastPinShape ); pin->SetConversion( ( LastPinCommonConvert ) ? 0 : m_convert ); pin->SetPartNumber( ( LastPinCommonUnit ) ? 0 : m_unit ); pin->SetVisible( LastPinVisible ); if( pin->IsModified() || pin->IsNew() ) { if( !pin->InEditMode() ) SaveCopyInUndoList( pin->GetParent() ); OnModify( ); MSG_PANEL_ITEMS items; pin->GetMsgPanelInfo( items ); SetMsgPanel( items ); m_canvas->Refresh(); } pin->EnableEditMode( false, m_editPinsPerPartOrConvert ); // Restore pin flags, that can be changed by the dialog editor pin->ClearFlags(); pin->SetFlags( item_flags ); }