<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none"><!--P{margin-top:0;margin-bottom:0;} p
        {margin-top:0;
        margin-bottom:0}--></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
Hi all,<br>
<p><br>
</p>
<p>I'm going to answer my own question in the hopes that it helps someone else.  Note that the exodus ii format does not allow element block indices of 0 (at least when designing meshes with Trelis/Cubit), so if your mesh has indices  [1, 2....n-1, n]  they
 will correspond to indices [0, 1........n-2, n-1] in the std::vector.  </p>
<p><br>
</p>
<p>The following will read numbered element block node sets (in numerical order) and pass them to a vtkSurfaceFilter (in this case, a vector of surface filters):</p>
<p><br>
</p>
<p>#define Instantiate(obj, class) vtkSmartPointer<class> obj = vtkSmartPointer<class>::New()</p>
<p><br>
</p>
<p>    Instantiate( exodusiiReader, vtkExodusIIReader );<br>
    std::vector<vtkSmartPointer<vtkPolyData> > element_blocks_surface_filter_vector;</p>
<p><br>
</p>
<p>    std::string exodusMesh = "/path/to/mesh/mesh_name.exo";<br>
    exodusiiReader->SetFileName(exodusMesh.c_str());<br>
    exodusiiReader->Update();<br>
    exodusiiReader->UpdateInformation();  // read mesh metadata<br>
<br>
    vtkCompositeDataIterator* iter = (exodusiiReader->GetOutput())->NewIterator();<br>
    iter->GoToFirstItem();<br>
    while (!iter->IsDoneWithTraversal())<br>
    {<br>
          vtkDataObject* dObj = iter->GetCurrentDataObject();<br>
<br>
            Instantiate( surfaceFilter,vtkDataSetSurfaceFilter );<br>
        #if VTK_MAJOR_VERSION <= 5<br>
          surfaceFilter->SetInput(dObj);<br>
        #else<br>
          surfaceFilter->SetInputData(dObj);<br>
        #endif<br>
          surfaceFilter->Update();<br>
<br>
          element_blocks_surface_filter_vector.push_back(surfaceFilter->GetOutput());<br>
<br>
          iter->GoToNextItem();<br>
    }</p>
<p><br>
</p>
<p>I hope this makes it to the net and helps others in the future.</p>
<p><br>
</p>
Joe
<p><br>
</p>
<div style="color: rgb(33, 33, 33);" dir="ltr">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" color="#000000" face="Calibri, sans-serif"><b>From:</b> vtkusers <vtkusers-bounces@vtk.org> on behalf of Joseph Butner <liljoe@unm.edu><br>
<b>Sent:</b> Friday, December 12, 2014 11:47 AM<br>
<b>To:</b> vtkusers@vtk.org<br>
<b>Subject:</b> [vtkusers] reading element blocks from exodus mesh into a vtkSurfaceFilter</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" style="font-size:12pt; color:#000000; background-color:#FFFFFF; font-family:Calibri,Arial,Helvetica,sans-serif">
<p>I have an exodus mesh file that contains numbered element blocks.  I want to be able to determine which element block (if any) any (x, y, z) coordinate is in.  To do this, I read the mesh in with vtkExodusiiMeshReader, attempt to generate a vtkSurfaceFilter
 for each element block, and use vtkSelectEnclosedPoints to find the element block the point is in.  Unfortunately, I'm doing something wrong when reading the nodes for each element block, the data structure that is supposed to have the node coordinates seems
 to be empty, it throws this error:<br>
<br>
ERROR: In /home/joe/Downloads/VTK-6.1.0/Common/ExecutionModel/vtkDemandDrivenPipeline.cxx, line 715<br>
vtkCompositeDataPipeline (0x35181a0): Input port 1 of algorithm vtkSelectEnclosedPoints(0x1c31480) has 0 connections but is not optional.<br>
<br>
<br>
A small piece of the code I have is:<br>
<br>
<br>
#define Instantiate(obj, class) vtkSmartPointer<class> obj = vtkSmartPointer<class>::New()<br>
<br>
//I want to store the vtkPolyData for each element block in a vector, will be passed to vtkSelectEnclosedPoints later:<br>
std::vector<vtkSmartPointer<vtkPolyData> > element_blocks_surface_filter_vector;<br>
<br>
<br>
std::string exodusMesh = "foo.exo";<br>
exodusiiReader->SetFileName(exodusMesh.c_str());<br>
exodusiiReader->Update();</p>
<p><br>
</p>
<p>// get the metadata from the mesh:<br>
exodusiiReader->UpdateInformation();<br>
<br>
// read in the element blocks, make a surface filter for each, push_back into vector:<br>
for (int z = 0; z < exodusiiReader->GetNumberOfElementBlockArrays(); z++)<br>
{<br>
    const char* nname = exodusiiReader->GetElementBlockArrayName(z);<br>
<br>
/*<br>
 *  I think my mistake is in the following line<br>
 */<br>
    exodusiiReader->SetObjectArrayStatus(exodusiiReader->ELEM_BLOCK, nname, 1);<br>
    exodusiiReader->Update();<br>
<br>
    Instantiate( surfaceFilter,vtkDataSetSurfaceFilter );<br>
    Instantiate( MultiBlockData, vtkMultiBlockDataSet );<br>
    Instantiate( DataObject, vtkDataObject );<br>
<br>
    MultiBlockData = exodusiiReader->GetOutput();<br>
    DataObject= MultiBlockData->GetBlock(0);<br>
<br>
<br>
/*<br>
 * everything below here should be fine (except the DataObject generated above isn't correct).</p>
<p> * it works when I just send it the whole mesh<br>
 */<br>
<br>
    #if VTK_MAJOR_VERSION <= 5<br>
      surfaceFilter->SetInput(DataObject);<br>
    #else<br>
      surfaceFilter->SetInputData(DataObject);<br>
    #endif<br>
      surfaceFilter->Update();<br>
<br>
    element_blocks_surface_filter_vector.push_back(surfaceFilter->GetOutput());<br>
<br>
}</p>
<p><br>
</p>
<p>Any information about what I'm doing wrong above would be greatly appreciated. Thanks!</p>
<p><br>
</p>
<p>Joe<br>
</p>
</div>
</div>
</div>
</div>
</body>
</html>