List <string> GetOnePipeSystemNames(Element ele)
        {
            string        systemName     = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.SystemName));
            List <string> eleSystemNames = new List <string>();

            if (!string.IsNullOrEmpty(systemName))
            {
                eleSystemNames = MtCommon.RemoveNumInComplexString(systemName); //可能包含多个系统名称
            }
            return(eleSystemNames);
        }
        private string GetPipeLevel(Element ele)
        {
            string referenceLevel = string.Empty;

            referenceLevel = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.ReferenceLevel));
            if (string.IsNullOrEmpty(referenceLevel))
            {
                referenceLevel = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Level));
            }
            return(referenceLevel);
        }
        bool IsLevelCorrect(Element ele, string level, string offset, out string errorMsg)
        {
            bool   isLevelCorrect = false;
            string errorMessage   = string.Empty;

            if (!string.IsNullOrEmpty(level) && !string.IsNullOrEmpty(offset))
            {
                double levelOffset = 0;
                if (m_dicLevelOffset.ContainsKey(level))
                {
                    levelOffset = m_dicLevelOffset[level];
                    double offsetValue = double.Parse(offset);

                    if (offsetValue < 0)
                    {
                        //将给排水中的排水管道排除,排水的管道位于本层标高的下方,该排水管道的标高属于本层
                        string systemName = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.SystemName));
                        if (!string.IsNullOrEmpty(systemName) && (systemName.Contains("排水") || systemName.Contains("废水")))
                        {
                            if (offsetValue < 0 && Math.Abs(offsetValue) < levelOffset)
                            {
                                isLevelCorrect = true;
                            }
                            else
                            {
                                isLevelCorrect = false;
                                errorMessage   = MtCommon.GetStringValue(ErrorType.NegLevelOffset);
                            }
                        }
                        else
                        {
                            isLevelCorrect = false;
                            errorMessage   = MtCommon.GetStringValue(ErrorType.NegLevelOffset);
                        }
                    }
                    else if (offsetValue > 0 && offsetValue > levelOffset)
                    {
                        isLevelCorrect = false;
                        errorMessage   = MtCommon.GetStringValue(ErrorType.PosLevelOffset);
                    }
                    else
                    {
                        isLevelCorrect = true;
                    }
                }
            }
            errorMsg = errorMessage;
            return(isLevelCorrect);
        }
        private string GetElementInfo(Element ele)
        {
            if (ele == null)
            {
                return(string.Empty);
            }

            string area          = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Campus));
            string building      = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Building));
            string level         = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.MtLevel));
            string equipmentCode = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.EquipmentCode));

            string isEquip = "0";

            if (!string.IsNullOrEmpty(equipmentCode))
            {
                isEquip = "1";
            }

            return(area + "-" + building + "-" + level + "*" + isEquip);
        }
        string RenameEleId(Element ele)
        {
            if (ele == null)
            {
                return(string.Empty);
            }

            string district = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Campus));
            string building = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Building));
            string level    = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.MtLevel));

            if (!string.IsNullOrEmpty(district) && !string.IsNullOrEmpty(building) && !string.IsNullOrEmpty(level))
            {
                return(district + "-" + building + "-" + level + "_PD_" + ele.Id);
            }
            else
            {
                TaskDialog.Show("Error", "Basic info is empty : " + ele.Id);
                return(string.Empty);
            }
        }
        void IsStandardSystemName(Element ele)
        {
            string systemName = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.SystemName));

            if (!string.IsNullOrEmpty(systemName))
            {
                List <string> eleSystemNames = MtCommon.RemoveNumInComplexString(systemName); //可能包含多个系统名称

                foreach (var name in eleSystemNames)
                {
                    if (!m_standardSystemNames.Contains(name))
                    {
                        AddListViewErrorData(ele, MtCommon.GetStringValue(ErrorType.NotStandardSystemName) + name); //不符合标准
                    }
                    else
                    {
                        string eleId = ele.Id.ToString();
                        if (!m_dicPipeSystemNames.ContainsKey(eleId))
                        {
                            m_dicPipeSystemNames.Add(ele.Id.ToString(), new List <string>());
                            m_dicPipeSystemNames[eleId].Add(name);
                        }
                        else
                        {
                            if (!m_dicPipeSystemNames[eleId].Contains(name))
                            {
                                m_dicPipeSystemNames[eleId].Add(name);
                            }
                        }
                    }
                }
            }
            else
            {
                AddListViewErrorData(ele, MtCommon.GetStringValue(ErrorType.NoParameter) +
                                     MtCommon.GetStringValue(MtGlobals.Parameters.SystemName) + " 或系统名称为空"); //Element可能不存在系统名称参数
            }
        }
 private string GetPipeEndOffset(Element ele)
 {
     return(MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.EndOffset)));
 }
        public void AutoAdjustLevel()
        {
            GetALLLevelOffset();

            foreach (var item in m_dicLevelErrors)
            {
                Element ele = MtCommon.GetElementById(m_uIDocument.Document, item.Key);

                if (ele != null)
                {
                    string offset      = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Offset));
                    string startOffset = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.StartOffset));
                    string endOffset   = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.EndOffset));

                    string _level = string.Empty;
                    string level  = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Level));
                    if (string.IsNullOrEmpty(level) || level.Equals(MtGlobals.Parameters.NoParam.ToString()))
                    {
                        _level = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.ReferenceLevel));
                    }
                    else
                    {
                        _level = level;
                    }

                    string correctLevel       = string.Empty;
                    double offsetValue        = double.Parse(offset);
                    double correctOffsetValue = offsetValue;

                    if (offsetValue > 0)
                    {
                        bool isFirst = false;
                        for (int i = 0; i < m_listLevelOffset.Count; i++)
                        {
                            LevelOffset leveloffset = m_listLevelOffset[i];
                            if (leveloffset.levelName != _level && !isFirst)
                            {
                                continue;
                            }
                            else
                            {
                                isFirst = true;

                                if (correctOffsetValue >= leveloffset.levelOffsetValue)
                                {
                                    correctOffsetValue -= leveloffset.levelOffsetValue;
                                }
                                else
                                {
                                    correctLevel = leveloffset.levelName;
                                    break; //获得正确标高跳出
                                }
                            }
                        }
                    }
                    else
                    {
                        bool isFirst = false;
                        correctOffsetValue = Math.Abs(offsetValue);
                        for (int i = m_listLevelOffset.Count - 1; i >= 0; i--)
                        {
                            LevelOffset leveloffset = m_listLevelOffset[i];
                            if (leveloffset.levelName != _level && !isFirst)
                            {
                                continue;
                            }
                            else
                            {
                                isFirst = true;

                                if (correctOffsetValue >= leveloffset.levelOffsetValue)
                                {
                                    correctOffsetValue -= leveloffset.levelOffsetValue;
                                }
                                else
                                {
                                    correctLevel = leveloffset.levelName;
                                    break;
                                }
                            }
                        }
                    }
                    if (string.IsNullOrEmpty(level) || level.Equals(MtGlobals.Parameters.NoParam.ToString()))
                    {
                        if (m_levels != null && m_levels.ContainsKey(correctLevel))
                        {
                            Parameter param = ele.LookupParameter(MtCommon.GetStringValue(MtGlobals.Parameters.ReferenceLevel));
                            if (param != null)
                            {
                                param.Set(m_levels[correctLevel].LevelId);
                            }
                        }
                    }
                    else
                    {
                        if (m_levels != null && m_levels.ContainsKey(correctLevel))
                        {
                            ele.LookupParameter(MtCommon.GetStringValue(MtGlobals.Parameters.Offset)).Set(correctOffsetValue);
                            Parameter param = ele.LookupParameter(MtCommon.GetStringValue(MtGlobals.Parameters.Level));
                        }
                    }
                }
            }

            CheckPipeLevel();
        }
        void GetPipePiameter()
        {
            ElementClassFilter instanceFilter = new ElementClassFilter(typeof(FamilyInstance));
            ElementClassFilter hostFilter     = new ElementClassFilter(typeof(HostObject));
            LogicalOrFilter    andFilter      = new LogicalOrFilter(instanceFilter, hostFilter);

            FilteredElementCollector collector = new FilteredElementCollector(m_uIDocument.Document);

            collector.WherePasses(andFilter);

            Dictionary <string, float> m_dic = new Dictionary <string, float>();
            List <Element>             eles  = new List <Element>();
            float piameter = 0;

            MtCommon.WriteStringIntoText("总共:" + collector.Count().ToString());
            int index = 0;

            foreach (var ele in collector)
            {
                if (m_IsCreateFile)
                {
                    var content = MtCommon.ReadStringFromText();
                    content += "\r\n" + $"索引{index}:" + ele.Id.ToString();
                    MtCommon.WriteStringIntoText(content);
                    index++;
                }

                string eleID = ele.Id.ToString();

                //判断是否是设备,通过设备编码参数,判断是否为设备,设备的直径默认设置为10000
                var equipCode = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(Parameters.EquipmentCode));
                if (!string.IsNullOrEmpty(equipCode))
                {
                    piameter = 10000f;
                }
                else
                {
                    //获取管道直径参数:只要包含“直径”二字的选择一个作为直径参数
                    var paramter = GetParameterWithPiameterParam(ele, "直径");
                    if (paramter != null && paramter.Count != 0)
                    {
                        foreach (var item in paramter)
                        {
                            var value = GetMultiNumbers(item.AsValueString()).FirstOrDefault();
                            piameter += value;
                        }
                        piameter = (int)(piameter / paramter.Count);
                    }
                    else
                    {
                        //没有直径参数的,利用宽高等参数判断,取中值
                        var width  = GetParameterWithPiameterParam(ele, "风管宽度").FirstOrDefault();;
                        var height = GetParameterWithPiameterParam(ele, "风管高度").FirstOrDefault();

                        if (width != null && height != null)
                        {
                            var widthValue  = GetMultiNumbers(width.AsValueString()).FirstOrDefault();
                            var heightValue = GetMultiNumbers(height.AsValueString()).FirstOrDefault();
                            piameter = (int)((widthValue + heightValue) / 2);
                        }
                        else
                        {
                            //利用尺寸200x100,200x100200x100,只取前后两位计算
                            var size = MtCommon.GetOneParameter(ele, "尺寸");
                            if (!string.IsNullOrEmpty(size))
                            {
                                var result = GetMultiNumbers(size);
                                if (result.Count >= 2)
                                {
                                    piameter = (int)((result[0] + result[result.Count - 1]) / 2);
                                }
                                else if (result.Count == 1)
                                {
                                    piameter = result[0];
                                }
                                else
                                {
                                    piameter = 0;
                                }
                            }
                            else
                            {
                                piameter = 0f;
                            }
                        }
                    }
                }
                var    campus       = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(Parameters.Campus));
                var    build        = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(Parameters.Building));
                var    level        = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(Parameters.MtLevel));
                var    verticalPipe = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(Parameters.VerticalPipe));
                string pipeCode     = string.Empty;
                if (verticalPipe.Equals("1-1"))
                {
                    pipeCode = campus + "-" + build + "-" + level + "_" + m_SystemCode + "_" + ele.Id + "#L";
                }
                else
                {
                    pipeCode = campus + "-" + build + "-" + level + "_" + m_SystemCode + "_" + ele.Id;
                }

                if (!m_dic.ContainsKey(pipeCode))
                {
                    m_dic.Add(pipeCode, piameter);
                    eles.Add(ele);
                }
                piameter = 0;
            }

            MtCommon.HideElements(m_uIDocument.Document, eles);

            m_sqlite = new MtSQLite(m_sqliteFilePath);
            List <string> quarays = new List <string>();

            foreach (var item in m_dic)
            {
                quarays.Add($"Update Facility_Pipe Set diameter = '{item.Value}' where code = '{item.Key}'");
                //quarays.Add($"Insert into Pipe (code,diameter) values ('{item.Key}','{item.Value}')");
            }
            m_sqlite.ExecuteNoneQuery(quarays.ToArray());
        }
        void TravelSwitchLight()
        {
            ElementClassFilter       instanceFilter = new ElementClassFilter(typeof(FamilyInstance));
            ElementClassFilter       hostFilter     = new ElementClassFilter(typeof(HostObject));
            LogicalOrFilter          andFilter      = new LogicalOrFilter(instanceFilter, hostFilter);
            FilteredElementCollector collector      = new FilteredElementCollector(m_uIDocument.Document);

            collector.WherePasses(andFilter);

            foreach (var ele in collector)
            {
                if (ele.Category.Name.Contains("灯具"))
                {
                    string label = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Note));
                    if (!string.IsNullOrEmpty(label))
                    {
                        m_switchDic.Add(ele, label);
                    }
                }
                if (ele.Category.Name.Contains("照明设备"))
                {
                    string label = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Note));
                    if (!string.IsNullOrEmpty(label))
                    {
                        m_lightDic.Add(ele, label);
                    }
                }

                if (ele.Category.Name.Contains("线管") || ele.Category.Name.Contains("线管配件"))
                {
                    string label = MtCommon.GetOneParameter(ele, MtCommon.GetStringValue(MtGlobals.Parameters.Note));
                    if (!string.IsNullOrEmpty(label))
                    {
                        m_spoolDic.Add(ele, label);
                    }
                }
            }

            foreach (var item in m_switchDic)
            {
                string switchId = RenameEleId(item.Key);
                if (!m_switchLightRelationDic.ContainsKey(switchId))
                {
                    m_switchLightRelationDic.Add(switchId, new Dictionary <string, string>());
                }

                var ligths = from data in m_lightDic
                             where data.Value == item.Value
                             select data.Key;

                foreach (var light in ligths)
                {
                    string lightId = RenameEleId(light);
                    if (!m_switchLightRelationDic[switchId].ContainsKey(lightId))
                    {
                        m_switchLightRelationDic[switchId].Add(lightId, "0");
                    }
                }

                var spools = from data in m_spoolDic
                             where data.Value == item.Value
                             select data.Key;

                foreach (var spool in spools)
                {
                    string spoolId = RenameEleId(spool);
                    if (!m_switchLightRelationDic[switchId].ContainsKey(spoolId))
                    {
                        m_switchLightRelationDic[switchId].Add(spoolId, "1");
                    }
                }
            }
        }