Python中文本的流形3D网格

kfgdxczn  于 2023-10-14  发布在  Python
关注(0)|答案(2)|浏览(143)

我试图得到一个代码,这将有助于我脚本生成定制的stl文件结束。
我的一般需求是:

  • 使用Python,如果可能,不使用其他后端软件
  • 最小化依赖关系
  • 生产轻量化模型

并具体要求:

  • 为规则形状生成3D网格
  • 基于不同字体从文本生成3D网格
  • 将文本网格环绕圆柱体
  • 执行布尔操作

到目前为止,我还没有找到合适的库来执行这些操作。
我发现了sdf库,它真的很棒,但可以生成大型模型。
Trimesh很棒。我设法生成结构的网格,导出为HTML和STL,但没有后端无法执行布尔运算。
我看了一下Pymesh,但是库似乎不再开发了,并且有大量的依赖项。
我现在尝试快速查看PyVista,但目前无法进入非流形模型的问题。
这是我想要的代码歧管

  1. import numpy as np
  2. import pyvista as pv
  3. RES = 20
  4. vertices = np.array([
  5. [20.5, -17.5, 0.0],
  6. [24.39711432, -8.75, 0.0],
  7. [24.39711432, 8.75, 0.0],
  8. [20.5, 17.5, 0.0],
  9. [19.20096189, 8.75, 0.0],
  10. [19.20096189, -8.75, 0.0],
  11. [20.5, -17.5, 0.0]])
  12. profile = pv.MultipleLines(vertices)
  13. profile.plot(color='tan')
  14. extruded = profile.extrude_rotate(resolution=RES**2, rotation_axis=(0, 1, 0))#, capping=False)
  15. print(extruded.is_all_triangles)
  16. print(extruded.is_manifold)
  17. print(extruded.extract_geometry().n_open_edges)
  18. extruded.plot_normals()
  19. # Check if all triangles :
  20. extruded = extruded.fill_holes(4*RES)
  21. print(extruded.is_all_triangles)
  22. print(extruded.is_manifold)
  23. print(extruded.extract_geometry().n_open_edges)
  24. extruded.plot_normals()
  25. extruded.plot(color='tan')

第二步是在它周围添加文本。

7y4bm7vi

7y4bm7vi1#

我不完全理解你想结束(特别是关于文本部分),但你的圆柱体几乎是流形,可以使流形。
有几个问题:
1.您的fill_holes调用为柱面添加了一个“bottom”。这将弄乱流形,因为这个“底部”的边缘分别属于三个面(一个内壁,一个外壁和一个“底部”面)。我建议忘记底部,只要你需要一个多方面的网格,只有添加底部在最后,如果你需要它。
1.您的MultipleLines调用创建了7个点,因此多边形横截面实际上并不是闭合的。您可以使用不同的方法创建该示例,或者只在profile上调用.clean()来关闭它。
1.您还需要从挤出中删除封口,因为这可能会导致圆柱体内部有两个内部面,从而再次扰乱歧管。
1.如果你修复了上面的问题,你最终会得到一个仍然有12条开放边的挤出圆柱体:二乘六。这表明VTK无法将旋转挤出的两端识别为相同的,调用.clean()也没有帮助。事实证明,我们必须提高默认值tolerance来解决这个问题。tolerance=1e-10的选择对于您的示例很好,但是如果模型的参数可以变化,为了安全起见,您可以选择更高的值。
下面是固定的片段:

  1. import numpy as np
  2. import pyvista as pv
  3. RES = 20
  4. vertices = np.array([
  5. [20.5, -17.5, 0.0],
  6. [24.39711432, -8.75, 0.0],
  7. [24.39711432, 8.75, 0.0],
  8. [20.5, 17.5, 0.0],
  9. [19.20096189, 8.75, 0.0],
  10. [19.20096189, -8.75, 0.0],
  11. [20.5, -17.5, 0.0]])
  12. profile = pv.MultipleLines(vertices).clean()
  13. extruded = profile.extrude_rotate(resolution=RES**2, rotation_axis=(0, 1, 0), capping=False)
  14. cleaned = extruded.clean(tolerance=1e-10)
  15. print(cleaned.is_manifold) # True

话虽如此,使用VTK进行布尔运算可能是非常困难的。您可能会发现最终结果仍然不适合您的用例。但你只有试过才知道。

展开查看全部
dzhpxtsq

dzhpxtsq2#

看起来pymadcad应该适合您的需求(disclamer:我是pymadcad的作者)

  • 它是纯python的(有一些cython,但它是生态系统的一部分)
  • 对scipy和qt有依赖性,但没有更多
  • 生成轻量级模型,仅使用描述几何图形所需的三角形

针对您的应用特性:

  • 它可以用madcad.generation中的函数生成规则形状的3D网格
  • 它可以使用madcad.text中的函数从文本生成3D网格
  • 对于围绕圆柱体包裹文本网格,我将在下面详细介绍
  • 它可以用madcad.boolean中的函数执行布尔运算,

将网格缠绕在圆柱体上更具体,但我想可以自己编码,因为文本只是平面的。下面是我将如何进行:

  1. from madcad import *
  2. r = 1
  3. h = 0.6
  4. e = 0.1
  5. # generate the shape to write on
  6. shape = cylinder(vec3(0,0,-h), vec3(0,0,h), r)
  7. # generate flat text as a Web (wireframe mesh)
  8. label = text.text("foo bar", fill=False)
  9. # wrap the mesh points around the cylinder
  10. label.points = typedlist(vec3(cos(p.x/r), sin(p.x/r), p.y-0.5)*r
  11. for p in label.points)
  12. # extrude the mesh and give it a cylindric filling
  13. label = intersection(
  14. extrusion(scale(vec3(1-e-0.1*r, 1-e-0.1*r, 1)), label.transform(scale(vec3(1+e*1.1, 1+e*1.1, 1)))),
  15. inflate(shape, e),
  16. )
  17. # merge it onto the cylinder
  18. result = union(shape, label)
  19. print(repr(result))
  20. show([result], display_wire=True)

结果如下:

  1. <Mesh with 1486 points at 0x7efdaeb10ef0, 2966 faces>

展开查看全部

相关问题