#! /usr/bin/env python
import numpy as np
from sys import argv
from os.path import splitext

def gnuplot_splot_to_ply(path,outname,base):
	data = np.loadtxt(path)
	dim_y = 0
	while data[dim_y,0] == data[0,0]:
		dim_y += 1

	x_coords = data[:-1:dim_y,0];
	dim_x = len(x_coords)
	y_coords = data[:dim_y,1]

	z = data[:,2].reshape(dim_y,dim_x).T + base


	v_idx_top = np.zeros(z.shape)
	v_idx_base = np.zeros(z.shape)


	vertices = []

	#number and collect vertices
	v_idx = 0
	for i in range(dim_x):
		for j in range(dim_y):
			v_idx_top[i,j] = v_idx;
			vertices.append((x_coords[i],y_coords[j],z[i,j]))
			v_idx += 1
			v_idx_base[i,j] = v_idx;
			vertices.append((x_coords[i],y_coords[j],0))
			v_idx += 1

	#collect top and base faces
	faces = []
	for i in range(dim_x - 1):
		for j in range(dim_y - 1):
			faces.append((4,v_idx_top[i,j],v_idx_top[i+1,j],v_idx_top[i+1,j+1],v_idx_top[i,j+1]))
			faces.append((4,v_idx_base[i,j],v_idx_base[i+1,j],v_idx_base[i+1,j+1],v_idx_base[i,j+1]))

	#collect edge faces
	for i in range(dim_x - 1):
		faces.append((4,v_idx_top[i,0],v_idx_top[i+1,0],v_idx_base[i+1,0],v_idx_base[i,0]))
		faces.append((4,v_idx_top[i,dim_y-1],v_idx_top[i+1,dim_y-1],v_idx_base[i+1,dim_y-1],v_idx_base[i,dim_y-1]))

	for i in range(dim_y - 1):
		faces.append((4,v_idx_top[0,i],v_idx_top[0,i+1],v_idx_base[0,i+1],v_idx_base[0,i]))
		faces.append((4,v_idx_top[dim_x-1,i],v_idx_top[dim_x-1,i+1],v_idx_base[dim_x-1,i+1],v_idx_base[dim_x-1,i]))


	fid = open(outname,"w")
	fid.write("ply\n")
	fid.write("format ascii 1.0\n")
	fid.write("element vertex %d\n" % len(vertices))
	fid.write("property float32 x\n")
	fid.write("property float32 y\n")
	fid.write("property float32 z\n")
	fid.write("element face %d\n" % len(faces))
	fid.write("property list uint8 int32 vertex_index\n")
	fid.write("end_header\n")
	for v in vertices:
		fid.write("%f %f %f\n" % v)
	for f in faces:
		fid.write("%d %d %d %d %d\n" % f)
	fid.write("\n");

if len(argv) < 2:
	print "Usage gnuplot2ply data.dat [offset=1.0]"

offset = argv[2] if len(argv) == 3 else 1.0

gnuplot_splot_to_ply(argv[1],splitext(argv[1])[0] + ".ply",offset)
