Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
近有很多做工程的朋友想要學習BIM+GIS技術,向我詢問相關的學習資源和資料。他們面臨的普遍問題是不知道如何入門,找到的資料很多,但是很多卻用不上。
為了解決大家的問題,我們團隊花了近一個月的時間,精心整理了一份實用的BIM+GIS學習資料合集,包含五個模塊,超過上千份資料。
這份合集包含了常用的BIM+GIS軟件安裝教程、基礎操作指南、項目管理流程介紹等常規資料,還包括BIM+GIS結合使用、BIM+GIS在實際工程中的應用案例、行業發展趨勢和未來展望等內容。
先帶大家看下這份資料清單:
40套BIM+GIS項目案例合集領取,圖新地球公眾號回復【BIM+GIS】
一、BIM+GIS三維數字沙盤快速搭建視頻教程
這份合集不僅包含了常用的BIM+GIS軟件安裝教程、基礎操作指南、項目管理流程介紹等常規資料,還包括BIM+GIS與其他技術的結合使用、BIM+GIS在實際工程中的應用案例、行業發展趨勢和未來展望等內容。
二、BIM模型庫資源
每次制作設計方案、匯報工程現場狀況,最令人頭大的就是方案素材的尋找,想要表達的信息太多,素材獲取無從下手!別急!大波工程、建筑、設計領域資料,空投即將到達,助你成為匯報現場最靚的仔!
旨在為工程、設計行業用戶提供優質資料,精心挑選,先到先得哦
三、BIM+GIS實際應用案例視頻
聯合BIM領域資深工程師打造的BIM+GIS案例教程,保姆式手把手帶你搭建三維可視化BIM+GIS數字沙盤,深入學習BIM+GIS的高級技能和實際應用案例。
四、免費版BIM+GIS三維數字沙盤搭建平臺(1款)
提供一款免費BIM+GIS三維數字沙盤搭建平臺,為工程師、設計師以及相關領域的專業人士提供直觀、精準的空間數據可視化工具。
BIM+GIS三維數字沙盤搭建平臺,免費下載:http://www.tuxingis.com/txsvip.html
五、BIM+GIS三維數字沙盤體驗版
14套中建、中鐵等各大公司BIM+GIS應用案例,涵蓋公路工程、水利、消防、市政道路、管網管廊等多個行業重點標桿項目案例。只要想做類似的BIM+GIS三維可視化沙盤你就可以一鍵套用模板。
六、BIM+GIS直播干貨講解
通過實戰案例學習BIM+GIS的實戰技巧,掌握BIM+GIS的最新技術和應用,這里一套BIM+GIS直播干貨講解課程帶你輕松技術晉級。
【2023年新版】100套BIM+GIS學習技術資料,中建中鐵中交企業內部資源,免費領取!圖新地球公眾號回復【BIM+GIS】
在我的博客《C#開發BIMFACE系列52 CS客戶端集成BIMFACE應用的技術方案》中介紹了多種集成BIMFACE到客戶端程序中的方案。最后推薦大家使用 CefSharp組件與WebView2組件。本篇文章介紹使用CefSharp組件如何集成BIMFACE到客戶端程序中。
一、CefSharp 簡介
CefSharp是一個圍繞Chromium Embedded Framework(CEF)的輕量級.NET包裝器。它是用C++/CLI編寫的。允許開發者在.NET應用程序中嵌入Chromium。可以在C#或VB或任何其他CLR語言中使用。CefSharp同時提供WPF和WinForms Web瀏覽器控件實現。
功能特點
二、CefSharp 下載
步驟1 新建WinForm項目
新建一個WinForm窗體應用程序,目標框架選擇 .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 項目,生成如下內容
與 CefSharp 相關的共計32個文件,2個目錄,文件大小總計216M。這個尺寸相對于業務系統本身來說已經非常大了,最后制作的安裝包尺寸也會很大。
其中 locales 目錄下是語言包,刪除 zh-CN.pak 之外的所有文件,總文件大小可以減少22M左右。
三、CefSharp 集成開發
測試功能設計如下
功能說明
(1)WinForm中加載的網頁來自于 BIMFace.SDK\BIMFace.SDK.CSharp.Sample\Pages\BIMFaceDemo7_3.html,所以Web項目要首先運行。
(2)WinForm 窗體中輸入 BIMFACE FileId,點擊【加載模型/圖紙】按鈕,調用CefSahrp組件,加載步驟(1)中的網頁。代碼如下:
// 加載模型/圖紙
private void btnLaodBIMFaceFile_Click(object sender, EventArgs e)
{
string fileId=txtBIMFaceFileId.Text.Trim();
if (string.IsNullOrEmpty(fileId))
{
MessageBox.Show("請填寫 BIMFACE FileId。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// 將 ChromiumWebBrowserBindObject 實例對象注入到 js 對象中。網頁中即可調用 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)網頁中點擊【JS 調用 C# 方法】按鈕。代碼如下:
在入口函數中,獲取注入的 ChromiumWebBrowser 對象,名稱為 _chromeBrowser。
按鈕對應的js方法
// js 調用 C# 方法
function callCharpMethod() {
// 特別提醒:C# 類中定義的方法名稱采用 Pascal 命名。網頁中調用的時候必須將方法名稱的第一個字母改為小寫。否則調用不成功。
_chromeBrowser.testCalcAdd(6,8)
.then(function (response) {
alert(response);
});
}
特別提醒:C# 類中定義的方法名稱采用 Pascal 命名。網頁中調用的時候必須將方法名稱的第一個字母改為小寫。否則調用不成功。
調用的C#方法。定義一個單獨的類,用于在CefSahrp組件加載網頁之前,將其注入到網頁中
(4)WinForm窗體中點擊【 C# 調用 JS 方法】按鈕。代碼如下:
// C# 調用 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#調用JS方法發生異常。" + jsResponse.Result.Message
, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
網頁中定義的 jsMethodForCSharpTestCalcSub() 方法如下:
// js 方法,供C#調用
function jsMethodForCSharpTestCalcSub(num1, num2) {
/*如果參數需要是復雜類型,則傳遞Json格式的字符串,然后反序列化為對象即可使用*/
alert('傳入的參數num1:' + num1 + ", num2:" + num2 + ' 減法運算 num1 - num2=' + (num1 - num2));
}
特別說明:
(1)C#定義的方法供JS調用,C#方法的返回值類型、參數類型都只能是簡單數據類型,如:int、string、bool 等。
(2)JS定義的方法供C#調用,JS方法的返回值類型、參數類型都只能是簡單數據類型,如:int、string、bool 等。
一般來說復雜類型就是一個實體類。如果確實想使用復雜類型,建議的解決方案如下:
將復雜類型序列化為字符串,調用方將其反序列化之后再使用。
關于C#與JS互相通訊,請參考CefSahrp官方文檔:https://github.com/cefsharp/CefSharp/wiki/General-Usage#3-how-do-you-expose-a-net-class-to-javascript
四、CefSharp 組件運行分析
1、進程分析
(1)啟動應用程序,CefSharp組件未加載Web網頁時,默認啟動了2個 CefSharp.BrowserSubProcess 子進程。原因是我當前使用的CefSharp是94.4.50版本,每當new CefSharp.WinForms.ChromiumWebBrowser() 一個時,會啟動2個子進程。
(2)CefSharp組件加載Web網頁后,又啟動了2個 CefSharp.BrowserSubProcess 子進程,共計4個子進程。原因是 當 chromiumWebBrowser1.Load(url) 時啟動2個子進程。不同版本的 CefSharp 組件,啟動的子進程數量不同。
2、運行日志分析
CefSahrp組件加載網頁瀏覽BIMFace模型/圖紙之后,程序目錄多了 GPUCache 目錄、debug.txt 文件。
GPUCache目錄內容如下。BIMFACE加載模型/圖紙時利用了本地電腦的GPU強大的計算功能,所以產生了緩存內容。
debug.txt 內如如下,里面記錄了網頁的執行過程
五、總結
如下是我的一個WinForm程序中使用CefSharp組件的運行狀態,其中一個子進程消耗內存達到1.5G,太可怕了
《BIMFace.SDK.CSharp》開源SDK。歡迎大家下載使用:https://gitee.com/NAlps/BIMFace.SDK
歡迎評論區留言互相交流、點贊、轉發,每天獲取優質IT內容。
#31省增本土35例 涉北京河北等省市#
大廈建筑模型中,基本上包含多個樓層,每個樓層包含多個房間等信息。在《C#開發BIMFACE系列21 服務端API之獲取模型數據6:獲取單模型的樓層信息》中介紹了如何獲取一個模型中包含的樓層信息、面積分區、房間等信息。本篇主要介紹如何獲取單個模型中單個房間信息。
請求地址:GET https://api.bimface.com/data/v2/files/{fileId}/rooms/{roomId}
說明:獲取單個模型種單個房間信息
參數:
請求 path(示例):https://api.bimface.com/data/v2/files/1211223382064960/rooms/857279
請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"
HTTP響應示例(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" : ""
}
該返回結果的結構比較復雜。在文章最后會給出對應封裝成的C#類。
C#實現方法:
/// <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("[獲取單個房間信息]發生異常!", ex);
}
}
其中調用到的 httpManager.Get() 方法,請參考《C# HTTP系列》
https://www.cnblogs.com/SavionZhang/p/11422481.html
測試
在BIMFACE的控制臺中可以看到以下文件列表。模型狀態均為轉換成功。
以“Revit案例項目改.0001.rvt”為例測試上述的方法。
在《C#開發BIMFACE系列21 服務端API之獲取模型數據6:獲取單模型的樓層信息》中查詢返回的結果中包含 RoomId
以 RoomID 為 857552 為例來查詢該房間的詳細信息
完整的房間信息如下:
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=尺寸標注,
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=房間標示高度, 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=標識數據,
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=標高, 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;
}
該接口返回的響應信息,封裝成對應的C# SingleModelSingleRoom 類:
/// <summary>
/// 獲取單個模型單個房間信息返回的結果類
/// </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>返回表示當前對象的字符串。</summary>
/// <returns>表示當前對象的字符串。</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#開發BIMFACE系列17 服務端API之獲取模型數據2:獲取構件材質列表》。
系列文章主要技術:BIM、輕量化引擎、BIMFACE、BIMFACE二次開發、C#、.NET、二次開發、RESTful API、WebAPI
歡迎關注、點贊、評論、轉發,每天閱讀優質內容。
#31省份新增確診22例 本土9例在廣東#
*請認真填寫需求信息,我們會在24小時內與您取得聯系。