EgtGeomKernel 1.6d2 :

- BBox3d aggiunta LocToLoc e migliorati i controlli per validità
- aggiunta gestione estrusione nell'ingombro delle curve
- a CurveComposite aggiunta funzione che la chiude
- in GdbIterator aggiunte GoTo con nome
- in GeomDB aggiunte Get con nome
- in GeomDB aggiunto swap tra gruppi con gestione di base, sorgente e lista referenti
- migliorata gestione materiale ereditato in Relocate
- aggiunte SetInfo e GetInfo con INTVECTOR e DBLVECTOR
- aggiunte FromString e ToString con BBox3d.
This commit is contained in:
Dario Sassi
2015-04-16 06:47:52 +00:00
parent 0f7b78fea7
commit 08831a6849
24 changed files with 1082 additions and 92 deletions
+68 -9
View File
@@ -15,36 +15,38 @@
#include "stdafx.h"
#include "\EgtDev\Include\EGkBBox3d.h"
#include "\EgtDev\Include\EGkFrame3d.h"
#include <stdlib.h>
#include <algorithm>
using namespace std ;
//----------------------------------------------------------------------------
BBox3d::BBox3d( const Point3d& ptP1, const Point3d& ptP2)
{
m_ptMin.Set( __min( ptP1.x, ptP2.x), __min( ptP1.y, ptP2.y), __min( ptP1.z, ptP2.z)) ;
m_ptMax.Set( __max( ptP1.x, ptP2.x), __max( ptP1.y, ptP2.y), __max( ptP1.z, ptP2.z)) ;
m_ptMin.Set( min( ptP1.x, ptP2.x), min( ptP1.y, ptP2.y), min( ptP1.z, ptP2.z)) ;
m_ptMax.Set( max( ptP1.x, ptP2.x), max( ptP1.y, ptP2.y), max( ptP1.z, ptP2.z)) ;
}
//----------------------------------------------------------------------------
BBox3d::BBox3d( double dX1, double dY1, double dZ1, double dX2, double dY2, double dZ2)
{
m_ptMin.Set( __min( dX1, dX2), __min( dY1, dY2), __min( dZ1, dZ2)) ;
m_ptMax.Set( __max( dX1, dX2), __max( dY1, dY2), __max( dZ1, dZ2)) ;
m_ptMin.Set( min( dX1, dX2), min( dY1, dY2), min( dZ1, dZ2)) ;
m_ptMax.Set( max( dX1, dX2), max( dY1, dY2), max( dZ1, dZ2)) ;
}
//----------------------------------------------------------------------------
void
BBox3d::Set( const Point3d& ptP1, const Point3d& ptP2)
{
m_ptMin.Set( __min( ptP1.x, ptP2.x), __min( ptP1.y, ptP2.y), __min( ptP1.z, ptP2.z)) ;
m_ptMax.Set( __max( ptP1.x, ptP2.x), __max( ptP1.y, ptP2.y), __max( ptP1.z, ptP2.z)) ;
m_ptMin.Set( min( ptP1.x, ptP2.x), min( ptP1.y, ptP2.y), min( ptP1.z, ptP2.z)) ;
m_ptMax.Set( max( ptP1.x, ptP2.x), max( ptP1.y, ptP2.y), max( ptP1.z, ptP2.z)) ;
}
//----------------------------------------------------------------------------
void
BBox3d::Set( double dX1, double dY1, double dZ1, double dX2, double dY2, double dZ2)
{
m_ptMin.Set( __min( dX1, dX2), __min( dY1, dY2), __min( dZ1, dZ2)) ;
m_ptMax.Set( __max( dX1, dX2), __max( dY1, dY2), __max( dZ1, dZ2)) ;
m_ptMin.Set( min( dX1, dX2), min( dY1, dY2), min( dZ1, dZ2)) ;
m_ptMax.Set( max( dX1, dX2), max( dY1, dY2), max( dZ1, dZ2)) ;
}
//----------------------------------------------------------------------------
@@ -141,6 +143,19 @@ BBox3d::GetMinMax( Point3d& ptMin, Point3d& ptMax) const
return true ;
}
//----------------------------------------------------------------------------
bool
BBox3d::GetMinDim( Point3d& ptMin, double& dDimX, double& dDimY, double& dDimZ) const
{
if ( ! IsValid())
return false ;
ptMin = m_ptMin ;
dDimX = m_ptMax.x - m_ptMin.x ;
dDimY = m_ptMax.y - m_ptMin.y ;
dDimZ = m_ptMax.z - m_ptMin.z ;
return true ;
}
//----------------------------------------------------------------------------
bool
BBox3d::GetCenterExtent( Point3d& ptCenter, Vector3d& vtExtent) const
@@ -176,6 +191,8 @@ BBox3d::GetRadius( double& dRad) const
bool
BBox3d::ToGlob( const Frame3d& frRef)
{
if ( ! IsValid())
return false ;
// trasformo il minimo
Point3d ptMinGlob = m_ptMin ;
if ( ! ptMinGlob.ToGlob( frRef))
@@ -200,6 +217,8 @@ BBox3d::ToGlob( const Frame3d& frRef)
bool
BBox3d::ToLoc( const Frame3d& frRef)
{
if ( ! IsValid())
return false ;
// trasformo il minimo
Point3d ptMinLoc = m_ptMin ;
if ( ! ptMinLoc.ToLoc( frRef))
@@ -223,6 +242,38 @@ BBox3d::ToLoc( const Frame3d& frRef)
return true ;
}
//----------------------------------------------------------------------------
bool
BBox3d::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
{
if ( ! IsValid())
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// trasformo il minimo
Point3d ptMinNewLoc = m_ptMin ;
if ( ! ptMinNewLoc.LocToLoc( frOri, frDest))
return false ;
// trasformo i vettori dal Min al Max diretti come gli assi locali
Vector3d vtXNewLoc( m_ptMax.x - m_ptMin.x, 0, 0) ;
vtXNewLoc.LocToLoc( frOri, frDest) ;
Vector3d vtYNewLoc( 0, m_ptMax.y - m_ptMin.y, 0) ;
vtYNewLoc.LocToLoc( frOri, frDest) ;
Vector3d vtZNewLoc( 0, 0, m_ptMax.z - m_ptMin.z) ;
vtZNewLoc.LocToLoc( frOri, frDest) ;
// calcolo il box trasformato
Set( ptMinNewLoc) ;
Add( ptMinNewLoc + vtXNewLoc) ;
Add( ptMinNewLoc + vtYNewLoc) ;
Add( ptMinNewLoc + vtZNewLoc) ;
Add( ptMinNewLoc + vtXNewLoc + vtYNewLoc) ;
Add( ptMinNewLoc + vtYNewLoc + vtZNewLoc) ;
Add( ptMinNewLoc + vtZNewLoc + vtXNewLoc) ;
Add( ptMinNewLoc + vtXNewLoc + vtYNewLoc + vtZNewLoc) ;
return true ;
}
//----------------------------------------------------------------------------
bool
BBox3d::Encloses( const Point3d& ptP) const
@@ -268,6 +319,8 @@ BBox3d::OverlapsXY( const BBox3d& b3B) const
bool
BBox3d::FindIntersection( const BBox3d& b3B, BBox3d& b3Int) const
{
if ( ! IsValid() || ! b3B.IsValid())
return false ;
// verifico direttamente la sovrapposizione
if ( m_ptMax.x < b3B.m_ptMin.x - EPS_SMALL || m_ptMin.x > b3B.m_ptMax.x + EPS_SMALL)
return false ;
@@ -289,6 +342,8 @@ BBox3d::FindIntersection( const BBox3d& b3B, BBox3d& b3Int) const
bool
BBox3d::FindIntersectionXY( const BBox3d& b3B, BBox3d& b3Int) const
{
if ( ! IsValid() || ! b3B.IsValid())
return false ;
// verifico direttamente la sovrapposizione
if ( m_ptMax.x < b3B.m_ptMin.x - EPS_SMALL || m_ptMin.x > b3B.m_ptMax.x + EPS_SMALL)
return false ;
@@ -308,6 +363,8 @@ BBox3d::FindIntersectionXY( const BBox3d& b3B, BBox3d& b3Int) const
double
BBox3d::SqDistFromPoint( const Point3d& ptP) const
{
if ( ! IsValid())
return INFINITO ;
double dSqDist = 0 ;
if ( ptP.x < m_ptMin.x)
dSqDist += ( m_ptMin.x - ptP.x) * ( m_ptMin.x - ptP.x) ;
@@ -328,6 +385,8 @@ BBox3d::SqDistFromPoint( const Point3d& ptP) const
double
BBox3d::SqDistFromPointXY( const Point3d& ptP) const
{
if ( ! IsValid())
return INFINITO ;
double dSqDist = 0 ;
if ( ptP.x < m_ptMin.x)
dSqDist += ( m_ptMin.x - ptP.x) * ( m_ptMin.x - ptP.x) ;