前言在网页版CAD二次开发中, 正确的使用数学库是十分重要的,我们通过[快速入门]了解了如果打开图纸后,希望对图形进行各种处理,就需要各种数学计算, mxcad提供了一些类来参与计算或者表示一些数据结构,各类API接口查询如下:向量 McGeVector3d如果不理解向量的概念,请学习理解后再继续阅读,在three.js中有向量`THREE.Vector3` 而对应的在mxcad也存在[McGeVector3d]表示3D空间中的矢量(向量),在该类中存在四个轴`kXAxis`、`kYAxis`、`kZAxis`、`kNegateZAxis` 分别都是固定的向量。
前言
在网页版CAD二次开发中, 正确的使用数学库是十分重要的,我们通过[快速入门]了解了如果打开图纸后,希望对图形进行各种处理,就需要各种数学计算, mxcad提供了一些类来参与计算或者表示一些数据结构,各类API接口查询如下:
向量 McGeVector3d
如果不理解向量的概念,请学习理解后再继续阅读,在three.js中有向量`THREE.Vector3` 而对应的在mxcad也存在[McGeVector3d]表示3D空间中的矢量(向量),在该类中存在四个轴`kXAxis`、`kYAxis`、`kZAxis`、`kNegateZAxis` 分别都是固定的向量。
`THREE.Vector3` 与 `McGeVector3d` 是完全等价的,只是在mxcad中与其他数据参与运算的是`McGeVector3d`,代码如下:
import { McGeVector3d } from "mxcad"const vet = new McGeVector3d(1, 0, 0)// 得到THREE.Vector3const tVet = vet.toVector3()const newVet = new McGeVector3d(tVet)// 旋转tVet.rotateBy(Math.PI. McGeVector3d.kXAxis)// 取反vet.negate()// 垂直90度vet.perpVector()// 计算两个向量之间的角度vet.angleTo1(newVet)vet.angleTo1(newVet, McGeVector3d.kZAxis)// 归一化vet.normalize()// 点积vet.dotProduct(newVet)// 交叉积vet.crossProduct(newVet)// 是否相等vet.isEqualTo(newVet)// 向量与某个值相乘vet.mult(10)
3D点 McGePoint3d
这是最常使用的一个类[McGePoint3d]代表3D空间中的一个点的构造类,由`x`、`y`、`z` 三个双精度数值组成的结构,代码如下:
import { McGePoint3d } from "mxcad"const pt1 = new McGePoint3d(0, 0, 0)// 或者const pt2 new McGePoint3d({ x: 0, y: 0, z: 0}) // 提供了一些实用的方法// 判断两个点是否相等pt1.isEqualTo(pt2)// 计算两点距离pt1.distanceTo(pt2)// 将three.js 的向量设置成点pt1.setFromVector3(new THREE.Vector3())// 得到点对应的three.js 向量pt1.toVector3() // 两点相减得到新向量const vet = pt1.sub(pt2)// 加上向量的新位置pt1.addvec(vet)// 简写pt1.av(vet) // 减去向量的新位置pt1.subvec(vet)// 简写pt1.sv(vet)
矩阵 McGeMatrix3d
[McGeMatrix3d] 类表示3D空间的仿射变换,代码如下:
import { McGeMatrix3d, McGePoint3d, McGeVector3d } from "mxcad"// 乘法的单位矩阵 McGeMatrix3d.kIdentity const m = new McGeMatrix3d() const m1 = new McGeMatrix3d() // 设置为单位矩阵。m.setToIdentity() // 左乘指定的矩阵。const m3 = m.preMultBy(m1) // 右乘指定的矩阵。m3.postMultBy(m1) // 矩阵设置为两个矩阵的乘积。new McGeMatrix3d().setToProduct(m1, m2) // 逆矩阵。m1.invert() // 是否为奇异矩阵。m1.isSingular() // 转置m1.transposeIt() // 是否相等m1.isEqualTo(m2) // 矩阵的行列式。m1.det() // 将矩阵设置为指定的坐标系。参数分别是原点、xyz轴m1.setCoordSystem(new McGePoint3d(), new McGeVector3d(), new McGeVector3d(), new McGeVector3d()) // 平移m1.setToTranslation(new McGeVector3d(0, 1, 0)) // 旋转 参数:角度、轴、旋转中心点m1.setToRotation(Math.PI, McGeVector3d.kXAxis, new McGePoint3d()) // 缩放 参数: 缩放因子、缩放中心点m1.setToScaling(0.5, new McGePoint3d()) // 设置为镜向矩阵m1.setMirror(new McGePoint3d(), new McGePoint3d()) // 获取缩放因子m1.scale() // 获取矩阵中指定位置的元素值 参数 行索引、列索引m1.getData(0, 0)
对象ID McObjectId
当图形被打开后,数据库中的实体对象都会在内存中对应一个唯一的id, [McObjectId]也是与对象相关联的唯一标识符的包装对象,一般我们在操作[数据库]或者得到[图形实体]的数据,都是得到的McObjectId ,实例McObjectId 的实例得到对应的对象数据如实体数据。
颜色 McCmColor
在mxcad中 [McCmColor]表示颜色, 这些颜色又区分了不同的方式 由`method`决定,`method` 的值是一个枚举[ColorMethod]。
`ColorMethod.kByLayer` 表示颜色值是该实体所在图层的颜色
`ColorMethod.kByBlock` 表示颜色值是该实体所在块的颜色
`ColorMethod.kByColor` 表示颜色值是一个真彩色(RGB)
`ColorMethod.kByACI` 表示颜色值是一个CAD中的索引颜色(每个索引对应一种固定的颜色)
通过`setRGB` 方法设置颜色, 那么`method` 就是`ColorMethod.kByColor`真彩色
通过`setColorIndex` 方法设置的颜色索引, 那么`method` 就是`ColorMethod.kByACI` 索引颜色
颜色索引的值可以是 0~256 组成[ColorIndexType]枚举记录了最常见的颜色索引和特殊的颜色索引,我们也可以通过[createMcCmColor]和[setMcCmColor]来创建或者设置一个`McCmColor`的实例,它的参数可以是McCmColor中的属性值, 也可以是实例化THREE.Color时传入的参数, 方便快捷的创建和设置颜色。
特殊数组
在mxcad中存在着一些数组的数据结构用于存放特定数据如:
[McGeLongArray]、[McGeStringArray]、[McGePoint3dArray]、[MdGeDoubleArray]
这些数组都有一些特定的方法,用于操作这些数组。
`copy` 复制一个相同类的实例中存放的所有数据
`copyFormAryId` 复制一组McObjectId (部分数组存在该方法)
`append` 添加数据 (与new Array().push类似)
`length` 数组长度 (这是一个方法)
`at` 通过索引得到对应的数据
`setAt` 设置对应索引的对应数据
`clear` 清空数据
`forEach` 遍历数据
MxCADResbuf
[MxCADResbuf]用来传递数据的一种数据结构,一般用于对象属性查询、自定义对象的定义和存储、XDATA(扩展数据)处理、绘图实体的编辑等,例如在[MxCADSelectionSet]选择集中表示过滤对象,代码如下:
import { MxCADSelectionSet, MxCADResbuf } from "mxcad" let ss = new MxCADSelectionSet(); let filter = new MxCADResbuf(); // 这里添加查询字符"0" 第二个参数是数据类型8 在CAD二次开发中 表示这是一个空指针(RTNUL)即该 resbuf 结构不包含任何有效数据,通常在链表的末尾作为终止符使用 filter.AddString("0", 8); // 选择图层0的所有实体 ss.allSelect(filter); ss.forEach((objId)=> console.log(objId))
calcBulge 计算圆弧凸度
MxCADUtility是[MxCADUtilityClass] 提供的实例, 提供了很多实用的方式,[MxCADUtility.calcBulge]计算圆弧凸度在多段线实体中添加点有一个参数是凸度值, 计算凸度是比较复杂的,mxcad提供了calcBulge方法来计算得到凸度,需要三个参数依次为: 圆弧的开始点(起点)、圆弧的中点、圆弧的结束点(端点),代码如下:
import { MxCADUtility, McGePoint3d, McDbPolyline } from "mxcad"// 圆弧开始点const startPoint = new McGePoint3d(0, 0, 0);// 圆弧中点const midPoint = new McGePoint3d(0, 0, 0);// 圆弧结束点const endPoint = new McGePoint3d(0, 0, 0);const bulge = MxCADUtility.calcBulge(startPoint, midPoint, endPoint).valconst pl = new McDbPolyline()pl.addVertexAt(startPoint, bulge)pl.addVertexAt(endPoint)