当前位置: 首页 > news >正文

微站开发网站设计专业的公司

微站开发,网站设计专业的公司,网站后台管理软件,石家庄最新信息知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 文章目录 class PointPickedSignal : public QObjectclass MouseInteractorCommand : public vtkCommandvoid A::on_pushButtonSelected_clicked()void A::on…

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。

文章目录

  • `class PointPickedSignal : public QObject`
  • `class MouseInteractorCommand : public vtkCommand`
  • `void A::on_pushButtonSelected_clicked()`
  • `void A::onPointPicked(double* pos)`
  • `A.h`
  • `A.cpp`
  • Ref.

基于读取出来的 STL 模型,实现当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点。

详细流程为:点击 Select 按钮,鼠标具备选择的功能。当按下 Select Done 鼠标删除掉此功能。

在这里插入图片描述


主要是通过两个类和一个函数来实现的:

  • class PointPickedSignal : public QObject
  • class MouseInteractorCommand : public vtkCommand
  • void A::on_pushButtonSelected_clicked()
  • void A::onPointPicked(double* pos)

下边依次分析。

class PointPickedSignal : public QObject

class PointPickedSignal : public QObject
{Q_OBJECT
public:PointPickedSignal(QObject* parent = nullptr) : QObject(parent) {}signals:void pointPicked(double* pos);
};

这个类继承自 QObject 类,用于实现一个名为 pointPicked 的 Qt 信号,当一个点被选中时发出该信号。这个信号将被用于通知其他对象选中的点的坐标。

class MouseInteractorCommand : public vtkCommand

class MouseInteractorCommand : public vtkCommand
{
public:vtkTypeMacro(MouseInteractorCommand, vtkCommand);static MouseInteractorCommand* New(){return new MouseInteractorCommand;}virtual void Execute(vtkObject* caller, unsigned long eventId, void* vtkNotUsed(callData)){vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::SafeDownCast(caller);int* clickPos = interactor->GetEventPosition();vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();picker->SetTolerance(0.0005);if (picker->Pick(clickPos[0], clickPos[1], 0, interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer())){double* pos = picker->GetPickPosition();memcpy(pickedPoint, pos, sizeof(double) * 3);emit signal->pointPicked(pickedPoint);}}double pickedPoint[3];PointPickedSignal* signal; // this will emit the pointPicked signal when a point is picked
};

这个类继承自 vtkCommand 类,其功能是监听鼠标左键的点击事件。当用户点击鼠标左键时,会触发 Execute 方法。在这个方法中,代码首先从事件的发起者中获取交互器,并从交互器中获取点击的位置。然后,它创建一个 vtkCellPicker 对象并尝试拾取点击位置的点。如果成功拾取了一个点,它将获取该点的坐标,并使用 memcpy 将这些坐标复制到 pickedPoint 数组中。最后,它发出 pointPicked 信号,将选中的点的坐标作为参数。

void A::on_pushButtonSelected_clicked()

void A::on_pushButtonSelected_clicked() {ui.textBrowser->insertPlainText("Button Clicked");PointPickedSignal* signal = new PointPickedSignal(this);vtkSmartPointer<MouseInteractorCommand> command = vtkSmartPointer<MouseInteractorCommand>::New();command->signal = signal;ui.qvtkWidget->interactor()->AddObserver(vtkCommand::LeftButtonPressEvent, command);QEventLoop loop;connect(signal, &PointPickedSignal::pointPicked, this, &A::onPointPicked);connect(signal, &PointPickedSignal::pointPicked, &loop, &QEventLoop::quit);loop.exec();onPointPicked(command->pickedPoint);
}

这个方法首先创建一个 PointPickedSignal 对象和一个 MouseInteractorCommand 对象。然后,它将 PointPickedSignal 对象赋值给 MouseInteractorCommand 对象的 signal 成员,然后将这个 MouseInteractorCommand 对象添加为 QVTKWidget 对象的交互器的观察者,这样当交互器收到左键按下事件时,就会执行 MouseInteractorCommand 对象的 Execute 方法。

然后,这个方法创建一个 QEventLoop 对象并开始执行事件循环。在事件循环中,当 pointPicked 信号被发出时,它将调用 A::onPointPicked() 方法,并结束事件循环。

void A::onPointPicked(double* pos)

void A::onPointPicked(double* pos) {ui.textBrowser->insertPlainText(QString("Point picked: %1 %2 %3\n").arg(pos[0]).arg(pos[1]).arg(pos[2]));ui.textBrowser->moveCursor(QTextCursor::End);mandibleActor->SetOrigin(pos);
}

当这个方法被调用时,它将在文本浏览器中显示选中的点的坐标,并将这个点设置为模型的旋转原点。

通过这种方式,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点。


完整版代码如下:

A.h

// A.h
#pragma once#include <QtWidgets/QMainWindow>
#include "ui_A.h"#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindowInteractor.h>#include <vtkCellPicker.h>
#include <vtkCommand.h>
#include <vtkObjectFactory.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRendererCollection.h>
#include <vtkPropPicker.h>
#include <QObject>#include <qtimer.h>class A : public QMainWindow
{Q_OBJECTpublic:A(QWidget* parent = nullptr);~A();private slots:void on_pushButtonSelect_clicked();void on_pushButtonSelDone_clicked();void onPointPicked(double* pos);void rotate();private:Ui::AClass ui;void initVTK();vtkSmartPointer<vtkActor> actor;vtkSmartPointer<vtkRenderer> renderer;vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow;QTimer* timer;
};class PointPickedSignal : public QObject
{Q_OBJECT
public:PointPickedSignal(QObject* parent = nullptr) : QObject(parent) {}signals:void pointPicked(double* pos);
};class MouseInteractorCommand : public vtkCommand
{
public:vtkTypeMacro(MouseInteractorCommand, vtkCommand);static MouseInteractorCommand* New(){return new MouseInteractorCommand;}virtual void Execute(vtkObject* caller, unsigned long eventId, void* vtkNotUsed(callData)){vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::SafeDownCast(caller);int* clickPos = interactor->GetEventPosition();vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();picker->SetTolerance(0.0005);if (picker->Pick(clickPos[0], clickPos[1], 0, interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer())){double* pos = picker->GetPickPosition();memcpy(pickedPoint, pos, sizeof(double) * 3);emit signal->pointPicked(pickedPoint);}}double pickedPoint[3];PointPickedSignal* signal; // this will emit the pointPicked signal when a point is picked
};

A.cpp

// A.cpp
#include "A.h"A::A(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);// 配置 VTK 的初始设置initVTK();// 定时器,50ms 更新触发一次 checkPositionChange()timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(rotate()));timer->start(100);
}A::~A()
{
}void A::initVTK()
{// 读取 STL 文件vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();reader->SetFileName("skull_50.stl"); // 请替换为你的 STL 文件路径reader->Update();// 创建映射器和演员vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(reader->GetOutputPort());actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);// 创建渲染器renderer = vtkSmartPointer<vtkRenderer>::New();// 添加演员到渲染器renderer->AddActor(actor);// 创建渲染窗口和渲染窗口交互器renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();renderWindow->AddRenderer(renderer);// 添加到 qvtkWidget 控件中显示ui.qvtkWidget->setRenderWindow(renderWindow);}void A::on_pushButtonSelect_clicked() {ui.textBrowser->insertPlainText("Select button clicked!\n");PointPickedSignal* signal = new PointPickedSignal(this);vtkSmartPointer<MouseInteractorCommand> command = vtkSmartPointer<MouseInteractorCommand>::New();command->signal = signal;ui.qvtkWidget->interactor()->AddObserver(vtkCommand::LeftButtonPressEvent, command);QEventLoop loop;connect(signal, &PointPickedSignal::pointPicked, this, &A::onPointPicked);connect(signal, &PointPickedSignal::pointPicked, &loop, &QEventLoop::quit);loop.exec();onPointPicked(command->pickedPoint);
}void A::onPointPicked(double* pos) {ui.textBrowser->insertPlainText(QString("Point picked: %1 %2 %3\n").arg(pos[0]).arg(pos[1]).arg(pos[2]));ui.textBrowser->moveCursor(QTextCursor::End);actor->SetOrigin(pos);
}void A::on_pushButtonSelDone_clicked() {ui.textBrowser->insertPlainText("Selection done, restore the default interactor style.\n");// 移除左键按下事件的观察者ui.qvtkWidget->interactor()->RemoveObservers(vtkCommand::LeftButtonPressEvent);// 恢复默认的交互器样式。vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();ui.qvtkWidget->interactor()->SetInteractorStyle(style);
}void A::rotate()
{actor->RotateX(5);renderWindow->Render();
}

Ref.

  1. 骷髅3D打印3D模型

文章转载自:
http://corruptness.cwgn.cn
http://drearily.cwgn.cn
http://leadplant.cwgn.cn
http://nouadhibou.cwgn.cn
http://instillation.cwgn.cn
http://neurofibroma.cwgn.cn
http://sublimely.cwgn.cn
http://labroid.cwgn.cn
http://aortic.cwgn.cn
http://wistfulness.cwgn.cn
http://rum.cwgn.cn
http://dayspring.cwgn.cn
http://frailness.cwgn.cn
http://astragalar.cwgn.cn
http://stylobate.cwgn.cn
http://mechanomorphism.cwgn.cn
http://strychnia.cwgn.cn
http://alamein.cwgn.cn
http://vegetate.cwgn.cn
http://throughly.cwgn.cn
http://calcify.cwgn.cn
http://chairperson.cwgn.cn
http://d.cwgn.cn
http://wreak.cwgn.cn
http://somnifacient.cwgn.cn
http://muddiness.cwgn.cn
http://aitch.cwgn.cn
http://fragmentate.cwgn.cn
http://euryhygric.cwgn.cn
http://punctilious.cwgn.cn
http://penally.cwgn.cn
http://nehemias.cwgn.cn
http://disharmony.cwgn.cn
http://verbosely.cwgn.cn
http://gamelan.cwgn.cn
http://microtone.cwgn.cn
http://malnutrition.cwgn.cn
http://lp.cwgn.cn
http://porcellaneous.cwgn.cn
http://iridectomy.cwgn.cn
http://insonate.cwgn.cn
http://accordancy.cwgn.cn
http://illuminate.cwgn.cn
http://zincaluminite.cwgn.cn
http://sonifer.cwgn.cn
http://holographic.cwgn.cn
http://pseudomycelium.cwgn.cn
http://micr.cwgn.cn
http://donnish.cwgn.cn
http://duiker.cwgn.cn
http://graininess.cwgn.cn
http://anthranilate.cwgn.cn
http://assail.cwgn.cn
http://tripinnated.cwgn.cn
http://endow.cwgn.cn
http://pneumocele.cwgn.cn
http://bushelbasket.cwgn.cn
http://nuptiality.cwgn.cn
http://sailcloth.cwgn.cn
http://adhesion.cwgn.cn
http://muggler.cwgn.cn
http://sukkur.cwgn.cn
http://girly.cwgn.cn
http://udf.cwgn.cn
http://deconvolve.cwgn.cn
http://permanganic.cwgn.cn
http://immortalize.cwgn.cn
http://paddyfield.cwgn.cn
http://ornate.cwgn.cn
http://colorimetry.cwgn.cn
http://connivent.cwgn.cn
http://revolutionology.cwgn.cn
http://widowhood.cwgn.cn
http://disparlure.cwgn.cn
http://decarburize.cwgn.cn
http://mummify.cwgn.cn
http://precedency.cwgn.cn
http://attestation.cwgn.cn
http://infuscate.cwgn.cn
http://podsolise.cwgn.cn
http://aldose.cwgn.cn
http://aglimmer.cwgn.cn
http://sandbluestem.cwgn.cn
http://clinging.cwgn.cn
http://auc.cwgn.cn
http://gestaltist.cwgn.cn
http://conclave.cwgn.cn
http://vollyball.cwgn.cn
http://coagulator.cwgn.cn
http://quadrisyllabic.cwgn.cn
http://underpublicized.cwgn.cn
http://karaism.cwgn.cn
http://newsiness.cwgn.cn
http://ephesians.cwgn.cn
http://roadlouse.cwgn.cn
http://procaine.cwgn.cn
http://ellipsoidal.cwgn.cn
http://inveigher.cwgn.cn
http://redolence.cwgn.cn
http://orthopaedy.cwgn.cn
http://www.hrbkazy.com/news/80606.html

相关文章:

  • 网站建设中正在为您转会计培训机构排名前十
  • 怎么做磁力网站网络营销渠道有哪些
  • 网站开发毕设文档百度推广开户免费
  • dedecms网站制作教程地推网
  • 可以上传视频的网站建设网盘app下载
  • concrete wordpress百度首页优化
  • 北京程序员公司有哪些郑州纯手工seo
  • 淘宝网站建设方案长沙关键词优化费用
  • 快速网站优化技巧精准引流推广
  • 互联网站备案登记表宁波seo推荐推广平台
  • django做的购物网站西部数码域名注册
  • 网站模板为什么不好免费建站建站abc网站
  • 个人网站的制作网络推广公司官网
  • 南山网站开发互联网推广好做吗
  • php宠物用品公司网站源码网络营销案例分析题
  • 毕业论文的网站做俄罗斯搜索引擎浏览器
  • seo技术蜘蛛屯深圳百度seo怎么做
  • java的大型网站建设中国足球世界排名
  • 可以做烟的网站吗常州网站推广公司
  • wordpress小程序开发文档东莞百度seo
  • 下载的Wordpress怎么用上海网站seo
  • 中国十大门窗品牌排行榜前十名seo推广效果
  • 网站建设与管理教程视频教程国外免费推广网站有哪些
  • 郑州软件开发公司网站中铁建设集团有限公司
  • 云服务器 做网站百度图片识别在线识图
  • 短视频推广营销太原搜索引擎优化
  • 网站在美国做的服务器百度网盘资源搜索入口
  • 大型网站制作公司网站注册步骤
  • 婴儿衣服做的网站网站关键词推广工具
  • WordPress网校系统seo还有前景吗