<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hello </div><div><br></div><div>I want to find all parts of a polydata (in my case a surface), which lies inside a second polydate (in my case a volume).  In the following example i tried to write a simple example. However, something with vtkClipPolyData does not work. Do i make some mistake by creating the implicit  data set or by using the vtkClipPolyData function? </div><div><br></div><div>Regards</div><div>D</div><div><br></div><div><br></div><div><br>import vtk</div><div><br># Create volume<br>def mkVtkIdList(it):<br>      vil = vtk.vtkIdList()<br>      for i in it:<br>          vil.InsertNextId(int(i))<br>      return vil<br>      <br>ptsCoord= [] <br>ptsCoord.append( ( 1.0,-1.0,-1.0) )<br>ptsCoord.append( ( 1.0, 1.0,-1.0) )<br>ptsCoord.append( (-1.0, 1.0,-1.0) )<br>ptsCoord.append( (-1.0,-1.0,-1.0) )<br>ptsCoord.append( ( 1.0,-1.0, 1.0) )<br>ptsCoord.append( ( 1.0, 1.0, 1.0) )<br>ptsCoord.append( (-1.0, 1.0, 1.0) )<br>ptsCoord.append( (-1.0,-1.0, 1.0) )</div><div>ptsIdxFaces = []            <br>ptsIdxFaces.append( (0,1,2,3) )   # bottom face<br>ptsIdxFaces.append( (0,1,5,4) )   # side 1<br>ptsIdxFaces.append( (1,2,6,5) )   # side 2<br>ptsIdxFaces.append( (2,3,7,6) )   # side 3<br>ptsIdxFaces.append( (3,0,4,7) )   # side 4<br>ptsIdxFaces.append( (4,5,6,7) )   # top face</div><div>volume    = vtk.vtkPolyData()<br>points  = vtk.vtkPoints()<br>polys   = vtk.vtkCellArray()<br>scalars = vtk.vtkFloatArray()<br>for i in range(len(ptsCoord)):<br>    points.InsertPoint(i, ptsCoord[i])<br>for i in range(len(ptsIdxFaces)):<br>    polys.InsertNextCell( mkVtkIdList(ptsIdxFaces[i]) )<br>for i in range(len(ptsCoord)):<br>    scalars.InsertTuple1(i,i)<br>volume.SetPoints(points)<br>volume.SetPolys(polys)<br>volume.GetPointData().SetScalars(scalars)</div><div>writer = vtk.vtkXMLPolyDataWriter();<br>writer.SetFileName("R:/volume.vtp" );<br>if vtk.VTK_MAJOR_VERSION <= 5:<br>    writer.SetInput(volume)<br>else:<br>    writer.SetInputData(volume)<br>writer.Write()<br> </div><div> <br># Create Surface <br>points = vtk.vtkPoints()<br>triangle = vtk.vtkTriangle()<br>triangles = vtk.vtkCellArray()<br> <br>points.InsertNextPoint( 0.0,-1.5, 0.0 )<br>points.InsertNextPoint( 1.5, 0.0, 1.0 )<br>points.InsertNextPoint( 0.0, 1.5, 0.0 )<br>points.InsertNextPoint(-1.5, 0.0, 1.0 )</div><div>triangle.GetPointIds().SetId(0,0) <br>triangle.GetPointIds().SetId(1,1) <br>triangle.GetPointIds().SetId(2,2)<br>triangles.InsertNextCell(triangle)<br> <br>triangle.GetPointIds().SetId(0,0) <br>triangle.GetPointIds().SetId(1,2) <br>triangle.GetPointIds().SetId(2,3) <br>triangles.InsertNextCell(triangle)<br>surface = vtk.vtkPolyData()<br>surface.SetPoints( points )<br>surface.SetPolys( triangles )       </div><div>writer = vtk.vtkXMLPolyDataWriter();<br>writer.SetFileName("R:/surface.vtp" );<br>if vtk.VTK_MAJOR_VERSION <= 5:<br>    writer.SetInput(surface)<br>else:<br>    writer.SetInputData(surface)<br>writer.Write()</div><div><br></div><div><br># Now, clip!<br>tri = vtk.vtkDelaunay3D()<br>tri.SetInputData(volume)<br>tri.BoundingTriangulationOff()<br> <br># vtkImplicitDataSet needs some scalars to interpolate to find inside/outside<br>elev = vtk.vtkElevationFilter()<br>elev.SetInputConnection(tri.GetOutputPort())<br> <br>implicit = vtk.vtkImplicitDataSet()<br>implicit.SetDataSet(elev.GetOutput())<br> <br>clipper = vtk.vtkClipPolyData()<br>clipper.SetClipFunction(implicit)<br>clipper.SetInputData(surface)<br>clipper.InsideOutOn()<br>clipper.Update()</div><div><br></div><div>writer = vtk.vtkXMLPolyDataWriter();<br>writer.SetFileName("R:/clipper.vtp" );<br>if vtk.VTK_MAJOR_VERSION <= 5:<br>    writer.SetInput(clipper)<br>else:<br>    writer.SetInputData(clipper)<br>writer.Write()</div></div></div></div>