相信很多朋友在做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. DBA成长路线

    从开发转为数据库管理,即人们称为DBA的已经有好几年,有了与当初不一样的体会.数据是企业的血液,数据是石油,数据是一切大数据.云计算的基础.作为DBA是数据的保卫者.管理者,是企业非常重要的角色.对于 ...

  2. 根据ip判断返回城市名称查询当地天气

    <?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...

  3. 【JS基础】正则表达式

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...

  4. 图解CSS3制作圆环形进度条的实例教程

    圆环形进度条制作的基本思想还是画出基本的弧线图形,然后CSS3中我们可以控制其旋转来串联基本图形,制造出部分消失的效果,下面就来带大家学习图解CSS3制作圆环形进度条的实例教程 首先,当有人说你能不能 ...

  5. 微信小程序二维码推广统计

    微信小程序可以通过生成带参数的二维码,那么这个参数是可以通过APP的页面进行监控的 这样就可以统计每个二维码的推广效果. 今天由好推二维码推出的小程序统计工具HotApp小程序统计也推出了带参数二维码 ...

  6. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  7. SQL字符串函数

    LEN() :计算字符串长度(字符的个数.)datalength();//计算字符串所占用的字节数,不属于字符串函数.测试varchar变量与nvarchar变量存储字符串a的区别.见备注1.LOWE ...

  8. Oracle:一个用户操作多个表空间中表的问题(转)

    原文地址:http://blog.csdn.net/shmiloy001/article/details/6287317 首先,授权给指定用户. 一个用户的默认表空间只能有一个,但是你可以试下用下面的 ...

  9. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...

  10. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...