0xZohar's picture
Add code/cube3d/training/translateLdr.py
6277b99 verified
# import os
# def checkEncoding(filepath):
# filepath = filepath
# with open(filepath, "rb") as encode_check:
# encoding = encode_check.readline(3)
# if encoding == b"\xfe\xff\x00":
# return "utf_16_be"
# elif encoding == b"\xff\xfe0":
# return "utf_16_le"
# else:
# return "utf_8"
# def readTextFile(filepath):
# filepath = filepath
# lines = None
# if os.path.exists(filepath):
# file_encoding = checkEncoding(filepath)
# try:
# with open(filepath, "rt", encoding=file_encoding) as f_in:
# lines = f_in.readlines()
# except:
# with open(filepath, "rt", encoding="latin_1") as f_in:
# lines = f_in.readlines()
# return lines
# def getModulePart(start_line, end_line, lines, main_section, offsetX, offsetY, offsetZ):
# for j in range(start_line, end_line):
# line = lines[j]
# if line.startswith("1 "):
# parts = line.strip().split()
# if len(parts) >= 5:
# try:
# x = float(parts[2]) + offsetX
# y = float(parts[3]) + offsetY
# z = float(parts[4]) + offsetZ
# parts[2] = str(x)
# parts[3] = str(y)
# parts[4] = str(z)
# line = " ".join(parts) + "\n"
# except ValueError as e:
# print(e)
# pass
# main_section.append(line)
# def process_ldr(filepath, output_file, offsetX, offsetY, offsetZ):
# if os.path.isfile(filepath):
# lines = readTextFile(filepath)
# if lines is None:
# print("Could not read file {0}".format(filepath))
# lines = []
# else:
# lines = []
# main_section = []
# startLine = 0
# endLine = 0
# lineCount = 0
# foundEnd = False
# for line in lines:
# parameters = line.strip().split()
# if len(parameters) > 2:
# if parameters[0] == "0" and parameters[1] == "FILE":
# if foundEnd == False:
# endLine = lineCount
# if endLine > startLine:
# getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
# foundEnd = True
# break
# startLine = lineCount
# foundEnd = False
# #import ipdb; ipdb.set_trace()
# if parameters[0] == "0" and parameters[1] == "NOFILE":
# endLine = lineCount
# foundEnd = True
# getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
# break
# lineCount += 1
# if lineCount < len(lines):
# remaining = lines[lineCount:]
# else:
# remaining = []
# if foundEnd == False:
# endLine = lineCount
# if endLine > startLine:
# getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
# import ipdb; ipdb.set_trace()
# new_section = main_section + remaining
# with open(output_file, "w", encoding="utf-8") as f:
# f.writelines(new_section)
# process_ldr("/public/home/wangshuo/gap/assembly/data/car_1k/ldr/car_5/car_5.ldr", "car_5_normalize_woremaining.ldr", 6000, 150, 2000)
import os
def checkEncoding(filepath):
filepath = filepath
with open(filepath, "rb") as encode_check:
encoding = encode_check.readline(3)
if encoding == b"\xfe\xff\x00":
return "utf_16_be"
elif encoding == b"\xff\xfe0":
return "utf_16_le"
else:
return "utf_8"
def readTextFile(filepath):
filepath = filepath
lines = None
if os.path.exists(filepath):
file_encoding = checkEncoding(filepath)
try:
with open(filepath, "rt", encoding=file_encoding) as f_in:
lines = f_in.readlines()
except:
with open(filepath, "rt", encoding="latin_1") as f_in:
lines = f_in.readlines()
return lines
def getModulePart(start_line, end_line, lines, main_section, offsetX, offsetY, offsetZ):
max_x, max_y, max_z = float('-inf'), float('-inf'), float('-inf')
for j in range(start_line, end_line):
line = lines[j]
if line.startswith("1 "):
parts = line.strip().split()
if len(parts) >= 5:
try:
x = float(parts[2]) + offsetX
y = float(parts[3]) + offsetY
z = float(parts[4]) + offsetZ
parts[2] = str(x)
parts[3] = str(y)
parts[4] = str(z)
line = " ".join(parts) + "\n"
# Update max coordinates
max_x = max(max_x, x)
max_y = max(max_y, y)
max_z = max(max_z, z)
except ValueError as e:
print(e)
pass
main_section.append(line)
return max_x, max_y, max_z
def getModulePartMin(start_line, end_line, lines, main_section):
min_x, min_y, min_z = float('inf'), float('inf'), float('inf')
for j in range(start_line, end_line):
line = lines[j]
if line.startswith("1 "):
parts = line.strip().split()
if len(parts) >= 5:
try:
x = float(parts[2])
y = float(parts[3])
z = float(parts[4])
parts[2] = str(x)
parts[3] = str(y)
parts[4] = str(z)
line = " ".join(parts) + "\n"
# Update min coordinates
min_x = min(min_x, x)
min_y = min(min_y, y)
min_z = min(min_z, z)
except ValueError as e:
print(e)
pass
main_section.append(line)
return min_x, min_y, min_z
def process_ldr(filepath, output_file, offsetX, offsetY, offsetZ, keep_remaining=False):
if os.path.isfile(filepath):
lines = readTextFile(filepath)
if lines is None:
print("Could not read file {0}".format(filepath))
lines = []
else:
lines = []
main_section = []
startLine = 0
endLine = 0
lineCount = 0
foundEnd = False
max_x, max_y, max_z = float('-inf'), float('-inf'), float('-inf') # Initialize max values
for line in lines:
parameters = line.strip().split()
if len(parameters) > 2:
if parameters[0] == "0" and parameters[1] == "FILE":
if foundEnd == False:
endLine = lineCount
if endLine > startLine:
local_max_x, local_max_y, local_max_z = getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
max_x = max(max_x, local_max_x)
max_y = max(max_y, local_max_y)
max_z = max(max_z, local_max_z)
foundEnd = True
break
startLine = lineCount
foundEnd = False
if parameters[0] == "0" and parameters[1] == "NOFILE":
endLine = lineCount
foundEnd = True
local_max_x, local_max_y, local_max_z = getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
max_x = max(max_x, local_max_x)
max_y = max(max_y, local_max_y)
max_z = max(max_z, local_max_z)
break
lineCount += 1
if lineCount < len(lines):
remaining = lines[lineCount:]
else:
remaining = []
if foundEnd == False:
endLine = lineCount
if endLine > startLine:
local_max_x, local_max_y, local_max_z = getModulePart(startLine, endLine, lines, main_section, offsetX, offsetY, offsetZ)
max_x = max(max_x, local_max_x)
max_y = max(max_y, local_max_y)
max_z = max(max_z, local_max_z)
# import ipdb; ipdb.set_trace()
if keep_remaining == False:
remaining = []
#import ipdb; ipdb.set_trace()
new_section = main_section + remaining
with open(output_file, "w", encoding="utf-8") as f:
f.writelines(new_section)
return max_x, max_y, max_z # Return the maximum coordinates
def getmin_ldr(filepath):
if os.path.isfile(filepath):
lines = readTextFile(filepath)
if lines is None:
print("Could not read file {0}".format(filepath))
lines = []
else:
lines = []
main_section = []
startLine = 0
endLine = 0
lineCount = 0
foundEnd = False
min_x, min_y, min_z = float('inf'), float('inf'), float('inf') # Initialize max values
for line in lines:
parameters = line.strip().split()
if len(parameters) > 2:
if parameters[0] == "0" and parameters[1] == "FILE":
if foundEnd == False:
endLine = lineCount
if endLine > startLine:
local_min_x, local_min_y, local_min_z = getModulePartMin(startLine, endLine, lines, main_section)
min_x = min(min_x, local_min_x)
min_y = min(min_y, local_min_y)
min_z = min(min_z, local_min_z)
foundEnd = True
break
startLine = lineCount
foundEnd = False
if parameters[0] == "0" and parameters[1] == "NOFILE":
endLine = lineCount
foundEnd = True
local_min_x, local_min_y, local_min_z = getModulePartMin(startLine, endLine, lines, main_section)
min_x = min(min_x, local_min_x)
min_y = min(min_y, local_min_y)
min_z = min(min_z, local_min_z)
break
lineCount += 1
if lineCount < len(lines):
remaining = lines[lineCount:]
else:
remaining = []
if foundEnd == False:
endLine = lineCount
if endLine > startLine:
local_min_x, local_min_y, local_min_z = getModulePartMin(startLine, endLine, lines, main_section)
min_x = min(min_x, local_min_x)
min_y = min(min_y, local_min_y)
min_z = min(min_z, local_min_z)
new_section = main_section + remaining
return min_x, min_y, min_z # Return the maximum coordinates
# # # Example call
# max_x, max_y, max_z = process_ldr("/public/home/wangshuo/gap/assembly/data/car_1k/subset_self/ldr_rotated_l30/car_1293_rot.ldr",
# "car_1293_normalize_woremaining.ldr", 6000, 150, 2000)
# print(f"Maximum coordinates after translation: X = {max_x}, Y = {max_y}, Z = {max_z}")