/*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa updateAxes(), setAutoReplot() */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); if ( d_data->canvas ) { const bool ok = QMetaObject::invokeMethod( d_data->canvas, "replot", Qt::DirectConnection ); if ( !ok ) { // fallback, when canvas has no a replot method d_data->canvas->update( d_data->canvas->contentsRect() ); } } setAutoReplot( doAutoReplot ); }
void AMOrderReductionAB::setInputSources() { if (source_){ disconnect(source_->signalSource(), SIGNAL(valuesChanged(AMnDIndex,AMnDIndex)), this, SLOT(onInputSourceValuesChanged(AMnDIndex,AMnDIndex))); disconnect(source_->signalSource(), SIGNAL(sizeChanged(int)), this, SLOT(onInputSourceSizeChanged())); disconnect(source_->signalSource(), SIGNAL(stateChanged(int)), this, SLOT(onInputSourceStateChanged())); source_ = 0; } int selectedIndex = indexOfInputSource(selectedName_); if (selectedIndex >= 0){ source_ = inputDataSourceAt(selectedIndex); axes_.clear(); for (int i = 0; i < source_->rank()-1; i++) axes_.append(AMAxisInfo("invalid", 0, "No input data")); updateAxes(); cacheUpdateRequired_ = true; cachedData_ = QVector<double>(size().product()); setDescription(QString("Reduced Order of %1").arg(source_->name())); connect(source_->signalSource(), SIGNAL(valuesChanged(AMnDIndex,AMnDIndex)), this, SLOT(onInputSourceValuesChanged(AMnDIndex,AMnDIndex))); connect(source_->signalSource(), SIGNAL(sizeChanged(int)), this, SLOT(onInputSourceSizeChanged())); connect(source_->signalSource(), SIGNAL(stateChanged(int)), this, SLOT(onInputSourceStateChanged())); }
/*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa setAutoReplot() */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot(FALSE); updateAxes(); drawCanvas(d_canvas->contentsRect()); setAutoReplot(doAutoReplot); }
/*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa setAutoReplot() \warning Calls canvas()->repaint, take care of infinite recursions */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot(FALSE); updateAxes(); d_canvas->invalidateCache(); d_canvas->repaint(d_canvas->contentsRect(), FALSE); setAutoReplot(doAutoReplot); }
void RendererImplementationBase3D::addToBounds(RenderedData * renderedData, unsigned int subViewIndex) { auto & dataBounds = m_viewportSetups[subViewIndex].dataBounds; auto && dataSetBounds = renderedData->visibleBounds(); if (dataBounds.contains(dataSetBounds)) { return; } dataBounds.add(dataSetBounds); updateAxes(); }
/*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa setAutoReplot() \warning Calls canvas()->repaint, take care of infinite recursions */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); d_data->canvas->replot(); setAutoReplot( doAutoReplot ); }
Plot::Plot( QWidget *parent ): QwtPlot( parent ) { setAutoReplot( false ); setTitle( "Movable Items" ); const int margin = 5; setContentsMargins( margin, margin, margin, margin ); setAutoFillBackground( true ); setPalette( QColor( "DimGray" ).lighter( 110 ) ); QwtPlotCanvas *canvas = new QwtPlotCanvas(); #if 0 // a gradient making a replot slow on X11 canvas->setStyleSheet( "border: 2px solid Black;" "border-radius: 15px;" "background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1," "stop: 0 LemonChiffon, stop: 0.5 PaleGoldenrod, stop: 1 LemonChiffon );" ); #else canvas->setStyleSheet( "border: 2px inset DimGray;" "border-radius: 15px;" "background: LemonChiffon;" ); #endif setCanvas( canvas ); insertLegend( new Legend(), QwtPlot::RightLegend ); populate(); updateAxes(); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) setAxisAutoScale( axis, false ); d_editor = new Editor( this ); ( void ) new QwtPlotMagnifier( canvas ); }
void RendererImplementationBase3D::removeFromBounds(RenderedData * renderedData, unsigned int subViewIndex) { auto & dataBounds = m_viewportSetups[subViewIndex].dataBounds; dataBounds = {}; for (auto visualization : m_renderView.visualizations(subViewIndex)) { if (visualization == renderedData) { continue; } assert(dynamic_cast<RenderedData *>(visualization)); auto rendered = static_cast<RenderedData *>(visualization); dataBounds.add(rendered->visibleBounds()); } updateAxes(); }
void RendererImplementationBase3D::updateBounds() { // TODO update only for relevant views for (size_t viewportIndex = 0; viewportIndex < m_viewportSetups.size(); ++viewportIndex) { auto & dataBounds = m_viewportSetups[viewportIndex].dataBounds; dataBounds = {}; for (auto visualization : m_renderView.visualizations(int(viewportIndex))) { assert(dynamic_cast<RenderedData *>(visualization)); auto rendered = static_cast<RenderedData *>(visualization); dataBounds.add(rendered->visibleBounds()); } } updateAxes(); }
void MolconvWindow::changeOriginBasis() { molconv::origin newOrigin = d->m_setBasisDialog->origin(); molconv::basis newBasis = d->m_setBasisDialog->basis(); std::array<int,2> newOriginAtoms = d->m_setBasisDialog->originAtoms(); std::array<int,3> newBasisAtoms = d->m_setBasisDialog->basisAtoms(); double newAtomLineScale = d->m_setBasisDialog->atomLineScale(); std::vector<bool> newOriginList = d->m_setBasisDialog->selectedOriginAtoms(); std::vector<bool> newBasisList = d->m_setBasisDialog->selectedBasisAtoms(); d->activeMolecule->setOriginList(newOriginList); d->activeMolecule->setBasisList(newBasisList); d->activeMolecule->setOrigin(newOrigin, size_t(newOriginAtoms[0]), size_t(newOriginAtoms[1]), newAtomLineScale); d->activeMolecule->setBasis(newBasis, newBasisAtoms[0], newBasisAtoms[1], newBasisAtoms[2]); d->m_MoleculeSettings->setMolecule(d->activeMolecule); updateAxes(); }
// This function is called 500 times per second void doAt500Hz(void) { updateAxes(); updateButtons(); counter1++; counter2++; if (counter1 == 10) // Triggered exactly 50 times per second { updateADCs(); counter1 = 0; } if (counter2 == 500) // Triggered exactly 1 time per second { txBuffer[3] = voltage >> 8; txBuffer[4] = voltage & 0xFF; // Sends whatever is in the TX buffer sendTxBuffer(); counter2 = 0; }
void FirstPersonCamera::changeYaw(float step) { yaw+=step; updateAxes(); }
void FirstPersonCamera::changePitch(float step) { pitch+=step; if(pitch>(1.553343f)) pitch = (1.553343f); if(pitch<(-1.553343f)) pitch = (-1.553343f); updateAxes(); }
MolconvWindow::MolconvWindow(QMainWindow *parent) : QMainWindow(parent) , d(new MolconvWindowPrivate) , ui(new Ui::MolconvWindow) { ui->setupUi(this); d->m_ImportDialog = new ImportDialog(this); d->m_ExportDialog = new ExportDialog(this); d->m_NewGroupDialog = new NewGroupDialog(this); d->m_setBasisDialog = new setBasisDialog(this); d->m_ListOfMolecules = new ListOfMolecules(this); d->m_MoleculeSettings = new MoleculeSettings(this); addDockWidget(Qt::BottomDockWidgetArea, d->m_ListOfMolecules); addDockWidget(Qt::LeftDockWidgetArea, d->m_MoleculeSettings); ui->actionSet_internal_basis->setEnabled(false); ui->actionDuplicate->setEnabled(false); ui->actionRemove->setEnabled(false); ui->actionZero_Coordinates->setEnabled(false); ui->actionReset_Coordinates->setEnabled(false); ui->actionProperties->setEnabled(false); ui->actionAdd_To_Group->setEnabled(false); ui->actionAlign->setEnabled(false); connect(qApp, SIGNAL(aboutToQuit()), SLOT(quit())); connect(ui->actionImport_Molecule, SIGNAL(triggered()), SLOT(startImportDialog())); connect(ui->actionExport_Molecule, SIGNAL(triggered()), SLOT(startExportDialog())); connect(ui->actionQuit, SIGNAL(triggered()), SLOT(quit())); connect(ui->actionAbout, SIGNAL(triggered()), SLOT(about())); connect(ui->actionNew_Molecule_Group, SIGNAL(triggered()), SLOT(startNewGroupDialog())); connect(ui->actionSet_internal_basis, SIGNAL(triggered()), SLOT(startBasisDialog())); connect(ui->actionDuplicate, SIGNAL(triggered()), SLOT(DuplicateActiveMolecule())); connect(ui->actionRemove, SIGNAL(triggered()), SLOT(removeActiveMolecule())); connect(ui->actionReset, SIGNAL(triggered()), SLOT(ResetView())); connect(ui->actionZero_Coordinates, SIGNAL(triggered()), SLOT(zeroCoords())); connect(ui->actionReset_Coordinates, SIGNAL(triggered()), SLOT(resetCoords())); connect(ui->actionAlign, SIGNAL(triggered()), d->m_ListOfMolecules, SLOT(alignMolecules())); connect(ui->actionNavigate, SIGNAL(triggered()), SLOT(useNavigateTool())); connect(ui->actionSelect, SIGNAL(triggered()), SLOT(useSelectTool())); connect(d->m_ImportDialog, SIGNAL(accepted()), SLOT(openFile())); connect(d->m_NewGroupDialog, SIGNAL(accepted()), this, SLOT(newGroup())); connect(d->m_setBasisDialog, SIGNAL(ready()), SLOT(changeOriginBasis())); connect(d->m_ListOfMolecules, SIGNAL(newMoleculeSelected(molconv::moleculePtr&)), d->m_MoleculeSettings, SLOT(setMolecule(molconv::moleculePtr&))); connect(d->m_ListOfMolecules, SIGNAL(newMoleculeSelected(molconv::moleculePtr&)), SLOT(updateActiveMolecule(molconv::moleculePtr&))); connect(d->m_ListOfMolecules, SIGNAL(newGroupSelected(molconv::MoleculeGroup*)), d->m_MoleculeSettings, SLOT(setGroup(molconv::MoleculeGroup*))); connect(d->m_MoleculeSettings, SIGNAL(basisChanged()), SLOT(updateAxes())); connect(d->m_MoleculeSettings, SIGNAL(basisChanged()), SLOT(updateSelection())); GraphicsAxisItem *axes = new GraphicsAxisItem; ui->molconv_graphicsview->addItem(axes); d->m_Selection = new GraphicsSelectionItem; ui->molconv_graphicsview->addItem(d->m_Selection); d->m_navigatetool = boost::make_shared<NavigateTool>(); d->m_selecttool = boost::make_shared<SelectTool>(this); useNavigateTool(); ui->molconv_graphicsview->update(); }
void MolconvWindow::minimizeRMSD(molconv::moleculePtr refMol, molconv::moleculePtr otherMol) { if (refMol->size() != otherMol->size()) { QMessageBox::critical(this, tr("Alignment impossible"), tr("Only molecules with equal number of atoms can be aligned.")); return; } int Natoms = refMol->size(); Eigen::Vector3d center = refMol->center(); Eigen::Vector3d shift = center - otherMol->center(); Eigen::Vector3d newOrigin = otherMol->internalOriginPosition() + shift; updateActiveMolecule(otherMol); d->m_MoleculeSettings->setMolecule(otherMol); d->m_MoleculeSettings->moveMolecule(double(newOrigin(0)), double(newOrigin(1)), double(newOrigin(2)), 0.0, 0.0, 0.0); Eigen::MatrixXd Xr = Eigen::MatrixXd::Zero(3,Natoms); Eigen::MatrixXd Xo = Eigen::MatrixXd::Zero(3,Natoms); for (int i = 0; i < Natoms; i++) { Xr.col(i) = refMol->atom(i)->position() - center; Xo.col(i) = otherMol->atom(i)->position() - center; } Eigen::Matrix3d corr = Xo * Xr.transpose(); // construct the quaternion matrix Eigen::Matrix4d F = Eigen::Matrix4d::Zero(); F(0,0) = corr(0,0) + corr(1,1) + corr(2,2); F(1,1) = corr(0,0) - corr(1,1) - corr(2,2); F(2,2) = -corr(0,0) + corr(1,1) - corr(2,2); F(3,3) = -corr(0,0) - corr(1,1) + corr(2,2); F(0,1) = corr(1,2) - corr(2,1); F(0,2) = corr(2,0) - corr(0,2); F(0,3) = corr(0,1) - corr(1,0); F(1,2) = corr(0,1) + corr(1,0); F(1,3) = corr(0,2) + corr(2,0); F(2,3) = corr(1,2) + corr(2,1); F(1,0) = F(0,1); F(2,0) = F(0,2); F(3,0) = F(0,3); F(2,1) = F(1,2); F(3,1) = F(1,3); F(3,2) = F(2,3); Eigen::SelfAdjointEigenSolver<Eigen::Matrix4d> Feig(F); Eigen::Vector4d Feval = Feig.eigenvalues(); Eigen::Matrix4d Fevec = Feig.eigenvectors(); // the optimal rotation corresponds to either the first or the last eigenvector, depending on which eigenvalue is larger Eigen::Vector4d lQuart = std::abs(double(Feval(0))) > std::abs(double(Feval(3))) ? Fevec.block(0, 0, 4, 1) : Fevec.block(0, 3, 4, 1); Eigen::Matrix3d rotmat = Eigen::Matrix3d::Zero(); rotmat(0,0) = lQuart(0) * lQuart(0) + lQuart(1) * lQuart(1) - lQuart(2) * lQuart(2) - lQuart(3) * lQuart(3); rotmat(1,1) = lQuart(0) * lQuart(0) - lQuart(1) * lQuart(1) + lQuart(2) * lQuart(2) - lQuart(3) * lQuart(3); rotmat(2,2) = lQuart(0) * lQuart(0) - lQuart(1) * lQuart(1) - lQuart(2) * lQuart(2) + lQuart(3) * lQuart(3); rotmat(0,1) = 2.0 * (lQuart(1) * lQuart(2) - lQuart(0) * lQuart(3)); rotmat(0,2) = 2.0 * (lQuart(1) * lQuart(3) + lQuart(0) * lQuart(2)); rotmat(1,2) = 2.0 * (lQuart(2) * lQuart(3) - lQuart(0) * lQuart(1)); rotmat(1,0) = 2.0 * (lQuart(1) * lQuart(2) + lQuart(0) * lQuart(3)); rotmat(2,0) = 2.0 * (lQuart(1) * lQuart(3) - lQuart(0) * lQuart(2)); rotmat(2,1) = 2.0 * (lQuart(2) * lQuart(3) + lQuart(0) * lQuart(1)); std::array<double,3> newEulers = molconv::Molecule::rot2euler(rotmat); double newPhi = newEulers[2]; double newTheta = newEulers[1]; double newPsi = newEulers[0]; d->m_MoleculeSettings->moveMolecule(double(newOrigin(0)), double(newOrigin(1)), double(newOrigin(2)), newPhi, newTheta, newPsi); updateAxes(); }
void AMOrderReductionAB::setReducedAxis(int axis) { reducedAxis_ = axis; setModified(true); updateAxes(); }