Добавлен modelExport, готовящий фрикад-модель к экспорту (пока только материалы)

This commit is contained in:
Mark Voltov 2023-06-27 16:41:09 +03:00
parent 62949e8292
commit 6983c833f2
5 changed files with 247 additions and 0 deletions

View file

@ -0,0 +1,84 @@
import FreeCAD as App
import FreeCADGui as Gui
#создаем вкладку с материалами
#концептуально нам нужен лишь обьект, в котором перечислены тела, связанные с материалами
#создаем объект
#указываем референсный материал
#указываем референсное тело
#добавляем все остальные тела, которые имеют такой же цвет
#план-минимум
'''
План:
Сделать приемлемым работу FEM:
1. Проверка на уникальность и повторяемость материалов
2. Проверка на детали, которые не имеют материала
3. Проверка материалов на соответствие требованиям
4. Назначение деталям цвета, соответствующего материалам
5. Черный материал - тем, кто без материала
6. BoM считает плотности деталей и пишет массы. Здесь должна быть функция, считающая массу детали и записывающая ее в свойства детали
'''
doc = App.ActiveDocument
obj = doc.Objects
def partsCheckup(doc):
for obj in
material = doc.addObject('App::Document')
doc.addObject("App::DocumentObjectGroup", "Materials") #создаем папку с материалами
group.addObject(material)
#открываем и выбираем MaterialEditor
import MaterialEditor
MaterialEditor.openEditor()
doc.addObject('App::')
'''
Нам нужно указать материал в обьекте
'''
# Создаем папку "Материалы"
material_group = doc.addObject("App::DocumentObjectGroup", "Materials")
'''
нужно импортировать материалы
самое простое - взять целиком блок fem и работать с этим инструментом
в fem они вставляются тупо строкой
мы можем считать, что материал задан a.k.a json или что-то такое
'''
# Создаем файл материалов fcmat
material_file = "путь_к_файлу.fcmat" # Укажите путь к файлу материалов
# Создаем объект "Материал"
material_obj = doc.addObject("App::MaterialObject", "Материал")
material_obj.Material = material_file
# Получаем список тел в сборке, состоящих из данного материала
part_names = ["Тело1", "Тело2", "Тело3"] # Укажите имена тел
for part_name in part_names:
part_obj = doc.getObject(part_name)
if part_obj:
material_obj.addObject(part_obj)
# Добавляем объект "Материал" в папку "Материалы"
material_group.addObject(material_obj)
# Обновляем вид дерева построения FreeCAD
FreeCADGui.updateGui()

View file

@ -0,0 +1,8 @@
{
"Density": "str" ,
"DiffuseColor": "",
"EmissiveColor",
"amogus"
}

View file

@ -0,0 +1,155 @@
'''
Эта штука создается с целью проводить все необходимые проверки и манипуляции при движении моделей
по пайплайну
Планируемые фичи:
1. Материалы:
1.1 Проверка на уникальность
1.2 Проверка на повторяемость
1.3 Проверки на соответствие материала требованиям
1.4 Изменение цветов деталей по факту назначения материалов
1.5 Расчет массы по плотностям деталей и прописывание ее в свойствах детали
1.6 Указание наименования материала в свойствах детали
2. Вспомогательные обьекты и тела:
2.1. Вспомогательные обьекты имеют отметки о своем статусе
2.2. Несолиды имеют пометку несолидовости
2.3 Детали без материалов должны быть с материалами
3. [на будущее] Проверка существования разметки
4. Дополнение информации в бом-лист (это нужно засунуть в бом, а не сюда)
'''
import FreeCAD as App
import FreeCADGui as Gui
from helper.is_solid import is_object_solid
doc = App.ActiveDocument
#0 Проверка существования директорий
#должны быть директории на материалы, на технологические операции, на вспомогательные обьекты
#если у нас есть директория "анализ" от Fem, то мы переименуем ее в свою директорию и сделаем ей пометку.
#если мы находим материалы в дереве, которые не относятся к этой директории, мы должны засунуть их в нашу директорию
#если материалов нет, мы должны указать, что их нет
def materialExistenceCheck(doc):
# if "Materials" not in doc.Objects:
if doc.getObjectsByLabel('Materials') == 0:
material_group = doc.addObject("App::DocumentObjectGroup", "Materials")
App.Console.PrintMessage("Директория материалов не обнаружена и была создана вновь\n")
else:
material_group = doc.getObject("Materials")
fem_materials = [obj for obj in doc.Objects if (hasattr(obj, 'Proxy') and hasattr(obj.Proxy, 'Type') and obj.Proxy.Type == 'Fem::MaterialCommon')]
if len(fem_materials) > 0:
for material in fem_materials:
material_group.addObject(material)
print('Материалы успешно скомпонованы')
else:
App.Console.PrintMessage("FEM-материалы не заданы. Укажите FEM-материалы и произведите проверку\n")
Gui.updateGui()
return material_group, fem_materials #шоб не пропадало зазря
[material_group, fem_materials ] = materialExistenceCheck(doc) # укомпоновали материалы
#проверим, что материалы правильно описаны:
material_requirements = {'Density', 'DiffuseColor', 'EmissiveColor', 'amogus'}
def material_isCorrect(fem_materials, material_requirements):
femmat_trobles = {}
for femmat in fem_materials:
for req in material_requirements:
if not ( req in femmat.Material and femmat.Material[req]):
if femmat in femmat_trobles:
femmat_trobles[femmat].append(req)
else:
femmat_trobles[femmat] = [req]
print(femmat_trobles)
material_isCorrect(fem_materials, material_requirements)
#1
#1.1 Проверка на уникальность
#присвоим каждому телу имя материала и значение плотности
def matProperties2bodies(doc, fem_materials):
#проходимся по всем материалам и присваиваем деталюхам параметры
#нужно кстати еще цвет им переназначить
for femmat in fem_materials:
body = doc.getObject(femmat.References[0][0].Name).Label #вот эта вот абоба добывает нам тело из перечисления
#в это тело нам надо добавить два свойства
#нужно проверить, есть ли материальные свойства у тела и, если нет, добавить их
#в следующей серии будем проверять все тела, есть ли у них материал
if 'MaterialName' in body.PropertiesList:
if body.getPropertyByName('MaterialName') != femmat.Material['CardName']: #если не совпадает
print('ВНИМАНИЕ! Тело ' + body.Label + ' имеет переназначение материалов. Проверьте и укажите один (1) правильный материал!')
body.setProperty('MaterialName', femmat.Material['CardName']) #пусть перепишется на новый
body.setProperty('Density', femmat.Material['Density']) #плотность
else:
body.addObjectProperty('MaterialName', femmat.Material['CardName']) #добавляем название материала
body.addObjectProperty('Density', femmat.Material['Density']) #добавляем плотность
#считаем массу деталюх
density, unit = parse_values(femmat.Material['Density'])
volume = body.Shape.Volume
body_mass = volume * density
body.addObjectProperty('Mass', body_mass) #масса деталюхи
def bodyWithoutMaterialsCheck(doc):
objs = doc.Objects
for obj in objs:
#проверка на солидовость
if (is_object_solid(obj) and ('MaterialName' not in obj.PropertiesList)):
print('Деталь ' + obj.Label + 'не имеет назначения материала')
matProperties2bodies(doc, fem_materials)
bodyWithoutMaterialsCheck(doc)
#после выполнения предыдущей функции у нас появились деталюхи с обозначениями материалов
#все деталюхи без этой позиции нужно как-то выделить, а
#гпт предлагает парсить значение единиц измерения
с ним соглашусь
def parse_values(value_str):
value = ""
unit = ""
# Проверяем каждый символ в строке плотности
for char in value_str:
if char.isdigit() or char == ".":
# Символ является цифрой или точкой - добавляем его к числу
value += char
else:
# Символ не является цифрой или точкой - считаем его частью единицы измерения
unit += char
# Преобразуем значение плотности в число
density = float(value)
return value, unit