Сделан и подключен генератор PDDL-доменов
This commit is contained in:
parent
8dfbe38878
commit
9eaf12a4fa
13 changed files with 787 additions and 100 deletions
|
@ -12,6 +12,8 @@
|
|||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
from BoMList import run_BoM_list
|
||||
import pddl.freecad2pddl as freecad2pddl
|
||||
from ImportExportEntities import export_coordinate_systems
|
||||
import FreeCAD
|
||||
import Tools
|
||||
from usecases.asm4parser_usecase import Asm4StructureParseUseCase
|
||||
|
@ -300,12 +302,6 @@ def spawnFeatureFrameCreator():
|
|||
ffpanel = FeatureFramePanel()
|
||||
FreeCADGui.Control.showDialog(ffpanel)
|
||||
|
||||
def BoMGeneration(part):
|
||||
|
||||
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython",
|
||||
"FeatureFrame")
|
||||
print(obj)
|
||||
|
||||
|
||||
###################################################################
|
||||
|
@ -327,7 +323,11 @@ Tools.spawnClassCommand("FrameCommand",
|
|||
"MenuText": "Make a free frame",
|
||||
"ToolTip": "Make a freestanding reference frame."})
|
||||
|
||||
|
||||
Tools.spawnClassCommand("ASM4StructureParsing",
|
||||
RobossemblerFreeCadExportScenario().call,
|
||||
{"Pixmap": str(os.path.join(icondir, "assembly4.svg")),
|
||||
"MenuText": "Make a ASM4 parsing",
|
||||
"ToolTip": "Make a ASM4 1"})
|
||||
Tools.spawnClassCommand("SelectedPartFrameCommand",
|
||||
makeSelectedPartFrames,
|
||||
{"Pixmap": str(os.path.join(icondir, "partframe.svg")),
|
||||
|
@ -345,6 +345,45 @@ Tools.spawnClassCommand("FeatureFrameCommand",
|
|||
"MenuText": "frame on selected primitive",
|
||||
"ToolTip": "Create a frame on selected primitive."})
|
||||
|
||||
Tools.spawnClassCommand("PDDL_CreateTypes",
|
||||
freecad2pddl.add_types,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "Types",
|
||||
"ToolTip": "Add Types"})
|
||||
|
||||
Tools.spawnClassCommand("PDDL_CreateParameters",
|
||||
freecad2pddl.add_parameters,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "Parameters",
|
||||
"ToolTip": "Add Parameters"})
|
||||
Tools.spawnClassCommand("PDDL_CreateAction",
|
||||
freecad2pddl.add_action,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "Action",
|
||||
"ToolTip": "Add Action"})
|
||||
Tools.spawnClassCommand("PDDL_CreatePredicate",
|
||||
freecad2pddl.add_predicate,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "Predicate",
|
||||
"ToolTip": "Add Predicate"})
|
||||
Tools.spawnClassCommand("PDDL_CreateDurativeAction",
|
||||
freecad2pddl.add_durative_action,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "DurativeAction",
|
||||
"ToolTip": "Add Durative Action"})
|
||||
Tools.spawnClassCommand("PDDL_ExportPDDL",
|
||||
freecad2pddl.export_to_file,
|
||||
{"Pixmap": str(os.path.join(icondir, "featureframecreator.svg")),
|
||||
"MenuText": "ExportDomain",
|
||||
"ToolTip": "Create and Export Domain.pddl to File"})
|
||||
|
||||
Tools.spawnClassCommand("Export_Entities",
|
||||
export_coordinate_systems,
|
||||
{"Pixmap": str(os.path.join(icondir, "BoMList.svg")),
|
||||
"MenuText": "ExportLCS",
|
||||
"ToolTip": "Export all the markups"})
|
||||
|
||||
|
||||
|
||||
###################################################################
|
||||
# GUI buttons
|
||||
|
|
|
@ -100,6 +100,6 @@ export_coordinate_systems()
|
|||
|
||||
# print("Импорт локальных систем координат завершен.")
|
||||
|
||||
|
||||
# # Пример использования
|
||||
# #import_coordinate_systems()
|
||||
|
||||
|
|
|
@ -46,9 +46,15 @@ class Frames(Workbench):
|
|||
]
|
||||
self.toolcommands = [
|
||||
"ExportPlacementAndPropertiesCommand",
|
||||
"Export_Entities",
|
||||
"ExportGazeboModels",
|
||||
"InsertGraspPose",
|
||||
"ASM4StructureParsing"
|
||||
"ASM4StructureParsing",
|
||||
"PDDL_CreateTypes",
|
||||
"PDDL_CreateParameters",
|
||||
"PDDL_CreateAction",
|
||||
"PDDL_CreatePredicate",
|
||||
"PDDL_CreateDurativeAction"
|
||||
]
|
||||
self.appendToolbar(f"{__class__.__name__} Frames", self.framecommands)
|
||||
self.appendToolbar(f"{__class__.__name__} Tools", self.toolcommands)
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import subprocess
|
||||
# import FreeCAD
|
||||
# import Mesh
|
||||
|
||||
|
||||
import gcoder
|
||||
|
||||
|
||||
# gcode_path = '/home/mark-voltov/Winder/axis.gcode'
|
||||
|
||||
# gcode.main(gcode)
|
||||
|
||||
|
||||
|
||||
file_path = '/home/mark-voltov/Winder/axis.gcode'
|
||||
gcoder_path = '/home/mark-voltov/GitProjects/framework/cg/freecad/Frames/gcoder.py'
|
||||
|
||||
|
||||
with open(file_path, 'r') as file:
|
||||
gcode = file.readlines()
|
||||
|
||||
# print(gcode)
|
||||
|
||||
(gcoder.LightGCode(gcode))
|
||||
cmd = [file_path gcoder_path]
|
||||
subprocess.run(cmd)
|
||||
# subprocess.run( '/home/mark-voltov/Winder/axis.gcode', '/home/mark-voltov/GitProjects/framework/cg/freecad/Frames/gcoder.py')
|
|
@ -1,60 +0,0 @@
|
|||
# import FreeCAD as App
|
||||
|
||||
|
||||
# doc = App.ActiveDocument
|
||||
|
||||
|
||||
#генерируем pddl
|
||||
#импортируем кучу обьектов из дерева построения freecad
|
||||
|
||||
#задаем шаблон на действие
|
||||
|
||||
predicates = ';; Предикаты \n(:predicates \n(at ?c - component ?location - component) \n(printed ?c - component) \n(has-material ?m - material) \n(compatible ?m - material ?c - component))'
|
||||
|
||||
# print(predicates)
|
||||
|
||||
|
||||
predicates =
|
||||
|
||||
|
||||
(" ;; Предикаты \
|
||||
'(:predicates (at ?c - component ?location - component)' \
|
||||
'(printed ?c - component)' \
|
||||
'(printed ?c - component))'
|
||||
|
||||
|
||||
print(predicates)
|
||||
|
||||
# (:predicates
|
||||
# (at ?c - component ?location - component)
|
||||
# (printed ?c - component)
|
||||
# (has-material ?m - material)
|
||||
# (compatible ?m - material ?c - component))''
|
||||
|
||||
|
||||
|
||||
# ;; Предикаты
|
||||
# (:predicates
|
||||
# (at ?c - component ?location - component)
|
||||
# (printed ?c - component)
|
||||
# (has-material ?m - material)
|
||||
# (compatible ?m - material ?c - component))
|
||||
|
||||
# ;; Действия
|
||||
# (:action load-material
|
||||
# :parameters (?m - material ?c - component)
|
||||
# :precondition (and (at ?m ?c) (compatible ?m ?c))
|
||||
# :effect (has-material ?m))
|
||||
|
||||
# (:action unload-material
|
||||
# :parameters (?m - material ?c - component)
|
||||
# :precondition (has-material ?m)
|
||||
# :effect (and (not (has-material ?m)) (at ?m ?c)))
|
||||
|
||||
# (:action print-component
|
||||
# :parameters (?c - component)
|
||||
# :precondition (and (at ?c ?printer) (has-material ?m) (compatible ?m ?c))
|
||||
# :effect (printed ?c))
|
||||
|
||||
# ;; Цель
|
||||
# (:goal (forall (?c - component) (printed ?c))))
|
84
cg/freecad/Frames/materialOperator.py
Normal file
84
cg/freecad/Frames/materialOperator.py
Normal 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()
|
6
cg/freecad/Frames/material_requirements.JSON
Normal file
6
cg/freecad/Frames/material_requirements.JSON
Normal file
|
@ -0,0 +1,6 @@
|
|||
|
||||
|
||||
["Density",
|
||||
"DiffuseColor",
|
||||
"EmissiveColor"
|
||||
]
|
169
cg/freecad/Frames/modelExport.py
Normal file
169
cg/freecad/Frames/modelExport.py
Normal file
|
@ -0,0 +1,169 @@
|
|||
'''
|
||||
Эта штука создается с целью проводить все необходимые проверки и манипуляции при движении моделей
|
||||
по пайплайну
|
||||
|
||||
Планируемые фичи:
|
||||
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
|
||||
import json
|
||||
|
||||
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) # укомпоновали материалы
|
||||
|
||||
|
||||
#проверим, что материалы правильно описаны:
|
||||
# Открываем файл JSON с требованиями и загружаем его содержимое
|
||||
# with open('material_requirements.json', 'r') as f:
|
||||
# material_requirements = json.load(f)
|
||||
material_requirements = ["Density",
|
||||
"DiffuseColor",
|
||||
"EmissiveColor"
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
#todo:
|
||||
# сделать проверку на солидовые тела
|
||||
#укомпоновать все вспомогательные обьекты в отдельную штуку
|
||||
#wip
|
||||
|
||||
#подготавливаем действия и состояния для PDDL
|
||||
#
|
69
cg/freecad/Frames/my_problem.pddl
Normal file
69
cg/freecad/Frames/my_problem.pddl
Normal file
|
@ -0,0 +1,69 @@
|
|||
(define (problem my_problem)
|
||||
(:domain roboarm)
|
||||
(:objects
|
||||
ur_manipulator_gripper - arm
|
||||
printer - printer
|
||||
world - zone
|
||||
box1 box2 box3 box4 box5 box6 - part
|
||||
asm0 asm1 asm2 asm3 asm4 asm5 asm6 - assembly
|
||||
)
|
||||
|
||||
(:init
|
||||
not(part_at box1 world)
|
||||
not(part_at box2 world)
|
||||
not(part_at box3 world)
|
||||
not(part_at box4 world)
|
||||
not(part_at box5 world)
|
||||
not(part_at box6 world)
|
||||
(part_of box1 asm1)
|
||||
(part_of box2 asm2)
|
||||
(part_of box3 asm3)
|
||||
(part_of box4 asm4)
|
||||
(part_of box5 asm5)
|
||||
(part_of box6 asm6)
|
||||
(assembly_order asm0 asm1)
|
||||
(assembly_order asm1 asm2)
|
||||
(assembly_order asm2 asm3)
|
||||
(assembly_order asm3 asm4)
|
||||
(assembly_order asm4 asm5)
|
||||
(assembly_order asm5 asm6)
|
||||
|
||||
(printer_available printer)
|
||||
(arm_available ur_manipulator_gripper)
|
||||
(assembly_at asm0 world)
|
||||
(assembled asm0)
|
||||
)
|
||||
|
||||
(:goal (and
|
||||
(assembled asm6)
|
||||
))
|
||||
)
|
||||
|
||||
; нужно указать желаемое конечное состояние
|
||||
; (эффект в конце действия)
|
||||
; в нашем случае, допустим, будет asm6
|
||||
; чтобы включить принтер в процесс, у нас должны спавниться детали
|
||||
|
||||
; будет что-то типа (not part_at box1 workzone)
|
||||
|
||||
; и action print
|
||||
; начальные условия: not part_at box workzone
|
||||
; принтер доступен
|
||||
; в ходе дела парт печатается, принтер не доступен
|
||||
; в конце - принтер доступен, деталь в зоне
|
||||
|
||||
; нужно в генераторе добавить поддержку условий at start и at end
|
||||
; но пока что это можно прописать текстом
|
||||
|
||||
|
||||
; предикаты -
|
||||
; рука доступна - рука
|
||||
; сборка в зоне - сборка зона
|
||||
; деталь часть сборки - деталь сборка
|
||||
; собрана - сборка
|
||||
; сборочный порядок - предсборка следсборка
|
||||
|
||||
; +
|
||||
; деталь в зоне - деталь зона
|
||||
; принтер доступен - принтер
|
||||
|
BIN
cg/freecad/Frames/pddl/Printer.FCStd
Normal file
BIN
cg/freecad/Frames/pddl/Printer.FCStd
Normal file
Binary file not shown.
97
cg/freecad/Frames/pddl/domain.pddl
Normal file
97
cg/freecad/Frames/pddl/domain.pddl
Normal file
|
@ -0,0 +1,97 @@
|
|||
(define (domain Printer)
|
||||
|
||||
(:requirements :strips :typing :fluents :durative-actions)
|
||||
(:types
|
||||
printer workspace - zone
|
||||
part
|
||||
arm
|
||||
assembly
|
||||
human
|
||||
filament
|
||||
)
|
||||
(:predicates
|
||||
(arm_available ?a - arm)
|
||||
(part_at ?p - part ?z - zone)
|
||||
(printer_ready ?p - printer)
|
||||
(printer_checked ?p - printer)
|
||||
(printer_at_work ?p - printer)
|
||||
(part_of ?part - part ?whole - assembly)
|
||||
(assembly_order ?prev ?next - assembly)
|
||||
(assembled ?whole - assembly ?z - zone)
|
||||
(observer_free ?h - human)
|
||||
(filament_at ?f - filament ?z - zone)
|
||||
)
|
||||
(:functions
|
||||
)
|
||||
(:durative-action print
|
||||
:parameters ( ?p - part ?pr - printer )
|
||||
:duration ( = ?duration 20)
|
||||
:condition (and
|
||||
(at start(printer_ready ?pr))
|
||||
)
|
||||
:effect (and
|
||||
(at start (not (printer_ready ?pr)))
|
||||
(at start (printer_at_work ?pr ))
|
||||
(at end(part_at ?p ?pr))
|
||||
(at end (not (printer_at_work ?pr )))
|
||||
)
|
||||
)
|
||||
(:durative-action remove
|
||||
:parameters ( ?p - part ?pr - printer ?z - zone ?a - arm )
|
||||
:duration ( = ?duration 1)
|
||||
:condition (and
|
||||
(at start (part_at ?p ?pr))
|
||||
(at start (arm_available ?a))
|
||||
)
|
||||
:effect (and
|
||||
(at start (not (arm_available ?a)))
|
||||
(at end (part_at ?p ?z))
|
||||
(at end (arm_available ?a))
|
||||
(at end (printer_ready ?pr))
|
||||
)
|
||||
)
|
||||
(:durative-action assemble
|
||||
:parameters ( ?p - part ?prev ?next - assembly ?z - zone ?arm - arm ?w - workspace )
|
||||
:duration ( = ?duration 5)
|
||||
:condition (and
|
||||
(at start (assembled ?prev ?w))
|
||||
(at start (part_at ?p ?w))
|
||||
(at start (part_of ?p ?next))
|
||||
(at start (arm_available ?arm))
|
||||
(at start (assembly_order ?prev ?next))
|
||||
)
|
||||
:effect (and
|
||||
(at start (not (arm_available ?arm)))
|
||||
(at end (not (part_at ?p ?w)))
|
||||
(at end (arm_available ?arm))
|
||||
(at end (assembled ?next ?w))
|
||||
)
|
||||
)
|
||||
(:durative-action printer_check
|
||||
:parameters ( ?p - printer ?h - human )
|
||||
:duration ( = ?duration 1)
|
||||
:condition (and
|
||||
(at start ( observer_free ?h ))
|
||||
)
|
||||
:effect (and
|
||||
(at start (not (observer_free ?h)))
|
||||
(at end (observer_free ?h))
|
||||
(at end (printer_checked ?p))
|
||||
)
|
||||
)
|
||||
(:durative-action printer_filament_load
|
||||
:parameters ( ?p - printer ?h - human ?f - filament ?z - zone )
|
||||
:duration ( = ?duration 5)
|
||||
:condition (and
|
||||
(at start (printer_checked ?p))
|
||||
(at start (observer_free ?h))
|
||||
(at start (filament_at ?f ?z))
|
||||
)
|
||||
:effect (and
|
||||
(at start (not(observer_free ?h)))
|
||||
(at end (observer_free ?h))
|
||||
(at end (printer_ready ?p))
|
||||
(at end (not (filament_at ?f ?z)))
|
||||
)
|
||||
)
|
||||
)
|
181
cg/freecad/Frames/pddl/freecad2pddl.py
Normal file
181
cg/freecad/Frames/pddl/freecad2pddl.py
Normal file
|
@ -0,0 +1,181 @@
|
|||
import FreeCAD as App
|
||||
import FreeCADGui as Gui
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#функции для создания обьектов PDDL
|
||||
|
||||
def add_types():
|
||||
doc = App.ActiveDocument
|
||||
types = doc.addObject('App::FeaturePython', 'Types')
|
||||
types.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
|
||||
types.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Types'
|
||||
types.addProperty("App::PropertyStringList", 'Types', 'PDDL')
|
||||
|
||||
print('Types of objects added successfully')
|
||||
return(types)
|
||||
#слишком много types
|
||||
|
||||
def add_parameters():
|
||||
doc = App.ActiveDocument
|
||||
params = doc.addObject('App::FeaturePython', 'Parameters')
|
||||
params.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
|
||||
params.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Parameters'
|
||||
params.addProperty('App::PropertyPythonObject', 'Parameters','PDDl')
|
||||
|
||||
print('Domain parameters added successfully')
|
||||
return(params)
|
||||
|
||||
def add_action():
|
||||
doc = App.ActiveDocument
|
||||
|
||||
name = input('Название действия:')
|
||||
action = doc.addObject('App::FeaturePython', str(name))
|
||||
action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
|
||||
action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Action'
|
||||
action.addProperty("App::PropertyStringList", 'Parameters', 'PDDL')
|
||||
action.addProperty("App::PropertyStringList", 'Conditions', 'PDDL')
|
||||
action.addProperty("App::PropertyStringList", 'Effects', 'PDDL')
|
||||
sortEntity(action)
|
||||
print('Action ' + name + 'added successfully')
|
||||
return(action)
|
||||
|
||||
|
||||
def add_predicate():
|
||||
doc = App.ActiveDocument
|
||||
|
||||
name = input('Название предиката:')
|
||||
parms = input('Переменные')
|
||||
predicate = doc.addObject('App::FeaturePython', str(name))
|
||||
predicate.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
|
||||
predicate.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Predicate'
|
||||
# predicate.addProperty("App::PropertyStringList", 'Name', 'PDDL')
|
||||
predicate.addProperty("App::PropertyStringList", 'Parameters', 'PDDL').Parameters = parms
|
||||
sortEntity(predicate)
|
||||
print('Predicate ' + name + 'added successfully')
|
||||
return(predicate)
|
||||
|
||||
|
||||
def add_durative_action():
|
||||
doc = App.ActiveDocument
|
||||
name = input('Название действия:')
|
||||
action = doc.addObject('App::FeaturePython', str(name))
|
||||
action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
|
||||
action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'DurativeAction'
|
||||
action.addProperty("App::PropertyStringList", 'Parameters', 'PDDL')
|
||||
action.addProperty("App::PropertyStringList", 'Conditions', 'PDDL')
|
||||
action.addProperty("App::PropertyStringList", 'Effects', 'PDDL')
|
||||
action.addProperty('App::PropertyString', 'Duration', 'PDDL')
|
||||
sortEntity(action)
|
||||
print('Durative Action ' + name + ' added successfully')
|
||||
return(action)
|
||||
|
||||
|
||||
|
||||
|
||||
def export_to_file():
|
||||
filename = App.ActiveDocument.Name
|
||||
file_path = App.ActiveDocument.FileName.rsplit("/", 1)[0] + filename + '_domain.pddl'
|
||||
|
||||
doc = App.ActiveDocument
|
||||
objs = doc.Objects
|
||||
with open(file_path, 'w') as f:
|
||||
f.write('(define (domain '+ filename +')\n \n')
|
||||
f.write('(:requirements :strips :typing :fluents :durative-actions)\n')
|
||||
|
||||
# Типы обьектов
|
||||
types = doc.getObjectsByLabel('Types')[0]
|
||||
f.write('(:types \n')
|
||||
|
||||
for obj_type in types.Types:
|
||||
f.write(' ' + obj_type + ' \n')
|
||||
f.write(')\n')
|
||||
|
||||
# предикаты
|
||||
f.write(' (:predicates\n')
|
||||
for obj in objs:
|
||||
if hasattr(obj, 'PDDL') and hasattr(obj, 'Type') and obj.Type == 'Predicate':
|
||||
f.write(' ('+ obj.Label)
|
||||
for params in obj.Parameters:
|
||||
f.write(' ' + params)
|
||||
f.write(')\n')
|
||||
f.write(' )\n')
|
||||
|
||||
# функции
|
||||
f.write(' (:functions\n')
|
||||
f.write(' )\n')
|
||||
|
||||
#действия:
|
||||
for obj in objs:
|
||||
if hasattr(obj, 'PDDL') and hasattr(obj, 'Type') and obj.Type == 'Action':
|
||||
f.write('(:action ' + obj.Label + '\n')
|
||||
f.write(' :parameters (')
|
||||
for params in obj.Parameters:
|
||||
f.write('' + params + ' ')
|
||||
f.write(')\n')
|
||||
f.write(' :condition (and \n')
|
||||
|
||||
for condition in obj.Conditions:
|
||||
f.write(' (' + condition + ') \n')
|
||||
|
||||
f.write(' )\n')
|
||||
|
||||
f.write(' :effect (and \n')
|
||||
|
||||
for effect in obj.Effects:
|
||||
f.write(' (' + effect + ') \n')
|
||||
# f.write(' ')
|
||||
f.write(')\n')
|
||||
|
||||
f.write(' )\n')
|
||||
|
||||
# длительные действия:
|
||||
for obj in objs:
|
||||
if hasattr(obj, 'PDDL') and hasattr(obj, 'Type') and obj.Type == 'DurativeAction':
|
||||
f.write('(:durative-action ' + obj.Label + '\n')
|
||||
f.write(' :parameters (')
|
||||
for params in obj.Parameters:
|
||||
f.write(' ' + params )
|
||||
f.write(' )\n')
|
||||
f.write(' :duration ( = ?duration '+ str(obj.Duration) +')\n')
|
||||
f.write(' :condition (and \n')
|
||||
|
||||
for condition in obj.Conditions:
|
||||
f.write(' (' + condition + ') \n')
|
||||
# f.write(') ')
|
||||
# f.write(')\n')
|
||||
f.write(' )\n')
|
||||
|
||||
f.write(' :effect (and \n')
|
||||
|
||||
for effect in obj.Effects:
|
||||
f.write(' (' + effect + ') \n')
|
||||
# f.write(' ')
|
||||
f.write(')\n')
|
||||
|
||||
f.write(' )\n')
|
||||
|
||||
|
||||
|
||||
f.write(' )\n')
|
||||
|
||||
|
||||
|
||||
def sortEntity(object):
|
||||
doc = App.ActiveDocument
|
||||
|
||||
|
||||
if len(doc.getObjectsByLabel(object.Type)) == 0:
|
||||
pddl_group = doc.addObject("App::DocumentObjectGroup", object.Type)
|
||||
else:
|
||||
pddl_group = doc.getObjectsByLabel(object.Type)[0]
|
||||
pddl_group.addObject(object)
|
||||
|
||||
|
||||
|
||||
Gui.updateGui()
|
||||
|
||||
|
||||
|
127
cg/freecad/Frames/pddl/problem.pddl
Normal file
127
cg/freecad/Frames/pddl/problem.pddl
Normal file
|
@ -0,0 +1,127 @@
|
|||
(define (problem p1)
|
||||
(:domain robossembler)
|
||||
(:objects
|
||||
;; information from Scene
|
||||
rasmt - arm
|
||||
printer1 printer2 printer3 - printer
|
||||
workspace1 - workspace
|
||||
worker - human
|
||||
filament1 filament2 filament3 - filament
|
||||
;; information from CAD
|
||||
pad009003002002 pad009003002003 pad009003002005 pad009003002011 fusion004003 o_2_a001 o_2_m001 o_3_m001 o_3_a001 pad009003002008 fusion005 o_4_m001 o_5_m001 o_5_a001 o_4_a001 fusion006 r_a001 r_m001 r_l001 synfix synfix001 fusion fusion001 synfix002 fusion002 synfix003 fusion007 pad009003002012 pad001 pocket pad002 fusion008 fusion009 bearing_dgsr_6006_001 bearing_dgsr_6006_002 bearing_dgsr_6006_003 bearing_dgsr_6005_ bearing_dgsr_6005_001 bearing_dgsr_6005_002 bearing_dgsr_6005_003 bearing_dgsr_6005_004 pad003 pocket001 - part
|
||||
subasm00 subasm0 subasm1 subasm2 subasm3 subasm4 subasm5 subasm6 subasm7 subasm8 subasm9 subasm10 subasm11 subasm12 subasm13 subasm14 subasm15 subasm16 subasm17 subasm18 subasm19 subasm20 subasm21 subasm22 subasm23 subasm24 subasm25 subasm26 subasm27 subasm28 subasm29 subasm30 subasm31 subasm32 subasm33 subasm34 subasm35 subasm36 subasm37 subasm38 subasm39 subasm40 subasm41 subasm42 - assembly
|
||||
)
|
||||
(:init
|
||||
;; information from Scene
|
||||
|
||||
(observer_free worker)
|
||||
; (not(printer_ready printer1))
|
||||
|
||||
; (printer_ready printer2)
|
||||
; (printer_ready printer3)
|
||||
(filament_at filament1 workspace1)
|
||||
(filament_at filament2 workspace1)
|
||||
(filament_at filament3 workspace1)
|
||||
|
||||
|
||||
(arm_available rasmt)
|
||||
;; information from CAD
|
||||
(assembled subasm00 workspace1)
|
||||
|
||||
|
||||
|
||||
|
||||
(part_of pad009003002002 subasm0)
|
||||
(part_of pad009003002003 subasm1)
|
||||
(part_of pad009003002005 subasm2)
|
||||
(part_of pad009003002011 subasm3)
|
||||
(part_of fusion004003 subasm4)
|
||||
(part_of o_2_a001 subasm5)
|
||||
(part_of o_2_m001 subasm6)
|
||||
(part_of o_3_m001 subasm7)
|
||||
(part_of o_3_a001 subasm8)
|
||||
(part_of pad009003002008 subasm9)
|
||||
(part_of fusion005 subasm10)
|
||||
(part_of o_4_m001 subasm11)
|
||||
(part_of o_5_m001 subasm12)
|
||||
(part_of o_5_a001 subasm13)
|
||||
(part_of o_4_a001 subasm14)
|
||||
(part_of fusion006 subasm15)
|
||||
(part_of r_a001 subasm16)
|
||||
(part_of r_m001 subasm17)
|
||||
(part_of r_l001 subasm18)
|
||||
(part_of synfix subasm19)
|
||||
(part_of synfix001 subasm20)
|
||||
(part_of fusion subasm21)
|
||||
(part_of fusion001 subasm22)
|
||||
(part_of synfix002 subasm23)
|
||||
(part_of fusion002 subasm24)
|
||||
(part_of synfix003 subasm25)
|
||||
(part_of fusion007 subasm26)
|
||||
(part_of pad009003002012 subasm27)
|
||||
(part_of pad001 subasm28)
|
||||
(part_of pocket subasm29)
|
||||
(part_of pad002 subasm30)
|
||||
(part_of fusion008 subasm31)
|
||||
(part_of fusion009 subasm32)
|
||||
(part_of bearing_dgsr_6006_001 subasm33)
|
||||
(part_of bearing_dgsr_6006_002 subasm34)
|
||||
(part_of bearing_dgsr_6006_003 subasm35)
|
||||
(part_of bearing_dgsr_6005_ subasm36)
|
||||
(part_of bearing_dgsr_6005_001 subasm37)
|
||||
(part_of bearing_dgsr_6005_002 subasm38)
|
||||
(part_of bearing_dgsr_6005_003 subasm39)
|
||||
(part_of bearing_dgsr_6005_004 subasm40)
|
||||
(part_of pad003 subasm41)
|
||||
(part_of pocket001 subasm42)
|
||||
|
||||
(assembly_order subasm00 subasm0)
|
||||
(assembly_order subasm0 subasm1)
|
||||
(assembly_order subasm1 subasm2)
|
||||
(assembly_order subasm2 subasm3)
|
||||
(assembly_order subasm3 subasm4)
|
||||
(assembly_order subasm4 subasm5)
|
||||
(assembly_order subasm5 subasm6)
|
||||
(assembly_order subasm6 subasm7)
|
||||
(assembly_order subasm7 subasm8)
|
||||
(assembly_order subasm8 subasm9)
|
||||
(assembly_order subasm9 subasm10)
|
||||
(assembly_order subasm10 subasm11)
|
||||
(assembly_order subasm11 subasm12)
|
||||
(assembly_order subasm12 subasm13)
|
||||
(assembly_order subasm13 subasm14)
|
||||
(assembly_order subasm14 subasm15)
|
||||
(assembly_order subasm15 subasm16)
|
||||
(assembly_order subasm16 subasm17)
|
||||
(assembly_order subasm17 subasm18)
|
||||
(assembly_order subasm18 subasm19)
|
||||
(assembly_order subasm19 subasm20)
|
||||
(assembly_order subasm20 subasm21)
|
||||
(assembly_order subasm21 subasm22)
|
||||
(assembly_order subasm22 subasm23)
|
||||
(assembly_order subasm23 subasm24)
|
||||
(assembly_order subasm24 subasm25)
|
||||
(assembly_order subasm25 subasm26)
|
||||
(assembly_order subasm26 subasm27)
|
||||
(assembly_order subasm27 subasm28)
|
||||
(assembly_order subasm28 subasm29)
|
||||
(assembly_order subasm29 subasm30)
|
||||
(assembly_order subasm30 subasm31)
|
||||
(assembly_order subasm31 subasm32)
|
||||
(assembly_order subasm32 subasm33)
|
||||
(assembly_order subasm33 subasm34)
|
||||
(assembly_order subasm34 subasm35)
|
||||
(assembly_order subasm35 subasm36)
|
||||
(assembly_order subasm36 subasm37)
|
||||
(assembly_order subasm37 subasm38)
|
||||
(assembly_order subasm38 subasm39)
|
||||
(assembly_order subasm39 subasm40)
|
||||
(assembly_order subasm40 subasm41)
|
||||
(assembly_order subasm41 subasm42)
|
||||
)
|
||||
(:goal (and
|
||||
;; information from CAD
|
||||
(assembled subasm42 workspace1)
|
||||
)
|
||||
)
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue