# 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}")