• NavisWorks Api 简单使用与Gantt


    相信很多朋友在做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();
            }
        }
    }
    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. 当然每个版本都不一样。如果有错误的地方请网友指出!

  • 相关阅读:
    做程序员,我骄傲了吗?
    乐字节Java面向对象三大特性以及Java多态
    Java为什么有前途?什么人适合学Java?
    Java新手从入门到精通的学习建议
    Java变量与数据类型之二:Java常量与变量
    模块化、结构化的代码,程序员正讲述着人生
    乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符
    乐字节Java学习课程-path环境变量的作用与配置
    我英语不好,能学会编程吗?
    为什么欧拉图要用栈存然后逆着输出
  • 原文地址:https://www.cnblogs.com/w2011/p/4747881.html
Copyright © 2020-2023  润新知