File size: 2,895 Bytes
990e2a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
import numpy as np
import argparse

from lightning_fabric import seed_everything

from eval_condition import *
from OCC.Core.GCPnts import GCPnts_AbscissaPoint
from OCC.Core.GeomAdaptor import GeomAdaptor_Curve


def get_fluxEE(vertices: np.ndarray, facets: np.ndarray) -> float:
    points = vertices[facets]
    a = points[:, 1] - points[:, 0]
    b = points[:, 2] - points[:, 0]
    normals = np.cross(a, b)
    norms = np.linalg.norm(normals)
    assert np.all(norms != 0)
    normals /= norms[:, None]
    d_S = 0.5 * norms
    fluxEE = np.sum(np.sum(normals, axis=1) * d_S)
    return abs(fluxEE)


def get_NormalC(v_recon_points: np.ndarray, v_gt_points: np.ndarray) -> float:
    # ACC
    acc_l1norm = np.sum(np.abs(v_gt_points[:, None, :3] - v_recon_points[:, :3]), axis=2)
    min_dist_index = np.argmin(acc_l1norm, axis=0)
    acc = np.mean(np.sum(v_recon_points[:, 3:] * v_gt_points[min_dist_index][:, 3:], axis=1))

    # Comp
    comp_l1norm = np.sum(np.abs(v_recon_points[:, None, :3] - v_gt_points[:, :3]), axis=2)
    min_dist_index = np.argmin(comp_l1norm, axis=0)
    comp = np.mean(np.sum(v_gt_points[:, 3:] * v_recon_points[min_dist_index][:, 3:], axis=1))

    return acc, comp, (acc + comp) / 2.0


def get_danglingEdgeLength(shape):
    no_directions = True
    edges = get_primitives(shape, TopAbs_EDGE, no_directions)
    faces = get_primitives(shape, TopAbs_FACE, no_directions)
    connection = {edge: set() for edge in edges}

    def EdgeBelongsToFace(edge, face):
        edgeOnFace = get_primitives(face, TopAbs_EDGE, True)
        for _edge in edgeOnFace:
            if _edge.IsSame(edge):
                return True
        return False

    # Get edge-face connections
    for edge in edges:
        for face in faces:
            if EdgeBelongsToFace(edge, face):
                connection[edge].add(face)

                # Get dangling edge length
    danglingEdgeLength = 0.0
    for edge, faces in connection.items():
        if len(faces) < 2:
            curve, _, _ = BRep_Tool.Curve(edge)
            if len(faces) == 1 and (BRep_Tool.Surface(list(faces)[0]).IsUPeriodic() or BRep_Tool.Surface(list(faces)[0]).IsVPeriodic()):
                continue
            else:
                danglingEdgeLength += GCPnts_AbscissaPoint.Length(GeomAdaptor_Curve(curve))

    return danglingEdgeLength


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Evaluate The Generated Brep')
    parser.add_argument('--eval_root', type=str)
    parser.add_argument('--gt_root', type=str)
    parser.add_argument('--use_ray', action='store_true')
    parser.add_argument('--num_cpus', type=int, default=16)
    parser.add_argument('--prefix', type=str, default='')
    parser.add_argument('--list', type=str, default='')
    parser.add_argument('--from_scratch', action='store_true')
    args = parser.parse_args()

    seed_everything(0)