前言
在网页版CAD二次开发中, 正确的使用数学库是十分重要的,我们通过[快速入门]了解到如果打开图纸后,希望对图形进行各种处理,就需要各种数学计算,而mxcad提供了一些类来参与计算或者表示一些数据结构。
向量 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.Vector3 const 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中存在着一些数组的数据结构用于存放特定数据如:
这些数组都有一些特定的方法,用于操作这些数组。
`copy` 复制一个相同类的实例中存放的所有数据
`copyFormAryId` 复制一组McObjectId (部分数组存在该方法)
`append` 添加数据 (与new Array().push类似)
`length` 数组长度 (这是一个方法)
`at` 通过索引得到对应的数据
`setAt` 设置对应索引的对应数据
`clear` 清空数据
`forEach` 遍历数据
MxCADResbuf
[MxCADResbuf]是CAD二次开发中`resbuf`(即 "result buffer") 用来传递数据的一种数据结构。
一般用于对象属性查询、自定义对象的定义和存储、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).val const pl = new McDbPolyline() pl.addVertexAt(startPoint, bulge) pl.addVertexAt(endPoint)
标签:McGeVector3d,vet,网页,const,McGePoint3d,m1,DWG,new,CAD From: https://www.cnblogs.com/yzy0224/p/17995800