DeepCAD / utils /export2step.py
turiya-ai's picture
Upload 51 files
4d588ce verified
raw
history blame
2.12 kB
import os
import glob
import json
import h5py
import numpy as np
from OCC.Core.BRepCheck import BRepCheck_Analyzer
from OCC.Extend.DataExchange import read_step_file, write_step_file
import argparse
import sys
sys.path.append("..")
from cadlib.extrude import CADSequence
from cadlib.visualize import vec2CADsolid, create_CAD
from file_utils import ensure_dir
parser = argparse.ArgumentParser()
parser.add_argument('--src', type=str, required=True, help="source folder")
parser.add_argument('--form', type=str, default="h5", choices=["h5", "json"], help="file format")
parser.add_argument('--idx', type=int, default=0, help="export n files starting from idx.")
parser.add_argument('--num', type=int, default=10, help="number of shapes to export. -1 exports all shapes.")
parser.add_argument('--filter', action="store_true", help="use opencascade analyzer to filter invalid model")
parser.add_argument('-o', '--outputs', type=str, default=None, help="save folder")
args = parser.parse_args()
src_dir = args.src
print(src_dir)
out_paths = sorted(glob.glob(os.path.join(src_dir, "*.{}".format(args.form))))
if args.num != -1:
out_paths = out_paths[args.idx:args.idx+args.num]
save_dir = args.src + "_step" if args.outputs is None else args.outputs
ensure_dir(save_dir)
for path in out_paths:
print(path)
try:
if args.form == "h5":
with h5py.File(path, 'r') as fp:
out_vec = fp["out_vec"][:].astype(np.float)
out_shape = vec2CADsolid(out_vec)
else:
with open(path, 'r') as fp:
data = json.load(fp)
cad_seq = CADSequence.from_dict(data)
cad_seq.normalize()
out_shape = create_CAD(cad_seq)
except Exception as e:
print("load and create failed.")
continue
if args.filter:
analyzer = BRepCheck_Analyzer(out_shape)
if not analyzer.IsValid():
print("detect invalid.")
continue
name = path.split("/")[-1].split(".")[0]
save_path = os.path.join(save_dir, name + ".step")
write_step_file(out_shape, save_path)