adding comments
This commit is contained in:
parent
9eaf12a4fa
commit
12482ff40f
7 changed files with 102 additions and 75 deletions
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
from usecases.export_assembly_them_all_usecase import ExportAssemblyThemAllUseCase
|
from usecases.export_assembly_them_all_usecase import ExportAssemblyThemAllUseCase
|
||||||
import FreeCAD
|
import FreeCAD
|
||||||
|
|
||||||
from usecases.export_usecase import EXPORT_TYPES, ExportUseCase
|
from usecases.export_usecase import EXPORT_TYPES, ExportUseCase
|
||||||
from usecases.get_sdf_geometry_usecase import SdfGeometryUseCase
|
from usecases.get_sdf_geometry_usecase import SdfGeometryUseCase
|
||||||
from usecases.assembly_parse_usecase import AssemblyParseUseCase
|
from usecases.assembly_parse_usecase import AssemblyParseUseCase
|
||||||
|
@ -10,7 +9,6 @@ from model.geometry_part import GeometryPart
|
||||||
from model.files_generator import FolderGenerator
|
from model.files_generator import FolderGenerator
|
||||||
from helper.fs import FS
|
from helper.fs import FS
|
||||||
import os
|
import os
|
||||||
# import ImportGui
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import json
|
||||||
import re
|
import re
|
||||||
from pyquaternion import Quaternion
|
from pyquaternion import Quaternion
|
||||||
|
|
||||||
|
|
||||||
def importObjAtPath(path: str):
|
def importObjAtPath(path: str):
|
||||||
import importOBJ
|
import importOBJ
|
||||||
importOBJ.insert(u"" + path, App.ActiveDocument.Label)
|
importOBJ.insert(u"" + path, App.ActiveDocument.Label)
|
||||||
|
@ -14,7 +15,7 @@ def getFullPathObj(assemblyFolder: str, name: str):
|
||||||
return assemblyFolder + 'sdf/meshes/' + name + '.obj'
|
return assemblyFolder + 'sdf/meshes/' + name + '.obj'
|
||||||
|
|
||||||
|
|
||||||
def computedStabiliti(refElement, childElement):
|
def computedStability(refElement, childElement):
|
||||||
b = childElement.Shape.BoundBox
|
b = childElement.Shape.BoundBox
|
||||||
App.activeDocument().addObject("Part::MultiCommon", "Common")
|
App.activeDocument().addObject("Part::MultiCommon", "Common")
|
||||||
App.activeDocument().Common.Shapes = [refElement, childElement, ]
|
App.activeDocument().Common.Shapes = [refElement, childElement, ]
|
||||||
|
@ -34,14 +35,22 @@ def computedStabiliti(refElement, childElement):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
App.newDocument()
|
App.newDocument()
|
||||||
|
# загрузка env интерфейса
|
||||||
env = json.loads((open('./env.json')).read())
|
env = json.loads((open('./env.json')).read())
|
||||||
coordinatsFilePath = env.get('pathToTheSimulationCoordinatesFile')
|
|
||||||
assemblyFolder = env.get('generationFolder')
|
|
||||||
buildNumber = int(re.findall(r'\d', coordinatsFilePath)[0])
|
|
||||||
|
|
||||||
|
# получение пути координат файла
|
||||||
|
coordinatesFilePath = env.get('pathToTheSimulationCoordinatesFile')
|
||||||
|
|
||||||
|
# получение папки сборки
|
||||||
|
assemblyFolder = env.get('generationFolder')
|
||||||
|
buildNumber = int(re.findall(r'\d', coordinatesFilePath)[0])
|
||||||
|
|
||||||
|
# загрузка последовательности сборки ввиде списка строк деталей
|
||||||
assemblyStructure = json.loads(
|
assemblyStructure = json.loads(
|
||||||
(open(assemblyFolder + 'step-structure.json')).read())
|
(open(assemblyFolder + 'step-structure.json')).read())
|
||||||
|
# получение номера тестируемой сборки
|
||||||
assemblyNumber = int(buildNumber)
|
assemblyNumber = int(buildNumber)
|
||||||
|
# получение тестируемой детали в сборке
|
||||||
activeDetail = assemblyStructure[assemblyNumber]
|
activeDetail = assemblyStructure[assemblyNumber]
|
||||||
|
|
||||||
subassemblyNotParticipatingInMarkup = assemblyStructure[0:assemblyNumber - 1]
|
subassemblyNotParticipatingInMarkup = assemblyStructure[0:assemblyNumber - 1]
|
||||||
|
@ -57,22 +66,24 @@ def main():
|
||||||
importObjAtPath(el)
|
importObjAtPath(el)
|
||||||
for el in App.ActiveDocument.Objects[2:App.ActiveDocument.Objects.__len__()]:
|
for el in App.ActiveDocument.Objects[2:App.ActiveDocument.Objects.__len__()]:
|
||||||
el.ViewObject.ShapeColor = (0.32, 0.05, 0.38)
|
el.ViewObject.ShapeColor = (0.32, 0.05, 0.38)
|
||||||
|
# загрузка координат
|
||||||
coordinats = json.loads((open(coordinatsFilePath)).read())
|
coordinates = json.loads((open(coordinatesFilePath)).read())
|
||||||
inc = 1
|
inc = 1
|
||||||
|
# перемещение обьектов в документе на точки стабильность полученные из pybullet
|
||||||
for el in App.ActiveDocument.Objects:
|
for el in App.ActiveDocument.Objects:
|
||||||
pos = coordinats[inc]['position']
|
pos = coordinates[inc]['position']
|
||||||
qua = coordinats[inc]['quaternion']
|
qua = coordinates[inc]['quaternion']
|
||||||
new_quaternion = Quaternion(qua[0], qua[1], qua[2], qua[3])
|
new_quaternion = Quaternion(qua[0], qua[1], qua[2], qua[3])
|
||||||
rotation_matrix = new_quaternion.rotation_matrix
|
rotation_matrix = new_quaternion.rotation_matrix
|
||||||
current_position = el.Placement.Base
|
current_position = el.Placement.Base
|
||||||
new_position = App.Vector(current_position.x, current_position.y, current_position.z)
|
new_position = App.Vector(
|
||||||
|
current_position.x, current_position.y, current_position.z)
|
||||||
new_placement = App.Placement(new_position, rotation_matrix)
|
new_placement = App.Placement(new_position, rotation_matrix)
|
||||||
el.Placement = new_placement
|
el.Placement = new_placement
|
||||||
App.ActiveDocument.recompute()
|
App.ActiveDocument.recompute()
|
||||||
el.Placement.move(App.Vector(pos[0], pos[1], pos[2]))
|
el.Placement.move(App.Vector(pos[0], pos[1], pos[2]))
|
||||||
|
# вычисление стабильность
|
||||||
print(computedStabiliti(meshMark, meshDetailOfTheMarkZone))
|
computedStability(meshMark, meshDetailOfTheMarkZone)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ def main():
|
||||||
App.newDocument()
|
App.newDocument()
|
||||||
env = json.loads((open('./env.json')).read())
|
env = json.loads((open('./env.json')).read())
|
||||||
assemblyFolder = env.get('assemblyFolder')
|
assemblyFolder = env.get('assemblyFolder')
|
||||||
|
|
||||||
assemblyStructure = json.loads(
|
assemblyStructure = json.loads(
|
||||||
(open(assemblyFolder + 'step-structure.json')).read())
|
(open(assemblyFolder + 'step-structure.json')).read())
|
||||||
assemblyNumber = int(env.get('buildNumber')) - 1
|
assemblyNumber = int(env.get('buildNumber')) - 1
|
||||||
|
|
|
@ -245,7 +245,7 @@ class GetPartPrimitiveCoordinatesUseCase(object):
|
||||||
|
|
||||||
|
|
||||||
class InitPartsParseUseCase():
|
class InitPartsParseUseCase():
|
||||||
|
# Инициализация парсинга
|
||||||
def call(self):
|
def call(self):
|
||||||
product_details = []
|
product_details = []
|
||||||
for part in FreeCadRepository().getAllSolids():
|
for part in FreeCadRepository().getAllSolids():
|
||||||
|
@ -257,13 +257,14 @@ class InitPartsParseUseCase():
|
||||||
|
|
||||||
|
|
||||||
class RenderPrimitiveUseCase(object):
|
class RenderPrimitiveUseCase(object):
|
||||||
|
# Рендеринг премитивов
|
||||||
def call(self, meshModels: list[MeshGeometryCoordinateModel], detailSquares) -> None:
|
def call(self, meshModels: list[MeshGeometryCoordinateModel], detailSquares) -> None:
|
||||||
for mesh in meshModels:
|
for mesh in meshModels:
|
||||||
mesh.initializePrimitivesByCoordinate(detailSquares)
|
mesh.initializePrimitivesByCoordinate(detailSquares)
|
||||||
|
|
||||||
|
|
||||||
class ClearWorkSpaceDocumentUseCase(object):
|
class ClearWorkSpaceDocumentUseCase(object):
|
||||||
|
# Очистка рабочего простарнства
|
||||||
def call(self, detailSquares):
|
def call(self, detailSquares):
|
||||||
for key in detailSquares:
|
for key in detailSquares:
|
||||||
for renderPrimitive in detailSquares[key]:
|
for renderPrimitive in detailSquares[key]:
|
||||||
|
@ -309,7 +310,9 @@ class ClearWorkSpaceDocumentUseCase(object):
|
||||||
|
|
||||||
|
|
||||||
class CadAdjacencyMatrix:
|
class CadAdjacencyMatrix:
|
||||||
|
# Матрица основанная на соприкосновении примитива с обьектами
|
||||||
def primitiveMatrix(self):
|
def primitiveMatrix(self):
|
||||||
|
# Получение матрицы
|
||||||
matrix = RenderPrimitivesScenario(
|
matrix = RenderPrimitivesScenario(
|
||||||
InitPartsParseUseCase(),
|
InitPartsParseUseCase(),
|
||||||
GetPartPrimitiveCoordinatesUseCase(),
|
GetPartPrimitiveCoordinatesUseCase(),
|
||||||
|
@ -317,27 +320,27 @@ class CadAdjacencyMatrix:
|
||||||
GetCollisionAtPrimitiveUseCase(),
|
GetCollisionAtPrimitiveUseCase(),
|
||||||
ClearWorkSpaceDocumentUseCase(),
|
ClearWorkSpaceDocumentUseCase(),
|
||||||
).call()
|
).call()
|
||||||
|
|
||||||
return AdjacencyMatrix(
|
return AdjacencyMatrix(
|
||||||
all_parts=GetAllPartsLabelsUseCase().call(),
|
all_parts=GetAllPartsLabelsUseCase().call(),
|
||||||
first_detail=GetFirstDetailUseCase().call(),
|
first_detail=GetFirstDetailUseCase().call(),
|
||||||
matrix=matrix,
|
matrix=matrix,
|
||||||
)
|
)
|
||||||
|
# Матрица основанная на соприкосновении обьектов
|
||||||
def matrixBySurfaces(self,):
|
def matrixBySurfaces(self):
|
||||||
adjaxed = {}
|
matrix = {}
|
||||||
for part in FreeCadRepository().getAllSolids():
|
for part in FreeCadRepository().getAllSolids():
|
||||||
adjaxed[part.Label] = []
|
matrix[part.Label] = []
|
||||||
for nextPart in FreeCadRepository().getAllSolids():
|
for nextPart in FreeCadRepository().getAllSolids():
|
||||||
if part.Label != nextPart.Label:
|
if part.Label != nextPart.Label:
|
||||||
|
# Вычисление соприконсоновения площади деталей
|
||||||
collisionResult: int = int(
|
collisionResult: int = int(
|
||||||
part.Shape.distToShape(nextPart.Shape)[0])
|
part.Shape.distToShape(nextPart.Shape)[0])
|
||||||
if (collisionResult == 0):
|
if (collisionResult == 0):
|
||||||
adjaxed[part.Label].append(nextPart.Label)
|
matrix[part.Label].append(nextPart.Label)
|
||||||
|
|
||||||
return AdjacencyMatrix(all_parts=GetAllPartsLabelsUseCase(
|
return AdjacencyMatrix(all_parts=GetAllPartsLabelsUseCase(
|
||||||
).call(), first_detail=GetFirstDetailUseCase().call(),
|
).call(), first_detail=GetFirstDetailUseCase().call(),
|
||||||
matrix=adjaxed
|
matrix=matrix
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -349,9 +352,10 @@ def main():
|
||||||
return TypeError('CadFile not found env.json')
|
return TypeError('CadFile not found env.json')
|
||||||
App.open(u'' + cadFile)
|
App.open(u'' + cadFile)
|
||||||
|
|
||||||
|
# Получение матрицы
|
||||||
matrixOut = CadAdjacencyMatrix().primitiveMatrix().to_dict()
|
matrixOut = CadAdjacencyMatrix().primitiveMatrix().to_dict()
|
||||||
import json
|
import json
|
||||||
|
# Запись результата
|
||||||
FS.writeFile(json.dumps(matrixOut, ensure_ascii=False, indent=4), outPath,'out.json')
|
FS.writeFile(json.dumps(matrixOut, ensure_ascii=False, indent=4), outPath,'out.json')
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
|
from scipy.spatial.transform import Rotation
|
||||||
|
import shutil
|
||||||
|
from spatialmath import *
|
||||||
|
from spatialmath.base import *
|
||||||
|
from assembly.assets.process_mesh import process_mesh
|
||||||
|
from assembly.examples.run_joint_plan import get_planner
|
||||||
|
from assembly.baselines.run_joint_plan import PyPlanner
|
||||||
|
from assembly.assets.subdivide import subdivide_to_size
|
||||||
|
import numpy as np
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
import os
|
import os
|
||||||
os.environ['OMP_NUM_THREADS'] = '1'
|
os.environ['OMP_NUM_THREADS'] = '1'
|
||||||
import sys
|
|
||||||
|
|
||||||
project_base_dir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), './')) + '/assembly/'
|
project_base_dir = os.path.abspath(os.path.join(
|
||||||
|
os.path.dirname(os.path.abspath(__file__)), './')) + '/assembly/'
|
||||||
|
|
||||||
|
|
||||||
sys.path.append(project_base_dir)
|
sys.path.append(project_base_dir)
|
||||||
sys.path.append(project_base_dir + '/baselines/')
|
sys.path.append(project_base_dir + '/baselines/')
|
||||||
sys.path.append(project_base_dir + '/assets/')
|
sys.path.append(project_base_dir + '/assets/')
|
||||||
|
|
||||||
import json
|
|
||||||
import numpy as np
|
|
||||||
from assembly.assets.subdivide import subdivide_to_size
|
|
||||||
from assembly.baselines.run_joint_plan import PyPlanner
|
|
||||||
from assembly.examples.run_joint_plan import get_planner
|
|
||||||
from assembly.assets.process_mesh import process_mesh
|
|
||||||
|
|
||||||
from spatialmath.base import *
|
|
||||||
from spatialmath import *
|
|
||||||
import shutil
|
|
||||||
from scipy.spatial.transform import Rotation
|
|
||||||
|
|
||||||
class FS:
|
class FS:
|
||||||
def readJSON(path: str):
|
def readJSON(path: str):
|
||||||
|
@ -38,6 +38,7 @@ class FS:
|
||||||
|
|
||||||
def readFilesTypeFolder(pathFolder: str, fileType='.json'):
|
def readFilesTypeFolder(pathFolder: str, fileType='.json'):
|
||||||
return os.listdir(pathFolder)
|
return os.listdir(pathFolder)
|
||||||
|
|
||||||
def readFolder(pathFolder: str):
|
def readFolder(pathFolder: str):
|
||||||
return list(map(lambda el: pathFolder + '/' + el, os.listdir(pathFolder)))
|
return list(map(lambda el: pathFolder + '/' + el, os.listdir(pathFolder)))
|
||||||
|
|
||||||
|
@ -52,32 +53,40 @@ def filterModels(filterModels, filterModelsDescription):
|
||||||
models.append(listGetFirstValue(
|
models.append(listGetFirstValue(
|
||||||
filterModels, None, lambda x: x.name == el))
|
filterModels, None, lambda x: x.name == el))
|
||||||
return models
|
return models
|
||||||
def meshTransformation():
|
|
||||||
|
|
||||||
|
def main():
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
parser = ArgumentParser()
|
parser = ArgumentParser()
|
||||||
parser.add_argument('--asp-path', type=str, required=True)
|
parser.add_argument('--asp-path', type=str, required=True)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
aspDir = args.asp_dir
|
aspDir = args.asp_dir
|
||||||
|
|
||||||
|
# Коректировка пути до папки с генерацией ASP
|
||||||
if (aspDir == None):
|
if (aspDir == None):
|
||||||
args.print_helper()
|
args.print_helper()
|
||||||
if (aspDir[aspDir.__len__() - 1] != '/'):
|
if (aspDir[aspDir.__len__() - 1] != '/'):
|
||||||
aspDir += '/'
|
aspDir += '/'
|
||||||
assemblys = FS.readFolder(aspDir + 'assembly')
|
# Получение списка папок с .obj обьектами
|
||||||
|
assembles = FS.readFolder(aspDir + 'assembly')
|
||||||
assemblyDirNormalize = []
|
assemblyDirNormalize = []
|
||||||
for el in assemblys:
|
for el in assembles:
|
||||||
try:
|
try:
|
||||||
|
# Пост обработка .obj обьектов
|
||||||
process_mesh(source_dir=el, target_dir=el+'/process/',subdivide=el, verbose=True)
|
process_mesh(source_dir=el, target_dir=el +
|
||||||
|
'/process/', subdivide=el, verbose=True)
|
||||||
assemblyDirNormalize.append(el + '/process/')
|
assemblyDirNormalize.append(el + '/process/')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('ERRROR:')
|
print('ERRROR:')
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
for el in assemblyDirNormalize:
|
for el in assemblyDirNormalize:
|
||||||
asset_folder = os.path.join(project_base_dir, aspDir)
|
asset_folder = os.path.join(project_base_dir, aspDir)
|
||||||
assembly_dir = os.path.join(asset_folder, el)
|
assembly_dir = os.path.join(asset_folder, el)
|
||||||
planner = get_planner('bfs')(assembly_dir,assembly_dir, 0, [1], False, 'sdf', 0.05, 0.01, 100, 100, True)
|
planner = get_planner('bfs')(assembly_dir, assembly_dir, 0, [
|
||||||
|
1], False, 'sdf', 0.05, 0.01, 100, 100, True)
|
||||||
|
|
||||||
|
# Планирование пути
|
||||||
status, t_plan, path = planner.plan(
|
status, t_plan, path = planner.plan(
|
||||||
120, seed=1, return_path=True, render=False, record_path=None
|
120, seed=1, return_path=True, render=False, record_path=None
|
||||||
)
|
)
|
||||||
|
@ -88,13 +97,17 @@ def meshTransformation():
|
||||||
euler = seMatrix.eul()
|
euler = seMatrix.eul()
|
||||||
coord = seMatrix.A[0:3, 3]
|
coord = seMatrix.A[0:3, 3]
|
||||||
rot = Rotation.from_euler('xyz', euler, degrees=True).as_quat()
|
rot = Rotation.from_euler('xyz', euler, degrees=True).as_quat()
|
||||||
coords.append({ 'quadrelion': [rot[0], rot[1], rot[2], rot[3]], 'xyz':[coord[0], coord[1], coord[2]],'euler': [euler[0], euler[1], euler[2]]})
|
coords.append({'quadrelion': [rot[0], rot[1], rot[2], rot[3]], 'xyz': [
|
||||||
|
coord[0], coord[1], coord[2]], 'euler': [euler[0], euler[1], euler[2]]})
|
||||||
|
# Запись пути в кортеж
|
||||||
planingObject = {
|
planingObject = {
|
||||||
"time": t_plan,
|
"time": t_plan,
|
||||||
"insertion_path": coords,
|
"insertion_path": coords,
|
||||||
"status": status,
|
"status": status,
|
||||||
}
|
}
|
||||||
FS.writeFile(json.dumps(planingObject),el[0:el.__len__() - 8], 'insertion_path.json' )
|
# Запись результата планирования
|
||||||
|
FS.writeFile(json.dumps(planingObject),
|
||||||
|
el[0:el.__len__() - 8], 'insertion_path.json')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
planner = PyPlanner(assembly_dir, 'process', still_ids=[1],)
|
planner = PyPlanner(assembly_dir, 'process', still_ids=[1],)
|
||||||
|
@ -116,4 +129,4 @@ def meshTransformation():
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
meshTransformation()
|
main()
|
||||||
|
|
|
@ -3,13 +3,13 @@ import argparse
|
||||||
from usecases.stability_check_usecase import StabilityCheckUseCase
|
from usecases.stability_check_usecase import StabilityCheckUseCase
|
||||||
|
|
||||||
# python3 main.py --aspPath /home/idontsudo/t/framework/asp/out/sdf-generation --buildNumber 3
|
# python3 main.py --aspPath /home/idontsudo/t/framework/asp/out/sdf-generation --buildNumber 3
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--aspPath', help='asp folder generation path')
|
parser.add_argument('--aspPath', help='asp folder generation path')
|
||||||
parser.add_argument('--buildNumber', help='FreeCad generation buildNumber')
|
parser.add_argument('--buildNumber', help='FreeCad generation buildNumber')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# args.aspPath
|
|
||||||
# args.buildNumber
|
|
||||||
StabilityCheckUseCase().call(args.aspPath, args.buildNumber)
|
StabilityCheckUseCase().call(args.aspPath, args.buildNumber)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ class StabilityCheckUseCase:
|
||||||
def call(self, outPath: str, buildNumber: int, duration=500):
|
def call(self, outPath: str, buildNumber: int, duration=500):
|
||||||
DURATION = duration
|
DURATION = duration
|
||||||
try:
|
try:
|
||||||
|
# Получение сгенерированного URDF для сборки
|
||||||
assemblyUrdf = json.loads(
|
assemblyUrdf = json.loads(
|
||||||
(open(outPath + 'urdf-generation.json')).read()).get(buildNumber)
|
(open(outPath + 'urdf-generation.json')).read()).get(buildNumber)
|
||||||
except:
|
except:
|
||||||
|
@ -41,6 +42,7 @@ class StabilityCheckUseCase:
|
||||||
inc = 0
|
inc = 0
|
||||||
for el in bulletIds:
|
for el in bulletIds:
|
||||||
inc += 1
|
inc += 1
|
||||||
|
# Получение расположения деталей
|
||||||
pos, rot = p.getBasePositionAndOrientation(el)
|
pos, rot = p.getBasePositionAndOrientation(el)
|
||||||
resultCoords.append({
|
resultCoords.append({
|
||||||
'id': inc,
|
'id': inc,
|
||||||
|
@ -52,8 +54,8 @@ class StabilityCheckUseCase:
|
||||||
|
|
||||||
file_to_open = outPath + buildNumber + "_" + 'stability_coords.json'
|
file_to_open = outPath + buildNumber + "_" + 'stability_coords.json'
|
||||||
|
|
||||||
f = open(file_to_open, 'w', encoding='utf-8',
|
f = open(file_to_open, 'w', encoding='utf-8',errors='ignore')
|
||||||
errors='ignore')
|
# Запись результатов тестирования
|
||||||
f.write(json.dumps(resultCoords))
|
f.write(json.dumps(resultCoords))
|
||||||
for el in urdfs:
|
for el in urdfs:
|
||||||
os.remove(el)
|
os.remove(el)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue