// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void CropImageGeometry::dataCheck() { if(getErrorCondition() < 0) { return; } setErrorCondition(0); // Validate the incoming DataContainer, Geometry, and AttributeMatrix ; bail if any do not exist since we plan on using them later on in the dataCheck // Error messages are handled by the getPrereq functions DataContainer::Pointer srcCellDataContainer = getDataContainerArray()->getPrereqDataContainer<AbstractFilter>(this, getCellAttributeMatrixPath().getDataContainerName()); ImageGeom::Pointer image = getDataContainerArray()->getPrereqGeometryFromDataContainer<ImageGeom, AbstractFilter>(this, getCellAttributeMatrixPath().getDataContainerName()); AttributeMatrix::Pointer srcCellAttrMat = getDataContainerArray()->getPrereqAttributeMatrixFromPath<AbstractFilter>(this, getCellAttributeMatrixPath(), -301); if(getErrorCondition() < 0) { return; } DataContainer::Pointer destCellDataContainer = srcCellDataContainer; AttributeMatrix::Pointer destCellAttrMat; if (m_SaveAsNewDataContainer == true) { float ox = 0.0f, oy = 0.0f, oz = 0.0f, rx = 0.0f, ry = 0.0f, rz = 0.0f; size_t dx = 0, dy = 0, dz = 0; image->getOrigin(ox, oy, oz); image->getResolution(rx, ry, rz); image->getDimensions(dx, dy, dz); destCellDataContainer = getDataContainerArray()->createNonPrereqDataContainer<AbstractFilter>(this, getNewDataContainerName()); if(NULL == destCellDataContainer.get() || getErrorCondition() < 0) { return; } IGeometry::Pointer imageCopy = image->deepCopy(); destCellDataContainer->setGeometry(imageCopy); destCellAttrMat = srcCellAttrMat->deepCopy(); destCellDataContainer->addAttributeMatrix(destCellAttrMat->getName(), destCellAttrMat); } else { destCellAttrMat = srcCellAttrMat; } if(NULL == destCellDataContainer.get() || NULL == destCellAttrMat.get() || getErrorCondition() < 0) { return; } if (getXMax() < getXMin()) { QString ss = QObject::tr("X Max (%1) less than X Min (%2)").arg(getXMax()).arg(getXMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getYMax() < getYMin()) { QString ss = QObject::tr("Y Max (%1) less than Y Min (%2)").arg(getYMax()).arg(getYMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getZMax() < getZMin()) { QString ss = QObject::tr("Z Max (%1) less than Z Min (%2)").arg(getZMax()).arg(getZMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getXMin() < 0) { QString ss = QObject::tr("X Min (%1) less than 0").arg(getXMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getYMin() < 0) { QString ss = QObject::tr("Y Min (%1) less than 0").arg(getYMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getZMin() < 0) { QString ss = QObject::tr("Z Min (%1) less than 0").arg(getZMin()); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getXMax() > (static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getXPoints()) - 1)) { QString ss = QObject::tr("The X Max (%1) is greater than the Image Geometry X extent (%2)").arg(getXMax()).arg(static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getXPoints()) - 1); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getYMax() > (static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getYPoints()) - 1)) { QString ss = QObject::tr("The Y Max (%1) is greater than the Image Geometry Y extent (%2)").arg(getYMax()).arg(static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getYPoints()) - 1); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } if (getZMax() > (static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getZPoints()) - 1)) { QString ss = QObject::tr("The Z Max (%1) is greater than the Image Geometry Z extent (%2)").arg(getZMax()).arg(static_cast<int64_t>(destCellDataContainer->getGeometryAs<ImageGeom>()->getZPoints()) - 1); notifyErrorMessage(getHumanLabel(), ss, -5550); setErrorCondition(-5550); } QVector<size_t> tDims(3, 0); if (getXMax() - getXMin() < 0) { setXMax(getXMin() + 1); } if (getYMax() - getYMin() < 0) { setYMax(getYMin() + 1); } if (getZMax() - getZMin() < 0) { setZMax(getZMin() + 1); } tDims[0] = (getXMax() - getXMin()) + 1; tDims[1] = (getYMax() - getYMin()) + 1; tDims[2] = (getZMax() - getZMin()) + 1; destCellDataContainer->getGeometryAs<ImageGeom>()->setDimensions(tDims[0], tDims[1], tDims[2]); // If any of the sanity checks fail above then we should NOT attempt to go any further. if (getErrorCondition() < 0) { return; } size_t totalPoints = 1; for(int i = 0; i < 3; i++) { if(tDims[i] != 0) { totalPoints *= tDims[i]; } } AttributeMatrix::Pointer newCellAttrMat = AttributeMatrix::New(tDims, destCellAttrMat->getName(), destCellAttrMat->getType()); QList<QString> voxelArrayNames = destCellAttrMat->getAttributeArrayNames(); for (QList<QString>::iterator iter = voxelArrayNames.begin(); iter != voxelArrayNames.end(); ++iter) { IDataArray::Pointer p = destCellAttrMat->getAttributeArray(*iter); // IDataArray::Pointer data = p->createNewArray(totalPoints, p->getComponentDimensions(), p->getName(), false); destCellAttrMat->removeAttributeArray(*iter); newCellAttrMat->addAttributeArray(*iter, data); } destCellDataContainer->removeAttributeMatrix(destCellAttrMat->getName()); destCellDataContainer->addAttributeMatrix(newCellAttrMat->getName(), newCellAttrMat); if(m_RenumberFeatures == true) { QVector<size_t> cDims(1, 1); m_FeatureIdsPtr = getDataContainerArray()->getPrereqArrayFromPath<DataArray<int32_t>, AbstractFilter>(this, getFeatureIdsArrayPath(), cDims); /* Assigns the shared_ptr<> to an instance variable that is a weak_ptr<> */ if( NULL != m_FeatureIdsPtr.lock().get() ) /* Validate the Weak Pointer wraps a non-NULL pointer to a DataArray<T> object */ { m_FeatureIds = m_FeatureIdsPtr.lock()->getPointer(0); } /* Now assign the raw pointer to data from the DataArray<T> object */ AttributeMatrix::Pointer cellFeatureAttrMat = srcCellDataContainer->getAttributeMatrix(getCellFeatureAttributeMatrixPath().getAttributeMatrixName()); if(NULL == cellFeatureAttrMat.get()) { return; } QVector<bool> activeObjects(cellFeatureAttrMat->getNumTuples(), true); cellFeatureAttrMat->removeInactiveObjects(activeObjects, m_FeatureIdsPtr.lock()); } }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void ReadImage::dataCheck() { setErrorCondition(0); //check file name exists if(getInputFileName().isEmpty()) { setErrorCondition(-1); notifyErrorMessage(getHumanLabel(), "The input file name must be set before executing this filter.", getErrorCondition()); return; } //read image metadata itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(getInputFileName().toLocal8Bit().constData(), itk::ImageIOFactory::ReadMode); if(NULL == imageIO) { setErrorCondition(-2); QString message = QObject::tr("Unable to read image '%1'").arg(getInputFileName()); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } imageIO->SetFileName(getInputFileName().toLocal8Bit().data()); imageIO->ReadImageInformation(); //get size of image const size_t numDimensions = imageIO->GetNumberOfDimensions(); int xdim = imageIO->GetDimensions(0); int ydim = imageIO->GetDimensions(1); int zdim = 1; if(3 != numDimensions) { if(2 == numDimensions) { //allow 2 dimensional images (as 3d image with size 1 in the z direction) } else { QString message = QObject::tr("3 dimensional image required (slected image dimensions: %1)").arg(numDimensions); setErrorCondition(-3); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } } else { zdim = imageIO->GetDimensions(2); } //determine if container/attribute matrix already exist. if so check size compatibility DataArrayPath createdPath; DataContainer::Pointer m; AttributeMatrix::Pointer cellAttrMat; createdPath.update(getDataContainerName(), getCellAttributeMatrixName(), getImageDataArrayName() ); m = getDataContainerArray()->getDataContainer(getDataContainerName()); bool createAttributeMatrix = false; if(NULL == m.get()) //datacontainer doesn't exist->create { m = getDataContainerArray()->createNonPrereqDataContainer<AbstractFilter>(this, getDataContainerName()); ImageGeom::Pointer image = ImageGeom::CreateGeometry(DREAM3D::Geometry::ImageGeometry); m->setGeometry(image); m->getGeometryAs<ImageGeom>()->setDimensions(xdim, ydim, zdim); double zRes = 1; double zOrigin = 0; if(3 == numDimensions) { zRes = imageIO->GetSpacing(2); zOrigin = imageIO->GetOrigin(2); } m->getGeometryAs<ImageGeom>()->setResolution(imageIO->GetSpacing(0), imageIO->GetSpacing(0), zRes); m->getGeometryAs<ImageGeom>()->setOrigin(imageIO->GetOrigin(0), imageIO->GetOrigin(1), zOrigin); createAttributeMatrix = true; if(getErrorCondition() < 0) { return; } } else //datacontainer exists, check if attribute matrix exists { bool dcExists = m->doesAttributeMatrixExist(getCellAttributeMatrixName()); ImageGeom::Pointer image = m->getPrereqGeometry<ImageGeom, AbstractFilter>(this); if(getErrorCondition() < 0) { return; } size_t iDims[3] = { 0, 0, 0 }; float iRes[3] = { 0.0f, 0.0f, 0.0f }; float iOrigin[4] = { 0.0f, 0.0f, 0.0f }; image->getDimensions(iDims); image->getResolution(iRes); image->getOrigin(iOrigin); if(dcExists && NULL != image.get())//attribute matrix exists, check compatibility { //get matrix cellAttrMat = m->getPrereqAttributeMatrix<AbstractFilter>(this, getCellAttributeMatrixName(), false); if(getErrorCondition() < 0) { return; } //check dimension compatibility QVector<size_t> tDims = cellAttrMat->getTupleDimensions(); if(tDims[0] != xdim || iDims[0] != xdim) { QString message = QObject::tr("The x size of '%1' (%2) does not match the x size of '%3' (%4)").arg(getInputFileName()).arg(xdim).arg(getDataContainerName() + "/" + getCellAttributeMatrixName()).arg(tDims[0]); setErrorCondition(-4); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } if(tDims[1] != ydim || iDims[1] != ydim) { QString message = QObject::tr("The y size of '%1' (%2) does not match the x size of '%3' (%4)").arg(getInputFileName()).arg(ydim).arg(getDataContainerName() + "/" + getCellAttributeMatrixName()).arg(tDims[1]); setErrorCondition(-5); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } if(3 == numDimensions) { if(tDims[2] != zdim || iDims[2] != zdim) { QString message = QObject::tr("The z size of '%1' (%2) does not match the x size of '%3' (%4)").arg(getInputFileName()).arg(zdim).arg(getDataContainerName() + "/" + getCellAttributeMatrixName()).arg(tDims[2]); setErrorCondition(-6); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } } else { if(tDims[2] != 1 || iDims[2] != 1) { QString message = QObject::tr("The z size of '%1' (%2) does not match the x size of '%3' (1)").arg(getInputFileName()).arg(zdim).arg(getDataContainerName() + "/" + getCellAttributeMatrixName()); setErrorCondition(-7); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } } } else //attribute matrix doesn't exist, create { createAttributeMatrix = true; } } //image/attribute matrix dimensions QVector<size_t> tDims(3, 0); tDims[0] = xdim; tDims[1] = ydim; tDims[2] = zdim; //create attribute matrix if needed if(createAttributeMatrix) { //create attribute matrix cellAttrMat = m->createNonPrereqAttributeMatrix<AbstractFilter>(this, getCellAttributeMatrixName(), tDims, DREAM3D::AttributeMatrixType::Cell); if(getErrorCondition() < 0) { return; } } //check pixel type (scalar, vector, etc) for support QVector<size_t> componentDims(1, 0); itk::ImageIOBase::IOPixelType pixelType = imageIO->GetPixelType(); switch(pixelType) { case itk::ImageIOBase::SCALAR: componentDims[0] = 1; break; case itk::ImageIOBase::RGB: componentDims[0] = 3; break; case itk::ImageIOBase::RGBA: componentDims[0] = 4; break; default: setErrorCondition(-80001); notifyErrorMessage(getHumanLabel(), "The Pixel Type of the image is not supported with DREAM3D.", getErrorCondition()); } // Check to make sure everything is OK with reading the image if(getErrorCondition() < 0) { std::string pixelTypeName = itk::ImageIOBase::GetPixelTypeAsString(pixelType); QString message = QObject::tr("The pixel type of '%1' (%2) is unsupported").arg(getInputFileName()).arg(QString::fromStdString(pixelTypeName)); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } //Now get how the actual image data is stored. IDataArray::Pointer data; itk::ImageIOBase::IOComponentType componentType = imageIO->GetComponentType(); if(itk::ImageIOBase::CHAR == componentType) { data = Int8ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::UCHAR == componentType) { data = UInt8ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::SHORT == componentType) { data = Int16ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::USHORT == componentType) { data = UInt16ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::INT == componentType) { data = Int32ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::UINT == componentType) { data = UInt32ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::LONG == componentType) { data = Int64ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::ULONG == componentType) { data = UInt64ArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::FLOAT == componentType) { data = FloatArrayType::CreateArray(0, "Temp", false); } else if(itk::ImageIOBase::DOUBLE == componentType) { data = DoubleArrayType::CreateArray(0, "Temp", false); } else { std::string componentTypeName = itk::ImageIOBase::GetComponentTypeAsString(componentType); QString message = QObject::tr("The component type type of '%1' (%2) is unsupported").arg(getInputFileName()).arg(QString::fromStdString(componentTypeName)); setErrorCondition(-9); notifyErrorMessage(getHumanLabel(), message, getErrorCondition()); return; } if(getErrorCondition() < 0) { return; } m_ImageDataPtr = TemplateHelpers::CreateNonPrereqArrayFromArrayType()(this, createdPath, componentDims, data); if( NULL != m_ImageDataPtr.lock().get() ) { m_ImageData = m_ImageDataPtr.lock()->getVoidPointer(0); } }