[vtkusers] Close the gap between a mesh and a planar

Jacky Nguyen jackynguyen.km at gmail.com
Mon Jul 16 05:12:42 EDT 2018


Thanks for your input.
Sorry, I am new to these so I need to take it slowly.

Let me clarify a few things:
1) by using your approach, i don't need to create the plane on the bottom
of the object as a holder?
2) When you say "For each boundary edge, create 2 triangles (a quad) with 1
or 2 points at z=0", does it matter which x and y coordinate to pick?

I have added the following codes to extract the edges and find the pointID
and point coordinate for each edge in the STL object. I trace through my
console log, and there is no point that has z = 0

reader = vtk.vtkSTLReader()
reader.SetFileName('path_to_stl')
reader.Update()

triangleFilter = vtk.vtkTriangleFilter()
triangleFilter.SetInputConnection(reader.GetOutputPort())
triangleFilter.Update()

# ++++++++++++++++++ extract edges ++++++++++++++++++++++++++++++++++++

featureEdges = vtk.vtkFeatureEdges()
featureEdges.SetInputData(triangleFilter.GetOutput())
featureEdges.SetBoundaryEdges(1)
featureEdges.SetFeatureEdges(0)
featureEdges.SetNonManifoldEdges(0)
featureEdges.SetManifoldEdges(0)
featureEdges.Update()
boundaryMesh = featureEdges.GetOutput()
numberOfOpenEdges = featureEdges.GetOutput().GetNumberOfLines()
print('number of lines: ', featureEdges.GetOutput().GetNumberOfLines())
for i in range(0, boundaryMesh.GetNumberOfLines()):
    cell = boundaryMesh.GetCell(i)
    cellPoints = cell.GetPoints()
    pointIds = cell.GetPointIds()
    for j in range(0, pointIds.GetNumberOfIds()):
        print('>>> point id: ', pointIds.GetId(j))
        print('>>> coordinate: ', boundaryMesh.GetPoint(pointIds.GetId(j)))


Thank you,


On Fri, Jul 13, 2018 at 10:10 PM Patrick Bergeron <pbergeron at spiria.com>
wrote:

> I would take a different approach.
>
> I would look at all the edges that have only 1 cell attached, and these
> are your boundary edges.
>
> For each boundary edge, create 2 triangles (a quad) with 1 or 2 points at
> z=0. (Create 2 new points at z=0 for this purpose). If you already have a
> point at that z=0, then reuse it don’t create it.
>
> That approach will create quads all around your geometry connecting to the
> bottom but will leave the bottom hole open.
>
> Next create a cell connecting all your z=0 points together. Make sure they
> are ordered in sequential order to create your contour loop.
>
> Done
>
>
> Sent from my iPhone
>
> On Jul 13, 2018, at 05:10, Jacky Nguyen <jackynguyen.km at gmail.com> wrote:
>
> I have converted an .obj mesh file to .stl. I also created a planar
> geometry as a holder for the mesh object then merge them. However, it
> contains a gap. Any suggestion how to close the gap vertically so that it
> becomes a solid object, I have already tried vtkFillHolesFilter, but it
> won't fill the gap?
>
> The code to create the planar:
>
> implicitPolyDataDistance = vtk.vtkImplicitPolyDataDistance()
> implicitPolyDataDistance.SetInput(stl_poly_data)
>
> #create a grid
> xCoords = vtk.vtkFloatArray()
> for x, i in enumerate(np.linspace(xmin, xmax,50)):
>     xCoords.InsertNextValue(i)
>
> yCoords = vtk.vtkFloatArray()
> for y, i in enumerate(np.linspace(ymin, ymax, 50)):
>     yCoords.InsertNextValue(i)
>
> zCoords = vtk.vtkFloatArray()
> for z, i in enumerate(np.linspace(zmin, zmin + 1, 50)):
>     zCoords.InsertNextValue(i)
>
> rgrid = vtk.vtkRectilinearGrid()
> rgrid.SetDimensions(x + 1, y + 1 , z + 1)
> rgrid.SetXCoordinates(xCoords)
> rgrid.SetYCoordinates(yCoords)
> rgrid.SetZCoordinates(zCoords)
> signedDistances = vtk.vtkFloatArray()
> signedDistances.SetNumberOfComponents(1)
> signedDistances.SetName("SignedDistances")
>
> # Evaluate the signed distance function at all of the grid points
> for pointId in range(rgrid.GetNumberOfPoints()):
>     p = rgrid.GetPoint(pointId)
>     signedDistance = implicitPolyDataDistance.EvaluateFunction(p)
>     signedDistances.InsertNextValue(signedDistance)
>
> # add the SignedDistances to the grid
> rgrid.GetPointData().SetScalars(signedDistances)
>
> # geometry filter to view the background grid
> geometryFilter = vtk.vtkRectilinearGridGeometryFilter()
> geometryFilter.SetInputData(rgrid)
> geometryFilter.SetExtent(0, x + 1, 0, y + 1, (z + 1) // 2, (z + 1) // 2)
> geometryFilter.Update()
> # ================ END creating a plane =======================
>
>
> The code that merge the stl poly data and the plane:
>
> meshAppend = vtk.vtkAppendPolyData()
> meshAppend.AddInputData(stl_poly_data)
> meshAppend.AddInputData(geometryFilter.GetOutput())
> meshAppend.Update()
> boundaryClean = vtk.vtkCleanPolyData()
> boundaryClean.SetInputData(meshAppend.GetOutput())
> boundaryClean.Update()
> out = vtk.vtkPolyData()
> out.DeepCopy(boundaryClean.GetOutput())
>
> triangleTrans = vtk.vtkTriangleFilter()
> triangleTrans.SetInputData(out)
> triangleTrans.Update()
>
> fill = vtk.vtkFillHolesFilter()
> fill.SetInputData(out)
> fill.SetHoleSize(1000000.0)
> fill.Update()
>
>
>
> A screenshot of what my current mesh is (note: the red line is where i
> want to close the gap vertically along the z axis:
> https://i.stack.imgur.com/F9w3c.png
>
> Any suggestion to solve this problem?
>
> Thank you
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> https://public.kitware.com/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://public.kitware.com/pipermail/vtkusers/attachments/20180716/0550b936/attachment.html>


More information about the vtkusers mailing list