近有很多做工程的朋友想要學(xué)習(xí)BIM+GIS技術(shù),向我詢問相關(guān)的學(xué)習(xí)資源和資料。他們面臨的普遍問題是不知道如何入門,找到的資料很多,但是很多卻用不上。
為了解決大家的問題,我們團(tuán)隊花了近一個月的時間,精心整理了一份實用的BIM+GIS學(xué)習(xí)資料合集,包含五個模塊,超過上千份資料。
這份合集包含了常用的BIM+GIS軟件安裝教程、基礎(chǔ)操作指南、項目管理流程介紹等常規(guī)資料,還包括BIM+GIS結(jié)合使用、BIM+GIS在實際工程中的應(yīng)用案例、行業(yè)發(fā)展趨勢和未來展望等內(nèi)容。
先帶大家看下這份資料清單:
40套BIM+GIS項目案例合集領(lǐng)取,圖新地球公眾號回復(fù)【BIM+GIS】
一、BIM+GIS三維數(shù)字沙盤快速搭建視頻教程
這份合集不僅包含了常用的BIM+GIS軟件安裝教程、基礎(chǔ)操作指南、項目管理流程介紹等常規(guī)資料,還包括BIM+GIS與其他技術(shù)的結(jié)合使用、BIM+GIS在實際工程中的應(yīng)用案例、行業(yè)發(fā)展趨勢和未來展望等內(nèi)容。
二、BIM模型庫資源
每次制作設(shè)計方案、匯報工程現(xiàn)場狀況,最令人頭大的就是方案素材的尋找,想要表達(dá)的信息太多,素材獲取無從下手!別急!大波工程、建筑、設(shè)計領(lǐng)域資料,空投即將到達(dá),助你成為匯報現(xiàn)場最靚的仔!
旨在為工程、設(shè)計行業(yè)用戶提供優(yōu)質(zhì)資料,精心挑選,先到先得哦
三、BIM+GIS實際應(yīng)用案例視頻
聯(lián)合BIM領(lǐng)域資深工程師打造的BIM+GIS案例教程,保姆式手把手帶你搭建三維可視化BIM+GIS數(shù)字沙盤,深入學(xué)習(xí)BIM+GIS的高級技能和實際應(yīng)用案例。
四、免費版BIM+GIS三維數(shù)字沙盤搭建平臺(1款)
提供一款免費BIM+GIS三維數(shù)字沙盤搭建平臺,為工程師、設(shè)計師以及相關(guān)領(lǐng)域的專業(yè)人士提供直觀、精準(zhǔn)的空間數(shù)據(jù)可視化工具。
BIM+GIS三維數(shù)字沙盤搭建平臺,免費下載:http://www.tuxingis.com/txsvip.html
五、BIM+GIS三維數(shù)字沙盤體驗版
14套中建、中鐵等各大公司BIM+GIS應(yīng)用案例,涵蓋公路工程、水利、消防、市政道路、管網(wǎng)管廊等多個行業(yè)重點標(biāo)桿項目案例。只要想做類似的BIM+GIS三維可視化沙盤你就可以一鍵套用模板。
六、BIM+GIS直播干貨講解
通過實戰(zhàn)案例學(xué)習(xí)BIM+GIS的實戰(zhàn)技巧,掌握BIM+GIS的最新技術(shù)和應(yīng)用,這里一套BIM+GIS直播干貨講解課程帶你輕松技術(shù)晉級。
【2023年新版】100套BIM+GIS學(xué)習(xí)技術(shù)資料,中建中鐵中交企業(yè)內(nèi)部資源,免費領(lǐng)取!圖新地球公眾號回復(fù)【BIM+GIS】
在我的博客《C#開發(fā)BIMFACE系列52 CS客戶端集成BIMFACE應(yīng)用的技術(shù)方案》中介紹了多種集成BIMFACE到客戶端程序中的方案。最后推薦大家使用 CefSharp組件與WebView2組件。本篇文章介紹使用CefSharp組件如何集成BIMFACE到客戶端程序中。
一、CefSharp 簡介
CefSharp是一個圍繞Chromium Embedded Framework(CEF)的輕量級.NET包裝器。它是用C++/CLI編寫的。允許開發(fā)者在.NET應(yīng)用程序中嵌入Chromium。可以在C#或VB或任何其他CLR語言中使用。CefSharp同時提供WPF和WinForms Web瀏覽器控件實現(xiàn)。
功能特點
二、CefSharp 下載
步驟1 新建WinForm項目
新建一個WinForm窗體應(yīng)用程序,目標(biāo)框架選擇 .NET Framework 4.5.2,因為新版本的CefSahrp組件最低支持 .NET Framework 4.5.2。
步驟2 通過 NeGet 下載
打開NeGet
(1)搜索 CefSharp
(2)選擇 CefSharp.WinForms
(3)選擇最新版本
(4)點擊【安裝】按鈕
點擊【確定】開始安裝。
安裝完成后,項目中自動添加了CefSharp.dll、CefSharp.Core.dll、CefSharp.WinForms.dll 類庫引用。
工具箱中也增加了CefSharp控件
步驟3 編譯項目
編譯 BIMFace.SDK.CSharp.Sample.WinForm 項目,生成如下內(nèi)容
與 CefSharp 相關(guān)的共計32個文件,2個目錄,文件大小總計216M。這個尺寸相對于業(yè)務(wù)系統(tǒng)本身來說已經(jīng)非常大了,最后制作的安裝包尺寸也會很大。
其中 locales 目錄下是語言包,刪除 zh-CN.pak 之外的所有文件,總文件大小可以減少22M左右。
三、CefSharp 集成開發(fā)
測試功能設(shè)計如下
功能說明
(1)WinForm中加載的網(wǎng)頁來自于 BIMFace.SDK\BIMFace.SDK.CSharp.Sample\Pages\BIMFaceDemo7_3.html,所以Web項目要首先運行。
(2)WinForm 窗體中輸入 BIMFACE FileId,點擊【加載模型/圖紙】按鈕,調(diào)用CefSahrp組件,加載步驟(1)中的網(wǎng)頁。代碼如下:
// 加載模型/圖紙
private void btnLaodBIMFaceFile_Click(object sender, EventArgs e)
{
string fileId=txtBIMFaceFileId.Text.Trim();
if (string.IsNullOrEmpty(fileId))
{
MessageBox.Show("請?zhí)顚?BIMFACE FileId。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// 將 ChromiumWebBrowserBindObject 實例對象注入到 js 對象中。網(wǎng)頁中即可調(diào)用 ChromiumWebBrowserBindObject 類中定義的屬性、方法
var objToBind=new ChromiumWebBrowserBindObject();
chromiumWebBrowser1.JavascriptObjectRepository.Register("_chromeBrowser", objToBind, true, BindingOptions.DefaultBinder);
string url="https://localhost:44389/Pages/BIMFaceDemo7_3.html?fileId=" + fileId;
chromiumWebBrowser1.Load(url);
}
(3)網(wǎng)頁中點擊【JS 調(diào)用 C# 方法】按鈕。代碼如下:
在入口函數(shù)中,獲取注入的 ChromiumWebBrowser 對象,名稱為 _chromeBrowser。
按鈕對應(yīng)的js方法
// js 調(diào)用 C# 方法
function callCharpMethod() {
// 特別提醒:C# 類中定義的方法名稱采用 Pascal 命名。網(wǎng)頁中調(diào)用的時候必須將方法名稱的第一個字母改為小寫。否則調(diào)用不成功。
_chromeBrowser.testCalcAdd(6,8)
.then(function (response) {
alert(response);
});
}
特別提醒:C# 類中定義的方法名稱采用 Pascal 命名。網(wǎng)頁中調(diào)用的時候必須將方法名稱的第一個字母改為小寫。否則調(diào)用不成功。
調(diào)用的C#方法。定義一個單獨的類,用于在CefSahrp組件加載網(wǎng)頁之前,將其注入到網(wǎng)頁中
(4)WinForm窗體中點擊【 C# 調(diào)用 JS 方法】按鈕。代碼如下:
// C# 調(diào)用 JS 方法
private void btnCsharpCallJsMethod_Click(object sender, EventArgs e)
{
Task<JavascriptResponse> jsResponse=chromiumWebBrowser1.EvaluateScriptAsync("jsMethodForCSharpTestCalcSub", 25, 7);
if (jsResponse.Result !=null && jsResponse.Result.Success==false)
{
MessageBox.Show("C#調(diào)用JS方法發(fā)生異常。" + jsResponse.Result.Message
, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
網(wǎng)頁中定義的 jsMethodForCSharpTestCalcSub() 方法如下:
// js 方法,供C#調(diào)用
function jsMethodForCSharpTestCalcSub(num1, num2) {
/*如果參數(shù)需要是復(fù)雜類型,則傳遞Json格式的字符串,然后反序列化為對象即可使用*/
alert('傳入的參數(shù)num1:' + num1 + ", num2:" + num2 + ' 減法運算 num1 - num2=' + (num1 - num2));
}
特別說明:
(1)C#定義的方法供JS調(diào)用,C#方法的返回值類型、參數(shù)類型都只能是簡單數(shù)據(jù)類型,如:int、string、bool 等。
(2)JS定義的方法供C#調(diào)用,JS方法的返回值類型、參數(shù)類型都只能是簡單數(shù)據(jù)類型,如:int、string、bool 等。
一般來說復(fù)雜類型就是一個實體類。如果確實想使用復(fù)雜類型,建議的解決方案如下:
將復(fù)雜類型序列化為字符串,調(diào)用方將其反序列化之后再使用。
關(guān)于C#與JS互相通訊,請參考CefSahrp官方文檔:https://github.com/cefsharp/CefSharp/wiki/General-Usage#3-how-do-you-expose-a-net-class-to-javascript
四、CefSharp 組件運行分析
1、進(jìn)程分析
(1)啟動應(yīng)用程序,CefSharp組件未加載Web網(wǎng)頁時,默認(rèn)啟動了2個 CefSharp.BrowserSubProcess 子進(jìn)程。原因是我當(dāng)前使用的CefSharp是94.4.50版本,每當(dāng)new CefSharp.WinForms.ChromiumWebBrowser() 一個時,會啟動2個子進(jìn)程。
(2)CefSharp組件加載Web網(wǎng)頁后,又啟動了2個 CefSharp.BrowserSubProcess 子進(jìn)程,共計4個子進(jìn)程。原因是 當(dāng) chromiumWebBrowser1.Load(url) 時啟動2個子進(jìn)程。不同版本的 CefSharp 組件,啟動的子進(jìn)程數(shù)量不同。
2、運行日志分析
CefSahrp組件加載網(wǎng)頁瀏覽BIMFace模型/圖紙之后,程序目錄多了 GPUCache 目錄、debug.txt 文件。
GPUCache目錄內(nèi)容如下。BIMFACE加載模型/圖紙時利用了本地電腦的GPU強大的計算功能,所以產(chǎn)生了緩存內(nèi)容。
debug.txt 內(nèi)如如下,里面記錄了網(wǎng)頁的執(zhí)行過程
五、總結(jié)
如下是我的一個WinForm程序中使用CefSharp組件的運行狀態(tài),其中一個子進(jìn)程消耗內(nèi)存達(dá)到1.5G,太可怕了
《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用:https://gitee.com/NAlps/BIMFace.SDK
歡迎評論區(qū)留言互相交流、點贊、轉(zhuǎn)發(fā),每天獲取優(yōu)質(zhì)IT內(nèi)容。
#31省增本土35例 涉北京河北等省市#
大廈建筑模型中,基本上包含多個樓層,每個樓層包含多個房間等信息。在《C#開發(fā)BIMFACE系列21 服務(wù)端API之獲取模型數(shù)據(jù)6:獲取單模型的樓層信息》中介紹了如何獲取一個模型中包含的樓層信息、面積分區(qū)、房間等信息。本篇主要介紹如何獲取單個模型中單個房間信息。
請求地址:GET https://api.bimface.com/data/v2/files/{fileId}/rooms/{roomId}
說明:獲取單個模型種單個房間信息
參數(shù):
請求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/rooms/857279
請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
HTTP響應(yīng)示例(200):
{
"code" : "success",
"data" : {
"area" : 7.256476003661832E7,
"bboxMax" : {
"x" : -4938.068482562385,
"y" : -3201.59397858169,
"z" : 0.0
},
"bboxMin" : {
"x" : -4938.068482562385,
"y" : -3201.59397858169,
"z" : 0.0
},
"boundary" : "",
"id" : "313137",
"levelId" : "11",
"maxPt" : {
"x" : -4938.068482562385,
"y" : -3201.59397858169,
"z" : 0.0
},
"minPt" : {
"x" : -4938.068482562385,
"y" : -3201.59397858169,
"z" : 0.0
},
"name" : "dining room 4",
"perimeter" : 40087.80000000279,
"properties" : [ {
"group" : "dimension",
"items" : [ {
"code" : "perimeter",
"extension" : "object",
"key" : "perimeter",
"orderNumber" : 0,
"unit" : "mm",
"value" : 17200,
"valueType" : 2
} ]
} ]
},
"message" : ""
}
該返回結(jié)果的結(jié)構(gòu)比較復(fù)雜。在文章最后會給出對應(yīng)封裝成的C#類。
C#實現(xiàn)方法:
/// <summary>
/// 獲取單個模型中單個樓層信息
/// </summary>
/// <param name="accessToken">【必填】令牌</param>
/// <param name="fileId">【必填】代表該單模型的文件ID</param>
/// <param name="roomId">【必填】房間ID</param>
/// <returns></returns>
public virtual SingleModelSingleRoom GetSingleModelSingleRoom(string accessToken, long fileId, string roomId)
{
// GET https://api.bimface.com/data/v2/files/{fileId}/rooms/{roomId}
string url=string.Format(BimfaceConstants.API_HOST + "/data/v2/files/{0}/rooms/{1}", fileId, roomId);
BimFaceHttpHeaders headers=new BimFaceHttpHeaders();
headers.AddOAuth2Header(accessToken);
try
{
SingleModelSingleRoom response;
HttpManager httpManager=new HttpManager(headers);
HttpResult httpResult=httpManager.Get(url);
if (httpResult.Status==HttpResult.STATUS_SUCCESS)
{
response=httpResult.Text.DeserializeJsonToObject<SingleModelSingleRoom>();
}
else
{
response=new SingleModelSingleRoom
{
Message=httpResult.RefText
};
}
return response;
}
catch (Exception ex)
{
throw new Exception("[獲取單個房間信息]發(fā)生異常!", ex);
}
}
其中調(diào)用到的 httpManager.Get() 方法,請參考《C# HTTP系列》
https://www.cnblogs.com/SavionZhang/p/11422481.html
測試
在BIMFACE的控制臺中可以看到以下文件列表。模型狀態(tài)均為轉(zhuǎn)換成功。
以“Revit案例項目改.0001.rvt”為例測試上述的方法。
在《C#開發(fā)BIMFACE系列21 服務(wù)端API之獲取模型數(shù)據(jù)6:獲取單模型的樓層信息》中查詢返回的結(jié)果中包含 RoomId
以 RoomID 為 857552 為例來查詢該房間的詳細(xì)信息
完整的房間信息如下:
success
[area=70319994.3674652,
bboxMax=[x=13061.9309943162, y=-3481.59383914623, z=2199.99991189159],
bboxMin=[x=7061.93123461209, y=-15201.5933697684, z=0],
boundary={"version":"2.0","loops":[[[{"z":0.0,"y":-15201.593978581839,"x":13061.931517437606},
{"z":0.0,"y":-3481.5939785817081,"x":13061.931517437624}
],
[{"z":0.0,"y":-3481.5939785817077,"x":13061.931517437624},
{"z":0.0,"y":-3481.5939785816972,"x":10001.931517437628}
],
[{"z":0.0,"y":-3481.5939785816972,"x":10001.931517437628},
{"z":0.0,"y":-3481.5939785816904,"x":7726.6267896735426}
],
[{"z":0.0,"y":-3481.5939785816904,"x":7726.6267896735426},
{"z":0.0,"y":-3481.59397858169,"x":7558.3362452017109}
],
[{"z":0.0,"y":-3481.59397858169,"x":7558.3362452017109},
{"z":0.0,"y":-3481.5939785816881,"x":7061.9315174376252}
],
[{"z":0.0,"y":-3481.5939785816881,"x":7061.9315174376252},
{"z":0.0,"y":-15201.593978581817,"x":7061.9315174376061}
],
[{"z":0.0,"y":-15201.593978581821,"x":7061.9315174376061},
{"z":0.0,"y":-15201.593978581839,"x":13061.931517437606}
]
]
]
},
id=857552,
levelId=,
maxPt=[x=13061.9309943162, y=-3481.59383914623, z=0],
minPt=[x=7061.93123461209, y=-15201.5933697684, z=0],
name=Living 106,
perimeter=35579.9985750456,
properties=[group=尺寸標(biāo)注,
items=[code=, extension=, key=體積, orderNumber=,unit=m3,value=154.70,valueType=2]
[code=, extension=, key=周長, orderNumber=,unit=mm,value=35580,valueType=2]
[code=, extension=, key=房間標(biāo)示高度, orderNumber=,unit=mm,value=4000,valueType=2]
[code=, extension=, key=計算高度, orderNumber=,unit=mm,value=0,valueType=2]
[code=, extension=, key=面積, orderNumber=,unit=m2,value=70,valueType=2]
]
[group=標(biāo)識數(shù)據(jù),
items=[code=, extension=, key=Occupant, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=占用, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=名稱, orderNumber=,unit=,value=Living,valueType=3]
[code=, extension=, key=圖像, orderNumber=,unit=,value=,valueType=4]
[code=, extension=, key=基面面層, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=墻面面層, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=天花板面層, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=樓板面層, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=注釋, orderNumber=,unit=,value=,valueType=3]
[code=, extension=, key=編號, orderNumber=,unit=,value=106,valueType=3]
[code=, extension=, key=部門, orderNumber=,unit=,value=,valueType=3]
]
[group=階段化,
items=[code=, extension=, key=相位, orderNumber=,unit=,value=Working Drawings,valueType=4]
]
[group=限制條件,
items=[code=, extension=, key=上限, orderNumber=,unit=,value=Level 1,valueType=4]
[code=, extension=, key=底部偏移, orderNumber=,unit=mm,value=0,valueType=2]
[code=, extension=, key=標(biāo)高, orderNumber=,unit=,value=Level 1,valueType=4]
[code=, extension=, key=高度偏移, orderNumber=,unit=mm,value=4000,valueType=2]
]
]
測試代碼如下:
// 獲取單個房間信息
protected void btnGetSingleModelSingleRoom_Click(object sender, EventArgs e)
{
long fileId=txtFileID.Text.Trim().ToLong();
string roomId=txtRoomId.Text.Trim();
FileConvertApi api=new FileConvertApi();
SingleModelSingleRoom response=api.GetSingleModelSingleRoom(txtAccessToken.Text, fileId, roomId);
txtResult.Text=response.Code.ToString2()
+ Environment.NewLine
+ response.Message.ToString2()
+ Environment.NewLine
+ response.Data;
}
該接口返回的響應(yīng)信息,封裝成對應(yīng)的C# SingleModelSingleRoom 類:
/// <summary>
/// 獲取單個模型單個房間信息返回的結(jié)果類
/// </summary>
public class SingleModelSingleRoom : GeneralResponse<Room>
{
}
Room 類如下:
/// <summary>
/// 模型的房間信息
/// </summary>
[Serializable]
public class Room
{
/// <summary>
/// 樣例 : 7.256476003661832E7
/// </summary>
[JsonProperty("area")]
public double? Area { get; set; }
[JsonProperty("bboxMax")]
public Coordinate BboxMax { get; set; }
[JsonProperty("bboxMin")]
public Coordinate BboxMin { get; set; }
/// <summary>
/// 邊界
/// </summary>
[JsonProperty("boundary")]
public string Boundary { get; set; }
/// <summary>
/// 編號
/// </summary>
[JsonProperty("id")]
public string Id { get; set; }
/// <summary>
/// 水平線編號
/// </summary>
[JsonProperty("levelId")]
public string LevelId { get; set; }
[JsonProperty("maxPt")]
public Coordinate MaxPt { get; set; }
[JsonProperty("minPt")]
public Coordinate MinPt { get; set; }
/// <summary>
/// 對象名稱。例如:"dining room 4"
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }
/// <summary>
/// 樣例 : 40087.80000000279
/// </summary>
[JsonProperty("perimeter")]
public double? Perimeter { get; set; }
[JsonProperty("properties")]
public PropertyGroup[] Properties { get; set; }
/// <summary>返回表示當(dāng)前對象的字符串。</summary>
/// <returns>表示當(dāng)前對象的字符串。</returns>
public override string ToString()
{
StringBuilder sb=new StringBuilder();
if (Properties !=null && Properties.Length > 0)
{
foreach (var property in Properties)
{
sb.AppendLine(property.ToString());
}
}
return string.Format("[area={0}, bboxMax={1}, bboxMin={2}, boundary={3}, id={4}, levelId={5}, maxPt={6}, minPt={7}, name={8}, perimeter={9}, properties={10}]",
Area, BboxMax, BboxMin, Boundary, Id, LevelId, MaxPt, MinPt, Name, Perimeter, sb);
}
}
其中 Coordinate 、PropertyGroup 類請參考《C#開發(fā)BIMFACE系列17 服務(wù)端API之獲取模型數(shù)據(jù)2:獲取構(gòu)件材質(zhì)列表》。
系列文章主要技術(shù):BIM、輕量化引擎、BIMFACE、BIMFACE二次開發(fā)、C#、.NET、二次開發(fā)、RESTful API、WebAPI
歡迎關(guān)注、點贊、評論、轉(zhuǎn)發(fā),每天閱讀優(yōu)質(zhì)內(nèi)容。
#31省份新增確診22例 本土9例在廣東#
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。