Работающий модуль наложения ограничений
This commit is contained in:
parent
db4e0d7ac9
commit
a4da4aee68
5 changed files with 173 additions and 29 deletions
139
freecad_workbench/freecad/robossembler/constraints_operator.py
Normal file
139
freecad_workbench/freecad/robossembler/constraints_operator.py
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
import FreeCAD as App
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def has_active_document():
|
||||||
|
doc = App.activeDocument()
|
||||||
|
if not doc:
|
||||||
|
App.Console.PrintError("Нет активного документа в FreeCAD.\n")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_assembly_settings_folder():
|
||||||
|
if not has_active_document():
|
||||||
|
return False
|
||||||
|
|
||||||
|
doc = App.activeDocument()
|
||||||
|
assembly_settings_folder = None
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if obj.Name == "Assembly_Settings":
|
||||||
|
assembly_settings_folder = obj
|
||||||
|
break
|
||||||
|
if not assembly_settings_folder:
|
||||||
|
assembly_settings_folder = doc.addObject("App::DocumentObjectGroup", "Assembly_Settings")
|
||||||
|
|
||||||
|
return assembly_settings_folder
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#Создаем объект, описывающий крепежные элементы
|
||||||
|
#Стоит отметить, что структура крепежа может быть сложнее, чем просто винт. В будущем стоит придумать, как отразить эту структуру, если это необходимо
|
||||||
|
|
||||||
|
def create_fastener_set():
|
||||||
|
doc = App.activeDocument()
|
||||||
|
assembly_settings_folder = get_assembly_settings_folder()
|
||||||
|
|
||||||
|
fastener_set = doc.addObject("Part::FeaturePython", "Fastener_Set")
|
||||||
|
fastener_set.addProperty("App::PropertyString", "Type", 'Asm_Settings').Type = 'fastener_set'
|
||||||
|
fastener_set.addProperty("App::PropertyLink", "Parent", 'Asm_Settings')
|
||||||
|
fastener_set.addProperty("App::PropertyLink", "Child", 'Asm_Settings')
|
||||||
|
fastener_set.addProperty("App::PropertyLinkList", "Fasteners", 'Asm_Settings')
|
||||||
|
|
||||||
|
assembly_settings_folder.addObject(fastener_set)
|
||||||
|
|
||||||
|
|
||||||
|
#Жесткая последовательность для двух деталей
|
||||||
|
def create_assembly_sequence():
|
||||||
|
doc = App.activeDocument()
|
||||||
|
assembly_settings_folder = get_assembly_settings_folder()
|
||||||
|
|
||||||
|
assembly_sequence = doc.addObject("Part::FeaturePython", "Assembly_Sequence")
|
||||||
|
assembly_sequence.addProperty("App::PropertyString", "Type", 'Asm_Settings').Type = 'asm_sequence'
|
||||||
|
assembly_sequence.addProperty("App::PropertyLink", "Parent", 'Asm_Settings')
|
||||||
|
assembly_sequence.addProperty("App::PropertyLink", "Child", 'Asm_Settings')
|
||||||
|
|
||||||
|
assembly_settings_folder.addObject(assembly_sequence)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#Допустимый зазор для группы элементов, при котором будут распознаваться контакты с окружающими деталями
|
||||||
|
def create_clearance_constraint(max_clearance = 1.0):
|
||||||
|
doc = App.activeDocument()
|
||||||
|
assembly_settings_folder = get_assembly_settings_folder()
|
||||||
|
|
||||||
|
|
||||||
|
clearance_constraint = doc.addObject("Part::FeaturePython", "Clearance_Constraint")
|
||||||
|
clearance_constraint.addProperty("App::PropertyLinkList", "PartName", 'Asm_Settings')
|
||||||
|
clearance_constraint.addProperty("App::PropertyString", "Type", 'Asm_Settings').Type = 'clearance'
|
||||||
|
clearance_constraint.addProperty("App::PropertyFloat", "MaxClearance", 'Asm_Settings').MaxClearance = max_clearance
|
||||||
|
|
||||||
|
assembly_settings_folder.addObject(clearance_constraint)
|
||||||
|
|
||||||
|
def create_assembly_parameters():
|
||||||
|
doc = App.activeDocument()
|
||||||
|
assembly_settings_folder = get_assembly_settings_folder()
|
||||||
|
|
||||||
|
assembly_parameters = doc.addObject("Part::FeaturePython", "Assembly_Parameters")
|
||||||
|
assembly_parameters.addProperty("App::PropertyFloat", "Subassembly_Size", 'Asm_Settings')
|
||||||
|
assembly_parameters.addProperty("App::PropertyLink", "Subassembly_Mass", 'Asm_Settings')
|
||||||
|
assembly_parameters.addProperty("App::PropertyBool", "Materials_Together", 'Asm_Settings')
|
||||||
|
assembly_parameters.addProperty("App::PropertyFloat", "Total_Clearance")
|
||||||
|
|
||||||
|
assembly_settings_folder.addObject(assembly_parameters)
|
||||||
|
|
||||||
|
#экспорт всех заданных настроек в общий файл json
|
||||||
|
def export_assembly_settings():
|
||||||
|
doc = App.activeDocument()
|
||||||
|
if not doc:
|
||||||
|
return
|
||||||
|
|
||||||
|
assembly_settings_folder = None
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if obj.Name == "Assembly_Settings":
|
||||||
|
assembly_settings_folder = obj
|
||||||
|
break
|
||||||
|
|
||||||
|
if not assembly_settings_folder:
|
||||||
|
return
|
||||||
|
|
||||||
|
data = []
|
||||||
|
for obj in assembly_settings_folder.Group:
|
||||||
|
if hasattr(obj, "Type"):
|
||||||
|
obj_dict = {"Name": obj.Name}
|
||||||
|
if obj.Type == "fastener_set":
|
||||||
|
fasteners = [part.Label for part in obj.Fasteners]
|
||||||
|
obj_dict.update({
|
||||||
|
"Type": "fastener_set",
|
||||||
|
"Parent": obj.Parent.Label,
|
||||||
|
"Child": obj.Child.Label,
|
||||||
|
"Fasteners": fasteners
|
||||||
|
})
|
||||||
|
elif obj.Type == "asm_sequence":
|
||||||
|
obj_dict.update({
|
||||||
|
"Type": "asm_sequence",
|
||||||
|
"Parent": obj.Parent.Label,
|
||||||
|
"Child": obj.Child.Label
|
||||||
|
})
|
||||||
|
elif obj.Type == "clearance":
|
||||||
|
partnames = [part.Label for part in obj.PartName]
|
||||||
|
obj_dict.update({
|
||||||
|
"Type": "clearance",
|
||||||
|
"PartName": partnames,
|
||||||
|
"MaxClearance": obj.MaxClearance
|
||||||
|
})
|
||||||
|
data.append(obj_dict)
|
||||||
|
|
||||||
|
save_dir = os.path.dirname(doc.FileName)
|
||||||
|
save_path = os.path.join(save_dir, "assembly_settings_" + App.ActiveDocument.Label + ".json")
|
||||||
|
with open(save_path, "w") as f:
|
||||||
|
json.dump(data, f, indent=4)
|
||||||
|
|
||||||
|
#create_fastener_set()
|
||||||
|
#create_assembly_sequence()
|
||||||
|
#create_clearance_constraint()
|
||||||
|
export_assembly_settings()
|
|
@ -1,29 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Укажите путь к папке, которую нужно скопировать
|
|
||||||
SOURCE_DIR="/home/markvoltov/GitProjects/framework/freecad_workbench/freecad/robossembler"
|
|
||||||
|
|
||||||
# Укажите путь к папке, которую нужно заменить
|
|
||||||
DEST_DIR="/home/markvoltov/.local/share/FreeCAD/Mod/freecad_workbench"
|
|
||||||
|
|
||||||
# Проверка, что исходная папка существует
|
|
||||||
if [ ! -d "$SOURCE_DIR" ]; then
|
|
||||||
echo "Исходная папка не существует: $SOURCE_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Удаление содержимого папки назначения
|
|
||||||
if [ -d "$DEST_DIR" ]; then
|
|
||||||
echo "Удаление содержимого папки назначения: $DEST_DIR"
|
|
||||||
rm -rf "$DEST_DIR/*"
|
|
||||||
else
|
|
||||||
# Создание папки назначения, если её нет
|
|
||||||
echo "Создание папки назначения: $DEST_DIR"
|
|
||||||
mkdir -p "$DEST_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Копирование содержимого исходной папки в папку назначения
|
|
||||||
echo "Копирование содержимого из $SOURCE_DIR в $DEST_DIR"
|
|
||||||
cp -r "$SOURCE_DIR/." "$DEST_DIR/"
|
|
||||||
|
|
||||||
echo "Копирование завершено"
|
|
34
test_models/assembly_settings.json
Normal file
34
test_models/assembly_settings.json
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"Name": "Fastener_Set",
|
||||||
|
"Type": "fastener_set",
|
||||||
|
"Parent": "body_down",
|
||||||
|
"Child": "body_up",
|
||||||
|
"Fasteners": [
|
||||||
|
"bolt4",
|
||||||
|
"bolt",
|
||||||
|
"bolt2",
|
||||||
|
"bolt3"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "Assembly_Sequence",
|
||||||
|
"Type": "asm_sequence",
|
||||||
|
"Parent": "body_down",
|
||||||
|
"Child": "sol_gear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "Clearance_Constraint",
|
||||||
|
"Type": "clearance",
|
||||||
|
"PartName": [
|
||||||
|
"planet_gear002",
|
||||||
|
"planet_gear005",
|
||||||
|
"planet_gear004",
|
||||||
|
"planet_gear003",
|
||||||
|
"planet_gear",
|
||||||
|
"output_shaft",
|
||||||
|
"sol_gear"
|
||||||
|
],
|
||||||
|
"MaxClearance": 1.0
|
||||||
|
}
|
||||||
|
]
|
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue