整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

40套BIM+GIS项目案例合集,中建中铁企业内部学

40套BIM+GIS项目案例合集,中建中铁企业内部学习资源免费领取

近有很多做工程的朋友想要学习BIM+GIS技术,向我询问相关的学习资源和资料。他们面临的普遍问题是不知道如何入门,找到的资料很多,但是很多却用不上。

为了解决大家的问题,我们团队花了近一个月的时间,精心整理了一份实用的BIM+GIS学习资料合集,包含五个模块,超过上千份资料。

这份合集包含了常用的BIM+GIS软件安装教程、基础操作指南、项目管理流程介绍等常规资料,还包括BIM+GIS结合使用、BIM+GIS在实际工程中的应用案例、行业发展趋势和未来展望等内容。

先带大家看下这份资料清单:

  • BIM+GIS三维数字沙盘快速搭建视频教程(12节)
  • 1000+常用BIM模型库资源(6G 1000+模型元素)
  • BIM+GIS实际应用案例(14套)
  • 免费版BIM+GIS三维数字沙盘搭建平台(1款)
  • BIM+GIS三维数字沙盘体验版(4套)
  • BIM+GIS直播干货讲解(8个课时),定期直播

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浏览器控件实现。

功能特点

  • 免费、开源:https://github.com/cefsharp/CefSharp
  • 完善的文档
  • 支持JS、C#、WinForm窗体之间相互通讯与调用
  • 兼容性较好,支持H5、CSS5、WebGL等
  • 支持获取Cookies较全面
  • 其他

二、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 内如如下,里面记录了网页的执行过程

五、总结

  • 通过NeGet安装SDK时,运行时环境会被自动下载到当前项目的bin\debug 或者 bin\Release目录下。导致整个项目非常大,大约220M左右。
  • 以独立进程方式运行,消耗内存较多。

  如下是我的一个WinForm程序中使用CefSharp组件的运行状态,其中一个子进程消耗内存达到1.5G,太可怕了

  • 当控件Dock属性设置为 Fill,客户端电脑的缩放与布局不是100%时,窗体呈现黑边(严重bug),并没有完全填充父容器。

《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例在广东#