C#读取Adams的Shell文件(*.shl)
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)相关推荐
- .rpt文件内容读取java_linux第二天|shell文件/文件夹操作
shell 文件/文件夹的命令 文件的操作可以分为:新建,移动,复制,删除,读取. 文件夹的操作可以分为:创建,删除,复制,移动. 这两者有部分命令是相通的,为了减少记忆的负担,这里只说一种能够共用的 ...
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...
- 读取/data/data/下文件或者数据库
学习目标: 学习目标:读取/data/data/下文件或者数据库,Android 11读写权限动态申请 文章目录 学习目标: 前言 一.特殊权限是什么? 二.读取步骤 1.动静结合 2.读入数据 数据 ...
- Revit二次开发——独立进程内读取、写入Revit文件
详解 不开启Revit,读取.写入Revit文件 要点:需要引入RevitNET.dll,RevitAddInUtility.dll和RevitAPI.dll三个dll到项目中 RevitAddInU ...
- shell文件编辑器之sed
shell文件编辑器之sed 文章目录 shell文件编辑器之sed sed编辑器 使用sed查找(查) 使用sed删除(删) 使用sed进行替换(改) 使用sed进行插入(增) sed编辑器 sed ...
- 【OpenCV 4开发详解】保存和读取XML和YMAL文件
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- python读取大文件目录_Python读取系统文件夹内所有文件并统计数量的方法
大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...
- Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)
Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录
- pandas读取多个excel文件并拼接(append)起来形成最终的dataframe、与标签文件连接(join)形成最终学习数据集
pandas读取多个excel文件并拼接(append)起来形成统一的dataframe.与标签文件(label)连接(join)形成最终学习数据集 使用到的pandas核心方法有append和joi ...
最新文章
- java中静态方法可以被继承_关于java:静态方法中的继承
- 5G到底有多块?刚刚5G商用牌照正式发布,一共 4 张!
- Java面试官:给Java面试者的八点建议
- 使用SeaJS实现模块化JavaScript开发
- 批量修改nginx配置文件
- “晶振”拍了拍你,“你知道我是如何工作的吗?”
- eclipse html tab宽度,Eclipse 设置Tab键为4个空格
- linux diff详解
- 使用windows 命令行创建一个空的文本文件
- 排便的快感--不是非主流
- 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
- 技嘉h310主板前置音频没声音_急死人!新装机箱前置音频没声音?不要急!一招轻松解决。...
- 工程计算——实战:追赶法扰动分析
- pytorch深度学习任务模板demo
- springboot 接入 cachecloud redis 实践
- orcale :SQL语句小测试select * from emp order by hiredate asc;
- 计算机内存加速,电脑内存运行速度如何提升
- Dell EMC PowerEdge R740 服务器的驱动程序和固件更新
- QIIME 2教程. 05粪菌移植分析练习Fecal microbiota transplant(2021.2)
- css如何设置不可点击?