#pragma once

#include "base_head.h"
#include "CartoBaseDef.h"

class CartoBaseEntity;
class CartoBasePaintedProps;
class CartoBaseColor;
//clases de elmentos de cartobase
class UTILES_EXPORT CartoEntity : public SetPtsR
{
public:
	virtual int getType()//devuelve tipo de entidad
	{
		return CartoBaseTypes::Ndef;
	};

	virtual int getnLines()
	{
		return 0;
	}

	virtual CartoEntity* set(CartoBaseInfoEntity *src)
	{
		return 0;
	}
	virtual int CopyInTo(CartoBase *src)
	{
		return -1;
	}
	virtual double* getPto(int i){return 0;}

	virtual int getNumberPtos(){return 0;}
	virtual double disMedLines(SetPtsR *line2, double *desv=NULL);

};

class UTILES_EXPORT CartoComun: public CartoEntity
{
public:
	int flagsUser;
	int color;
	int peso;
	int id;//ide de entidad
	int ia;
	int idPropsP;//ide de propiedades de pintado al que se va a poner

	CartoComun()
	{
		flagsUser =0;
		color = 0;
		peso = 0;
		id = -1;
		ia=0;
		idPropsP = -1;
	}

	//auxiliary funcition
	bool setInfo(CartoBaseInfoEntity * info);

	CartoBaseEntity* get(CartoBaseEntity * dst);
	CartoBasePaintedProps* get(CartoBasePaintedProps * dst);
	CartoBaseColor* get(CartoBaseColor * dst);


};

class UTILES_EXPORT CartoPto: public CartoComun
{
public:
	
	double pt[3];
	CartoPto(){};
	virtual int getType()//devuelve tipo de entidad
	{
		return CartoBaseTypes::Point;
	};

	virtual CartoEntity* set(CartoBaseInfoEntity *src);

	virtual int CopyInTo(CartoBase *src);
	virtual double* getPto(int i);

	virtual int getNumberPtos(){return 1;}
};

class UTILES_EXPORT CartoLine: public CartoComun, public SetPtsW
{
public:
	Cgarray<double[3]> pts;
	CartoLine(){};

	virtual int getType()//devuelve tipo de entidad
	{
		return CartoBaseTypes::Line;
	};

	virtual CartoEntity* set(CartoBaseInfoEntity *src);
	virtual int CopyInTo(CartoBase *src);
	virtual int getNumberPtos(){return pts.n;}
	virtual double* getPto(int i);
	virtual bool addPto(double* p);
	//funciones de geometria----------------------------------
	void invert();//invierte el sentido de los pts
	double getLong();
	double *GetPtoDis(double dis, double *dst, double *distTot = NULL);
};
