```C++
/**
* @brief   带洞截面沿路径拉伸
* @note  :
* @param : 截面必须共面,数组首个元素必须为外包,其余元素为内部洞;拉伸路径可以闭合
* @return:
* @author: csl
* @date  : [11/7/2022]
*/
virtual CPmSolid * extrudeAlongPath(const CArray<PmDbPolyline *> & polys,
    PmDbPolyline * path) override;
```
```C++
/**
* @brief   带洞截面拉伸
* @note  :
* @param : 数组首个元素必须为外包,其余元素为内部洞
* @return:
* @author: csl
* @date  : [11/7/2022]
*/
virtual CPmSolid * extrude(const CArray<PmDbPolyline *> & 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<PmDbPolyline *> & polys, const CArray<PMSoft::CPMGeVector3D> & 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<PMSoft::CPMGePoint3DArray, PMSoft::CPMGePoint3DArray&> &jmsPts3d, BOOL bIsFace) override;

	// 多截面蒙皮(截面的边可能存在凸度)
	virtual CPmSolid * create_by_faces_to_skin(const CArray<PMSoft::CPMGePoint3DArray, PMSoft::CPMGePoint3DArray&> &jmPt3d, const CArray<PmGeDoubleArray, PmGeDoubleArray&> &jmbulge,
		CArray<PMSoft::CPMGeVector3D, PMSoft::CPMGeVector3D&> &normalArr, const PMSoft::CPMGePoint3DArray &pathPt3d, BOOL bIsFace) override;

	CPmSolid * create_by_faces_to_skin(const CArray<PMSoft::CPMGePoint3DArray, PMSoft::CPMGePoint3DArray&> &jmsPts3d, const CArray<PmGeDoubleArray, PmGeDoubleArray&> &jmsBulges,
		const CArray<PMSoft::CPMGeVector3D, PMSoft::CPMGeVector3D&> &normalArr, BOOL bIsFace);

	// 多线段蒙皮(线段不含弧)
	CPmSolid * createFacesBySkinWithSegs(const CArray<PMSoft::CPMGePoint3DArray, PMSoft::CPMGePoint3DArray&> &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<PmDbPolyline *> & 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<PmDbPolyline *> & 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<PmDbPolyline *> & polys, const CArray<PMSoft::CPMGeVector3D> & 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<PmDbPolyline *> & 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<CGeBorder, CGeBorder&> & brds);
	virtual BOOL UnHookSpecialFaces(CPmSolid *& pSolid, CArray<CGeBorder, CGeBorder&> & 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 &centroid);
	

	//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;