基于ODA的VisualizeJs库的能力

ODA官网的OpenCloud提供了在线浏览CAD图纸的能力(ODA自身也不支持直接在线解析Dwg,而是通过ODA提供的WebTools里面的FileConverter的能力将dwg图纸转换为VSF格式(CAD的一种二三维格式,在AutoCAD中也有一种类似的ForgeViewer支持的一种格式。

  • Autodesk Forge是AutoDesk的产品,由一组强大的Web服务API,SDK开发包以及开发人员社区组成,并提供了想用的开发包,不过并不是免费的,其后台服务有AutoDesk公司提供
  • ODA官方网站提供了一种云端访问在线CAD的能力(VisualizeJs库及其相关插件),其核心是使用WebAassembly技术将ODA的核心代码封装起来(wasm的文件大小近20M,算是很大的一个库了)

本文简单的测试了一下VisualizeJS库的使用

从官方下载相应的第三方库

注意ODA官网需要购买会员才支持下载(费用大概是2万人民币左右)。

  1. 使用官方提供的文件转换器将DWG文件转换为VSF格式文件。

从官网下载WebTool包,内部自带了FileConvert.exe文件(需要同时下载Kernel和Drawing库,将这两个库的的动态库文件放到 WebTools的文件夹下才能正常执行,否则转换不出结果

  1. 编写简易的JS代码

使用VS Code编写代码,安装Live Server插件,在index.html文件右键执行run in Live Server

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<div class="loader"><div></div><span>Loading...</span>
</div><canvas id=canvas width=1200 height=600></canvas>
<!-- 引用刚才生成的example.js文件 -->
<script src="Visualize.js"></script>
<script src="OdaViewerPlugin.js"></script>
<script>var options = {urlMemFile: "Visualize.js.wasm",TOTAL_MEMORY: 20971520};const lib = getVisualizeLibInst(options);
var view=null;
lib.addOnPostRun(() => {document.querySelector(".loader").style.display = "none";const canvas = document.getElementById("canvas");canvas.height = canvas.clientHeight;canvas.width = canvas.clientWidth;lib.canvas = canvas;lib.Viewer.initRender(canvas.width, canvas.height, true);const viewer = lib.Viewer.create();view=viewer;function resize() {canvas.height = canvas.clientHeight;canvas.width = canvas.clientWidth;viewer.resize(0, canvas.width, canvas.height, 0);viewer.update();}resize();window.addEventListener("resize", resize);var plugin = new OdaViewerPlugin(lib);plugin.setActive(plugin.type.Pan);plugin.setAutoSelect(true);//选择事件;plugin.onmessage = (event) => {if (event.type === 'select') {const sSet = event.data;const itr = sSet.getIterator();if (!itr.done()) {const entityId = itr.getEntity();let handle = -1;if (entityId.getType() === 1) {handle = entityId.openObject().getDatabaseHandle();1console.log(handle);} else if (entityId.getType() === 2) {handle = entityId.openObjectAsInsert().getHandle();console.log(handle);}}}}fetch("test1.vsf").then((responce) => responce.arrayBuffer()).then((arrayBuffer) => {// disable loaderdocument.querySelector(".loader").style.display = "none";// clear bufferviewer.clear();// pass file as Uint8Array to the viewer for parsingviewer.parseFile(new Uint8Array(arrayBuffer));// call zoomExtenst method in case the camera is not aimed at the whole scene by defaultviewer.zoomExtents();});function render() {viewer.update();requestAnimationFrame(render);}render();
});function showlayers(){var iter=view.getLayersIterator();
console.log("layers begin");
for(; !iter.done(); iter.step()) {var layer_id=iter.getLayer();if(layer_id==null){console.log("layer end");return;}var layer=layer_id.openObject();if(layer==null){return;}console.log(layer.getName());
}console.log("layers end");}</script>
<body><button title="ok" onclick="showlayers()">显示图层</button>
</body>
</html>
  1. 成果展示

原始Dwg转换为自定义第三方格式

严格来说,目前市面上的产品都不是直接解决dwg,大部分都是转换成第三方格式(包括有能力解析的一些公司,如梦想控件还有AutoDesk公司,原因二,dwg的二进制解析的读写效率比较低,不太适合在前端这样的地方去解析渲染 其二 为了与其他的第三方框架结合,只是展示dwg数据的平台并不适应时代的发展。

目前发现做的还不错的在线CAD与GIS结合的平台主要有mxCADjsmap
mxCAD 梦想控件 在线CAD有两种方式,一种是比较古老的Com组件(不能跨平台、依赖IE)和最新使用threejs来实现的在线CAD的渲染,支持将CAD的渲染图层嵌入到mapbox-js的自定义图层中渲染(主要是接管WebGL的上下文),其渲染的样式由mxCAD基于threejs来来实现其渲染,其原理还是使用在前端来实现自定义渲染。
JSMap 与mxCAD的实现方式基本类似,不过JSMap在可视化渲染方面有全内存矢量渲染,MVT矢量切片、栅格切片方式。对于MVT的矢量切片,JSMap的逻辑是在上层基本完全复刻CAD的基本对象,在对象中添加一个渲染方法,最终是将生成的SVG对象传入到Canvas中。所以理论上只要支持SVG图片加载的框架都支持其渲染,其选择拾取使用的是GIS空间拾取的思想。

自主在线CAD渲染

需要达到的目标

  1. 能够实现CAD的在线渲染和实时在线编辑功能
  2. 支持矢量切片服务(如MVT格式)
  3. 支持与其他第三方前端渲染框架集成(如threejs、cesium、mapbox-js等)
  4. 需要提供后端服务(如CAD数据的转换)

方案1(本来计划中的方案)

  1. 将dwg数据转成postgis数据格式,并解析其中的块、线型、填充符号。
  2. 将解析的符号转换成mapbox支持的符号,将postgis数据发布成MVT服务
  3. 前端通过mapbox-js库执行渲染(这种方式可能大概可以支持80%的符号,没有还没有深入研究,但是常规的一些符号应该是有可能的,在字体样式、曲线、尺寸标注上无法实现),其样式渲染可以使用支持mapbox的样式库(ol-mapbox-style)

方案2

与方案一的不同在于,其前端渲染部分完全自己写(我们在做GIS这块已经积累了这块的能力),其实现完全使用C++技术(负责对符号的解析、计算、不借用任何第三方库、生成的文件大小最多2M左右)、渲染画笔由前端提供、这种方式可以兼容CAD中99%的符号(如果加快速度完全可以复刻QCAD的部分渲染能力)。
有如下优点

  1. 在无需服务器的情况下,做到代码的完全闭源
  2. 支持桌面、服务器、前端渲染
  3. 基本可以实现CAD中所有的样式。
  4. 与第三方主流框架紧密结合

缺点是周期相对比较长、至少三个月起步

关于在线CAD编辑的解决方案思考相关推荐

  1. 免费在线云服务CAD编辑软件AutoCAD易

    欧特克日前在上海召开"应云而生,服务中国"欧特克云战略暨AutoCAD易产品发布新闻发布会,宣布正式推出专门面向中国市场的免费在线 CAD 软件AutoCAD易.同时,欧特克还宣布 ...

  2. office 文件在线协作编辑——解决方案1(基于sharepoint的二次开发)

    概述 office 文件在线协作编辑主要是指word.excel.ppt的多人在线协作编辑,实时同步的功能: 这里主要介绍解决方案之一--基于sharepoint的二次开发(还可以基于wopi实现)的 ...

  3. 谁还不知道,在线CAD有多好用!

    我们时常因为各种原因下载不了AutoCAD,可能是电脑的系统配置问题,也可能是之前安装的软件版本没卸载干净,不能继续安装.遇到这种情况,一定别忘了还有在线CAD这个可靠的解决方案. 在线CAD是指Au ...

  4. 在线协作编辑OT算法简介

    一.背景 在线文档,简单的来说,这些产品的模式都是富文本编辑器+后台,富文本编辑器产生内容.展示内容,然后后台负责保存. 富文本编辑器的产品和技术已经非常成熟了,像codeMirror,当然本身实现也 ...

  5. 文档在线预览产品系列-解决方案篇

    文档在线预览产品系列-解决方案篇 hello 大家好,我又来了,上次我们聊到文档在线预览市场的产品类别有很多,今天我们就来盘点下各个类别以及对应的一些产品品牌. 产品类别 开源项目 开源项目是啥就不多 ...

  6. 基于web的在线视频编辑的设计

    前言 在这里,先吐槽一下,最近一直很忙,就要过年了,公司项目赶得要命,吃不好,睡不好,周末都没得休息(写到这里就憋着一肚火了).不过,付出还是有回报的,在团队的合作努力下,项目还是在过年前完成了,最近 ...

  7. 在线生成条形码的解决方案(39码、EAN-13)

    在线生成条形码的解决方案(39码.EAN-13) 在线生成条形码的解决方案(39码.EAN-13) 在线生成条形码的解决方案(39码.EAN-13) 公司有个项目是使用实体刷卡的会员管理系统,并为其它 ...

  8. java 协作编辑,在线协作编辑器之周报收集

    在线协作编辑器之周报收集 一.实验说明 下述介绍为实验楼默认环境,如果您使用的是定制环境,请修改成您自己的环境介绍. 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本 ...

  9. 在线CAD的妙用大揭秘,还不快看过来!

    还有人不知道怎么登录在线CAD?怎么在浏览器中使用在线CAD?往下看! 首先.你需要有 AutoCAD 或 AutoCAD LT 固定期限的使用许可,即可在 Web 浏览器中使用 AutoCAD We ...

最新文章

  1. 生成对抗网络(GAN)的理论与应用完整入门介绍
  2. oa提醒模块要素_OA办公系统的选型有哪些要素?OA系统如何给企业带来巨大价值?...
  3. Echart报错: Map china not exists. You can download map file on
  4. 【Pytorch教程】:激励函数
  5. YAMLsnakeyaml简介
  6. 分享一份软件测试面试指南
  7. 实现HTML格式电子邮件群发
  8. keras的net中使用tensorflow函数, AttributeError: ‘NoneType‘ object has no attribute ‘_inbound_nodes‘
  9. 2019年数学建模国赛(国一)经历总结
  10. [网鼎杯 2020 朱雀组]Nmap
  11. mpvue的使用(一)必要的开发环境
  12. 快速上手 Flutter 空安全
  13. JS计算数组各数据所占百分比
  14. 再论意识、行为和结果
  15. 简单的输入一个数计算其阶乘小程序
  16. 连续相乘计算机公式,Excel中如何批量算乘法?一个公式即可搞定所有乘法!
  17. 力学与理论力学[上册]——杨维纮
  18. Siri算数字人吗?清华人大教授、初创公司CTO、 产业专家与快手工程师一起说|CCF C³...
  19. 自研扫地机器人激光雷达,Camsense有何胜算?
  20. linux rman删除备份,【RMAN】【RMAN命令】DELETE 命令(5)--删除特定备份集(不提示)

热门文章

  1. js-截取数组、拼接数组(附splice、slice辨析)
  2. unity模型黑色的问题
  3. DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks
  4. react style 设置背景图片
  5. Spark Idea Maven 开发环境搭建(转载)
  6. sql 求同时在线人数(或者同时观看人数/同时浏览人数)
  7. python换发型_27 岁的程序员应该怎么从发型、着装上提升自己?
  8. 某组织发公开信直指YouTube为主要虚假讯息散播平台
  9. 优秀硬盘分区管理工具--Partition Magic V8.0
  10. 东北农业大学第九届程序设计竞赛 题解