//---------------------------------------------------------------------------- // 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 ptCompoVert ; std::vector vCompoTria ; } ; typedef std::vector TriHolder ; //---------------------------------------------------------------------------- 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 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( TRIA3DLIST& lstTria) const ; bool MarchingCubes( int nBlock, TRIA3DLIST& lstTria) const ; bool ExtMarchingCubes( const int nLimits[], TRIA3DLIST& lstTria, TriHolder& triHold) const ; bool FlipEdges( std::vector& VecTriHold) 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) const ; bool GetPointVoxel( 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 GetBlockIJK( int nBlock, int nIJK[]) const ; bool GetBlockLimitsIJK( const int nIJK[], int nLimits[]) const ; private : enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ; static const int N_MAPS = 3 ; static const int N_DEXBLOCK = 32 ; // 10000 ;//20 ;//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 { // Struttura dati: estremi del dexel e versori normali double dZVal ; Vector3d vtN ; } ; std::vector> 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 m_BlockToUpdate ; double m_dLinTol ; // Dati per utensile double m_dAngTolDeg ; std::string m_sToolName ; unsigned int m_nToolType ; CurveComposite m_ToolOutline ; CurveComposite m_ToolArcLineApprox ; double m_dHeight ; double m_dTipHeight ; double m_dRadius ; double m_dRCorner ; double m_dTipRadius ; } ; //----------------------------------------------------------------------------- inline VolZmap* CreateBasicVolZmap( void) { return (static_cast( CreateGeoObj( VOL_ZMAP))) ; } inline VolZmap* CloneBasicVolZmap( const IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP) return nullptr ; return (static_cast(pGObj->Clone())) ; } inline const VolZmap* GetBasicVolZmap( const IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP) return nullptr ; return (static_cast(pGObj)) ; } inline VolZmap* GetBasicVolZmap( IGeoObj* pGObj) { if ( pGObj == nullptr || pGObj->GetType() != VOL_ZMAP) return nullptr ; return (static_cast(pGObj)) ; }