Okay, here we go. Should we ever meet the beers go on you. ;-)<br />
Most of the things were correct.<br />The main problem was you missed one important thing.<br /><br />When you create a vtkPolyData by hand from an vtkUnstructuredGrid you must copy the cells as well, not only the points.<br />So the reason no triangles could have been found was simply that no triangles did exist.<br />
<pre class="sourcecode"><font color="#008000"><code class="comment">// Catch mouse events</code></font>
<code class="keyword">class</code> MouseInteractorStyle : <code class="keyword">public</code> vtkInteractorStyleTrackballCamera
{
<code class="keyword">public</code>:
static MouseInteractorStyle* <code class="keyword">New</code>();
MouseInteractorStyle() {
selectedMapper = vtkSmartPointer<vtkDataSetMapper>::<code class="keyword">New</code>();
selectedActor = vtkSmartPointer<vtkActor>::<code class="keyword">New</code>();
selected = vtkSmartPointer<vtkUnstructuredGrid>::<code class="keyword">New</code>();
<font color="#008000"> <code class="comment">// the next 5 lines can be done once here in the constructor. </code>
<code class="comment">// It's not necessary to do this with every pick</code></font>
selectedMapper->SetInput(selected);
selectedActor->SetMapper(selectedMapper);
selectedActor->GetProperty()->EdgeVisibilityOn();
selectedActor->GetProperty()->SetEdgeColor(1,0,0);
selectedActor->GetProperty()->SetLineWidth(3);
}
<code class="keyword">virtual</code> <code class="keyword">void</code> OnLeftButtonDown()
{
<code class="keyword">int</code>* pos = <code class="keyword">this</code>->GetInteractor()->GetEventPosition();
vtkSmartPointer<vtkCellPicker> picker =
vtkSmartPointer<vtkCellPicker>::<code class="keyword">New</code>();
picker->SetTolerance(0.0005);
picker->Pick(pos[0], pos[1], 0, <code class="keyword">this</code>->GetDefaultRenderer());
<code class="keyword">double</code>* worldPosition = picker->GetPickPosition();
<code class="keyword">if</code>(picker->GetCellId() != -1)
{
vtkSmartPointer<vtkIdTypeArray> ids =
vtkSmartPointer<vtkIdTypeArray>::<code class="keyword">New</code>();
ids->SetNumberOfComponents(1);
ids->InsertNextValue(picker->GetCellId());
vtkSmartPointer<vtkSelectionNode> selectionNode =
vtkSmartPointer<vtkSelectionNode>::<code class="keyword">New</code>();
selectionNode->SetFieldType(vtkSelectionNode::CELL);
selectionNode->SetContentType(vtkSelectionNode::INDICES);
selectionNode->SetSelectionList(ids);
vtkSmartPointer<vtkSelection> selection =
vtkSmartPointer<vtkSelection>::<code class="keyword">New</code>();
selection->AddNode(selectionNode);
vtkSmartPointer<vtkExtractSelection> extractSelection =
vtkSmartPointer<vtkExtractSelection>::<code class="keyword">New</code>();
extractSelection->SetInput(0, <code class="keyword">this</code>->Data);
extractSelection->SetInput(1, selection);
extractSelection->Update();
selected->ShallowCopy(extractSelection->GetOutput());
vtkSmartPointer<vtkPolyData> newdata =
vtkSmartPointer<vtkPolyData>::<code class="keyword">New</code>();
newdata->SetPoints(selected->GetPoints());
<b> <font size="2" color="#008000"> <code class="comment">// you missed to copy the cells</code>
<code class="comment">// it's not enough to copy points only
</code>
</font><font size="2"> </font><font color="#008000"><font size="2"> </font><code class="comment"><font size="2">/**********************************************************************/</font></code></font><font size="2">
newdata->SetPolys(selected->GetCells());
</font><font color="#008000"><font size="2"> </font><code class="comment"><font size="2">/**********************************************************************/</font></code></font>
</b>
<font color="#008000"> <code class="comment">// the triangle filter is not necessary</code>
<code class="comment">// but see my comment in the main function</code>
<code class="comment">//vtkSmartPointer< vtkTriangleFilter > triangleFilter =</code>
<code class="comment">// vtkSmartPointer<vtkTriangleFilter>::New();</code>
<code class="comment">//triangleFilter->SetInputConnection(newdata->GetProducerPort());</code>
<code class="comment">//triangleFilter->Update(); // not necessary</code>
</font>
<code class="keyword">int</code> numberOfSubdivisions = 1;
vtkSmartPointer< vtkLoopSubdivisionFilter > subdivisionFilter =
vtkSmartPointer<vtkLoopSubdivisionFilter>::<code class="keyword">New</code>();
subdivisionFilter->SetNumberOfSubdivisions(numberOfSubdivisions);
subdivisionFilter->SetInput(newdata);
<font color="#008000"> <code class="comment">//subdivisionFilter->SetInputConnection(triangleFilter->GetOutputPort());</code></font>
subdivisionFilter->Update();<font color="#008000"> <code class="comment">// not necessary</code></font>
<font color="#008000"> <code class="comment">// show the subdivsions</code></font>
selectedMapper.SetInputConnection(subdivisionFilter.GetOutputPort());
<font color="#008000"> <code class="comment">// comment the line above and uncomment the next code line if you prefer </code>
<code class="comment">// to show the selected cell as a whole</code>
<code class="comment">// selectedMapper.SetInputConnection(selected.GetOutputPort());</code></font>
<font color="#008000"> <code class="comment">// ???</code>
<code class="comment">//vtkSmartPointer<vtkIdTypeArray> id = vtkSmartPointer<vtkIdTypeArray>::New();</code>
<code class="comment">//id->SetNumberOfComponents(1);</code></font>
}
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
vtkSmartPointer<vtkPolyData> Data;
vtkSmartPointer<vtkDataSetMapper> selectedMapper;
vtkSmartPointer<vtkActor> selectedActor;
vtkSmartPointer<vtkUnstructuredGrid> selected;
};
vtkStandardNewMacro(MouseInteractorStyle);
<code class="keyword">int</code> main(<code class="keyword">int</code>, <code class="keyword">char</code> *[])
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::<code class="keyword">New</code>();
sphereSource->Update();<font color="#008000"> <code class="comment">// not necessary</code></font>
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::<code class="keyword">New</code>();
<font color="#008000"> <code class="comment">// next commented lines are only necessary if you want to </code>
<code class="comment">// subdivide the complete sphere at once and not only the selected cell </code>
<code class="comment">/*
vtkSmartPointer<vtkTriangleFilter> triangleFilter =
vtkSmartPointer<vtkTriangleFilter>::New();
triangleFilter->SetInputConnection(sphereSource->GetOutputPort());
triangleFilter->Update();
mapper->SetInputConnection(triangleFilter->GetOutputPort());
*/</code></font>
<font color="#008000"> <code class="comment">// instead use the spheresource directly as input</code></font>
mapper->SetInputConnection(sphere->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::<code class="keyword">New</code>();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::<code class="keyword">New</code>();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::<code class="keyword">New</code>();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::<code class="keyword">New</code>();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Initialize();
vtkSmartPointer<MouseInteractorStyle> style =
vtkSmartPointer<MouseInteractorStyle>::<code class="keyword">New</code>();
style->SetDefaultRenderer(renderer);
<font color="#008000"> <code class="comment">/* see my comment several lines above */</code>
<code class="comment">//style->Data = triangleFilter->GetOutput();</code></font>
style->Data = sphere.GetOutput();
renderWindowInteractor->SetInteractorStyle(style);
renderer->AddActor(actor);
renderer->ResetCamera();
renderer->SetBackground(0,0,1);<font color="#008000"> <code class="comment">// Blue</code></font>
renderWindow->Render();
renderWindowInteractor->Start();
<code class="keyword">return</code> EXIT_SUCCESS;
}
</pre>
<br /><br /><br />
with best regards
Jochen
<br/><hr align="left" width="300" />
View this message in context: <a href="http://vtk.1045678.n5.nabble.com/error-message-in-subdividing-a-cell-tp5713334p5713389.html">Re: error message in subdividing a cell</a><br/>
Sent from the <a href="http://vtk.1045678.n5.nabble.com/VTK-Users-f1224199.html">VTK - Users mailing list archive</a> at Nabble.com.<br/>