void SIM_PLOT_PANEL::EnableCursor( const wxString& aName, bool aEnable ) { TRACE* t = GetTrace( aName ); if( t == nullptr || t->HasCursor() == aEnable ) return; if( aEnable ) { CURSOR* c = new CURSOR( t ); int plotCenter = GetMarginLeft() + ( GetXScreen() - GetMarginLeft() - GetMarginRight() ) / 2; c->SetX( plotCenter ); t->SetCursor( c ); AddLayer( c ); } else { CURSOR* c = t->GetCursor(); t->SetCursor( NULL ); DelLayer( c, true ); } // Notify the parent window about the changes wxQueueEvent( GetParent(), new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) ); }
void gpLayer::DelAllLayers(bool alsoDeleteObjects ) { mpLayerList_t::iterator it; for(it = mpLayerList.begin(); it != mpLayerList.end(); it++) { DelLayer(*it, alsoDeleteObjects); } }
bool SIM_PLOT_PANEL::DeleteTrace( const wxString& aName ) { auto it = m_traces.find( aName ); if( it != m_traces.end() ) { m_traces.erase( it ); TRACE* trace = it->second; if( CURSOR* cursor = trace->GetCursor() ) DelLayer( cursor, true ); DelLayer( trace, true, true ); ResetScales(); return true; } return false; }
bool SIM_PLOT_PANEL::AddTrace( const wxString& aName, int aPoints, const double* aX, const double* aY, SIM_PLOT_TYPE aFlags ) { TRACE* trace = NULL; // Find previous entry, if there is one auto prev = m_traces.find( aName ); bool addedNewEntry = ( prev == m_traces.end() ); if( addedNewEntry ) { if( m_type == ST_TRANSIENT ) { bool hasVoltageTraces = false; for( auto tr : m_traces ) { if( !( tr.second->GetFlags() & SPT_CURRENT ) ) { hasVoltageTraces = true; break; } } if( !hasVoltageTraces ) m_axis_y2->SetMasterScale( nullptr ); else m_axis_y2->SetMasterScale( m_axis_y1 ); } // New entry trace = new TRACE( aName ); trace->SetTraceColour( generateColor() ); trace->SetPen( wxPen( trace->GetTraceColour(), 2, wxPENSTYLE_SOLID ) ); m_traces[aName] = trace; // It is a trick to keep legend & coords always on the top for( mpLayer* l : m_topLevel ) DelLayer( l ); AddLayer( (mpLayer*) trace ); for( mpLayer* l : m_topLevel ) AddLayer( l ); } else { trace = prev->second; } std::vector<double> tmp( aY, aY + aPoints ); if( m_type == ST_AC ) { if( aFlags & SPT_AC_PHASE ) { for( int i = 0; i < aPoints; i++ ) tmp[i] = tmp[i] * 180.0 / M_PI; // convert to degrees } else { for( int i = 0; i < aPoints; i++ ) tmp[i] = 20 * log( tmp[i] ) / log( 10.0 ); // convert to dB } } trace->SetData( std::vector<double>( aX, aX + aPoints ), tmp ); if( aFlags & SPT_AC_PHASE || aFlags & SPT_CURRENT ) trace->SetScale( m_axis_x, m_axis_y2 ); else trace->SetScale( m_axis_x, m_axis_y1 ); trace->SetFlags( aFlags ); UpdateAll(); return addedNewEntry; }