示例#1
0
 public SpecRecord(string key, List<SpecItem> items, SpecTable specTable)
 {
    Key = key;
    Items = items ?? new List<SpecItem>();
    Count = Items.Count;
    // Составление строки таблицы
    foreach (var column in specTable.SpecOptions.TableOptions.Columns)
    {
       ColumnValue colVal = new ColumnValue(column);
       // Кол
       if (column.ItemPropName == "Count")
       {
          colVal.Value = Items.Count.ToString();
       }
       else
       {
          // Поиск первой значащей записи в элементах или пустая строка
          var itemSpec = Items.FirstOrDefault(i => i.AttrsDict.ContainsKey(column.ItemPropName));
          if (itemSpec != null)
          {
             colVal.Value = itemSpec.AttrsDict[column.ItemPropName].TextString;
          }
       }
       ColumnsValue.Add(colVal);
    }
 }
示例#2
0
        /// <summary>
        /// Проверка соответствия значениям в столбцах
        /// </summary>
        /// <param name="columnsValue"></param>
        public void CheckColumnsValur(List <ColumnValue> columnsValue, SpecTable specTable)
        {
            string err = string.Empty;

            foreach (var colVal in columnsValue)
            {
                if (colVal.ColumnSpec.ItemPropName == "Count")
                {
                    continue;
                }

                DBText atr;
                if (AttrsDict.TryGetValue(colVal.ColumnSpec.ItemPropName, out atr))
                {
                    if (!colVal.Value.Equals(atr.TextString, StringComparison.OrdinalIgnoreCase))
                    {
                        err += $"'{colVal.ColumnSpec.ItemPropName}'='{atr.TextString}' не соответствует эталонному значению '{colVal.Value}', '{specTable.SpecOptions.KeyPropName}' = '{Key}'.\n";
                    }
                }
                else
                {
                    // В элементе вообще нет свойства для этого столбца
                    err += $"Не определено свойство '{colVal.ColumnSpec.ItemPropName}'.\n";
                }
            }
            if (!string.IsNullOrEmpty(err))
            {
                Inspector.AddError($"Ошибки в блоке {BlName}: {err} Этот блок попадет в спецификацию с эталонными значениями.", IdBlRef);
            }
        }
示例#3
0
 public SpecRecord(string key, List <SpecItem> items, SpecTable specTable)
 {
     Key   = key;
     Items = items ?? new List <SpecItem>();
     Count = Items.Count;
     // Составление строки таблицы
     foreach (var column in specTable.SpecOptions.TableOptions.Columns)
     {
         ColumnValue colVal = new ColumnValue(column);
         // Кол
         if (column.ItemPropName == "Count")
         {
             colVal.Value = Items.Count.ToString();
         }
         else
         {
             // Поиск первой значащей записи в элементах или пустая строка
             var itemSpec = Items.FirstOrDefault(i => i.AttrsDict.ContainsKey(column.ItemPropName));
             if (itemSpec != null)
             {
                 colVal.Value = itemSpec.AttrsDict[column.ItemPropName].TextString;
             }
         }
         ColumnsValue.Add(colVal);
     }
 }
示例#4
0
      /// <summary>
      /// Проверка соответствия значениям в столбцах
      /// </summary>
      /// <param name="columnsValue"></param>
      public void CheckColumnsValur(List<ColumnValue> columnsValue, SpecTable specTable)
      {
         string err = string.Empty;
         foreach (var colVal in columnsValue)
         {
            if (colVal.ColumnSpec.ItemPropName == "Count")
            {
               continue;
            }

            DBText atr;
            if (AttrsDict.TryGetValue(colVal.ColumnSpec.ItemPropName, out atr))
            {
               if (!colVal.Value.Equals(atr.TextString, StringComparison.OrdinalIgnoreCase))
               {
                  err += $"'{colVal.ColumnSpec.ItemPropName}'='{atr.TextString}' не соответствует эталонному значению '{colVal.Value}', '{specTable.SpecOptions.KeyPropName}' = '{Key}'.\n";
               }
            }
            else
            {
               // В элементе вообще нет свойства для этого столбца
               err += $"Не определено свойство '{colVal.ColumnSpec.ItemPropName}'.\n";
            }
         }
         if (!string.IsNullOrEmpty(err))
         {
            Inspector.AddError($"Ошибки в блоке {BlName}: {err} Этот блок попадет в спецификацию с эталонными значениями.", IdBlRef);
         }
      }
示例#5
0
      /// <summary>
      /// Проверка записей - должны быть одинаковые свойства у всех элементов
      /// </summary>
      public void CheckRecords(SpecTable specTable)
      {
         //Inspector.AddError("Пока не реализована проверка блоков с одним ключом но различающимися остальными свойствами. Скоро сделаю.");
         // TODO: Проверка - все свойства элементов должны совпадать между собой
         // Отличающиеся элементы вывести в инспектор.

         // Все записи должны соответствовать значениям в ColumnsValue
         Items.ForEach(i => i.CheckColumnsValur(ColumnsValue, specTable));
      }
示例#6
0
        /// <summary>
        /// Проверка записей - должны быть одинаковые свойства у всех элементов
        /// </summary>
        public void CheckRecords(SpecTable specTable)
        {
            //Inspector.AddError("Пока не реализована проверка блоков с одним ключом но различающимися остальными свойствами. Скоро сделаю.");
            // TODO: Проверка - все свойства элементов должны совпадать между собой
            // Отличающиеся элементы вывести в инспектор.

            // Все записи должны соответствовать значениям в ColumnsValue
            Items.ForEach(i => i.CheckColumnsValur(ColumnsValue, specTable));
        }
示例#7
0
 /// <summary>
 /// Создание спецификации
 /// </summary>
 public void CreateSpec()
 {
    SpecOptions specOpt = getSpecOptions();
    if (specOpt == null)
    {
       throw new Exception("Настройки таблицы не определены.");
    }
    // Клас создания таблицы по заданным настройкам
    SpecTable specTable = new SpecTable(specOpt);
    specTable.CreateTable();
 }
示例#8
0
 public void Calc(IGrouping<string, SpecItem> itemGroup, SpecTable specTable)
 {
    // itemGroup - элементы одной группы.
    // Нужно сгруппировать по ключевому свойству
    var uniqRecs = itemGroup.GroupBy(m => m.Key).OrderBy(m => m.Key, new AcadLib.Comparers.AlphanumComparator());
    
    foreach (var urec in uniqRecs)
    {
       SpecRecord rec = new SpecRecord(urec.Key, urec.ToList(), specTable);
       Records.Add(rec);
    }
 }
示例#9
0
        public void Calc(IGrouping <string, SpecItem> itemGroup, SpecTable specTable)
        {
            // itemGroup - элементы одной группы.
            // Нужно сгруппировать по ключевому свойству
            var uniqRecs = itemGroup.GroupBy(m => m.Key).OrderBy(m => m.Key, new AcadLib.Comparers.AlphanumComparator());

            foreach (var urec in uniqRecs)
            {
                SpecRecord rec = new SpecRecord(urec.Key, urec.ToList(), specTable);
                Records.Add(rec);
            }
        }
示例#10
0
        /// <summary>
        /// Создание спецификации
        /// </summary>
        public void CreateSpec()
        {
            SpecOptions specOpt = getSpecOptions();

            if (specOpt == null)
            {
                throw new Exception("Настройки таблицы не определены.");
            }
            // Клас создания таблицы по заданным настройкам
            SpecTable specTable = new SpecTable(specOpt);

            specTable.CreateTable();
        }
示例#11
0
 public static List<SpecGroup> Grouping(SpecTable specTable)
 {
    List<SpecGroup> groups = new List<SpecGroup>();
    var itemsGroupBy = specTable.Items.GroupBy(i => i.Group).OrderBy(g => g.Key);
    foreach (var itemGroup in itemsGroupBy)
    {
       SpecGroup group = new SpecGroup(itemGroup.Key);
       group.Calc(itemGroup, specTable);
       // проверка уникальности элементов в группе
       group.Check(specTable);
       groups.Add(group);
    }
    return groups;
 }
示例#12
0
        public static List <SpecGroup> Grouping(SpecTable specTable)
        {
            List <SpecGroup> groups = new List <SpecGroup>();
            var itemsGroupBy        = specTable.Items.GroupBy(i => i.Group).OrderBy(g => g.Key);

            foreach (var itemGroup in itemsGroupBy)
            {
                SpecGroup group = new SpecGroup(itemGroup.Key);
                group.Calc(itemGroup, specTable);
                // проверка уникальности элементов в группе
                group.Check(specTable);
                groups.Add(group);
            }
            return(groups);
        }
示例#13
0
      /// <summary>
      /// Фильтр блоков. И составление списка всех элементов (1 блок - 1 элемент).
      /// </summary>
      public static List<SpecItem> FilterSpecItems(SpecTable specTable)
      {
         List<SpecItem> items = new List<SpecItem>();
         // Обработка блоков и отбор блоков монолитных конструкций
         foreach (var idBlRef in specTable.SelBlocks.IdsBlRefSelected)
         {
            SpecItem specItem = new SpecItem(idBlRef);
            if (specItem.Define(specTable))
            {
               items.Add(specItem);
            }
         }

         if (items.Count == 0)
         {
            throw new Exception("Не определены блоки монолитных конструкций.");
         }
         else
         {
            specTable.Doc.Editor.WriteMessage($"\nОтобрано блоков для спецификации: {items.Count}\n");
         }
         return items;
      }
示例#14
0
        /// <summary>
        /// Фильтр блоков. И составление списка всех элементов (1 блок - 1 элемент).
        /// </summary>
        public static List <SpecItem> FilterSpecItems(SpecTable specTable)
        {
            List <SpecItem> items = new List <SpecItem>();

            // Обработка блоков и отбор блоков монолитных конструкций
            foreach (var idBlRef in specTable.SelBlocks.IdsBlRefSelected)
            {
                SpecItem specItem = new SpecItem(idBlRef);
                if (specItem.Define(specTable))
                {
                    items.Add(specItem);
                }
            }

            if (items.Count == 0)
            {
                throw new Exception("Не определены блоки монолитных конструкций.");
            }
            else
            {
                specTable.Doc.Editor.WriteMessage($"\nОтобрано блоков для спецификации: {items.Count}\n");
            }
            return(items);
        }
示例#15
0
        public bool Define(SpecTable specTable)
        {
            if (IdBlRef.IsNull)
            {
                Logger.Log.Error($"Ошибка в методе SpecItem.Define() - IdBlRef.IsNull. Недопустимая ситуация.");
                return(false);
            }
            var blRef = IdBlRef.GetObject(OpenMode.ForRead, false, true) as BlockReference;

            if (blRef == null)
            {
                Logger.Log.Error($"Ошибка в методе SpecItem.Define() - blRef == null. Недопустимая ситуация.");
                return(false);
            }

            string err = string.Empty;

            BlName = blRef.GetEffectiveName();

            if (blRef.AttributeCollection == null)
            {
                // В блоке нет атрибутов.
                err += "Нет атрибутов. ";
            }
            else
            {
                if (Regex.IsMatch(BlName, specTable.SpecOptions.BlocksFilter.BlockNameMatch, RegexOptions.IgnoreCase))
                {
                    // все атрибуты блока
                    AttrsDict = blRef.GetAttributeDictionary();

                    // Проверка типа блока
                    var typeBlock = specTable.SpecOptions.BlocksFilter.Type;
                    if (typeBlock != null)
                    {
                        DBText atrType;
                        if (AttrsDict.TryGetValue(typeBlock.BlockPropName, out atrType))
                        {
                            if (!typeBlock.Name.Equals(atrType.TextString, StringComparison.OrdinalIgnoreCase))
                            {
                                // Свойство типа не соответствует требованию
                                err += $"Свойство '{typeBlock.BlockPropName}'='{atrType.TextString}' не соответствует требуемому значению '{typeBlock.Name}'. ";
                            }
                        }
                        // В блоке нет свойства Типа
                        else
                        {
                            err += $"Нет обязательного свойства {typeBlock.BlockPropName}. ";
                        }
                    }

                    // Проверка обязательных атрибутов
                    foreach (var atrMustHave in specTable.SpecOptions.BlocksFilter.AttrsMustHave)
                    {
                        if (!AttrsDict.ContainsKey(atrMustHave))
                        {
                            err += $"Нет обязательного свойства: '{atrMustHave}'. ";
                        }
                    }

                    // определение Группы
                    DBText groupAttr;
                    if (AttrsDict.TryGetValue(specTable.SpecOptions.GroupPropName, out groupAttr))
                    {
                        Group = groupAttr.TextString;
                    }

                    // Ключевое свойство
                    DBText keyAttr;
                    if (AttrsDict.TryGetValue(specTable.SpecOptions.KeyPropName, out keyAttr))
                    {
                        Key = keyAttr.TextString;
                    }
                    else
                    {
                        err += $"Не определено ключевое свойство '{specTable.SpecOptions.KeyPropName}'. ";
                    }
                }
                // Имя блока не соответствует Regex.IsMatch
                else
                {
                    err += $"Имя блока не соответствует '{specTable.SpecOptions.BlocksFilter.BlockNameMatch}'. ";
                }
            }

            if (string.IsNullOrEmpty(err))
            {
                return(true);
            }
            else
            {
                Inspector.AddError($"Пропущен блок '{BlName}': {err}", blRef);
                return(false);
            }
        }
示例#16
0
 /// <summary>
 /// Проверка группы
 /// </summary>
 public void Check(SpecTable specTable)
 {
    Records.ForEach(r => r.CheckRecords(specTable));
 }
示例#17
0
      public bool Define(SpecTable specTable)
      {
         if (IdBlRef.IsNull)
         {
            Logger.Log.Error($"Ошибка в методе SpecItem.Define() - IdBlRef.IsNull. Недопустимая ситуация.");
            return false;
         }
         var blRef = IdBlRef.GetObject(OpenMode.ForRead, false, true) as BlockReference;
         if (blRef == null)
         {
            Logger.Log.Error($"Ошибка в методе SpecItem.Define() - blRef == null. Недопустимая ситуация.");
            return false;
         }

         string err = string.Empty;
         BlName = blRef.GetEffectiveName();

         if (blRef.AttributeCollection == null)
         {
            // В блоке нет атрибутов.            
            err += "Нет атрибутов. ";
         }
         else
         {            
            if (Regex.IsMatch(BlName, specTable.SpecOptions.BlocksFilter.BlockNameMatch, RegexOptions.IgnoreCase))
            {
               // все атрибуты блока
               AttrsDict = blRef.GetAttributeDictionary();

               // Проверка типа блока
               var typeBlock = specTable.SpecOptions.BlocksFilter.Type;
               if (typeBlock != null)
               {
                  DBText atrType;
                  if (AttrsDict.TryGetValue(typeBlock.BlockPropName, out atrType))
                  {
                     if (!typeBlock.Name.Equals(atrType.TextString, StringComparison.OrdinalIgnoreCase))
                     {
                        // Свойство типа не соответствует требованию  
                        err += $"Свойство '{typeBlock.BlockPropName}'='{atrType.TextString}' не соответствует требуемому значению '{typeBlock.Name}'. ";                      
                     }
                  }
                  // В блоке нет свойства Типа
                  else
                  {
                     err += $"Нет обязательного свойства {typeBlock.BlockPropName}. ";
                  }
               }

               // Проверка обязательных атрибутов                              
               foreach (var atrMustHave in specTable.SpecOptions.BlocksFilter.AttrsMustHave)
               {
                  if (!AttrsDict.ContainsKey(atrMustHave))
                  {                     
                     err += $"Нет обязательного свойства: '{atrMustHave}'. ";                     
                  }
               }

               // определение Группы
               DBText groupAttr;
               if (AttrsDict.TryGetValue(specTable.SpecOptions.GroupPropName, out groupAttr))
               {
                  Group = groupAttr.TextString;
               }

               // Ключевое свойство
               DBText keyAttr;
               if (AttrsDict.TryGetValue(specTable.SpecOptions.KeyPropName, out keyAttr))
               {
                  Key = keyAttr.TextString;
               }
               else
               {
                  err += $"Не определено ключевое свойство '{specTable.SpecOptions.KeyPropName}'. ";                  
               }
            }
            // Имя блока не соответствует Regex.IsMatch
            else
            {
               err += $"Имя блока не соответствует '{specTable.SpecOptions.BlocksFilter.BlockNameMatch}'. ";               
            }            
         }

         if (string.IsNullOrEmpty(err))
         {
            return true;
         }
         else
         {
            Inspector.AddError($"Пропущен блок '{BlName}': {err}", blRef);
            return false;
         }
      }
示例#18
0
 /// <summary>
 /// Проверка группы
 /// </summary>
 public void Check(SpecTable specTable)
 {
     Records.ForEach(r => r.CheckRecords(specTable));
 }