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

Patrick Bergeron pbergeron at spiria.com
Mon Jul 16 07:48:18 EDT 2018


Hi Jacky

Let me try to be clearer. Let’s say you have a surface floating in space, which seems to be your case.

You can create a wall around your surface, by creating new geometry around your surface, which we will say is your wall. On the wall, you need to connect boundary edges with the floor (at z=0).

So set’s say you find a boundary edge with points a and b


  *   Add 2 points to your polydata. (xa, ya, 0),  (xb, yb, 0)

Then you create a quad that goes like this:

(xa,ya,za),
 (xb,yb,zb)
(xb,yb,0)
(xa,ya,0)

Or if you prefer you can create 2 triangles:
(xa,ya,za),
 (xb,yb,zb)
(xb,yb,0)

(xb,yb,0)
(xa,ya,0)
(xa,ya,za),


Anyway, after you create your walls at each boundary edge, you end up with walls that go all around your surface, but with no horizontal surface  at the bottom. Maybe this is important to you, maybe not.

If it’s important, you can create a duplicate copy of your top surface, but in the copy, set all your point’s  Z to 0.0.

This will flatten out the copy of your top surface and place it at Z=0, connecting to the bottom of your wall that you created all around your surface

You will end up with a volume with the sides and bottom capped off.


Patrick.



From: Jacky Nguyen <jackynguyen.km at gmail.com>
Date: Monday, July 16, 2018 at 5:12 AM
To: Patrick Bergeron <pbergeron at spiria.com>
Cc: "vtkusers at public.kitware.com" <vtkusers at public.kitware.com>
Subject: Re: [vtkusers] Close the gap between a mesh and a planar

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<mailto: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<mailto: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<http://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/e54a0047/attachment.html>


More information about the vtkusers mailing list