近有很多做工程的朋友想要学习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小时内与您取得联系。