// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void FieldDataCSVWriter::execute() { int err = 0; setErrorCondition(err); VoxelDataContainer* m = getVoxelDataContainer(); if(NULL == m) { setErrorCondition(-999); notifyErrorMessage("The DataContainer Object was NULL", -999); return; } // Make sure any directory path is also available as the user may have just typed // in a path without actually creating the full path std::string parentPath = MXAFileInfo::parentPath(m_FieldDataFile); if(!MXADir::mkdir(parentPath, true)) { std::stringstream ss; ss << "Error creating parent path '" << parentPath << "'"; notifyErrorMessage(ss.str(), -1); setErrorCondition(-1); return; } std::string filename = getFieldDataFile(); std::ofstream outFile; outFile.open(filename.c_str(), std::ios_base::binary); char space = DREAM3D::GrainData::Delimiter; // Write the total number of grains outFile << m->getNumFieldTuples()-1 << std::endl; // Get all the names of the arrays from the Data Container std::list<std::string> headers = m->getFieldArrayNameList(); std::vector<IDataArray::Pointer> data; //For checking if an array is a neighborlist NeighborList<int>::Pointer neighborlistPtr = NeighborList<int>::New(); // Print the GrainIds Header before the rest of the headers outFile << DREAM3D::GrainData::GrainID; // Loop throught the list and print the rest of the headers, ignoring those we don't want for(std::list<std::string>::iterator iter = headers.begin(); iter != headers.end(); ++iter) { // Only get the array if the name does NOT match those listed IDataArray::Pointer p = m->getFieldData(*iter); if(p->getNameOfClass().compare(neighborlistPtr->getNameOfClass()) != 0) { if (p->GetNumberOfComponents() == 1) { outFile << space << (*iter); } else // There are more than a single component so we need to add multiple header values { for(int k = 0; k < p->GetNumberOfComponents(); ++k) { outFile << space << (*iter) << "_" << k; } } // Get the IDataArray from the DataContainer data.push_back(p); } } outFile << std::endl; // Get the number of tuples in the arrays size_t numTuples = data[0]->GetNumberOfTuples(); std::stringstream ss; float threshold = 0.0f; // Skip the first grain for(size_t i = 1; i < numTuples; ++i) { if (((float)i / numTuples) * 100.0f > threshold) { ss.str(""); ss << "Writing Field Data - " << ((float)i / numTuples) * 100 << "% Complete"; notifyStatusMessage(ss.str()); threshold = threshold + 5.0f; if (threshold < ((float)i / numTuples) * 100.0f) { threshold = ((float)i / numTuples) * 100.0f; } } // Print the grain id outFile << i; // Print a row of data for( std::vector<IDataArray::Pointer>::iterator p = data.begin(); p != data.end(); ++p) { outFile << space; (*p)->printTuple(outFile, i, space); } outFile << std::endl; } if(m_WriteNeighborListData == true) { // Print the GrainIds Header before the rest of the headers // Loop throught the list and print the rest of the headers, ignoring those we don't want for(std::list<std::string>::iterator iter = headers.begin(); iter != headers.end(); ++iter) { // Only get the array if the name does NOT match those listed IDataArray::Pointer p = m->getFieldData(*iter); if(p->getNameOfClass().compare(neighborlistPtr->getNameOfClass()) == 0) { outFile << DREAM3D::GrainData::GrainID << space << DREAM3D::GrainData::NumNeighbors << space << (*iter) << std::endl; size_t numTuples = p->GetNumberOfTuples(); // float threshold = 0.0f; // Skip the first grain for(size_t i = 1; i < numTuples; ++i) { // Print the grain id outFile << i; // Print a row of data outFile << space; p->printTuple(outFile, i, space); outFile << std::endl; } } } } outFile.close(); // If there is an error set this to something negative and also set a message notifyStatusMessage("FieldDataCSVWriter Completed"); }