//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : EGkCurve.h Data : 06.05.14 Versione : 1.5e3 // Contenuto : Dichiarazione della interfaccia ICurve. // // // // Modifiche : 22.11.13 DS Creazione modulo. // 06.05.14 DS Agg. GetMidPoint, GetCenterPoint, GetStartDir, GetEndDir e GetMidDir. // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkGeoObj.h" #include "/EgtDev/Include/EGkPolyLine.h" #include "/EgtDev/Include/EGkPolyArc.h" #include "/EgtDev/Include/EGkPlane3d.h" #include "/EgtDev/Include/EgtPointerOwner.h" class Voronoi ; //---------------------------------------------------------------------------- class __declspec( novtable) ICurve : public IGeoObj { public : enum Side { FROM_MINUS = -1, // da valori inferiori del parametro FROM_PLUS = 1} ; // da valori superiori del parametro enum PntPos { PP_NULL = 0, // punto non appartenente alla curva PP_START = 1, // punto coincidente con l'inizio PP_MID = 2, // punto appartenente all'interno della curva PP_END = 3} ; // punto coincidente con la fine enum ApprLineType { APL_STD = 0, // approssimazione standard APL_SPECIAL = 10, // come STD, per composite conserva estremi di curve componenti APL_SPECIAL_INT = 20, // come SPECIAL, per composite anche almeno un interno di componenti non rettilinei APL_LEFT = 1, // linee sempre a sinistra APL_LEFT_CONVEX = 11, // linee sempre a sinistra convesse APL_RIGHT = 2, // linee sempre a destra APL_RIGHT_CONVEX = 12} ; // linee sempre a destra convesse enum OffType { OFF_FILLET = 0, // si raccordano con arco gli spigoli esterni OFF_CHAMFER = 1, // si raccordano con smusso gli spigoli esterni OFF_EXTEND = 2, // si prolungano all'intersezione gli spigoli esterni OFF_MEDIA_INTDZ = 4, // su angoli interni con delta Z fa media (in or con prec) OFF_FORCE_OPEN = 8, // forza a aperto anche se chiuso (in or ...) OFF_NO_VERTICAL = 16} ;// vieta linee perpendicolari al piano di offset (in or ...) public : // IGeoObj ICurve* Clone( void) const override = 0 ; public : virtual bool IsSimple( void) const = 0 ; virtual bool IsClosed( void) const = 0 ; virtual bool IsFlat( Plane3d& plPlane, bool bUseExtrusion = true, double dToler = EPS_SMALL) const = 0 ; virtual bool GetStartPoint( Point3d& ptStart) const = 0 ; virtual bool GetEndPoint( Point3d& ptEnd) const = 0 ; virtual bool GetMidPoint( Point3d& ptMid) const = 0 ; virtual bool GetCenterPoint( Point3d& ptCen) const = 0 ; virtual bool GetCentroid( Point3d& ptCen) const = 0 ; virtual bool GetStartDir( Vector3d& vtDir) const = 0 ; virtual bool GetEndDir( Vector3d& vtDir) const = 0 ; virtual bool GetMidDir( Vector3d& vtDir) const = 0 ; virtual bool GetExtrusion( Vector3d& vtExtr) const = 0 ; virtual bool GetThickness( double& dThick) const = 0 ; virtual bool GetDomain( double& dStart, double& dEnd) const = 0 ; virtual bool IsValidParam( double dPar, Side nSide) const = 0 ; virtual bool IsStartParam( double dPar) const = 0 ; virtual bool IsEndParam( double dPar) const = 0 ; virtual bool GetLength( double& dLen) const = 0 ; virtual bool GetLengthAtParam( double dU, double& dLen) const = 0 ; virtual bool GetParamAtLength( double dLen, double& dU) const = 0 ; virtual bool GetPointD1D2( double dU, Side nS, Point3d& ptPos, Vector3d* pvtDer1 = nullptr, Vector3d* pvtDer2 = nullptr) const = 0 ; virtual bool GetPointTang( double dU, Side nS, Point3d& ptPos, Vector3d& vtTang) const = 0 ; virtual bool GetPointDiffGeom( double dU, Side nS, CrvPointDiffGeom& oDiffG) const = 0 ; virtual bool IsPointOn( const Point3d& ptP, double dTol = EPS_SMALL) const = 0 ; virtual bool GetParamAtPoint( const Point3d& ptP, double& dPar, double dTol = EPS_SMALL) const = 0 ; virtual bool GetLengthAtPoint( const Point3d& ptP, double& dLen, double dTol = EPS_SMALL) const = 0 ; virtual bool GetNearestExtremityToPoint( const Point3d& ptP, bool& bStart) const = 0 ; virtual bool GetAreaXY( double& dArea) const = 0 ; virtual bool GetArea( Plane3d& plPlane, double& dArea) const = 0 ; virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const = 0 ; virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const = 0 ; virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const = 0 ; virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const = 0 ; virtual bool Invert( void) = 0 ; virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) = 0 ; virtual bool SetExtrusion( const Vector3d& vtExtr) = 0 ; virtual bool SetThickness( double dThick) = 0 ; virtual bool ModifyStart( const Point3d& ptNewStart) = 0 ; virtual bool ModifyEnd( const Point3d& ptNewEnd) = 0 ; virtual bool TrimStartAtParam( double dUTrim) = 0 ; virtual bool TrimEndAtParam( double dUTrim) = 0 ; virtual bool TrimStartEndAtParam( double dUStartTrim, double dUEndTrim) = 0 ; virtual bool TrimStartAtLen( double dLenTrim) = 0 ; virtual bool TrimEndAtLen( double dLenTrim) = 0 ; virtual bool ExtendStartByLen( double dLenExt) = 0 ; virtual bool ExtendEndByLen( double dLenExt) = 0 ; virtual Voronoi* GetVoronoiObject( void) const = 0 ; } ; //---------------------------------------------------------------------------- inline const ICurve* GetCurve( const IGeoObj* pGObj) { if ( pGObj == nullptr || ( pGObj->GetType() & GEO_CURVE) == 0) return nullptr ; return (static_cast(pGObj)) ; } inline ICurve* GetCurve( IGeoObj* pGObj) { if ( pGObj == nullptr || ( pGObj->GetType() & GEO_CURVE) == 0) return nullptr ; return (static_cast(pGObj)) ; } //---------------------------------------------------------------------------- // Raccolte di puntatori a ICurve typedef std::vector CICURVEPVECTOR ; // vettore di puntatori a const ICurve typedef std::vector ICURVEPVECTOR ; // vettore di puntatori a ICurve typedef std::list ICURVEPLIST ; // lista di puntatori a ICurve typedef std::vector> ICURVEPOVECTOR ; // vettore di puntatori esclusivi a ICurve