cad文件应用于three.js

842 阅读6分钟

cadToWeb3D

DWG格式无法在网页中直接使用的原因是因为DWG是AutoCAD的专有格式,不是网页所支持的标准图形格式。要在网页中显示DWG文件,需要将其转换为网页支持的格式,如SVG、PNG或JPEG等。

该文采用的技术路线为 nodejs + dwg—>dxf

1. 目标

dxfToOther.png

2. dwg转dxf(前置条件)

2.1 相关软件ODA DWG-DXF CONVERTER

software.png

2.1.1 linux版本

linux.png

命令行:

linux-command.png

doudou@doudou-Virtual-Machine:~$ './dwgToDxf.AppImage' ./dwg ./dxf/ ACAD2018 DXF 0 0
2.1.2 window版本

windows.png

命令行:

windows-command.png

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-dxf.png 命令行:

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);

toSvg.png

4. 3D接入校验

4.1 实体类型解析

drawEntity.png

4.2 辅助函数

4.2.1 样条线函数

函数首先对输入进行验证,确保t的值在合理范围内,degree的值大于等于1且小于等于控制点的个

数减1,结点数组的长度与控制点数量加阶数加1相等。然后根据输入的参数计算B样条曲线在给定

参数t处的坐标。

函数接受的参数包括:

  • t:表示曲线上的参数值,范围在0到1之间。
  • degree:样条曲线的阶数,用于控制曲线的平滑程度。阶数越高,曲线越平滑。
  • points:包含控制点的数组,用于定义B样条曲线的形状。
  • knots:结点数组,用于定义曲线在哪些点上是可控的。如果没有提供结点数组,则默认使用等间
  • 距的结点。
  • weights:控制点的权重数组,用于指定每个控制点对曲线形状的影响程度。如果没有提供权重数

组,则默认将所有控制点的权重设置为1。

具体计算过程如下:

  1. 获取控制点的个数n和每个控制点的维度d。

  2. 如果没有提供权重数组,则创建一个长度为n的权重数组,所有元素初始化为1。

  3. 如果没有提供结点数组,则创建一个长度为n+degree+1的结点数组,元素初始化为等间距的值。

  4. 根据给定的t值,将其映射到曲线定义的域上,并进行范围检查和边界处理。

  5. 根据给定的t值和控制点数量,找到曲线所在的曲线段。

  6. 将控制点转换为同质坐标系下的坐标,同时乘以对应的权重。

  7. 使用B样条曲线的算法,通过迭代计算得到曲线在给定t值处的坐标。

  8. 将计算得到的曲线坐标转换为笛卡尔坐标系下的坐标,并使用函数对坐标进行四舍五入。

  9. 返回计算得到的曲线坐标作为函数的结果。

4.2.2 指数位四舍五入

该函数是一个数学计算函数,用于对一个数值进行指定位数的四舍五入操作。具体步骤如下:

  1. 如果给定的指数exp为undefined或0,则直接对数值value进行四舍五入操作,并返回结果。

  2. 将输入的value和exp转换为数字类型。

  3. 如果value不是数字或exp不是整数,则返回NaN。

  4. 将value转换为科学计数法的形式,然后对值部分进行四舍五入操作。

  5. 将步骤4中得到的结果再转换回原来的格式。

  6. 将步骤4中得到的结果转换为数字类型,并返回最终的四舍五入后的值。

该函数的作用是通过使用科学计数法来实现对数值进行指定位数的四舍五入操作。

5. 增量数据校验

该图为对源数据进行多次修改的结果

图一:由ODAFileConverter转化后的dxf格式

图二:CAD 原生导出dxf格式

5.0 结构映射

5.0.1 DXFStructure
属性名类型描述
headerStringDXF文件的头部信息
tablesDXFTablesDXF文件的表格
blocksDXFBlocksDXF文件的块定义
entitiesDXFEntitiesDXF文件的实体
objectsDXFObjectsDXF文件的对象
5.0.2 DXFTables
属性名类型描述
ltypeDXFTable线型表格
layerDXFTable图层表格
styleDXFTable样式表格
viewDXFTable视图表格
ucsDXFTable用户坐标系表格
appidDXFTable应用程序标识表格
dimstyleDXFTable标注样式表格
block_recordDXFTable块记录表格
vportDXFTable视口表格
5.0.3DXFBlocks
属性名类型描述
MODEL_SPACEDXFBlock模型空间块定义
PAPER_SPACEDXFBlock纸空间块定义
[custom block name]DXFBlock其他自定义块定义,键值为块名称
5.0.4 DXFEntities
属性名类型描述
ArrayDXFEntity[]DXF实体对象的数组
5.0.5 DXFObjects
属性名类型描述
ArrayDXFObject[]DXF对象的数组
5.0.6 DXFTable
属性名类型描述
handleString表格句柄
layerString图层名称
linetypeString线型名称
colorNumber颜色编号
nameString表格名称
textString主要文本
textsString[]其他文本数组
linetypesString[]其他线型名称数组
colorsNumber[]其他颜色编号数组
stylesDXFTableStyle[]样式表数组
5.0.7 DXFBlock
属性名类型描述
handleString块句柄
layerString图层名称
nameString块名称
colorNumber颜色编号
coordsNumber[]块对象的坐标数组
entitiesDXFEntity[]所包含的DXF实体对象数组
5.0.8 DXFEntity
属性名类型描述
handleString实体对象句柄
layerString图层名称
colorString颜色编号
typeString实体类型
coordsNumber[]实体对象的坐标数组
verticesDXFVertex[]实体对象的顶点数组
textString文本内容
attributesDXFAttribute[]实体对象的属性数组
5.0.9 DXFVertex
属性名类型描述
coordsNumber[]顶点的坐标数组
5.0.10 DXFObject
属性名类型描述
handleString对象句柄
typeString对象类型
layerString图层名称
colorString颜色编号
textString对象文本内容
coordsNumber[]对象的坐标数组
attributesDXFAttribute[]对象的属性数组
5.0.11 DXFAttribute
属性名类型描述
nameString属性名称
valueString属性值
textString属性文本内容
handleString属性句柄
layerString图层名称
colorString颜色编号
typeString属性类型
visibleBoolean是否可见

5.1 dxf数据校验

  • handle:该值为实体句柄(具有唯一性,可作为数据绑定)
  • layer: 该值为实体所在图层 (该值可作为数据分类)

data-check.png

5.2 数据整合约定

根据CAD图纸的单位和工作坐标系,对模型进行适当的缩放和定位

图纸中心点需与实际物理位置进行校对

  • plottingScale(比例尺):three.js 单位约定为米,cad文件抽取数据时需同化单位

  • drawingCenter(图纸中心点):在转化位置和实体之后,需要校对图纸对应3D场景的实际位置

  • drawingDirection(图纸方向):图纸x轴指向物理位置的方位

  • drawingLayer(图层数据):分图层抽取数据(多选)