首页 > 其他分享 >在线CAD开发(网页浏览DWG)中用到的数学库

在线CAD开发(网页浏览DWG)中用到的数学库

时间:2024-01-30 09:33:05浏览次数:42  
标签:McGeVector3d vet 网页 const McGePoint3d m1 DWG new CAD

前言

在网页版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中存在着一些数组的数据结构用于存放特定数据如:

[McGeLongArray]

[McGeStringArray]

[McGePoint3dArray]

[MdGeDoubleArray]

这些数组都有一些特定的方法,用于操作这些数组。

`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

相关文章

  • sw导入dwg工程图
    如何利用已有CAD模板快速生成SolidWorks模板-知乎(zhihu.com)      全选 ctrl+A  然后剪切ctrl+X然后右击编辑图纸格式ctrl+v然后ctrl+a全选  点击-草图-移动实体 退出编辑格式 -文件-保存图纸格式-确定......
  • 有这4类大学必备搜题神器(包含APP和网页插件)
    现在读书可不像小时候,以前想要校对试题答案,都得找到对应的纸质版答案查看,而且有的还只有答案,没有解析,无法弄清楚答案的由来。但是现在不一样了,现在我们可以通过搜题软件,寻找试题的答案,而且还会附带答案解析,分析答案的由来,方便又好用。今天就分享几款搜题软件给大家,满足大家各种搜题......
  • 利用yolov模型和django实现网页摄像头调用进行实时预测
    前端:<imgid="video"width="640"height="480"ref="video"></img>调用方法:startCamera(){varvideo1=document.getElementById("video");video1.src="http://localhost:8080/api/webcam/"}......
  • php网页开发和漏洞寻找
    前言:放寒假了,之前一直在准备期末,没什么时间学技术和写博客,最近有空了会写一些。本篇博客将接着之前的内容介绍利用php搭建博客的一些步骤,从网页开发角度分析一些常用漏洞的产生。学安全首先要会开发1.1操作数据库php作为一门编程语言,是无法直接与数据库进行交互的,想要进行该......
  • 使用CrawlSpider类抓取纵横小说网页内容
    一:根据page页面解析出book_url二:解析来的response(book_url)并不是交给parse_item方法,而是交给了上面的rules处理,然后通过LinkExtractor提取静态页面数据url,url形成一个新的请求交给引擎,引擎一顿操作给到callback=‘parse_item’回调函数三:最后交给parse_item   ......
  • 用 UNPKG/CDNJS 国内镜像优化网页加载速度
    unpkg.com和cdnjs.cloudflare.com这两个官方域名的加载速度实在令人汗颜。抽了一下午找了些国内能用的高速稳定镜像,批量更换一下就能加速访问了。unpkg用Zstatic的镜像,把原来的unpkg.com换成s4.zstatic.net/npmcdnjs用360或者Zstatic的镜像,把原来的cdnjs.cloudfl......
  • fiddleer - Filters 网页过滤
     Fiddler工具—Fiddler过滤器(Filters)详解1、Filters介绍Filters:过滤器,帮助我们过滤请求。如果需要过滤掉与测试项目无关的抓包请求,更加精准的展现抓到的请求,而不是杂乱的一堆,那功能强大的Filters过滤器能帮到你。总结:Filters过滤器的作用,过滤出我们想要的请求......
  • 【转载】L2Dwidget.js网页二次元看板娘的用法
    最近新建了博客,https://yellowgg.cn,许久不更新的博客园想引个流,可以关注一波嗷。发现某些blog网站左下方或者右下方出现的二次元卡通人物或萌萌阿猫,除了萌,还可以监听鼠标的行为,产生互动的现象。1.关于脚本的生成L2Dwidget.min.js的源码:https://github.com/xiazeyu/live2d-wid......
  • uniapp+unicloud开发一个网页端,小程序端,APP端,桌面端的博客CMS系统——万能的三三
    前言做为一个开发者,怎么能没有一个自己的博客呢?都说现在是小程序,APP时代了,显然只有网页端已经跟不上时代了,于是乎就想找一个免费的能同时支持网页端,小程序,APP的博客系统...于是花了一点点时间,没找到合适的...好吧,那既然自己是开发者,那为什么不能自己写一个博客呢?于是又花亿点点时间......
  • 在Android中的webview进行调试网页
    首先要在代码中打开webview的设置,注意这里WebView是大写的,这个setWebContentsDebuggingEnabled方法是WebView的静态方法,不是你的webview的对象的方法。这个代码放到你的webview的activity的onCreate中if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){......