VTK绘制螺钉螺纹线

需要在ct三视图上画出来螺钉的每个截面。螺钉的长度和直径都不确定,需要动态调整。
本来计划用一个画好的螺钉缩放,任意拖拽时候变形严重。干脆直接画吧。

效果

项目地址

用现成的vtkSphereSource改的

  • 案例 vtkSphereSource
  • 修改后工程 https://github.com/BeyondXinXin/study_vtk

原文

VTK绘制螺钉螺纹线

实现

设定一些参数,计算螺纹线。

class VtkPedicleScrewSource : public vtkPolyDataAlgorithm
{public:static VtkPedicleScrewSource * New();vtkTypeMacro(VtkPedicleScrewSource, vtkPolyDataAlgorithm);void PrintSelf(ostream & os, vtkIndent indent) override;vtkSetMacro(Subdivision, int);vtkGetMacro(Subdivision, int);vtkSetMacro(TopR, double);vtkGetMacro(TopR, double);vtkSetMacro(Length, double);vtkGetMacro(Length, double);vtkSetMacro(V, double);vtkGetMacro(V, double);vtkSetMacro(D, double);vtkGetMacro(D, double);vtkSetMacro(BottonmR, double);vtkGetMacro(BottonmR, double);vtkSetMacro(Chamfering, double);vtkGetMacro(Chamfering, double);vtkSetMacro(Ascending, double);vtkGetMacro(Ascending, double);vtkSetMacro(GuideHeight, double);vtkGetMacro(GuideHeight, double);vtkSetMacro(PedicleRotateX, double);vtkGetMacro(PedicleRotateX, double);vtkSetMacro(PedicleTranslateX, double);vtkGetMacro(PedicleTranslateX, double);vtkSetMacro(PedicleTranslateY, double);vtkGetMacro(PedicleTranslateY, double);vtkSetMacro(PedicleTranslateZ, double);vtkGetMacro(PedicleTranslateZ, double);vtkSetStringMacro(PedicleFileName);vtkGetStringMacro(PedicleFileName);protected:VtkPedicleScrewSource(int res = 6);~VtkPedicleScrewSource() override;int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override;protected: // 遵循vtk命名int OutputPointsPrecision;int Subdivision = 40; // 每一圈螺纹细分数量double TopR = 3.0; // 圆台顶部半径double Length = 55.0; // 总长度double V = 0.06; // 螺旋线前进速度double D = 0.5; // 螺纹宽度double BottonmR = 1.0; // 圆台底部半径double Chamfering = 0.3; // 螺纹倒角double Ascending = 0.3; // 螺栓倒角double GuideHeight = 150; // 引导线高度// 模型坐标系乱选的,让他们最后重新提供吧double PedicleRotateX = 180;double PedicleTranslateX = -5;double PedicleTranslateY = 7;double PedicleTranslateZ = 18;char * PedicleFileName; // 椎弓根名称private:VtkPedicleScrewSource(const VtkPedicleScrewSource &) = delete;void operator=(const VtkPedicleScrewSource &) = delete;
};int VtkPedicleScrewSource::RequestData(vtkInformation * vtkNotUsed(request),vtkInformationVector ** vtkNotUsed(inputVector),vtkInformationVector * outputVector)
{vtkInformation * outInfo = outputVector->GetInformationObject(0);vtkPolyData * output = vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));//std::vector<int> triangle_cell {0, 2, 6, 0, 4, 6, 1, 3, 7, 1, 5, 7,0, 1, 5, 0, 4, 5, 2, 3, 7, 2, 6, 7,0, 1, 3, 0, 2, 3, 0, 1, 5, 0, 4, 5,0, 2, 6, 0, 4, 6, 2, 3, 7, 2, 6, 7,1, 5, 0, 3, 7, 0};// 螺钉---螺纹vtkNew<vtkPolyData> screw_1;vtkNew<vtkPoints> points_1;vtkNew<vtkCellArray> cells_1;vtkNew<vtkTriangle> trianle;double Omega = M_PI * 2.0 / Subdivision; // 角速度double H = (Length - 16) * TopR / (TopR - BottonmR); // 圆锥高度vtkIdType number = static_cast<vtkIdType>(H * (TopR - BottonmR) / (V * TopR)); // 螺旋线点总数int begin_t = static_cast<int>(H * BottonmR / (V * TopR)); // 螺旋线起始时间(圆台底部)// 螺钉---螺纹---四条螺旋线 pointsfor (int i = 0; i < number; i++) {int T = begin_t + i;double x = TopR * V * T / H * cos(Omega * T);double y = TopR * V * T / H * sin(Omega * T);double z = V * T + Ascending;points_1->InsertNextPoint(x, y, z);z -= D + Ascending * 2;points_1->InsertNextPoint(x, y, z);if (i < Subdivision * 2) {x += TopR * cos(Omega * T) * (1 - V * T / H) * (i + 1) / (Subdivision * 2);y += TopR * sin(Omega * T) * (1 - V * T / H) * (i + 1) / (Subdivision * 2);} else {x = TopR * cos(Omega * T);y = TopR * sin(Omega * T);}z = V * T;points_1->InsertNextPoint(x, y, z);z -= D;points_1->InsertNextPoint(x, y, z);}// 螺钉---螺纹---螺纹 cellsfor (int i = 0; i < number * 4 - 4; i = i + 4) {for (unsigned long long j = 0; j < 8; j++) {trianle->GetPointIds()->SetId(0, i + triangle_cell.at(j * 3 + 0));trianle->GetPointIds()->SetId(1, i + triangle_cell.at(j * 3 + 1));trianle->GetPointIds()->SetId(2, i + triangle_cell.at(j * 3 + 2));cells_1->InsertNextCell(trianle);}}screw_1->SetPoints(points_1);screw_1->SetPolys(cells_1);// 螺钉---圆台vtkNew<vtkPolyData> screw_2;vtkNew<vtkPoints> points_2;vtkNew<vtkCellArray> cells_2;for (int i = 0; i < Subdivision; i++) {double x = BottonmR * cos(Omega * i);double y = BottonmR * sin(Omega * i);double z = V * begin_t - Ascending - D;points_2->InsertNextPoint(x, y, z);x = (BottonmR - Chamfering) * cos(Omega * i);y = (BottonmR - Chamfering) * sin(Omega * i);z -= Chamfering;points_2->InsertNextPoint(x, y, z);x = TopR * cos(Omega * i);y = TopR * sin(Omega * i);z = V * (static_cast<double>(begin_t + number)) + Ascending;points_2->InsertNextPoint(x, y, z);x = (TopR - Chamfering) * cos(Omega * i);y = (TopR - Chamfering) * sin(Omega * i);z += Chamfering;points_2->InsertNextPoint(x, y, z);}double x = BottonmR * cos(Omega * 0);double y = BottonmR * sin(Omega * 0);double z = V * begin_t - Ascending - D;points_2->InsertNextPoint(x, y, z);x = (BottonmR - Chamfering) * cos(Omega * 0);y = (BottonmR - Chamfering) * sin(Omega * 0);z -= Chamfering;points_2->InsertNextPoint(x, y, z);x = TopR * cos(Omega * 0);y = TopR * sin(Omega * 0);z = V * (static_cast<double>(begin_t + number)) + Ascending;points_2->InsertNextPoint(x, y, z);x = (TopR - Chamfering) * cos(Omega * 0);y = (TopR - Chamfering) * sin(Omega * 0);z += Chamfering;points_2->InsertNextPoint(x, y, z);points_2->InsertNextPoint(0, 0, V * begin_t - Ascending - Chamfering - D);points_2->InsertNextPoint(0, 0, V * (static_cast<double>(begin_t + number)) + Ascending + Chamfering);for (unsigned long long j = 8; j < 10; j++) {trianle->GetPointIds()->SetId(0, triangle_cell.at(j * 3 + 0));trianle->GetPointIds()->SetId(1, triangle_cell.at(j * 3 + 1));trianle->GetPointIds()->SetId(2, triangle_cell.at(j * 3 + 2));cells_2->InsertNextCell(trianle);}for (int i = 0; i < Subdivision; i++) {vtkIdType offset = i * 4;for (unsigned long long j = 10; j < 16; j++) {trianle->GetPointIds()->SetId(0, offset + triangle_cell.at(j * 3 + 0));trianle->GetPointIds()->SetId(1, offset + triangle_cell.at(j * 3 + 1));trianle->GetPointIds()->SetId(2, offset + triangle_cell.at(j * 3 + 2));cells_2->InsertNextCell(trianle);}trianle->GetPointIds()->SetId(0, offset + triangle_cell.at(16 * 3 + 0));trianle->GetPointIds()->SetId(1, offset + triangle_cell.at(16 * 3 + 1));trianle->GetPointIds()->SetId(2, (Subdivision + 1) * 4);cells_2->InsertNextCell(trianle);trianle->GetPointIds()->SetId(0, offset + triangle_cell.at(17 * 3 + 0));trianle->GetPointIds()->SetId(1, offset + triangle_cell.at(17 * 3 + 1));trianle->GetPointIds()->SetId(2, (Subdivision + 1) * 4 + 1);cells_2->InsertNextCell(trianle);}screw_2->SetPoints(points_2);screw_2->SetPolys(cells_2);// 螺钉vtkNew<vtkAppendPolyData> screw_append;screw_append->AddInputData(screw_2);screw_append->AddInputData(screw_1);vtkNew<vtkTransform> screw_translation;screw_translation->Translate(0, 0, -1 * (V * (static_cast<double>(begin_t + number)) + Ascending + Chamfering));vtkNew<vtkTransformPolyDataFilter> screw_transform;screw_transform->SetInputConnection(screw_append->GetOutputPort());screw_transform->SetTransform(screw_translation);// 椎弓根vtkNew<vtkPolyData> pedicle;vtkNew<vtkSTLReader> pedicle_reader;pedicle_reader->SetFileName(PedicleFileName);vtkNew<vtkTransform> pedicle_translation;pedicle_translation->Translate(PedicleTranslateX, PedicleTranslateY, PedicleTranslateZ);pedicle_translation->RotateX(PedicleRotateX);vtkNew<vtkTransformPolyDataFilter> pedicle_transform;pedicle_transform->SetInputConnection(pedicle_reader->GetOutputPort());pedicle_transform->SetTransform(pedicle_translation);// 引导线vtkNew<vtkCylinderSource> guide_line;guide_line->SetHeight(GuideHeight);guide_line->SetCenter(0, -0.5 * GuideHeight, 0);guide_line->SetRadius(0.2);vtkNew<vtkTransform> guide_translation;guide_translation->RotateX(-90);vtkNew<vtkTransformPolyDataFilter> guide_transform;guide_transform->SetInputConnection(guide_line->GetOutputPort());guide_transform->SetTransform(guide_translation);// 组合vtkNew<vtkAppendPolyData> out_append;out_append->AddInputConnection(screw_transform->GetOutputPort());out_append->AddInputConnection(pedicle_transform->GetOutputPort());out_append->AddInputConnection(guide_transform->GetOutputPort());// 螺栓是按照 xy->z 画的,显示是xz->yout_append->Update();double center[3];out_append->GetOutput()->GetCenter(center);vtkNew<vtkTransform> out_translation;out_translation->PostMultiply();out_translation->Translate(0, 0, center[2]);out_translation->RotateX(90);out_translation->Translate(0, center[2], 0);out_translation->Translate(0, -Length + 16 - 2 * D - Chamfering - Ascending, 0);vtkNew<vtkTransformPolyDataFilter> out_transform;out_transform->SetInputConnection(out_append->GetOutputPort());out_transform->SetTransform(out_translation);out_transform->Update();output->DeepCopy(out_transform->GetOutput());return 1;
}

使用

int main(int argc, char *argv[])
{QApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity);QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);QApplication a(argc, argv);vtkNew<VtkPedicleScrewSource> poly_data;{ // 选填poly_data->SetSubdivision(40); // 每一圈螺纹细分数量poly_data->SetTopR(3.0); // 圆台顶部半径poly_data->SetLength(56.0); // 圆锥高度(不是圆台高度)poly_data->SetV(0.06); // 螺旋线前进速度poly_data->SetD(0.5); // 螺纹宽度poly_data->SetBottonmR(1.0); // 圆台底部半径poly_data->SetChamfering(0.3); // 螺纹倒角poly_data->SetAscending(0.3); // 螺栓倒角poly_data->SetGuideHeight(150); // 引导线高度// 模型坐标系乱选的,让他们最后重新提供吧poly_data->SetPedicleRotateX(180);poly_data->SetPedicleTranslateX(-5);poly_data->SetPedicleTranslateY(7);poly_data->SetPedicleTranslateZ(18);}{ // 必填poly_data->SetPedicleFileName("./etc/Pedicle_screw.STL"); // 椎弓根文件名称}std::cout << *poly_data << std::endl;poly_data->Update();ShowVtkDebugPolydata(poly_data->GetOutput());return 0;
}

VTK绘制螺钉螺纹线相关推荐

  1. Solidworks如何绘制装饰螺纹线

    1 插入-注解,装饰螺纹线 2 绘制装饰螺纹线,选择螺纹的边线,标准选择ISO,下面可以选择的范围就确定了(M6的孔,只能选择M8的螺纹或者M10的螺纹),画好之后在3D图中并没有明确的螺纹样式 3 ...

  2. 【SOLIDWORKS-详细记录】测量方法、设置草图自动正视基准面、设置滚轮放大缩小方向、螺丝添加螺纹线等操作记录

    主题 本博文记录了SOLIDWORKS一些常用操作的操作步骤. 包括如下 主题 设置草图自动正视基准面 软件放大缩小滚轮反直觉 重建模型 导致厚度为0的几何体错误解决方法 添加材质 测量方法: 3d打 ...

  3. python 一张图画多条线_Gnuplot.py在一张图上绘制多条线

    我目前正试图使用gnuplot py从文本文件中绘制多行.我可以分别绘制两条线,但当我试图在同一个图上绘制它们时,它只绘制一条线.在 这是我的代码:#!/usr/bin/env python impo ...

  4. Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和?

    Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和? 1. 效果图 2. 源码 参考 上一篇博客介绍了Python访问街区所有节点最短路径问题,并结合matplotlib可视化 ...

  5. 使用Python,OpenCV进行涂鸦(绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头~)

    使用Python,OpenCV进行涂鸦(绘制文字.线.圆.矩形.椭圆.多边形轮廓.多边形填充.箭头) 1. 效果图 2. 原理 2.1 绘制线:cv2.line(canvas, (300, 0), ( ...

  6. Swift3实现的绘制股票K线库, FastImageCache提升图片的加载和渲染速度,Chameleon颜色框架

    代码1:用Swift3实现的绘制股票K线库 for iOS & macOS 代码地址:网页链接 代码2:FastImageCache是Path团队开发的一个开源库,用于提升图片的加载和渲染速度 ...

  7. threejs 绘制球体_ThreeJs 绘制点、线、面

    所有的三位物体都是由点构成,两点构成线,三点构成面,ThreeJs又如何绘制出点.线.面呢 ? 在ThreeJs中: 模型由几何体和材质构成 模型以何种形式(点.线.面)展示取决于渲染方式 1. 几何 ...

  8. R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间、将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间

    R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间.将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间(duration of an act ...

  9. R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间、将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间、适应时间段跨越多天的情况

    R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间.将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间.适应时间段跨越多天的情况(例如,当天 ...

最新文章

  1. 210328卡式水分开阶段总结
  2. 全美第二的机器人项目核心数学课免费开放,院长亲自授课,作业讲义全同步...
  3. python flask 跨域问题 解决方法
  4. 机器学习小抄.pdf(像背托福单词一样理解机器学习)
  5. How to change the text color in the terminal
  6. 一天一个设计模式之JS实现——建造者模式
  7. sklearn 决策树例子_使用 sklearn 构建决策树并使用 Graphviz 绘制树结构
  8. java访问微信接口发送消息
  9. JS流程控制语句 重复重复(for循环)语句结构: for(初始化变量;循环条件;循环迭代) { 循环语句 }...
  10. 5个很牛的黑科技网站分享
  11. 考研必备数学公式大全(数学二)(线性代数篇)
  12. linux的4k播放器,【Linux1GB4K(3840*2160)电视播放器】Linux1GB4K(3840*2160)电视播放器报价及图片大全-列表版-ZOL中关村在线...
  13. 微信推送封面尺寸_微信公众平台图片尺寸是多少?
  14. 将应用程序设置可信任(在win10操作系统)
  15. 2021年第六届数维杯B题 中小城市地铁运营与建设优化设计
  16. 002_wz_kaggle泰坦尼克号深度学习实现
  17. JAVA数据加密压缩传输给服务端(Gzip加AES)
  18. 家用宽带的上传和下载速度
  19. 《回忆之前,忘记之后---写给我记忆中的汪峰》
  20. PyTorch学习教程、手册

热门文章

  1. C语言中的char用法
  2. Motorola RSD Lite刷机详细图文教程
  3. do while(0)的作用
  4. CCF_Java_201612-2_工资计算
  5. c++重载函数的条件
  6. android自定义排班,Android实现一周时间早中晚排班表
  7. 二进制与8,10,16转换
  8. Spinach和发牌姬
  9. Bzoj4766 文艺计算姬
  10. python 程序运行计时 动态_python中time库clock 使用Python,实现程序运行计时的数码管表示...