Инструменты пользователя

Инструменты сайта


Боковая панель

developers:tutorial:createmodel

Это старая версия документа.


Создание и сохранение модели

Каждая модель данных в комплексе Топоматик Робур располагается в рамках отдельного файла, включенного в состав проекта. С программной точки зрения модель представляет собой экземпляр класса, реализующий интерфейс IProjectModel. Основные методы этого интерфейса это:

  • LockWrite() - блокирует модель для начала редактирования данных
  • UnockWrite() - разблокирует модель после окончания редактирования данных
  • LockRead() - возвращает экземпляр класса, реализующий структуру данных конкретной модели

Для чтения данных из модели используется метод LockRead(). Если данные модели необходимо изменить, то перед вызовом LockRead() необходимо вызвать LockWrite(), а после UnockWrite().

После вызова метода LockWrite() файл модели становится недоступным для редактирования другими пользователями до того момента, пока не будет вызван метод UnockWrite().

Для подключения собственной модели к комплексу, необходимо выполнить следующие действия:

  • Создать класс модели, реализующий интерфейс IStateController, это необходимо для того чтобы была возможность определять состояние модели и была ли она изменена.
  • Создать класс редактора модели, наследник от ModelEditor, предназначенный для реализации загрузки, сохранения и открытия модели
  • Написать метод, который возвращает экземпляр наследника от ModelEditor и декорировать его атрибутом «cmd»
  • В классе, наследнике от PluginInitializator необходимо перекрыть метод Initialize и зарегестрировать модель, используя метод RegisterModelEditor класса PluginFactory
  • В файле *.plugin в секции cores описать вид модели в структуре проекта, а в секции coreitems включить модель в состав стандартного проекта.
Большая часть методов интерфейса IStateController реализована в классе StateControllerObject. Редактор модели на видовом экране окна план и других системных окон нужно наследовать от PlanModelEditor. Редактор модели в отдельном окне нужно наследовать от DocumentModelEditor

Для реализации сохранения и загрузки в программном комплексе Топоматик Робур используется сборка Topomatic.Stg.dll. За сохранение отвечает интерфейс IStgSerializable, который состоит из двух методов - LoadFromStg для загрузки и SaveToStg для сохранения. Оба метода в качестве параметра принимают экземпляр класса StgNode. Методы этого класса позволяют сохранить в узел и загрузить из узла все базовые типы данных, а также дополнительные узлы StgNode и массивы элементов, используя именованные элементы. Кроме того у каждого метода есть перекрытое значение, со значением по умолчанию. Значение по умолчанию будет использовано в том случае, если в загружаемом файле нет такого именованного элемента. Например:

{
    ....
    private double m_Value1 = 0.0;
 
    private string m_Value2 = 0.0;
 
    void LoadFromStg(StgNode node)
    {
         //Если в сохраненном файле нет значения с ключом Value1 будет брошено исключение
         m_Value1 = node.GetDouble("Value1");
         //Если в сохраненном файле нет значения с ключом Value2, 
         //то переменной m_Value2 будет присвоено значение "defaultValue"
         m_Value2 = node.GetString("Value2", "defaultValue");
    }
    ...
}

Использование именованных элементов позволяет легко расширять и дополнять функции загрузки и сохранения по мере расширения модели данных.

Если в сохраненном файле отсутствует вложенный узел StgNode или массив, то функции GetNode и GetArray вернут пустые элементы. Проверить наличие именованного значения внутри узла позволяет метод IsExists

Создайте и настройте новый модуль для подключения к программному комплексу Топоматик Робур.

С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки:

Создайте новый класс Model.cs для реализации нашей модели.

{
    //Класс реализующий структуру данных нашей модели
    //для поддержки интерфейса IStateController наследуем от StateControllerObject
    class Model : StateControllerObject, IStgSerializable
    {
        private bool m_ReadOnly = false;
 
        //Строковое значение
        public string StringValue = "Строка";
 
        //Булево значение
        public bool BooleanValue = false;
 
        //Значение с плавающей точкой
        public double DoubleValue = 10.5;
 
        //Целое значение
        public int IntValue = 10;
 
        //Список строковых значений
        public List<string> ArrayValues = new List<string>();
 
        //флаг только для чтения
        public override bool ReadOnly
        {
            get
            {
                return m_ReadOnly;
            }
 
            set
            {
                m_ReadOnly = value;
            }
        }
 
        //Загрузка из узла
        public void LoadFromStg(StgNode node)
        {
            //Все значения загружаем с указанием значения по умолчанию
            BooleanValue = node.GetBoolean("BooleanValue", false);
            StringValue = node.GetString("StringValue", "Строка");
            DoubleValue = node.GetDouble("DoubleValue", 10.5);
            IntValue = node.GetInt32("IntValue", 10);
            ArrayValues.Clear();
            //При загрузке массива указывается тип составляющих массив значений
            var array = node.GetArray("ArrayValues", StgType.String);
            for (int i = 0; i < array.Count; i++)
            {
                ArrayValues.Add(array.GetString(i));
            }
        }
 
        //Сохранение в узел
        public void SaveToStg(StgNode node)
        {
            //Сохраняем значения в узел
            node.AddBoolean("BooleanValue", BooleanValue);
            node.AddString("StringValue", StringValue);
            node.AddDouble("DoubleValue", DoubleValue);
            node.AddInt32("IntValue", IntValue);
            //Сохраняем массив с указанием типа значений
            var array = node.AddArray("ArrayValues", StgType.String);
            for (int i = 0; i < ArrayValues.Count; i++)
            {
                array.AddString(ArrayValues[i]);
            }
        }
    }
}
developers/tutorial/createmodel.1550360396.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)