File: test_opencascade_boolean.py

package info (click to toggle)
pygmsh 7.1.17-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 684 kB
  • sloc: python: 3,070; makefile: 164; sh: 7
file content (76 lines) | stat: -rw-r--r-- 2,516 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import math

from helpers import compute_volume

import pygmsh


def test_union():
    with pygmsh.occ.Geometry() as geom:
        geom.characteristic_length_min = 0.1
        geom.characteristic_length_max = 0.1
        rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
        disk_w = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
        disk_e = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
        geom.boolean_union([rectangle, disk_w, disk_e])
        mesh = geom.generate_mesh()

    ref = 4.780361
    assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
    return mesh


def test_intersection():
    with pygmsh.occ.Geometry() as geom:
        angles = [math.pi * 3 / 6, math.pi * 7 / 6, math.pi * 11 / 6]
        disks = [
            geom.add_disk([math.cos(angles[0]), math.sin(angles[0]), 0.0], 1.5),
            geom.add_disk([math.cos(angles[1]), math.sin(angles[1]), 0.0], 1.5),
            geom.add_disk([math.cos(angles[2]), math.sin(angles[2]), 0.0], 1.5),
        ]
        geom.boolean_intersection(disks)
        mesh = geom.generate_mesh()

    ref = 1.0290109753807914
    assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
    return mesh


def test_difference():
    with pygmsh.occ.Geometry() as geom:
        geom.characteristic_length_min = 0.1
        geom.characteristic_length_max = 0.1
        rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
        disk_w = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
        disk_e = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
        geom.boolean_union([disk_w, disk_e])
        geom.boolean_difference(rectangle, geom.boolean_union([disk_w, disk_e]))
        mesh = geom.generate_mesh()

    ref = 3.2196387
    assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
    return mesh


def test_all():
    with pygmsh.occ.Geometry() as geom:
        geom.characteristic_length_min = 0.1
        geom.characteristic_length_max = 0.1

        rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
        disk1 = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
        disk2 = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
        union = geom.boolean_union([rectangle, disk1, disk2])

        disk3 = geom.add_disk([0.0, -1.0, 0.0], 0.5)
        disk4 = geom.add_disk([0.0, +1.0, 0.0], 0.5)
        geom.boolean_difference(union, geom.boolean_union([disk3, disk4]))
        mesh = geom.generate_mesh()

    ref = 4.0
    assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
    return mesh


if __name__ == "__main__":
    test_difference().write("boolean.vtu")