在CAD看圖過程中我們經常會需要用到查詢文字的功能,在AutoCAD軟體查詢一個文字時,可以通過開啟左下角輸入命令find
,輸入查詢的文字,然後設定查詢範圍,就可以搜尋到需要查詢的文字。但在Web網頁端開啟CAD圖查詢文字時,有沒有同樣的辦法呢?另外,如果有沒有辦法實現在很多圖紙中像百度那樣做到全文檢索的功能?
實現思路
CAD圖Web開啟展示
拿之前分享的一款開源的利用最新技術棧Vue3
開發的
圖中文字查詢
圖紙中文字查詢方案
方法一 直接後臺讀取CAD圖紙內容,遍歷所有的文字實體進行查詢。
主要的文字實體包括 單行文字AcDbText
,多行文字AcDbMText
,屬性註記AcDbAttributeDefinition
,塊屬性AcDbAttribute
實現步驟:
// 開啟地圖
let res = await svc.openMap({
mapid: 'mapid', // 地圖ID,(請確保此ID已存在,可上傳新圖形新建ID)
mapopenway: vjmap.MapOpenWay.Memory, // 後臺以記憶體方式開啟已上傳的圖
})
(2) 查詢文字實體,因為前端是javascript語言,不可能直接去遍歷後臺圖形資料庫,這時可以用表示式查詢來後臺進行查詢
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圖形,然後再遍歷圖形資料庫,根據表示式過濾出要查詢的文字,效率低。
方法二 通過SQL語句查詢資料庫來查詢文字
實現步驟:
(1) 在前端寫程式碼通過幾何渲染方式在後臺開啟CAD圖形,幾何渲染方式第一次請求資料時,會在後臺開啟圖形,然後把圖形資料和屬性資料會儲存至空間資料庫,之後請求都會在空間資料庫裡查詢資料。
// 開啟地圖
let res = await svc.openMap({
mapid: env.exampleMapId, // 地圖ID,(請確保此ID已存在,可上傳新圖形新建ID)
mapopenway: vjmap.MapOpenWay.GeomRender // 以幾何資料渲染方式開啟
})
(2) sql語句查詢文字,直接上程式碼
let query = await svc.conditionQueryFeature({
//只需要寫sql語句where後面的條件內容,欄位內容請參考文件"服務端條件查詢和表示式查詢"
// 查詢所有文字(包括單行文字,多行文字、塊註記文字,屬性文字) 具體型別數字參考文件"服務端條件查詢和表示式查詢-支援的cad實體型別" https://vjmap.com/guide/svrStyleVar.html
condition: `name='12' or name='13' or name='26' or name='27'`,
fields: ""
})
SQL查詢無需在後臺再次開啟CAD圖形,直接使用SQL語句查詢資料庫,效率高。
全文檢索功能
如果後臺有成百上千紙圖紙,怎麼做到全文檢索呢?
首先想到的肯定是遍歷所有的圖紙,然後根據要搜尋的文字一個個的去查詢,這樣也能實現,就是圖紙比較多時,效能太低了,耗時。
這裡可以利用開源的全文檢索庫去實現。
開源的
它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。
可以在後臺實時查詢出所有圖形的文字然後利用ES建立索引,然後利用ES去查詢,根據查詢的結果定位到某圖某實體上。
但是ES太重量級了,也難部署,用到這種搜尋功能上簡直就是大材小用。
下面推薦一款輕量級的單檔案部署的全文搜尋開源引擎。
Bleve是一款基於Golang實現的全文搜尋與索引元件庫,具有簡單的API、豐富的介面擴充套件能力、對映可自定義、全面的索引資料型別等特點。
-
元件官網:
-
元件倉庫: