H5在线CAD实现一种绘制圆弧的方式

前言

在线CAD绘制圆弧本质上是在网页端编辑DWG图纸,而DWG格式是无法直接在网页端编辑的,因此要先安装梦想CAD控件的后台转换程序,将图纸转换成mxweb格式,再传送给前台进行编辑,其中转换方法和原理请查看快速入门的《编辑模式原理说明》章节,如下图:

注意:如果你对mxdraw不是很了解建议看看官方文档:

https://mxcadx.gitee.io/mxdraw_docs/

网页CAD绘制圆弧的方式有很多种,而mxdraw库的方式是通过继承Mx3PointArc类来实现两点绘制圆弧的功能,类似于多段线画圆弧,只需要确定两个点就可以画一个圆弧的效果,这两个点分别是圆弧的开始点和圆弧的结束点,下面讲一下具体实现方法。

关于Mx3PointArc

在此之前先了解一下Mx3PointArc:
https://mxcadx.gitee.io/mxdraw_api_docs/classes/Mx3PointArc.htmlicon-default.png?t=N6B9https://mxcadx.gitee.io/mxdraw_api_docs/classes/Mx3PointArc.html

首先Mx3PointArc是通过给定的三个点来绘制圆弧的一个类。这三个点分别是起点(point1)、终点(point2)和第三个点(point3),其中第三个点是圆弧上的任意一点。

绘制圆弧的原理是通过计算得出圆的中心点(center)、半径(radius)以及起始角度(startAngle)和终止角度(endAngle)来确定圆弧的形状。

具体的步骤如下:

1.首先通过三个点计算出圆的中心点(center)。这可以通过计算两条垂直平分线的交点来实现。假设已知点A(point1)、点B(point2)和点C(point3),则可以计算出AB线段的中点和垂直于AB的斜率,再计算出BC线段的中点和垂直于BC的斜率,最后求出这两条垂直平分线的交点即为圆的中心点。

2.接下来,通过圆心和起点(point1)的距离来确定圆的半径(radius)。

3.然后,通过计算圆心到起点、圆心到终点和圆心到第三个点的角度,可以得到起始角度(startAngle)和终止角度(endAngle)。这可以通过三角函数来计算得出。

4.最后,根据圆弧的顺时针或逆时针方向进行调整。如果是顺时针方向,且起始角度小于终止角度,则将起始角度加上2π;如果是逆时针方向,且起始角度大于终止角度,则将终止角度加上2π。

通过以上步骤,使用给定的三个点来计算出圆弧中心点(center)、半径(radius)、起始角度(startAngle)和终止角度(endAngle),从而通过THREE.EllipseCurve计算得出最终构成圆弧的(向量集合)points,并通过mxdraw提供的自定义形状图形类

MxDbShape:https://mxcad.github.io/mxdraw_api_docs/classes/MxDbShape.html 渲染绘制出圆弧。

Mx3PointArc基础继承

要实现两点画圆弧,就要自动去计算point3的位置,我们先继承Mx3PointArc, 重写一些简单的代码:

import{ Mx3PointArc } from "mxdraw"

class MxDbArc extends Mx3PointArc {

  get startPoint() {

    return this.point1

  }

  set startPoint(v) {

    this.point1 = v

  }

  get endPoint() {

    return this.point2

  }

  set endPoint(v) {

    this.point2 = v

  }

  getTypeName(): string {

    return "MxDbArc"

  }

  getGripPoints(): THREE.Vector3[] {

    return [this.point1, this.point2, this.point3]

  }

}

上面的代码我们继承了Mx3PointArc 并重写了图形类的名称和显示的控制夹点数量,并且新增了startPoint和endPoint 访问器,这样变量命名的意思更加明确。

计算point3(圆弧中点)

下面计算this.point3控制点, 在绘制完成后,这个控制点是一个弧线中点的位置,所以我们在绘制时可以把this.point3当成弧线中点计算, 以下是具体代码:

import{ Mx3PointArc, McGiWorldDrawType,  McGiWorldDraw } from "mxdraw"
class MxDbArc extends Mx3PointArc {
  // ...
  worldDraw(pWorldDraw: McGiWorldDraw): void {
    // 这里比较特殊, 只有在动态拖动的绘制时去计算中点,才能达到我们想要的效果
    if(pWorldDraw.getType() === McGiWorldDrawType.kDynDragDraw) {
    //   计算中点 如果没有成功计算中点,我们也需要一个点来支撑下次的中点运算,
    //所以this.point3如果发现没有成功计算中点是需要一个默认值的
      this.point3 = this.getArcMidPoint()
      if(! this.point3 ) this.point3 = new THREE.Vector3(this.point1.x, this.point2.y)
    }
    super.worldDraw(pWorldDraw)
  }
  // 默认圆弧是不需要闭合的
  closed = false
  /** 获取圆弧线中点坐标 */
  getArcMidPoint() {
    const THREE = MxFun.getMxFunTHREE()
    let { startAngle, endAngle, center, radius, clockwise, autoClockwise } = this
    if(center.x ===0 && center.y ===0) return
    // 这里主要是更新计算必要的一些构成圆弧的参数 圆心、半径、角度、顺逆时针
    this.upDateCenter(this.point1, this.point2, this.point3)
    this.upDateRadius(this.point1)
    const [angle1, angle2, angle3] = this.compute3PointAngle()
    this.startAngle = THREE.MathUtils.degToRad(angle1)
    this.endAngle = THREE.MathUtils.degToRad(angle2)
    this.upDataClockwise(angle1, angle2, angle3)
    // 根据顺逆时针方向进行调整
    if (clockwise) {
      if (startAngle < endAngle) {
        startAngle += 2 * Math.PI;
      }
    } else {
      if (startAngle > endAngle) {
        endAngle += 2 * Math.PI;
      }
    }
    const midAngle = (startAngle + endAngle) / 2;
    const midX = center.x + radius * Math.cos(midAngle);
    const midY = center.y + radius * Math.sin(midAngle);
    return new THREE.Vector3(midX, midY, 0)
  }
}

实现绘制函数

现在实现以下绘制函数,其他就算得到圆弧开始点和结束点:

import{ MrxDbgUiPrPoint, MxFun } from "mxdraw"

const drawArc = async () => {

  const getPoint = new MrxDbgUiPrPoint()

  const arc = new MxDbArc()

  const p1 = await getPoint.go()

  if (!p1) return

  arc.startPoint = p1

  getPoint.setUserDraw((point, draw) => {

    arc.endPoint = point



    draw.drawCustomEntity(arc)

  })

  const p2 = await getPoint.go()

  if (!p2) return



  arc.endPoint = p2



  MxFun.getCurrentDraw().addMxEntity(arc)

}

最后在需要画圆弧的时候调用drawArc就可以通过指定开始点和结束点来确定一个圆弧了,效果图如下:

第一次绘制过程中的截图:

绘制完成点击圆弧中点拖动的截图:

当然还有其他方式可以实现两点绘制圆弧, 目前这种方式是比较简单实用的一些使用mxdraw的技巧,我们可以通过mxdraw提供的各种图形类去继承或者组合去实现更多好用且实用的图形和绘制能力。

关于组合与继承mxdraw中的图形类请参考:

https://mxcadx.gitee.io/mxdraw_docs/graph/combination.html#%E5%A4%9A%E4%B8%AA%E5%9B%BE%E5%BD%A2%E7%BB%84%E5%90%88%E6%9E%84%E6%88%90%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%E5%9B%BE%E5%BD%A2%E5%AF%B9%E8%B1%A1https://mxcadx.gitee.io/mxdraw_docs/graph/combination.html#%E5%A4%9A%E4%B8%AA%E5%9B%BE%E5%BD%A2%E7%BB%84%E5%90%88%E6%9E%84%E6%88%90%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%E5%9B%BE%E5%BD%A2%E5%AF%B9%E8%B1%A1

DEMO源码:

https://github.com/mxcad/mxdraw-article/tree/master/%E5%AE%9E%E7%8E%B0%E4%B8%80%E7%A7%8D%E7%BB%98%E5%88%B6%E5%9C%86%E5%BC%A7%E7%9A%84%E6%96%B9%E5%BC%8F/demohttps://github.com/mxcad/mxdraw-article/tree/master/%E5%AE%9E%E7%8E%B0%E4%B8%80%E7%A7%8D%E7%BB%98%E5%88%B6%E5%9C%86%E5%BC%A7%E7%9A%84%E6%96%B9%E5%BC%8F/demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、总体介绍 CADViewer+图纸浏览控件是一个实现对AutoCAD R14-2016图纸(DWG/DWF/DXF)安全浏览的ActiveX产品。CADViewer+提供平移\缩放\全图\测距\测面积\图层显示控制等常用功能,并支持VC++、Dephi、Java、VB、.Net、Php等开发语言。 2、功能介绍 安装本软件后,可以通过各类语言来调用CADViewer+控件。控件具备如下功能: 1)开窗放大功能 产品提供开窗放大功能,使用者可以根据需要对图纸进行局部放大充满窗口 2) 放大、缩小功能 使用者可以根据需要对图纸进行放大、缩小浏览,此处支持鼠标滑轮滚动对图纸进行放大、缩小的调整。 3) 全图 系统提供全图显示功能。 4)平移 此处有三种方式可使用此功能:1可以对图纸进行多方向拖动。2)单击鼠标右键,选项中也由此功能键,可点击使用此功能。 5) 捕捉设置 本软件提供捕捉设置功能,方便使用者在测量距离和面积时进行点的捕捉。使用者单击鼠标右键,选择“捕捉设置”进入捕捉设置界面,即可对其进行设置。 6) 测量功能 本软件提供测量距离、测量面积两种测量功能方便用户使用。 测量距离功能 点击测量功能按钮后,使用者选定两点后即可测出两点间距离。 测量面积功能 使用者点击测量面积按钮后,单击鼠标左键进行区域选中(不包含曲线选中),选中完成后单击鼠标右键即显示所选区域的周长和面积。 7) 图层管理 本软件提供图层管理功能,使用者单击鼠标右键或者点击图层管理的图标,选择“图层管理”进入图层管理界面,该界面可进行“显示”“冻结”“锁定”的更改,单击相应图标即可进行设置。 8) 视觉样式显示模型 视觉样式是一组设置,用来控制视口中边和着色的显示。更改视觉样式的特性,而不是使用命令和设置系统变量。一旦应用了视觉样式或更改了其设置,就可以在视口中查看效果。 二维线框 显示用直线和曲线表示边界的对象。光栅和 OLE 对象、线型和线宽均可见。 三维线框 显示用直线和曲线表示边界的对象。 三维隐藏 显示用三维线框表示的对象并隐藏表示后向面的直线。 三维真实 着色多边形平面间的对象,并使对象的边平滑化。将显示已附着到对象的材质。 三维概念 着色多边形平面间的对象,并使对象的边平滑化。着色使用古氏面样式,一种冷色和暖色之间的转场而不是从深色到浅色的转场。效果缺乏真实感,但是可以更方便地查看模型的细节。 3、、产品特色 1)支持多种主流编程语言 产品支持在VC++、VB、.Net和html中调用控件。 2)提供可靠的安全性 用户只可在线浏览图纸文件,无法进行拷贝、另存和打印等操作。 3)无需安装AutoCAD即可实现在线浏览图纸文件 采用自主图纸解析引擎,脱离AutoCAD,即可浏览图纸文件。 4)提供了方便的浏览辅助工具 为用户提供了一系列的浏览辅助工具,方便用户进行浏览,其中包括:移动、放大、缩小、充满显示、开窗放大,测量距离和面积等。 5)支持多CAD图纸文件 支持浏览R14-2015本的图纸文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值