int KST::vectorToFile(KstVectorPtr v, QFile *f) { KstApp *app = KstApp::inst(); #define BSIZE 128 char buf[BSIZE]; v->readLock(); int vSize = v->length(); double *value = v->value(); register int modval; QString saving = i18n("Saving vector %1").arg(v->tagName()); modval = QMAX(vSize/100, 100); QString ltxt = "; " + v->tagName() + '\n'; f->writeBlock(ltxt.ascii(), ltxt.length()); ltxt.fill('-'); ltxt[0] = ';'; ltxt[1] = ' '; ltxt[ltxt.length() - 1] = '\n'; f->writeBlock(ltxt.ascii(), ltxt.length()); app->slotUpdateProgress(vSize, 0, QString::null); for (int i = 0; i < vSize; i++) { int l = snprintf(buf, BSIZE, "%.15g\n", value[i]); f->writeBlock(buf, l); if (i % modval == 0) { app->slotUpdateProgress(vSize, i, saving); } } v->readUnlock(); app->slotUpdateProgress(0, 0, QString::null); #undef BSIZE return 0; }
void renderLabel(RenderContext& rc, Label::Chunk *fi) { // FIXME: RTL support int oldSize = rc.size; int oldY = rc.y; int oldX = rc.x; while (fi) { if (fi->vOffset != Label::Chunk::None) { if (fi->vOffset == Label::Chunk::Up) { rc.y -= int(0.4 * rc.fontHeight()); } else { // Down rc.y += int(0.4 * rc.fontHeight()); } if (rc.size > 5) { rc.size = (rc.size*2)/3; } } QFont f = rc.font(); if (rc.fontSize() != rc.size) { f.setPointSize(rc.size); } f.setBold(fi->attributes.bold); f.setItalic(fi->attributes.italic); f.setUnderline(fi->attributes.underline); if (rc.p && fi->attributes.color.isValid()) { rc.p->setPen(fi->attributes.color); } else if (rc.p) { rc.p->setPen(rc.pen); } rc.setFont(f); if (fi->linebreak) { rc.x = oldX; rc.y += rc.fontAscent() + rc.fontDescent() + 1; fi = fi->next; continue; } if (!rc.substitute && (fi->scalar || fi->vector)) { QString txt = QString("[") + fi->text + "]"; if (rc.p) { rc.p->drawText(rc.x, rc.y, txt); } rc.x += rc.fontWidth(txt); } else if (fi->scalar) { // do scalar/string/fit substitution QString txt; if (!fi->text.isEmpty() && fi->text[0] == '=') { // Parse and evaluate as an equation bool ok = false; const double eqResult(Equation::interpret(fi->text.mid(1).latin1(), &ok)); txt = QString::number(eqResult, 'g', rc.precision); if (rc._cache) { rc._cache->append(DataRef(DataRef::DRExpression, fi->text, QString::null, 0.0, QVariant(eqResult))); } } else { KST::scalarList.lock().readLock(); KstScalarPtr scp = *KST::scalarList.findTag(fi->text); KST::scalarList.lock().unlock(); if (scp) { scp->readLock(); txt = QString::number(scp->value(), 'g', rc.precision); if (rc._cache) { rc._cache->append(DataRef(DataRef::DRScalar, fi->text, QString::null, 0.0, QVariant(scp->value()))); } scp->unlock(); } else { KST::stringList.lock().readLock(); KstStringPtr stp = *KST::stringList.findTag(fi->text); KST::stringList.lock().unlock(); if (stp) { stp->readLock(); txt = stp->value(); if (rc._cache) { rc._cache->append(DataRef(DataRef::DRString, fi->text, QString::null, 0.0, QVariant(stp->value()))); } stp->unlock(); } else { KST::dataObjectList.lock().readLock(); KstDataObjectList::Iterator oi = KST::dataObjectList.findTag(fi->text); KST::dataObjectList.lock().unlock(); if (oi != KST::dataObjectList.end()) { KstPluginPtr fit = kst_cast<KstPlugin>(*oi); if (fit) { fit->readLock(); const QString txtAll = fit->label(rc.precision); fit->unlock(); const QValueList<QString> strList = QStringList::split('\n', txtAll); QValueListConstIterator<QString> last = --(strList.end()); for (QValueListConstIterator<QString> iter = strList.begin(); iter != strList.end(); ++iter) { txt = (*iter); if (iter != last) { if (rc.p) { rc.p->drawText(rc.x, rc.y, txt); } else { rc.ascent = kMax(rc.ascent, -rc.y + rc.fontAscent()); if (-rc.y - rc.fontDescent() < 0) { rc.descent = kMax(rc.descent, rc.fontDescent() + rc.y); } } rc.x += rc.fontWidth(txt); rc.xMax = kMax(rc.xMax, rc.x); rc.x = oldX; rc.y += rc.fontAscent() + rc.fontDescent() + 1; } } if (rc._cache) { rc._cache->append(DataRef(DataRef::DRFit, fi->text, txtAll, rc.precision, QVariant(0.0))); } } } } } } if (rc.p) { rc.p->drawText(rc.x, rc.y, txt); } rc.x += rc.fontWidth(txt); } else if (fi->vector) { QString txt; KST::vectorList.lock().readLock(); KstVectorPtr vp = *KST::vectorList.findTag(fi->text); KST::vectorList.lock().unlock(); if (vp) { if (!fi->expression.isEmpty()) { // Parse and evaluate as an equation bool ok = false; // FIXME: make more efficient: cache the parsed equation const double idx = Equation::interpret(fi->expression.latin1(), &ok); if (ok) { vp->readLock(); const double vVal(vp->value()[int(idx)]); txt = QString::number(vVal, 'g', rc.precision); if (rc._cache) { rc._cache->append(DataRef(DataRef::DRVector, fi->text, fi->expression, idx, QVariant(vVal))); } vp->unlock(); } else { txt = "NAN"; } } } if (rc.p) { rc.p->drawText(rc.x, rc.y, txt); } rc.x += rc.fontWidth(txt); } else if (fi->tab) { const int tabWidth = rc.fontWidth("MMMMMMMM"); const int toSkip = tabWidth - (rc.x - rc.xStart) % tabWidth; if (rc.p && fi->attributes.underline) { const int spaceWidth = rc.fontWidth(" "); const int spacesToSkip = tabWidth / spaceWidth + (tabWidth % spaceWidth > 0 ? 1 : 0); rc.p->drawText(rc.x, rc.y, QString().fill(' ', spacesToSkip)); } rc.x += toSkip; } else { if (rc.p) { #ifdef BENCHMARK QTime t; t.start(); #endif rc.p->drawText(rc.x, rc.y, fi->text); #ifdef BENCHMARK kstdDebug() << "Renderer did draw, time: " << t.elapsed() << endl; #endif } rc.x += rc.fontWidth(fi->text); } if (!rc.p) { // No need to compute ascent and descent when really painting rc.ascent = kMax(rc.ascent, -rc.y + rc.fontAscent()); if (-rc.y - rc.fontDescent() < 0) { rc.descent = kMax(rc.descent, rc.fontDescent() + rc.y); } } int xNext = rc.x; if (fi->group) { renderLabel(rc, fi->group); xNext = rc.x; } if (fi->up) { int xPrev = rc.x; renderLabel(rc, fi->up); xNext = kMax(xNext, rc.x); rc.x = xPrev; } if (fi->down) { renderLabel(rc, fi->down); xNext = kMax(xNext, rc.x); } rc.x = xNext; rc.xMax = kMax(rc.xMax, rc.x); fi = fi->next; } rc.size = oldSize; rc.y = oldY; }
bool KstEqDialogI::newObject() { QString tag_name = _tagName->text(); QString etext = _w->_equation->text(); etext.remove(QRegExp("[^a-zA-Z0-9\\(\\)\\+\\-\\*/\\%\\^\\|\\&\\!<>=_.]")); if (etext.length() > 12) { etext.truncate(12); etext += "..."; } if (tag_name == defaultTag) { tag_name = KST::suggestEQName(etext); } /* verify that the curve name is unique */ if (KstData::self()->dataTagNameNotUnique(tag_name)) { _tagName->setFocus(); return false; } if (!checkEntries()) { return false; } KST::vectorList.lock().readLock(); /* find *V */ KstVectorPtr vp = *KST::vectorList.findTag(_w->_xVectors->selectedVector()); if (!vp) { kstdFatal() << "Bug in kst: the Vector field (Eq) " << "refers to a non-existent vector..." << endl; } KST::vectorList.lock().unlock(); /** Create the equation here */ vp->readLock(); KstEquationPtr eq = new KstEquation(tag_name, _w->_equation->text(), vp, _w->_doInterpolation->isChecked()); vp->unlock(); if (!eq->isValid()) { eq = 0L; QString parseErrors; for (QStringList::ConstIterator i = Equation::errorStack.begin(); i != Equation::errorStack.end(); ++i) { parseErrors += *i; parseErrors += "\n"; } KMessageBox::detailedSorry(this, i18n("There is an error in the equation you entered."), parseErrors); return false; } KstVCurvePtr vc = new KstVCurve(KST::suggestCurveName(tag_name, true), eq->vX(), eq->vY(), 0L, 0L, 0L, 0L, _w->_curveAppearance->color()); vc->setHasPoints(_w->_curveAppearance->showPoints()); vc->setHasLines(_w->_curveAppearance->showLines()); vc->setHasBars(_w->_curveAppearance->showBars()); vc->setLineWidth(_w->_curveAppearance->lineWidth()); vc->setLineStyle(_w->_curveAppearance->lineStyle()); vc->pointType = _w->_curveAppearance->pointType(); vc->setPointDensity(_w->_curveAppearance->pointDensity()); vc->setBarStyle(_w->_curveAppearance->barStyle()); QString legend_text = _legendText->text(); if (legend_text == defaultTag) { vc->setLegendText(QString("")); } else { vc->setLegendText(legend_text); } KstViewWindow *w = dynamic_cast<KstViewWindow*>(KstApp::inst()->findWindow(_w->_curvePlacement->_plotWindow->currentText())); if (!w) { QString n = KstApp::inst()->newWindow(KST::suggestWinName()); w = dynamic_cast<KstViewWindow*>(KstApp::inst()->findWindow(n)); } if (w) { Kst2DPlotPtr plot; if (_w->_curvePlacement->existingPlot()) { /* assign curve to plot */ plot = kst_cast<Kst2DPlot>(w->view()->findChild(_w->_curvePlacement->plotName())); if (plot) { plot->addCurve(vc.data()); } } if (_w->_curvePlacement->newPlot()) { /* assign curve to plot */ QString name = w->createObject<Kst2DPlot>(KST::suggestPlotName()); if (_w->_curvePlacement->reGrid()) { w->view()->cleanup(_w->_curvePlacement->columns()); } plot = kst_cast<Kst2DPlot>(w->view()->findChild(name)); if (plot) { _w->_curvePlacement->update(); _w->_curvePlacement->setCurrentPlot(plot->tagName()); plot->addCurve(vc.data()); plot->generateDefaultLabels(); } } } KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(eq.data()); KST::dataObjectList.append(vc.data()); KST::dataObjectList.lock().unlock(); eq = 0L; // drop the reference before we update vc = 0L; emit modified(); return true; }
void KstObjectItem::update(bool recursive, int localUseCount) { switch (_rtti) { case RTTI_OBJ_DATA_VECTOR: { KST::vectorList.lock().readLock(); KstRVectorPtr x = kst_cast<KstRVector>(*KST::vectorList.findTag(_tag)); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field; if (inUse) { field = QString::number(x->length()); } else { field = "-"; } if (text(3) != field) { setText(3, field); } field = i18n("%3: %4 [%1..%2]").arg(x->reqStartFrame()) .arg(x->reqStartFrame() + x->reqNumFrames()) .arg(x->filename()) .arg(x->field()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } // Hmmm what happens if this if() fails?? We become inconsistent? break; } case RTTI_OBJ_STATIC_VECTOR: { KST::vectorList.lock().readLock(); KstSVectorPtr x = kst_cast<KstSVector>(*KST::vectorList.findTag(_tag)); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field; if (inUse) { field = QString::number(x->length()); } else { field = "-"; } if (text(3) != field) { setText(3, field); } field = i18n("%1 to %2").arg(x->min()).arg(x->max()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } // Hmmm what happens if this if() fails?? We become inconsistent? break; } case RTTI_OBJ_VECTOR: { KST::vectorList.lock().readLock(); KstVectorPtr x = *KST::vectorList.findTag(_tag); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: // subtract 1 for KstVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->length()); if (text(3) != field) { setText(3, field); } field = i18n("[%1..%2]").arg(x->min()).arg(x->max()); if (text(4) != field) { setText(4, field); } x->unlock(); _removable = false; } break; } case RTTI_OBJ_OBJECT: { KST::dataObjectList.lock().readLock(); KstDataObjectPtr x = *KST::dataObjectList.findTag(_tag.tag()); KST::dataObjectList.lock().unlock(); if (x) { x->readLock(); QString field = x->typeString(); if (text(1) != field) { setText(1, field); } // getUsage: // subtract 1 for KstDataObjectPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } if (x->sampleCount() > 0) { field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } } else { if (text(3) != "-") { setText(3, "-"); } } field = x->propertyString(); if (text(4) != field) { setText(4, field); } if (recursive) { QPtrStack<QListViewItem> trash; KstVectorMap vl = x->outputVectors(); KstVectorMap::Iterator vlEnd = vl.end(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (vl.findTag(oi->tag().tag()) == vlEnd) { trash.push(i); } } trash.setAutoDelete(true); trash.clear(); // get the output vectors for (KstVectorMap::Iterator p = vl.begin(); p != vlEnd; ++p) { bool found = false; QString tn = p.data()->tag().tag(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (oi->tag().tag() == tn) { oi->update(); found = true; break; } } if (!found) { KstObjectItem *item = new KstObjectItem(this, p.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } } KstMatrixMap ml = x->outputMatrices(); KstMatrixMap::Iterator mlEnd = ml.end(); // also get the output matrices for (KstMatrixMap::Iterator p = ml.begin(); p != mlEnd; ++p) { bool found = false; QString tn = p.data()->tag().tag(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (oi->tag().tag() == tn) { oi->update(); found = true; break; } } if (!found) { KstObjectItem *item = new KstObjectItem(this, p.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } } } _removable = x->getUsage() == 1; x->unlock(); } break; } case RTTI_OBJ_DATA_MATRIX: { KST::matrixList.lock().readLock(); KstRMatrixPtr x = kst_cast<KstRMatrix>(*KST::matrixList.findTag(_tag)); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRMatrixPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("%1: %2 (%3 by %4)").arg(x->filename()).arg(x->field()) .arg(x->xNumSteps()) .arg(x->yNumSteps()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } break; } case RTTI_OBJ_STATIC_MATRIX: { KST::matrixList.lock().readLock(); KstSMatrixPtr x = kst_cast<KstSMatrix>(*KST::matrixList.findTag(_tag)); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRMatrixPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("%1 to %2").arg(x->gradZMin()).arg(x->gradZMax()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } break; } case RTTI_OBJ_MATRIX: { KST::matrixList.lock().readLock(); KstMatrixPtr x = *KST::matrixList.findTag(_tag); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: // subtract 1 for KstVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("[%1..%2]").arg(x->minValue()).arg(x->maxValue()); if (text(4) != field) { setText(4, field); } x->unlock(); _removable = false; } break; } default: assert(0); } }
bool KstPsdDialog::newObject() { QString tag_name = _tagName->text(); bool retVal = false; if (tag_name == defaultTag) { tag_name = KST::suggestPSDName(KstObjectTag::fromString(_w->_vector->selectedVector())); } if (KstData::self()->dataTagNameNotUnique(tag_name)) { _tagName->setFocus(); return false; } if (_w->_vector->selectedVector().isEmpty()) { QMessageBox::warning(this, QObject::tr("Kst"), QObject::tr("New spectrum not made: define vectors first.")); return false; } KST::vectorList.lock().readLock(); KstVectorPtr p = *KST::vectorList.findTag(_w->_vector->selectedVector()); KST::vectorList.lock().unlock(); if (_w->_kstFFTOptions->checkValues()) { if (p) { KstVCurvePtr vc; KstPSDPtr psd; QColor color; p->readLock(); psd = new KstPSD(tag_name, p, _w->_kstFFTOptions->SampRate->text().toDouble(), _w->_kstFFTOptions->Interleaved->isChecked(), _w->_kstFFTOptions->FFTLen->text().toInt(), _w->_kstFFTOptions->Apodize->isChecked(), _w->_kstFFTOptions->RemoveMean->isChecked(), _w->_kstFFTOptions->VectorUnits->text(), _w->_kstFFTOptions->RateUnits->text(), ApodizeFunction(_w->_kstFFTOptions->ApodizeFxn->currentIndex()), _w->_kstFFTOptions->Sigma->value(), PSDType(_w->_kstFFTOptions->Output->currentIndex())); psd->setInterpolateHoles(_w->_kstFFTOptions->InterpolateHoles->isChecked()); p->unlock(); // xxx color = KstApp::inst()->chooseColorDlg()->getColorForCurve(psd->vX(), psd->vY()); if (!color.isValid()) { color = _w->_curveAppearance->color(); } vc = new KstVCurve(KST::suggestCurveName(psd->tag(),true), psd->vX(), psd->vY(), KstVectorPtr(), KstVectorPtr(), KstVectorPtr(), KstVectorPtr(), color); vc->setHasPoints(_w->_curveAppearance->showPoints()); vc->setHasLines(_w->_curveAppearance->showLines()); vc->setHasBars(_w->_curveAppearance->showBars()); vc->setPointStyle(_w->_curveAppearance->pointType()); vc->setLineWidth(_w->_curveAppearance->lineWidth()); vc->setLineStyle(_w->_curveAppearance->lineStyle()); vc->setBarStyle(_w->_curveAppearance->barStyle()); vc->setPointDensity(_w->_curveAppearance->pointDensity()); QString legend_text = _legendText->text(); if (legend_text == defaultTag) { vc->setLegendText(QString::null); } else { vc->setLegendText(legend_text); } Kst2DPlotPtr plot; KstViewWindow *w; /* xxx w = dynamic_cast<KstViewWindow*>(KstApp::inst()->findWindow(_w->_curvePlacement->_plotWindow->currentText())); if (!w) { QString n = KstApp::inst()->newWindow(KST::suggestWinName()); w = static_cast<KstViewWindow*>(KstApp::inst()->findWindow(n)); } */ if (w) { if (_w->_curvePlacement->existingPlot()) { plot = kst_cast<Kst2DPlot>(w->view()->findChild(_w->_curvePlacement->plotName())); if (plot) { plot->addCurve(vc); } } if (_w->_curvePlacement->newPlot()) { QString name = w->createPlot(KST::suggestPlotName()); if (_w->_curvePlacement->reGrid()) { w->view()->cleanup(_w->_curvePlacement->columns()); } plot = kst_cast<Kst2DPlot>(w->view()->findChild(name)); if (plot) { plot->setXAxisInterpretation(false, KstAxisInterpretation(), KstAxisDisplay()); plot->setYAxisInterpretation(false, KstAxisInterpretation(), KstAxisDisplay()); _w->_curvePlacement->update(); _w->_curvePlacement->setCurrentPlot(plot->tagName()); plot->addCurve(vc); plot->generateDefaultLabels(); } } } KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(psd); KST::dataObjectList.append(vc); KST::dataObjectList.lock().unlock(); psd = 0L; vc = 0L; emit modified(); retVal = true; } } return retVal; }
void KstViewLabel::DataCache::update() { for (QValueVector<DataRef>::ConstIterator i = data.begin(); valid && i != data.end(); ++i) { switch ((*i).type) { case DataRef::DataRef::DRScalar: { KST::scalarList.lock().readLock(); KstScalarPtr p = *KST::scalarList.findTag((*i).name); KST::scalarList.lock().unlock(); if (p) { p->readLock(); if (QVariant(p->value()) != (*i).value) { valid = false; } p->unlock(); } } break; case DataRef::DRString: { KST::stringList.lock().readLock(); KstStringPtr p = *KST::stringList.findTag((*i).name); KST::stringList.lock().unlock(); if (p) { p->readLock(); if (QVariant(p->value()) != (*i).value) { valid = false; } p->unlock(); } } break; case DataRef::DRExpression: { bool ok = false; const double val = Equation::interpret((*i).name.latin1(), &ok, (*i).name.length()); if (QVariant(val) != (*i).value) { valid = false; } } break; case DataRef::DRVector: { bool ok = false; const double idx = Equation::interpret((*i).index.latin1(), &ok, (*i).index.length()); if (idx != (*i).indexValue) { valid = false; break; } KST::vectorList.lock().readLock(); KstVectorPtr p = *KST::vectorList.findTag((*i).name); KST::vectorList.lock().unlock(); if (p) { p->readLock(); if (QVariant(p->value(int((*i).indexValue))) != (*i).value) { valid = false; } p->unlock(); } } break; case DataRef::DataRef::DRFit: { KST::dataObjectList.lock().readLock(); KstDataObjectList::Iterator oi = KST::dataObjectList.findTag((*i).name); KST::dataObjectList.lock().unlock(); if (oi != KST::dataObjectList.end()) { KstCPluginPtr fit = kst_cast<KstCPlugin>(*oi); if (fit) { fit->readLock(); if (fit->label((int)((*i).indexValue)) != (*i).index) { valid = false; } fit->unlock(); } } } break; } } }
bool KstHsDialog::newObject() { QString tag_name = _tagName->text(); if (tag_name == defaultTag) { tag_name = KST::suggestHistogramName(KstObjectTag::fromString(_w->_vector->selectedVector())); } // // verify that the curve name is unique... // if (KstData::self()->dataTagNameNotUnique(tag_name)) { _tagName->setFocus(); return false; } if (_w->_vector->selectedVector().isEmpty()) { QMessageBox::warning(this, QObject::tr("Kst"), QObject::tr("New Histogram not made: define vectors first.")); return false; } // // find max and min... // double new_min = _w->Min->text().toDouble(); double new_max = _w->Max->text().toDouble(); if (new_max < new_min) { double m = new_max; new_max = new_min; new_min = m; } if (new_max == new_min) { QMessageBox::warning(this, QObject::tr("kst"), QObject::tr("Max and Min can not be equal.")); return false; } int new_n_bins = _w->N->text().toInt(); if (new_n_bins < 1) { QMessageBox::warning(this, QObject::tr("kst"), QObject::tr("You must have one or more bins in a histogram.")); return false; } KstHsNormType new_norm_mode; if (_w->NormIsPercent->isChecked()) { new_norm_mode = KST_HS_PERCENT; } else if (_w->NormIsFraction->isChecked()) { new_norm_mode = KST_HS_FRACTION; } else if (_w->PeakIs1->isChecked()) { new_norm_mode = KST_HS_MAX_ONE; } else { new_norm_mode = KST_HS_NUMBER; } KstHistogramPtr hs; KST::vectorList.lock().readLock(); KstVectorPtr vp = *KST::vectorList.findTag(_w->_vector->selectedVector()); KST::vectorList.lock().unlock(); if (vp) { KstVCurvePtr vc; KstViewWindow *w; QColor color; vp->readLock(); hs = new KstHistogram(tag_name, vp, new_min, new_max, new_n_bins, new_norm_mode); vp->unlock(); hs->setRealTimeAutoBin(_w->_realTimeAutoBin->isChecked()); // xxx color = KstApp::inst()->chooseColorDlg()->getColorForCurve(hs->vX(), hs->vY()); if (!color.isValid()) { color = _w->_curveAppearance->color(); } vc = new KstVCurve(KST::suggestCurveName(hs->tag(), true), hs->vX(), hs->vY(), KstVectorPtr(), KstVectorPtr(), KstVectorPtr(), KstVectorPtr(), color); vc->setHasPoints(_w->_curveAppearance->showPoints()); vc->setHasLines(_w->_curveAppearance->showLines()); vc->setHasBars(_w->_curveAppearance->showBars()); vc->setPointStyle(_w->_curveAppearance->pointType()); vc->setLineWidth(_w->_curveAppearance->lineWidth()); vc->setLineStyle(_w->_curveAppearance->lineStyle()); vc->setBarStyle(_w->_curveAppearance->barStyle()); vc->setPointDensity(_w->_curveAppearance->pointDensity()); QString legendText = _legendText->text(); if (legendText == defaultTag) { vc->setLegendText(QString("")); } else { vc->setLegendText(legendText); } /* xxx w = dynamic_cast<KstViewWindow*>(KstApp::inst()->findWindow(_w->_curvePlacement->_plotWindow->currentText())); */ if (!w) { QString n = KstApp::inst()->newWindow(KST::suggestWinName()); // xxx w = static_cast<KstViewWindow*>(KstApp::inst()->findWindow(n)); } if (w) { Kst2DPlotPtr plot; if (_w->_curvePlacement->existingPlot()) { plot = kst_cast<Kst2DPlot>(w->view()->findChild(_w->_curvePlacement->plotName())); if (plot) { plot->addCurve(vc); } } if (_w->_curvePlacement->newPlot()) { QString name = w->createPlot(KST::suggestPlotName()); if (_w->_curvePlacement->reGrid()) { w->view()->cleanup(_w->_curvePlacement->columns()); } plot = kst_cast<Kst2DPlot>(w->view()->findChild(name)); if (plot) { _w->_curvePlacement->update(); _w->_curvePlacement->setCurrentPlot(plot->tagName()); plot->addCurve(vc); plot->generateDefaultLabels(); } } } KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(hs); KST::dataObjectList.append(vc); KST::dataObjectList.lock().unlock(); hs = 0L; vc = 0L; emit modified(); } return true; }
/* returns true if succesful */ bool KstPsdDialogI::newObject() { QString tag_name = _tagName->text(); if (tag_name == defaultTag) { tag_name = KST::suggestPSDName(KstObjectTag::fromString(_w->_vector->selectedVector())); } // verify that the curve name is unique if (KstData::self()->dataTagNameNotUnique(tag_name)) { _tagName->setFocus(); return false; } if (_w->_vector->selectedVector().isEmpty()) { KMessageBox::sorry(this, i18n("New PSD not made: define vectors first.")); return false; } KST::vectorList.lock().readLock(); KstVectorPtr p = *KST::vectorList.findTag(_w->_vector->selectedVector()); KST::vectorList.lock().unlock(); if (!p) { kstdFatal() << "Bug in kst: the vector field (PSD) refers to " << "a non existant vector...." << endl; } // create the psd curve if (!_w->_kstFFTOptions->checkValues()) { return false; } else { p->readLock(); KstPSDPtr psd = new KstPSD(tag_name, p, _w->_kstFFTOptions->SampRate->text().toDouble(), _w->_kstFFTOptions->Interleaved->isChecked(), _w->_kstFFTOptions->FFTLen->text().toInt(), _w->_kstFFTOptions->Apodize->isChecked(), _w->_kstFFTOptions->RemoveMean->isChecked(), _w->_kstFFTOptions->VectorUnits->text(), _w->_kstFFTOptions->RateUnits->text(), ApodizeFunction(_w->_kstFFTOptions->ApodizeFxn->currentItem()), _w->_kstFFTOptions->Sigma->value(), PSDType(_w->_kstFFTOptions->Output->currentItem())); psd->setInterpolateHoles(_w->_kstFFTOptions->InterpolateHoles->isChecked()); p->unlock(); KstVCurvePtr vc = new KstVCurve(KST::suggestCurveName(psd->tag(),true), psd->vX(), psd->vY(), 0L, 0L, 0L, 0L, _w->_curveAppearance->color()); vc->setHasPoints(_w->_curveAppearance->showPoints()); vc->setHasLines(_w->_curveAppearance->showLines()); vc->setHasBars(_w->_curveAppearance->showBars()); vc->pointType = _w->_curveAppearance->pointType(); vc->setLineWidth(_w->_curveAppearance->lineWidth()); vc->setLineStyle(_w->_curveAppearance->lineStyle()); vc->setBarStyle(_w->_curveAppearance->barStyle()); vc->setPointDensity(_w->_curveAppearance->pointDensity()); QString legend_text = _legendText->text(); if (legend_text == defaultTag) { vc->setLegendText(QString::null); } else { vc->setLegendText(legend_text); } Kst2DPlotPtr plot; KstViewWindow *w = dynamic_cast<KstViewWindow*>(KstApp::inst()->findWindow(_w->_curvePlacement->_plotWindow->currentText())); if (!w) { QString n = KstApp::inst()->newWindow(KST::suggestWinName()); w = static_cast<KstViewWindow*>(KstApp::inst()->findWindow(n)); } if (w) { if (_w->_curvePlacement->existingPlot()) { // assign curve to plot plot = kst_cast<Kst2DPlot>(w->view()->findChild(_w->_curvePlacement->plotName())); if (plot) { plot->addCurve(vc.data()); } } if (_w->_curvePlacement->newPlot()) { // assign curve to plot QString name = w->createObject<Kst2DPlot>(KST::suggestPlotName()); if (_w->_curvePlacement->reGrid()) { w->view()->cleanup(_w->_curvePlacement->columns()); } plot = kst_cast<Kst2DPlot>(w->view()->findChild(name)); if (plot) { plot->setXAxisInterpretation(false, KstAxisInterpretation(), KstAxisDisplay()); plot->setYAxisInterpretation(false, KstAxisInterpretation(), KstAxisDisplay()); _w->_curvePlacement->update(); _w->_curvePlacement->setCurrentPlot(plot->tagName()); plot->addCurve(vc.data()); plot->generateDefaultLabels(); } } } KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(psd.data()); KST::dataObjectList.append(vc.data()); KST::dataObjectList.lock().unlock(); psd = 0L; vc = 0L; emit modified(); } return true; }
void KstViewFitsDialog::fitChanged(const QString& strFit) { KstCPluginList fits; KstCPluginPtr plugin; double* params = 0L; double* covars = 0L; double chi2Nu = 0.0; int numParams = 0; int numCovars = 0; int i; fits = kstObjectSubList<KstDataObject,KstCPlugin>(KST::dataObjectList); plugin = *(fits.findTag(strFit)); if (plugin) { KstScalarPtr scalarChi2Nu; KstVectorPtr vectorParam; plugin->readLock(); const KstScalarMap& scalars = plugin->outputScalars(); scalarChi2Nu = scalars["chi^2/nu"]; if (scalarChi2Nu) { scalarChi2Nu->readLock(); chi2Nu = scalarChi2Nu->value(); scalarChi2Nu->unlock(); } const KstVectorMap& vectors = plugin->outputVectors(); vectorParam = vectors["Parameters"]; if (vectorParam) { KstVectorPtr vectorCovar; vectorParam->readLock(); vectorCovar = vectors["Covariance"]; if (vectorCovar) { vectorCovar->readLock(); numParams = vectorParam->length(); numCovars = vectorCovar->length(); if (numParams > 0 && numCovars > 0) { params = new double[numParams]; covars = new double[numCovars]; for (i = 0; i < numParams; i++) { params[i] = vectorParam->value(i); } for (i = 0; i < numCovars; i++) { covars[i] = vectorCovar->value(i); } } vectorCovar->unlock(); } vectorParam->unlock(); } plugin->unlock(); } _tableFits->setParameters(params, numParams, covars, numCovars, chi2Nu); if (numParams > 0) { _tableFits->horizontalHeaderItem(0)->setText(QObject::tr("Value")); _tableFits->horizontalHeaderItem(1)->setText(QObject::tr("Covariance:")); _tableFits->verticalHeaderItem(numParams+0)->setText("---"); _tableFits->verticalHeaderItem(numParams+1)->setText(QObject::tr("Chi^2/Nu")); if (plugin) { QExplicitlySharedDataPointer<Plugin> pluginBase; plugin->readLock(); pluginBase = plugin->plugin(); if (pluginBase) { textLabelFit->setText(pluginBase->data()._readableName); for (i = 0; i < numParams; i++) { QString parameterName = pluginBase->parameterName(i); _tableFits->horizontalHeaderItem(i+2)->setText(parameterName); _tableFits->verticalHeaderItem(i)->setText(parameterName); } } plugin->unlock(); } } _tableFits->update(); }