/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2004 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ #include #include #include #include "v3dImportDialog.h" #include "maskImageWidget.h" using namespace vcg; // small helper function for generating a color ramp pixmap to be used in the import dialog. QPixmap generateColorRamp() { const int width=100; const int height=15; Color4b ramp; QImage newImage(width,height,QImage::Format_RGB32); for(int x=0;xaddItem(exportShotsString(ExportShots(ii))); ui.saveShotCombo->setCurrentIndex(v3dImportDialog::EXPORT_ONLY_SELECTED); this->setFeatures(QDockWidget::AllDockWidgetFeatures); this->setAllowedAreas(Qt::LeftDockWidgetArea); QPoint p=parent->mapToGlobal(QPoint(0,0)); this->setFloating(true); this->setGeometry(p.x()+(parent->width()-width()),p.y()+40,width(),height() ); this->edit = _edit; ui.subsampleSpinBox->setValue(2); ui.minCountSpinBox->setValue(3); // connections connect(ui.dilationSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(ui.dilationSizeChanged(int))); connect(ui.erosionSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(ui.erosionSizeChanged(int))); connect(ui.cancelButton, SIGNAL(pressed()), this, SIGNAL(closing())); er=0; exportToPLY=false; fileName = QFileDialog::getOpenFileName(this->parentWidget(), tr("Select v3D File"), tr("."), tr("Arc 3D Document (*.v3d)")); } QString v3dImportDialog::exportShotsString( const ExportShots exp ) { switch (exp) { case (EXPORT_ALL): return QString("Export all images"); case (EXPORT_ONLY_SELECTED): return QString("Export only selected images"); } return QString(); } /* Main function that populate the dialog, loading all the images and eventually creating the thumbs. called directly by the open before invoking this dialog. */ void v3dImportDialog::setArc3DReconstruction(Arc3DReconstruction *_er) { // if the epoch reconstruction has not changed do nothing if(erCreated == _er->created) { er=_er; return; } er=_er; erCreated=er->created; ui.infoLabel->setText(er->name + " - " + er->author + " - " + er->created); ui.imageTableWidget->clear(); ui.imageTableWidget->setRowCount(er->modelList.size()); ui.imageTableWidget->setColumnCount(4); //imageTableWidget->setColumnWidth (1,64); ui.imageTableWidget->setSelectionBehavior (QAbstractItemView::SelectRows); ui.imageTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui.imageTableWidget->setMinimumWidth(64*8); ui.rangeLabel->setPixmap(generateColorRamp()); ui.rangeLabel->setMaximumHeight(10); ui.rangeLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); ui.rangeLabel->setScaledContents(true); ui.minCountSlider->setMaximumHeight(12); int i; for(i=0; imodelList.size() ;++i) { QString ThumbImgName=Arc3DModel::ThumbName(er->modelList[i].textureName); QString ThumbCntName=Arc3DModel::ThumbName(er->modelList[i].countName); ui.imageTableWidget->setRowHeight (i,64); QTableWidgetItem *emptyHeaderItem = new QTableWidgetItem(i*2); QTableWidgetItem *texNameHeaderItem = new QTableWidgetItem(er->modelList[i].textureName,i); ui.imageTableWidget->setItem(i, 0, texNameHeaderItem); ui.imageTableWidget->setItem(i, 1, emptyHeaderItem); QLabel *imageLabel = new QLabel(ui.imageTableWidget); if(!QFile::exists(ThumbImgName)) { QPixmap(er->modelList[i].textureName).scaledToHeight(64).save(ThumbImgName,"jpg"); if(!QFile::exists(ThumbImgName)) QMessageBox::warning(this,"Error in Thumb creation", QString("Unable to create '%1' from '%2'").arg(ThumbImgName),er->modelList[i].textureName); } imageLabel->setPixmap(QPixmap(Arc3DModel::ThumbName(er->modelList[i].textureName))); ui.imageTableWidget->setCellWidget(i,1,imageLabel); if(QFile::exists(er->modelList[i].maskName)) { QTableWidgetItem *emptyHeaderItem = new QTableWidgetItem(i*4); ui.imageTableWidget->setItem(i, 2, emptyHeaderItem); QLabel *maskLabel = new QLabel(ui.imageTableWidget); maskLabel->setPixmap(QPixmap(er->modelList[i].maskName).scaledToHeight(64)); ui.imageTableWidget->setCellWidget(i,2,maskLabel); } else { QTableWidgetItem *maskHeaderItem = new QTableWidgetItem(QString("double click for\nediting the mask"),i*3); ui.imageTableWidget->setItem(i, 2, maskHeaderItem); } if(!QFile::exists(ThumbCntName)) { CharImage chi; bool ret=chi.Open(er->modelList[i].countName.toUtf8().data()); if(!ret) QMessageBox::warning(this,"Error in Thumb creation",QString("Unable to create '%1' from '%2'").arg(ThumbCntName,er->modelList[i].textureName)); CharImage::colorizedScaledToHeight(64,chi).save(ThumbCntName,"jpg"); if(!QFile::exists(ThumbCntName)) QMessageBox::warning(this,"Error in Thumb creation",QString("Unable to create '%1' from '%2'").arg(ThumbCntName,er->modelList[i].textureName)); } QLabel *countLabel = new QLabel(ui.imageTableWidget); countLabel->setPixmap(QPixmap(ThumbCntName)); QPixmap tmp(ThumbCntName); if(tmp.isNull()) QMessageBox::warning(this,"Error in Thumb creation",QString("Null Pixmap '%1'").arg(ThumbCntName)); ui.imageTableWidget->setCellWidget(i,3,countLabel); } show(); // necessary to make the size of the image preview correct. ui.imageTableWidget->setItemSelected(ui.imageTableWidget->item(0,0),true); ui.imageTableWidget->setItemSelected(ui.imageTableWidget->item(0,1),true); ui.imageTableWidget->setItemSelected(ui.imageTableWidget->item(0,2),true); } void v3dImportDialog::on_imageTableWidget_itemSelectionChanged() { if(ui.imageTableWidget->selectedItems().size()==3) { int row= ui.imageTableWidget->row(ui.imageTableWidget->selectedItems().first()); QPixmap tmp(er->modelList[row].textureName); imgSize=tmp.size(); ui.previewLabel->setPixmap(tmp.scaled(ui.previewLabel->size(),Qt::KeepAspectRatio) ); on_subsampleSpinBox_valueChanged(ui.subsampleSpinBox->value()); } } void v3dImportDialog::on_plyButton_clicked() { exportToPLY = true; //accept(); } void v3dImportDialog::on_selectButton_clicked() { int itemNum=ui.imageTableWidget->rowCount(); int modVal=ui.subsampleSequenceSpinBox->value(); if(modVal==0) return; for(int i=0;isetRangeSelected(QTableWidgetSelectionRange(i,0,i,2),true); } void v3dImportDialog::on_imageTableWidget_itemClicked(QTableWidgetItem * item ) { int row= ui.imageTableWidget->row(item); ui.previewLabel->setPixmap( QPixmap(er->modelList[row].textureName).scaled(ui.previewLabel->size(),Qt::KeepAspectRatio) ); } void v3dImportDialog::on_imageTableWidget_itemDoubleClicked(QTableWidgetItem * item ) { int row= ui.imageTableWidget->row(item); int col= ui.imageTableWidget->column(item); if(col!=2) return; qDebug("DoubleClicked on image %s",qPrintable(er->modelList[row].textureName)); QImage ttt(er->modelList[row].textureName); qDebug("'%s' %i x %i",qPrintable(er->modelList[row].textureName),ttt.width(),ttt.height()); //ui::maskImageWidget masker(QImage(er->modelList[row].textureName)); ui::maskImageWidget masker(ttt); if (QFile::exists(er->modelList[row].maskName)) masker.loadMask(er->modelList[row].maskName); QImage mymask; if (masker.exec() == QDialog::Accepted) mymask = masker.getMask(); if (!mymask.isNull()) { mymask.save(er->modelList[row].maskName,"png"); QLabel *imageLabel = new QLabel(ui.imageTableWidget); imageLabel->setPixmap(QPixmap(er->modelList[row].maskName).scaledToHeight(64)); ui.imageTableWidget->itemAt(row,2)->setText(""); ui.imageTableWidget->setCellWidget(row,2,imageLabel); } } void v3dImportDialog::on_minCountSpinBox_valueChanged(int val) { if(ui.minCountSlider->value()!=val) ui.minCountSlider->setValue(val); } void v3dImportDialog::on_minCountSlider_valueChanged(int val) { if(ui.minCountSpinBox->value()!=val) ui.minCountSpinBox->setValue(val); } void v3dImportDialog::on_subsampleSpinBox_valueChanged(int) { int ss=ui.subsampleSpinBox->value(); if(ss==0) { ui.subsampleSpinBox->setValue(1); return; } ui.imgSizeLabel->setText(QString("(%1 x %2) -> (%3 x %4)").arg(imgSize.width()).arg(imgSize.height()).arg(imgSize.width()/ss).arg(imgSize.height()/ss) ); } void v3dImportDialog::dilationSizeChanged(int size) { int winsize = size * 2 + 1; QString str = QString("%1 x %2").arg(winsize).arg(winsize); ui.lblDilationSizeValue->setText(str); } void v3dImportDialog::erosionSizeChanged(int size) { int winsize = size * 2 + 1; QString str = QString("%1 x %2").arg(winsize).arg(winsize); ui.lblErosionSizeValue->setText(str); }