diff --git a/src/fgt/edit_quality/TO DO.txt b/src/fgt/edit_quality/TO DO.txt index 5182dc03e..f002d5834 100644 --- a/src/fgt/edit_quality/TO DO.txt +++ b/src/fgt/edit_quality/TO DO.txt @@ -3,3 +3,4 @@ 19.53 16/01/2008 aggiungere alla TF_KEY un campo per capire "a quale punto (su o giù)" è attaccata la linea del grafico! 16.51 18/01/2008 valutare il caso in cui una chiave sia legata sia "a sinistra" che "a destra" ad altre chavi. Adeguare la struttura dati di conseguenza 16.51 18/01/2008 collassare i 2 (eventuali) nodi una chiave posta in 0.0 o 1.0 ad un solo nodo (quello di giunzione) +23.03 19/01/2008 implementare la creazione di una Transfer Function partendo da un file csv e l'esportazione nello stesso formato \ No newline at end of file diff --git a/src/fgt/edit_quality/qualitymapper.cpp b/src/fgt/edit_quality/qualitymapper.cpp index 61c8671fd..402a4c0ee 100644 --- a/src/fgt/edit_quality/qualitymapper.cpp +++ b/src/fgt/edit_quality/qualitymapper.cpp @@ -90,12 +90,10 @@ void QualityMapperPlugin::Decorate(QAction * /*ac*/, MeshModel &m, GLArea * gla) { } -void QualityMapperPlugin::StartEdit(QAction * /*mode*/, MeshModel &m, GLArea *gla ) +void QualityMapperPlugin::StartEdit(QAction *mode, MeshModel &m, GLArea *gla ) { // gla->setCursor(QCursor(QPixmap(":/images/cur_info.png"),1,1)); - - if(_qualityMapperDialog==0) { //_qualityMapperDialog=new _qualityMapperDialog(gla->parentWidget()->parentWidget()); @@ -108,26 +106,46 @@ void QualityMapperPlugin::StartEdit(QAction * /*mode*/, MeshModel &m, GLArea *gl // connect(_qualityMapperDialog->ui.glueHereAllButton,SIGNAL(clicked()),this,SLOT(glueHereAll())); // connect(_qualityMapperDialog->ui.falseColorCB, SIGNAL(clicked(bool)) , _gla->window(), SLOT(updateGL() ) ); - Histogramf h; - QualityMapperPlugin::ComputePerVertexQualityHistogram(m.cm, h, 100); - - Frange mmmq(tri::Stat::ComputePerVertexQualityMinMax(m.cm)); - _qmSettings.meshMinQ = mmmq.minV; - _qmSettings.meshMaxQ = mmmq.maxV; - _qmSettings.meshMidQ = (mmmq.minV+mmmq.maxV)/2; +// Histogramf h; // _qmSettings.histoMinQ = H.Percentile(_qmSettings.percentile/100); // _qmSettings.histoMaxQ = H.Percentile(1.0f-_qmSettings.percentile/100); - _qualityMapperDialog->setValues(_qmSettings); - _qualityMapperDialog->initEqualizerHistogram(&h); - } + + //building up histogram... + QualityMapperPlugin::ComputePerVertexQualityHistogram(m.cm, _histogram, 100); + Frange mmmq(tri::Stat::ComputePerVertexQualityMinMax(m.cm)); + //...histogram built + + //setting and applying settings to dialog (??) MAL + _qmSettings.meshMinQ = mmmq.minV; + _qmSettings.meshMaxQ = mmmq.maxV; + _qmSettings.meshMidQ = (mmmq.minV+mmmq.maxV)/2; + _qualityMapperDialog->setValues(_qmSettings); + + //drawing histogram in dialog(??) MAL + _qualityMapperDialog->initEqualizerHistogram(_histogram); + + //drawing transferFunction + _qualityMapperDialog->drawTransferFunction( _transfer_function ); + // _qualityMapperDialog->edit=this; // _qualityMapperDialog->setTree(& meshTree, meshTree.nodeList.front()); + + //dialog ready to be displayed. Show it now! _qualityMapperDialog->show(); } +void QualityMapperPlugin::EndEdit(QAction * , MeshModel &, GLArea * ) +{ + if ( _qualityMapperDialog ) + { + delete _qualityMapperDialog; + _qualityMapperDialog = 0; + } +} + void QualityMapperPlugin::ComputePerVertexQualityHistogram( CMeshO & m, Histogramf &h, int bins=10000) // V1.0 { h.Clear(); diff --git a/src/fgt/edit_quality/qualitymapper.h b/src/fgt/edit_quality/qualitymapper.h index 7a052056e..c1b346731 100644 --- a/src/fgt/edit_quality/qualitymapper.h +++ b/src/fgt/edit_quality/qualitymapper.h @@ -42,12 +42,14 @@ Beginning #include //#include -#include //#include #include //<-- contains VertexQuality method #include "qualitymapperdialog.h" +#include +#include "transferfunction.h" + class QualityMapperPlugin : public QObject, public MeshEditInterface { @@ -58,6 +60,8 @@ private: QualityMapperDialog *_qualityMapperDialog; QList actionList; Histogramf _histogram; + TransferFunction _transfer_function; + QualityMapperSettings _qmSettings; public: @@ -72,7 +76,7 @@ public: // Called when the user press the first time the button void StartEdit (QAction * /*mode*/, MeshModel &/*m*/, GLArea * /*parent*/); // Called when the user press the second time the button - void EndEdit (QAction * /*mode*/, MeshModel &/*m*/, GLArea * /*parent*/){}; + void EndEdit (QAction * /*mode*/, MeshModel &/*m*/, GLArea * /*parent*/); void Decorate (QAction * /*mode*/, MeshModel &/*m*/, GLArea * /*parent*/); void mousePressEvent (QAction *, QMouseEvent *, MeshModel &, GLArea * ) {}; void mouseMoveEvent (QAction *, QMouseEvent *, MeshModel &, GLArea * ) {}; @@ -81,8 +85,7 @@ public: QPoint cur; bool haveToPick; - void ComputePerVertexQualityHistogram( CMeshO & m, Histogramf &h, int bins); - + void ComputePerVertexQualityHistogram( CMeshO & m, Histogramf &h, int bins); }; #endif diff --git a/src/fgt/edit_quality/qualitymapperdialog.cpp b/src/fgt/edit_quality/qualitymapperdialog.cpp index f36316d9e..fa4e8dd36 100644 --- a/src/fgt/edit_quality/qualitymapperdialog.cpp +++ b/src/fgt/edit_quality/qualitymapperdialog.cpp @@ -3,7 +3,6 @@ #include #include -//#include QualityMapperDialog::QualityMapperDialog(QWidget *parent) : QDialog(parent) @@ -50,13 +49,63 @@ QualityMapperSettings QualityMapperDialog::getValues() return _settings; } -void QualityMapperDialog::initEqualizerHistogram(vcg::Histogramf *h) + +void QualityMapperDialog::drawCartesianChartBasics(QGraphicsScene& scene, QGraphicsView *view) +{ + int width = /*300;*/view->width(); + int height = /*200;*/view->height(); + + border = 5; + chartRectangleThickness = 2; + leftBorder = border; + rightBorder = width - border; + upperBorder = border; + lowerBorderForCartesians = height - (int)(border * 3); + + // Create a LightBlue background + //_equalizerScene.addRect(chartRectangleThickness, chartRectangleThickness, width - (2 * chartRectangleThickness), height - (2 * chartRectangleThickness), QPen(), QBrush(QColor(230, 230, 255), Qt::SolidPattern)); + + //drawing chart title + //this.writeString(g, title, titleLabelSize, Color.Black, Positions.North); + + //drawing scale values on X and Y axis + //this.drawXYValuesScale(chartType, g, maxRoundedY, vals, xyLabelsSize); + + QPen p( Qt::black, 2 ); + + //drawing axis + //x axis + scene.addLine(leftBorder, lowerBorderForCartesians, rightBorder, lowerBorderForCartesians, p ); + //y axis + scene.addLine(leftBorder, upperBorder, leftBorder, lowerBorderForCartesians, p ); + + /* + //drawing axis labels + //drawing X label + this.writeString(g, header.xLabel, xyLabelsSize, Color.Black, Positions.South); + //drawing Y label + String yLabel = header.yLabel; + //if the y label represent a delay, the time unit is added to the string (min.) [MINUTE] + if ((yLabel.ToLower()).Contains("delay")) + yLabel += " min."; + this.writeString(g, yLabel, xyLabelsSize, Color.Black, Positions.West); + */ +} + + +//il nome non mi sembra giusto. Questo dovrebbe essere piuttosto drawHistogram +//il calcolo di miY e maxY mi pare sia superflo. Se non erro già la classe histogram li ha dentro (cmq mi pare vengano calcolati in ComputePerVertexQualityMinMax) +//se proprio vanno calcolati minY e maxY, maxY può essere inizializzato a -1 (pedantic mode) +//_equalizerScene dovrebbe chiamarsi in realtà histogramScene +//l'histogram e la transfer function potrebbero diventare attributi di questa classe? valutare l'impatto. +//in generale il codice di questo metodo va ripulito un po'... +void QualityMapperDialog::initEqualizerHistogram( Histogramf& h ) { //_equalizerScene(); _equalizerScene.addText("Hello World!"); - int width = 300;//ui.equalizerGraphicsView->width(); - int height = 200;//ui.equalizerGraphicsView->height(); + int width = /*300;*/ui.equalizerGraphicsView->width(); + int height = /*200;*/ui.equalizerGraphicsView->height(); border = 5; chartRectangleThickness = 2; @@ -70,24 +119,24 @@ void QualityMapperDialog::initEqualizerHistogram(vcg::Histogramf *h) int yScaleStep = 5; - float dX = (float)chartWidth / (float)h->n; - float dY = (float)chartHeightForCartesians / (float)h->n; + float dX = (float)chartWidth / (float)h.n; + float dY = (float)chartHeightForCartesians / (float)h.n; //float maxX = float.MinValue; - int maxY = std::numeric_limits::min();; - int minY = std::numeric_limits::max();; + int maxY = std::numeric_limits::min(); + int minY = std::numeric_limits::max(); /*std::vector::iterator it; for (it= h->R.begin(); it != h->R.end(); it++)*/ //processing minX, maxX, minY and maxY values - for (int i=0; in; i++) + for (int i=0; iH[i] > maxY) - maxY = h->H[i]; + if (h.H[i] > maxY) + maxY = h.H[i]; - if (h->H[i] < minY) - minY = h->H[i]; + if (h.H[i] < minY) + minY = h.H[i]; } int maxRoundedY = (int)(maxY + yScaleStep - (maxY % yScaleStep)); //the highest value represented in the y values scale @@ -97,7 +146,7 @@ void QualityMapperDialog::initEqualizerHistogram(vcg::Histogramf *h) float barSeparator = dX / 5.0F; //processing space between consecutive bars of the histogram bars (1\5 of dX) QPen drawingPen(Qt::black); - QBrush drawingBrush (QColor(32,32,32),Qt::SolidPattern); + QBrush drawingBrush (QColor(32, 32, 32),Qt::SolidPattern); QPointF startBarPt; QSizeF barSize; @@ -105,15 +154,15 @@ void QualityMapperDialog::initEqualizerHistogram(vcg::Histogramf *h) //QColor valuesColor; //drawing chart basics - drawCartesianChartBasics(maxRoundedY, h); + drawCartesianChartBasics( _equalizerScene, ui.equalizerGraphicsView ); QSizeF valuesStringSize; //Font f = new Font("Verdana", valuesLabelSize); //drawing histogram bars - for (int i = 0; i < h->n; i++) + for (int i = 0; i < h.n; i++) { - barHeight = (float)(chartHeightForCartesians * h->H[i]) / (float)maxRoundedY; + barHeight = (float)(chartHeightForCartesians * h.H[i]) / (float)maxRoundedY; startBarPt.setX( leftBorder + ((barSeparator + barWidth) * i) ); startBarPt.setY( (float)lowerBorderForCartesians - barHeight ); @@ -149,35 +198,9 @@ void QualityMapperDialog::initEqualizerHistogram(vcg::Histogramf *h) } -void QualityMapperDialog::drawCartesianChartBasics(/*String title,*/ int maxRoundedY, vcg::Histogramf *h /*, ChartHeader header*/) +void QualityMapperDialog::drawTransferFunction(TransferFunction& tf) { - int width = 300;//ui.equalizerGraphicsView->width(); - int height = 200;//ui.equalizerGraphicsView->height(); - - // Create a LightBlue background - //_equalizerScene.addRect(chartRectangleThickness, chartRectangleThickness, width - (2 * chartRectangleThickness), height - (2 * chartRectangleThickness), QPen(), QBrush(QColor(230, 230, 255), Qt::SolidPattern)); - - //drawing chart title - //this.writeString(g, title, titleLabelSize, Color.Black, Positions.North); - - //drawing scale values on X and Y axis - //this.drawXYValuesScale(chartType, g, maxRoundedY, vals, xyLabelsSize); - - //drawing axis - //x axis - _equalizerScene.addLine(leftBorder, lowerBorderForCartesians, rightBorder, lowerBorderForCartesians, QPen(Qt::black)); - //y axis - _equalizerScene.addLine(leftBorder, upperBorder, leftBorder, lowerBorderForCartesians, QPen(Qt::black)); - - /* - //drawing axis labels - //drawing X label - this.writeString(g, header.xLabel, xyLabelsSize, Color.Black, Positions.South); - //drawing Y label - String yLabel = header.yLabel; - //if the y label represent a delay, the time unit is added to the string (min.) [MINUTE] - if ((yLabel.ToLower()).Contains("delay")) - yLabel += " min."; - this.writeString(g, yLabel, xyLabelsSize, Color.Black, Positions.West); - */ -} + this->drawCartesianChartBasics( _transferFunctionScene, ui.transferFunctionView ); + _transferFunctionScene.addLine(0, 0, 100, 430, QPen(Qt::green, 3)); + ui.transferFunctionView->setScene( &_transferFunctionScene ); +} \ No newline at end of file diff --git a/src/fgt/edit_quality/qualitymapperdialog.h b/src/fgt/edit_quality/qualitymapperdialog.h index 446207ace..4376d0864 100644 --- a/src/fgt/edit_quality/qualitymapperdialog.h +++ b/src/fgt/edit_quality/qualitymapperdialog.h @@ -12,9 +12,16 @@ */ #include -#include #include "ui_qualitymapperdialog.h" +#include + +#include "transferfunction.h" + +using namespace vcg; + + +//questa clsse l'hai creata tu? (??) MAL class QualityMapperSettings { public: @@ -51,15 +58,19 @@ public: void setValues(const QualityMapperSettings& qms); QualityMapperSettings getValues(); - void initEqualizerHistogram(vcg::Histogramf *h); - void drawCartesianChartBasics(int maxRoundedY, vcg::Histogramf *h); + void drawCartesianChartBasics(QGraphicsScene& scene, QGraphicsView *view /*, float maxRoundedY*/); //controllare il puntatore alla vista (!!) MAL + void initEqualizerHistogram(vcg::Histogramf& h); + void drawTransferFunction( TransferFunction& tf); + private: Ui::QualityMapperDialogClass ui; QualityMapperSettings _settings; - QGraphicsScene _equalizerScene; + QGraphicsScene _equalizerScene; //questo equivale a graphics di .NET. O ne conserviamo una sola e la utilizziamo per disegnare tutto, o ne creiamo una ogni volta che dobbiamo disegnare qualcosa. forse sbaglio in pieno(??) indagare MAL + QGraphicsScene _transferFunctionScene; + //questi parametri variano a seconda del grafico che si sta disegnando int border; int chartRectangleThickness; int leftBorder; diff --git a/src/fgt/edit_quality/transferfunction.cpp b/src/fgt/edit_quality/transferfunction.cpp index cbcd4cc06..81ec2b5ee 100644 --- a/src/fgt/edit_quality/transferfunction.cpp +++ b/src/fgt/edit_quality/transferfunction.cpp @@ -200,6 +200,22 @@ void TfChannel::testInitChannel() //TRANSFER FUNCTION TransferFunction::TransferFunction(void) +{ + this->initTF(); +} + + +TransferFunction::TransferFunction(QString colorBandFile) +{ + this->initTF(); +} + +TransferFunction::~TransferFunction(void) +{ +} + + +void TransferFunction::initTF() { //Initializing channels types and pivoting indexes. //Each index in channel order has the same value of the enum @@ -213,10 +229,6 @@ TransferFunction::TransferFunction(void) memset(_color_band,0,sizeof(_color_band)); } -TransferFunction::~TransferFunction(void) -{ -} - void TransferFunction::buildColorBand() { diff --git a/src/fgt/edit_quality/transferfunction.h b/src/fgt/edit_quality/transferfunction.h index 3ba21f1f3..a2ed4a3f1 100644 --- a/src/fgt/edit_quality/transferfunction.h +++ b/src/fgt/edit_quality/transferfunction.h @@ -32,7 +32,10 @@ #include //#include #include + +#include //#include +#include "const_types.h" #include "util.h" @@ -133,11 +136,15 @@ private: int _channels_order[NUMBER_OF_CHANNELS]; //array used to carry out virtual pivoting indexing Color4f _color_band[COLOR_BAND_SIZE]; /*rendere color band una classe a se stante??*/ + void initTF(void); + public: TransferFunction(void); + TransferFunction(QString colorBandFile); ~TransferFunction(void); void buildColorBand(); + void saveColorBand(); }; #endif \ No newline at end of file diff --git a/src/fgt/edit_quality/util.cpp b/src/fgt/edit_quality/util.cpp index 76c151c8d..aaa75ab78 100644 --- a/src/fgt/edit_quality/util.cpp +++ b/src/fgt/edit_quality/util.cpp @@ -1,18 +1,18 @@ #include "util.h" - - -//returns a relative-absolute x value conversion rounded to closer integer value -int relative2AbsoluteVali(float relative_val, float max_val) -{ return (int)((relative_val * max_val)+0.5f); } +#include //returns a relative-absolute x value conversion rounded to closer integer value float relative2AbsoluteValf(float relative_val, float max_val) { return (relative_val * max_val); } -//returns an absolute-relative x value conversion -int absolute2RelativeVali(float absolute_val, float max_val) -{ return (int)((absolute_val / max_val)+0.5f); } +//returns a relative-absolute x value conversion rounded to closer integer value +int relative2AbsoluteVali(float relative_val, float max_val) +{ return (int)(relative2AbsoluteValf(relative_val, max_val)+0.5f); } //returns an absolute-relative x value conversion float absolute2RelativeValf(float absolute_val, float max_val) -{ return (float)absolute_val / max_val; } \ No newline at end of file +{ assert(max_val!=0); return (absolute_val / max_val); } + +//returns an absolute-relative x value conversion +int absolute2RelativeVali(float absolute_val, float max_val) +{ return (int)(absolute2RelativeValf(absolute_val, max_val)+0.5f); } \ No newline at end of file diff --git a/src/fgt/edit_quality/util.h b/src/fgt/edit_quality/util.h index 47a877722..bb1188648 100644 --- a/src/fgt/edit_quality/util.h +++ b/src/fgt/edit_quality/util.h @@ -1,21 +1,12 @@ #ifndef _UTIL_H_ #define _UTIL_H_ -#include "const_types.h" - - - -//returns a relative-absolute x value conversion rounded to closer integer value +//this functions return a relative-absolute value conversion perspectively as float and int (rounded to closer integer value) +float relative2AbsoluteValf(float relative_val, float max_val); int relative2AbsoluteVali(float relative_val, float max_val); -//returns a relative-absolute x value conversion rounded to closer integer value -float relative2AbsoluteValf(float relative_val, float max_val); - -//returns an absolute-relative x value conversion +//this functions return a absolute-relative value conversion perspectively as float and int (rounded to closer integer value) +float absolute2RelativeValf(float absolute_val, float max_val); int absolute2RelativeVali(float absolute_val, float max_val); -//returns an absolute-relative x value conversion -float absolute2RelativeValf(float absolute_val, float max_val); - - -#endif \ No newline at end of file +#endif