#pragma once
//clase para leer grabar shp
#ifndef Fshape_h
#define Fshape_h

#include "base_head.h"
#include "garray.h"
#include "b_file.h"
#pragma pack(4)
typedef	struct	ShpHead
{
	int		code;
	int		res[5];
	int		nb;		// tamaño en bytes del archivo
	int		ver;
	int		tipo;
	double	mima[2][2];
	double	mimaz[2];
	double	mimam[2];
} ShpHead;
typedef	struct	ShpHeadReg
{
	int		nrec;			// nº del recor empezando en cero (en el file empiezan en 1)
	int		nb;		// tamaño en bytes del record
	int		tipo;
} Shp_reg;

#pragma pack(8)

class UTILES_EXPORT Fshape
{
	Cgarray<char> bufRecord;
	//datos de archivo
	ShpHead head;
	ShpHeadReg headr;
	double* mimC; //coordenadas mima
	double* maxC; //coordenadas mima
	double* mimaM; //coordenadas mima
	double* mimaZ; //coordenadas mima
	
	double* ptos; //coordenadas de los puntos
	double* ptosM; //coordenadas de los puntos
	double* ptosZ; //coordenadas de los puntos


	int ReadType;
	int offserW;
	int		nc;	// número de coordenadas que tiene cada punto
	int npt;//numero total de puntos
	int tc;//total de coordenadas de todos los puntos sumados
	int *part;//partes del record
	int numPart;//numero de partes
	Cb_file *f;//puntero a archivo
	Cb_file *f_shx;//puntero a archivo

public:
	enum FShapeType
	{
		NullShape=0,
		Point=1,
		PolyLine=3,
		Polygon=5,
		MultiPoint=8,
		PointZ=11,
		PolyLineZ=13,
		PolygonZ=15,
		MultiPointZ=18,
		PointM=21,
		PolyLineM=23,
		PolygonM=25,
		MultiPointM=28,
		MultiPatch=31,
	};
	enum FshpReadType
	{
		Rpoint=0,
		RMpoint,
		RPolyLine,
		Rpolygon,
	};

	Fshape(void);
	~Fshape(void);

	//funciones de lectura--------------------------------
	bool leeHead(Cb_file *file);
	bool LeeRecord();
	double* get(int i);//devuelve el punto i esimo de la parte ip
	double* get(int ip, int i);//devuelve el punto i esimo de la parte ip
	int getNp();//devuelve el total de partes
	int getNPt(int ip);//devuelve el total de puntos de la parte ip
	int getNPt();//devuelve el total de puntos de la parte ip
	int getType();//devuelve tipo de objetos almacenados
	int getNcoord();//devuelve numero de coordenadas por punto
	//funciones de escritura-------------------------------
	
	bool set(int tipe/*FshpReadType*/,int ncoord, Cb_file *file,Cb_file *file_shx =0);
	bool grabaRecord(Cgarray<double> *pts);
	bool grabaRecord(Cgarray<double> *pts, Cgarray<int> *parts);
	bool FinGraba();
	

private:
	int  inv_4(int *pb);
};
#endif