Модуль генерации PDDL подключен к верстаку

This commit is contained in:
Mark Voltov 2023-07-04 21:17:06 +03:00
parent 19b8eeb441
commit 8971bb13df
7 changed files with 324 additions and 308 deletions

View file

@ -108,83 +108,80 @@ def run_BoM_list():
sortedParts = uniquePartsSort(labelParts) sortedParts = uniquePartsSort(labelParts)
countedParts = countForUniques(sortedParts) countedParts = countForUniques(sortedParts)
fillInBoMList(sheet, countedParts) fillInBoMList(sheet, countedParts)
<<<<<<< HEAD
def printETACounter(partLabel): # def printETACounter(partLabel):
import os # import os
import requests # import requests
import time # import time
import FreeCAD # import FreeCAD
from FreeCAD import Base # from FreeCAD import Base
def export_to_stl(doc, filename): # def export_to_stl(doc, filename):
mesh = doc.getObjectsByType("Mesh")[0] # mesh = doc.getObjectsByType("Mesh")[0]
mesh.exportStl(filename) # mesh.exportStl(filename)
def upload_to_octoprint(file_path, api_key, octoprint_url): # def upload_to_octoprint(file_path, api_key, octoprint_url):
headers = { # headers = {
"X-Api-Key": api_key # "X-Api-Key": api_key
} # }
files = { # files = {
"file": open(file_path, "rb") # "file": open(file_path, "rb")
} # }
response = requests.post(octoprint_url + "/api/files/local", headers=headers, files=files) # response = requests.post(octoprint_url + "/api/files/local", headers=headers, files=files)
if response.status_code == 201: # if response.status_code == 201:
print("Файл успешно загружен в OctoPrint.") # print("Файл успешно загружен в OctoPrint.")
return response.json()["name"] # return response.json()["name"]
else: # else:
print("Ошибка при загрузке файла в OctoPrint:", response.text) # print("Ошибка при загрузке файла в OctoPrint:", response.text)
return None # return None
def get_print_duration(file_name, api_key, octoprint_url): # def get_print_duration(file_name, api_key, octoprint_url):
headers = { # headers = {
"X-Api-Key": api_key # "X-Api-Key": api_key
} # }
response = requests.get(octoprint_url + "/api/files/local/" + file_name, headers=headers) # response = requests.get(octoprint_url + "/api/files/local/" + file_name, headers=headers)
if response.status_code == 200: # if response.status_code == 200:
return response.json()["gcodeAnalysis"]["estimatedPrintTime"] # return response.json()["gcodeAnalysis"]["estimatedPrintTime"]
else: # else:
print("Ошибка при получении информации о файле из OctoPrint:", response.text) # print("Ошибка при получении информации о файле из OctoPrint:", response.text)
return None # return None
# Путь к документу FreeCAD # # Путь к документу FreeCAD
doc_path = "/path/to/your/file.FCStd" # doc_path = "/path/to/your/file.FCStd"
# Путь для сохранения STL-файла # # Путь для сохранения STL-файла
stl_path = "/path/to/your/output.stl" # stl_path = "/path/to/your/output.stl"
# Настройки OctoPrint # # Настройки OctoPrint
octoprint_api_key = "your_octoprint_api_key" # octoprint_api_key = "your_octoprint_api_key"
octoprint_url = "http://localhost:5000" # octoprint_url = "http://localhost:5000"
# Открываем документ FreeCAD # # Открываем документ FreeCAD
doc = FreeCAD.open(doc_path) # doc = FreeCAD.open(doc_path)
# Экспортируем модель в STL-файл # # Экспортируем модель в STL-файл
export_to_stl(doc, stl_path) # export_to_stl(doc, stl_path)
print("STL-файл успешно создан.") # print("STL-файл успешно создан.")
# Загружаем STL-файл в OctoPrint # # Загружаем STL-файл в OctoPrint
uploaded_file_name = upload_to_octoprint(stl_path, octoprint_api_key, octoprint_url) # uploaded_file_name = upload_to_octoprint(stl_path, octoprint_api_key, octoprint_url)
if uploaded_file_name is not None: # if uploaded_file_name is not None:
# Получаем информацию о длительности печати # # Получаем информацию о длительности печати
print_duration = get_print_duration(uploaded_file_name, octoprint_api_key, octoprint_url) # print_duration = get_print_duration(uploaded_file_name, octoprint_api_key, octoprint_url)
if print_duration is not None: # if print_duration is not None:
print("Оценочная длительность печати: {} секунд.".format(print_duration)) # print("Оценочная длительность печати: {} секунд.".format(print_duration))
else: # else:
print("Не удалось получить информацию о длительности печати.") # print("Не удалось получить информацию о длительности печати.")
else: # else:
print("Загрузка файла в OctoPrint не удалась.") # print("Загрузка файла в OctoPrint не удалась.")
# Закрываем документ FreeCAD # # Закрываем документ FreeCAD
FreeCAD.closeDocument(doc) # FreeCAD.closeDocument(doc)
=======
>>>>>>> 839ce36c70e0a48d82c32c5b6fe17c5634c8ee07

View file

@ -12,6 +12,7 @@
# You should have received a copy of the GNU Lesser General Public # 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/>. # License along with this library. If not, see <http://www.gnu.org/licenses/>.
from BoMList import run_BoM_list from BoMList import run_BoM_list
import pddl.freecad2pddl as freecad2pddl
import FreeCAD import FreeCAD
import Tools import Tools
from usecases.asm4parser_usecase import Asm4StructureParseUseCase from usecases.asm4parser_usecase import Asm4StructureParseUseCase
@ -345,6 +346,38 @@ Tools.spawnClassCommand("FeatureFrameCommand",
"MenuText": "frame on selected primitive", "MenuText": "frame on selected primitive",
"ToolTip": "Create a 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"})
################################################################### ###################################################################
# GUI buttons # GUI buttons

View file

@ -48,7 +48,12 @@ class Frames(Workbench):
"ExportPlacementAndPropertiesCommand", "ExportPlacementAndPropertiesCommand",
"ExportGazeboModels", "ExportGazeboModels",
"InsertGraspPose", "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__} Frames", self.framecommands)
self.appendToolbar(f"{__class__.__name__} Tools", self.toolcommands) self.appendToolbar(f"{__class__.__name__} Tools", self.toolcommands)

Binary file not shown.

Binary file not shown.

View file

@ -2,37 +2,36 @@ import FreeCAD as App
import FreeCADGui as Gui import FreeCADGui as Gui
doc = App.ActiveDocument
#функции для создания обьектов PDDL #функции для создания обьектов PDDL
def add_types(): def add_types():
doc = App.ActiveDocument
types = doc.addObject('App::FeaturePython', 'Types') types = doc.addObject('App::FeaturePython', 'Types')
types.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL' types.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
types.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Types' types.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Types'
types.addProperty("App::PropertyStringList", 'Types', 'PDDL') types.addProperty("App::PropertyStringList", 'Types', 'PDDL')
# sortEntity(types)
print('Types of objects added successfully') print('Types of objects added successfully')
return(types) return(types)
#слишком много types #слишком много types
def add_parameters(): def add_parameters():
doc = App.ActiveDocument
params = doc.addObject('App::FeaturePython', 'Parameters') params = doc.addObject('App::FeaturePython', 'Parameters')
params.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL' params.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
params.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Parameters' params.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Parameters'
params.addProperty('App::PropertyPythonObject', 'Parameters','PDDl') params.addProperty('App::PropertyPythonObject', 'Parameters','PDDl')
# sortEntity(params)
print('Domain parameters added successfully') print('Domain parameters added successfully')
return(params) return(params)
def add_action(name): def add_action():
doc = App.ActiveDocument
#создаем обьект по шаблону, потом заполним ее вручную
# name = input('Название действия:')
# name = input('Название действия:')
action = doc.addObject('App::FeaturePython', str(name)) action = doc.addObject('App::FeaturePython', str(name))
action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL' action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Action' action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Action'
@ -44,11 +43,11 @@ def add_action(name):
return(action) return(action)
def add_predicate(name, parms): def add_predicate():
#вероятно, нужно создавать предикаты отдельно и функции отдельно doc = App.ActiveDocument
#ссылаться на них ссылками внутри обьектов
#нужно название предиката и вовлеченные в него сущности name = input('Название предиката:')
# name = input('Название предиката:') parms = input('Переменные')
predicate = doc.addObject('App::FeaturePython', str(name)) predicate = doc.addObject('App::FeaturePython', str(name))
predicate.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL' predicate.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
predicate.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Predicate' predicate.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Predicate'
@ -59,9 +58,9 @@ def add_predicate(name, parms):
return(predicate) return(predicate)
def add_durative_action(name): def add_durative_action():
doc = App.ActiveDocument
# name = input('Название действия:') name = input('Название действия:')
action = doc.addObject('App::FeaturePython', str(name)) action = doc.addObject('App::FeaturePython', str(name))
action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL' action.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'DurativeAction' action.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'DurativeAction'
@ -74,110 +73,99 @@ def add_durative_action(name):
return(action) return(action)
#цель задается не здесь, а в problem
# def add_goal(name):
# # name = input('Название цели:')
# goal = doc.addObject('App::FeaturePython', str(name))
# goal.addProperty("App::PropertyString", 'PDDL', 'PDDL').PDDL = 'PDDL'
# goal.addProperty("App::PropertyString", 'Type', 'PDDL').Type = 'Goal'
# goal.addProperty("App::PropertyStringList", 'Conditions', 'PDDL')
#сюда нужно поставить нормальную относительную ссылку def export_to_file():
#лучше вообще сохранять это туда, где лежит директория с файлом freecad filename = App.ActiveDocument.Name
file_path = App.ActiveDocument.FileName.rsplit("/", 1)[0] + filename + '_domain.pddl'
def export_to_file(file_path): doc = App.ActiveDocument
objs = doc.Objects objs = doc.Objects
with open(file_path, 'w') as f: with open(file_path, 'w') as f:
f.write('(define (domain '+ filename +')\n \n') f.write('(define (domain '+ filename +')\n \n')
f.write('(:requirements :strips :typing :fluents :durative-actions)\n') f.write('(:requirements :strips :typing :fluents :durative-actions)\n')
# Типы обьектов # Типы обьектов
types = doc.getObjectsByLabel('Types')[0] types = doc.getObjectsByLabel('Types')[0]
f.write('(:types \n') f.write('(:types \n')
for obj_type in types.Types: for obj_type in types.Types:
f.write(' ' + obj_type + ' \n') f.write(' ' + obj_type + ' \n')
f.write(')\n') f.write(')\n')
# предикаты # предикаты
f.write(' (:predicates\n') f.write(' (:predicates\n')
for obj in objs: for obj in objs:
if hasattr(obj, 'PDDL') and hasattr(obj, 'Type') and obj.Type == 'Predicate': if hasattr(obj, 'PDDL') and hasattr(obj, 'Type') and obj.Type == 'Predicate':
f.write(' ('+ obj.Label) f.write(' ('+ obj.Label)
for params in obj.Parameters: for params in obj.Parameters:
f.write(' ' + params) f.write(' ' + params)
f.write(')\n') f.write(')\n')
f.write(' )\n') f.write(' )\n')
# функции # функции
f.write(' (:functions\n') f.write(' (:functions\n')
f.write(' )\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(') ')
# 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')
# длительные действия:
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')
#действия:
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') f.write(' )\n')
# def set_parameters()
def sortEntity(object): 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.addObject("App::DocumentObjectGroup", object.Type)
if len(doc.getObjectsByLabel(object.Type)) == 0: if len(doc.getObjectsByLabel(object.Type)) == 0:
pddl_group = doc.addObject("App::DocumentObjectGroup", object.Type) pddl_group = doc.addObject("App::DocumentObjectGroup", object.Type)
@ -190,137 +178,3 @@ def sortEntity(object):
#сделаем задание обьектов прямо здесь
filename = doc.Name
file_path = '/home/mark-voltov/GitProjects/framework/cg/freecad/Frames/pddl/'+ str(filename) + '_domain.pddl'
obj = add_types()
obj.Types = ['printer workspace - zone',
'part',
'arm' ,
'assembly',
'human',
'filament']
obj = add_parameters()
obj.Parameters = {
'arm':['?a'],
'zone':['?z'],
'part':['?part'],
'assembly': ['?whole', '?prev', '?next'],
'human':['?h'],
'filament': ['?f']
}
#list_of_predicates
#temp
add_predicate('arm_available', '?a - arm' )
add_predicate('part_at', '?p - part ?z - zone' )
add_predicate('printer_ready', '?p - printer' )
add_predicate('printer_checked', '?p - printer' )
add_predicate('printer_at_work', '?p - printer' )
add_predicate('part_of', '?part - part ?whole - assembly' )
add_predicate('assembly_order', '?prev ?next - assembly' )
add_predicate('assembled', '?whole - assembly ?z - zone' )
add_predicate('observer_free', '?h - human' )
add_predicate('filament_at', '?f - filament ?z - zone' )
# doc.getObject(name).Parameters = '?a - arm'
obj = add_durative_action('print')
obj.Parameters = ['?p - part', '?pr - printer']
obj.Duration = '20'
obj.Conditions = ['at start(printer_ready ?pr)'] #должно быть at start и at end, todo
obj.Effects = ['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 ))']
obj = add_durative_action('remove')
obj.Parameters = ['?p - part',
'?pr - printer',
'?z - zone',
'?a - arm'
]
obj.Duration = '1'
obj.Conditions = ['at start (part_at ?p ?pr)',
'at start (arm_available ?a)']
obj.Effects = ['at start (not (arm_available ?a))',
'at end (part_at ?p ?z)',
'at end (arm_available ?a)',
'at end (printer_ready ?pr)']
obj = add_durative_action('assemble')
obj.Parameters = ['?p - part',
'?prev ?next - assembly',
'?z - zone',
'?arm - arm',
'?w - workspace'
]
obj.Duration = '5'
obj.Conditions = ['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)']
obj.Effects = ['at start (not (arm_available ?arm))',
'at end (not (part_at ?p ?w))',
'at end (arm_available ?arm)',
'at end (assembled ?next ?w)']
obj = add_durative_action('printer_check')
obj.Parameters = ['?p - printer',
'?h - human'
]
obj.Duration = '1'
obj.Conditions = ['at start ( observer_free ?h )']
obj.Effects = ['at start (not (observer_free ?h))',
'at end (observer_free ?h)',
'at end (printer_checked ?p)']
obj = add_durative_action('printer_filament_load')
obj.Parameters = ['?p - printer',
'?h - human',
'?f - filament',
'?z - zone'
]
obj.Duration = '5'
obj.Conditions = ['at start (printer_checked ?p)',
'at start (observer_free ?h)',
'at start (filament_at ?f ?z)'
# 'at start (not (printer_at_work ?p))'
]
obj.Effects = ['at start (not(observer_free ?h))',
'at end (observer_free ?h)',
'at end (printer_ready ?p)',
'at end (not (filament_at ?f ?z))']
# add_action('assemble')
# obj = doc.getObject('assemble')
# obj.Parameters = ['?r - roboarm' ,'?w - workspace', '?a - assembly']
# obj.Conditions = ['not(roboarm_free ?r)', 'not(roboarm_available ?r)']
# obj.Effects = ['roboarm_free ?r', 'roboarm_available ?r', 'assembled ?a']
# add_predicate()
# obj = doc.getObject('Predicates')
# obj.Name = ['roboarm_free', 'roboarm_available', 'assembled']
# obj.Parameters = ['?r - roboarm', '?w - workspace']
# # add_goal('goal')
# doc.getObject('goal').Conditions = ['roboarm_free ?r', 'assembled ?a']
export_to_file(file_path)

View 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)
)
)
)