具有多个合并的STL文件的VTK

问题描述 投票:0回答:2

我正在使用python和VTK开发一个项目。我成功地将三个STL文件与一个python STL libraray结合在一起。在那之后,我像这样在VTK中可视化此Combine.stl文件:

stl_reader = vtk.vtkSTLReader()
stl_reader.SetFileName(PATH)

stl_mapper = vtk.vtkPolyDataMapper()
stl_mapper.SetInputConnection(stl_reader.GetOutputPort())

stl_actor = vtk.vtkActor()
stl_actor.SetMapper(stl_mapper)

...add actor on renderer, renderer on window etc.

到目前为止很好。但是现在我想给这些STL对象之一上色/突出显示。 (所有STL一起构成一个更大的对象,因此定位很重要,必须保持不变。因此,整个过程最后需要保留一个vtkActor。)

我认为不可能在合并的STL文件中进行着色,因为合并的文件无法跟踪原始对象(也许这里也有解决方案,如果我错了,请纠正我)。所以我想我需要一个不同的解决方案。

我已经通过此CompositePolyDataMapper示例(https://lorensen.github.io/VTKExamples/site/Python/CompositeData/CompositePolyDataMapper/)进行了尝试,但是我不知道如何从vtkSTLReader转换为可以放入vtkMultiBlockDataSet的对象。

有人知道我的问题的解决方案吗?

谢谢你。

python stl vtk
2个回答
0
投票

好,我可以自己解决问题。如果有人遇到类似的问题,则解决方案非常简单:

assembly = vtk.vtkAssembly()
filenames = ["example1.stl","example2.stl","example3.stl"]
for filename in filenames:
    stl_reader = vtk.vtkSTLReader()
    stl_reader.SetFileName(filename)

    stl_mapper = vtk.vtkPolyDataMapper()
    stl_mapper.SetInputConnection(stl_reader.GetOutputPort())

    stl_actor = vtk.vtkActor()
    if filename == "example1.stl":
        stl_actor.GetProperty().SetColor(0.86,0.08,0.24)
    else:
        stl_actor.GetProperty().SetOpacity(0.4)
    stl_actor.SetMapper(stl_mapper)

    assembly.AddPart(stl_actor)

    scene_renderer.AddActor(assembly)

vtkAssembly类可让您向其添加演员,如果您与之交互,则它的作用就像一个演员。


0
投票

我在将STL文件组合在一起时遇到问题,您能为我提供帮助吗?我正在尝试将数据存储为PolyData,但我不确定这是否是正确的方法。我的代码运行没有错误,但是,它不显示任何一个STL文件。

当前,我的代码如下:

import vtk
input1= vtk.vtkPolyData()
input2 = vtk.vtkPolyData()

filename1 = "myfile.stl"
filename2 = "myfile2.stl"

reader1 = vtk.vtkSTLReader()
reader1.SetFileName('C1.stl')

reader2 = vtk.vtkSTLReader()
reader2.SetFileName('C2.stl')

input1.ShallowCopy(reader1.GetOutput())
input2.ShallowCopy(reader2.GetOutput())


#Appending the two meshes together
appendFilter = vtk.vtkAppendPolyData()
if vtk.VTK_MAJOR_VERSION <= 5: 
    appendFilter.AddInputConnection(input1.GetProducerPort())
    appendFilter.AddInputConnection(input2.GetProducerPort())
else: 
    appendFilter.AddInputData(input1)
    appendFilter.AddInputData(input2)

appendFilter.Update()

#  Remove any duplicate points.
cleanFilter = vtk.vtkCleanPolyData()
cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
cleanFilter.Update()

先谢谢您:)

© www.soinside.com 2019 - 2024. All rights reserved.