#!/usr/bin/env python
# coding: utf-8

import re
import argparse

parser = argparse.ArgumentParser(description="Converts Mecway 'liml' file to individual 'STL' files")
parser.add_argument('filename', metavar='filename', type=str, help='Enter file name of liml file')
args = parser.parse_args()

filename = args.filename

with open(filename) as f_obj:
    MecwayFile = f_obj.readlines()

for line in MecwayFile:
    line = line.rstrip()

node_id = []
node_x = []
node_y = []
node_z = []
node_used = []

set_number = 0
set_name = []
element_set = []

element_id = []
element_1 = []
element_2 = []
element_3 = []

for i in range(len(MecwayFile)):
    if MecwayFile[i].find('liml') >= 0:
        continue
    elif MecwayFile[i].find('analysis') >= 0:
        continue
    elif MecwayFile[i].find('solution') >= 0:
        continue
    elif MecwayFile[i].find('node nid') >= 0:
        MecwayFile[i] = re.sub('node nid=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('x=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('y=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('z=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('"', '', MecwayFile[i])
        MecwayFile[i] = re.sub('<', '', MecwayFile[i])
        MecwayFile[i] = re.sub('>', '', MecwayFile[i])
        MecwayFile[i] = re.sub('/', '', MecwayFile[i])
        MecwayFile[i] = re.sub(' +', ' ', MecwayFile[i])
        id, x, y, z  = MecwayFile[i].split()
        node_id.append(id)
        node_x.append(x)
        node_y.append(y)
        node_z.append(z)
        node_used.append(False)
        continue
    elif MecwayFile[i].find('elset name') >=0:
        MecwayFile[i] = re.sub('elset name=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('color=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('colorrgb=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('expanded=', '', MecwayFile[i])
        MecwayFile[i] = re.sub('"', '', MecwayFile[i])
        MecwayFile[i] = re.sub('<', '', MecwayFile[i])
        MecwayFile[i] = re.sub('>', '', MecwayFile[i])
        MecwayFile[i] = re.sub('/', '', MecwayFile[i])
        MecwayFile[i] = re.sub(' +', ' ', MecwayFile[i])
        name, color, colorrgb, expanded  = MecwayFile[i].split()
        if name == 'Default':
            continue
        set_name.append(name)
        continue
    elif MecwayFile[i].find('/elset') >=0:
        set_number += 1
        continue
    elif MecwayFile[i].find('elem eid') >=0:
        if MecwayFile[i].count('tri3') >= 1:
            MecwayFile[i] = re.sub('elem eid=', '', MecwayFile[i])
            MecwayFile[i] = re.sub('shape=', '', MecwayFile[i])
            MecwayFile[i] = re.sub('nodes=', '', MecwayFile[i])
            MecwayFile[i] = re.sub('tri3', '', MecwayFile[i])
            MecwayFile[i] = re.sub('"', '', MecwayFile[i])
            MecwayFile[i] = re.sub('<', '', MecwayFile[i])
            MecwayFile[i] = re.sub('>', '', MecwayFile[i])
            MecwayFile[i] = re.sub('/', '', MecwayFile[i])
            MecwayFile[i] = re.sub('\[', '', MecwayFile[i])
            MecwayFile[i] = re.sub('\]', '', MecwayFile[i])
            MecwayFile[i] = re.sub(' +', ' ', MecwayFile[i])
            id, n1, n2, n3  = MecwayFile[i].split()
            element_id.append(id)
            element_set.append(set_number)
            element_1.append(n1)
            element_2.append(n2)
            element_3.append(n3)
        continue
    else:
        continue

for i in range(len(node_id)):
    node_id[i] = int(node_id[i])
    node_x[i] = float(node_x[i])
    node_y[i] = float(node_y[i])
    node_z[i] = float(node_z[i])
    node_used[i] = bool(node_used[i])

for i in range(len(element_id)):
    element_id[i] = int(element_id[i])
    element_set[i] = int(element_set[i])
    element_1[i] = int(element_1[i])
    element_2[i] = int(element_2[i])
    element_3[i] = int(element_3[i])

for j in range(len(set_name)):
    filename = set_name[j] + ".stl"
    with open(filename, 'w') as f:
        f.write('solid\n')
        for i in range(len(element_id)):
            if element_set[i] == j:
                f.write('  facet normal 1.00 0.00 0.00\n')
                f.write('    outer loop\n')
                f.write(f'      vertex {node_x[node_id.index(element_1[i])]} {node_y[node_id.index(element_1[i])]} {node_z[node_id.index(element_1[i])]}\n')
                f.write(f'      vertex {node_x[node_id.index(element_2[i])]} {node_y[node_id.index(element_2[i])]} {node_z[node_id.index(element_2[i])]}\n')
                f.write(f'      vertex {node_x[node_id.index(element_3[i])]} {node_y[node_id.index(element_3[i])]} {node_z[node_id.index(element_3[i])]}\n')
                f.write('    endloop\n')
                f.write('  endfacet\n')
                node_used[node_id.index(element_1[i])] = True
                node_used[node_id.index(element_2[i])] = True
                node_used[node_id.index(element_3[i])] = True
        f.write('endsolid')
    f.close()
