| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как принято, как лучше описывать Xdata у элементов?

Как принято, как лучше описывать Xdata у элементов?

Ответ
Поиск в этой теме
Непрочитано 30.11.2019, 22:19
Как принято, как лучше описывать Xdata у элементов?
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,030

Допустим, чертим трубы. У труб нужно описать некий индекс, диаметр в мм, длину в м, материал и производителя. (Не важно, не трубы, так провода, не провода, так стены. Не эти х-ки, а любые. Не пять, а двадцать четыре х-ки. Все лишь условный пример).

Допустим, решили для х-к использовать Xdata.
Xdata определяются названием (application name) и входящими в них данными с типами Int, Long, Real, Str и пр.

Я вижу два варианта таких описаний:

Вариант 1. Все х-ки в одном Xdata. Допустим, придаем линии (3Dполилинии, телу - не важно) Xdata с названием "Трубы", в котором определяем одно поле Str для индекса, второе Real для диаметра, третье Real для длины, четвертое Str для материала и пятое Str для производителя. Вроде: "1-Т/22-94", "25.4", "72.6", "ППЭ", "Полипласт".

Вариант 2. Каждая х-ка в своем Xdata. Например: "Трубы_индекс", "Трубы_диаметр_мм", "Трубы_длина_м", "Трубы_материал", "Трубы_производитель".

Кто как чаще делает? Как-то принято? Есть какие-то конвенции? И подводные камни у этих вариантов?
__________________
количество моих сообщений не говорит о знании Автокада
Просмотров: 15337
 
Непрочитано 28.12.2019, 09:05
#61
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Еще есть требования заказчиков. Которые могут заказать данные в Xdata.
и когда последний раз заказчик заказывал данные в XData?) Это внутренняя автоматизация фирмы, и тогда это уже скорее вариант №3 от Аутодеска в виде пар: название параметра - значение параметра. Причем
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если названия полей повторяются, то можно их вынести в отдельный словарь, например - а в XData писать лишь целочисленный ключ.
и даже не словарь - а тот же XML лежит в папке с корпоративными стандартами с доступом только для чтения и надстройка загружает его с сервера. Серверы-файлопомойки есть сейчас у большинства - и реализовать могут все, если от болтовни к делу перейдут, конечно) И простейший класс на основе словаря Dictionary<Int32, {DXFCode, NameVariable}>, посредством которого от обезличенных параметров XData переходите к индексируемым параметрам [NameVariable] с контролем типа переменной. Только прошло уже пять лет с тех времен, как вы начали с этой типизацией XData носиться...
Сергей812 вне форума  
 
Непрочитано 28.12.2019, 09:20
#62
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Сергей812, чисто для справки - а разве в Dictionary допускаются повторяющиеся элементы? Я почему-то думал, что он в этом плане не сильно отличается от Collection.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.12.2019, 09:29
#63
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
а разве в Dictionary допускаются повторяющиеся элементы?
только ключи должны быть уникальными
trir вне форума  
 
Непрочитано 28.12.2019, 09:35
#64
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
а разве в Dictionary допускаются повторяющиеся элементы? Я почему-то думал, что он в этом плане не сильно отличается от Collection.
я про этот словарь в .Net - а там ключи не могут повторяться, а значения - пожалуйста. Там приличные накладные расходы на элемент (если не ошибаюсь: +16/32 байт для 32/64-битной системы) - зато скорость доступа к элементу по ключу приближается к операции O (1). Чтобы этот дополнительный класс-прокладка индексированного доступа к xData не тормозил заметно)
Сергей812 вне форума  
 
Непрочитано 28.12.2019, 10:00
#65
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Сергей812, ну так и я про него же. Ок, понял - ключи уникальные, без вариантов.

----- добавлено через 41 сек. -----
Читаю документацию от случая к случаю, так что многое просто не знаю )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.12.2019, 16:51
#66
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от trir Посмотреть сообщение
Xdata не предназначен для обмена, а только для хранения - подразумевается, что их читает только тот, кто знает что там записано, а остальным туда соваться не стоит
Предназначены-не предназначены здесь тоже не к месту. Т.к. вопрос темы совершенно другой. Данные есть такие, какие есть. Не засоряйте тему.
Цитата:
Сообщение от trir Посмотреть сообщение
Это внутренняя автоматизация фирмы...XML лежит в папке...Dictionary<Int32, {DXFCode, NameVariable}>...
Внутренняя-внешняя, XML-Dictionary и пр. - тоже не заданные вопросы. Не засоряйте тему.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
...это уже скорее вариант №3 от Аутодеска в виде пар: название параметра - значение параметра.
Лучше Варианта 2?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 17:30
| 1 #67
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Еще есть требования заказчиков. Которые могут заказать данные в Xdata.
У меня богатое воображение, но его недостаточно, чтобы представить того заказчика, который закажет данные в Xdata. 99.999% заказчиков вообще понятия не имеют о существовании Xdata.
Александр Ривилис вне форума  
 
Непрочитано 28.12.2019, 17:40
#68
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Лучше Варианта 2?
Нет лучше варианта или хуже. Есть работающие варианты и пустозвонство на уже четвертую страницу...

Новогодний подарок для тех, кто что-то делает - а не только ноет)
Код:
[Выделить все]
// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;


// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Элемент словаря в памяти с параметрами имен полей
    /// </summary>
    internal struct ItemInfoNamesDict
    {
        /// <summary>
        /// Код типа данных
        /// </summary>
        public short TypeCode;

        /// <summary>
        /// Индекс имени
        /// </summary>
        public int IndexKey;

        /// <summary>
        /// Конструктор структуры ItemNamesDict
        /// </summary>
        /// <param name="aDXFCode">DXF код типа данных</param>
        /// <param name="aIndexKey">Индекс ключа</param>
        public ItemInfoNamesDict(DxfCode aDXFCode, int aIndexKey)
        {
            TypeCode = (short)aDXFCode;
            IndexKey = aIndexKey;
        }
    }


    /// <summary>
    /// Состояние статуса инициализации
    /// </summary>
    internal enum StatusInit
    {
        /// <summary>
        /// Данные успешно считаны из XData
        /// </summary>
        OK,

        /// <summary>
        /// Не найдено зарегистрированное приложение
        /// </summary>
        NotFoundApp,
        
        /// <summary>
        /// Непредвиденная ошибка
        /// </summary>
        Error,

        /// <summary>
        /// XData не найдены в примитиве
        /// </summary>
        NotFoundXData,

        /// <summary>
        /// Структуре данных писец
        /// </summary>
        CorruptedStructure
    };
}

Код:
[Выделить все]
// Windows
using System;
using System.Collections.Generic;
using System.Linq;

// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;


// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Поддержка имен полей в XData
    /// </summary>
    internal static class XDataFieldNames
    {
        /// <summary>
        /// Словарь параметров полей по их именам
        /// </summary>
        private static Dictionary<string, ItemInfoNamesDict> _Info = 
            new Dictionary<string, ItemInfoNamesDict>();

        /// <summary>
        /// Словарь имен полей по их индексам
        /// </summary>
        private static Dictionary<int, string> _Indexes = new Dictionary<int, string>();
        

        /// <summary>
        /// Инициализация словарей
        /// </summary>
        public static void InitNames()
        {
            // ЗАГЛУШКА! Тут нужно реализовать метод инициализации - из XML, БД и т.п. 
            _Info.Add("Длина", new ItemInfoNamesDict(DxfCode.ExtendedDataInteger32, 1));
            _Info.Add("Ширина", new ItemInfoNamesDict(DxfCode.ExtendedDataInteger32, 2));
            _Info.Add("Классификатор", new ItemInfoNamesDict(DxfCode.ExtendedDataAsciiString, 3));

            // Инициализируем словарь имен полей по их индексам
            foreach (string lName in _Info.Keys.ToArray<string>())
            {
                _Indexes.Add(_Info[lName].IndexKey, lName);
            }
        }


        /// <summary>
        /// Получение параметров поля по его имени
        /// </summary>
        /// <param name="aName">Имя поля</param>
        /// <returns>Параметры поля (если указанное поле отсутствует
        /// в словаре, то возвращается DxfCode.Invalid)</returns>
        public static ItemInfoNamesDict GetInfoName(string aName)
        {
            return _Info.ContainsKey(aName) ? _Info[aName] : 
                new ItemInfoNamesDict(DxfCode.Invalid, -1);
        }


        /// <summary>
        /// Получение имени поля по его индексу
        /// </summary>
        /// <param name="aIndex">Индекс поля (не путать с порядковым номером в списке!)</param>
        /// <returns>Имя поля либо пустая строка, если такого индекса нет</returns>
        public static string GetNameByIndex(int aIndex)
        {
            return _Indexes.ContainsKey(aIndex) ? _Indexes[aIndex] : String.Empty;
        }
        

        /// <summary>
        /// Количество имен полей
        /// </summary>
        public static int Count
        {
            get { return _Info.Count; }
        }


        /// <summary>
        /// Получение отсортированного списка имен полей
        /// </summary>
        public static string[] GetSortNames
        {
            get
            {
                // Если пустая коллекция
                if (_Info.Count == 0)
                {
                    // Возвращаем пустой массив
                    return new string[0];
                }
                else
                {
                    // Получаем список имен ключей
                    string[] lNames = _Info.Keys.ToArray<string>();
                    // Сортируем и возвращаем его
                    Array.Sort(lNames);
                    return lNames;
                }
            }
        }

    }
}

Код:
[Выделить все]
// Windows
using System;
using System.Collections.Generic;
using System.Linq;

// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;

// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Индексированные значения XData
    /// </summary>
    internal class NamedXData
    {
        /// <summary>
        /// Словарь индексированных значений XData
        /// </summary>
        private Dictionary<string, TypedValue> _Values = new Dictionary<string, TypedValue>();

        /// <summary>
        /// Имя приложения в XData
        /// </summary>
        private readonly string _NameApp;

        /// <summary>
        /// Состояние инициализации
        /// </summary>
        private readonly StatusInit _StatusInit = StatusInit.OK;


        /// <summary>
        /// Конструктор класса NamedXData
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aNameApp">Имя приложения в XData</param>
        public NamedXData(string aNameApp)
        {
            // Запоминаем имя приложения XData
            _NameApp = aNameApp;
        }


        /// <summary>
        /// Конструктор класса NamedXData
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aNameApp">Имя приложения в XData</param>
        /// <param name="aEntityId">Идентификатор примитива</param>
        /// <param name="aAcadDb">БД чертежа</param>
        public NamedXData(string aNameApp, ObjectId aEntityId, Database aAcadDb)
        {
            // Запоминаем имя приложения XData
            _NameApp = aNameApp;
            // Открываем транзакцию
            using (Transaction lAcadTran = aAcadDb.TransactionManager.StartTransaction())
            {
                try
                {
                    // Получаем таблицу зарегистрированных приложений
                    RegAppTable lRegAppTable = (RegAppTable)lAcadTran.GetObject(
                        aAcadDb.RegAppTableId, OpenMode.ForRead);
                    // Если приложение зарегистрировано
                    if (lRegAppTable.Has(_NameApp))
                    {
                        // Открываем примитив
                        Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForRead);
                        // Пробуем получить расширенные данные
                        ResultBuffer lResultBuffer = lEntity.GetXDataForApplication(_NameApp);
                        // Если примитив содержит XData
                        if (lResultBuffer != null)
                        {
                            // Флаг идентификатора поля
                            bool lIsNameField = true;
                            // Имя поля
                            string lNameField = null;
                            // В цикле по значениям XData
                            foreach (TypedValue lTypedValue in lResultBuffer)
                            {
                                // Если имя приложения - пропускаем
                                if (lTypedValue.TypeCode == (short)DxfCode.ExtendedDataRegAppName) continue;
                                // Если имя поля
                                if (lIsNameField)
                                {
                                    // Если целочисленный тип
                                    if (lTypedValue.TypeCode == (short)DxfCode.ExtendedDataInteger32)
                                    {
                                        // Получаем имя поля
                                        lNameField = XDataFieldNames.GetNameByIndex((int)lTypedValue.Value);
                                        // Если такое поле не существует
                                        if (lNameField == String.Empty)
                                        {
                                            // Нарушена структура данных
                                            _StatusInit = StatusInit.CorruptedStructure;
                                            // Выходим из цикла
                                            break;
                                        }

                                    }
                                    else
                                    {
                                        // Нарушена структура данных
                                        _StatusInit = StatusInit.CorruptedStructure;
                                        // Выходим из цикла
                                        break;
                                    }
                                }
                                else
                                {
                                    // Получаем информацию о  поле
                                    ItemInfoNamesDict lInfoItem = XDataFieldNames.GetInfoName(lNameField);
                                    // Если тип текущего поля в XData соответствует информации о поле
                                    if (lTypedValue.TypeCode == lInfoItem.TypeCode)
                                    {
                                        // Заносим значение в словарь
                                        _Values.Add(lNameField, lTypedValue);
                                    }
                                    else
                                    {
                                        // Нарушена структура данных
                                        _StatusInit = StatusInit.CorruptedStructure;
                                        // Выходим из цикла
                                        break;
                                    }
                                }
                                // Инвертируем флаг идентификатора поля
                                lIsNameField = !lIsNameField;
                            }
                            // Освобождаем буфер
                            lResultBuffer.Dispose();
                        } // Если примитив содержит XData
                        else
                        {
                            // XData не найдено
                            _StatusInit = StatusInit.NotFoundXData;
                        }
                    }
                    else
                    {
                        // Приложение не зарегистрированно
                        _StatusInit = StatusInit.NotFoundApp;
                    }
                    // Подтверждаем транзакцию
                    lAcadTran.Commit();
                }
                catch
                {
                    // Непредвиденная ошибка
                    _StatusInit = StatusInit.Error;
                    // Отменяем транзакцию
                    lAcadTran.Abort();
                }
            } // Открытие транзакции
            // Если была нарушена структура - очищаем словарь данных
            if (_StatusInit == StatusInit.CorruptedStructure) _Values.Clear();
        }


        /// <summary>
        /// Обновление XData в примитиве
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aEntityId">Идентификатор примитива</param>
        /// <param name="aAcadDb">БД чертежа</param>
        /// <param name="aIsRemoveEmptyXData">Удалять расширенные данные, 
        /// если нет значений в словаре</param>
        /// <returns>true - обновление прошло успешно, false - нет</returns>
        public bool UpdateXData(ObjectId aEntityId, Database aAcadDb, 
            bool aIsRemoveEmptyXData = true)
        {
            // Открываем транзакцию
            using (Transaction lAcadTran = aAcadDb.TransactionManager.StartTransaction())
            {
                try
                {
                    // Если словарь значений не пустой
                    if (_Values.Count > 0)
                    {
                        // Получаем таблицу зарегистрированных приложений
                        RegAppTable lRegAppTable = (RegAppTable)lAcadTran.GetObject(
                            aAcadDb.RegAppTableId, OpenMode.ForRead);
                        // Если приложение не зарегистрировано
                        if (!lRegAppTable.Has(_NameApp))
                        {
                            // Переоткрываем таблицу зарегистрированных приложений на запись
                            lRegAppTable.UpgradeOpen();
                            // Создаем запись регистрируемого приложения
                            RegAppTableRecord lRegAppTableRecord = new RegAppTableRecord
                            {
                                Name = _NameApp
                            };
                            // Добавляем в таблицу и в саму БД
                            lRegAppTable.Add(lRegAppTableRecord);
                            lAcadTran.AddNewlyCreatedDBObject(lRegAppTableRecord, true);
                            // Переоткрываем таблицу зарегистрированных приложений на чтение
                            lRegAppTable.DowngradeOpen();
                        }
                        // Создаем буфер значений
                        ResultBuffer lResultBuffer = new ResultBuffer();
                        // Заносим туда имя приложения
                        lResultBuffer.Add(new TypedValue((short)DxfCode.ExtendedDataRegAppName, _NameApp));
                        // И значения из словаря
                        foreach (string lName in _Values.Keys.ToArray<string>())
                        {
                            lResultBuffer.Add(new TypedValue((short)DxfCode.ExtendedDataInteger32,
                                XDataFieldNames.GetInfoName(lName).IndexKey));
                            lResultBuffer.Add(_Values[lName]);
                        }
                        // Открываем примитив на запись
                        Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForWrite);
                        // Добавляем ему XData
                        lEntity.XData = lResultBuffer;
                    } // Если словарь значений не пустой
                    else
                    {
                        // Если включено удаление XData
                        if (aIsRemoveEmptyXData)
                        {
                            // Открываем примитив
                            Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForRead);
                            // Пробуем получить расширенные данные
                            ResultBuffer lResultBuffer = lEntity.GetXDataForApplication(_NameApp);
                            // Если примитив содержит XData
                            if (lResultBuffer != null)
                            {
                                // Переоткрываем примитив на запись
                                lEntity.UpgradeOpen();
                                // Удаляем XData
                                lEntity.XData = new ResultBuffer(new TypedValue(
                                    (short)DxfCode.ExtendedDataRegAppName, _NameApp));
                                // Переоткрываем примитив на чтение
                                lEntity.DowngradeOpen();
                            }
                        }
                    }
                    // Подтверждаем транзакцию
                    lAcadTran.Commit();
                }
                catch
                {
                    // Отменяем транзакцию
                    lAcadTran.Abort();
                    // Возвращаем - ошибка обновления данных
                    return false;
                }
            } // Открываем транзакцию
            // Возращаем - успешное обновление XData
            return true;
        }


        /// <summary>
        /// Статус инициализации
        /// </summary>
        public StatusInit StatusInitialization
        {
            get { return _StatusInit; }
        }


        /// <summary>
        /// Количество значений
        /// </summary>
        public int CountValues
        {
            get { return _Values.Count; }
        }


        /// <summary>
        /// Получение/установка значения по индексу
        /// </summary>
        /// <param name="aName">Имя индекса</param>
        /// <returns>Значение типа TypedValue</returns>
        /// <exception cref="KeyNotFoundException">Не найдено получаемое
        /// значение с именем!</exception>
        /// <exception cref="InvalidCastException">Тип задаваемого значение 
        /// не совпадает с параметрами поля!</exception>
        public TypedValue this[string aName]
        {
            // Получение значения по имени
            get
            {
                // Если нет такого имени в индексах - исключение 
                if (!_Values.ContainsKey(aName)) throw new KeyNotFoundException(
                    String.Format("Не найдено получаемое значение с именем [{0}]!", aName));
                // Возвращаем значение
                return _Values[aName];
            }
            // Установка значения
            set
            {
                // Если есть такое имя в индексах - исключение 
                if (_Values.ContainsKey(aName))
                { 
                    // Если пытаемся задать иной тип значения - исключение
                    if (value.TypeCode != XDataFieldNames.GetInfoName(aName).TypeCode) throw new
                        InvalidCastException("Тип задаваемого значение не совпадает с параметрами поля!");
                }
                // Добавляем/заменяем значение
                _Values[aName] = value;
            }
        }


        /// <summary>
        /// Отсортированный список имен переменных
        /// </summary>
        public string[] NameValues
        {
            get
            {
                // Если пустая коллекция
                if (_Values.Count == 0)
                {
                    // Возвращаем пустой массив
                    return new string[0];
                }
                else
                {
                    // Получаем список имен переменных
                    string[] lNames = _Values.Keys.ToArray<string>();
                    // Сортируем и возвращаем его
                    Array.Sort(lNames);
                    return lNames;
                }
            }
        }

    }
}

Код:
[Выделить все]
// AutoCAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

// User
using Indexed_XData;


namespace KEY_XData
{
    public class CommandsClass : IExtensionApplication
    {
        /// <summary>
        /// Имя приложения XData
        /// </summary>
        private const string cNameApp = "INDEXESXDATA";


        /// <summary>
        /// Установка расширенных данных для примитива
        /// </summary>
        [CommandMethod("SetXData")]
        public void SetXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                NamedXData lNamedXData = new NamedXData(cNameApp);
                lNamedXData["Классификатор"] = new TypedValue(
                    (short)DxfCode.ExtendedDataAsciiString, "DF45-GH-JK3");
                lNamedXData["Ширина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 250);
                lNamedXData.UpdateXData(lPromptEntityResult.ObjectId, lAcadDb);
                lAcadEd.WriteMessage("\nДанные занесены в XData");
                lAcadEd.WriteMessage("\n");
            }
        }


        /// <summary>
        /// Считывание расширенных данных для примитива
        /// </summary>
        [CommandMethod("GetXData")]
        public void GetXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                // Получаем расширенные данные из примитива
                NamedXData lNamedXData = new NamedXData(cNameApp, 
                    lPromptEntityResult.ObjectId, lAcadDb);
                // Если успешно
                if (lNamedXData.StatusInitialization == StatusInit.OK)
                {
                    // В цикле по именам переменных
                    foreach (string lName in lNamedXData.NameValues)
                    {
                        lAcadEd.WriteMessage("\nName =[{0}] Value = [{1}]",
                            lName, lNamedXData[lName].Value);
                    }
                }
                else
                {
                    switch (lNamedXData.StatusInitialization)
                    {
                        case StatusInit.NotFoundApp:
                            lAcadEd.WriteMessage("\nПриложение не зарегистрировано!");
                            break;
                        case StatusInit.Error:
                            lAcadEd.WriteMessage("\nОбщая ошибка!");
                            break;
                        case StatusInit.NotFoundXData:
                            lAcadEd.WriteMessage("\nВ указанном примитиве нет XData!");
                            break;
                        case StatusInit.CorruptedStructure:
                            lAcadEd.WriteMessage("\nВ XData покапался горе-программист!");
                            break;
                    }
                }
                lAcadEd.WriteMessage("\n");
            }
        }
        

        /// <summary>
        /// Установка расширенных данных для примитива
        /// </summary>
        [CommandMethod("ModifyXData")]
        public void ModifyXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                // Получаем расширенные данные из примитива
                NamedXData lNamedXData = new NamedXData(cNameApp,
                    lPromptEntityResult.ObjectId, lAcadDb);
                // Если успешно
                if (lNamedXData.StatusInitialization == StatusInit.OK)
                {
                    // Добавляем величину
                    lNamedXData["Длина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 1024);
                    // Меняем значение величины
                    lNamedXData["Ширина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 512);
                    lNamedXData.UpdateXData(lPromptEntityResult.ObjectId, lAcadDb);
                    lAcadEd.WriteMessage("\nДанные изменены в XData");
                    lAcadEd.WriteMessage("\n");
                }
            }
        }


        /// <summary>
        /// Инициализация сборки
        /// </summary>
        public void Initialize()
        {
            // Инициализация имен переменных из корпоративных стандартов))
            XDataFieldNames.InitNames();
        }


        /// <summary>
        /// Деинициализация сборки
        /// </summary>
        public void Terminate()
        {
        }
    }
}


Команда: SETXDATA
Укажите примитив:
Данные занесены в XData

Команда: GETXDATA
Укажите примитив:
Name =[Классификатор] Value = [DF45-GH-JK3]
Name =[Ширина] Value = [250]

Команда: MODIFYXDATA
Укажите примитив:
Данные изменены в XData

Команда: GETXDATA
Укажите примитив:
Name =[Длина] Value = [1024]
Name =[Классификатор] Value = [DF45-GH-JK3]
Name =[Ширина] Value = [512]


Тщательно не тестировал, но в целом работает) Может кому то пригодится)
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.12.2019, 17:49
#69
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
У меня богатое воображение, но его недостаточно, чтобы представить того заказчика, который закажет данные в Xdata. 99.999% заказчиков вообще понятия не имеют о существовании Xdata.
Заказчики-начальники - да. А их сотрудники - вполне. Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
Но как это отвечает на вопрос темы?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 17:58
#70
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но как это отвечает на вопрос темы?
На этот вопрос давно дал ответ trir. И я полностью с ним согласен:

Цитата:
Сообщение от trir Посмотреть сообщение
Xdata не предназначен для обмена, а только для хранения - подразумевается, что их читает только тот, кто знает что там записано, а остальным туда соваться не стоит
И как программист будет хранить там информацию - это его дело. Хоть в виде бинарного кода. Общепринятого способа использовать XData нет.

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Заказчики-начальники - да. А их сотрудники - вполне. Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
Стесняюсь спросить что именно они заказывали?
Александр Ривилис вне форума  
 
Непрочитано 28.12.2019, 18:00
| 1 #71
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
т.е. прошел год - а вы даже не сдвинулись с мертвой точки, всё идеальный вариант хранения в XData ищите созерцательно?)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 17:14
#72
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
И как программист будет хранить там информацию - это его дело. Хоть в виде бинарного кода. Общепринятого способа использовать XData нет.
В посте темы речь об использовании Xdata, как средства хранения описательных данных объектов. И задан вопрос, как лучше их описывать в Xdata, чтобы было понятно, где что? Из поста, по-моему, тоже понятно, что я знаю, что общепринятого способа нет. Но разве не может быть каких-то удачных решений?
Вопросов о том, целесообразно ли хранить описательные данные в Xdata, как еще в программах используют Xdata и т.д., и т.п., не задавалось.
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Стесняюсь спросить что именно они заказывали?
Объекты благоустройства с характеристиками. Или системы сигнализации. Или трубопроводы. Какая разница?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
т.е. прошел год - а вы даже не сдвинулись с мертвой точки, всё идеальный вариант хранения в XData ищите созерцательно?)
Ваш стиль поведения в этой теме (и не только) - это троллинг.

Сейчас вспомнил, что сам AutoCAD пишет Xdata в штриховки:
Цитата:
* Registered Application Name: GradientColor1ACI
* Code 1070, 16-bit integer: 5

* Registered Application Name: GradientColor2ACI
* Code 1070, 16-bit integer: 2

* Registered Application Name: ACAD
* Code 1010, 3 real numbers: (0.00 0.00 0.00)

* Registered Application Name: HATCHBACKGROUNDCOLOR
* Code 1071, 32-bit signed long integer: -1023410175
* Code 1000, ASCII string:
* Code 1000, ASCII string:
Т.е. для штриховок AutoCAD использует почти Вариант 2 - одно appname на одно свойство с одним полем. За исключением HATCHBACKGROUNDCOLOR с тремя полями - появляется, если у штриховки есть цвет фона.
Можно было записать, допустим, цвета градиентов в одном общем appname. Или сделать одно общее для всех данных штриховок.
Во-вторых, в них AutoCAD не использует бинарный код.
Т.е. похоже на стремление обеспечить наибольшую прозрачность этих данных.

Конечно, в самом AutoCAD есть и противоположные примеры.

Посмотрел, как в Electrical:
Цитата:
* Registered Application Name: CIM_WD_WDESC
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 0
* Code 1002, Starting or ending brace: }

* Registered Application Name: CIM_WD_WDESCLEAD
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 0
* Code 1002, Starting or ending brace: }

* Registered Application Name: VIA_WD_WNPTR
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 110C6
* Code 1002, Starting or ending brace: }
И т.д. Таких у объекта может быть несколько десятков, попалось и больше 100.
В т.ч. есть, оказывается, специальный "* Code 1005, Database handle".
Т.е. у всех объектов Electrical, которые смог просмотреть, используется Вариант 2 - одно appname на одно свойство с одним полем.

Прислали еще пример, Вариант 7:
Все значения формируются как текстовые из трех частей: <название_поля>|<тип_поля>|<значение>
Например:
Цитата:
* Code 1000, ASCII string: BUILDINGID|INT|4711
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 17:36
#73
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Ваш стиль поведения в этой теме (и не только) - это троллинг.
см. п.68 - там рабочий код, как перейти в XData к индексированным (по имени) данным вне зависимости от их реального порядка следования в расширенных данных. И при этом контролируется тип расширенных данных при задании значений элементов XData. Но вы же нефига там не поняли в коде же, признайтесь?) И так и будете пытаться еще многие годы носиться со своими абстрактными идеями универсального описания данных в XData, несмотря на то - что ответы от разных людей на подобный бред годами не меняются)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 18:59
#74
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но вы же нефига там не поняли в коде же, признайтесь?)
Продолжаете, значит...
Выкладывая код, Вы хорошо знали, что я не смогу его понять и даже запустить. Чтобы подразнить и позлорадствовать. И злорадствуете.
Разные люди часто поступают и мыслят, увы, стереотипно. Например, не читают вопросы тем. Заодно, не читают и объяснений. И пребывают в своих шорах. И часто поддаются на участие в троллинге. Вот, и Ривилис поучаствовал.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 19:28
#75
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Выкладывая код, Вы хорошо знали, что я не смогу его понять и даже запустить. Чтобы подразнить и позлорадствовать. И злорадствуете.
а зачем вы полезли в тему, где подразумевается знание программирования? Так как обычным пользователям доступ к XData закрыт, две стандартные функции в надстройке ET - это просто пощупать XData, а не для реальной работы.
Уже не знаю сколько раз выкладывал ссылки на .Net - сайт Бушмана Андрея, официальный сайт Аутодеска, поиском можно найти и другие источники (в том числе русскоязычные) - с картинками, подробно разжеванной информацией. Про само программирование на .Net тоже русскоязычной информации достаточно помимо сухой справки от Майкрософта. Ну и мой код снабжен очень подробными комментариями.

За те годы, что вы носитесь с этими XData - базовые основы программирования можно было освоить - но это вам не нужно. Вместо этого вы уже очередную статейку накалякали - какие все плохие, один вы несете бескорыстно светлую идею общего формата обмена данными)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 20:01
#76
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
За те годы, что вы носитесь с этими XData - базовые основы программирования можно было освоить - но это вам не нужно. Вместо этого вы уже очередную статейку накалякали - какие все плохие, один вы несете бескорыстно светлую идею общего формата обмена данными)
...И продолжаете.
Если тема возмущает, то достаточно 1-2 постов, выразить свое мнение. Или вообще не писать. Но Вы из 4-х страниц темы написали на две. Лишь полтора сообщения на вопрос темы, а все остальное для увода ее в стороны, стремясь меня задеть, унизить и осмеять.
И какие бы Вы "аргументы" ни изобретали, это не оправдывает троллинг.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 20:05
#77
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.12.2019, 20:21
#78
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,000


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
А зачем? ТС не собирается решать задачу практически, насколько понимаю). Да и нет задачи - потому что для тех же разделов проектирования для каждого из них есть какой-то свой набор сведений, необходимый для работы - и перекликаются с другими лишь частично. И начинать надо с этого - да здравствует стандарт проектирования (предприятия) очередной раз)
Сергей812 вне форума  
 
Непрочитано 29.12.2019, 20:27
#79
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Offtop: Брррр, не начинай снова!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.12.2019, 21:09
#80
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А зачем? ТС не собирается решать задачу практически, насколько понимаю). Да и нет задачи - потому что для тех же разделов проектирования для каждого из них есть какой-то свой набор сведений, необходимый для работы - и перекликаются с другими лишь частично. И начинать надо с этого - да здравствует стандарт проектирования (предприятия) очередной раз)
...И продолжаете.
Вопрос темы очень-очень узкий и очень простой, не требующий ничего, кроме здравого смысла. Но Вы так и пишете, и пишете о чем угодно, но не о нем.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
Тему можно закрыть, поскольку от ответов толку здесь ноль.
Когда я ее начинал, то Вариант 2 был умозрительным. В процессе обнаружил, что AutoCAD его использует вовсю. Как и некоторые разработчики.
Какие-то варианты возникли у меня по ходу темы. Что-то мне прислали извне. Если будут еще решения и примеры, то могут прислать лично.

Кулик Алексей aka kpblc, Троллинг на форуме безнаказан? Здесь образцовый случай.
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 29.12.2019 в 21:15.
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как принято, как лучше описывать Xdata у элементов?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать коэффициенты унификации конструктивных элементов, точности обработки, шероховатости поверхностей Igorek21 Машиностроение 2 09.11.2016 12:32
Как найти уточненные значения жесткостей элементов по СП 52-103-2007? Midimi Железобетонные конструкции 9 30.04.2016 13:43
Описание xdata АлексЮстасу Программирование 68 09.10.2014 11:46
описывать свойства элементов по слою (bylayer) или прямо АлексЮстасу AutoCAD 110 13.03.2010 03:51
Lisp: Список элементов в слоях ALFMario LISP 4 29.04.2008 17:26