From 871d9d735e373c5ec44aa48095a2ada79524e105 Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Mon, 28 Aug 2023 14:59:50 +0300 Subject: [PATCH 1/2] addding predicate --- intersection_geometry_predicate/README.md | 37 ++++++++ intersection_geometry_predicate/main.py | 87 +++++++++++++++++++ .../requirements.txt | 2 + 3 files changed, 126 insertions(+) create mode 100644 intersection_geometry_predicate/README.md create mode 100644 intersection_geometry_predicate/main.py create mode 100644 intersection_geometry_predicate/requirements.txt diff --git a/intersection_geometry_predicate/README.md b/intersection_geometry_predicate/README.md new file mode 100644 index 0000000..bceb3dd --- /dev/null +++ b/intersection_geometry_predicate/README.md @@ -0,0 +1,37 @@ +# Intersection Geometry Predicate + +Осуществляется проверка геометрических вершин пересечения файлов .obj на соответствие допустимой погрешности глубины. + + +### CLI аргументы: +--aspPath путь до папки с асетами сборки + +### вывод +на выходе делает файл intersection_geometry.json +в котором записан результат работы предиката в виде ключа status и результат в виде ключа recalculations. +В ключе recalculations, записан объект в который записываются результаты расчета пересечения. +Они состоят из объекта. +- names имена пересекающеюся деталей +- depth глубина пересечения +- point геометрические вершины + + +```JSON +{ + "status": false, + "recalculations": { + "disk_bottom bolt ": [ + { + "names": "disk_bottom bolt ", + "depth": 0.5127948565443177, + "point": [ + -1.972554, + 16.442781, + -9.208569 + ] + } + ] + } +} + +``` \ No newline at end of file diff --git a/intersection_geometry_predicate/main.py b/intersection_geometry_predicate/main.py new file mode 100644 index 0000000..69e1b37 --- /dev/null +++ b/intersection_geometry_predicate/main.py @@ -0,0 +1,87 @@ +import trimesh +import os +import json +import argparse + +class FS: + def readJSON(path: str): + return json.loads((open(path)).read()) + + def writeFile(data, filePath, fileName): + + file_to_open = filePath + fileName + + f = open(file_to_open, 'w') + print(f) + f.write(data) + f.close() + + def readFile(path: str): + return open(path).read() + + def readFilesTypeFolder(pathFolder: str, fileType='.json'): + filesJson = list( + filter(lambda x: x[-fileType.__len__():] == fileType, os.listdir(pathFolder))) + return list(map(lambda x: pathFolder + x, filesJson)) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--aspPath', help='asp generation folder') + args = parser.parse_args() + + if args.aspPath == None: + parser.print_help() + + pathMeshes = 'sdf/meshes/' + permissibleDepth = 0.5 + + trimeshObjects = [] + meshes = FS.readFilesTypeFolder(args.aspPath + pathMeshes, '.obj') + for el in meshes: + trimeshObjects.append(trimesh.load(el)) + + manager = trimesh.collision.CollisionManager() + + for el in range(len(trimeshObjects)): + manager.add_object(str(meshes[el]), trimeshObjects[el]) + + def set_to_dict(s): + keys = list(s) + values = [None] * len(s) + return {k: v for k, v in zip(keys, values)} + collisions = manager.in_collision_internal(True, True) + + recalculations = {} + for el in collisions[collisions.__len__() - 1]: + if (el.depth > permissibleDepth): + labels = '' + for key in set_to_dict(el.names).keys(): + label = key[key.rfind('/') + 1:key.__len__() - 4] + labels+=label + " " + message = { + 'names': labels, + 'depth': el.depth, + 'point': el.point.tolist() + } + if(recalculations.get(labels) != None): + recalculations[labels].append(message) + else: + recalculations[labels] = [message] + + if(len(list(recalculations.keys())) >= 1): + messageError = { + 'status':False, + 'recalculations':recalculations + } + FS.writeFile(json.dumps(messageError, ensure_ascii=False, indent=4), aspPath,'intersection_geometry.json') + else: + message = { + 'status':True, + 'recalculations': None + } + FS.writeFile(json.dumps(messageError, ensure_ascii=False, indent=4), aspPath,'intersection_geometry.json') + + + +main() + \ No newline at end of file diff --git a/intersection_geometry_predicate/requirements.txt b/intersection_geometry_predicate/requirements.txt new file mode 100644 index 0000000..fdda232 --- /dev/null +++ b/intersection_geometry_predicate/requirements.txt @@ -0,0 +1,2 @@ +argparse +trimesh \ No newline at end of file From fe797ebeeba65be0783d42cbe6722b3158bfbb2b Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Mon, 28 Aug 2023 15:05:41 +0300 Subject: [PATCH 2/2] misprint --- intersection_geometry_predicate/main.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/intersection_geometry_predicate/main.py b/intersection_geometry_predicate/main.py index 69e1b37..810ad98 100644 --- a/intersection_geometry_predicate/main.py +++ b/intersection_geometry_predicate/main.py @@ -12,7 +12,6 @@ class FS: file_to_open = filePath + fileName f = open(file_to_open, 'w') - print(f) f.write(data) f.close() @@ -31,12 +30,12 @@ def main(): if args.aspPath == None: parser.print_help() - + aspPath = args.aspPath pathMeshes = 'sdf/meshes/' permissibleDepth = 0.5 trimeshObjects = [] - meshes = FS.readFilesTypeFolder(args.aspPath + pathMeshes, '.obj') + meshes = FS.readFilesTypeFolder(aspPath + pathMeshes, '.obj') for el in meshes: trimeshObjects.append(trimesh.load(el))