transform.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import sys
  2. def insert_transformation(center,text):
  3. transform_id=text.find("Transform {")+11
  4. head=text[:transform_id]
  5. back=text[transform_id:]
  6. insert_str="\ntranslation %f %f %f\nrotation 0 1 0 0"%(center[0],center[1],center[2])
  7. return head+insert_str+back
  8. def convert_center(pts_str):
  9. pts=pts_str.split(',')
  10. if len(pts)<2: #该点格式为以 '\n'分割
  11. pts=pts_str.split('\n')
  12. sumx=0
  13. sumy=0
  14. sumz=0
  15. size=0
  16. points=[]
  17. for pt in pts:
  18. xyz_str=pt.replace('\n','').rstrip().lstrip()
  19. xyzstrs=xyz_str.split(' ')
  20. if len(xyzstrs)<3:
  21. continue
  22. [strx,stry,strz]=xyzstrs
  23. x=float(strx)
  24. y=float(stry)
  25. z=float(strz)
  26. size=size+1
  27. sumx+=x
  28. sumy+=y
  29. sumz+=z
  30. points.append([x,y,z])
  31. ax=sumx/size
  32. ay=sumy/size
  33. az=sumz/size
  34. new_pts_str=''
  35. for i in range(len(points)):
  36. [x,y,z]=points[i]
  37. [nx,ny,nz]=[x-ax,y-ay,z-az]
  38. if i ==len(points)-1:
  39. new_pts_str=new_pts_str+"%f %f %f"%(nz,nx,ny)
  40. else:
  41. new_pts_str=new_pts_str+"%f %f %f,"%(nz,nx,ny)
  42. return [[ax,ay,az],new_pts_str]
  43. def transform_solid(solid_str,shape_name):
  44. print("------------------------------------------------------------------------------------------------------:\n")
  45. if solid_str.find("Transform")<0:
  46. return [False,""]
  47. solid_str=solid_str.replace("Transform","DEF Trans_%s Transform"%(shape_name))
  48. index_beg=solid_str.find("point [")+7
  49. if index_beg<0:
  50. return [False,""]
  51. index_end=solid_str.find("]",index_beg)
  52. if index_end<index_beg:
  53. return [False,""]
  54. pts_str=solid_str[index_beg:index_end]
  55. [center,new_pts_str]=convert_center(pts_str)
  56. head=solid_str[:index_beg]
  57. back=solid_str[index_end:-1]
  58. new_str=head+new_pts_str+back+'\n'
  59. #new_trransform_pts_str=insert_transformation(center,new_str)
  60. solid_head="Solid {\ntranslation %f %f %f\nrotation 0 1 0 0\nchildren [\n"%(center[2],center[0],center[1])
  61. solid_back="]\nname \"%s_solid\"\nboundingObject USE %s\nphysics Physics {}\n}\n"%(shape_name,shape_name)
  62. new_solid_str=solid_head+new_str+solid_back
  63. return [True,new_solid_str]
  64. def transform_file(file,outfile):
  65. buff=""
  66. writer=open(outfile, 'w', encoding='utf-8')
  67. writer.write("#VRML_SIM R2021a utf8\n")
  68. robot_head="Robot {\ntranslation 0 0.0 0\nrotation 0 1 0,0\nchildren [\n"
  69. robot_transform_head="Transform {\nchildren [\n"
  70. writer.write(robot_head)
  71. writer.write(robot_transform_head)
  72. shape_count=0
  73. Shape_name=''
  74. NoTransformStr=[]
  75. with open(file, 'r', encoding='utf-8') as f:
  76. for line in f:
  77. if line.find("#VRML_SIM R2021a utf8")>=0:
  78. continue
  79. if line.find('Shape')>=0:
  80. Shape_name="Shape_%d"%(shape_count)
  81. line=line.replace('Shape',"DEF %s Shape"%(Shape_name))
  82. print("DEF Shape name:%s line:%s"%(Shape_name,line))
  83. if line.find("Transform")>=0: #找到
  84. if len(buff)>0:
  85. [ok,new_solid]=transform_solid(buff,Shape_name)
  86. if ok==False:
  87. NoTransformStr.append(buff)
  88. else:
  89. writer.write(new_solid)
  90. shape_count+=1
  91. buff=line
  92. else:
  93. buff=buff+line
  94. #循环结束,处理最后一个solid
  95. if len(buff)>0:
  96. [ok,new_solid]=transform_solid(buff,Shape_name)
  97. if ok==False:
  98. NoTransformStr.append(buff)
  99. else:
  100. writer.write(new_solid)
  101. robot_transform_back="]\n}\n"
  102. robot_end="\n]\n}\n"
  103. writer.write(robot_transform_back)
  104. writer.write(robot_end)
  105. for buf in NoTransformStr:
  106. writer.write(buf)
  107. if __name__=="__main__":
  108. transform_file("./AGV.wbt","./agv_test.wbt")