OpenCasCade(OCC) 显示导入的点云数据(MFC+OCC)

本文介绍了一种使用自定义类ISession_Point在三维环境中显示点云数据的方法。通过创建点对象并将其添加到AIS_InteractiveContext中,可以实现在图形界面中可视化大量点云数据的功能。此外,还提供了一个函数用于从数据集中读取XYZ坐标,并为每个点创建一个ISession_Point实例进行显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先需要定义显示点的函数

//ISession_Point.h
// ISession_Point.h: interface for the ISession_Point class.
//
//

#if !defined(AFX_ISESSION_POINT_H__A9B277C3_A69E_11D1_8DA4_0800369C8A03__INCLUDED_)
#define AFX_ISESSION_POINT_H__A9B277C3_A69E_11D1_8DA4_0800369C8A03__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include <Standard_Macro.hxx>
#include <Standard_DefineHandle.hxx>

class ISession_Point;
DEFINE_STANDARD_HANDLE(ISession_Point,AIS_InteractiveObject)
class ISession_Point : public AIS_InteractiveObject  
{
public:
	ISession_Point();
	ISession_Point(Standard_Real X,Standard_Real Y ,Standard_Real Z);
	ISession_Point(const gp_Pnt2d& aPoint,Standard_Real Elevation = 0);
	ISession_Point(const gp_Pnt& aPoint);
	virtual ~ISession_Point();
	DEFINE_STANDARD_RTTIEXT(ISession_Point,AIS_InteractiveObject)

private :

        void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
		const Handle(Prs3d_Presentation)& aPresentation,
		const Standard_Integer aMode);
	    void Compute (const Handle(Prs3d_Projector)& aProjector,
		const Handle(Prs3d_Presentation)& aPresentation);
	   void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection,
		const Standard_Integer unMode);
	   gp_Pnt myPoint;
};

#endif // !defined(AFX_ISESSION_POINT_H__A9B277C3_A69E_11D1_8DA4_0800369C8A03__INCLUDED_)

//ISession_Point.cpp
// ISession_Point.cpp: implementation of the ISession_Point class.
//
//

#include "stdafx.h"
#include "ISession_Point.h"
#include <StdPrs_Point.hxx>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
//#define new DEBUG_NEW
#endif

IMPLEMENT_STANDARD_RTTIEXT(ISession_Point,AIS_InteractiveObject)

	//
	// Construction/Destruction
	//
	ISession_Point::ISession_Point(Standard_Real X,Standard_Real Y ,Standard_Real Z)
	:myPoint(gp_Pnt(X,Y,Z))
{

}

ISession_Point::ISession_Point(const gp_Pnt2d& aPoint,Standard_Real Elevation)
	:myPoint(gp_Pnt(aPoint.X(),aPoint.Y(),Elevation))
{

}

ISession_Point::ISession_Point(const gp_Pnt& aPoint)
	:myPoint(aPoint)
{

}

ISession_Point::~ISession_Point()
{

}

void ISession_Point::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
	const Handle(Prs3d_Presentation)& aPresentation,
	const Standard_Integer /*aMode*/)
{
	Handle(Geom_CartesianPoint) aGeomPoint = new Geom_CartesianPoint(myPoint);

	StdPrs_Point::Add(aPresentation,aGeomPoint,myDrawer);
}


void ISession_Point::Compute(const Handle(Prs3d_Projector)& /*aProjector*/,
	const Handle(Prs3d_Presentation)& /*aPresentation*/) 
{
}

void ISession_Point::ComputeSelection(const Handle(SelectMgr_Selection)& /*aSelection*/, 
	const Standard_Integer /*unMode*/)
{
}


2、编写显示的点云数据的函数

//其中PointXYZ是自己定义的存储X,Y,Z的类
void CXXView::showClouddata(vector<PointXYZ> MeasSurfaceXYZ)//显示点云数据
{
	//读取文件的数据
	//获取测量值的曲面信息
	//获取上下文的AIS_InteractiveContext
	Handle(AIS_InteractiveContext) myAISContext = GetDocument()->GetIC();
	size_t sizev = MeasSurfaceXYZ.size();
	for (size_t i =0;i<sizev;i++)
	{
		gp_Pnt p(MeasSurfaceXYZ[i].X,MeasSurfaceXYZ[i].Y,MeasSurfaceXYZ[i].Z);
		Handle(ISession_Point) iPoint = new ISession_Point(p);
		myAISContext->Display(iPoint,Standard_False);
	}
}

3、在其他类中可以直接调用,显示点云数据。
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值