//******************************************************************// // 目前仅支持一个(路径曲面)、两个和三个截面 // // 所有截面m_lstShapePoly都在XY平面,即在z值相同,且封闭 // // 设置基点:1-截面的重心; // // 2-截面的形心(GetExtend的中心); // // 3-指定基点即设置截面的基点; // // 他们依次与截面相对应,即第i个截面的贯穿点 // // 截面位置:除首末截面外的截面需给定位置,m_lstDistScale,即 // // 从路径开始端到截面长度/路径总长度 // //******************************************************************// #ifndef __DBPOLYSMESH2_H #define __DBPOLYSMESH2_H #include "DbCurveMesh2.h" #include "PolyMeshTool.h" class TARCH_EXP TDbPolyMesh2: public TDbCurveMesh2 { DECLARE_TENTBASE(); ACRX_DECLARE_MEMBERS(TDbPolyMesh2); public: TDbPolyMesh2(); ~TDbPolyMesh2(); public: //截面链表长度-2==截面位置链表长度,基点链表长度==截面链表长度 virtual BOOL IsValid() const; virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const; virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform); virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const; virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset); virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const; virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const; virtual int GetFirstVersion()const{return 7;}//ok virtual void GetTips(DList &) const; Acad::ErrorStatus DrawShapeBases(XExplodeDraw &dc) const;//断面显示 Acad::ErrorStatus DrawShapePolys(XExplodeDraw &dc) const;//基点显示 //在XY平面上的轮廓(目前不支持3个截面以上的) //仅在m_vtNormal(0,0,1)时 void GetOutlinePoly(ads_real dZ, XPoly2D &poly) const; int GetShapeNum() const;//截面总数 //Methos public: //除第一个截面以外的截面 void SetShapePolys(const DList& lstShapePoly);//要求都在XY平面,且封闭 void GetShapePolys(DList& lstShapePoly) const; //所有的的截面,此时不用再SetShapePoly(const XPoly2D &newShape); void SetAllShapePolys(const DList& lstShapePoly);//要求都在XY平面,且封闭 void GetAllShapePolys(DList& lstShapePoly) const; //除第一个截面和最后一个截面以外的其他截面在路径上的位置(个数是截面数-2) //(和路径长度的比,都 0& lstDist); void GetDistScales(DList& lstDist) const; //指定基点函数 void SetWeightCenterAsShapeBases();//1--重心 void SetCenterAsShapeBases(); //2--形心(GetExtend的中点) void SetShapeBases(const DList& lstShapeBase);//3 -- 指定基点 //3 -- 指定基点,包括父类的m_ptShapeBase,不再调用父类的设置基点函数 void SetAllShapeBases(const DList& lstShapeBase); void GetShapeBases(DList& lstShapeBase) const; void GetAllShapeBases(DList& lstShapeBase) const;//包括父类的m_ptShapeBase // 工程量 public: void GetAllShapeArea(DList& lstArea) const; void GetShapeArea(DList& lstArea) const; void GetAllShapePerimeter(DList& lstPerimeter) const; void GetShapePerimeter(DList& lstPerimeter) const; // double GetSideArea() const;//未完成 // double GetVolume() const;//未完成 protected: DList m_lstShapePoly; DList m_lstShapeBase; //除第一个截面和最后一个截面以外的其他截面在路径上的位置(个数是截面数-2) DList m_lstDistScale;//(和总路径长度的比) protected: //网格参数(目前不支持3个截面以上的,采用线性、二次插值) BOOL GetSurfaceMesh(int &nRows,int &nCols,XPoint* &pPtArray) const; BOOL AppendToMesh(const XContour3D& shape, const int nTotalVertex, XVector3D &vtAlignment, XPoint* &pPtArray, int &nPtArrayIndex) const; double Angle(const XPoint& from,const XPoint& to1,const XPoint& to2) const;//夹角 double Parabola(double Z,double Z1,double Z2,double Z3, double R1,double R2,double R3) const;//二次插值(抛物线法) private: const static Adesk::UInt8 g_nVersion; public: // 当重构TDPtrList后,tch_com17会出现STD链接错误,故在这里封装接口避开。以后令行解决。 #if ADS == 17 XPoint GetAllShapeBasesByIndex(int idx); double GetAllShapePerimeterByIndex(int idx); double GetAllShapeAreaByIndex(int idx); void SetAllShapeBasesByIndex(int idx, XPoint pt); #endif }; #endif