```C++ /** * @brief 带洞截面沿路径拉伸 * @note : * @param : 截面必须共面,数组首个元素必须为外包,其余元素为内部洞;拉伸路径可以闭合 * @return: * @author: csl * @date : [11/7/2022] */ virtual CPmSolid * extrudeAlongPath(const CArray & polys, PmDbPolyline * path) override; ``` ```C++ /** * @brief 带洞截面拉伸 * @note : * @param : 数组首个元素必须为外包,其余元素为内部洞 * @return: * @author: csl * @date : [11/7/2022] */ virtual CPmSolid * extrude(const CArray & polys, const PMSoft::CPMGePoint3D &fixedPt, // ? const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D &extusionVector, // ? 没有路径吗 double scaleFactor = 1.0, double twistAngle = 0.0) override; ``` ```C++ /** * @brief 多段拉伸生成完整体(适用构造柱马牙槎) * @note : 只在自主布尔中实现,ACIS未实现 * @param : polys为各段拉伸的起始截面,vctsExtru为每段拉伸的拉伸向量 * 截面与向量的数量应该相同,且至少为2个 * @return: * @author: csl * @date : [9/25/2023] */ virtual CPmSolid * extrudeStepByStep(const CArray & polys, const CArray & vctsExtru) override; ``` ```C++ /** * @param axis_start axis start position. * @param axis_end axis end position. * @param start_dir vector from axis_start to helix star * @param radius radius of helix. * @param pith distance between threads along axis. * @param handiness */ virtual CPmSolid * createHelix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch); virtual CPmSolid * createHelix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGeVector3D &FaceNormal, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch, BOOL bIsFace = FALSE); virtual CPmSolid * create_face_helix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch); ``` ////////////////////////////////////////////////////////////////////////// /// 体生成 ////////////////////////////////////////////////////////////////////////// // 两截面蒙皮(生成台体) virtual CPmSolid * create_by_faces_to_skin(PmDbPolyline * pStartPoly, PmDbPolyline * pEndPoly, PMSoft::CPMGeVector3D normal/*,BOOL bIsFace*/) override; // 多截面蒙皮(截面的边均为线段) virtual CPmSolid * create_by_faces_to_skin(const CArray &jmsPts3d, BOOL bIsFace) override; // 多截面蒙皮(截面的边可能存在凸度) virtual CPmSolid * create_by_faces_to_skin(const CArray &jmPt3d, const CArray &jmbulge, CArray &normalArr, const PMSoft::CPMGePoint3DArray &pathPt3d, BOOL bIsFace) override; CPmSolid * create_by_faces_to_skin(const CArray &jmsPts3d, const CArray &jmsBulges, const CArray &normalArr, BOOL bIsFace); // 多线段蒙皮(线段不含弧) CPmSolid * createFacesBySkinWithSegs(const CArray &segs, BOOL bIsFace); virtual CPmSolid * createBox(const PMSoft::CPMGePoint3D& p,double xLen,double yLen,double zLen); virtual CPmSolid * createTorus(const PMSoft::CPMGePoint3D& p, double majorRadius, double minorRadius); virtual CPmSolid * createSphere(const PMSoft::CPMGePoint3D& p, double radius); void CreateCircPoints(int nNum, const PMSoft::CPMGePoint3D& pt, const PMSoft::CPMGePoint3D& ptCent, PMSoft::CPMGePoint3DArray& ptCircArr); CPmSolid * CreateBall(const PMSoft::CPMGePoint3D& ptCent, double dRadius, PMSoft::PMBoolean3d::Ent3dData& drawData); CPmSolid * CreateBall(const PMSoft::CPMGePoint3D& ptCent, double dRadius); CPmSolid * CreateBall(const PMSoft::CPMGePoint3D& ptCent, double dRadius, double dHeight); CPmSolid * CreateBall(const PMSoft::CPMGePoint3D& ptCent, double dRadius, double dHeight, PMSoft::PMBoolean3d::Ent3dData& drawData); virtual CPmSolid * CreateBallBoard(const PMSoft::CPMGePoint3D& ptCent, double dHeight, double dRadius, double dBoardHeight); virtual CPmSolid * createPipe(const PMSoft::CPMGePoint3D& axisStart, PMSoft::CPMGePoint3D& axisEnd, const PMSoft::CPMGeVector3D& baseNormal, double dblOuterRadius, double dblInnerRadius); virtual CPmSolid * createCone(const PMSoft::CPMGePoint3D& axisStart, const PMSoft::CPMGePoint3D& axisEnd, double radius1, double radius2); virtual CPmSolid * createEllipsoid(const PMSoft::CPMGePoint3D &basept,double height,double radius1,double radius2,double radius3); virtual CPmSolid * createPyramid(const PMSoft::CPMGePoint3DArray &Pt3d, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGePoint3D &apex); virtual CPmSolid * createPyramid(const PMSoft::CPMGePoint3DArray &Pt3d, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGePoint3DArray &apexs); virtual CPmSolid * createHelix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch); virtual CPmSolid * createHelix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGeVector3D &FaceNormal, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch, BOOL bIsFace = FALSE); virtual CPmSolid * create_face_helix(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray bulges, const PMSoft::CPMGePoint3D &axis_start, const PMSoft::CPMGePoint3D &axis_end, const PMSoft::CPMGeVector3D &start_dir, BOOL handiness, double radius, double pitch); /** * @brief 截面绕轴旋转生成体 * * * @note : * @param : 截面、基点、轴向量、旋转角度 * @return: * @author: csl * @date : [11/7/2022] */ virtual CPmSolid * createSolidByFaceAroundAxis(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray &bulges, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGePoint3D &apex, const PMSoft::CPMGeVector3D &axis, double angle) override; virtual CPmSolid * createSphereFace(const PMSoft::CPMGePoint3D& p, double radius); virtual CPmSolid * create_face_cylinder_cone(const PMSoft::CPMGePoint3D& axisStart, const PMSoft::CPMGePoint3D& axisEnd, double radius1, double radius2, double start = 0, double end = 360); virtual CPmSolid * extrudeAdvance(PmDbPolyline * pExtrudePoly, const PMSoft::CPMGePoint3D &fixedPt, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D &extusionVector, double scaleFactor, double twistAngle); virtual CPmSolid * extrudeAlongPath(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray &bulge, PMSoft::CPMGeVector3D normal, PmDbPolyline * path, BOOL IsInteset = FALSE) override; /** * @brief 带洞截面沿路径拉伸 * * * @note : * @param : 截面必须共面,数组首个元素必须为外包,其余元素为内部洞;拉伸路径可以闭合 * @return: * @author: csl * @date : [11/7/2022] */ virtual CPmSolid * extrudeAlongPath(const CArray & polys, PmDbPolyline * path) override; virtual BOOL GetExtents(const CPmSolid *pEntity, PmExtents& extents); virtual InterferenceType checkInterferenceType(const CPmSolid* Ent,const CPmSolid* otherEnt,double dTol = 0.01); virtual CPmSolid * extrude(const PMSoft::CPMGePoint3DArray &pt3d, const PmGeDoubleArray &bulge, const PMSoft::CPMGePoint3D &fixedPt, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D &extusionVector, double scaleFactor, double twistAngle) override; CPmSolid * extrude(const PMSoft::CPMGePoint3DArray & pt3d, const PmGeDoubleArray & bulge, const PMSoft::CPMGePoint3D &fixedPt, const PMSoft::CPMGeVector3D &extusionVector); virtual CPmSolid * extrude(PmDbPolyline * pExtrudePoly, const PMSoft::CPMGePoint3D &fixedPt, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D &extusionVector, double scaleFactor, double twistAngle); // (新弧形) 面拉伸为柱类体测试接口 PMSoft::PMBoolean3d::CCylinderLikeBody * extrudeCylinderBodyTest(const PMSoft::OdexBase2d::PmDbPLine& plSection, const PMSoft::CPMGeVector3D& vecExtru); PMSoft::PMBoolean3d::CCylinderLikeBody * extrudeCylinderBodyTest(const PMSoft::CPMGePoint3DArray& pts, const PMSoft::PmGeDoubleArray& bulges, const PMSoft::CPMGeVector3D& vecNormal, const PMSoft::CPMGeVector3D& vecExtru); /** * @brief 带洞截面拉伸 * * * @note : * @param : 数组首个元素必须为外包,其余元素为内部洞 * @return: * @author: csl * @date : [11/7/2022] */ virtual CPmSolid * extrude(const CArray & polys, const PMSoft::CPMGePoint3D &fixedPt, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D &extusionVector, double scaleFactor = 1.0, double twistAngle = 0.0) override; /** * @brief 多段拉伸生成完整体(适用构造柱马牙槎) * * * @note : 只在自主布尔中实现,ACIS未实现 * @param : polys为各段拉伸的起始截面,vctsExtru为每段拉伸的拉伸向量 * 截面与向量的数量应该相同,且至少为2个 * @return: * @author: csl * @date : [9/25/2023] */ virtual CPmSolid * extrudeStepByStep(const CArray & polys, const CArray & vctsExtru) override; virtual CPmSolid * CreateFaceBody_extrude(const PMSoft::CPMGePoint3DArray & pt3d, const PmGeDoubleArray & bugle, const PMSoft::CPMGeVector3D &plgNormal, double dLength); virtual CPmSolid * CreateFaceBody_extrude(const PMSoft::CPMGePoint3DArray & pt3d,const PmGeDoubleArray & bugle,const PMSoft::CPMGeVector3D &plgNormal,const PMSoft::CPMGeVector3D &extrudeVec); virtual CPmSolid * CreateFaceBody_extrude(PmDbPolyline * ply, const PMSoft::CPMGeVector3D &plgNormal, const PMSoft::CPMGeVector3D & extrudeVec); virtual CPmSolid * CreateFaceBody(const PMSoft::CPMGePoint3DArray & pt3d,const PmGeDoubleArray & bulge,const PMSoft::CPMGeVector3D &plgNormal); virtual CPmSolid * CreateFaceBody(const PmDbPolyline * pFacePolyLine); //生成自身带洞的面 virtual CPmSolid * CreateFaceBody(const CArray & pFacePolyLineArr) override; virtual CPmSolid * CreateFaceBody_extrudeAlongPath(const PMSoft::CPMGePoint3DArray & pt3d,const PmGeDoubleArray &bulge,PMSoft::CPMGeVector3D normal,PmDbPolyline* path,BOOL IsInteset = FALSE) override; virtual void getSliceFace(CPmSolid * &pEntity,const PMSoft::CPMGePoint3D & pt, const PMSoft::CPMGeVector3D & normal, double dTol); virtual CPmSolid* CreateBodyBySliceFace(CPmSolid * pEntity,const PMSoft::CPMGePoint3D & pt, const PMSoft::CPMGeVector3D & normal, double dExtrudeDis); virtual BOOL GetEntity_AllFaces(CPmSolid * &pEntity);// 体构件转化为面构件 /// 隐藏不需要的面(适用人防墙业务) virtual BOOL UnHookSpecialFaces(CPmSolid *& pSolid, CArray & brds); virtual BOOL UnHookSpecialFaces(CPmSolid *& pSolid, CArray & brds, BOOL bNeedTransf); /// 隐藏单面(适用人防墙业务),向量即为面法向量 virtual BOOL UnHookSingleFace(CPmSolid *& pSolid, const CGeBorder & brd, const PMSoft::CPMGeVector3D & normal); ////////////////////////////////////////////////////////////////////////// /// 其他 ////////////////////////////////////////////////////////////////////////// virtual BOOL AddEntityToDbs(const CPMSolidArr & EntArr,CPM3dEntDataArr & entDataArr,CString & strACISFilePath); BOOL RemoveVertexNotNeed(PMSoft::CPMGePoint3DArray & PtArr,PmGeDoubleArray & BulgeArr,int & iSize_Pt,int & iSize_Bulge); /***************************************************************************************************************************************************/ virtual BOOL getCentroid(CPmSolid *pEntity, PMSoft::CPMGePoint3D ¢roid); //describe:获取所需实体的所有符合条件面,判断条件为实体面的法向量和传入向量符合条件 //notice:bGetOrMove,获取符合条件的还是去除符合条件的;bStrict,绝对符合条件还是接近条件(e.g 绝对条件为(线/面)同向时,接近条件为锐角;绝对条件为noZ时,接近条件为非xy平面) //return: // //author:csl //date:2022/9/14 virtual BOOL GetFaceSuitVec(CPmSolid *& pSolid, FaceNormalType normalType, BOOL bGetOrMove, BOOL bStrict, const PMSoft::CPMGeVector3D & vctNormalStd, const PMSoft::CPMGeTol& tol = PMSoft::CPMGeTol::gTol) override; // 一组实体 向 指定面进行投影 virtual CPmSolid * CreateEntShadow(const CPMSolidArr & entArr, const PMSoft::CPMGePlane & plane) override; // 将面实体拆分,每个面作为一个Solid,放在结果数组中。!内存需要调用方管理 virtual BOOL SplitFacesSolid(const CPmSolid * pFacesSolid, CPMSolidArr & facesSplitResult) override; // 将面Solid转化为体Solid(原始面组必须能构成单个完整体,不能多面,也不能缺面) virtual BOOL createBodyByFaces(CPmSolid *& pSolid) override;