void DIALOG_MODULE_BOARD_EDITOR::Remove3DShape( wxCommandEvent& event ) { if( m_LastSelected3DShapeIndex >= 0 ) TransfertDisplayTo3DValues( m_LastSelected3DShapeIndex ); int ii = m_3D_ShapeNameListBox->GetSelection(); if( ii < 0 ) return; m_Shapes3D_list.erase( m_Shapes3D_list.begin() + ii ); m_3D_ShapeNameListBox->Delete( ii ); if( m_3D_ShapeNameListBox->GetCount() == 0 ) Transfert3DValuesToDisplay( NULL ); else { if( ii > 0 ) m_LastSelected3DShapeIndex = ii - 1; else m_LastSelected3DShapeIndex = 0; m_3D_ShapeNameListBox->SetSelection( m_LastSelected3DShapeIndex ); Transfert3DValuesToDisplay( m_Shapes3D_list[m_LastSelected3DShapeIndex] ); } return; }
void DIALOG_MODULE_BOARD_EDITOR::Edit3DShapeFileName() { int idx = m_3D_ShapeNameListBox->GetSelection(); if( idx < 0 ) return; // ensure any updated parameters are not discarded TransfertDisplayTo3DValues( idx ); // Edit filename wxString filename = m_3D_ShapeNameListBox->GetStringSelection(); wxTextEntryDialog dlg( this, wxEmptyString, wxEmptyString, filename ); bool hasAlias; S3D_FILENAME_RESOLVER* res = Prj().Get3DCacheManager()->GetResolver(); if( dlg.ShowModal() != wxID_OK ) return; filename = dlg.GetValue(); if( filename.empty() ) return; if( !res->ValidateFileName( filename, hasAlias ) ) { wxString msg = _( "Invalid filename: " ); msg.append( filename ); wxMessageBox( msg, _T( "Edit 3D file name" ) ); return; } m_3D_ShapeNameListBox->SetString( idx, filename ); // if the user has specified an alias in the name then prepend ':' if( hasAlias ) filename.insert( 0, wxT( ":" ) ); #ifdef __WINDOWS__ // In Kicad files, filenames and paths are stored using Unix notation filename.Replace( wxT( "\\" ), wxT( "/" ) ); #endif S3D_MASTER* new3DShape = new S3D_MASTER( NULL ); new3DShape->SetShape3DName( filename ); new3DShape->m_MatPosition = m_Shapes3D_list[idx]->m_MatPosition; new3DShape->m_MatRotation = m_Shapes3D_list[idx]->m_MatRotation; new3DShape->m_MatScale = m_Shapes3D_list[idx]->m_MatScale; delete m_Shapes3D_list[idx]; m_Shapes3D_list[idx] = new3DShape; Transfert3DValuesToDisplay( m_Shapes3D_list[idx] ); return; }
void DIALOG_MODULE_BOARD_EDITOR::On3DShapeNameSelected( wxCommandEvent& event ) { if( m_LastSelected3DShapeIndex >= 0 ) TransfertDisplayTo3DValues( m_LastSelected3DShapeIndex ); m_LastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetSelection(); if( m_LastSelected3DShapeIndex < 0 ) // happens under wxGTK when // deleting an item in // m_3D_ShapeNameListBox wxListBox return; if( m_LastSelected3DShapeIndex >= (int) m_Shapes3D_list.size() ) { wxMessageBox( wxT( "On3DShapeNameSelected() error" ) ); m_LastSelected3DShapeIndex = -1; return; } Transfert3DValuesToDisplay( m_Shapes3D_list[m_LastSelected3DShapeIndex] ); }
void DIALOG_MODULE_BOARD_EDITOR::OnOkClick( wxCommandEvent& event ) { wxPoint modpos; wxString msg; if( m_CurrentModule->GetFlags() == 0 ) // this is a simple edition, we // must create an undo entry m_Parent->SaveCopyInUndoList( m_CurrentModule, UR_CHANGED ); if( m_DC ) { m_Parent->GetCanvas()->CrossHairOff( m_DC ); m_CurrentModule->Draw( m_Parent->GetCanvas(), m_DC, GR_XOR ); } // Init Fields (should be first, because they can be moved or/and flipped later): m_CurrentModule->Reference().Copy( m_ReferenceCopy ); m_CurrentModule->Value().Copy( m_ValueCopy ); // Initialize masks clearances m_CurrentModule->SetLocalClearance( ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl ) ); m_CurrentModule->SetLocalSolderMaskMargin( ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl ) ); m_CurrentModule->SetLocalSolderPasteMargin( ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl ) ); double dtmp = 0.0; msg = m_SolderPasteMarginRatioCtrl->GetValue(); msg.ToDouble( &dtmp ); // A -50% margin ratio means no paste on a pad, the ratio must be >= -50% if( dtmp < -50.0 ) dtmp = -50.0; // A margin ratio is always <= 0 // 0 means use full pad copper area if( dtmp > 0.0 ) dtmp = 0.0; m_CurrentModule->SetLocalSolderPasteMarginRatio( dtmp / 100 ); switch( m_ZoneConnectionChoice->GetSelection() ) { default: case 0: m_CurrentModule->SetZoneConnection( UNDEFINED_CONNECTION ); break; case 1: m_CurrentModule->SetZoneConnection( PAD_IN_ZONE ); break; case 2: m_CurrentModule->SetZoneConnection( THERMAL_PAD ); break; case 3: m_CurrentModule->SetZoneConnection( PAD_NOT_IN_ZONE ); break; } // Set Module Position modpos.x = ReturnValueFromTextCtrl( *m_ModPositionX ); modpos.y = ReturnValueFromTextCtrl( *m_ModPositionY ); m_CurrentModule->SetPosition( modpos ); m_CurrentModule->SetLocked( m_AutoPlaceCtrl->GetSelection() == 1 ); switch( m_AttributsCtrl->GetSelection() ) { case 0: m_CurrentModule->SetAttributes( 0 ); break; case 1: m_CurrentModule->SetAttributes( MOD_CMS ); break; case 2: m_CurrentModule->SetAttributes( MOD_VIRTUAL ); break; } m_CurrentModule->SetPlacementCost90( m_CostRot90Ctrl->GetValue() ); m_CurrentModule->SetPlacementCost180( m_CostRot180Ctrl->GetValue() ); /* Now, set orientation. must be made after others changes, * because rotation changes fields positions on board according to the new orientation * (relative positions are not modified) */ long orient = 0; msg = m_OrientValue->GetValue(); msg.ToLong( &orient ); if( m_CurrentModule->GetOrientation() != orient ) m_CurrentModule->Rotate( m_CurrentModule->GetPosition(), orient - m_CurrentModule->GetOrientation() ); // Set component side, that also have effect on the fields positions on board bool change_layer = false; if( m_LayerCtrl->GetSelection() == 0 ) // layer req = COMPONENT { if( m_CurrentModule->GetLayer() == LAYER_N_BACK ) change_layer = true; } else if( m_CurrentModule->GetLayer() == LAYER_N_FRONT ) change_layer = true; if( change_layer ) m_CurrentModule->Flip( m_CurrentModule->GetPosition() ); // Update 3D shape list int ii = m_3D_ShapeNameListBox->GetSelection(); if( ii >= 0 ) TransfertDisplayTo3DValues( ii ); S3D_MASTER* draw3D = m_CurrentModule->Models(); for( unsigned ii = 0; ii < m_Shapes3D_list.size(); ii++ ) { S3D_MASTER* draw3DCopy = m_Shapes3D_list[ii]; if( draw3DCopy->GetShape3DName().IsEmpty() ) continue; if( draw3D == NULL ) { draw3D = new S3D_MASTER( draw3D ); m_CurrentModule->Models().Append( draw3D ); } draw3D->SetShape3DName( draw3DCopy->GetShape3DName() ); draw3D->m_MatScale = draw3DCopy->m_MatScale; draw3D->m_MatRotation = draw3DCopy->m_MatRotation; draw3D->m_MatPosition = draw3DCopy->m_MatPosition; draw3D = draw3D->Next(); } // Remove old extra 3D shapes S3D_MASTER* nextdraw3D; for( ; draw3D != NULL; draw3D = nextdraw3D ) { nextdraw3D = (S3D_MASTER*) draw3D->Next(); delete m_CurrentModule->Models().Remove( draw3D ); } // Fill shape list with one void entry, if no entry if( m_CurrentModule->Models() == NULL ) m_CurrentModule->Models().PushBack( new S3D_MASTER( m_CurrentModule ) ); m_CurrentModule->CalculateBoundingBox(); m_Parent->OnModify(); EndModal( 1 ); if( m_DC ) { m_CurrentModule->Draw( m_Parent->GetCanvas(), m_DC, GR_OR ); m_Parent->GetCanvas()->CrossHairOn( m_DC ); } }
void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event ) { wxString fullfilename, shortfilename; wxString fullpath; fullpath = wxGetApp().ReturnLastVisitedLibraryPath( LIB3D_PATH ); #ifdef __WINDOWS__ fullpath.Replace( wxT( "/" ), wxT( "\\" ) ); #endif wxString fileFilters; fileFilters = wxGetTranslation( Shapes3DFileWildcard ); fileFilters += wxChar( '|' ); fileFilters += wxGetTranslation( IDF3DFileWildcard ); fullfilename = EDA_FileSelector( _( "3D Shape:" ), fullpath, wxEmptyString, wxEmptyString, wxGetTranslation( fileFilters ), this, wxFD_OPEN, true ); if( fullfilename.IsEmpty() ) return; wxFileName fn = fullfilename; wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() ); /* If the file path is already in the default search path * list, just add the name to the list. Otherwise, add * the name with the full or relative path. * the relative path, when possible is preferable, * because it preserve use of default search path, when the path is a * sub path */ wxString default_path; wxGetEnv( wxT( KISYS3DMOD ), &default_path ); fn.MakeRelativeTo( default_path ); // Here, we want a path relative only to the default_path if( fn.GetPathWithSep().StartsWith( wxT("..") ) ) fn = fullfilename; // keep the full file name shortfilename = fn.GetFullPath(); if( fn.IsAbsolute() ) { // Absolute path, ask if the user wants a relative one int diag = wxMessageBox( _( "Use a relative path?" ), _( "Path type" ), wxYES_NO | wxICON_QUESTION, this ); if( diag == wxYES ) { // Make it relative fn.MakeRelativeTo( wxT(".") ); shortfilename = fn.GetFullPath(); } } S3D_MASTER* new3DShape = new S3D_MASTER( NULL ); #ifdef __WINDOWS__ // Store filename in Unix notation shortfilename.Replace( wxT( "\\" ), wxT( "/" ) ); #endif new3DShape->SetShape3DName( shortfilename ); m_Shapes3D_list.push_back( new3DShape ); m_3D_ShapeNameListBox->Append( shortfilename ); if( m_LastSelected3DShapeIndex >= 0 ) TransfertDisplayTo3DValues( m_LastSelected3DShapeIndex ); m_LastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetCount() - 1; m_3D_ShapeNameListBox->SetSelection( m_LastSelected3DShapeIndex ); Transfert3DValuesToDisplay( m_Shapes3D_list[m_LastSelected3DShapeIndex] ); }
void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event ) { PROJECT& prj = Prj(); SEARCH_STACK& search = Kiface().KifaceSearch(); wxString fullpath; wxString kisys3dmod = wxGetenv( wxT( KISYS3DMOD ) ); if( !kisys3dmod || !wxFileName::IsDirReadable( kisys3dmod ) ) { fullpath = search.FindValidPath( LIB3D_PATH ); } if( !fullpath ) fullpath = prj.RPath(PROJECT::VIEWER_3D).LastVisitedPath( search, LIB3D_PATH ); #ifdef __WINDOWS__ fullpath.Replace( wxT( "/" ), wxT( "\\" ) ); #endif wxString fullfilename; wxString shortfilename; wxString fileFilters = wxGetTranslation( Shapes3DFileWildcard ); fileFilters += wxChar( '|' ); fileFilters += wxGetTranslation( IDF3DFileWildcard ); fullfilename = EDA_FileSelector( _( "3D Shape:" ), fullpath, wxEmptyString, wxEmptyString, wxGetTranslation( fileFilters ), this, wxFD_OPEN, true ); if( fullfilename.IsEmpty() ) return; wxFileName fn = fullfilename; prj.RPath(PROJECT::VIEWER_3D).SaveLastVisitedPath( fn.GetPath() ); /* If the file path is already in the library search paths * list, just add the library name to the list. Otherwise, add * the library name with the full or relative path. * the relative path, when possible is preferable, * because it preserve use of default libraries paths, when the path is a * sub path of these default paths */ shortfilename = search.FilenameWithRelativePathInSearchList( fullfilename ); wxFileName aux = shortfilename; if( aux.IsAbsolute() ) { // Absolute path, ask if the user wants a relative one int diag = wxMessageBox( _( "Use a relative path?" ), _( "Path type" ), wxYES_NO | wxICON_QUESTION, this ); if( diag == wxYES ) { // Make it relative aux.MakeRelativeTo( wxT(".") ); shortfilename = aux.GetPathWithSep() + aux.GetFullName(); } } S3D_MASTER* new3DShape = new S3D_MASTER( NULL ); #ifdef __WINDOWS__ // Store filename in Unix notation shortfilename.Replace( wxT( "\\" ), wxT( "/" ) ); #endif new3DShape->SetShape3DName( shortfilename ); m_Shapes3D_list.push_back( new3DShape ); m_3D_ShapeNameListBox->Append( shortfilename ); if( m_LastSelected3DShapeIndex >= 0 ) TransfertDisplayTo3DValues( m_LastSelected3DShapeIndex ); m_LastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetCount() - 1; m_3D_ShapeNameListBox->SetSelection( m_LastSelected3DShapeIndex ); Transfert3DValuesToDisplay( m_Shapes3D_list[m_LastSelected3DShapeIndex] ); }
void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event ) { // First, test for invalid chars in module name wxString footprintName = m_FootprintNameCtrl->GetValue(); if( ! footprintName.IsEmpty() ) { if( ! MODULE::IsLibNameValid( footprintName ) ) { wxString msg; msg.Printf( _( "Error:\none of invalid chars <%s> found\nin <%s>" ), MODULE::StringLibNameInvalidChars( true ), GetChars( footprintName ) ); DisplayError( NULL, msg ); return; } } m_parent->SaveCopyInUndoList( m_currentModule, UR_MODEDIT ); m_currentModule->SetLocked( m_AutoPlaceCtrl->GetSelection() == 1 ); switch( m_AttributsCtrl->GetSelection() ) { case 0: m_currentModule->SetAttributes( 0 ); break; case 1: m_currentModule->SetAttributes( MOD_CMS ); break; case 2: m_currentModule->SetAttributes( MOD_VIRTUAL ); break; } m_currentModule->SetPlacementCost90( m_CostRot90Ctrl->GetValue() ); m_currentModule->SetPlacementCost180( m_CostRot180Ctrl->GetValue() ); m_currentModule->SetDescription( m_DocCtrl->GetValue() ); m_currentModule->SetKeywords( m_KeywordCtrl->GetValue() ); // Init footprint name in library if( ! footprintName.IsEmpty() ) m_currentModule->SetFPID( FPID( footprintName ) ); // Init Fields: m_currentModule->Reference().Copy( m_referenceCopy ); m_currentModule->Value().Copy( m_valueCopy ); // Initialize masks clearances m_currentModule->SetLocalClearance( ValueFromTextCtrl( *m_NetClearanceValueCtrl ) ); m_currentModule->SetLocalSolderMaskMargin( ValueFromTextCtrl( *m_SolderMaskMarginCtrl ) ); m_currentModule->SetLocalSolderPasteMargin( ValueFromTextCtrl( *m_SolderPasteMarginCtrl ) ); double dtmp; wxString msg = m_SolderPasteMarginRatioCtrl->GetValue(); msg.ToDouble( &dtmp ); // A -50% margin ratio means no paste on a pad, the ratio must be >= -50 % if( dtmp < -50.0 ) dtmp = -50.0; // A margin ratio is always <= 0 if( dtmp > 0.0 ) dtmp = 0.0; m_currentModule->SetLocalSolderPasteMarginRatio( dtmp / 100 ); // Update 3D shape list int ii = m_3D_ShapeNameListBox->GetSelection(); if ( ii >= 0 ) TransfertDisplayTo3DValues( ii ); S3D_MASTER* draw3D = m_currentModule->Models(); for( unsigned ii = 0; ii < m_shapes3D_list.size(); ii++ ) { S3D_MASTER* draw3DCopy = m_shapes3D_list[ii]; if( draw3DCopy->GetShape3DName().IsEmpty() ) continue; if( draw3D == NULL ) { draw3D = new S3D_MASTER( draw3D ); m_currentModule->Models().Append( draw3D ); } draw3D->SetShape3DName( draw3DCopy->GetShape3DName() ); draw3D->m_MatScale = draw3DCopy->m_MatScale; draw3D->m_MatRotation = draw3DCopy->m_MatRotation; draw3D->m_MatPosition = draw3DCopy->m_MatPosition; draw3D = draw3D->Next(); } // Remove old extra 3D shapes S3D_MASTER* nextdraw3D; for( ; draw3D != NULL; draw3D = nextdraw3D ) { nextdraw3D = (S3D_MASTER*) draw3D->Next(); delete m_currentModule->Models().Remove( draw3D ); } // Fill shape list with one void entry, if no entry if( m_currentModule->Models() == NULL ) m_currentModule->Models().PushBack( new S3D_MASTER( m_currentModule ) ); m_currentModule->CalculateBoundingBox(); m_parent->OnModify(); EndModal( 1 ); }