Взаимодействие объектов в системе автоматизированного проектирования IndorCAD

Д.А. Петренко, Н.С. Мирза, А.В. Скворцов

ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ В СИСТЕМЕ АВТОМАТИЗИРОВАННОГО ПРОЕКТИРОВАНИЯ МогСАБ

Рассматривается внутренняя архитектура системы автоматизированного проектирования 1п^гСАБ. Описывается два механизма взаимодействия различных объектов проекта 1п^гСАБ с ядром системы. Рассматриваются основные события объектов ядра 1п^гСАБ. Описывается принцип накопления изменений.

В настоящее время как в России, так и во всем мире, повсеместно используются программные продукты, автоматизирующие различные этапы процессов проектирования -системы автоматизированного проектирования (САПР). Исторически сложилось, что термин САПР наиболее часто применяется к программным продуктам, используемым в машиностроительной отрасли (например для проектирования деталей механизмов). Однако термин САПР используется в гораздо более широком смысле этого слова. Системы проектирования объектов транспортного, промышленного и гражданского строительства так же называются САПР. В настоящее время в России существует несколько программных продуктов, позволяющих в той или иной степени решать задачи, возникающие при проектировании таких объектов.

В настоящей работе речь пойдет о системе автоматизированного проектирования объектов транспортного, промышленного и гражданского строительства IndorCAD, разработанной в ООО «ИндорСофт» (г. Томск), и о способах взаимодействия различных объектов проекта IndorCAD с ядром системы. САПР IndorCAD разработана для работы на компьютере под управлением операционной системы Windows NT/2000/XP.

САПР IndorCAD может применяться для проектирования автомобильных и железных дорог, трубопроводов, линий электропередач, генеральных планов застройки территории, открытых карьерных выработок и т. д. Можно сказать, что система IndorCAD ориентирована на проектирование и анализ объектов, расположенных на поверхности земли (автомобильных и железных дорог, генеральных планов застройки), и линейно-протяженных объектов, расположенных в окрестности поверхности земли (трубопроводов, линий электропередач).

Одним из главных понятий, используемых в САПР In-dorCAD, является Проект - совокупность объектов, представляющих конкретный инженерный объект (автомобильная или железная дорога, трасса трубопровода, микрорайон, карьер и т.п.). Проект состоит из одного или нескольких Слоев - совокупностей объектов, имеющих отношение к одной поверхности (существовавшей когда-то, существующей, проектной или иной). Объекты, относящиеся к слою, могут быть различными по типу (точечными, линейнопротяженными, площадными, абстрактными). К точечным объектам относятся, например, съемочные точки поверхности, дорожные знаки, деревья и кустарники, колодцы, опоры линий электропередач и т.д. К линейно-протяженным -структурные линии рельефа, водопропускные трубы, инженерные коммуникации и т.д. К площадным объектам относятся здания, водоемы и др. Абстрактными нематериальными объектами обычно являются объекты, реализующие способ представления поверхности (изолинии, изоконтуры), или вспомогательные объекты (например подписи).

При изменении каких-либо свойств объекта, относящегося к проекту, проект должен как-то реагировать на произошедшие изменения. Например, перерисовать видимую область проектируемого объекта, выставить признак «модифицирован», перестроить поверхность (если объект относится к слою) или выполнить какие-либо другие действия. Поэтому очень важно обеспечить механизм уведомлений об

изменениях «снизу вверх», когда объект Проект уведомляется об изменениях своих подобъектов.

С другой стороны, некоторым объектам может потребоваться, чтобы их информировали о важных событиях, происходящих «выше» по дереву структуры проекта (или о событиях в объектах, находящихся в другой ветви дерева) для выполнения каких-либо действий. Поэтому так же важно обеспечить механизм уведомлений о событиях проекта, слоя и т.д.

В некоторых известных САПР объектов транспортного строительства, промышленного и гражданского строительства проблема реагирования объектов на какие-либо изменения в проекте решена примитивным способом: после любых изменений вызывается метод перерисовки плана, а все остальные действия (перестроение триангуляционной модели поверхности, пересчет изолиний и т.д.) должен вызвать пользователь. Недостатком такого подхода является необходимость помнить пользователю о том, что после выполнения одних действий (например удаления точки), он обязательно должен выполнить еще и другие (вызвать перестроение поверхности и т. д).

Предлагаемые в настоящей работе принципы взаимодействия объектов лишены указанного недостатка и позволяют автоматически выполнять те или иные действия, связанные с изменением данных проекта. САПР ТМогСАБ является открытой для расширения системой, т.е. ее возможности не ограничиваются объектами и функциональностью, заложенными в базовую программу. В системе предусмотрена возможность расширения ее функциональности сторонними разработчиками, используя технологию АсИуеХ. В настоящей работе рассказывается, как реализовано взаимодействие объектов проекта ТМогСАБ с ядром системы независимо от того, являются объекты встроенными в ядро системы или написаны сторонними разработчиками.

СТРУКТУРА ПРОЕКТА ШБОКСАБ

На рис. 1 изображена упрощенная структура проекта 1МогСАЭ. При создании объекта Проект (при загрузке проекта из файла или создание нового) создаются объекты, относящиеся к проекту: список поверхностей, список листов чертежа, а так же ряд других объектов различного назначения, которые присоединяются к проекту по технологии подключения внешних модулей [1]. Так же при создании каждого экземпляра объекта Слой, которых в проекте может быть несколько, ядро системы создает объекты, относящиеся к слою: зеленые насаждения, инженерные коммуникации, водопропускные трубы и другие.

При создании экземпляр внешнего класса получает ссылку на объект-родитель, которым может выступать проект или слой, а так же на проект, к которому относится создаваемый объект. Таким образом, любой объект системы «знает» свой объект-родитель и список своих детей, если они у объекта есть.

Встроенные классы проекта

Список поверхностей

Листы чертежа

Внешние классы проекта

Внешний класс 1

Внешний класс 2

Внешний класс .

Внешний класс N

Слой 1

Лист 1

Объект 1

Встроенные классы слоя

Точки

Линии

Полигоны

Триангуляция

Изолинии

Ъ

Точка 1

=Г

Внешний класс 1

Внешний класс 2

Внешний класс .

Внешний класс N

Рис. 1. Схема проекта ІшіогСАБ

Линия 1

Полигон 1

Внешние классы слоя |

Объект 1

-*-г| №

1 * н

УВЕДОМЛЕНИЯ «СНИЗУ ВВЕРХ»

Изменения, происходящие в объектах, могут оказывать различные влияния на проект в целом. Например, изменение цвета отображения точек должно вызывать перерисовку проекта, но только лишь в том случае, если точки были включены для отображения; так же при этом изменении должен выставиться признак «модифицирован» у проекта. Изменение координат точки, участвующей в формировании поверхности, должно вызывать перестроение триангуляционной модели поверхности слоя, к которому относится точка, выставлять проекту признак «модифицирован» и приводить к перерисовке, если точки отображаются. Ниже приведен перечень возможных уведомлений, о которых могут сообщать объекты слою или проекту в зависимости от того, где существует объект.

- Установить признак «модифицирован». Вызывается при изменении каких-либо свойств объекта.

- Необходимо перерисовать план проекта. Вызывается при изменении свойств объектов, влияющих на отрисовку плана проекта, если объект отображается в плане.

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

- Необходимо перестроить дерево проекта. Некоторые объекты не фигурируют в дереве проекта, пока количество объектов в них равно нулю. Например, зеленые насаждения, относящиеся к слою, не будут отображаться в ветке дерева, относящейся к данному слою, если они не заданы. Объекты, ведущие себя таким образом, должны информировать проект о необходимости перестроить (и соответственно перерисовать) дерево проекта.

- Необходимо обновить информацию о минимальном объемлющем прямоугольнике. Вызывается при изменении минимального объемлющего прямоугольника объекта.

- Необходимо перерисовать сечения (разрезы), относящиеся к проекту. В некоторых случаях изменения свойств объекта (например 2-координаты) не должно приводить к перерисовке плана проекта, но должно привести к перерисовке сечений.

- Необходимо перестроить поверхность (триангуляцию) слоя. Вызывается объектами слоя, участвующими в построении триангуляционной модели рельефа (структурные линии, съемочные точки рельефа и т.п.), при изменении свойств объекта, влияющих на формирование поверхности.

НАКОПЛЕНИЕ ИЗМЕНЕНИЙ В ОБЪЕКТЕ

Если изменение какого-либо свойства объекта вызывало бы немедленное уведомление проекта и выполнялись бы соответствующие действия, работа с САПР была бы практически невозможна. Предположим, мы хотим изменить плановые координаты (X, У) нескольким точкам, участвующим в формировании модели рельефа какой-либо поверхности, сместив их в некотором направлении. Для этого в цикле последовательно для каждой точки выполняем действия: Изменить Х-координату, Изменить У-координату. Но изменение Х-координаты точки должно повлечь перестроение поверхности, о чем точка как объект, относящийся к слою, должна проинформировать слой, в котором она существует, и поверхность слоя должна перестроиться. Затем изменяется У-координата точки, о чем вновь уведомляется слой, и поверхность перестраивается уже второй раз. Далее мы изменяем координаты остальных точек, дважды перестраивая поверхность для каждой из них. Очевидно, что такой подход на практике неприемлем.

Если иметь возможность сообщить слою (для приведенного примера) о том, что начинается серия изменений, затем провести изменения всех точек, а только потом информировать слой о завершении изменений, можно значительно ускорить работу системы.

В системе автоматизированного проектирования 1МогСАБ каждый объект имеет методы, позволяющие объединять серию последовательных изменений

объекта в группу: BeginUpdate и EndUpdate. Методы парные, т.е. для каждого вызова BeginUpdate должен быть парный вызов EndUpdate. Система допускает вложенное использование этих методов.

При вызове метода BeginUpdate объект увеличивает внутренний счетчик FUpdateCount, который равен нулю в нормальном состоянии объекта и имеет некоторое положительное значение при изменении объекта. При изменении какого-либо свойства объекта вызывается метод Changed(...), которому передается комбинация флагов, описывающая, о каких изменениях необходимо уведомить объект, находящийся выше в дереве структуры проекта. При вызове EndUpdate объект уменьшает счетчик FUpdateCount и, если он стал равен нулю, вызывает Changed(...) без флагов.

Метод Changed аккумулирует флаги, пришедшие параметром с уже накопленными флагами, и, если внутренний счетчик равен нулю и комбинация накопленных флагов не пуста, вызывает виртуальный метод

ChangesAnalyzer, в котором объект может проанализировать накопленные флаги. При анализе флагов объект может выполнить какие-либо действия и передать изменения объекту-родителю, вызвав у него метод Changed и передав ему все или часть накопленных флагов. После вызова ChangesAnalyzer все флаги накопленных изменений сбрасываются.

В свою очередь, объект-родитель, при счетчике FUpdateCount, равном нулю, передаст эти изменения своему родителю и т.д., пока изменения не дойдут до объекта Проект, который в методе ChangesAnalyzer вызовет, в случае необходимости, перерисовку плана, сечений, установит признак «модифицирован» и т.д. Если набор флагов изменений проходит по дереву структуры проекта к корню через объект Слой, то слой может, при необходимости, принять решение о том, что необходимо перестроить триангуляционную модель поверхности. Пример таких изменений приведен на рис. 2.

Действия объекта

Изменить объемлющий прямоугольник

Перерисовать план

Уведомить об изменении проекта

Перестроить модель рельефа Уведомить об изменении поверохности

Изменить объемлющий прямоугольник

Действия над объектом \

BeginUpdate

X:=X+dX

Y:=Y+dY

EndUpdate

Проект IndorCAD

Z

Список поверхностей

Z

Поверхность

Z

Список точек

Z

Точка

Передаваемые флаги

Изменился объемлющий прямоугольник Перерисовать план Проект модифицирован

Изменился объемлющий прямоугольник Перерисовать план

Проект модифицирован_________________

Необходимо перестроить поверхность Изменился объемлющий прямоугольник Перерисовать план

Проект модифицирован_________________

Необходимо перестроить поверхность Изменились координаты Проект модифицирован

Рис. 2. Уведомления снизу - вверх

УВЕДОМЛЕНИЯ ЧЕРЕЗ СОБЫТИЯ

Изменение в проекте или в слое могут в некоторых случаях так же оказывать какое-либо действие на объекты, принадлежащие проекту. Пусть, например, в слое заданы инженерные коммуникации [2], у которых 2-координата определена относительно поверхности (трубопровод, проходящий на глубине 2 м). Тогда в случае перестроения поверхности необходимо заново вычислить 2-координаты узлов коммуникации, если триангуляционная модель рельефа изменилась [3].

Или, например, была построена разность поверхностей между слоями «Слой 1» и «Слой 2». Тогда разность поверхностей должна быть уничтожена, если какой-либо из образующих ее слоев удаляется пользователем, и перестроена, если изменилась какая-либо из образующих эту разность поверхностей модель рельефа.

Для подобных случаев предусмотрены уведомления через механизм подписки на события объекта. События генерируются базовыми объектами, расположенными в ядре системы IndorCAD. В основном используются события следующих объектов ядра системы: Приложение (Application), Проект (Project), Слой (Layer), Трассы (Routes). Объект Трассы присутствует только в системе автоматизированного проектирования автомобильных дорог IndorCAD/Road [4], и его рассмотрение выходит за рамки настоящей работы.

Для подписки на события какого-либо объекта ядра необходимо вызывать у этого объекта специальный метод Advise, передав в качестве параметра специальный интерфейс объекта, который будет обрабатывать события объекта ядра. При подписке объект ядра возвращает некоторое число - идентификатор подписки, по которому в последствии можно отписаться от получения событий объекта ядра с помощью метода Unadvise.

Рассмотрим основные события объектов ядра, которые доступны в системе IndorCAD.

События объекта Application:

- procedure ProjectCreate(const Project: IProject; CreatedAsNew: WordBool) - событие вызывается при создании экземпляра класса Проект. При этом созданный проект передается параметром, а переменная CreatedAsNew показывает, создан ли экземпляр проекта как новый проект (True) или же для загрузки уже существующего проекта из файла (False);

- procedure ProjectActivated

- событие вызывается при смене активного проекта. Поскольку САПР IndorCAD позволяет работать одновременно с несколькими проектами, данное событие позволяет отследить момент переключения между проектами. Если закрывается единственный активный проект, то событие вызывается с параметром NULL;

- procedure Idle(var Done: WordBool) - событие вызывается, когда у системы появляется свободное (не занятое процессором) время. Некоторые объекты могут, обрабатывая это событие, фоном выполнять какие-либо вычисления. Обработчик этого события должен возвратить в переменной Done False, если требуется еще квант времени для выполнения каких-либо фоновых действий.

События объекта Project:

- procedure DeleteLayerConfirmation(const Layer: ILayer; out CanDelete: WordBool) - вызывается как подтверждение перед удалением слоя из проекта. Если объект, обрабатывающий событие, возвратит Can-Delete=False, то слой не будет удален;

- procedure DeletingLayer(const Layer: ILayer) - событие вызывается непосредственно перед удалением слоя из проекта;

- procedure ProjectLoaded(const Project: IProject) -вызывается непосредственно после того, как все объекты проекта полностью загрузились из файла;

- procedure ProjectDestroying

- вызывается при закрытии проекта. Обычно при обработке этого события объекты отписываются от всех подписанных ранее событий;

- procedure ProjectSaving(const Project: IProject) -вызывается непосредственно перед сохранением проекта в файл;

- procedure ProjectSaved(const Project: IProject) -вызывается непосредственно после сохранения проекта в файл;

- procedure ProjectOptionsChanged(const Project: IProject) - вызывается при изменении настроек проекта;

- procedure ProjectModified

- вызывается при любом изменении проекта;

- procedure ImportFinished(const Project: IProject) -вызывается по окончании импорта данных из какой-либо другой программы. При этом объекты могут проанализировать импортированные данные и выполнить какие-либо действия.

События объекта Layer:

- procedure DeletingPoint(const Point: ILayerPoint; Index: Integer) - вызывается непосредственно перед удалением точки поверхности;

- procedure SurfaceInvalidated(const Layer: ILayer) -вызывается в случае необходимости перестроения триангуляционной модели рельефа данного слоя;

- procedure LayerCreated(const Layer: ILayer;

CreatedAsNew: WordBool) - вызывается по завершении создания всех объектов слоя. CreatedAsNew показывает, создан ли слой в составе нового проекта (True) или же при загрузке уже существующего проекта из файла (False).

ЗАКЛЮЧЕНИЕ

Реализованные в САПР IndorCAD принципы взаимодействия объектов позволяют разработчикам дополнительных модулей получать уведомления от различных объектов системы, а также уведомлять их об изменениях, происходящих в объектах этих модулей. Вся система IndorCAD работает по описанным в настоящей работе принципам. На базе ядра IndorCAD реализовано несколько промышленных систем автоматизированного проектирования, успешно эксплуатирующихся в России и странах СНГ.

ЛИТЕРАТУРА

1. Петренко Д.А., Снежко В.В. Технология подключения внешних модулей к системе автоматизированного проектирования IndorCAD // Информационные системы. Вып. 3: Тр. Постоянно действующей научно-технической школы-семинара студентов, аспирантов и молодых специалистов «Информационные системы мониторинга окружающей среды» сент. - окт. 2004 г. Томск : Изд-во Том. гос. ун-та систем управления и радиоэлектроники, 2004. С. 70 - 77.

2. Снежко В.В., Петренко Д.А. Разработка модуля инженерных коммуникаций в САПР // Материалы XLII Междунар. студенч. конф. «Студент и научно-технический прогресс». Информационные технологии. 2004. С. 8 - 9.

3. Петренко Д.А., Скворцов А.В., Куленов Р.О. Сравнение триангуляций с помощью хеш-функций // Вестник ТГУ. 2003. № 280. С. 306 -309.

4. Бойков В.Н., Петренко Д.А., Люст С.Р., Скворцов А.В. Система автоматизированного проектирования автомобильных дорог IndorCAD/ Road // Вестник ТГУ. 2003. № 280. С. 350 - 353.

Статья представлена кафедрой теоретических основ информатики факультета информатики Томского государственного университета, поступила в научную редакцию «Информатика» 18 мая 2005 года.