cadToWeb3D
DWG格式无法在网页中直接使用的原因是因为DWG是AutoCAD的专有格式,不是网页所支持的标准图形格式。要在网页中显示DWG文件,需要将其转换为网页支持的格式,如SVG、PNG或JPEG等。
该文采用的技术路线为 nodejs + dwg—>dxf
1. 目标
2. dwg转dxf(前置条件)
2.1 相关软件ODA DWG-DXF CONVERTER
2.1.1 linux版本
命令行:
doudou@doudou-Virtual-Machine:~$ './dwgToDxf.AppImage' ./dwg ./dxf/ ACAD2018 DXF 0 0
2.1.2 window版本
命令行:
C:\Users\PC001>D:/ODAFileConverter.exe C:/Users/PC001/Desktop/dwg/ C:/Users/PC001/Desktop/dxf/ ACAD2018 DXF 0 0
3. dxf 读取
3.1 npm 安装 dxf
命令行:
npm i dxf
3.2 获取dxf数据
import * as dxf from "dxf";
function loadFile(url) {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function () {
if (xhr.status === 200) {
const helper = new dxf.Helper(xhr.response);
//json格式
console.log(helper.parsed, 'json格式');
//svg 格式
console.log('parsed:', helper.toSVG())
//webgl 所用格式
console.log('polylines:', helper.toPolylines())
} else {
console.error('Failed to load SVG file.');
}
};
xhr.send();
}
//其他格式请参考 npm i sharp
3.3 显示svg格式
const svgElement = document.createElement('div');
svgElement.className = 'svgbox';
svgElement.innerHTML = helper.toSVG();
let dom = document.getElementById('app')
dom.appendChild(svgElement);
4. 3D接入校验
4.1 实体类型解析
4.2 辅助函数
4.2.1 样条线函数
函数首先对输入进行验证,确保t的值在合理范围内,degree的值大于等于1且小于等于控制点的个
数减1,结点数组的长度与控制点数量加阶数加1相等。然后根据输入的参数计算B样条曲线在给定
参数t处的坐标。
函数接受的参数包括:
- t:表示曲线上的参数值,范围在0到1之间。
- degree:样条曲线的阶数,用于控制曲线的平滑程度。阶数越高,曲线越平滑。
- points:包含控制点的数组,用于定义B样条曲线的形状。
- knots:结点数组,用于定义曲线在哪些点上是可控的。如果没有提供结点数组,则默认使用等间
- 距的结点。
- weights:控制点的权重数组,用于指定每个控制点对曲线形状的影响程度。如果没有提供权重数
组,则默认将所有控制点的权重设置为1。
具体计算过程如下:
-
获取控制点的个数n和每个控制点的维度d。
-
如果没有提供权重数组,则创建一个长度为n的权重数组,所有元素初始化为1。
-
如果没有提供结点数组,则创建一个长度为n+degree+1的结点数组,元素初始化为等间距的值。
-
根据给定的t值,将其映射到曲线定义的域上,并进行范围检查和边界处理。
-
根据给定的t值和控制点数量,找到曲线所在的曲线段。
-
将控制点转换为同质坐标系下的坐标,同时乘以对应的权重。
-
使用B样条曲线的算法,通过迭代计算得到曲线在给定t值处的坐标。
-
将计算得到的曲线坐标转换为笛卡尔坐标系下的坐标,并使用函数对坐标进行四舍五入。
-
返回计算得到的曲线坐标作为函数的结果。
4.2.2 指数位四舍五入
该函数是一个数学计算函数,用于对一个数值进行指定位数的四舍五入操作。具体步骤如下:
-
如果给定的指数exp为undefined或0,则直接对数值value进行四舍五入操作,并返回结果。
-
将输入的value和exp转换为数字类型。
-
如果value不是数字或exp不是整数,则返回NaN。
-
将value转换为科学计数法的形式,然后对值部分进行四舍五入操作。
-
将步骤4中得到的结果再转换回原来的格式。
-
将步骤4中得到的结果转换为数字类型,并返回最终的四舍五入后的值。
该函数的作用是通过使用科学计数法来实现对数值进行指定位数的四舍五入操作。
5. 增量数据校验
该图为对源数据进行多次修改的结果
图一:由ODAFileConverter转化后的dxf格式
图二:CAD 原生导出dxf格式
5.0 结构映射
5.0.1 DXFStructure
| 属性名 | 类型 | 描述 |
|---|---|---|
| header | String | DXF文件的头部信息 |
| tables | DXFTables | DXF文件的表格 |
| blocks | DXFBlocks | DXF文件的块定义 |
| entities | DXFEntities | DXF文件的实体 |
| objects | DXFObjects | DXF文件的对象 |
5.0.2 DXFTables
| 属性名 | 类型 | 描述 |
|---|---|---|
| ltype | DXFTable | 线型表格 |
| layer | DXFTable | 图层表格 |
| style | DXFTable | 样式表格 |
| view | DXFTable | 视图表格 |
| ucs | DXFTable | 用户坐标系表格 |
| appid | DXFTable | 应用程序标识表格 |
| dimstyle | DXFTable | 标注样式表格 |
| block_record | DXFTable | 块记录表格 |
| vport | DXFTable | 视口表格 |
5.0.3DXFBlocks
| 属性名 | 类型 | 描述 |
|---|---|---|
| MODEL_SPACE | DXFBlock | 模型空间块定义 |
| PAPER_SPACE | DXFBlock | 纸空间块定义 |
| [custom block name] | DXFBlock | 其他自定义块定义,键值为块名称 |
5.0.4 DXFEntities
| 属性名 | 类型 | 描述 |
|---|---|---|
| Array | DXFEntity[] | DXF实体对象的数组 |
5.0.5 DXFObjects
| 属性名 | 类型 | 描述 |
|---|---|---|
| Array | DXFObject[] | DXF对象的数组 |
5.0.6 DXFTable
| 属性名 | 类型 | 描述 |
|---|---|---|
| handle | String | 表格句柄 |
| layer | String | 图层名称 |
| linetype | String | 线型名称 |
| color | Number | 颜色编号 |
| name | String | 表格名称 |
| text | String | 主要文本 |
| texts | String[] | 其他文本数组 |
| linetypes | String[] | 其他线型名称数组 |
| colors | Number[] | 其他颜色编号数组 |
| styles | DXFTableStyle[] | 样式表数组 |
5.0.7 DXFBlock
| 属性名 | 类型 | 描述 |
|---|---|---|
| handle | String | 块句柄 |
| layer | String | 图层名称 |
| name | String | 块名称 |
| color | Number | 颜色编号 |
| coords | Number[] | 块对象的坐标数组 |
| entities | DXFEntity[] | 所包含的DXF实体对象数组 |
5.0.8 DXFEntity
| 属性名 | 类型 | 描述 |
|---|---|---|
| handle | String | 实体对象句柄 |
| layer | String | 图层名称 |
| color | String | 颜色编号 |
| type | String | 实体类型 |
| coords | Number[] | 实体对象的坐标数组 |
| vertices | DXFVertex[] | 实体对象的顶点数组 |
| text | String | 文本内容 |
| attributes | DXFAttribute[] | 实体对象的属性数组 |
5.0.9 DXFVertex
| 属性名 | 类型 | 描述 |
|---|---|---|
| coords | Number[] | 顶点的坐标数组 |
5.0.10 DXFObject
| 属性名 | 类型 | 描述 |
|---|---|---|
| handle | String | 对象句柄 |
| type | String | 对象类型 |
| layer | String | 图层名称 |
| color | String | 颜色编号 |
| text | String | 对象文本内容 |
| coords | Number[] | 对象的坐标数组 |
| attributes | DXFAttribute[] | 对象的属性数组 |
5.0.11 DXFAttribute
| 属性名 | 类型 | 描述 |
|---|---|---|
| name | String | 属性名称 |
| value | String | 属性值 |
| text | String | 属性文本内容 |
| handle | String | 属性句柄 |
| layer | String | 图层名称 |
| color | String | 颜色编号 |
| type | String | 属性类型 |
| visible | Boolean | 是否可见 |
5.1 dxf数据校验
- handle:该值为实体句柄(具有唯一性,可作为数据绑定)
- layer: 该值为实体所在图层 (该值可作为数据分类)
5.2 数据整合约定
根据CAD图纸的单位和工作坐标系,对模型进行适当的缩放和定位
图纸中心点需与实际物理位置进行校对
-
plottingScale(比例尺):three.js 单位约定为米,cad文件抽取数据时需同化单位
-
drawingCenter(图纸中心点):在转化位置和实体之后,需要校对图纸对应3D场景的实际位置
-
drawingDirection(图纸方向):图纸x轴指向物理位置的方位
-
drawingLayer(图层数据):分图层抽取数据(多选)