Экспорт URDF из FreeCAD

This commit is contained in:
IDONTSUDO 2023-04-24 19:42:48 +00:00 committed by Igor Brylyov
parent 7cadf0741f
commit 45e0d29ea0
13 changed files with 267 additions and 98 deletions

View file

@ -1,71 +1,56 @@
import argparse
import shutil
from distutils.dir_util import copy_tree
import asyncio
from helper.fs import FS
from src.usecases.generate_world import SdfGenerateWorldUseCase
from src.model.sdf_geometry import SdfGeometryModel
from src.usecases.stability_check_usecase import StabilityCheckUseCase
from src.usecases.urdf_sub_assembly_usecase import UrdfSubAssemblyUseCase
from src.usecases.sdf_generate_world_usecase import SdfGenerateWorldUseCase
from src.model.sdf_geometry import GeometryModel
from src.usecases.sdf_sub_assembly_usecase import SdfSubAssemblyUseCase
import os
import typing
import xmlformatter
# python3 main.py --generationFolder /Users/idontsudo/robo/Cube3/ --outPath /Users/idontsudo/robo/ --world true
# python3 main.py --generationFolder /Users/idontsudo/robo/Cube3/ --outPath /Users/idontsudo/robo/ --world true --format 'urdf' --stabilityCheck 'true'
# python3 main.py --generationFolder /Users/idontsudo/robo/Cube3/ --outPath /Users/idontsudo/robo/ --world true --format 'sdf'
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--generationFolder', help='FreeCad generation folder')
parser.add_argument('--outPath', help='save SDF path')
parser.add_argument('--world', help='adding sdf world')
parser.add_argument('--format', help='urdf,sdf,mujoco')
parser.add_argument('--stabilityCheck',
help='do i need to check the stability?')
args = parser.parse_args()
if args.generationFolder == None or args.outPath == None:
parser.print_help()
outPath = args.outPath
geometryFiles = FS.readFilesTypeFolder(args.generationFolder + '/assets/')
assemblyStructure = FS.readJSON(
args.generationFolder + '/step-structure.json')
sdfGeometryModels: list[SdfGeometryModel] = []
geometryModels: list[GeometryModel] = []
for el in geometryFiles:
sdfGeometryModels.append(SdfGeometryModel.from_dict(
geometryModels.append(GeometryModel.from_dict(
FS.readJSON(args.generationFolder + '/assets/' + el)))
sdfSubAssemblyUseCase = SdfSubAssemblyUseCase().call(
sdfGeometryModels, assemblyStructure,)
if os.path.exists(outPath + 'sdf-generation/'):
shutil.rmtree(path=outPath + 'sdf-generation/')
copy_tree(args.generationFolder + 'sdf/', outPath + 'sdf-generation/')
dirPath = outPath + 'sdf-generation/'
for el in sdfGeometryModels:
path = dirPath + el.name + '/'
os.makedirs(path)
FS.writeFile(data=el.toSDF(), filePath=path,
fileName='/model' + '.sdf')
FS.writeFile(data=FS.readFile(os.path.dirname(os.path.realpath(__file__))
+ '/mocks/sdf/model.config'), filePath=path, fileName='/model' + '.config')
if(args.world == None):
for key, v in sdfSubAssemblyUseCase.items():
FS.writeFile(data=v['assembly'], filePath=dirPath,
fileName='/' + key + '.sdf')
else:
for key, v in sdfSubAssemblyUseCase.items():
FS.writeFile(data=SdfGenerateWorldUseCase.call(v['assembly']), filePath=dirPath,
fileName='/' + key + '.sdf')
formatter = xmlformatter.Formatter(indent="1", indent_char="\t", encoding_output="ISO-8859-1", preserve=["literal"])
files = FS.readFilesTypeFolder(outPath + 'sdf-generation/', fileType= '.sdf')
for el in files:
FS.writeFile(data=str(formatter.format_file(outPath + 'sdf-generation/' + el) , 'utf-8'), filePath=outPath + 'sdf-generation/', fileName=el)
if (args.format == 'sdf'):
SdfSubAssemblyUseCase().call(
geometryModels=geometryModels, assembly=assemblyStructure,
world=args.world,
generationFolder=args.generationFolder,
outPath=args.outPath
)
if (args.format == 'urdf' and args.stabilityCheck != None):
UrdfSubAssemblyUseCase().call(
geometryModels=geometryModels, assembly=assemblyStructure,
world=args.world,
generationFolder=args.generationFolder,
outPath=args.outPath
)
StabilityCheckUseCase().call(
args.outPath
)