File size: 3,850 Bytes
91daf98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import pickle
import argparse
import json
# hyperparameters from SkexGen project
SKETCH_R = 1
RADIUS_R = 1
EXTRUDE_R = 1.0
SCALE_R = 1.4
OFFSET_R = 0.9
PIX_PAD = 4
CMD_PAD = 3
COORD_PAD = 4
EXT_PAD = 1
EXTRA_PAD = 1
R_PAD = 2


def create_curve_str(se_xy, se_cmd):
    curve_str = ""
    xy_offset = 0
    if se_cmd == 0:  # line
        curve_str = " line," + ",".join(str(x) for x in se_xy[0])
        xy_offset = 2
    elif se_cmd == 1:  # arc
        curve_str = " arc," + ",".join(str(x) for x in se_xy[0:2].flatten())
        xy_offset = 3
    elif se_cmd == 2:  # circle
        curve_str = " circle," + ",".join(str(x) for x in se_xy[0:4].flatten())
        xy_offset = 5
    curve_str += " <curve_end>"
    return curve_str, xy_offset


def create_sketch_str(se_xy, se_cmd):
    sketch_str = ""
    len_xy, len_cmd = len(se_xy), len(se_cmd)
    xy_idx = 0
    for cmd_item in se_cmd:  # for each command
        if 0 <= cmd_item <= 2:  # curve
            curve_str, xy_offset = create_curve_str(se_xy[xy_idx:], cmd_item)
            sketch_str += curve_str
            xy_idx += xy_offset
        elif cmd_item == -1:  # loop
            sketch_str += " <loop_end>"
            xy_idx += 1
        elif cmd_item == -2:  # face
            sketch_str += " <face_end>"
            xy_idx += 1
        elif cmd_item == -3:  # sketch
            sketch_str += " <sketch_end>"
            xy_idx += 1
        else:
            raise ValueError("Invalid command: " + str(cmd_item))
    if xy_idx != len_xy:
        raise ValueError("xy_idx != len_xy")
    return sketch_str


def create_extrude_str(se_ext):
    extrude_str = ""
    # extrude operation
    if se_ext[14] == 1:
        extrude_str += "add"
    elif se_ext[14] == 2:
        extrude_str += "cut"
    elif se_ext[14] == 3:
        extrude_str += "intersect"
    else:
        raise ValueError("Invalid extrude operation: " + str(se_ext[14]))
    # other extrude parameters
    extrude_str = (
        extrude_str + "," + ",".join(str(x - EXT_PAD) for x in se_ext[0:5])
    )  # ext_v, ext_T
    extrude_str = (
        extrude_str + "," + ",".join(str(x - R_PAD) for x in se_ext[5:14])
    )  # ext_R
    extrude_str = (
        extrude_str + "," + ",".join(str(x - EXT_PAD) for x in se_ext[15:18])
    )  # scale, offset
    # extrude end
    extrude_str += " <extrude_end>"
    return extrude_str


def convert(in_path, out_path):
    with open(in_path, "rb") as f:
        data = pickle.load(f)
    print("Data loaded: " + str(len(data)) + " samples")

    results = []
    for item in data:  # for each data
        se_str = ""
        num_se = item["num_se"]
        for se_idx in range(num_se):  # for each sketch-extrude
            xy, cmd, ext = (
                item["se_xy"][se_idx] - COORD_PAD,
                item["se_cmd"][se_idx] - CMD_PAD,
                item["se_ext"][se_idx],
            )
            se_str = se_str + " " + create_sketch_str(xy, cmd).strip()
            se_str = se_str + " " + create_extrude_str(ext).strip()
        results.append(se_str.strip())

    # with open(out_path, "wb") as f:
    #     pickle.dump(results, f)
    # print("Data converted: " + str(len(results)) + " samples")
    with open(out_path, "w") as f:
        json.dump(results, f, indent=4)
    print("Data converted: " + str(len(results)) + " samples")
    # with open(out_path, "w") as f:  # Open in text mode  
    #     for result in results:  
    #         f.write(result + "\n") 

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--in-path", type=str, required=True)
    parser.add_argument("--out-path", type=str, required=True)
    args = parser.parse_args()

    convert(args.in_path, args.out_path)