Пример #1
0
        /// <summary>
        /// Возвращает значение свойства "Текстовый стиль" из стиля
        /// </summary>
        /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
        /// <returns>В случае неудачи возвращает "Standard"</returns>
        public static string GetTextStyleProperty(this SmartEntityStyle style)
        {
            foreach (var property in style.Properties)
            {
                if (property.Name == "TextStyle")
                {
                    return(property.Value.ToString());
                }
            }

            return("Standard");
        }
Пример #2
0
        /// <summary>
        /// Возвращает значение свойства "Имя слоя" из стиля
        /// </summary>
        /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
        public static string GetLayerNameProperty(this SmartEntityStyle style)
        {
            foreach (var property in style.Properties)
            {
                if (property.Name == "LayerName")
                {
                    return(property.Value.ToString());
                }
            }

            return(string.Empty);
        }
Пример #3
0
        /// <summary>
        /// Возвращает значение свойства "Тип линии" из стиля
        /// </summary>
        /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
        /// <returns>В случае неудачи возвращает "Continuous"</returns>
        public static string GetLineTypeProperty(this SmartEntityStyle style)
        {
            foreach (var property in style.Properties)
            {
                if (property.Name == "LineType")
                {
                    return(property.Value.ToString());
                }
            }

            return("Continuous");
        }
Пример #4
0
        /// <summary>
        /// Сделать слой текущим
        /// </summary>
        public void SetCurrent(SmartEntityStyle style)
        {
            foreach (SmartEntityStyle entityStyle in Styles)
            {
                if (entityStyle != style)
                {
                    if (entityStyle.IsCurrent)
                    {
                        entityStyle.IsCurrent = false;
                    }
                }
            }

            style.IsCurrent = true;
        }
Пример #5
0
        /// <summary>
        /// Конвертировать стиль в XElement
        /// </summary>
        private static XElement ConvertToXElement(this SmartEntityStyle style)
        {
            var styleXel = new XElement("UserStyle");

            styleXel.SetAttributeValue(nameof(style.Name), style.Name);
            styleXel.SetAttributeValue(nameof(style.Description), style.Description);
            styleXel.SetAttributeValue(nameof(style.Guid), style.Guid);

            foreach (var entityProperty in style.Properties)
            {
                if (entityProperty.Name == "Scale")
                {
                    var propXel = new XElement("Property");
                    propXel.SetAttributeValue("Name", entityProperty.Name);
                    propXel.SetAttributeValue("Value", ((AnnotationScale)entityProperty.Value).Name);
                    styleXel.Add(propXel);
                }
                else
                {
                    var propXel = new XElement("Property");
                    propXel.SetAttributeValue("Name", entityProperty.Name);
                    propXel.SetAttributeValue("Value", entityProperty.Value);
                    styleXel.Add(propXel);
                }
            }

            if (LayerUtils.HasLayer(style.GetLayerNameProperty()))
            {
                styleXel.Add(LayerUtils.SetLayerXml(LayerUtils.GetLayerTableRecordByLayerName(style.GetLayerNameProperty())));
            }
            else if (style.LayerXmlData != null)
            {
                styleXel.Add(style.LayerXmlData);
            }

            // add text style
            if (TextStyleUtils.HasTextStyle(style.GetTextStyleProperty()))
            {
                styleXel.Add(TextStyleUtils.SetTextStyleTableRecordXElement(TextStyleUtils.GetTextStyleTableRecordByName(style.GetTextStyleProperty())));
            }
            else if (style.TextStyleXmlData != null)
            {
                styleXel.Add(style.TextStyleXmlData);
            }

            return(styleXel);
        }
Пример #6
0
        /// <summary>
        /// Чтение свойств из примитива и запись их в стиль примитива
        /// </summary>
        /// <param name="style">Стиль примитива</param>
        /// <param name="entity">Интеллектуальный примитив</param>
        /// <param name="blockReference">Вставка блока, представляющая интеллектуальный примитив в AutoCAD</param>
        public static void GetPropertiesFromEntity(this SmartEntityStyle style, SmartEntity entity, BlockReference blockReference)
        {
            var entityType = entity.GetType();

            foreach (var propertyInfo in entityType.GetProperties())
            {
                var attribute = propertyInfo.GetCustomAttribute <EntityPropertyAttribute>();
                if (attribute != null && attribute.Name != "Style")
                {
                    if (attribute.PropertyScope != PropertyScope.PaletteAndStyleEditor)
                    {
                        continue;
                    }

                    if (attribute.Name == "LayerName")
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 blockReference.Layer,
                                                 ObjectId.Null));
                    }
                    else if (attribute.Name == "LineType")
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 blockReference.Linetype,
                                                 ObjectId.Null));
                    }
                    else
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 propertyInfo.GetValue(entity),
                                                 ObjectId.Null));
                    }
                }
            }
        }
Пример #7
0
        /// <summary>
        /// Наполнение стиля свойствами со значениями по умолчанию
        /// </summary>
        /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
        /// <param name="entityType">Тип интеллектуального объекта</param>
        public static void FillStyleDefaultProperties(this SmartEntityStyle style, Type entityType)
        {
            foreach (var propertyInfo in entityType.GetProperties())
            {
                var attribute = propertyInfo.GetCustomAttribute <EntityPropertyAttribute>();
                if (attribute != null && attribute.Name != "Style")
                {
                    if (attribute.PropertyScope != PropertyScope.PaletteAndStyleEditor)
                    {
                        continue;
                    }

                    if (attribute.Name == "Scale")
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 AcadUtils.AnnotationScaleFromString(attribute.DefaultValue.ToString()),
                                                 ObjectId.Null));
                    }
                    else if (attribute.Name == "LayerName")
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 AcadUtils.Layers.Contains(attribute.DefaultValue.ToString())
                                ? attribute.DefaultValue
                                : Language.GetItem("defl"),
                                                 ObjectId.Null));
                    }
                    else
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 attribute.DefaultValue,
                                                 ObjectId.Null));
                    }
                }
            }
        }
Пример #8
0
        /// <summary>
        /// Создание стандартных системных стилей
        /// </summary>
        private static void CreateSystemStyles()
        {
            var entityTypes = TypeFactory.Instance.GetEntityTypes();

            entityTypes.ForEach(et =>
            {
                var systemStyle = new SmartEntityStyle(et)
                {
                    Name =
                        $"{LocalizationUtils.GetEntityLocalizationName(et)} [{Language.GetItem("h12")}]",
                    Description = GetBaseStyleDescription(et),
                    Guid        = "00000000-0000-0000-0000-000000000000",
                    StyleType   = StyleType.System
                };
                if (!HasStyle(systemStyle))
                {
                    FillStyleDefaultProperties(systemStyle, et);

                    EntityStyles.Add(systemStyle);
                }
            });
        }
Пример #9
0
        /// <summary>
        /// Проверка стиля на наличие отсутствующих свойств. Свойства могут отсутствовать в случае,
        /// если стиль уже был сохранен, но позже вышло обновление с добавлением нового свойства
        /// </summary>
        /// <param name="style">Проверяемый стиль</param>
        /// <param name="entityType">Тип примитива</param>
        private static void CheckMissedProperties(this SmartEntityStyle style, Type entityType)
        {
            foreach (var propertyInfo in entityType.GetProperties())
            {
                var attribute = propertyInfo.GetCustomAttribute <EntityPropertyAttribute>();
                if (attribute != null && attribute.Name != "Style")
                {
                    if (attribute.PropertyScope != PropertyScope.PaletteAndStyleEditor)
                    {
                        continue;
                    }

                    // ReSharper disable once SimplifyLinqExpression
                    if (!style.Properties.Any(p => p.Name == attribute.Name))
                    {
                        style.Properties.Add(new SmartEntityProperty(
                                                 attribute,
                                                 entityType,
                                                 attribute.DefaultValue,
                                                 ObjectId.Null));
                    }
                }
            }
        }
Пример #10
0
        /// <summary>
        /// Применить к указанному интеллектуальному примитиву свойства из стиля
        /// </summary>
        /// <param name="entity">Экземпляр примитива</param>
        /// <param name="style">Стиль</param>
        /// <param name="isOnEntityCreation">True - применение стиля происходит при создании примитива.
        /// False - применение стиля происходит при выборе стиля в палитре</param>
        public static void ApplyStyle(this SmartEntity entity, SmartEntityStyle style, bool isOnEntityCreation)
        {
            var type = entity.GetType();

            foreach (var propertyInfo in type.GetProperties())
            {
                var attribute = propertyInfo.GetCustomAttribute <EntityPropertyAttribute>();
                if (attribute != null)
                {
                    var propertyFromStyle = style.Properties.FirstOrDefault(sp => sp.Name == attribute.Name);
                    if (propertyFromStyle != null)
                    {
                        if (attribute.Name == "Scale")
                        {
                            if (isOnEntityCreation)
                            {
                                if (MainSettings.Instance.UseScaleFromStyle)
                                {
                                    propertyInfo.SetValue(entity, propertyFromStyle.Value);
                                }
                                else
                                {
                                    entity.Scale = AcadUtils.GetCurrentScale();
                                }
                            }
                            else
                            {
                                propertyInfo.SetValue(entity, propertyFromStyle.Value);
                            }
                        }
                        else if (attribute.Name == "LayerName")
                        {
                            var layerName = propertyFromStyle.Value.ToString();
                            if (string.IsNullOrEmpty(layerName))
                            {
                                layerName = Language.GetItem("defl");
                            }

                            if (isOnEntityCreation)
                            {
                                if (MainSettings.Instance.UseLayerFromStyle)
                                {
                                    propertyInfo.SetValue(entity, layerName);
                                    AcadUtils.SetLayerByName(entity.BlockId, layerName, style.LayerXmlData);
                                }
                            }
                            else
                            {
                                propertyInfo.SetValue(entity, layerName);
                                AcadUtils.SetLayerByName(entity.BlockId, layerName, style.LayerXmlData);
                            }
                        }
                        else if (attribute.Name == "LineType")
                        {
                            var lineType = propertyFromStyle.Value.ToString();
                            AcadUtils.SetLineType(entity.BlockId, lineType);
                        }
                        else if (attribute.Name == "TextStyle")
                        {
                            var apply = false;
                            if (isOnEntityCreation)
                            {
                                if (MainSettings.Instance.UseTextStyleFromStyle)
                                {
                                    apply = true;
                                }
                            }
                            else
                            {
                                apply = true;
                            }

                            if (apply)
                            {
                                var textStyleName = propertyFromStyle.Value.ToString();
                                if (TextStyleUtils.HasTextStyle(textStyleName))
                                {
                                    propertyInfo.SetValue(entity, textStyleName);
                                }
                                else
                                {
                                    if (MainSettings.Instance.IfNoTextStyle == 1 &&
                                        TextStyleUtils.CreateTextStyle(style.TextStyleXmlData))
                                    {
                                        propertyInfo.SetValue(entity, textStyleName);
                                    }
                                }
                            }
                        }
                        else if (attribute.Name == "NumberSeparator")
                        {
                            switch (MainSettings.Instance.GlobalNumberSeparator)
                            {
                            case GlobalNumberSeparator.FromModPlusSettings:
                                propertyInfo.SetValue(
                                    entity,
                                    Variables.Separator == "." ? NumberSeparator.Dot : NumberSeparator.Comma);
                                break;

                            case GlobalNumberSeparator.FromStyle:
                                propertyInfo.SetValue(entity, propertyFromStyle.Value);
                                break;

                            case GlobalNumberSeparator.Dot:
                                propertyInfo.SetValue(entity, NumberSeparator.Dot);
                                break;

                            case GlobalNumberSeparator.Comma:
                                propertyInfo.SetValue(entity, NumberSeparator.Comma);
                                break;

                            default:
                                throw new ArgumentOutOfRangeException();
                            }
                        }
                        else
                        {
                            propertyInfo.SetValue(entity, propertyFromStyle.Value);
                        }
                    }
                }
                else
                {
                    if (propertyInfo.Name == "StyleGuid")
                    {
                        propertyInfo.SetValue(entity, style.Guid);
                    }
                }
            }
        }
Пример #11
0
 /// <summary>
 /// Удаление стиля из списка
 /// </summary>
 /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
 public static void RemoveStyle(SmartEntityStyle style)
 {
     EntityStyles.Remove(style);
 }
Пример #12
0
 /// <summary>
 /// Добавить стиль в список
 /// </summary>
 /// <param name="style">Стиль <see cref="SmartEntityStyle"/></param>
 public static void AddStyle(SmartEntityStyle style)
 {
     EntityStyles.Add(style);
 }
Пример #13
0
 /// <summary>
 /// Сохранить стиль как Текущий в настройки пользователя
 /// </summary>
 /// <param name="style">Сохраняемый стиль</param>
 public static void SaveCurrentStyleToSettings(SmartEntityStyle style)
 {
     UserConfigFile.SetValue($"mp{style.EntityType.Name}", "CurrentStyleGuid", style.Guid, true);
 }
Пример #14
0
        /// <summary>
        /// Загрузка пользовательских стилей из xml-файла для указанного типа примитива
        /// </summary>
        /// <param name="entityType">Тип примитива</param>
        private static void LoadStylesFromXmlFile(Type entityType)
        {
            var stylesFile = Path.Combine(MainFunction.StylesPath, $"{entityType.Name}Styles.xml");

            if (File.Exists(stylesFile))
            {
                for (var i = EntityStyles.Count - 1; i >= 0; i--)
                {
                    var style = EntityStyles[i];
                    if (style.StyleType == StyleType.System)
                    {
                        continue;
                    }

                    if (style.EntityType != entityType)
                    {
                        continue;
                    }

                    EntityStyles.RemoveAt(i);
                }

                var fXel = XElement.Load(stylesFile);
                foreach (var styleXel in fXel.Elements("UserStyle"))
                {
                    var style = new SmartEntityStyle(entityType)
                    {
                        StyleType = StyleType.User
                    };
                    style.Name        = styleXel.Attribute(nameof(style.Name))?.Value;
                    style.Description = styleXel.Attribute(nameof(style.Description))?.Value;

                    // Guid беру, если есть атрибут. Иначе создаю новый
                    var guidAttr = styleXel.Attribute(nameof(style.Guid));
                    style.Guid = guidAttr?.Value ?? Guid.NewGuid().ToString();

                    if (HasStyle(style))
                    {
                        continue;
                    }

                    // get layer xml data
                    var layerData = styleXel.Element("LayerTableRecord");
                    style.LayerXmlData = layerData ?? null;

                    // get text style xml data
                    var textStyleData = styleXel.Element("TextStyleTableRecord");
                    style.TextStyleXmlData = textStyleData ?? null;

                    // get properties from file
                    foreach (var propertyInfo in entityType.GetProperties())
                    {
                        var attribute = propertyInfo.GetCustomAttribute <EntityPropertyAttribute>();
                        if (attribute != null)
                        {
                            var xmlProperty = styleXel.Elements("Property").FirstOrDefault(e => e.Attribute("Name")?.Value == attribute.Name);
                            if (xmlProperty != null)
                            {
                                var xmlValue  = xmlProperty.Attribute("Value")?.Value;
                                var valueType = attribute.DefaultValue.GetType();
                                if (attribute.Name == "Scale")
                                {
                                    style.Properties.Add(new SmartEntityProperty(
                                                             attribute,
                                                             entityType,
                                                             AcadUtils.AnnotationScaleFromString(xmlValue),
                                                             ObjectId.Null));
                                }
                                else
                                {
                                    if (valueType == typeof(string))
                                    {
                                        style.Properties.Add(new SmartEntityProperty(
                                                                 attribute,
                                                                 entityType,
                                                                 xmlProperty.Attribute("Value").Value,
                                                                 ObjectId.Null));
                                    }
                                    else if (valueType == typeof(int))
                                    {
                                        style.Properties.Add(new SmartEntityProperty(
                                                                 attribute,
                                                                 entityType,
                                                                 int.TryParse(xmlValue, out var i) ? i : attribute.DefaultValue,
                                                                 ObjectId.Null));
                                    }
                                    else if (valueType == typeof(double))
                                    {
                                        style.Properties.Add(new SmartEntityProperty(
                                                                 attribute,
                                                                 entityType,
                                                                 double.TryParse(xmlValue, out var d) ? d : attribute.DefaultValue,
                                                                 ObjectId.Null));
                                    }
                                    else if (valueType == typeof(bool))
                                    {
                                        style.Properties.Add(new SmartEntityProperty(
                                                                 attribute,
                                                                 entityType,
                                                                 bool.TryParse(xmlValue, out var b) ? b : attribute.DefaultValue,
                                                                 ObjectId.Null));
                                    }
                                    else if (valueType.IsEnum)
                                    {
                                        try
                                        {
                                            style.Properties.Add(new SmartEntityProperty(
                                                                     attribute,
                                                                     entityType,
                                                                     Enum.Parse(attribute.DefaultValue.GetType(), xmlValue),
                                                                     ObjectId.Null));
                                        }
                                        catch
                                        {
                                            style.Properties.Add(new SmartEntityProperty(
                                                                     attribute,
                                                                     entityType,
                                                                     attribute.DefaultValue,
                                                                     ObjectId.Null));
                                        }
                                    }
                                }
                            }
                        }
                    }

                    style.CheckMissedProperties(entityType);

                    // add style
                    EntityStyles.Add(style);
                }
            }
        }
Пример #15
0
 private static bool HasStyle(SmartEntityStyle style)
 {
     return(EntityStyles.Any(s => s.EntityType == style.EntityType &&
                             s.StyleType == style.StyleType &&
                             s.Guid == style.Guid));
 }