utiles_v2017/CartoElements.cpp

195 lines
4.8 KiB
C++
Raw Permalink Blame History

#include "StdAfx.h"
#include "CartoBaseElements.h"
#include "CartoElements.h"
#include "CartoBase.h"
#include "GeometryFunction.h"
//*****************************************************************************************
CartoBaseEntity* CartoComun::get(CartoBaseEntity * dst)
{
dst->flagsUser = flagsUser;
dst->ia=ia;
dst->type = getType();
return dst;
}
//*****************************************************************************************
CartoBasePaintedProps* CartoComun::get(CartoBasePaintedProps * dst)
{
dst->peso = peso;
return dst;
}
//*****************************************************************************************
CartoBaseColor* CartoComun::get(CartoBaseColor * dst)
{
dst->color = color;
return dst;
}
//*****************************************************************************************
bool CartoComun::setInfo(CartoBaseInfoEntity * info)
{
CartoBaseEntity *e =info->entity();
CartoBaseColor *c =info->color();
CartoBasePaintedProps *p =info->paintp();
if(!e || !c || !p)
return false;
flagsUser = e->flagsUser;
color= c->color;
peso= p->peso;
id= e->id;
return true;
}
//*****************************************************************************************
CartoEntity* CartoPto::set(CartoBaseInfoEntity *src)
{
if(!setInfo(src))
return NULL;
CartoBasePoint *p = src->pto();
if(!p)
return NULL;
memcpy(pt,p->pts,sizeof(double)*3);
return this;
}
//*****************************************************************************************
double* CartoPto::getPto(int i)
{
if(i==0)
return pt;
return NULL;
}
//*****************************************************************************************
int CartoPto::CopyInTo(CartoBase *src)
{
CartoBaseEntity e;
CartoBasePaintedProps p;
CartoBaseColor c;
CartoBasePoint pt;
memcpy(pt.pts, &this->pt, sizeof(double)*3);
e.id = src->add(&pt);
if(idPropsP<0)
{
p.color = src->add(get(&c));
if(p.color<0)
return -1;
e.idPaintp = src->add(get(&p));
}
else
e.idPaintp = idPropsP;
if(e.idPaintp<-1)
return -1;
if(e.id<-1)
return -1;
return src->add(get(&e));
}
//*****************************************************************************************
double* CartoLine::getPto(int i)
{
return pts[i];
}
//*****************************************************************************************
double CartoLine::getLong()
{
return GeometryFunction::LongLine2d(this);
}
//*****************************************************************************************
double *CartoLine::GetPtoDis(double dis, double *dst, double *distTot)
{
return GeometryFunction::GetPto(this, dis, dst, distTot);
}
//*****************************************************************************************
bool CartoLine::addPto(double *p)
{
if(!(pts+=1))
return false;
pts.n++;
memcpy(pts[pts.n-1],p, sizeof(double)*3);
return true;
}
//*****************************************************************************************
CartoEntity* CartoLine::set(CartoBaseInfoEntity *src)
{
if(!setInfo(src))
return NULL;
CartoBaseLine *l = src->line();
if(!l)
return NULL;
pts.n = 0;
pts+=l->n;
pts.n = l->n;
CartoBasePoint *p = src->pto();
for(int i =0 ; i<l->n; i++)
{
memcpy(pts.ptr[i],p->pts,sizeof(double)*3);
p=&p[1];
}
return this;
}
//*****************************************************************************************
int CartoLine::CopyInTo(CartoBase *src)
{
if(pts.n<=0)
return -1;
CartoBaseEntity e;
CartoBasePaintedProps p;
CartoBaseColor c;
CartoBasePoint pt;
CartoBaseLine l;
l.n= pts.n;
if(!(src->_lines+=pts.n))
return -1;
memcpy(pt.pts,pts[0], sizeof(double)*3);
l.ini = src->add(&pt);
for(int i = 1; i<pts.n; i++)
{
memcpy(pt.pts,pts[i], sizeof(double)*3);
src->add(&pt);
}
if(idPropsP<0)
{
p.color = src->add(get(&c));
if(p.color<0)
return -1;
e.idPaintp = src->add(get(&p));
}
else
e.idPaintp = idPropsP;
if(e.idPaintp<-1)
return -1;
e.id = src->add(&l);
if(e.id<-1)
return -1;
return src->add(get(&e));
}
//*****************************************************************************************
void CartoLine::invert()
{
int ini =0;
int fin =pts.n-1;
double d;
while(ini<fin)
{
for(int i =0; i<3; i++)
{
d=pts[ini][i];
pts[ini][i]=pts[fin][i];
pts[fin][i] = d;
}
ini++;
fin--;
}
}
//*****************************************************************************************
//*****************************************************************************************
//la distancia media a una l<>nea de longitud mayor que this,
//calculando la distancia de los puntos de this a line2
double CartoEntity::disMedLines(SetPtsR *line2, double *desv, BOOL usa_z /*=FALSE*/)
{
return GeometryFunction::DisMedLines(this,line2,desv,usa_z);
}
//*****************************************************************************************