相信很多朋友在做BIM项目的时候.都有客户会提出项目计划,形象进度 等需求。

那么当前最主要的问题就是计划与BIM模型的关联问题.那么我在项目中是用户用Project软件编辑计划然后手动跟三维模型关联。如果同行有更好的解决办法请告诉我,非常感谢

1界面布局

2 代码部分

        //当前选中的模型的名称
private string _currentSelectionName = string.Empty;
//当前选中的模型的GUID
private string _currentSelectionGuid = string.Empty;
//当前选中的Item
private GanttItem _currentGanttItem = null;、
       /// <summary>
/// 选中计划 聚焦到对应的模型
/// </summary>
private void SetCurrentModel()
{
if (Autodesk.Navisworks.Api.Application.ActiveDocument != null)
{
if (_currentGanttItem != null)
{
object modelid = _currentGanttItem.GetProperty("ModelId");
object modelName = _currentGanttItem.GetProperty("ModelName"); if (modelid != null)
{
if (!string.IsNullOrEmpty(modelid.ToString()))
{
Guid guid = Guid.Parse(modelid.ToString());
List<Autodesk.Navisworks.Api.ModelItem> seletedObjs = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.RootItemDescendantsAndSelf.WhereInstanceGuid(guid).ToList();
if (seletedObjs.Any())
{
Document oDoc = Autodesk.Navisworks.Api.Application.ActiveDocument;
oDoc.CurrentSelection.CopyFrom(seletedObjs);
oDoc.ActiveView.FocusOnCurrentSelection();
} } }
} }
}
 /// <summary>
/// 将当前选中的模型 附件到计划 与计划匹配
/// </summary>
void MT_AddCurrentModel_Click(object sender, EventArgs e)
{
//验证模型
if (Autodesk.Navisworks.Api.Application.ActiveDocument != null &&
!Autodesk.Navisworks.Api.Application.ActiveDocument.IsClear)
{
Autodesk.Navisworks.Api.Document doc = Autodesk.Navisworks.Api.Application.ActiveDocument;
if (doc != null)
{ if (doc.CurrentSelection.SelectedItems.Any())
{
//获取当前选中的模型信息
var selectItem = doc.CurrentSelection.SelectedItems[];
if (selectItem != null)
{
_currentSelectionGuid = selectItem.InstanceGuid.ToString();
_currentSelectionName = selectItem.DisplayName; }
//获取当前选中的Task
if (_currentGanttItem != null)
{
var exist = _taskList.Where(o => o.ModelId == _currentSelectionGuid);
if (exist.Any())
{
XtraMessageBox.Show("尊敬的用户您好!当前模型已经在计划中添加了!谢谢", "系统提示");
}
else
{
var modify = _taskList.FirstOrDefault(o => o.ProjectName == _currentGanttItem.Text);
if (modify != null)
{
modify.ModelName = _currentSelectionName;
modify.ModelItem = selectItem;
modify.ModelId = _currentSelectionGuid;
BindData();
}
}
}
}
else
{
XtraMessageBox.Show("尊敬的用户您好!当前没有选中模型!请先选中模型!", "系统提示");
} }
}
}

Gantt 属性存储是以XML的形式存储

[Serializable]
[XmlRoot("Properties")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable, ISerializable
{
public SerializableDictionary()
{
} [EditorBrowsable(EditorBrowsableState.Advanced)]
public SerializableDictionary(SerializationInfo info, StreamingContext context)
: base(info, context)
{
} [EditorBrowsable(EditorBrowsableState.Advanced)]
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
} public XmlSchema GetSchema()
{
return null;
} public void ReadXml(XmlReader reader)
{
XmlSerializer xmlSerializer = typeof(TKey).CreateDefaultXmlSerializer();
XmlSerializer xmlSerializer2 = typeof(TValue).CreateDefaultXmlSerializer();
bool isEmptyElement = reader.IsEmptyElement;
reader.Read();
if (!isEmptyElement)
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
TKey key = (TKey)xmlSerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValue value = (TValue)xmlSerializer2.Deserialize(reader);
reader.ReadEndElement();
base.Add(key, value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
} public void WriteXml(XmlWriter writer)
{
XmlSerializer xmlSerializer = typeof(TKey).CreateDefaultXmlSerializer();
XmlSerializer xmlSerializer2 = typeof(TValue).CreateDefaultXmlSerializer();
foreach (TKey key in base.Keys)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
xmlSerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("value");
TValue val = base[key];
xmlSerializer2.Serialize(writer, val);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}

SerializableDictionary 类

public static T FromXmlString<T>(string xml)
{
if (string.IsNullOrEmpty(xml))
{
return default(T);
}
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
return XmlObjectHelpers.FromXmlStream<T>(stream);
}
}

FromXmlString

public static T DeserializeFromXml<T>(this string xml)
{
return XmlObjectHelpers.FromXmlString<T>(xml);
} 

我用的是NavisWorks SDK 2015. 当然每个版本都不一样。如果有错误的地方请网友指出!

NavisWorks Api 简单使用与Gantt的更多相关文章

  1. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  2. Navisworks 2014 Api 简单的使用

    初次接触Navisworks Api  .NET 的二次开发.主要是研究了一下.关于NavisWorks 结构树的加载. void LoadModel() { //清空当前的结构树信息 treeVie ...

  3. Navisworks Api Quantification

    Quantification  国外有的叫定量  我们国内一些施工方叫工程量. 通过TakeOff API的开发者有机会获得更多的数据和数据可通过图形用户界面. 1 添加Navisworks的Api ...

  4. Libvlc API 简单说明 [转]

    Libvlc API 简单说明 原文来自http://www.xuebuyuan.com/1519616.html libvlc_instance_t* libvlc_new(int argc, co ...

  5. salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

    Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming ...

  6. 基于C语言libvirt API简单小程序

    libvirt API简单小程序 1.程序代码如下 #include<stdio.h> #include<libvirt/libvirt.h> int getDomainInf ...

  7. 常用函数式接口与Stream API简单讲解

    常用函数式接口与Stream API简单讲解 Stream简直不要太好使啊!!! 常用函数式接口 Supplier<T>,主要方法:T get(),这是一个生产者,可以提供一个T对象. C ...

  8. 百度地图API简单应用

    在做移动端应用时经常用到百度地图API,百度API有强大的示例和文档,开发之前去百度相关网站注册密钥,很块博主只花了几分钟 百度地图API范例 百度地图API文档说明 例子1:输入特定关键字绘制地图标 ...

  9. 百度地图api简单使用方法

    百度地图API的使用方法   百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html&g ...

随机推荐

  1. 基于AOP的MVC拦截异常让代码更优美

    与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...

  2. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  5. java中if和switch哪个效率快

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...

  6. ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)

    ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...

  7. MongoDB基础

    1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...

  8. 支付宝AR抢红包?前端轻松就破解~

    近期阿里搞了各LBS+AR实景的红包玩法,小伙伴们在公司里都玩疯了~ 有时候为了抢一个红包,会跑到另一个地方去拍照,虽然略麻烦,但整体的互动还是很有意思的. 不过对于机智的前端童鞋来说,只需要简单的一 ...

  9. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  10. Azure File Storage 基本用法 -- Azure Storage 之 File

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...