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

news2024/9/22 4:05:02

基于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的文件夹下才能正常执行,否则转换不出结果

image.png

  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();1
            console.log(handle);
          } else if (entityId.getType() === 2) {
            handle = entityId.openObjectAsInsert().getHandle();
            console.log(handle);
          }
        }
     }
  }
  fetch("test1.vsf")
    .then((responce) => responce.arrayBuffer())
    .then((arrayBuffer) => {
      // disable loader
      document.querySelector(".loader").style.display = "none";
      // clear buffer
      viewer.clear();

      // pass file as Uint8Array to the viewer for parsing
      viewer.parseFile(new Uint8Array(arrayBuffer));

      // call zoomExtenst method in case the camera is not aimed at the whole scene by default
      viewer.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空间拾取的思想。
image.png
image.png

自主在线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. 与第三方主流框架紧密结合

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatGPT衣食住行10种场景系列教程(01)使用chatGPT设计发型、P图变漂亮~真帅哈哈哈~

导读 时隔5个多月&#xff0c;chatGPT可谓是一日千里&#xff0c;越演越火&#xff0c;携带着AIGC行业一起飞了起来&#xff0c;那么在短短5个月当中有那些值得我们关注的事件&#xff1f;有那些好玩的场景&#xff1f;以及有那些chatGPT好用的工具&#xff1f;本文都将一一告…

neo4j数据库的安装及使用

一、安装neo4j 安装neo4j数据库&#xff0c;需要先安装jdk&#xff0c;jdk版本不能太低&#xff0c;不然运行neo4j的时候会报错。 我下载的是jdk11&#xff0c;以前已经下载过了&#xff0c;这里不再进行演示&#xff0c;下载jdk11的教程应该挺多的&#xff0c;自己搜一个吧 …

nodejs+vue美容院预约管理系统springboot+java+python

本课题将根据用户类型大致划分为管理员模块和美容师模块和用户模块&#xff0c;开发语言拟采用目前比较 语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode &#xff0c;界面采用vue前端框…

jsp+servlet教材预定系统mysql

目 录 一、引言 6 (一) 课题目的及意义 6 1、课题目的 6 2、课题研究意义 6 (二) 国内外研究现状 6 1、国外研究现状 6 2、国内研究现状 7 (三) 研究方法及设计思路 7 1、研究方法 7 2、设计思路 8 二、需求分析与可行性分析 9 (一) 需求分析…

源码:LeakCanary

一、介绍 自动检测内存泄漏的检查工具 二、使用 debugImplementation com.squareup.leakcanary:leakcanary-android:2.5debugImplementation只在debug模式的编译和最终的debug apk打包时有效 Memory Profiler 使用步骤 生成的内存泄漏快照 会放在sdcard/Download/leakcanar…

Node【Global全局对象】之【URL】

文章目录 &#x1f31f;前言&#x1f31f;URL&#x1f31f;URL组成部分&#x1f31f;URL 类&#x1f31f;url.href&#x1f31f;url.pathname&#x1f31f;url.port&#x1f31f;url.protocol&#x1f31f;url.search&#x1f31f;url.searchParams&#x1f31f;url.hash&#…

DAY829

学习目标&#xff1a;成就上瘾&#xff0c;学到欲罢不能 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背单词150个&#xff0c;背《死亡诗社》经典语段&#xff0c;抄写…

【web前端开发】CSS定位

文章目录 1.定位介绍2.定位的方式2.1 相对定位2.2 绝对定位2.2.1 子绝父相 2.3 固定定位 3. 元素的层级关系4. 总结 1.定位介绍 定位有两个作用: 1.可以解决盒子和盒子之间的层叠问题 (定位之后元素层级最高,可以层叠在其它盒子上面) 2.可以让盒子始终固定在屏幕中的某个位置 …

shell呈现数据

shell脚本编程系列 理解输入和输出 目前为止了解了两种显示脚本输出的方法&#xff1a;在显示器屏幕上显示输出&#xff0c;将输出重定向到文件中&#xff0c;这两种方法将数据输出全部显示出来&#xff0c;要么什么都不显示&#xff0c;但有时一部分数据显示屏幕上&#xff0…

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中&#xff0c;都会线加载一张图片然后再进入闪屏页。这样&#xff0c;可以给用户很好的体验。 作用&#xff1a;避免加载白屏页面&#xff0c;进行业务的预处理&#xff08;网络检测、数据预加载...&#xff09; 界面组成…

基于Pyqt5快速构建应用程序详细教程

一、介绍 图形用户界面&#xff0c;更广为人知的名称是 GUI&#xff0c;是当今大多数个人计算机的一个特征。 它为不同计算技能水平的用户提供了直观的体验。 尽管 GUI 应用程序可能会使用更多资源&#xff0c;但由于其点击式特性&#xff0c;它们通常对用户友好。 PyQt 是可用…

最小生成树|二分图

最小生成树跟边的正负没有任何关系。 最小生成树 朴素Prime 该算法和Dijkstr算法很像。 先把所有距离初始化为正无穷 进行n次迭代 找到不在集合&#xff08;集合指当前的生成树&#xff09;当中的点&#xff0c;s数组表示当前已经在连通块&#xff08;生成树&#xff09;中的所…

vue-simple-uploader在VUE3中分片上传大文件

vue-simple-uploader是一个优秀的大文件分片上传组件&#xff0c;在vue2里面工作一切正常&#xff0c;但是在vue3里面却发现了一些问题&#xff1a; &#xff08;1&#xff09;在element-plus的el-dialog里面渲染失败&#xff1b; &#xff08;2&#xff09;上传进度条不能正…

由浅入深详解四种分布式锁

在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁或者Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁&#xff0c;在单个JVM进程中提供线程之间的锁…

信息系统项目管理师,第四版应该如何应对

一、 改版情况。 2023年3月&#xff0c;新版教材起售。 2023年4月4日&#xff0c;官网宣布本次考试第三版第四版兼顾使用。 以历年的考试时间来看&#xff0c;一般这次考试是在 5月27日、28日附近。 接下来只有一个月左右的时间了。给大家聊聊面对现在这个情况如何备考。 …

考研计算机组成原理总结(7)

一.虚拟存储器 1.基本知识 主存和辅存共同构成了虚拟存储器&#xff0c;二者在硬件和系统软件的共同管理下工作。对于应用程序员而言&#xff0c;虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。 2.基本概念 虚拟存储器将主存或辅存的地址空间统一编址&#x…

如何提高图片清晰度?三种方法来帮你!

如何提高图片清晰度&#xff1f;图片在上传到网络后会被压缩&#xff0c;导致图片变得模糊。今天&#xff0c;我将分享三种方法&#xff0c;帮助您提高图片的清晰度。 方法一&#xff1a;使用记灵在线工具 工具地址&#xff1a;记灵在线工具 - 更专注于发现工具的实用性 该工…

[Linux 命令] ls 显示目录内容列表

ls 显示目录内容列表 思维导图 补充说明 ls命令 就是list的缩写&#xff0c;用来显示目标列表&#xff0c;在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示&#xff0c;以分区不同类型的文件。 语法 ls [选项] [文件名...][-1abcdfgiklmnopqrstuxABCD…

Node.js下载安装与简单使用

一、下载Node.js 打开链接&#xff1a;Node.js 的官网首页&#xff08;https://nodejs.org/en/&#xff09; 选择左边的 LTS 版本和 Current 版本的不同 1.LTS 为长期稳定版&#xff0c;对于追求稳定性的企业级项目来说&#xff0c;推荐安装 LTS 版本的 Node.js。 2.Current …

【系统集成项目管理工程师】项目质量管理

&#x1f4a5;十大知识领域&#xff1a;项目质量管理 项目质量管理包括以下 3 个过程: 规划质量管理实施质量保证质量控制 一、规划质量管理 规划质量管理是识别项目及其可交付成果的质量要求和标准&#xff0c;并准备对策确保符合质量要求的过程 这部分重点主要是工具与技术 1…