Работающий модуль наложения ограничений
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