Shell文件(*.shl)是Adams的一种几何形状文件,外形全是由多边形(直线连接的节点组成)表示的。本文介绍一下Shell文件的读取方法,以及在OpenGL中的显示方法。

1. Shell文件格式

Shell文件现在有两个版本。

1.1 版本1的范例:

8 6 1.0
-1.0 -1.0 1.0
-1.0 1.0 1.0
1.0 1.0 1.0
1.0 -1.0 1.0
-1.0 -1.0 -1.0
-1.0 1.0 -1.0
1.0 1.0 -1.0
1.0 -1.0 -1.0
4 1 2 3 4
4 5 6 2 1
3 2 6 7
4 3 7 8 4
4 1 4 8 5
4 8 7 6 5

蓝色行中的第一个数字表示节点的个数,第二个是多边形的数量,第三个是缩放系数(一般情况下为1)。

红色行为每个节点的坐标。绿色行第一个数字为多边形节点的数目,剩下的为每个节点的编号,与红色部分节点的顺序相对应,节点编号是从1开始。

1.2 版本2的范例:

Version: 2
3559 1362 3559 1.000000
-0.020500 0.005692 -0.001418
-0.020500 0.006541 -0.002266
-0.020500 0.005692 -0.000797
-0.020500 0.005692 -0.000797
-0.020500 0.005692 -0.001418
13 14 18 22 27 28 24 20 15 10 6 4 8 12
3 236 71 1
3 33 1 71
5 121 118 110 112 116
15 70 74 76 83 101 104 106 98 95 91 93 88 86 81 79
-0.022787 -0.041839 0.998864
1.000000 -0.000000 0.000000
0.018219 0.496961 0.867581
0.000000 0.923962 0.382485
1.000000 -0.000000 0.000000

蓝色行中的第一个数字表示节点的个数,第二个是多边形的数量,第三个对应紫色行的数目,第四个是缩放系数(一般情况下为1)。

红色和绿色行与版本1的含义一致。紫色行的用处不清楚,Adams帮助文档中只介绍了版本1的格式。

2. 读取Shell文件

C#读取shell文件代码如下,输入变量path是shell文件的路径。

public static void DrawShell(string path)
{List<Vector3> points = new List<Vector3>(); //pointsList<List<int>> seqs = new List<List<int>>(); //sequencyList<Vector3> normals = new List<Vector3>(); int lineNumber = 0;//read shl fileif (!File.Exists(path)){MessageBox.Show("Cannot find the shell file");}string content = File.ReadAllText(path);string[] lines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);bool version2 = false;while (lines[lineNumber].Contains(":")){lineNumber++;version2 = true;}string[] numbers = lines[lineNumber].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);int ptNum = Convert.ToInt32(numbers[0]);int seqNum = Convert.ToInt32(numbers[1]);int normalNum;float scale;if (version2){normalNum = Convert.ToInt32(numbers[2]);scale = Convert.ToSingle(numbers[3]);}else{normalNum = 0;scale = Convert.ToSingle(numbers[2]);}for (int i = 0; i < ptNum; i++){string[] pt = lines[lineNumber + 1 + i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);if (pt.Count() == 3){points.Add(new Vector3(Convert.ToSingle(pt[0].Trim()) * scale,Convert.ToSingle(pt[1].Trim()) * scale,Convert.ToSingle(pt[2].Trim()) * scale));}else{points.Add(new Vector3(0f, 0f, 0f));}}for (int i = 0; i < seqNum; i++){string[] seq = lines[lineNumber + 1 + ptNum + i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);if (seq.Count() > 1){seqs.Add(seq.ToList().ConvertAll<int>(x => Convert.ToInt32(x)));}}/*if (normalNum > 0){for (int i = 0; i < normalNum; i++){string[] pt = lines[lineNumber + 1 + i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);if (pt.Count() == 3){normals.Add(new Vector3(Convert.ToDouble(pt[0].Trim()),Convert.ToDouble(pt[1].Trim()),Convert.ToDouble(pt[2].Trim())));}else{normals.Add(new Vector3d(0d, 0d, 0d));}}}*/foreach(List<int> seq in seqs){if (seq[0] > 2){List<Vector3> vertices = new List<Vector3>();seq.RemoveAt(0);foreach (int index in seq){vertices.Add(points[index - 1]);}//使用OpenGL显示每个多边形
            Tessellation.Triangulate(vertices);}}}

上面代码中的Tessellation.Triangulate(vertices),是使用Glu的网格化(Tessellation)显示形状。该Tessellation类的具体内容,见我的另一篇文章:OPENGL: 多边形网格化(tessellation) 。

下面是读取某个齿轮shell文件的显示结果:

C#读取Adams的Shell文件(*.shl)相关推荐

  1. .rpt文件内容读取java_linux第二天|shell文件/文件夹操作

    shell 文件/文件夹的命令 文件的操作可以分为:新建,移动,复制,删除,读取. 文件夹的操作可以分为:创建,删除,复制,移动. 这两者有部分命令是相通的,为了减少记忆的负担,这里只说一种能够共用的 ...

  2. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

  3. 读取/data/data/下文件或者数据库

    学习目标: 学习目标:读取/data/data/下文件或者数据库,Android 11读写权限动态申请 文章目录 学习目标: 前言 一.特殊权限是什么? 二.读取步骤 1.动静结合 2.读入数据 数据 ...

  4. Revit二次开发——独立进程内读取、写入Revit文件

    详解 不开启Revit,读取.写入Revit文件 要点:需要引入RevitNET.dll,RevitAddInUtility.dll和RevitAPI.dll三个dll到项目中 RevitAddInU ...

  5. shell文件编辑器之sed

    shell文件编辑器之sed 文章目录 shell文件编辑器之sed sed编辑器 使用sed查找(查) 使用sed删除(删) 使用sed进行替换(改) 使用sed进行插入(增) sed编辑器 sed ...

  6. 【OpenCV 4开发详解】保存和读取XML和YMAL文件

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. python读取大文件目录_Python读取系统文件夹内所有文件并统计数量的方法

    大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...

  8. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  9. pandas读取多个excel文件并拼接(append)起来形成最终的dataframe、与标签文件连接(join)形成最终学习数据集

    pandas读取多个excel文件并拼接(append)起来形成统一的dataframe.与标签文件(label)连接(join)形成最终学习数据集 使用到的pandas核心方法有append和joi ...

最新文章

  1. java中静态方法可以被继承_关于java:静态方法中的继承
  2. 5G到底有多块?刚刚5G商用牌照正式发布,一共 4 张!
  3. Java面试官:给Java面试者的八点建议
  4. 使用SeaJS实现模块化JavaScript开发
  5. 批量修改nginx配置文件
  6. “晶振”拍了拍你,“你知道我是如何工作的吗?”
  7. eclipse html tab宽度,Eclipse 设置Tab键为4个空格
  8. linux diff详解
  9. 使用windows 命令行创建一个空的文本文件
  10. 排便的快感--不是非主流
  11. 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
  12. 技嘉h310主板前置音频没声音_急死人!新装机箱前置音频没声音?不要急!一招轻松解决。...
  13. 工程计算——实战:追赶法扰动分析
  14. pytorch深度学习任务模板demo
  15. springboot 接入 cachecloud redis 实践
  16. orcale :SQL语句小测试select * from emp order by hiredate asc;
  17. 计算机内存加速,电脑内存运行速度如何提升
  18. Dell EMC PowerEdge R740 服务器的驱动程序和固件更新
  19. QIIME 2教程. 05粪菌移植分析练习Fecal microbiota transplant(2021.2)
  20. css如何设置不可点击?

热门文章

  1. 开源 java CMS - FreeCMS2.3 会员组管理
  2. android 反编译
  3. BZOJ3823 : 定情信物
  4. 汇总 Linux下获取详细硬件信息的工具:Dmidecode命令详解
  5. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法
  6. 5G/4G: 3GPP组织及协议版本的发展
  7. Tungsten Fabric SDN — 与 Bare Metal 的集成架构
  8. 韦东山 文件系统映像,mount挂接文件系统
  9. tomcat 之APR优化
  10. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)