76d94d6194
- modifiche a Zmap - aggiunto clamp a ratio di font - migliorata ricerca nomi con *.
343 lines
20 KiB
C++
343 lines
20 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2015-2015
|
|
//----------------------------------------------------------------------------
|
|
// File : VolZmap.h Data : 22.01.15 Versione : 1.6a4
|
|
// Contenuto : Dichiarazione della classe Volume Zmap.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 22.01.15 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "ObjGraphicsMgr.h"
|
|
#include "GeoObjRW.h"
|
|
#include "CurveComposite.h"
|
|
#include "SurfFlatRegion.h"
|
|
#include "/EgtDev/Include/EGkVolZmap.h"
|
|
#include "/EgtDev/Include/EGkPoint3d.h"
|
|
#include "/EgtDev/Include/EGkVector3d.h"
|
|
#include "/EgtDev/Include/ENkPolynomialRoots.h"
|
|
#include "/EgtDev/Include/EgkIntersLinesurfTm.h"
|
|
|
|
//----------------------------------------------------------------------------
|
|
struct TriaStruct {
|
|
int i, j, k ;
|
|
std::vector<Point3d> ptCompoVert ;
|
|
std::vector<TRIA3DVECTOR> vCompoTria ;
|
|
} ;
|
|
|
|
// Vettore di TriaStruct con sharp fature interni a un blocco
|
|
typedef std::vector<TriaStruct> TriHolder ;
|
|
|
|
// Vettori di TriHolder con sharp feature di frontiera:
|
|
// il primo indice individua il blocco, il secondo il voxel
|
|
typedef std::vector<TriHolder> TriaMatrix ;
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
class VolZmap : public IVolZmap, public IGeoObjRW
|
|
{
|
|
public : // IGeoObj
|
|
virtual ~VolZmap( void) ;
|
|
virtual VolZmap* Clone( void) const ;
|
|
virtual GeoObjType GetType( void) const ;
|
|
virtual bool IsValid( void) const
|
|
{ return ( m_nStatus == OK) ; }
|
|
virtual const std::string& GetTitle( void) const ;
|
|
virtual bool Dump( std::string& sOut, bool bMM = true, const char* szNewLine = "\n") const ;
|
|
virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const ;
|
|
virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const ;
|
|
virtual bool Translate( const Vector3d& vtMove) ;
|
|
virtual bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
|
|
{ double dAngRad = dAngDeg * DEGTORAD ;
|
|
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
|
|
virtual bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) ;
|
|
virtual bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
|
|
virtual bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) ;
|
|
virtual bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff) ;
|
|
virtual bool ToGlob( const Frame3d& frRef) ;
|
|
virtual bool ToLoc( const Frame3d& frRef) ;
|
|
virtual bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) ;
|
|
virtual void SetObjGraphics( IObjGraphics* pOGr)
|
|
{ m_OGrMgr.SetObjGraphics( pOGr) ; }
|
|
virtual IObjGraphics* GetObjGraphics( void)
|
|
{ return m_OGrMgr.GetObjGraphics() ; }
|
|
virtual const IObjGraphics* GetObjGraphics( void) const
|
|
{ return m_OGrMgr.GetObjGraphics() ; }
|
|
virtual void SetTempProp( int nProp)
|
|
{ m_nTempProp = nProp ; }
|
|
virtual int GetTempProp( void)
|
|
{ return m_nTempProp ; }
|
|
|
|
public : // IVolZmap
|
|
bool CopyFrom( const IGeoObj* pGObjSrc) override ;
|
|
bool Clear( void) override ;
|
|
bool Create( const Point3d& ptO, double dDimX, double dDimY, double dDimZ, double dPrec, bool bTriDex) override ;
|
|
bool CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bTriDex) override ;
|
|
bool CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex) override ;
|
|
bool GetAllTriangles( TRIA3DLIST& lstTria) const override ;
|
|
int GetBlockCount( void) const override ;
|
|
bool GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DLISTVECTOR& vLstTria) const override ;
|
|
bool GetDexelLines( int nDir, int nPos1, int nPos2, POLYLINELIST& lstPL) const override ;
|
|
bool SetTolerances( double dLinTol, double dAngTolDeg = 90) override ;
|
|
bool SetStdTool( const std::string& pToolName, double dH, double dR, double dCornR) override ;
|
|
bool SetAdvTool( const std::string& pToolName,
|
|
double dH, double dR, double dTipH, double dTipR, double dCornR) override ;
|
|
bool SetGenTool( const std::string& pToolName, const ICurveComposite* pToolOutline) override ;
|
|
bool MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Point3d& ptPe, const Vector3d& vtDe) override ;
|
|
bool GetDepth( const Point3d& ptP, const Vector3d& vtDir, double& dInLength, double& dOutLength) override ;
|
|
bool AvoidBox( const Frame3d& frBox, const Vector3d& vtDiag) override ;
|
|
|
|
public : // IGeoObjRW
|
|
virtual int GetNgeId( void) const ;
|
|
virtual bool Save( NgeWriter& ngeOut) const ;
|
|
virtual bool Load( NgeReader& ngeIn) ;
|
|
|
|
public :
|
|
VolZmap( void) ;
|
|
VolZmap( const VolZmap& stSrc)
|
|
{ if ( ! CopyFrom( stSrc))
|
|
LOG_ERROR( GetEGkLogger(), "VolZmap : copy constructor error") }
|
|
VolZmap& operator =( const VolZmap& stSrc)
|
|
{ if ( ! CopyFrom( stSrc))
|
|
LOG_ERROR( GetEGkLogger(), "VolZmap : copy error")
|
|
return *this ; }
|
|
|
|
private :
|
|
enum ToolType { GenericTool = 0, // generico da profilo -> usare SetTool
|
|
CylindricalMill = 1, // cilindrica
|
|
BallEndMill = 2, // sferica
|
|
BullNoseMill = 3, // naso di toro
|
|
ConusMill = 4} ; // con parte terminale conica
|
|
|
|
private :
|
|
bool CopyFrom( const VolZmap& clSrc) ;
|
|
bool ResetGraphics( void) ;
|
|
bool GetChunkPrisms( int nPos1, int nPos2, int nDim1, int nDim2, int nDimChk, TRIA3DLIST& lstTria) const ;
|
|
bool CalcChunkPrisms( int nPos1, int nPos2, int nDim1, int nDim2, TRIA3DLIST& lstTria) const ;
|
|
bool CalcDexelPrisms( int nPos1, int nPos2, TRIA3DLIST& lstTria) const ;
|
|
bool AddDexelSideFace( int nPos, int nPosAdj, const Point3d& ptP, const Point3d& ptQ,
|
|
const Vector3d& vtZ, const Vector3d& vtNorm, TRIA3DLIST& lstTria) const ;
|
|
bool MarchingCubes( int nBlock, TRIA3DLIST& lstTria) const ;
|
|
bool ExtMarchingCubes( int nBlock, TRIA3DLIST& lstTria, TriHolder& triHold) const ;
|
|
bool FlipEdgesII( TriHolder& TriHold) const ;
|
|
bool FlipEdgesBB( TriaMatrix& InterTria) const ;
|
|
bool IsThereMat( int nI, int nJ, int nK) const ;
|
|
bool IsThereMat( const int nMatr[][3], int nNum, double & dHx, double & dHy, double & dHz) const ;
|
|
bool IntersPos( int nVec1[], int nVec2[], Point3d & ptInt) const ;
|
|
bool IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, Point3d& ptInt, Vector3d& vtNormal) const ;
|
|
bool IsPointInsideVoxel( int nI, int nJ, int nK, const Point3d& ptP) const ;
|
|
bool IsPointInsideVoxelApprox( int nI, int nJ, int nK, const Point3d& ptP, double dPrec = EPS_SMALL) const ;
|
|
bool GetPointVoxel( const Point3d& ptP, int& nVoxI, int& nVoxJ, int& nVoxK) const ;
|
|
|
|
// OPERAZIONI SU INTERVALLI
|
|
bool SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ,
|
|
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
|
|
bool SubtractIntervals( unsigned int nGrid, const Point3d& ptP,
|
|
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
|
|
bool AddIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ,
|
|
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
|
|
bool AddIntervals( unsigned int nGrid, const Point3d& ptP,
|
|
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax) ;
|
|
|
|
// SOTTRAZIONI
|
|
// UTENSILI
|
|
// Asse di simmetria parallelo a Z
|
|
bool CylBall_ZDrilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool CylBall_ZPerp( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool CylBall_ZMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
bool Conus_ZDrilling( unsigned int nGrid, const Point3d & ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool Conus_ZPerp( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool Conus_ZMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
bool Dr_ZMilling( unsigned int nGrid, const Point3d& ptLs, const Point3d& ptLe, const Vector3d & vtToolDir) ;
|
|
bool Sw_ZMilling( unsigned int nGrid, const Point3d& ptLs, const Point3d& ptLe, const Vector3d & vtToolDir) ;
|
|
|
|
bool GenTool_ZDrilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool GenTool_ZMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
// Asse di simmetria nel piano
|
|
bool CylBall_XYDrilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool CylBall_XYPerp( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool CylBall_XYMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
bool Conus_XYDrilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool Conus_XYPerp( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool Conus_XYMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
// Asse di simmetria con orientazione generica
|
|
bool CylBall_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool CylBall_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
bool Conus_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool Conus_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
bool GenTool_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
bool GenTool_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir) ;
|
|
|
|
// COMPONENTI
|
|
// Asse di simmetria diretto come l'asse Z
|
|
|
|
// Drilling
|
|
bool CompCyl_ZDrilling( unsigned int nGrid, const Point3d& ptLs, const Point3d& ptLe, const Vector3d& vtToolDir,
|
|
double dHei, double dRad) ;
|
|
bool CompConus_ZDrilling( unsigned int nGrid, const Point3d& ptLs, const Point3d& ptLe, const Vector3d& vtToolDir,
|
|
double dHei, double dMaxRad, double dMinRad) ;
|
|
|
|
// Milling
|
|
bool CompCyl_ZMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dRad) ;
|
|
bool CompConus_ZMilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dMaxRad, double dMinRad) ;
|
|
|
|
// Asse di simmetria con orientazione generica
|
|
|
|
// Drilling
|
|
bool CompCyl_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dRad, bool bTapB, bool bTapT) ;
|
|
bool CompConus_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dMaxRad, double dMinRad, bool bTapB, bool bTapT) ;
|
|
|
|
// Milling
|
|
bool CompCyl_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dRad, bool bTapB, bool bTapT) ;
|
|
bool CompConus_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir,
|
|
double dHei, double dMaxRad, double dMinRad, bool bTapB, bool bTapT) ;
|
|
|
|
// Generica traslazione sfera
|
|
bool CompBall_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& ptE, double dRad) ;
|
|
|
|
// BBox per utensili e solidi semplici
|
|
inline bool BoundingBox( unsigned int nGrid, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV1, const Vector3d& vtV2,
|
|
unsigned int& nStI, unsigned int& nStJ, unsigned int& nEnI, unsigned int& nEnJ) ;
|
|
inline bool BBoxComponent( unsigned int nGrid, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV1, const Vector3d& vtV2,
|
|
unsigned int& nStI, unsigned int& nStJ, unsigned int& nEnI, unsigned int& nEnJ,
|
|
double dRad, double dTipRad, double dHei) ;
|
|
|
|
// Intersezioni
|
|
bool IntersLineBox( const Point3d& ptP, const Vector3d& vtV,
|
|
const Point3d& ptMin, const Point3d& ptMax, double& dU1, double& dU2) const ;
|
|
bool IntersLineVoxel( const Point3d& ptP, const Vector3d& vtV, int nIndI, int nIndJ, int nIndK,
|
|
int& nFace1, int& nFace2, double& dU1, double& dU2) const ;
|
|
bool IntersLineZMapBBox( unsigned int nGrid, const Point3d& ptP, const Vector3d& vtV, double& dU1, double& dU2) ;
|
|
bool IntersLineDexel( unsigned int nGrid, const Point3d& ptP, const Vector3d& vtV, unsigned int nI, unsigned int nJ,
|
|
double& dU1, double& dU2) ;
|
|
bool IntersLineZMapBBox( const Point3d& ptP, const Vector3d& vtV, double& dU1, double& dU2) ;
|
|
bool IntersLineDexel( const Point3d& ptP, const Vector3d& vtV, unsigned int nI, unsigned int nJ,
|
|
double& dU1, double& dU2) ;
|
|
bool IntersLineCylinder( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
|
const Frame3d& CylFrame, double dL, double dR,
|
|
Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2,
|
|
bool bTapO, bool bTapL) ;
|
|
bool IntersZLineCylinder( const Point3d& ptLine,
|
|
const Point3d& ptBase, const Point3d& ptTop, double dCylR,
|
|
double& dInfZ, double& dSupZ) ;
|
|
bool IntersLineEllipticalCylinder( const Vector3d& vtLineDir, const Point3d& ptLineSt,
|
|
const Frame3d& CircFrame, double dSqRad, double dLongMvLen, double dOrtMvLen,
|
|
Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2,
|
|
bool bTapLow, bool bTapUp) ;
|
|
bool IntersLineConus( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
|
const Frame3d& ConusFrame, double dTan, double dl, double dL,
|
|
Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2,
|
|
bool bTapLow, bool bTapUp) ;
|
|
bool IntersLineSphere( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
|
const Point3d& ptCenter, double dRad,
|
|
Point3d& ptInt1, Point3d& ptInt2) ;
|
|
bool IntersLineMyPolyhedron( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
|
const Frame3d& PolyFrame, double dLenX, double dLenY, double dLenZ, double dDeltaX,
|
|
Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2) ;
|
|
|
|
// Funzioni di gestione dei blocchi
|
|
bool GetBlockIJKFromN( int nBlock, int nIJK[]) const ;
|
|
bool GetBlockNFromIJK( int nIJK[], int& nBlock) const ;
|
|
bool GetBlockLimitsIJK( const int nIJK[], int nLimits[]) const ;
|
|
bool GetVoxelBlockIJK( const int nVoxIJK[], int nBlockIJK[]) const ;
|
|
bool GetAdjBlockToBlock( int nBlockN, int nDeltaI, int nDeltaJ, int nDeltaK, int& nAdjBlockN) const ;
|
|
bool IsAVoxelOnBoundary( const int nLimits[], const int nIJK[], bool bType) const ;
|
|
bool IsATriangleOnBorder( const Triangle3d& trTria, const Point3d& ptVert,
|
|
const int nBlockLimits[], const int nVoxIJK[]) const ;
|
|
bool IsATriangleOnBorder( const Triangle3d& trTria, const Point3d& ptVert,
|
|
const int nBlockLimits[], const int nVoxIJK[], bool bBorderBox) const ;
|
|
|
|
// Connessione Zmap
|
|
bool IsMapConnected( void) ;
|
|
|
|
private :
|
|
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
|
|
static const int N_MAPS = 3 ;
|
|
static const int N_DEXBLOCK = 32 ;
|
|
|
|
private :
|
|
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
|
|
Status m_nStatus ; // stato
|
|
int m_nTempProp ; // propriet� temporanea
|
|
double m_dStep ; // passo delle griglie
|
|
unsigned int m_nMapNum ; // numero di griglie ( 1 o 3)
|
|
Frame3d m_MapFrame[N_MAPS] ; // riferimenti delle griglie
|
|
unsigned int m_nNx[N_MAPS] ; // dimensione di ciascuna griglia in X
|
|
unsigned int m_nNy[N_MAPS] ; // dimensione di ciascuna griglia in Y
|
|
unsigned int m_nDim[N_MAPS] ; // dimensione di ciascuna griglia ( X * Y)
|
|
double m_dMinZ[N_MAPS] ; // minimo in Zlocale di ciascuna griglia
|
|
double m_dMaxZ[N_MAPS] ; // massimo in Zlocale di ciascuna griglia
|
|
|
|
struct Data { // Tratto di dexel : dati estremi, versori normali e corpo di appartenenza
|
|
double dMin ;
|
|
int nToolMin ;
|
|
Vector3d vtMinN ;
|
|
double dMax ;
|
|
int nToolMax ;
|
|
Vector3d vtMaxN ;
|
|
int nCompo ;
|
|
} ;
|
|
|
|
std::vector<std::vector<Data>> m_Values[N_MAPS] ; // dexel delle 3 griglie
|
|
|
|
unsigned int m_nDexNumPBlock ; // Numero di dexel per blocco
|
|
unsigned int m_nFracLin[3] ; // Numero di blocchi per ogni asse
|
|
unsigned int m_nNumBlock ; // Numero totale di blocchi
|
|
|
|
mutable std::vector<bool> m_BlockToUpdate ;
|
|
|
|
int m_nConnectedCompoCount ; // Se == - 1 il numero di componenti non � noto
|
|
// Se >= 0 � il numero di componenti connesse
|
|
|
|
double m_dLinTol ; // Dati per utensile
|
|
double m_dAngTolDeg ;
|
|
std::string m_sToolName ;
|
|
unsigned int m_nToolType ;
|
|
unsigned int m_nCurrentToolNum ;
|
|
CurveComposite m_ToolOutline ;
|
|
CurveComposite m_ToolArcLineApprox ;
|
|
double m_dHeight ;
|
|
double m_dTipHeight ;
|
|
double m_dRadius ;
|
|
double m_dRCorner ;
|
|
double m_dTipRadius ;
|
|
|
|
mutable TriaMatrix m_InterBlockTria ;
|
|
} ;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
inline VolZmap* CreateBasicVolZmap( void)
|
|
{ return (static_cast<VolZmap*>( CreateGeoObj( VOL_ZMAP))) ; }
|
|
inline VolZmap* CloneBasicVolZmap( const IGeoObj* pGObj)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP)
|
|
return nullptr ;
|
|
return (static_cast<VolZmap*>(pGObj->Clone())) ; }
|
|
inline const VolZmap* GetBasicVolZmap( const IGeoObj* pGObj)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP)
|
|
return nullptr ;
|
|
return (static_cast<const VolZmap*>(pGObj)) ; }
|
|
inline VolZmap* GetBasicVolZmap( IGeoObj* pGObj)
|
|
{ if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP)
|
|
return nullptr ;
|
|
return (static_cast<VolZmap*>(pGObj)) ; }
|
|
|
|
|