DuckQueen
DuckQueen

Reputation: 800

How to join 2 surfaces on Z acess into one mesh?

So I have 2 surfaces (PolyData in PyVista) one on top of another:

enter image description here

They are shaped a little differently on Z access yet whenever a top one has a Z value on X, Y plane we are sure a-bottom one has the same. So how one can merge two surfaces X, Y aligned into one solid mesh?


What I try:

import numpy as np
import pyvista as pv

import vtk

def extruder(mesh, val_z):
    extrude = vtk.vtkLinearExtrusionFilter()
    extrude.SetInputData(mesh)
    extrude.SetVector(0, 0, val_z)
    extrude.Update()
    extruded_mesh = pv.wrap(extrude.GetOutput())
    return extruded_mesh

# generate two sheets of input data
noise = pv.perlin_noise(2, (0.2, 0.2, 0.2), (0, 0, 0))
bounds_2d = (-10, 10, -10, 10)
dim = (40, 50, 1)
bottom, top = [
    pv.sample_function(noise, dim=dim, bounds=bounds_2d + (z, z)).warp_by_scalar()
    for z in [-5, 5]
]
bottom = bottom.extract_surface(nonlinear_subdivision=5)
top = top.extract_surface(nonlinear_subdivision=5)

top =  extruder(top, -50).triangulate()
bottom =  extruder(bottom, 50).triangulate()

intersection = bottom.boolean_cut(top)

#top = top.clip_surface(bottom, invert=False, compute_distance=True)

#top =  top.extrude([0, 0, -50]).triangulate()
#bottom =  bottom.extrude([0, 0, 50]).triangulate()
#intersection = bottom.boolean_cut(top).triangulate()
p = pv.Plotter()
p.add_mesh(top, cmap="hot", opacity=0.15)
p.add_mesh(bottom, cmap="RdYlBu", opacity=0.15)
p.add_mesh(intersection, cmap="Dark2", opacity=1)
p.show()

What do I get: enter image description here

What I expected: enter image description here only middle to be filled.

Upvotes: 1

Views: 722

Answers (1)

DuckQueen
DuckQueen

Reputation: 800

So had to do this:

import numpy as np
import pyvista as pv

# generate two sheets of input data
noise = pv.perlin_noise(2, (0.2, 0.2, 0.2), (0, 0, 0))
bounds_2d = (-10, 10, -10, 10)
dim = (40, 50, 1)
bottom, top = [
    pv.sample_function(noise, dim=dim, bounds=bounds_2d + (z, z)).warp_by_scalar()
    for z in [-5, 5]
]
bottom = bottom.extract_surface()
top = top.extract_surface()

topm =  top.extrude([0, 0, -50]).triangulate().clean()
bottomm =  bottom.extrude([0, 0, 50]).triangulate().clean()


topm = topm.clip_surface(bottom, invert=False)
bottomm = bottomm.clip_surface(top, invert=True)
intersection = topm.boolean_add(bottomm).triangulate().clean().subdivide(2).clean()

p = pv.Plotter()
#p.add_mesh(topm, cmap="hot", opacity=0.15)
#p.add_mesh(bottomm, cmap="gnuplot2", opacity=0.15)
p.add_mesh(intersection, cmap="Dark2", opacity=1)
p.show()

the resulting mesh is really bad, yet it has desired shape and gets to be computed in usable time: enter image description here

Upvotes: 1

Related Questions