Skip to content

Commit

Permalink
Change so both actual min/max and theoretical min/max values for 3d t…
Browse files Browse the repository at this point in the history
…ables are available for coloring purposes
  • Loading branch information
malcom2073 committed Jan 28, 2014
1 parent e11520b commit d0894af
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 98 deletions.
5 changes: 3 additions & 2 deletions core/src/parameterview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ ParameterView::ParameterView(QWidget *parent) : QWidget(parent)
ui.setupUi(this);
connect(ui.parameterTreeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),this,SLOT(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
connect(ui.parameterTreeWidget,SIGNAL(itemSelectionChanged()),this,SLOT(itemSelectionChanged()));
ui.parameterTreeWidget->setColumnCount(2);
}
void ParameterView::itemSelectionChanged()
{
Expand Down Expand Up @@ -51,7 +52,7 @@ void ParameterView::currentItemChanged(QTreeWidgetItem *current,QTreeWidgetItem
//This is our menu!
for (int j=0;j<m_metaMenu.menulist[i].subMenuList.size();j++)
{
if (m_metaMenu.menulist[i].subMenuList[j].title == current->text(0))
if (m_metaMenu.menulist[i].subMenuList[j].variable == current->text(1))
{
//This is our current item!
if (!m_metaMenu.menulist[i].subMenuList[j].is_seperator)
Expand Down Expand Up @@ -165,7 +166,7 @@ void ParameterView::passMenuList(MenuSetup menu)
//{
// item->addChild(new QTreeWidgetItem(QStringList() << menu.menulist[i].second[j]));
//}
item->addChild(new QTreeWidgetItem(QStringList() << menu.menulist[i].subMenuList[j].title));
item->addChild(new QTreeWidgetItem(QStringList() << menu.menulist[i].subMenuList[j].title << menu.menulist[i].subMenuList[j].variable));
}
}
}
Expand Down
24 changes: 12 additions & 12 deletions core/src/tablemap3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ void TableMap3D::paintGL()
glVertex3f(maxx/*-(((float)1)/((float)m_tableData->xAxis().size()))*/,maxy/*+((float)2)/((float)m_tableData->xAxis().size())*/,(float)i/10.0);
glVertex3f(0,maxy/*+((float)2)/((float)m_tableData->xAxis().size())*/,(float)i/10.0);
glEnd();
this->renderText(-0.1,maxy + 0.1,(float)i/10.0,QString::number((m_tableData->maxZAxis()) * (i/10.0),'f',2));
this->renderText(-0.1,maxy + 0.1,(float)i/10.0,QString::number((m_tableData->maxCalcedValue()) * (i/10.0),'f',2));
}


Expand Down Expand Up @@ -215,28 +215,28 @@ void TableMap3D::paintGL()
double g=0;
double b=0;
double val = m_tableData->values()[y][x];
if (val < m_tableData->maxZAxis()/4)
if (val < m_tableData->maxCalcedValue()/4)
{
r=0;
g=(255*((val)/(m_tableData->maxZAxis()/4.0)));
g=(255*((val)/(m_tableData->maxCalcedValue()/4.0)));
b=255;
}
else if (val < ((m_tableData->maxZAxis()/4)*2))
else if (val < ((m_tableData->maxCalcedValue()/4)*2))
{
r=0;
g=255;
b=255-(255*((val-((m_tableData->maxZAxis()/4.0)))/(m_tableData->maxZAxis()/4.0)));
b=255-(255*((val-((m_tableData->maxCalcedValue()/4.0)))/(m_tableData->maxCalcedValue()/4.0)));
}
else if (val < ((m_tableData->maxZAxis()/4)*3))
else if (val < ((m_tableData->maxCalcedValue()/4)*3))
{
r=(255*((val-((m_tableData->maxZAxis()/4.0)*2))/(m_tableData->maxZAxis()/4.0)));
r=(255*((val-((m_tableData->maxCalcedValue()/4.0)*2))/(m_tableData->maxCalcedValue()/4.0)));
g=255;
b=0;
}
else
{
r=255;
g=255-(255*((val-((m_tableData->maxZAxis()/4.0)*3))/(m_tableData->maxZAxis()/4.0)));
g=255-(255*((val-((m_tableData->maxCalcedValue()/4.0)*3))/(m_tableData->maxCalcedValue()/4.0)));
b=0;
}
if (i == 0 || i == 2)
Expand All @@ -256,28 +256,28 @@ void TableMap3D::paintGL()

float y0 = ((float)x * maxy)/((float)m_tableData->xAxis().size()-1.0);
float x0 = ((float)y)/((float)m_tableData->yAxis().size()-1.0);
float z0 = (float)m_tableData->values()[y][x] / m_tableData->maxZAxis();
float z0 = (float)m_tableData->values()[y][x] / m_tableData->maxCalcedValue();
glColor4f(r,g,b,1);
//glVertex3f(x0+((i==1) ? MAP3DCELLSPACING : 0),(maxy-y0)-((i==1) ? MAP3DCELLSPACING : 0),z0);
glVertex3f(x0,(maxy-y0),z0+((i==0) ? 0.001 : ((i==2) ? -0.001 : 0)));

float y1 = ((float)x * maxy)/((float)m_tableData->xAxis().size()-1.0);
float x1 = ((float)y+1)/((float)m_tableData->yAxis().size()-1.0);
float z1 = (float)m_tableData->values()[y+1][x] / m_tableData->maxZAxis();
float z1 = (float)m_tableData->values()[y+1][x] / m_tableData->maxCalcedValue();
glColor4f(r,g,b,1);
//glVertex3f(x1-((i==1) ? MAP3DCELLSPACING : 0),(maxy-y1)-((i==1) ? MAP3DCELLSPACING : 0),z1);
glVertex3f(x1,(maxy-y1),z1+((i==0) ? 0.001 : ((i==2) ? -0.001 : 0)));

float y2 = ((float)((x+1.0) * maxy))/((float)m_tableData->xAxis().size()-1.0);
float x2 = ((float)y+1.0)/((float)m_tableData->yAxis().size()-1.0);
float z2 = (float)m_tableData->values()[y+1][x+1] / m_tableData->maxZAxis();
float z2 = (float)m_tableData->values()[y+1][x+1] / m_tableData->maxCalcedValue();
glColor4f(r,g,b,1);
//glVertex3f(x2-((i==1) ? MAP3DCELLSPACING : 0),(maxy-y2)+((i==1) ? MAP3DCELLSPACING : 0),z2);
glVertex3f(x2,(maxy-y2),z2+((i==0) ? 0.001 : ((i==2) ? -0.001 : 0)));

float y3 = ((float)(x+1) * maxy)/((float)m_tableData->xAxis().size()-1.0);
float x3 = ((float)y)/((float)m_tableData->yAxis().size()-1.0);
float z3 = (float)m_tableData->values()[y][x+1]/m_tableData->maxZAxis();
float z3 = (float)m_tableData->values()[y][x+1]/m_tableData->maxCalcedValue();
glColor4f(r,g,b,1);
//glVertex3f(x3+((i==1) ? MAP3DCELLSPACING : 0),(maxy-y3)+((i==1) ? MAP3DCELLSPACING : 0),z3);
glVertex3f(x3,(maxy-y3),z3+((i==0) ? 0.001 : ((i==2) ? -0.001 : 0)));
Expand Down
96 changes: 48 additions & 48 deletions core/src/tableview3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,16 +176,16 @@ void TableView3D::setValue(int row, int column,double value,bool ignoreselection
if (row == ui.tableWidget->rowCount()-1)
{
setSilentValue(row,column,formatNumber(tempValue,m_metaData.xDp));
if (tempValue > tableData->maxXAxis())
if (tempValue > tableData->maxCalcedXAxis())
{
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minXAxis()) + "-" + QString::number(tableData->maxXAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minCalcedXAxis()) + "-" + QString::number(tableData->maxCalcedXAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.xDp));
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
return;
}
else if (tempValue < tableData->minXAxis())
else if (tempValue < tableData->minCalcedXAxis())
{
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minXAxis()) + "-" + QString::number(tableData->maxXAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minCalcedXAxis()) + "-" + QString::number(tableData->maxCalcedXAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.xDp));
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
return;
Expand All @@ -197,16 +197,16 @@ void TableView3D::setValue(int row, int column,double value,bool ignoreselection
else if (column == 0)
{
setSilentValue(row,column,formatNumber(tempValue,m_metaData.yDp));
if (tempValue > tableData->maxYAxis())
if (tempValue > tableData->maxCalcedYAxis())
{
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minYAxis()) + "-" + QString::number(tableData->maxYAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minCalcedYAxis()) + "-" + QString::number(tableData->maxCalcedYAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.yDp));
return;
}
else if (tempValue < tableData->minYAxis())
else if (tempValue < tableData->minCalcedYAxis())
{
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minYAxis()) + "-" + QString::number(tableData->maxYAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minCalcedYAxis()) + "-" + QString::number(tableData->maxCalcedYAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.yDp));
return;
Expand All @@ -217,16 +217,16 @@ void TableView3D::setValue(int row, int column,double value,bool ignoreselection
else
{
setSilentValue(row,column,formatNumber(tempValue,m_metaData.zDp));
if (tempValue > tableData->maxZAxis())
if (tempValue > tableData->maxCalcedValue())
{
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minZAxis()) + "-" + QString::number(tableData->maxZAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too large! Value range " + QString::number(tableData->minCalcedValue()) + "-" + QString::number(tableData->maxCalcedValue()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.zDp));
return;
}
if (tempValue < tableData->minZAxis())
if (tempValue < tableData->minCalcedValue())
{
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minZAxis()) + "-" + QString::number(tableData->maxZAxis()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
QMessageBox::information(0,"Error",QString("Value entered too small! Value range " + QString::number(tableData->minCalcedValue()) + "-" + QString::number(tableData->maxCalcedValue()) + ". Entered value:") + ui.tableWidget->item(row,column)->text());
//ui.tableWidget->item(row,column)->setText(QString::number(currentvalue));
setSilentValue(row,column,formatNumber(currentvalue,m_metaData.zDp));
return;
Expand Down Expand Up @@ -258,15 +258,15 @@ void TableView3D::hotKeyPressed(int key,Qt::KeyboardModifiers modifier)
double maxval = 0;
if (ui.tableWidget->selectedItems()[i]->row() == ui.tableWidget->rowCount()-1)
{
maxval = tableData->maxXAxis();
maxval = tableData->maxCalcedXAxis();
}
else if (ui.tableWidget->selectedItems()[i]->column() == 0)
{
maxval = tableData->maxYAxis();
maxval = tableData->maxCalcedYAxis();
}
else
{
maxval = tableData->maxZAxis();
maxval = tableData->maxCalcedValue();
}
if (modifier & Qt::ShiftModifier)
{
Expand Down Expand Up @@ -309,18 +309,18 @@ void TableView3D::hotKeyPressed(int key,Qt::KeyboardModifiers modifier)
double maxval = 0;
if (ui.tableWidget->selectedItems()[i]->row() == ui.tableWidget->rowCount()-1)
{
maxval = tableData->maxXAxis();
minval = tableData->minXAxis();
maxval = tableData->maxCalcedXAxis();
minval = tableData->minCalcedXAxis();
}
else if (ui.tableWidget->selectedItems()[i]->column() == 0)
{
maxval = tableData->maxYAxis();
minval = tableData->minYAxis();
maxval = tableData->maxCalcedYAxis();
minval = tableData->minCalcedYAxis();
}
else
{
maxval = tableData->maxZAxis();
minval = tableData->minZAxis();
maxval = tableData->maxCalcedValue();
minval = tableData->minCalcedValue();
}
if (modifier & Qt::ShiftModifier)
{
Expand Down Expand Up @@ -513,33 +513,33 @@ QString TableView3D::verifyValue(int row,int column,QString item)

if (row == ui.tableWidget->rowCount()-1)
{
if (tempValue > tableData->maxXAxis())
if (tempValue > tableData->maxCalcedXAxis())
{
return "Axis value entered too large!";
}
else if (tempValue < tableData->minXAxis())
else if (tempValue < tableData->minCalcedXAxis())
{
return "Axis value entered too small";
}
}
else if (column == 0)
{
if (tempValue > tableData->maxYAxis())
if (tempValue > tableData->maxCalcedYAxis())
{
return "Axis value too large";
}
else if (tempValue < tableData->minYAxis())
else if (tempValue < tableData->minCalcedYAxis())
{
return "Axis value too small";
}
}
else
{
if (tempValue > tableData->maxZAxis())
if (tempValue > tableData->maxCalcedValue())
{
return "Value too large for table";
}
if (tempValue < tableData->minZAxis())
if (tempValue < tableData->minCalcedValue())
{
return "Value too small for table";
}
Expand Down Expand Up @@ -990,21 +990,21 @@ bool TableView3D::updateTable()
{
double val = tableData->values()[row][col];
ui.tableWidget->setItem((tableData->rows()-1)-(row),col+1,new QTableWidgetItem(formatNumber(val,m_metaData.zDp)));
if (val < tableData->maxZAxis()/4)
if (val < tableData->maxCalcedValue()/4)
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxZAxis()/4.0))),255));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxCalcedValue()/4.0))),255));
}
else if (val < ((tableData->maxZAxis()/4)*2))
else if (val < ((tableData->maxCalcedValue()/4)*2))
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxZAxis()/4.0)))/(tableData->maxZAxis()/4.0)))));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxCalcedValue()/4.0)))/(tableData->maxCalcedValue()/4.0)))));
}
else if (val < ((tableData->maxZAxis()/4)*3))
else if (val < ((tableData->maxCalcedValue()/4)*3))
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxZAxis()/4.0)*2))/(tableData->maxZAxis()/4.0))),255,0));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxCalcedValue()/4.0)*2))/(tableData->maxCalcedValue()/4.0))),255,0));
}
else
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxZAxis()/4.0)*3))/(tableData->maxZAxis()/4.0))),0));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxCalcedValue()/4.0)*3))/(tableData->maxCalcedValue()/4.0))),0));
}
}
}
Expand Down Expand Up @@ -1081,21 +1081,21 @@ void TableView3D::reColorTable(int rownum,int colnum)
{
double val = tableData->values()[row][col];
//ui.tableWidget->setItem((tableData->rows()-1)-(row),col+1,new QTableWidgetItem(formatNumber(val,m_metaData.zDp)));
if (val < tableData->maxZAxis()/4)
if (val < tableData->maxCalcedValue()/4)
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxZAxis()/4.0))),255));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxCalcedValue()/4.0))),255));
}
else if (val < ((tableData->maxZAxis()/4)*2))
else if (val < ((tableData->maxCalcedValue()/4)*2))
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxZAxis()/4.0)))/(tableData->maxZAxis()/4.0)))));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxCalcedValue()/4.0)))/(tableData->maxCalcedValue()/4.0)))));
}
else if (val < ((tableData->maxZAxis()/4)*3))
else if (val < ((tableData->maxCalcedValue()/4)*3))
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxZAxis()/4.0)*2))/(tableData->maxZAxis()/4.0))),255,0));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxCalcedValue()/4.0)*2))/(tableData->maxCalcedValue()/4.0))),255,0));
}
else
{
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxZAxis()/4.0)*3))/(tableData->maxZAxis()/4.0))),0));
ui.tableWidget->item((tableData->rows()-1)-((row)),(col)+1)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxCalcedValue()/4.0)*3))/(tableData->maxCalcedValue()/4.0))),0));
}
}
}
Expand Down Expand Up @@ -1127,21 +1127,21 @@ void TableView3D::reColorTable(int rownum,int colnum)
//QLOG_DEBUG() << "Value:" << val;

//ui.tableWidget->setItem((tableData->rows()-1)-(row),col+1,new QTableWidgetItem(formatNumber(val,m_metaData.zDp)));
if (val < tableData->maxZAxis()/4)
if (val < tableData->maxCalcedValue()/4)
{
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxZAxis()/4.0))),255));
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(0,(255*((val)/(tableData->maxCalcedValue()/4.0))),255));
}
else if (val < ((tableData->maxZAxis()/4)*2))
else if (val < ((tableData->maxCalcedValue()/4)*2))
{
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxZAxis()/4.0)))/(tableData->maxZAxis()/4.0)))));
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(0,255,255-(255*((val-((tableData->maxCalcedValue()/4.0)))/(tableData->maxCalcedValue()/4.0)))));
}
else if (val < ((tableData->maxZAxis()/4)*3))
else if (val < ((tableData->maxCalcedValue()/4)*3))
{
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxZAxis()/4.0)*2))/(tableData->maxZAxis()/4.0))),255,0));
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb((255*((val-((tableData->maxCalcedValue()/4.0)*2))/(tableData->maxCalcedValue()/4.0))),255,0));
}
else
{
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxZAxis()/4.0)*3))/(tableData->maxZAxis()/4.0))),0));
ui.tableWidget->item(rownum,colnum)->setBackgroundColor(QColor::fromRgb(255,255-(255*((val-((tableData->maxCalcedValue()/4.0)*3))/(tableData->maxCalcedValue()/4.0))),0));
}
connect(ui.tableWidget,SIGNAL(cellChanged(int,int)),this,SLOT(tableCellChanged(int,int)));
connect(ui.tableWidget,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(tableCurrentCellChanged(int,int,int,int)));
Expand Down
18 changes: 12 additions & 6 deletions lib/core/table3ddata.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,18 @@ class Table3DData : public DataBlock
virtual void setCell(int row, int column,double val)=0;
virtual void setXAxis(int column,double val)=0;
virtual void setYAxis(int row,double val)=0;
virtual double maxXAxis()=0;
virtual double maxYAxis()=0;
virtual double maxZAxis()=0;
virtual double minXAxis()=0;
virtual double minYAxis()=0;
virtual double minZAxis()=0;
virtual double maxActualXAxis() = 0;
virtual double maxActualYAxis() = 0;
virtual double maxActualValue() = 0;
virtual double minActualYAxis() = 0;
virtual double minActualXAxis() = 0;
virtual double minActualValue() = 0;
virtual double maxCalcedXAxis() = 0;
virtual double maxCalcedYAxis() = 0;
virtual double maxCalcedValue() = 0;
virtual double minCalcedXAxis() = 0;
virtual double minCalcedYAxis() = 0;
virtual double minCalcedValue() = 0;
virtual void setWritesEnabled(bool enabled)=0;
virtual void writeWholeLocation(bool ram)=0;
virtual bool isRam()=0;
Expand Down
Loading

0 comments on commit d0894af

Please sign in to comment.