如何在前端通过JavaScript创建修改CAD图形

背景

在之前的博文CAD图DWG解析WebGIS可视化技术分析总结CAD_DWG图Web可视化一站式解决方案-唯杰地图-vjmap中讲解了如何把CAD的DWG格式的图纸Web可视化的方案,那在Web前端能不能通过JavaScript创建或基于现在的CAD图形进行修改呢?

现状

创建修改CAD图形,一般是基于AutoCAD进行二次开发,ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象开发环境应用程序接口,能真正快速的访问AutoCAD图形数据库。 与以往的 AutoCAD 二次开发工具 AutoLISP 和ADS不同,ObjectARX应用程序是一个DLL(动态链接库),共享AutoCAD的地址空间,对AutoCAD进行直接函数调用。所以,使用ARX编程的函数的执行速度得以大大提高。ARX 类库采用了标准的C++类库的封装形式,这也大大提高了程序员编程的可靠度和效率。

运用ObjectARX进行二次开发,必须首先设置好ObjectARX的开发环境。常用的开发环境是Microsoft Visual C++ 6.0 、Microsoft visual studio 2005、Microsoft visual studio 2008、Microsoft visual studio 2010。同时,还需要安装ObjectARX SDK。

Visual C++、ObjectARX等开发语言和环境肯定吓跑了不少开发者。那对于一些简单的场景,如只要根据数据自动成图或者在现在的图形上做一些很简单的修改,有没有一个简单的办法或语言和开发环境?

JS新建修改CAD图形

唯杰地图在前端实现了常用的AutoCAD实体封装,能通过JavaScript脚本创建新的CAD图形。

支持的CAD实体类型

类名称说明
DbLine直线
DbCurve曲线
Db2dPolyline二维折线
Db3dPolyline三维多段线
DbPolyline多段线
BlockReference块参照
DbArc圆弧
DbCircle
DbEllipse椭圆
DbHatch填充
Text单行文本
DbMText多行文本
RasterImage栅格图片
DbShape型实体
Spline样条曲线
Wipeout遮罩实体
Dimension标注
Db2LineAngularDimension角度标注[两条线]
Db3PointAngularDimension角度标注[三点]
DbAlignedDimension对齐标注
DbArcDimension圆弧标注
DbDiametricDimension直径标注
DbOrdinateDimension坐标标注
DbRadialDimension半径标注
DbRadialDimensionLarge半径折线标注
DbRotatedDimension转角标注
DbLayer图层
DbTextStyle文字样式
DbDimStyle标注样式
DbLinetypeStyle线型样式
DbBlock块定义
DbDocument数据库文档

下面以新建一个篮球场示意图以例,相关代码如下:

 

(async () => {
    // --新建地图--在后台新建CAD图,然后在前端打开
    // js代码
    let svc = new vjmap.Service(env.serviceUrl, env.accessToken)
    let doc = new vjmap.DbDocument();
    let entitys = [];
    let line1 = new vjmap.DbLine();
    line1.start = [0, 0]
    line1.end = [0, 15]
    entitys.push(line1)
​
    let line2 = new vjmap.DbLine();
    line2.start = [0, 14.1]
    line2.end = [2.99, 14.1]
    entitys.push(line2)
​
    let line3 = new vjmap.DbLine();
    line3.start = [0, 0.9]
    line3.end = [2.99, 0.9]
    entitys.push(line3)
​
    let line4 = new vjmap.DbLine();
    line4.start = [0, 9.95]
    line4.end = [5.8, 9.95]
    entitys.push(line4)
​
    let line5 = new vjmap.DbLine();
    line5.start = [0, 5.05]
    line5.end = [5.8, 5.05]
​
    let hatch = new vjmap.DbHatch();
    hatch.pattern = "SOLID";
    hatch.color = 0xB43F32;
    hatch.points = [line4.start, line4.end, line5.end, line5.start];
    entitys.push(hatch);
    entitys.push(line4)
    entitys.push(line5)
​
    let line6 = new vjmap.DbLine();
    line6.start = [5.8, 5.05]
    line6.end = [5.8, 9.95]
    entitys.push(line6)
​
    let arc1 = new vjmap.DbArc();
    arc1.center = [5.7963, 7.504];
    arc1.radius = 1.8014;
    arc1.startAngle = 270 * Math.PI / 180.0;
    arc1.endAngle = 90 * Math.PI / 180.0;
    entitys.push(arc1)
​
    let arc2 = new vjmap.DbArc();
    arc2.center = [5.7963, 7.504];
    arc2.radius = 1.8014;
    arc2.startAngle = 90 * Math.PI / 180.0;
    arc2.endAngle = 270 * Math.PI / 180.0;
    //arc2.linetype = "DASHED"
    entitys.push(arc2)
​
    let arc3 = new vjmap.DbArc();
    arc3.center = [1.575, 7.5];
    arc3.radius = 6.75;
    arc3.startAngle = 282 * Math.PI / 180.0;
    arc3.endAngle = 78 * Math.PI / 180.0;
    entitys.push(arc3)
​
    let block = new vjmap.DbBlock();
    block.name = "ball";
    block.origin = [0, 0]
    block.entitys = entitys;
    doc.appendBlock(block);
​
    let blockRef1 = new vjmap.DbBlockReference();
    blockRef1.blockname = "ball";
    blockRef1.position = [0, 0];
    doc.appendEntity(blockRef1);
​
    let blockRef2 = new vjmap.DbBlockReference();
    blockRef2.blockname = "ball";
    blockRef2.position = [28, 15];
    blockRef2.rotation = Math.PI;
    doc.appendEntity(blockRef2);
​
    let otherEnts = [
        new vjmap.DbLine({
            start: [0, 15],
            end: [28, 15]
        }),
        new vjmap.DbLine({
            start: [0, 0],
            end: [28, 0]
        }),
        new vjmap.DbLine({
            start: [14, 0],
            end: [14, 15],
            colorIndex: 1
        }),
        new vjmap.DbCircle({
            center:[14, 7.5],
            radius: 1.83,
            color: 0xFF0000
        }),
        new vjmap.DbText({
            position: [14, 16],
            contents: "篮球场示意图",
            colorIndex: 1,
            horizontalMode: 4,
            height: 1,
        })
    ]
​
    doc.appendEntity(otherEnts);
​
    // js代码
    let res = await svc.updateMap({
        mapid: "basketballCourt",
        filedoc: doc.toDoc(),
        mapopenway: vjmap.MapOpenWay.Memory,
        style: vjmap.openMapDarkStyle() // div为深色背景颜色时,这里也传深色背景样式
    })
    if (res.error) {
        message.error(res.error)
    }
    let mapExtent = vjmap.GeoBounds.fromString(res.bounds);
    let prj = new vjmap.GeoProjection(mapExtent);
​
    var map = new vjmap.Map({
        container: 'map', // container ID
        style: svc.rasterStyle(),
        center: prj.toLngLat(mapExtent.center()),
        zoom: 2,
        renderWorldCopies: false
    });
    map.attach(svc, prj);
    map.fitMapBounds();
​
    map.addControl(new vjmap.NavigationControl());
    map.addControl(new vjmap.MousePositionControl({showZoom: true}));
​
    map.enableLayerClickHighlight(svc, e => {
        e && message.info(`type: ${e.name}, objectid: ${e.objectid}, layer: ${e.layerindex}`);
    })
})();

创建完后,Web显示如下:

image-20211018195709908

把创建的DWG图形,在AutoCAD里面可以打开此图:

image-20211018200747551

修改或删除

修改通过from属性设置 来源于哪个图,会在此图的上面进行修改或新增删除,格式如 形式为 mapid/version,如 exam/v1 .

删除的话,指定图中实体的objectID

示例代码如下:

let doc = new vjmap.DbDocument();
/** 来源于哪个图,会在此图的上面进行修改或新增删除,格式如 形式为 mapid/version,如 exam/v1 . */
doc.from = "basketballCourt/v1";
​
// 修改或删除实体是通过传递 `objectid` 实体句柄,如果没有 `objectid` 则表示新增
let modifyEnts = [
    /*修改*/
    new vjmap.DbCircle({
        objectid: "71",// 实体句柄,如传了实体句柄,是表示修改或删除此实体. 
        colorIndex: 2
    }),
    /*删除*/
    new vjmap.DbText({
        objectid: "73",// 实体句柄,如传了实体句柄,是表示修改或删除此实体. 
        delete: true // 表示删除
    }),
    /*新增(没有传 objectid )*/
    new vjmap.DbMText({
        position: [14, -2],
        contents: "我是多行文本",
        colorIndex: 3,
        attachment: 2,
        height: 1,
    })
]
doc.appendEntity(modifyEnts);
​
// js代码
let res = await svc.updateMap({
    mapid: "newBasketballCourt",
    filedoc: doc.toDoc(),
    mapopenway: vjmap.MapOpenWay.Memory,
    style: vjmap.openMapDarkStyle() // div为深色背景颜色时,这里也传深色背景样式
})

结果如下:

image-20211018201221961

可以访问 demo地址 新建修改CAD图形 | 唯杰地图-VJMAP 去体验下效果

应用场景

适用于在前端有数据,需要在线创建或基于现在CAD图形进行修改或删除;如可获取全国的GeoJson数据创建一个CAD图形;对于一些经常变化的数据如工程进度图纸根据进度数据实时绘制生成DWG图纸等场景;对于专业复杂的图形绘制或编辑工作,建议使用ObjectARX对AutoCAD进行二次开发实现!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值