在线CAD二次开发中实现交互绘制的详细步骤

前言

在线CAD的二次开发中对于交互绘制的使用频率非常高,MxCAD的思路是通过调取命令功能和取点对象来实现动态绘制,下面文章我们会详细讲解一下这三个步骤,如果对WEB CAD的二次开发还不熟悉可以参考入门教程

一、什么是命令功能

mxdraw.js库提供了一种可以通过输入一些特定的命令调用绘制方法,并在动态绘制过程中实现参数化绘图的功能,即为命令功能。例如用命令功能绘制一个圆,可直接在命令行内调用绘圆方法,并根据用户输入圆的半径参数来确定圆的大小,下面是实现步骤:

1、监听输入

因用户在命令模式下绘图,需要输入命令,系统会即时输出提示消息或相关命令消息,所以需要在画布所在页面添加输入框和文本显示框。此外,还需利用方法

Mx.MxFun.setCommandLineInputData() 来设置命令行消息数据,

利用方法Mx.MxFun.listenForCommandLineInput()来监听命令行消息动态更新的数据、在取点对象中设置的命令等,当监听到用户输入命令并触发enter事件时,自动执行命令。监听代码如下:

<input id="mxCmdText"/>
let event = document.getElementById('mxCmdText')
// 设置命令行消息数据 (在监听input输入框的onKeydown事件的回调函数中调用)
event.onkeydown = function (e) {
Mx.MxFun.setCommandLineInputData(event.value, e.keyCode)
}

2、编写绘制函数

在使用命令功能时,编写绘制函数的过程中可以通过取点对象调用setMessage方法给用户提示必要的操作信息,以及获取到使用者的输入信息或关键词,下面以绘制线段函数为例:

// 线段函数async function BR_Line() {
  const getPoint = new Mx.MrxDbgUiPrPoint();
  // 交互提示
  getPoint.setMessage("\n指定直线起点:");
  getPoint.go(async (status:number)=>{
    if(status != Mx.MrxDbgUiPrBaseReturn.kOk) return
    let pt1 = getPoint.value();
    let line = new Mx.MxDbLine();
    line.pt1 = pt1;
    getPoint.setMessage("\n指定直线终点:");
    getPoint.setUserDraw((pt:any,pw:any)=>{
        line.pt2 = pt;
        pw.drawCustomEntity(line)
  });
  line.pt2 = await getPoint.go();
  Mx.MxFun.getCurrentDraw().addMxEntity(line);})}

3、注册命令

将写好的绘制函数通过Mx.MxFun.addCommand()方法进行注册命令,代码如下:

// 注册命令名 BR_Line:命令名
Mx.MxFun.addCommand("BR_Line", ()=> {
  // 是否正在运行某个命令
  if(Mx.MxFun.isRunningCommand()) {
      return
  }
  // 目标绘制函数
  BR_Line()})

4、执行命令、输出消息

注册好目标命令后,用户可通过Mx.MxFun.sendStringToExecute()方法手动执行输入的命令。此外,用户还可以通过Mx.MxFun.listenForCommandLineInput()方法按需输出提示消息或命令内容,参考代码如下:

// 手动执行命令
Mx.MxFun.sendStringToExecute("目标命令");
// 监听正在绘制中的命令提示
Mx.MxFun.listenForCommandLineInput(({ msCmdTip, msCmdDisplay, msCmdText }) => {
  console.log(msCmdTip, msCmdDisplay, msCmdText)})

命令功能效果完整示例代码如下:

<!DOCTYPE html><html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MxDbLine 示例</title>
    <script src="https://unpkg.com/mxdraw/dist/mxdraw.umd.js"></script></head>
<body>
    <div style="height: 80vh; overflow: hidden;">
        <canvas id="mxdraw"></canvas>
    </div>
    <div>
        <textarea id="mxCmdArea" rows="5" style="width:100%;overflow: scroll;"
        placeholder="命令:" readonly></textarea>
        <input type="text" id="mxCmdText" />
    </div></body><script type="module">
    Mx.loadCoreCode().then(async () => {
        // 创建控件对象
        Mx.MxFun.createMxObject({
            canvasId: "mxdraw", // canvas元素的id
        });
    })
    let event = document.getElementById('mxCmdText')
    // 设置命令行消息数据 (在监听input输入框的onKeydown事件的回调函数中调用)
    event.onkeydown = function (e) {
        Mx.MxFun.setCommandLineInputData(event.value, e.keyCode)
    }
    // 直线函数
    async function BR_Line() {
        const getPoint = new Mx.MrxDbgUiPrPoint();
        // 交互提示
        getPoint.setMessage("\n指定直线起点:");
        let pt1 = await getPoint.go();
        if (!pt1) return
        let line = new Mx.MxDbLine();
        line.pt1 = pt1;
        getPoint.setMessage("\n指定直线终点:");
        getPoint.setUserDraw((pt, pw) => {
            line.pt2 = pt;
            pw.drawCustomEntity(line)
        });
        const pt2 = await getPoint.go()
        if (!pt2) return
        line.pt2 = pt2;
        Mx.MxFun.getCurrentDraw().addMxEntity(line);
    }
    // 注册命名
    Mx.MxFun.addCommand("BR_Line", () => {
        // 是否正在运行某个命令
        if (Mx.MxFun.isRunningCommand()) {
            return
        }
        BR_Line()
    })
    // 监听正在绘制中的命令提示
    Mx.MxFun.listenForCommandLineInput(({ msCmdTip, msCmdDisplay, msCmdText }) => {
        console.log(msCmdTip, msCmdDisplay, msCmdText)
        document.getElementById('mxCmdArea').innerHTML = msCmdTip
        document.getElementById("mxCmdArea").scrollTop = document.getElementById("mxCmdArea").scrollHeight;
    })
</script>
</html>

二、取点对象

在画布中绘制基本图形前,先要学会点对象的绘制(复杂图形都由点、线、面组成),mxdraw.js中提供了API MrxDbgUiPrPoint用于构建一个取点对象,并提供一系列方法属性辅助用户绘图,点击MrxDbgUiPrPoint API 查看详细属性和方法说明。

1、基础取点

调用MrxDbgUiPrPoint中的方法go()记录鼠标开始拖动的点位置,用户可利用该方法记录画布中的目标点位。执行go()方法,若取点成功则返回点的位置,默认点值为THREE.Vector3();若取点失败则返回null,示例代码如下:

Mx.loadCoreCode().then(async () => {
    // 创建控件对象
    Mx.MxFun.createMxObject({
        canvasId: "mxdraw", // canvas元素的id
        callback: (mxDrawObject, dom ) => {
            //图纸展示控件创建完成后的回调函数 回调参数mxDraw和dom
            console.log(mxDrawObject, dom)
        },
    });
    const getPoint = new Mx.MxFun.MrxDbgUiPrPoint()
    const pt = await getPoint.go()
    if(!pt) return
    console.log('目标点位' , pt)})

此外,若用户需要连续取点,则可以结合while函数调用go()方法,代码如下:

const getPoint = new Mx.MxFun.MrxDbgUiPrPoint()while(true){
    const pt = await getPoint.go()
    if(!pt) break}

2、辅助命令功能

结合命令功能和mxdraw.js中取点对象提供的一系列方法对绘图操作时所进行的操作,提供相应提示和操作选项,以下面两种常用方法为例。

2.1设置提示字符串:setMessage()方法对绘图操作时所进行的操作进行提示,代码如下:

const getPoint = new Mx.MxFun.MrxDbgUiPrPoint()
getPoint.setMessage('设置提示字符串')
const pt = await getPoint.go()

2.2关键字:setKeyWords()方法可为当前命令设置关键字选项,keyWordPicked()方法可返回用户选择的关键字,代码如下:

const getPoint = new Mx.MxFun.MrxDbgUiPrPoint()
// 设置关键字列表
getPoint.setKeyWords('[闭合(C)/ 放弃(U)]')
// 获取用户选择关键字
getPoint.isKeyWordPicked('关键字')

3.取点对象动态绘制

取点对象中还提供了setUserDraw()方法设置交互过程的动态绘制调用对象,在该过程中所绘制的图像都是临时绘制,不会保存在画布中。该方法提供了两个回调参数:currentPoint、pWorldDraw。

currentPoint为当前光标所在点的点位,pWorldDraw为一个动态绘制回调对象,可根据用户设置动态绘制目标图形,点击动态绘制回调对象查看详细属性和方法说明,示例代码如下:

async function draw_line(){
    const line = new Mx.MxDbLine()
    const getPoint = new Mx.MxFun.MrxDbgUiPrPoint()
    const pt1 = await getPoint.go()
    if(!pt1) return
    line.pt1 = pt1
    // 动态绘制
    getPoint.setUserDraw((currentPoint, pWorldDraw)=>{
        line.pt2 = currentPoint
        pWorldDraw.drawCustomEntity(line)
    })
    const pt2 = await getPoint.go()
    if(!pt2) return
    line.pt2 = pt2
    // 获取控件对象并将线段对象line添加到画布中
    Mx.MxFun.getCurrentDraw().addMxEntity(line);}

三、动态绘制

1.基础绘制

mxdraw.js提供了两种实现动态绘制的方式,它们可以在不改变图形类的情况下,改变图形的大小、方向等,帮助用户更快捷地绘制目标图形。这两种动态绘制的方式都是结合取点对象来实现动态绘制图形的功能。

方式一:

利用API McEdGetPointWorldDrawObject构建一个动态绘制回调对象,再通过取点对象中的setUserDraw()方法调用该对象,点击Mx.McEdGetPointWorldDrawObject API 查看详细属性和方法说明,参考代码:

// 实例化取点对象
const getPoint = new Mx.MrxDbgUiPrPoint();
// 实例化线段对象line
let line = new Mx.MxDbLine()
const pt1 = await getPoint.go()
line.setPoint1(pt1)
// 实例化动态绘制对象
const worldDrawComment = new Mx.McEdGetPointWorldDrawObject();
// 设置动态绘制回调函数
worldDrawComment.setDraw((currentPoint) => {
    line.setPoint2(currentPoint);
    worldDrawComment.drawCustomEntity(line)
});
// 使用动态绘制对象
getPoint.setUserDraw(worldDrawComment)
方式二:

直接运用取点对象提供的setUserDraw()方法设置交互过程的动态绘制调用对象。详细描述可参考取点对象动态绘制,示例代码如下:

const getPoint = new Mx.MrxDbgUiPrPoint()
// 实例化线段对象line
let line = new Mx.MxDbLine();
const pt1 = await getPoint.go()
if(!pt1) return
line.pt1 = pt1
// 实例化动态绘制对象
getPoint.setUserDraw((currentPoint, worldDrawComment)=>{
    line.pt2 = currentPoint
    worldDrawComment.drawCustomEntity(line)
});
const pt2 = await getPoint.go()
if(!pt2) return
line.pt2 = pt2;

在动态绘制中的绘制的图形都是临时的,意味着这些图形最终是不会保持在画布上的,如果需要将动态绘制的图形保存在画布上请调用取点对象的drawReserve方法

2.图形对象的动态绘制

我们的图形对象是继承自自定义图形对象的,而任何的图形对象都可以通过动态绘制对象实现动态绘制的效果。图形对象具体如何实现动态绘制的请前往自定义图形查看详情,示例代码如下:

// 实例化取点对象
const getPoint = new Mx.MrxDbgUiPrPoint();
// 实例化动态绘制对象
const worldDrawComment = new Mx.McEdGetPointWorldDrawObject();
const pt1 = await getPoint.go()
if(!pt1) return
// 设置动态绘制回调函数
worldDrawComment.setDraw((currentPoint) => {
    // 绘制线段对象
    worldDrawComment.drawLine(pt1, currentPoint);
    // 在绘制过程中还可以一起绘制其他图形 绘制过程结束时,不会保留这些图形,如:
    // 绘制以下图形使用红色
    worldDrawComment.setColor('#ff0000')
    // 绘制半径为6的圆
    worldDrawComment.drawCircle(currentPoint, 6)
    // 绘制字体大小为36的 “文字”  角度为0
    worldDrawComment.drawText("文字" ,36 , 0, currentPoint)
    // 绘制矩形 pt1, currentPoint为矩形两对角
    worldDrawComment.drawRect(pt1, currentPoint)
});
// 使用动态绘制对象
getPoint.setUserDraw(worldDrawComment)

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Asuo二维绘图控件v2.0》=============================================================================软件名称:《Asuo二维绘图控件》软件版本: V2.0软件作者:asuo作者邮箱:asuo@263.net软件网站:http://www.asuo.com下载地址:http://www.asuo.com/down/as2d.rar 下载软件语言:vc++授权形式:(ActiveX控件)应用平台:win9x/me/2000/xp界面预览:http://www.asuo.com/as2d_active.htm软件简介:平面图形控件,可以创建和编辑矢量图形以及便捷的显示操作。 文字和尺寸标注;元素属性设置;长度、角度、面积的查询; DXF输出;提供交换文件和二次开发接口。适用于 CAD/CAM/GIS/GPS等相关图形软件开发。软件价格:试用版本免费相关文档:--发布日期:2003.07.29============================================================================== 1.库文件清单: MFC42.DLL MSVCIRT.DLL MSVCRT.DLL ASBASE.DLL ASCSTR.DLL ASDRAW.DLL ASINTR.DLL ASKERN.DLL ASLAW.DLL ASOCX.OCX ASSPLINE.DLL2.控件注册: 控件注册,命令为: regsvr32 Asocx.ocx 解除注册: regsvr32 Asocx.ocx /u3.功能说明:选择:单击鼠标左键选择元素; 框选:在选择状态下,按住鼠标托动进入框选状态; 选择移动元素:在选择状态下,如果当前捕捉到元素,按住鼠标托动元素; 重画(REDRAW):刷新绘图区域; 显示平移(PAN):移动视点,调整看图位置; 框选放大(ZOOM):选择一个放大区域,需要点两点; 显示放大缩小:显示放大为1.2倍,显示缩小为0.8倍; 创建点:选点创建; 创建直线:两点创建直线; 圆心+圆上一点:需要两点创建; 两点圆:需要两点,此两点为圆上点且它们之间距离为直径; 3点圆:需三点,创建过三点的圆,三点共线时创建失败; 圆弧:圆心+起点+终点,需要三点,第一点为圆心,第二点为弧的起点,第三点为弧的终点,弧以逆时针方向; 半圆弧:类似两点圆,逆时针方向; 三点弧:需要三点,创建出过此三点的圆弧;逆时针方向; 椭圆:先给出长轴,然后给椭圆上一点; 样条:依次给出样条线的控制点,双击鼠标左键结束创建样条,样条线必须有三个以上的控制点; 矩形:给出矩形对角两点创建矩形; 删除:删除当前选择到的元素; 复制:复制当前选择到的元素; ...4.开发帮助: 如果用户需要进行特殊的功能扩充,请参考《用户开发手册 index.htm》
### 回答1: CAD .NET二次开发手册文是一本针对使用CAD软件进行二次开发的开发者和程序员所编写的指南。该手册采用文撰写,内容涵盖了使用CAD .NET进行二次开发所需的基础知识、开发技巧和实例案例等方面,旨在帮助读者更高效地进行CAD软件的二次开发。 该手册提供了丰富的CAD .NET开发知识,包括CAD应用程序框架、对象模型、事件、命令、属性、图形处理等等。这些知识可以帮助读者理解CAD软件的底层架构、功能和设计原理,从而更好地进行二次开发。 同时,手册还重点介绍了使用CAD .NET进行二次开发的过程和技巧。比如,如何创建CAD应用程序,如何添加菜单、工具栏等界面元素,如何使用数据库和文件系统等常用资源,如何进行图形操作等等。这些内容对于刚刚开始CAD .NET二次开发的开发者非常有帮助。 此外,手册还提供了大量的实例案例,包括基础的图形对象绘制、编辑、选择、移动等案例,还有一些高级案例,如CAD数据导入、导出、查询、转化等案例。这些案例不仅可以帮助读者更好地理解CAD .NET的编程特点,还可以作为实践的参考和借鉴。 总之,CAD .NET二次开发手册文是一本权威而实用的开发指南,涵盖了丰富的知识和内容,对于任何有意向进行CAD软件二次开发的开发者来说都是一本不可多得的参考资料。 ### 回答2: CAD .NET二次开发手册的文版是一本基于CAD .NET开发平台的详细指南。它包括了许多用于CAD应用程序开发的内容,比如如何使用CAD .NET API来实现CAD二次开发,如何设计CAD插件程序以及如何使用CAD .NET的各种类和方法。 本书内容精细,图文并茂,对不同的开发需求作出了详细说明。其涉及到的主题有CAD系统框架、编程环境准备、CAD对象处理、CAD图形显示与编辑、命令交互与外部应用程序交互等,不仅充分讲解了CAD .NET开发平台的基础,还深入介绍了CAD二次开发的实战技巧。 本书作者系统性地介绍了CAD .NET的开发流程,并深入讲解了各种CAD二次开发的注意事项和技巧。此外,本书还提供了丰富的示例代码,可供读者参考学习。结合实例代码和详细解释,这本书能够更好地帮助读者理解CAD .NET API,快速地开发出符合实际需求的应用程序。 总之,CAD .NET二次开发手册文版是一本极具实用性的开发指南,对于在CAD二次开发领域工作的开发人员和CAD爱好者都具有很高的参考价值。 ### 回答3: CAD .NET二次开发手册是一本介绍如何利用CAD .NET API进行开发的指南。该手册主要包含三个部分: 第一部分介绍了CAD .NET的基础知识,包括CAD .NET的架构、常用类和对象、CAD .NET的扩展性等内容。 第二部分介绍了CAD .NET的应用开发,包括如何创建和修改CAD图形、如何添加和删除实体、如何进行基础编辑等内容。 第三部分介绍了CAD .NET的高级开发技术,包括如何创建用户界面、如何进行数据交互、如何进行自定义命令等内容。此外,该手册还提供了实用的开发案例,帮助开发者更好地理解和应用CAD .NET API进行二次开发

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值