diff --git a/cg/freecad/Frames/import FreeCAD.py b/cg/freecad/Frames/import FreeCAD.py new file mode 100644 index 0000000..5484752 --- /dev/null +++ b/cg/freecad/Frames/import FreeCAD.py @@ -0,0 +1,81 @@ +import FreeCAD +import Part +import ImportGui + +class GeometryValidateUseCase: + def __init__(self): + self.doc = None + + + + + def import_step_and_check(self, file_path): + # Очистить сцену перед импортом новой сборки + FreeCAD.closeDocument("Unnamed") + + # Создать новый документ FreeCAD + self.doc = FreeCAD.newDocument("Unnamed") + + # Импортируйте STEP-файл + ImportGui.open(file_path, "Unnamed") + + # Отобразите объект в 3D-виде + FreeCAD.ActiveDocument.recompute() + Gui.SendMsgToActiveView("ViewFit") + + # Получить список тел в сборке + bodies = getBodies(self.doc) + + # Проверить пересечения между телами + intersections = self.check_intersections(bodies) + self.print_intersections(intersections) + + # Проверить тела на нулевой объем + zero_volume_bodies = self.check_zero_volume(bodies) + self.print_zero_volume(zero_volume_bodies) + + # Сохранить документ + self.save_checked_document(file_path) + + + def getBodies(doc): + bodies = [] + for obj in doc.Objects: + if hasattr(obj, 'TypeId') and obj.TypeId == "Part::Feature": + bodies.append(obj) + return bodies + + + + def check_intersections(self, bodies): + intersections = [] + for i in range(len(bodies)): + for j in range(i + 1, len(bodies)): + if bodies[i].intersects(bodies[j]): + intersections.append((i + 1, j + 1)) + return intersections + + def check_zero_volume(self, bodies): + zero_volume_bodies = [i + 1 for i, body in enumerate(bodies) if body.Volume == 0] + return zero_volume_bodies + + def print_intersections(self, intersections): + for i, j in intersections: + print("Тела пересекаются: Body {} и Body {}".format(i, j)) + + def print_zero_volume(self, zero_volume_bodies): + for i in zero_volume_bodies: + print("Тело {} имеет нулевой объем".format(i)) + + def save_checked_document(self, original_file_path): + checked_file_path = original_file_path.replace(".step", "_checked.FCStd") + FreeCAD.saveDocument(self.doc, checked_file_path) + print("Проверенная сборка сохранена в файл:", checked_file_path) + FreeCAD.closeDocument("Unnamed") + + + +use_case = GeometryValidateUseCase() +step_file_path = "/home/mark-voltov/Загрузки/Telegram Desktop/test_asm.STEP" +use_case.import_step_and_check(step_file_path) + diff --git a/cg/freecad/Frames/normalEstimator b/cg/freecad/Frames/normalEstimator index e69de29..f8f9aae 100644 --- a/cg/freecad/Frames/normalEstimator +++ b/cg/freecad/Frames/normalEstimator @@ -0,0 +1,57 @@ +import FreeCAD +import FreeCADGui + + + + + +#creation liste piece +LP = [] +#LC = ['planesParallel','circularEdge'] +LP2=[] + +for object in FreeCAD.ActiveDocument.Objects: + if 'objectType' in object.PropertiesList: + LP.append(object.Label) + if 'Type' in object.PropertiesList: + LP2.append(object.Object1) + LP2.append(object.Object2) +n=len(LP) +for i in range (n): + LP[i] = "b_"+str(LP[i]+"_") +print(LP) +print("le nombre de pièce= : ", len(LP)) + + + + +#Matrice X +X = [0] * n +for i in range (n): + X[i] = [0] * n +#print(X) +#♣Matrice Y +Y = [0] * n +for i in range (n): + Y[i] = [0] * n +#print(Y) +#Matrice Z +Z = [0] * n +for i in range (n): + Z[i] = [0] * n +#print(Z) +#Remplisage matrice X +for k in range (0,len(LP2),2): + if k+1 < (len(LP2)) : + i=LP.index(LP2[k]) + j=LP.index(LP2[k+1]) + X[i][j] = 1 +#print(X) +u=[0] +v=[0] +LN=[] +for object in FreeCAD.ActiveDocument.Objects: + if 'Type' not in object.PropertiesList: + maFace = object.Shape.Face[1] + myNormal = maFace.normalAt (u, v) + LN.append(myNormal) \ No newline at end of file diff --git a/cg/freecad/Frames/pddl/Readme.md b/cg/freecad/Frames/pddl/Readme.md new file mode 100644 index 0000000..5686638 --- /dev/null +++ b/cg/freecad/Frames/pddl/Readme.md @@ -0,0 +1,8 @@ +# Модуль "Path2pddl" + +Модуль используется с целью генерации domain-файла pddl на базе созданных в верстаке Path технологических операций. +Инженер-технолог, используя верстак, генерирует объекты операций, описывающие процесс создания детали из заготовки. Возможности верстака позволяют описывать работу большинства 2.5D-станков, а так же - 3d-печати (не реализовано в полной мере). + +Для работы необходимо указать ссылки на CAD-модели используемых в сцене инструментов и деталей. Если они были импортированы корректно, то модуль создаст domain-файл. При этом, он будет содержать большое количество индивидуальных операций для каждой детали и станка, у каждой из которых будет своя длительность и свои предусловия, параметры и эффекты. + +Главный недостаток модуля на данный момент - отсутствие автоматической генерации предусловий. Это приводит к тому, что операции необходимо незначительно модернизировать, указывая их вручную. Автоматическое создание предусловий видится довольно сложной задачей, требующей учесть много возможных вариантов, так что, вероятно, будет добавлен позднее. \ No newline at end of file diff --git a/markup_workbench/env.json b/markup_workbench/env.json new file mode 100644 index 0000000..6137322 --- /dev/null +++ b/markup_workbench/env.json @@ -0,0 +1,7 @@ +{ + "aspPath":"/home/mark-voltov/Рабочий стол/out/", + "gripperName": "Gripper01" + + + +} \ No newline at end of file