Incorperated rsi code parser
This commit is contained in:
parent
9587d27805
commit
ffc40b2f88
69
src/RSIPI/krl_parser.py
Normal file
69
src/RSIPI/krl_parser.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import csv
|
||||||
|
import re
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
|
||||||
|
class KRLParser:
|
||||||
|
"""Parses KUKA KRL .src and .dat files, extracting Cartesian coordinates into CSV."""
|
||||||
|
|
||||||
|
def __init__(self, src_file, dat_file):
|
||||||
|
self.src_file = src_file
|
||||||
|
self.dat_file = dat_file
|
||||||
|
self.positions = OrderedDict()
|
||||||
|
|
||||||
|
def parse_src(self):
|
||||||
|
"""Parses .src file and collects all positional references."""
|
||||||
|
pattern = re.compile(r"PDAT_ACT=PPDAT(\d+)")
|
||||||
|
with open(self.src_file, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
match = pattern.search(line)
|
||||||
|
if match:
|
||||||
|
pos_ref = f"PPDAT{match.group(1)}"
|
||||||
|
self.positions[pos_ref] = {}
|
||||||
|
|
||||||
|
def parse_dat(self):
|
||||||
|
"""Parses .dat file extracting all Cartesian coordinates."""
|
||||||
|
pos_pattern = re.compile(
|
||||||
|
r"DECL E6POS (XP\d+)=\{X ([^,]+),Y ([^,]+),Z ([^,]+),A ([^,]+),B ([^,]+),C ([^,]+),S ([^,]+),T ([^,]+)")
|
||||||
|
|
||||||
|
with open(self.dat_file, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
match = pos_pattern.search(line)
|
||||||
|
if match:
|
||||||
|
pos_name = match.group(1)
|
||||||
|
coords = {
|
||||||
|
'X': float(match.group(2)),
|
||||||
|
'Y': float(match.group(3)),
|
||||||
|
'Z': float(match.group(4)),
|
||||||
|
'A': float(match.group(5)),
|
||||||
|
'B': float(match.group(6)),
|
||||||
|
'C': float(match.group(7)),
|
||||||
|
'S': int(match.group(8)),
|
||||||
|
'T': int(match.group(9)),
|
||||||
|
}
|
||||||
|
if pos_name in self.positions:
|
||||||
|
self.positions[pos_name] = coords
|
||||||
|
|
||||||
|
def export_csv(self, output_file):
|
||||||
|
"""Exports the parsed positions to CSV."""
|
||||||
|
fieldnames = ["Sequence", "PosRef", "X", "Y", "Z", "A", "B", "C", "S", "T"]
|
||||||
|
|
||||||
|
with open(output_file, 'w', newline='') as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
|
||||||
|
writer.writeheader()
|
||||||
|
|
||||||
|
for idx, (pos_ref, coords) in enumerate(self.positions.items()):
|
||||||
|
if coords:
|
||||||
|
writer.writerow({
|
||||||
|
"Sequence": idx,
|
||||||
|
"PosRef": pos_ref,
|
||||||
|
**coords
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = KRLParser("path/to/file.src", "path/to/file.dat")
|
||||||
|
parser.parse_src()
|
||||||
|
parser.parse_dat()
|
||||||
|
parser.export_csv("path/to/output.csv")
|
||||||
Loading…
Reference in New Issue
Block a user