HTML浏览CAD(WEB CAD)二次开发常用的CAD编辑功能的详细教程

前言

网页CAD中常见的修改和编辑命令有很多,例如移动、复制、缩放、旋转、镜像、剪切、延伸、阵列、修改和编辑,这些命令可以帮助用户对绘图进行修改、调整和优化,提高工作效率和设计质量。mxcad 根据该需求提供了相应接口和方法,实现了CAD中常见的修改和编辑命令。这些操作中涉及到对点、向量、矩阵、角度等的计算,具体规则可参考[指南-数学库],也可前往在线DEMO查看具体效果。

删除

我们可以通过调用实体的[erase()]方法删除作图过程中的图线和多余的图线,参考代码如下:

import { MxCADUtility, McObjectId } from "mxcad"
const objIds = MxCADUtility.getCurrentSelect()
objIds.forEach((objId: McObjectId) => {
    objId.erase()
})

效果示例如下:

复制

我们可以通过调用实体的 [clone()]() 方法复制多个对象,也可对一个或多个对象进行多次复制。在复制完成后可点击复制实体移动到目标位置,参考代码如下:

import { MxCADUtility, McDbEntity, McObjectId, MxCpp } from "mxcad"
const objIds = MxCADUtility.getCurrentSelect()
objIds.forEach((objId: McObjectId) => {
    const event = objId.getMcDbEntity()
    if (!event) return;
    const event_clone = event.clone() as McDbEntity
    MxCpp.getCurrentMxCAD().drawEntity(event_clone)
})

此外,我们还可以调用实体的[transformBy()]方法复制对象,该方法是通过变换矩阵实现图形的编辑,具体矩阵变换原理可参考[指南数学库中的矩阵-mcgematrix3d],点击[McGeMatrix3d-clone()]查看矩形变换详细方法和属性,参考代码如下:

import { MxCADUtility, McDbEntity, McObjectId,  MxCpp} from "mxcad"
const objIds = MxCADUtility.getCurrentSelect()
objIds.forEach((objId: McObjectId) => {
    const event = objId.getMcDbEntity()
    if (!event) return;
    const event_clone = event.clone() as McDbEntity
    const matrix = new McGeMatrix3d()
    matrix.clone()
    event_clone.transformBy(matrix)
    MxCpp.getCurrentMxCAD().drawEntity(event_clone)
})

效果示例如下

镜像

我们可以通过调用实体的 [mirror()]() 方法将指定的对象按指定的参考线作镜像处理,代码如下:

import { MxCADUtility, McObjectId,McGeMatrix3d, MxCADUiPrPoint } from "mxcad"
async function Mx_test_mirror(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt1 = new MxCADUiPrPoint()
    getPt1.setMessage("指定镜像参考线的开始点")
    const pt1 = await getPt1.go()
    if(!pt1) return
    const getPt2 = new MxCADUiPrPoint()
    getPt2.setMessage("指定镜像参考线的结束点")
    const pt2 = await getPt2.go()
    if(!pt2) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
        event.mirror(pt1, pt2)
    })
}

此外,我们还可以调用实体的 transformBy() 方法镜像处理对象。该方法是通过变换矩阵实现图形的编辑,具体矩阵变换原理可参考[指南数学库中的矩阵-mcgematrix3d],点击[McGeMatrix3d-setMirror()]查看矩形变换详细方法和属性,参考代码如下:

import { MxCADUtility, McObjectId,McGeMatrix3d, MxCADUiPrPoint } from "mxcad"
async function Mx_test_mirror(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt1 = new MxCADUiPrPoint()
    getPt1.setMessage("指定镜像参考线的开始点")
    const pt1 = await getPt1.go()
    if(!pt1) return
    const getPt2 = new MxCADUiPrPoint()
    getPt2.setMessage("指定镜像参考线的结束点")
    const pt2 = await getPt2.go()
    if(!pt2) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
        const matrix = new McGeMatrix3d()
        matrix.setMirror(pt1,pt2)
        event.transformBy(matrix)
    })
}

效果示例如下:

移动

我们可以通过调用实体的[move()]方法移动目标对象,该移动方法只是变更对象的原始位置,并不复制对象,参考代码如下:

import { MxCADUtility, McGePoint3d, McObjectId } from "mxcad"
const objIds = MxCADUtility.getCurrentSelect()
const pt1= new McGePoint3d(0,0,0)
const pt2 = new McGePoint3d(100,100,0)
objIds.forEach((objId: McObjectId) => {
    objId.getMcDbEntity()?.move(pt1, pt2)
})

此外,我们还可以调用实体的 transformBy() 方法移动对象。该方法是通过变换矩阵实现图形的编辑,具体矩阵变换原理可参考[指南数学库中的矩阵-mcgematrix3d],点击[McGeMatrix3d-setToTranslation()]查看矩形变换详细方法和属性,参考代码如下:

import { MxCADUtility, McGePoint3d, McObjectId } from "mxcad"
const objIds = MxCADUtility.getCurrentSelect()
const pt1= new McGePoint3d(0,0,0)
const pt2 = new McGePoint3d(100,100,0)
objIds.forEach((objId: McObjectId) => {
    const event = objId.getMcDbEntity()
    if(!event) return
    const matrix = new McGeMatrix3d()
    const v = pt2.sub(pt1)
    matrix.setToTranslation(v)
    event.transformBy(matrix)
})

效果示例如下:

旋转

我们可以通过调用实体的[rotate()]方法将所选对象绕指定基点旋转指定角度,参考代码如下:

import { MxCADUtility, MxCADUiPrPoint } from "mxcad"
async function Mx_test_rotate(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt1 = new MxCADUiPrPoint()
    getPt1.setMessage("指定旋转基点")
    const pt1 = await getPt1.go()
    if(!pt1) return
    const getPt2 = new MxCADUiPrPoint()
    getPt2.setMessage("指定旋转角度")
    getPt2.setUserDraw((pt,pw)=>{
        const line = new McDbLine(pt1.x,pt1.y,pt1.z,pt.x,pt.y,pt.z)
        pw.drawMcDbEntity(line)
        objIds.forEach((objId: McObjectId) => {
            const event = objId.getMcDbEntity()?.clone() as McDbEntity
            if(!event) return
            // 旋转角度
            const dRotationAngle = pt1.sub(pt).angleTo2(McGeVector3d.kXAxis, McGeVector3d.kZAxis);
            event.rotate(pt1, dRotationAngle)
            pw.drawMcDbEntity(event)
        })
    })
    const pt2 = await getPt2.go()
    if(!pt2) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
        const dRotationAngle = pt1.sub(pt2).angleTo2(McGeVector3d.kXAxis, McGeVector3d.kZAxis);
        event.rotate(pt1, dRotationAngle)
    })
}

此外,我们还可以调用实体的 transformBy() 方法旋转对象。该方法是通过变换矩阵实现图形的旋转,具体矩阵变换原理可参考[指南数学库中的矩阵-mcgematrix3d],点击[McGeMatrix3d-setToTranslation()]查看矩形变换详细方法和属性,参考代码如下:

import { MxCADUtility, MxCADUiPrPoint, McGeMatrix3d, McObjectId } from "mxcad"
async function Mx_test_rotate(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt1 = new MxCADUiPrPoint()
    getPt1.setMessage("指定旋转中心点")
    const pt1 = await getPt1.go()
    if(!pt1) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
        // 以pt1为中心点 绕z轴 旋转45度
        const matrix = new McGeMatrix3d()
        matrix.setToRotation(Math.PI / 4, McGeVector3d.kZAxis, pt1)
        event.transformBy(matrix)
    })
}

效果示例如下:

偏移

我们可以通过调用实体的[offsetCurves()]方法将直线、圆、多线段等作同心复制,相当于平行移动一段距离后进行复制,参考代码如下:

import { MxCADResbuf, MxCADUtility, MxCpp } from "mxcad"
async function Mx_test_offset(){
    const filter = new MxCADResbuf();
    filter.AddMcDbEntityTypes("LINE") ;
    const objIds = MxCADUtility.getCurrentSelect(filter)
    const getPt1 = new MxCADUiPrPoint()
    getPt1.setMessage("指定偏移点")
    const pt1 = await getPt1.go()
    if(!pt1) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity() ;
       let objArr = (event as McDbLine).offsetCurves(100,pt1)
       if (objArr.length() === 0) return;
       objArr.forEach(obj=>{
        MxCpp.getCurrentMxCAD().drawEntity(obj as McDbEntity)
       })
    })
}

效果示例如下:

缩放

我们可以通过调用实体的[scaleEntity]方法对图形进行自由缩放,参考代码如下:

import { MxCADUtility, MxCADUiPrPoint } from "mxcad"
async function Mx_test_scale(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt = new MxCADUiPrPoint()
    getPt.setMessage("指定缩放基点")
    const pt = await getPt.go()
    if(!pt) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
         event.scaleEntity(pt,0.2)
    })
}

此外,我们还可以调用实体的 transformBy() 方法缩放对象。该方法是通过变换矩阵实现图形的缩放,具体矩阵变换原理可参考[指南数学库中的矩阵-mcgematrix3d],点击[McGeMatrix3d-setToScaling()]查看矩形变换详细方法和属性,参考代码如下:

import { MxCADUtility, MxCADUiPrPoint } from "mxcad"
async function Mx_test_scale(){
    const objIds = MxCADUtility.getCurrentSelect()
    const getPt = new MxCADUiPrPoint()
    getPt.setMessage("指定缩放中心点")
    const pt = await getPt.go()
    if(!pt) return
    objIds.forEach((objId: McObjectId) => {
        const event = objId.getMcDbEntity()
        if(!event) return
        const matrix = new McGeMatrix3d()
        matrix.setToScaling(0.2, pt)
        event.transformBy(matrix)
    })
}

效果示例如下:

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、付费专栏及课程。

余额充值