相信很多朋友在做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[0]; 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(); } } }

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); } }
public static T DeserializeFromXml<T>(this string xml) { return XmlObjectHelpers.FromXmlString<T>(xml); }
我用的是NavisWorks SDK 2015. 當然每個版本都不一樣。如果有錯誤的地方請網友指出!