vtk智能指针->对智能指针的理解和使用

本文介绍了VTK中智能指针的使用,包括引用计数的概念,强调了智能指针在对象生命周期管理中的作用。通过智能指针,可以自动管理对象的创建与析构,避免内存泄漏。VTK提供了两种创建对象的方式:New()方法与智能指针vtkSmartPointer<T>。使用vtkSmartPointer<T>时,无需手动调用Delete(),智能指针会自动完成引用计数的增减。

学习代码:

#include <vtkSmartPointer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkObject.h>

// MyFunction函数:演示智能指针可以作为函数返回值
vtkSmartPointer<vtkImageData> MyFunction()
{
    vtkSmartPointer<vtkImageData> myObject = vtkSmartPointer<vtkImageData>::New();
    std::cout<<"MyFunction::myObject reference count = "<<myObject->GetReferenceCount()<<std::endl;
    return myObject;
}

//测试文件:data/VTK-logo.bmp
int main(int argc, char* argv[])
{

    //演示引用计数:
    vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();
    reader->SetFileName("C:\\Users\\Administrator\\Desktop\\vtk1\\Examples\\Examples\\Chap02\\data\\VTK-logo.bmp");
    reader->Update();

    std::cout<<"Reference Count of reader->GetOutput (Before Assignment) = "
        <<reader->GetOutput()->GetReferenceCount()<<std::endl;

    vtkSmartPointer<vtkImageData> image1 = reader->GetOutput();
    std::cout<<"Reference Count of reader->GetOutput (Assign to image1) = "
        <<reader->GetOutput()->GetReferenceCount()<<std::endl;
    std::cout<<"Reference Count of image1 = "
        <<image1->GetReferenceCount()<<std::endl;

    vtkSmartPointer<vtkImageData> image2 = reader->GetOutput();
    std::cout<<"Reference Count of reader->G
void MainWindow::showEvent(QShowEvent *event) { //渲染加载 if (!IsLoadVTK) { IsLoadVTK = true; ui->widVTK->renderWindow()->AddRenderer(renderer); iren->SetRenderWindow(ui->widVTK->renderWindow()); //坐标系设置 vtkori->SetInteractor(iren); vtkori->SetEnabled(1); vtkori->InteractiveOn(); //选择面功能加载 interstyle = vtkSmartPointer<PJPickerInteractorStyle>::New(); interstyle->SetDefaultRenderer(renderer); //iren->SetInteractorStyle(interstyle); } /*renderer = vtkSmartPointer<vtkRenderer>::New(); ui->vtkWidget->renderWindow()->AddRenderer(renderer); interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); ui->vtkWidget->renderWindow()->SetInteractor(interactor); interactor->SetRenderWindow(ui->vtkWidget->renderWindow()); interactor->Initialize();*/ // Add a predefined irregular closed shape for testing // 创建球体源 vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); //sphereSource->SetCenter(0.0, 0.0, 0.0); // 设置球心 //sphereSource->SetRadius(5.0); // 设置半径 sphereSource->SetThetaResolution(40); // 经度方向分辨率 sphereSource->SetPhiResolution(20); // 纬度方向分辨率 sphereSource->Update(); // 更新数据 // The Dijkistra interpolator will not accept cells that aren't triangles vtkPolyDataNormals* normal = vtkPolyDataNormals::New(); normal->SetInputData(sphereSource->GetOutput()); normal->SetComputePointNormals(true); normal->SetComputeCellNormals(true); normal->Update(); /*vtkSmartPointer<vtkSTLReader> myReaderSTL = vtkSmartPointer<vtkSTLReader>::New(); myReaderSTL->SetFileName(QString("H:\\stlFile\\stl\\heatedExchange\\cold.stl").toUtf8()); myReaderSTL->Update();*/ vtkPolyData* pd = normal->GetOutput(); interstyle->SetModel(pd); vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); sphereMapper->SetInputConnection(normal->GetOutputPort()); // 连接球体源 vtkSmartPointer<vtkActor> shapeActor = vtkSmartPointer<vtkActor>::New(); shapeActor->SetMapper(sphereMapper); shapeActor->GetProperty()->SetColor(0, 0.5, 0.8); // Teal color for better visibility shapeActor->GetProperty()->SetOpacity(0.5); // 设置透明度为0.5 shapeActor->GetProperty()->SetEdgeVisibility(true); // 设置透明度为0.5 shapeActor->GetProperty()->SetInterpolationToFlat(); // 设置透明度为0.5 renderer->AddActor(shapeActor); renderer->ResetCamera(); selectedPoints = vtkSmartPointer<vtkPoints>::New(); vtkNew<vtkContourWidget> contourWidget; contourWidget->SetCurrentRenderer(renderer); contourWidget->SetInteractor(iren); vtkOrientedGlyphContourRepresentation* rep = dynamic_cast<vtkOrientedGlyphContourRepresentation*>( contourWidget->GetRepresentation()); rep->GetLinesProperty()->SetColor(1, 0.2, 0); rep->GetLinesProperty()->SetLineWidth(3.0); vtkNew<vtkPolygonalSurfacePointPlacer> pointPlacer; pointPlacer->AddProp(shapeActor); pointPlacer->GetPolys()->AddItem(pd); rep->SetPointPlacer(pointPlacer); vtkSmartPointer<vtkPolygonalSurfaceContourLineInterpolator> interpolator = vtkSmartPointer<vtkPolygonalSurfaceContourLineInterpolator>::New(); interpolator->SetDistanceOffset(0.); interpolator->GetPolys()->AddItem(pd); rep->SetLineInterpolator(interpolator); iren->Initialize(); renderer->ResetCamera(); contourWidget->EnabledOn(); contourWidget->On(); renderer->Render(); //iren->Start(); // Set up point picker /* vtkSmartPointer<vtkPointPicker> picker = vtkSmartPointer<vtkPointPicker>::New(); picker->SetTolerance(0.01); iren->SetPicker(picker); vtkSmartPointer<vtkCallbackCommand> callback = vtkSmartPointer<vtkCallbackCommand>::New(); callback->SetCallback([](vtkObject* caller, long unsigned int eventId, void* clientData, void* callData) { MainWindow* self = static_cast<MainWindow*>(clientData); vtkPointPicker* picker = static_cast<vtkPointPicker*>(caller); double* pos = picker->GetPickPosition(); self->selectedPoints->InsertNextPoint(pos); if (self->selectedPoints->GetNumberOfPoints() > 2) { self->connectPoints(); self->fitSurface(); self->splitModel(); } }); callback->SetClientData(this); picker->AddObserver(vtkCommand::EndPickEvent, callback);*/ }为什么没有效果
10-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值