現(xiàn)狀
在CAD看圖過程中我們經(jīng)常會需要用到查找文字的功能活烙,在AutoCAD軟件查找一個文字時,可以通過打開左下角輸入命令find
钠乏,輸入查找的文字代箭,然后設(shè)置查找范圍墩划,就可以搜索到需要查詢的文字。但在Web網(wǎng)頁端打開CAD圖查找文字時嗡综,有沒有同樣的辦法呢乙帮?另外,如果有沒有辦法實現(xiàn)在很多圖紙中像百度那樣做到全文檢索的功能极景?
實現(xiàn)思路
CAD圖Web打開展示
拿之前分享的一款開源的利用最新技術(shù)棧Vue3
開發(fā)的 唯杰地圖云端圖紙管理平臺 https://vjmap.com/app/cloud 為例. 他實現(xiàn)了對AutoCAD
格式的DWG
圖紙的云端管理查看功能察净。能對CAD圖紙在線上傳、打開盼樟、查看氢卡、版本管理; 在線圖層管理切換查看功能; 屬性數(shù)據(jù)查詢功能等功能。
圖中文字查找
圖紙中文字查找方案
方法一 直接后臺讀取CAD圖紙內(nèi)容晨缴,遍歷所有的文字實體進行查找译秦。
主要的文字實體包括 單行文本`AcDbText`,多行文本`AcDbMText`,屬性注記`AcDbAttributeDefinition`,塊屬性`AcDbAttribute`
實現(xiàn)步驟:
(1) 在前端寫代碼通過內(nèi)存方式在后臺打開CAD圖形
// 打開地圖
let res = await svc.openMap({
mapid: 'mapid', // 地圖ID,(請確保此ID已存在击碗,可上傳新圖形新建ID)
mapopenway: vjmap.MapOpenWay.Memory, // 后臺以內(nèi)存方式打開已上傳的圖
})
(2) 查找文本實體筑悴,因為前端是javascript語言,不可能直接去遍歷后臺圖形數(shù)據(jù)庫稍途,這時可以用表達式查詢來后臺進行查詢
let query = await svc.exprQueryFeature({
expr: `gOutReturn := if((gInFeatureType == 'AcDbText' or gInFeatureType == 'AcDbMText' or gInFeatureType == 'AcDbAttributeDefinition' or gInFeatureType == 'AcDbAttribute' ), 1, 0);`,
fields: "",
limit: 100000
})
表達式語法可參考https://vjmap.com/guide/expr.html
這樣查詢有個缺點就是每次查詢都要在后臺打開CAD圖形阁吝,然后再遍歷圖形數(shù)據(jù)庫,根據(jù)表達式過濾出要查找的文字械拍,效率低突勇。
[圖片上傳失敗...(image-b22dcc-1650803580089)]
方法二 通過SQL語句查詢數(shù)據(jù)庫來查找文字
實現(xiàn)步驟:
(1) 在前端寫代碼通過幾何渲染方式在后臺打開CAD圖形装盯,幾何渲染方式第一次請求數(shù)據(jù)時,會在后臺打開圖形甲馋,然后把圖形數(shù)據(jù)和屬性數(shù)據(jù)會保存至空間數(shù)據(jù)庫埂奈,之后請求都會在空間數(shù)據(jù)庫里查詢數(shù)據(jù)。
// 打開地圖
let res = await svc.openMap({
mapid: env.exampleMapId, // 地圖ID,(請確保此ID已存在摔刁,可上傳新圖形新建ID)
mapopenway: vjmap.MapOpenWay.GeomRender // 以幾何數(shù)據(jù)渲染方式打開
})
(2) sql語句查詢文字挥转,直接上代碼
let query = await svc.conditionQueryFeature({
//只需要寫sql語句where后面的條件內(nèi)容,字段內(nèi)容請參考文檔"服務端條件查詢和表達式查詢"
// 查詢所有文字(包括單行文本,多行文本共屈、塊注記文字,屬性文字) 具體類型數(shù)字參考文檔"服務端條件查詢和表達式查詢-支持的cad實體類型" https://vjmap.com/guide/svrStyleVar.html
condition: `name='12' or name='13' or name='26' or name='27'`,
fields: ""
})
SQL查詢無需在后臺再次打開CAD圖形党窜,直接使用SQL語句查詢數(shù)據(jù)庫,效率高拗引。
[圖片上傳失敗...(image-a4a092-1650803580089)]
全文檢索功能
如果后臺有成百上千紙圖紙,怎么做到全文檢索呢幌衣?
首先想到的肯定是遍歷所有的圖紙矾削,然后根據(jù)要搜索的文字一個個的去查詢,這樣也能實現(xiàn)豁护,就是圖紙比較多時哼凯,性能太低了,耗時楚里。
這里可以利用開源的全文檢索庫去實現(xiàn)断部。
開源的 Elasticsearch (以下簡稱 ES)是目前全文搜索引擎的首選。
它可以快速地儲存班缎、搜索和分析海量數(shù)據(jù)蝴光。維基百科、Stack Overflow达址、Github 都采用它蔑祟。
可以在后臺實時查找出所有圖形的文字然后利用ES建立索引,然后利用ES去查詢沉唠,根據(jù)查找的結(jié)果定位到某圖某實體上疆虚。
但是ES太重量級了,也難部署满葛,用到這種搜索功能上簡直就是大材小用径簿。
下面推薦一款輕量級的單文件部署的全文搜索開源引擎。
Bleve是一款基于Golang實現(xiàn)的全文搜索與索引組件庫纱扭,具有簡單的API牍帚、豐富的接口擴展能力、映射可自定義乳蛾、全面的索引數(shù)據(jù)類型等特點暗赶。
組件官網(wǎng):http://blevesearch.com/
有興趣的朋友可以搭建研究下鄙币。