Разработка базы данных 3D-объектов системы проектирования интерьеров

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    275,46 Кб
  • Опубликовано:
    2013-03-06
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка базы данных 3D-объектов системы проектирования интерьеров

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение высшего профессионального образования «Московский государственный институт

электроники и математики»

(технический университет)

Кафедра "Вычислительная техника"


алгоритм трехмерный визуализация атрибут

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к дипломному проекту

На тему «Разработка базы данных 3D-объектов системы проектирования интерьеров»


Студент Акимов Алексей Сергеевич

Руководитель дипломного проекта

Зыков Адольф Константинович






Москва 2009 г.

Аннотация

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

Характеристики дипломного проекта:

Объем составляет 132 страницы.

Количество графических материалов составляет 7 листов.

Количество литературных источников составляет 12 позиций.

Оглавление

1. Введение

2. Специальная часть

2.1 Обзор предметной области

2.2 Аналитический обзор аналогичных систем

2.2.1 Arcon Eleco

2.2.2 Autodesk 3ds Max 9

2.2.4 Программа Базис-Мебельщик

2.3 Требования к проекту

2.4 Структура системы

2.4.1 Блок подпрограмм по организации пользовательского интерфейса

2.4.2 Блок подпрограмм по организации работы с двухмерными объектами

2.4.3 Блок подпрограмм по организации работы с базами данных

2.4.4 Блок подпрограмм по организации трехмерной визуализации

2.5 Алгоритм трехмерной визуализации

2.5.1 Этап выбора объекта

2.5.2 Алгоритм создания объекта

2.5.3 Создание файла формата *.x3d

2.5.4 Запись в файл *.x3d

2.6 Алгоритм работы с базами данных

2.6.1 Классы разбора таблицы XML по элементам и атрибутам

2.6.2 Универсальная подпрограмма по записи элементов и атрибутов из таблицы XML в различные массивы, в зависимости от раздела

2.6.3 Подпрограммы частичного вывода элементов из таблицы XML на экран в зависимости от раздела

2.7 Алгоритмы работы с двухмерными объектами

2.7.1 Алгоритм по созданию точки в рабочей области

2.7.2 Алгоритм по перемещению точки по рабочей области

2.7.3 Подпрограммы по созданию и перерисовке линий между точками

2.7.4 Подпрограмма по выделению объекта на рабочей области

2.7.5 Подпрограммы по перемещению объектов по рабочему полю

2.7.6 Подпрограммы по повороту объектов

2.7.7 Алгоритм очистки рабочего поля

2.7.8 Подпрограмма удаления выбранного объекта

2.8 Оценка эффективности системы

3. Экологическая часть и безопасность жизнедеятельности

3.1 Исследование воздействия опасных и вредных факторов при эксплуатации ЭВМ и их воздействие на организм человека

3.2 Способы защиты пользователей от опасных и вредных факторов

3.2.1 Электрическая безопасность

3.2.2 Пожарная безопасность

3.2.3 Предельно допустимые значения излучений

3.3 Эргономические требования к рабочему месту

4. Заключение

4.1 Анализ существующих систем

4.2 Обеспечение согласования форматов обмена данными между интерактивным интерфейсом и трехмерными объектами

4.3 Возможность добавления объектов

4.4 Функция трехмерной визуализации

5. Приложение 1. Текст программы

5.1 Блок объявления переменных

5.2 Блок синтаксического анализатора базы данных

5.3 Блок основной программы

6. Приложение 2. Руководство оператора

6.1 Аннотация

6.2 Назначение программы

6.3 Условия выполнения программы

6.3.1 Минимальный состав технических средств

6.3.2 Минимальный состав программных средств

6.4 Выполнение программы

6.4.1 Загрузка и запуск программы

6.4.2 Выполнение программы

6.4.3 Завершение работы программы

7. Список используемой литературы

1. Введение

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

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

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

Это и определило мой выбор в сторону создания веб-ресурса, направленного в помощь людям скованным рамками времени, создания ресурса помогающего определиться в дизайне интерьера. Данный ресурс позволит сократить время, затраченное на решение данного вопроса, будет абсолютно интерактивным и, что самое главное, удаленным.

Передо мной стала задача разработать механизм преобразования двумерных изображений в трехмерные объекты. Было принято решение использовать специализированный язык програмирования для создания трехмерных объектов, который по синтаксису и организации кода схож с используемой базой данных.

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

Преимуществом выбранного языка является его поддержка средой создания флеш-приложений. Данный формат широко распространен в интернет, что позволяет легко интегрировать его в веб-сайт.

2. Специальная часть

.1 Обзор предметной области

Современный мир оставляет людям мало места для самовыражения, основная часть продукции выпускается не оригинальной, а массовой, потому и недорогой. Желание сделать своё жилище уникальным свойственно человеческой натуре, и потому дизайн интерьеров является довольно востребованной областью. Но довериться в этом вопросе сможет не каждый человек, да и не каждому это по карману.

Желание сделать всё самому у потребителей было всегда, только вот возможностей не было. Данная возможность появилась при появлении специализированных программных продуктов, посвященных данной тематике. Существует множество подобных программ, которые отличаются друг от друга предоставляемыми возможностями, системными требованиями, или попросту, дизайном интерфейса. Все они нацелены на выполнение главной задачи, а именно:

помочь пользователю в создании собственного дизайна интерьера

сделать процесс разработки быстрее и проще

Большая часть программ которые существуют на данный момент, локального метода использования. Требующие установки на компьютер для начала работы с ними. Что соответственно не всегда возможно реализовать.

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

2.2 Аналитический обзор аналогичных систем

В данный момент существует множество подобных систем. Проведем аналитический обзор их возможностей.

.2.1 Arcon Eleco

Новая версия программы Arcon Eleco +2007 Professional (Аркон Элеко 2007) предназначена для профессионального дизайна, проектирования и трехмерной визуализации. Программа позволяет сначала создать детально проработанный план помещения, а потом увидеть созданное помещение в объемном изображении. Это позволяет более наглядно обсуждать архитектурные идеи со своими коллегами, а также более эффективно общаться с клиентами.

В отличие от других программ, программа Аркон разрабатывалась именно для архитекторов для решения вопросов, связанных с созданием интерьеров различной степени сложности. На сегодняшний день в Европе Аркон используют более 20 000 профессиональных пользователей, большая часть из них - это профессиональные архитекторы и дизайнеры.

В режиме конструирования Вы можете оперативно создать 2D планы. При помощи простого перетаскивания мышкой создаются и размещаются Стены, Двери, Окна и другие элементы.

В программе Аркон можно создать дизайн спроектированного помещения, поработать с отдельно взятыми элементами и нанести надписи и размеры на плане. Спроектированное помещение можно посмотреть в высококачественном 3D изображении и осуществить виртуальную прогулку по созданному проекту.

В проекте можно использовать текстуры и предметы интерьера из библиотеки. Библиотека содержит более 1300 различных текстур и более 3000 объектов интерьера. Имеется возможность просмотреть созданные интерьеры и экстерьеры с фотореалистичным качеством.

Аркон позволяет увидеть тени от освещения. Программа поддерживает слудующие форматы: для импорта - DXF, DWG, HPG, PLT и 3DS; для экспорта - файлы в форматах DXF, 3D DXF, VRML, 3DS, ArCon object, O2C, MBA, ArCon Render студия, HPGL, EWM и PCF.

Возможности программы "Аркон"

Конструирование:

профессиональный дизайн и проектирование интерьеров

проектирование лестниц

проектирование подвесных потолков

расчет теней и освещения (высококачественный рендер)

стены с закруглениями

виртуальные стены (невидимые)

верхние/нижние балки

колонны/опоры

дизайн корпусной мебели

Ландшафт:

установка различных высот и наклонов местности

ландшафтный дизайн и проектирование зимних садов

Просмотр:

D/3D

произвольное перемещение в 3D

понорамные презентации

Импорт/Экспорт:, DWG, HPG, PLT, 3D DXF, VRML, 3DS, ArCon object, O2C, MBA, ArCon Render студия, HPGL, EWM и PCF

создание видео в формате AVI

поддержка o2c объектов

сохранение фотореалистичных картинок с лучевой трассировкой

экспорт o2c объектов

.2.2 Autodesk 3ds Max 93ds Max 9

Одним из самых мощных, на сегодняшний день, инструментов, предназначенных для трехмерной визуализации, является 3ds Max 9.

Совместимость 3ds Max 9 с новейшей 64-битной технологией позволяет пользователям иметь доступ к расширенной памяти. В идеале, это означает еще и значительно ускоренную производительность. Преимущества 64-битной технологии становятся очевиднее при работе с очень большими наборами данных или сложной анимацией. Другими словами, разницу заметят те, кто работает с десятками миллионов многоугольников.оптимизировала параметры оконного интерфейса под DirectX, что, в отличие от 64-битного обновления, уже видно сразу. Компания не только значительно улучшила отображение контуров окон, прямых и кривых линий, но также добавила новую возможность просмотра скрытых линий. Кроме того, компания обещает более быстрое взаимодействие. Однако, если вы предпочитаете пользоваться OpenGL, вам не повезло - увеличение скоростных характеристик возможно только с DirectX. Bitmap Proxy - это еще один заметный шаг вперед; с его помощью изображения с высоким разрешением подкачиваются на прокси-серверы с низким разрешением, при этом повышается скорость отображения и улучшается производительность в целом.

Многослойная анимация и характерные опции

ds Max уже признанно стала любимой программой по работе с анимацией и в версии 9 усиливает эту тенденцию, предоставляя улучшенные характерные опции и возможность работать с многослойной анимацией. Будучи схожими по концепции со слоями дисплея, анимационные слои упорядочивают анимационные данные так, что пользователи получают быстрый доступ к различным типам анимации. Вы можете создать дополнительные слои, включив организацию базовых типов анимации. Это реально экономит время, а, кроме того, является одним из лучших инструментов в данной версии.наладила Character Studio (функцию, появившуюся в 3ds Max версии 7), что улучшает работу при анимации «двуногих». Новые отдельные модели для пальцев на руках и ногах открывают аниматорам новые возможности, которые помогают в создании более естественной анимации. Новая опция гибкости двуногих позволяет частям изображения двигаться вдоль друг друга и создает рамки негативов. При анимации двуногих также имеются опции настройки внешности и важная опция истории произведенных действий.

Когда речь идет о сфере моделировании, то 3ds Max, по общему признанию, является одним из лидеров, хотя она и не самая, так скажем, «интуитивная». К счастью, я заметил видимые улучшения при работе с более мощным программным обеспечением. Также я заметил более быстрое редактирование второстепенных объектов при работе с трудоемкими моделями. Функция Booleans улучшает создание выстрелов и промахов, а ProBooleans улучшает шансы, предсказуемо создавая качественные ячейки. ProCutter - это отличное добавление для разборки моделей на части (особенно при создании взрывов) или, наоборот, для анимации соединяющихся воедино кусочков. Возможности бесконечны.

Модуль Hair («Волосы»), который появился в версии 8, сейчас стал частью интерфейса 3ds Max, поэтому можно создать стиль волос при помощи стандартных инструментов. К счастью, в Autodesk улучшили общее качество отображения волос и скорость передачи. Завершает новинки в моделировании улучшенное качество создания одежды, которое позволяет пользователям редактировать, не прибегая к моделированию, а также закрашивать деформации, что сейчас весьма ценно.

Хотя Autodesk значительно улучшила набор моделирующих инструментов в 3ds Max, в ней все еще недостает некоторых усовершенствованных инструментов, таких как продвинутое моделирование углов, которое есть в других приложениях. Не смотря на критику, при помощи 3ds Max возможно смоделировать любой вообразимый предмет.

Обзор Mental Ray

Воспроизведение в 3ds Max 9 также улучшено, благодаря обновлению mental ray 3.5. Теперь вы можете выбрать из множества новых фактур. Некоторые из них включают новые оттенки цвета для автомобилей и набор под названием "Архитектурные и композиционные фактуры", созданный с целью создания архитектурной визуализации (их можно использовать для различных целей). Некоторые опции создания фактур значительно экономят время, например, Ambient Occlusion, который имитирует графический изоморфизм (GI), а также округленные или скошенные края.

В интерфейсе mental ray помимо добавления новых опций для создания фактур также произошло значительное упрощение. Например, теперь вы можете видеть диалоговое окно Final Gather, пока идет процесс воспроизведения, что позволяет быстрее решать проблемы. Я был особенно поражен новой поддержкой mental ray для 3ds Maxs Sun and Sky system (система солнца и неба), которая показала фантастические результаты при затрате меньших усилий. А также обычно требующие много времени опции GI были объединены в одну модель отражения света, что ускорило работу.

В целом, главные улучшения в 3ds Max 9 - это увеличенная производительность и 64-битная совместимость. И только эти характеристики уже стоят того, чтобы увеличить цену. Но если вы также рассчитываете на лучшую анимацию и моделирование, обновление Mental Ray 3.5 и улучшения в линейке, управлении ресурсами и файловой совместимости, вы не ошибетесь, выбрав 3ds Max 9.

Спецификации

Программное обеспечение: требования для 32-битной операционной системы: Microsoft Windows XP Professional (рекомендован Service Pack 2 или выше) или Microsoft Windows 2000 Professional (Service Pack 4); требования для 64-битной операционной системы: Microsoft Windows XP Professional x64; требования для веб-браузера: Microsoft Internet Explorer 6 или выше; дополнительное программное обеспечение: DirectX 9.0c (обязательно), OpenGL (по выбору).

Аппаратное обеспечение: минимальные требования для 32-битной версии: Intel Pentium IV или AMD Athlon XP или более мощный процессор, 512 MB RAM (рекомендовано 1 GB), 500 MB свободного места (рекомендовано 2 GB), аппаратно-ускоренная поддержка OpenGL и Direct3D, поддерживающее Microsoft Windows координатно-указательное устройство (оптимизированное для Microsoft IntelliMouse), привод DVD-ROM.

Минимальные требования для 64-битной версии: Intel EM64T, AMD Athlon 64 или выше, процессор AMD Opteron; 1 GB RAM (рекомендовано 4 GB); 500 MB свободного места (рекомендовано 2 GB); аппаратно-ускоренная поддержка OpenGL и Direct3D; поддерживающее Microsoft Windows координатно-указательное устройство (оптимизированное для Microsoft IntelliMouse); привод DVD-ROM.

.2.3 Программа Наш Сад - ландшафтный дизайн

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

. Качественная визуализация

. Калькулятор сметы

. Редактор ресурсов

. Лестницы

. Видео-презентации

. Редактор сезонных фотографий и текстур

. Редактор малых архитектурных форм

. Мощение

. Более 1000 3D-объектов и 3D-растений

. Создание и импорт 3D-моделей

. Редактор профилей

. Чертежные элементы

. Заборы

. Приподнятые поверхности

. Более 15 тыс. растений и более 26 тыс. их фотографий

. Совместим с Windows Vista

Стандартные системные требования Наш Сад 9.0 Рубин:

Операционная система Microsoft Windows XP, Windows Vista (программа не совместима с Windows XP x64);

Microsoft Internet Explorer 5.01 или более новый;

Процессор Pentium 4 (2GHz и выше);

Оперативная память RAM 512 MB (рекомендуется 1 GB или более);

Свободное место на жестком диске: 4 GB;

Видеокарта с 3D-ускорителем 128 MB RAM, драйвер с поддержкой OpenGL. Для сложной 3D графики нужна поддержка OpenGL 2.0 со стороны видеокарты и драйвера;

Монитор с установленным режимом 1024x768 16 млн цветов (24 или 32 бита на цвет); привод;

Разработчик: российская компания "ГеоС" (гарантированная техническая поддержка для зарегистрированных пользователей).

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

Довольно серьезные системные требования;

Сложный интерфейс;

Отсутствие возможности удаленной работы

.2.4 Программа Базис-Мебельщик

Комплексная автоматизация мебельного производства: проектирование мебели, дизайн мебели, а также программа раскроя

Базис-Мебельщик - это система, имеющая гибкую модульную структуру и предназначенная для автоматизации всех подразделений мебельного предприятия - конструкторского, производственного, экономического и торгового. Срок окупаемости системы на большинстве предприятий составляет от трех до девяти месяцев.

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

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

Система Базис-Конструктор-Мебельщик находится на рынке уже более пяти лет, а ее прототип - система Базис-Конструктор - более пятнадцати.

У разработчика создана многоступенчатая сервисная служба, включающая в себя консультации по телефону и электронной почте, обучение, как на территории разработчика, так и на территории пользователя, региональные семинары. В настоящее время функционируют более десяти дилерских центров в России, Украине, Казахстане и других государствах, и их количество постоянно растет, как и количество пользователей системы. Таким образом, система Базис-Конструктор-Мебельщик служит хорошей основой реальной автоматизации мебельных предприятий.

Официальный представитель: компания ГрандСофт (Россия)

2.3 Требования к проекту

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

Основное требование, чтобы разрабатываемая система поддерживала идею трехмерной визуализации, что в свою очередь даст пользователю возможность увидеть более точный результат проектирования, близкий к реальности.

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

Проэкт должен обеспечивать согласование форматов обмена данными между интерактивным интерфейсом и трехмерными объектами.

.4 Структура системы

Данная система включает в себя множество подпрограмм, которые имеют различное предназначение. Различаются они как по исходным данным, так и по возможности их применения. Все эти подпрограммы можно объединить в несколько групп:

Подпрограммы по организации работы с двухмерными объектами

Подпрограммы по организации работы с базами данных

Подпрограммы по организации трехмерной визуализации

Подпрограммы по организации пользовательского интерфейса

От действий пользователя напрямую зависит работы системы. Система управляется путём визуального интерфейса, с помощью запуска той или иной программы.

.4.1 Блок подпрограмм по организации пользовательского интерфейса

Блок подпрограмм по организации пользовательского интерфейса включает в себя:

Подпрограмма по рисованию сетки (рабочей области)

Алгоритм, отвечающий за распознавание положения указателя мыши

Алгоритм, отвечающий за нажатие на определенный пункт меню или элемент

Подпрограмма по выводу пунктов меню на экран

.4.2 Блок подпрограмм по организации работы с двухмерными объектами

Блок подпрограмм по организации работы с двухмерными объектами включает в себя несколько подпрограмм, таких как:

Алгоритм по созданию точки в рабочей области

Алгоритм по перемещению точки по рабочей области

Подпрограммы по созданию и перерисовке линий между точками

Подпрограмма по выделению объекта на рабочей области

Подпрограммы по перемещению объектов по рабочему полю

Подпрограммы по повороту объектов

Алгоритм очистки рабочего поля

Подпрограмма удаления выбранного объекта

.4.3 Блок подпрограмм по организации работы с базами данных

Этот блок включает в себя следующие подпрограммы:

Классы разбора таблицы XML по элементам и атрибутам

Универсальная подпрограмма по записи элементов и атрибутов из таблицы XML в различные массивы, в зависимости от раздела

Подпрограммы частичного вывода элементов из таблицы XML на экран в зависимости от раздела

.4.4 Блок подпрограмм по организации трехмерной визуализации

Данный блок включает в себя следующие подпрограммы и алгоритмы:

Этап выбора объекта

Алгоритм создания объекта

Создание файла формата *.x3d

Запись в файл *.x3d

.5 Алгоритм трехмерной визуализации

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

Трехмерная визуализация может быть реализована несколькими способами.

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

Еще одним способом организации трехмерной визуализации является создание объектов программным путем, то есть непосредственно создание объекта в процессе работы программы. Объект может быть создан на стороне клиента, при локальной работе с программным продуктом. Также объект может быть создан на стороне сервера, при работе с удаленным программным продуктом. При создании объекта на стороне клиента, на его компьютер налагаются определенные требования по производительности. При создании объектов на стороне сервера, накладываются требования на пропускную способность принимающего интернет канала.

В данной работе используется новый метод трехмерной визуализации. Для реализации данного метода был выбран специализированный язык описания трехмерных объектов X3D (eXtensible 3D). Данный язык имеет несколько отличительных особенностей:

Возможность создавать сложные объекты

Работа с полигонами и двумерными объектами

Работа с текстом

Работа с текстурами

Создание освещения и анимации

Очень маленький объем (размер в мегабайтах) создаваемых объектов

Главной особенностью используемого языка является синтаксис. Синтаксис языка X3D схож с синтаксисом распространенного формата для хранения структурированных данных XML (eXtensible Markup Language).

В данном методе трехмерные объекты создаются заранее. Эти объекты и являются исходными данными алгоритма.

Алгоритм трехмерной визуализации делиться на несколько этапов, или процедур.

2.5.1 Этап выбора объекта

function createobj (arr_visible_w_in:Array, arr_visible_h_in:Array) : Void {.clear();w_in = arr_visible_w_in[select_number];h_in = arr_visible_h_in[select_number];.beginFill(0x00FF00);.moveTo(0, 0);.lineTo(w_in, 0);.lineTo(w_in, h_in);.lineTo(0, h_in);.lineTo(0, 0);.endFill();_obj = true;._x = _xmouse;._y = _ymouse;

tempobj.startDrag();

};

Исходными данными на данном этапе являются:

Массив arr_visible_w_in - массив данных, который содержит числовые значения ширины выбранного элемента.

Массив arr_visible_h_in - массив данных, который содержит числовые значения длинны выбранного элемента.

Объект tempobj - объект типа MovieClip

Переменная select_number - переменная, содержащая числовое значение номера выбранного объекта.

Далее в объекте tempobj создается графический двумерный объект, по размерам, полученным из исходных данных (из элементов исходных массивов выбранного номера).

Логической переменной create_obj присваивается значение true, что обеспечит дальнейшую работу алгоритма.

Координаты объекта tempobj приравниваются к координатам мыши, и применяется функция startDrag(); (Функция startDrag() вызывает зрительное перемещение объекта за курсором мыши по экрану).

.5.2 Алгоритм создания объекта

if ((x <= max_wallcoordx)&&(x>=min_wallcoordx)&&(y >= min_wallcoordy)&&(y <= max_wallcoordy)&&(create_obj)) {.stopDrag();_on_pole += 1;.duplicateMovieClip("obj" + obj_on_pole, 30 + obj_on_pole);.clear();_category[obj_on_pole] = category;_obj_num[obj_on_pole] = arr_visible_i[select_number];_obj_x[obj_on_pole] = (_root["obj" + obj_on_pole]._x)/10 - wmin/10 - center_pole_x;_obj_y[obj_on_pole] = (_root["obj" + obj_on_pole]._y)/10 - hmin/10 - center_pole_y;_obj_w[obj_on_pole] = arr_visible_w[select_number];_obj_h[obj_on_pole] = arr_visible_h[select_number];_center_rot_x = _root["obj" + obj_on_pole]._x;_center_rot_y = _root["obj" + obj_on_pole]._y;_rotation[obj_on_pole] = 0;cat_name = arr_category[obj_on_pole];d.load("objx3d/"+"obj" + cat_name + "_" + arr_obj_num[obj_on_pole] + ".x3d");d.onLoad = function(success:Boolean){(success){_obj_string[obj_on_pole] = objx3d.toString();// converts dots XML object to a string and stores it in dotsToXMLString.

} else{("Could not load XML");

}

}_obj = false;_obj[4].enabled = true;_obj[4]._alpha = 100;_obj[15].enabled = true;_obj[15]._alpha = 100;_obj[16].enabled = true;_obj[16]._alpha = 100;_obj[17].enabled = true;_obj[17]._alpha = 100;_obj[18].enabled = false;

menu_obj[18]._alpha = 50;

};

Исходными данными на данном этапе являются:

Объект tempobj - объект типа MovieClip

Переменная obj_on_pole - содержащая числовое значение количества объектов в рабочем поле

Переменная category - содержащая числовой код выбранной категории товара

Переменная objx3d - переменная типа XML, в которую загружаются заранее созданные трехмерные объекты.

Массивы arr_category - массив данных, содержащий числовой код категории для создаваемого объекта

Массивы arr_obj_num - массив данных, содержащий порядковый номер создаваемого объекта в базе данных

Массивы arr_obj_x - массив данных, содержащий координату по x создаваемого объекта

Массивы arr_obj_y - массив данных, содержащий координату по y создаваемого объекта

Массивы arr_obj_h - массив данных, содержащий длину создаваемого объекта

Массивы arr_obj_w - массив данных, содержащий ширину создаваемого объекта

Массивы arr_rotation - массив данных, содержащий величину угла поворота создаваемого объекта

Массивы arr_visible_i - массив данных, содержащий порядковый номер выбранного элемента в базе данных

Массивы arr_visible_h - массив данных, содержащий длину выбранного элемента в базе данных

Массивы arr_visible_w - массив данных, содержащий ширину выбранного элемента в базе данных

Переменная select_number - переменная, содержащая числовое значение номера выбранного объекта.

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

Логическая переменная create_obj должна иметь значение true

Курсор мыши должен находиться в области рисования

Если вышеуказанные условия выполняются, то программа приступает к созданию объекта. К объекту tempobj применяется функция stopDrag() (данная функция останавливает перетаскивание объекта по экрану). Переменной obj_on_pole приплюсовывается единица, то есть увеличивается количество объектов на рабочем поле. Из объекта tempobj создается дубликат с именем “obj” + obj_on_pole. Все параметры объекта tempobj дублируются для полученного объекта автоматически.

Элементам массивов arr_category, arr_obj_num, arr_obj_x, arr_obj_y, arr_obj_w, arr_obj_h, arr_rotation с номером obj_on_pole присваиваются начальные значения.

Создается временная переменная cat_name, которой присваивается элемент массива arr_category с номером obj_on_pole.

К объекту objx3d применяется функция load() (функция загружает в объект типа XML файл, который находиться по указанному адресу). Отслеживается загрузка файла функцией onLoad() (функция возвращает значение логической переменной, значение которой зависит удачной или не удачной загрузки). Если загрузка прошли успешно, то элементу массива arr_obj_string с номером obj_on_pole присваивается результирующее значение функции toString(), примененной к объекту objx3d (функция toString преобразовывает содержимое объекта типа XML в строку).

Последним шагом данного этапа является присвоение логической переменной create_obj значение false, что обезопасит от создания объекта повторно.

.5.3 Создание файла формата *.x3d

if ((menu_obj_flag[15])&&(obj_on_pole != 0)) {_string = "<X3D><Scane><Group><Viewpoint centerOfRotation" + chr(61) + chr(34) + "0 0 0" + chr(34) + "/>";(var n_i = 1; n_i <= obj_on_pole; n_i++) {_string = obj_string + "<Transform translation" + chr(61) + chr(34) + int((arr_obj_x[n_i])*10)/10 + " " + int((arr_obj_y[n_i])*10)/10 + " " + "0" + chr(34) + " " + "rotation" + chr(61) + chr(34) + "0 0 " + int((arr_rotation[n_i])*100)/100 + " " + "1" + chr(34) + ">";_string = obj_string + arr_obj_string[n_i];(n_i != obj_on_pole) {_string = obj_string + "</Transform></Group><Group>";

}

};_string = obj_string + "</Transform></Group></Scane></X3D>"_obj_flag[15] = false;("writetofile.php", "", "POST");("writetofile.php", "_blank")_created = true;_obj[15].enabled = false;_obj[15]._alpha = 50;_obj[18].enabled = true;_obj[18]._alpha = 100;

};

Исходными данными на данном этапе являются:

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

Переменная obj_on_pole - содержащая числовое значение количества объектов в рабочем поле.

Массив arr_obj_string - массив данных, который содержит файлы с расширением *.x3d, преобразованные в строки.

Логическую переменную file_created - переменная, являющаяся флагом для загрузки результирующего файла. Ее исходное значение ровно false.

Массивы arr_obj_x - массив данных, содержащий координату по x создаваемого объекта

Массивы arr_obj_y - массив данных, содержащий координату по y создаваемого объекта

Массивы arr_rotation - массив данных, содержащий величину угла поворота создаваемого объекта

Переменная obj_string - строковая переменная, в которой будет создаваться содержимое результирующего файла.

Для того чтобы создать данный файл необходимо добавить к каждому элементу массива arr_obj_string соответствующие элементы массивов arr_obj_x, arr_obj_y и arr_rotation.

Трансформация объекта в языке X3D осуществляется путем заключения кода, описывающего объект, в парные теги <Transform></Transform>. Для перемещения объекта относительно центра сцены используется атрибут translation, а для поворота объекта вокруг его центра используется атрибут rotation. Оба этих атрибута помещаются в тело открывающего тега <Transform>.

Для реализации добавления параметров к каждому элементу к переменной obj_string необходимо добавить строку, которая содержит открывающие теги сцены, формата X3D, группы и координаты положения камеры (<X3D><Scane><Group><Viewpoint centerOfRotation = “0 0 0”/>). На следующем шаге создается цикл for.… Создается временная переменная n_i, которая является индикатором цикла. Осуществляется проход по отрезку от 1 до значения переменной obj_on_pole. При каждом проходе к строковой переменной obj_string прибавляется открывающий тег трансформации, атрибуты перемещения, поворота, а так же соответственно значения элементов массива arr_obj_x, arr_obj_y, arr_rotation, номера которых ровны n_i (“<Transform translation" + chr(61) + chr(34) + int((arr_obj_x[n_i])*10)/10 + " " + int((arr_obj_y[n_i])*10)/10 + " " + "0" + chr(34) + " " + "rotation" + chr(61) + chr(34) + "0 0 " + int((arr_rotation[n_i])*100)/100 + " " + "1" + chr(34) + "> ). Далее к переменной obj_string прибавляется значение элемента массива arr_obj_string с номером n_i, а также, при условии, что элемент в цикле не последний, к переменной obj_string прибавляется закрывающий тег трансформации, закрывающий тег группы и открывающий тек группы (</Transform></Group><Group>).

По окончанию цикла к переменной obj_string прибавляется закрывающий тег трансформации, закрывающий тег группы, закрывающий тег сцены и закрывающий тек формата X3D (</Transform></Group></Scane></X3D>).

Вышеописанными преобразованиями в строковой переменной было сформировано содержание результирующего файла. Но пока файл еще не записан и остается пустым.

Так как язык Action Script не имеет средств для создания файлов, то данная задача может быть решена с помощью использования серверных языков. Для решения данной задачи используется язык программирования PHP.

Для передачи переменных из языка ActionScript во внешние сценарии используется функция loadVariables(). Существует два метода реализации передачи переменных:

Метод GET. При использовании этого метода существуют ограничения на длину передаваемой информации. К тому же, информация передается открыто.

Метод POST. Используется при передаче больших объемов информации.

На данном этапе используется метод POST, что позволяет не вводить ограничений на передаваемую информацию.

2.5.4 Запись в файл *.x3d

<?php$HTTP_POST_VARS;

$var1 = $_POST["obj_string"];

$f_name = realpath("rdyroom.x3d");

$file=fopen($f_name,"w");($file, $var1);($file);" - ".$var1;$f_name;

?>

Для записи в файл используется серверный язык программирования PHP.

Первым шагом для записи в файл становиться получение значения переменной obj_string, в которой храниться содержание будущего файла. Так как передача переменных осуществлялась методом POST, то и получение должно осуществляться при помощи оператора $_POST[].

Далее, в переменную $f_name записывается абсолютный путь к файлу rdyroom.x3d, в который и будет производиться запись. Абсолютный путь вычисляется при использовании функции realpath(). Следующим шагом, является открытие файла для записи. Для этого применяется функция fopen(). Запись в файл производиться с помощью функции fputs(). Для окончания записи необходимо закрыть файл использовав функцию fclose().

После выполнения данного сценария содержимое переменной obj_string записывается в файл rdyroom.x3d.

После окончания записи в файл логическая переменная file_created получает значение true.

.6 Алгоритм работы с базами данных

Существуют различные виды баз данных. Среди них по модели представления данных различают:

Картотеки

Иерархические

Сетевые

Реляционные

Многомерные

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

Формат XML имеет иерархическую структуру, что подходит для описания практически любых документов.

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

.6.1 Классы разбора таблицы XML по элементам и атрибутам

import mx.utils.Delegate; // подключаем Delegate classatherXml {file:String; // адрес xml-файлаvar _xml:XML = null; // загруженный объект xml

public var _data:Object = null; // результирующий объект с данными

public var lenght:Number = 0;var succ:Boolean = false;var end_parse:Boolean = false;

// Конструктор классаfunction atherXml(f:String) {.file = f;._xml = new XML(); // создаем объект xml

// игнорировать текстовые узлы состоящие из пробелов._xml.ignoreWhite = true;

// указываем облость действия обработчику

this._xml.onLoad = Delegate.create(this, xmlParser);._xml.load(this.file); // начинаем загрузку xml-документа

}function xmlParser(success):Void {

// метод Лоад возвращает успешность загрузки, флаг(success) {._data = new Object(); // инициализация объекта с даннымиgroup = this._xml.firstChild.firstChild; // указатель на первый элемент(group) {

// в цикле проходим по всем элементам

var elem_num = group.attributes.elem_num;._data[elem_num] = new Object();._data[elem_num]['gr_name'] = group.attributes.gr_name;._data[elem_num]['items'] = new Object;

var item = group.firstChild; // первый ребенок группы

while(item) {

// цикл по детямprop_num = item.attributes.prop_num;._data[elem_num]['items'][prop_num] = new Object();._data[elem_num]['items'][prop_num]['name'] = item.attributes.name;._data[elem_num]['items'][prop_num]['description'] = item.firstChild.nodeValue;= item.nextSibling;

}= group.nextSibling;

lenght = lenght + 1;

}

}

// функция для использования полученных данных

_root.parseather(success);_parse = true;

}

}

Загрузка и синтаксический анализ файла *.xml может потребовать большое количество времени и памяти. Поэтому для облегчения более быстрой загрузки и разбора данных созданы несколько идентичных классов, которые позволяют осуществлять параллельную загрузку элементов для каждого раздела.

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

Исходными данными для данного алгоритма является только имя файла *.xml, которое храниться в переменной f. Класс делиться на несколько разделов. Первый из них, это раздел объявления переменных. Второй раздел - это конструктор класса. В этом разделе переменной file мы присваиваем значение переменной f. (переменная f является временной переменной). Далее создается новый объект типа XML под именем _xml. Объекты типа XML имеют метод ignoreWhite (данный метод позволяет пропускать поля, содержащие только пробелы, если значение установлено как true). После установки метода ignoreWhite для элемента _xml в значение true начинается загрузка файла.

Если ее значение ровно true, то создается новый объект _data типа Object. Далее создается временная переменная group, которая служит указателем на первый элемент.

В цикле while… проходим по всем элементам. Создается временная переменная elem_num, которая является указателем на атрибут элемента (содержит номер группы). Переменная _data[elem_num] объявляется как объект. Объекту _data[elem_num][‘gr_name’] присваивается значение имя группы элемента. Переменная _data[elem_num][‘items’] объявляется как объект. Далее осуществляется проход по детям объекта _data[elem_num][‘items’].

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

.6.2 Универсальная подпрограмма по записи элементов и атрибутов из таблицы XML в различные массивы, в зависимости от раздела

function unisersalPars(in_xml:menuXml, in_k:Number, num_in:String, type_in:Array, url_in:Array, x_in:Array, y_in:Array, obj_in:Array, obj_flag:Array, w_in:Array, h_in:Array) {(var prop_num in in_xml._data[num_in]['items']) {

//Если имя параметра URL, то оно записывается в массив URL

if (in_xml._data[num_in]['items'][prop_num]['name'] == "url") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_url = true;

}

//Если имя параметра X, то оно записывается в массив X

if (in_xml._data[num_in]['items'][prop_num]['name'] == "x") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_x = true;

}

//Если имя параметра Y, то оно записывается в массив Y

if (in_xml._data[num_in]['items'][prop_num]['name'] == "y") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_y = true;

}

//Если имя параметра W, то оно записывается в массив W

if (in_xml._data[num_in]['items'][prop_num]['name'] == "w") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_w = true;

}

//Если имя параметра H, то оно записывается в массив H

if (in_xml._data[num_in]['items'][prop_num]['name'] == "h") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];_h = true;

}((flag_url) && (flag_x) && (flag_y)) {(x_in, y_in, url_in, obj_in, obj_flag, in_k);

};

};

};

Исходными данными для данной подпрограммы являются:

Переменная in_xml - переменная, содержащая разобранный на элементы и атрибуты файл *.xml

Переменная i_in - переменная, которая содержит величину смещения глубины.

Переменная num_in - переменная, которая содержит строковое значение количества элементов для данного раздела

Массив type_in - массив переменных, который содержит имя группы для каждого элемента

Массив url_in - массив переменных, который содержит имя файла картинки для каждого элемента.

Массив x_in - массив переменных, который содержит координату по оси x, в которую будет установлен элемент на рабочем поле.

Массив y_in - массив переменных, который содержит координату по оси y, в которую будет установлен элемент на рабочем поле.

Массив obj_in - массив переменных типа MovieClip, в котором содержаться объекты.

Массив obj_flag - массив логических переменных.

Массив h_in - массив переменных, который содержит значение ширины каждого элемента.

Массив w_in - массив переменных, который содержит значение длины каждого элемента.

Данный алгоритм основан на переборе элементов. В цикле for..., который проходит по всем элементам объекта in_xml. Далее начинается заполнение исходных массивов. Если выполняется равенство для элемента in_xml._data[num_in] ['items'][prop_num]['name'], то элементу соответствующего массива присваивается значение элемента in_xml._data[num_in]['items'][prop_num]['description'].

Например:

//Сравнение имени элемента(in_xml._data[num_in]['items'][prop_num]['name'] == "url") {//Присвоение элементу массива url_in[num] значения поля элемента.

url_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];flag_url = true;

}

После окончания работы подпрограммы получаем сформированные массивы данных для определенного раздела.

2.6.3 Подпрограммы частичного вывода элементов из таблицы XML на экран в зависимости от раздела

function partview(x_in_i:Array, y_in_i:Array, url_in_i:Array, obj_in_i:Array, obj_flag_i:Array, in_k_i:Number, w_in_i:Array, h_in_i:Array) : Void {(type_of_obj == "bed") {((menu_obj_flag[8])&&(!bed_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_beds - n_i + 1], obj_in_i[n_i]);_visible_i[n_i] = n_beds - n_i + 1;_visible_w[n_i] = w_in_i[n_beds - n_i + 1];_visible_h[n_i] = h_in_i[n_beds - n_i + 1];(last_num == 0) {_in_i[n_i]._y = menu_obj[8]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_beds - n_i + 1]);

} else {_in_i[n_i]._y = menu_obj[8]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_beds - n_i + 1]);

};((x_in_i[n_beds - n_i] != 0)&&(last_num <n_beds - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(bed_menu_open)&&(last_num < n_beds)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_beds - n_i + 1] != undefined) {(url_in_i[n_beds - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_beds - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_beds - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_beds - (n_i + buf_last) + 1];

}((x_in_i[n_beds - (n_i + buf_last) + 1] != 0)&&(last_num <n_beds)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(bed_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_beds - n_i + 1] != undefined) {(url_in_i[n_beds - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_beds - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_beds - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_beds - (buf_last - n_i)];

}((x_in_i[n_tables - (buf_last - n_i)] != 0)&&(last_num <= n_beds)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;

flag_y = false;

};

};

Исходными данными для данного алгоритма являются:

Переменная i_in_i - переменная, которая содержит величину смещения глубины.

Переменная type_of_obj - переменная, которая содержит имя раздела.

Массив url_in_i - массив переменных, который содержит имя файла картинки для каждого элемента.

Массив x_in_i - массив переменных, который содержит координату по оси x, в которую будет установлен элемент на рабочем поле.

Массив y_in_i - массив переменных, который содержит координату по оси y, в которую будет установлен элемент на рабочем поле.

Массив obj_in_i - массив переменных типа MovieClip, в котором содержаться объекты.

Массив obj_flag_i - массив логических переменных.

Массив h_in_i - массив переменных, который содержит значение ширины каждого элемента.

Массив w_in_i - массив переменных, который содержит значение длины каждого элемента.

Данный алгоритм начинает свою работу с условного оператора. Необходимо установить, к какому разделу относится тот или иной объект. Если переменная type_of_obj удовлетворяет условию, то начинает непосредственный вывод элементов на экран. При начале вывода необходимо проверить несколько условий:

Какая кнопка была нажата пользователем

Открыт ли раздел

Если в первый раз нажата кнопка раздела, то раздел открывается. Это происходит по следующему алгоритму:

Переменная last_num содержит в себе номер последнего выведенного на экран элемента. Эта переменная обнуляется, так как открытие раздела производится впервые.

Запускается цикл for… проходящий от 1 до 5 (переменная n_i является счетчиком цикла).

Переменная name содержит в себе имя будущего MovieClip’а.

В элемент массива obj_in_i с номером n_i создается пустой MovieClip.

В этот MovieClip помещается картинка, имя которой содержится в массиве url_in_i.

Элементам массивов arr_visible_i, arr_visible_h, arr_visible,w присваиваются номер, ширина и длинна элемента соответственно.

Значение переменной last_num увеличивается на 1.

Счетчик цикла увеличивается на 1.

Если раздел открыт, и нажата кнопка перелистывания элементов, то алгоритм работы следующий:

Создается временная переменная buf_last. Ей присваивается значение переменной last_name.

Запускается цикл for… проходящий от 1 до 5 (переменная n_i является счетчиком цикла )

В элемент массива obj_in_i с номером n_i помещается картинка, имя которой содержится в массиве url_in_i.

Элементам массивов arr_visible_i, arr_visible_h, arr_visible,w присваиваются номер, ширина и длинна элемента соответственно.

Значение переменной last_num увеличивается на 1.

Счетчик цикла увеличивается на 1

Данный алгоритм универсален для любого раздела.

.7 Алгоритмы работы с двухмерными объектами

.7.1 Алгоритм по созданию точки в рабочей области

if ((x + (w_p/2) > wmax) or (y + (h_p/2) > hmax) or (drawing_end) or (x - (w_p/2) < wmin) or (y - (h_p/2) < hmin)) {

flag1 = false;

};

//Если происходит попытка поставить точку в зоне рисования,

//то срабатывает миханизм включения рисования(((x + (w_p/2) < wmax) && (y + (h_p/2) < hmax) && (x - (w_p/2) > wmin) && (y - (h_p/2) > hmin))&&(!flag2)&&(!drawing_end)&&(!create_obj)) {= true;

};

// При нажатии на левую кнопку мыши в зоне рисования ставим точку

if (flag1) {_coordx[i] = Math.floor((x + step/2)/step)*step;_coordy[i] = Math.floor((y + step/2)/step)*step;

//Если коокдинаты точки соответствуют координатам начальной точки, то линия замыкается

//и рисование перестает быть возможным((arr_coordx[i] == arr_coordx[1])&&(arr_coordy[i] == arr_coordy[1]) && (i != 1)) {

drawlastline(i);_end = true;_obj[2]._alpha = 50;_obj[2].enabled = false;_obj[3]._alpha = 100;_obj[3].enabled = true;

} else {

// Рисуем непосредственно точку_obj[1]._alpha = 100;

menu_obj[1].enabled = true;_p[i] = points.createEmptyMovieClip("mc"+i,i);(arr_p[i], color);_p[i]._x = arr_coordx[i] - w_p/2;_p[i]._y = arr_coordy[i] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;(i!= 1) {(i);

};= i + 1;

};

};

Для того, чтобы поставить точку в рабочей области, необходимо сначала удостовериться, что указатель мыши находиться в области рисования. Также, необходимо учитывать то, что линия может быть уже замкнута. Для этого в условном операторе if отслеживаются координаты мыши по оси x и y, а также значение логической переменной drawing_end.

Если все условия выполняются, то логическая переменная flag1 принимает значение true. Это позволяет при нажатии левой кнопки мыши создать точку.

Создание точки происходит по следующему алгоритму:

В массивы arr_coordx и arr_coordy помещаются округленные значения координат мыши по осям x и y соответственно. Округление производиться для того, чтобы точка попала точно в перекрестие сетки.

В условном операторе сравниваются значения создаваемой точки с координатами первой точка, а также значение переменной i, в которой храниться количество точек на рабочем поле, с единицей.

Если условие выполняется, то запускается функция drawlastline()(которая рисует последнюю, замыкающую линию). Также, логической переменной drawing_end присваивается значение true.

Если условие не выполняется, то в элементе массива arr_p под номером i создается пустой MovieClip.

Запускается функция рисования точки, исходными данными для которой являются MovieClip, и числовое значение цвета создаваемой точки.

В элементе массива arr_p с номером i рисуется точка.

Устанавливаются координаты для этого MovieClip’а.

В условном операторе if значение переменной i сравнивается с единицей. Если условие не выполняется, то запускается подпрограмма по рисованию линии.

Переменная i увеличивается на единицу.

.7.2 Алгоритм по перемещению точки по рабочей области

a)(flag2) {_temp = Math.floor((x + step/2)/step)*step;_temp = Math.floor((y + step/2)/step)*step;(var n=1; n<=i-1; n++) {((x_temp == arr_coordx[n]) && (y_temp == arr_coordy[n])) {_flag = true;= n;(n, w_p, h_p);_p[n].startDrag();

};

};

};

)(select_flag) {.clear();= _xmouse;= _ymouse;_coordx[select] = Math.floor((x + step/2)/step)*step;_coordy[select] = Math.floor((y + step/2)/step)*step;(select == 1) {_coordx[i] = arr_coordx[1];_coordy[i] = arr_coordy[1];_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;

} else {_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;

};(select);(select, w_p, h_p);

};)(select_flag) {_p[select].stopDrag();_coordx[select] = Math.floor((x + step/2)/step)*step;_coordy[select] = Math.floor((y + step/2)/step)*step;_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;

select_flag = false;

};

Данный алгоритм позволяет определить местонахождение точки на рабочем поле и узнать ее номер.

Алгоритм реализуется следующими действиями:

Переменным x_temp и y_temp присваивается округленное значение текущих координат положения мыши.

Запускается цикл for… , счетчиком которого является временная переменная n. Цикл проходит отрезок от 1 до i-1 с шагом 1.

В теле цикла выполняется условный оператор if. В нем проверяется равенство переменных x_temp и y_temp соответственно элементам массивов arr_coordx и arr_coordy с номерами n.

При выполнении условий логической переменной select_flag присваивается значение true.

Переменной select присваивается значение переменной n (номер выделяемой точки)

Запускается подпрограмма createborder(), которая отвечает за рисования рамки вокруг точки.

К элементу массива arr_p с номером n применяется функция startDrag() (Эта функция позволяет перетаскивать объект по экрану)

При перемещении указателя мыши по рабочей области с нажатой левой кнопкой мыши происходит перетаскивание точки:

Если значение логической переменной select_flag ровно true, то очищается MovieClip с именем borderlayer. В данном объекте рисуется рамка, вокруг точки.

Переменным x и y присваиваются значения координат указателя мыши.

Элементам массивов arr_coordx и arr_coordy c номерами select присваиваются округленные значения координат по оси x и y соответственно.’ам массива arr_p с номерами select присваиваются новые значения координат по осям x и y.

Запускается подпрограмма redrawline(), которая отвечает за перерисовку линий.

Запускается подпрограмма createborder(), которая отвечает за рисования рамки вокруг точки.

При прекращении нажатия на левую кнопку мыши и значении true логической переменной select_flag происходят следующие события:

К элементу массива arr_p с номером select применяется функция stopDrag(), которая прекращает перетаскивание объекта по экрану.

Элементам массивов arr_coordx и arr_coordy присваиваются новые значения координат.

Логической переменной select_flag присваивается значение flase.

Данный алгоритм позволяет определить номер точки на рабочем поле по ее координатам, а также позволяет предусмотреть случайное рисование точки за пределами рабочей области.

2.7.3 Подпрограммы по созданию и перерисовке линий между точками

function drawline(i_l:Number) : Void {= i_l;_l[i_l-1] = linelayer.createEmptyMovieClip("line" + i_l,k);_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);

};

Исходными данными для алгоритма по созданию линий между точками является переменная i_l, в которой храниться значение номера рисуемой точки.

Алгоритм работает по следующей схеме:

В переменную k копируется значение переменной i_l

В элементе массива arr_l с номером (i_l - 1) создается пустой MovieClip.

В нем рисуется линия от точки под номером (i_l - 1) к точке с номером i_l.

Для создания последней, замыкающей контур линии линия рисуется от точки под номером i_l к точке под номером 1.

function drawlastline(i_l:Number) : Void {= i_l;_l[i_l-1] = linelayer.createEmptyMovieClip("line" + i_l,k);_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[1], arr_coordy[1]);

};

Исходными данными для алгоритма по перерисовке линий являются:

Номер выделенной точки (переменная i_l).

Массив arr_l - массив объектов типа MovieClip, содержащий нарисованные линии

Переменная colorl - переменная, содержащая числовое значение цвета рисуемой линии.

Массивы arr_coordx и arr_coordy - массивы переменных, содержащие координаты точек по оси x и y соответственно.

function redrawline(i_l:Number) : Void {((i_l == 1) && (drawing_end)) {_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[i_l+1], arr_coordy[i_l+1]);_l[i-1].clear();_l[i-1].lineStyle(1,colorl);_l[i-1].moveTo(arr_coordx[i-1], arr_coordy[i-1]);_l[i-1].lineTo(arr_coordx[1], arr_coordy[1]);

} else if (i_l == (i - 1)){_l[i_l-1].clear();_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[1], arr_coordy[1]);

} else {_l[i_l-1].clear();_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[i_l+1], arr_coordy[i_l+1]);

};

};

Алгоритм работает по следующей схеме:

Если номер выделенной точки равен единице и рисование закончено (значение переменной i_l равен 1 и логическая переменная drawing_end принимает значение true), то очищаются элементы массива arr_l с номерами i_l и (i - 1). Далее по новым координатам рисуются линии, которые входят и исходят из точки под номером 1.

Если переменная i_l (номер выделенной точки)принимает значение (i - 1), то очищаются элементы массива arr_l с номерами i_l-1 и i_l. Далее по новым координатам рисуются линии, которые входят и исходят из точки под номером i_l. Особенность данного условия заключается в том, что перерисовывается линия, конечной точкой которой является точка под номером 1 (исходящая линия).

В остальных случаях очищаются элементы массива arr_l с номерами i_l-1 и i_l. Далее по новым координатам рисуются линии, которые входят и исходят из точки под номером i_l.

Эти условия предусматривают все возможные варианты перемещения точек.

2.7.4 Подпрограмма по выделению объекта на рабочей области

function testofhit() : Void {(var n_i = 1; n_i <= obj_on_pole; n_i++) {(selectpixl.hitTest(_root["obj" + n_i])) {_to_select = true;_num = n_i;

};

};

};

Исходными данными для данного алгоритма являются:

Логическая переменная select_obj - переменная, отвечающая за нажатие любой кнопки меню, отвечающей за трансформацию объекта (если принимает значение true, то кнопка меню нажата)

Группа объектов типа MovieClip, созданных в рабочем поле (имена этих объектов obj1, obj2 и т.д.)

Переменная obj_on_pole - переменная, в которой храниться количество объектов в рабочем поле

Логическая переменная rdy_to_select - данная переменная исходным значением имеет false.

Объект типа MovieClip с именем selectpixl - этот объект содержит квадрат с размерами 1 на 1 пиксель.

Переменная select_num - в данной переменной храниться номер выделенного объекта

Алгоритм работает следующим образом:

При выполнении условия, что логическая переменная select_obj принимает значение true, и при движении мыши по рабочей области запускается подпрограмма testofhit().

В подпрограмме testofhit() запускается цикл for…, счетчиком которого является переменная n_i (переменная n_i лежит в отрезке между 1 и значением переменной obj_on_pole)

В теле цикла находиться условный оператор if. В нем проверяется условие столкновения объекта selectpixl с объектом obj1, obj2 и т.д. Если выполняется данное условие, то логической переменной rdy_to_select присваивается значение true, а переменной select_num значение счетчика n_i.

Данный алгоритм позволяет узнать номер объекта в рабочем поле, на котором сейчас находиться указатель мыши.

.7.5 Подпрограммы по перемещению объектов по рабочему полю

a)((rdy_to_select)&&(!rotate_obj)) {.stopDrag();

_root["obj" + select_num].startDrag();

_root["obj" + select_num]._alpha = 50;_obj = false;_to_select = false;_obj = true;

};)((selected_obj)&&(!rotate_obj)) {

_root["obj" + select_num]._alpha = 100;

_root["obj" + select_num].stopDrag();_obj_x[select_num] = (_root["obj" + select_num]._x)/10 - wmin/10 - center_pole_x;_obj_y[select_num] = (_root["obj" + select_num]._y)/10 - hmin/10 - center_pole_y;_center_rot_x = _root["obj" + obj_on_pole]._x;_center_rot_y = _root["obj" + obj_on_pole]._y;();_obj = false;_obj = false;

borderobj.clear();

};

Исходными данными для данного алгоритма являются:

Логическая переменная rdy_to_select - если значение переменной true, то объект выбран.

Логическая переменная rotate_obj - переменная, отвечающая за инициализацию поворота

Переменная select_num - переменная, в которой храниться номер выбранного объекта.

Объект типа MovieClip с именем obj + select_num - это и есть выделенный объект.

Логическая переменная selected_obj - начальное значение этой переменной false.

Массивы arr_obj_x, arr_obj_y - массивы, содержащие координаты по осям x и y для каждого созданного объекта.

Константы wmin и hmin - в них содержаться значения отступа рабочей области от левого верхнего угла.

Константы center_pole_x и center_pole_y - в этих координатах содержаться координаты центра рабочей области.

При нажатии на левую кнопку мыши выполняются следующие действия:

В условном операторе if проверяются значения переменных rdy_to_select и rotate_obj (значения должны быть ровны true и false соответственно)

К объекту типа MovieClip с именем obj + select_num применяется функция startDrag().

Прозрачность объекта снижается до 50%.

Логической переменной select_obj присваивается значение false.

Логической переменной rdy_to_select присваивается значение false.

Логической переменной selected_obj присваивается значение true.

При прекращении нажатия на левую кнопку мыши происходят следующие действия:

В условном операторе if проверяются значения переменных selected_obj и rotate_obj (должны бить ровны true и false соответственно)

Прозрачность объекта типа MovieClip с именем obj + select_num меняется на 100%.

К объекту применяется функция stopDrag().

В элемент массива arr_obj_x и arr_obj_y записываются преобразованные координаты объекта (преобразование ведется с целью перемещения точки отсчета в центр рабочей области)

Логической переменной selected_obj присваивается значение false.

Логической переменной select_obj присваивается значение false.

.7.6 Подпрограммы по повороту объектов

)

if ((rdy_to_select)&&(rotate_obj)) {.stopDrag();(select_num != old_select_num) {_rotation_old = 0;

};_temp = _xmouse;_temp = _ymouse;_obj = false;_to_select = false;_obj = true;

};)((selected_obj)&&(rotate_obj)) {_rotation = (y_temp - _ymouse)/Math.PI*180 / 10;._rotation = obj_rotation + obj_rotation_old;

_root["obj" + select_num]._rotation = obj_rotation + obj_rotation_old;

};)((selected_obj)&&(rotate_obj)) {_rotation_old = obj_rotation_old + obj_rotation;(obj_rotation_old >= 360) {_rotation_old = obj_rotation_old - 360;

};_rotation[select_num] = obj_rotation_old * 0.0173;_obj = false;_obj = false;_obj = false;.clear();_select_num = select_num;

};

Исходными данными для данного алгоритма являются:

Логическая переменная rdy_to_select - если значение переменной true, то объект выбран.

Логическая переменная rotate_obj - переменная, отвечающая за инициализацию поворота

Переменная select_num - переменная, содержащая номер выделенного объекта.

Переменные x_temp и y_temp - в них хранятся координаты указателя мыши по осям x и y соответственно.

Переменная obj_rotation_old - в этой переменной хранится угол поворота объекта.

Переменная obj_rotation - в этой переменной храниться текущий угол поворота объекта.

Массив arr_rotation - массив элементов, который содержит величину угла поворота для каждого из объектом.

Логическая переменная selected_obj - начальное значение данной переменной ровно false.

Логическая переменная select_obj - переменная, отвечающая за выбор объекта.

При нажатии на левую кнопку мыши выполняются следующие действия:

Проверяется значения переменных rdy_to_select и rotate_obj (значения должны быть true для обеих переменных)

Переменным x_temp и y_temp присваиваются текущие координаты указателя мыши.

Переменной selected_obj присваивается значение true, а переменным select_obj и rdy_to_select значение false.

Если при нажатой левой кнопке мыши происходит перемещение указателя, то выполняются следующие действия:

Переменной obj_rotation присваивается значение угла поворота, в зависимости от разницы текущей координаты курсора мыши и переменной y_temp.

Объекту типа MovieClip с именем obj + select_num присваивается новое значение угла поворота, которое складывается из значения переменной obj_rotation_old и obj_rotation.

При прекращении нажатия на левую кнопку мыши происходят следующие действия:

Переменной obj_rotation_old присваивается новое значение.

В условном операторе if проверяется значение переменной obj_rotation_old (если оно больше 360, то из него вычитают 360)

Элементу массива arr_rotation с номером select_num присваивается новое значение, которое образуется путем умножения переменной obj_rotation_old на коэффициент (0.0173 - это коэффициент преобразования градусов в размерность формата X3D)

Логическим переменным rotate_obj и selected_obj присваиваются значение false.

.7.7 Алгоритм очистки рабочего поля

(menu_obj_flag[5]) {

for (var n_i = 1; n_i <= obj_on_pole; n_i = n_i + 1) {

_root["obj" + n_i].removeMovieClip();_obj_string[n_i] = "";_cotegory[n_i] = undefined;_obj_num[n_i] = undefined;_number = undefined;_obj_x[n_i] = undefined;_obj_y[n_i] = undefined;_rotation[n_i] = 0;_rotation = undefined_rotation_old = undefined;_center_rot_x = undefined;_center_rot_y = undefined;

};(var n_i = 1; n_i <= i; n_i++) {_p[n_i].clear();_l[n_i].clear();_coordx[n_i] = null;_coordy[n_i] = null;

};(var n_i = 1; n_i <= wall_i; n_i++) {_wallcoordx[n_i] = null;_wallcoordy[n_i] = null;

};._visible = false;_obj = false;_obj = false;_to_select = false;.clear();.clear();.clear();= false;= false;= false;_end = false;_created = false;_rotation_old = 0;_rotation = 0;_on_pole = 0;= 1;= 1;_i = 1;_obj[1]._alpha = 50;_obj[1].enabled = false;_obj[2]._alpha = 100;_obj[2].enabled = true;_obj[3]._alpha = 50;_obj[3].enabled = false;_obj[4]._alpha = 50;_obj[4].enabled = false;_obj[15]._alpha = 50;_obj[15].enabled = false;_obj[16]._alpha = 50;_obj[16].enabled = false;_obj[17]._alpha = 50;_obj[17].enabled = false;_obj[18]._alpha = 50;

menu_obj[18].enabled = false;

};

Исходными данными для данного алгоритма являются:

Переменные типа MovieClip с именами obj1, obj2, obj3 и т.д.

Массив arr_obj_string - массив элементов, который хранит текстовое содержание фалов формата *.x3d

Массив arr_cоtegory - массив элементов, который хранит числовой код категории для каждого созданного объекта

Массив arr_obj_num - массив элементов, который хранит порядковый номер элемента в базе данных

Переменная select_number - переменная, которая содержит номер выделенного объекта

Массивы arr_obj_x и arr_obj_y - массивы элементов, которые хранят координаты созданных объектов на рабочем поле.

Массив arr_rotation - массив элементов, который содержит величину угла поворота для каждого из объектов.

Переменная obj_rotation - переменная, которая хранит текущую величину угла поворота

Переменная obj_rotation_old - переменная, которая хранит полную величину угла поворота объекта

Массив элементов arr_p - массив элементов, содержащий объекты типа MovieClip, в которых находятся точки на рабочем поле.

Массив элементов arr_l - массив элементов, содержащий объекты типа MovieClip, в которых находятся линии на рабочем поле.

Массивы элементов arr_coordx и arr_coordy - массивы элементов, которые содержат значения координат для каждой из точек на рабочем поле.

Переменная i - содержит количество точек на рабочем поле

Переменная obj_on_pole - содержит количество объектов на рабочем поле.

Объект типа MovieClip с именем selectpixl - объект используемый для определения положения указателя мыши.

Логические переменные select_obj, selected_obj и rdy_to_select - переменная, отвечающие за инициализацию выделения.

Объекты типа MovieClip с именами borderlayer, roomlayer - объекты в которых находятся объекты бордюра и стены.

Логические переменные drawind_end и wall_created - переменны отвечающие за возможность установки точек в рабочей области.

Смысл данного алгоритма заключается в том, чтобы очистить все объекты типа MovieClip, а всем переменным массивам присвоить исходные значения. Это необходимо для того, чтобы при повторных действиях не возникали проблемы с перекрестными данными (например, вновь созданный объект будет иметь определенный угол поворота, который был у удаленного объекта)

.7.8 Подпрограмма удаления выбранного объекта

testofhittrash() : Void {

if (_root["obj" + select_num].hitTest(menu_obj[16])) {(select_num == obj_on_pole) {

_root["obj" + select_num].clear();_category[select_num] = undefined;_obj_num[select_num] = undefined;_obj_x[select_num] = undefined;_obj_y[select_num] = undefined;_obj_w[select_num] = undefined;_obj_h[select_num] = undefined;_rotation[select_num] = undefined;_obj_string[select_num] = undefined;

};_on_pole = obj_on_pole - 1;(var n_i = select_num; n_i <= obj_on_pole; n_i++) {_category[n_i] = arr_category[n_i + 1];_obj_num[n_i] = arr_obj_num[n_i + 1];_obj_x[n_i] = arr_obj_x[n_i + 1];_obj_y[n_i] = arr_obj_y[n_i + 1];_obj_w[n_i] = arr_obj_w[n_i + 1];_obj_h[n_i] = arr_obj_h[n_i + 1];_rotation[n_i] = arr_rotation[n_i + 1];_obj_string[n_i] = arr_obj_string[n_i + 1];

_root["obj" + (n_i + 1)].duplicateMovieClip("obj" + n_i, 30 + n_i);

_root["obj" + (n_i + 1)].clear();

};_category[obj_on_pole + 1] = undefined;_obj_num[obj_on_pole + 1] = undefined;_obj_x[obj_on_pole + 1] = undefined;_obj_y[obj_on_pole + 1] = undefined;_obj_w[obj_on_pole + 1] = undefined;_obj_h[obj_on_pole + 1] = undefined;_rotation[obj_on_pole + 1] = undefined;_obj_string[obj_on_pole + 1] = undefined;

};

};

Исходными данными для данного алгоритма являются:

Переменная select_num - переменная, содержащая значение выбранного объекта

Объект типа MovieClip с именем obj + select_num - выбранный объект.

Переменная obj_on_pole - переменная, содержащая количество объектов на рабочем поле.

Массив arr_category - массив, содержащий числовой код раздела.

Массивы arr_obj_x и arr_obj_y - массивы, содержащие координаты объектов на рабочем поле.

Массив arr_obj_num - массив, содержащий номер объекта в базе данных.

Массивы arr_obj_h и arr_obj_w - массивы, содержащие значения длинны и ширины объектов на рабочем поле.

Массив arr_rotation - массив, содержащий значения угла поворота объекта.

Массив arr_obj_string - массив, хранящий содержание файлов *.x3d.

Данный алгоритм работает на основе алгоритма перемещения объекта.

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

Проверяется значение переменной select_num. Если оно ровно значению переменной obj_on_pole, то к объекту типа MovieClip с именем obj + select_num применяется функция clear(), которая очищает его содержимое.

Значение переменной obj_on_pole уменьшается на единицу.

Цикл for… осуществляет проход по отрезку от значения переменной select_num до значения переменной obj_on_pole с шагом 1 (временная переменная n_i является счетчиком цикла)

В теле цикла элементам массивов arr_category, arr_obj_num, arr_obj_x, arr_obj_y, arr_obj_h, arr_obj_w, arr_rotation и arr_obj_string с номерами n_i присваивается значение элементов соответствующих массивов с номерами n_i + 1. Объект типа MovieClip с именем obj + n_i + 1 копируется в объект типа MovieClip с именем obj + n_i. К объекту с именем obj + n_i + 1 применяется функция очистки содержимого.

После завершения цикла элементы массивов arr_category, arr_obj_num, arr_obj_x, arr_obj_y, arr_obj_h, arr_obj_w, arr_rotation и arr_obj_string с номерами obj_on_pole + 1 очищаются.

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

.8 Оценка эффективности системы

Эффективность системы - это свойство системы выполнять поставленную цель в заданных условиях использования и с определенным качеством. Показатели эффективности характеризуют степень приспособленности системы к выполнению поставленных перед нею задач и являются обобщающими показателями оптимальности функционирования системы.

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

Данная система реализовывалась с целью обеспечения некоторых возможностей, таких как:

Возможность трехмерной визуализации

Возможность добавления объектов

Данные возможности были реализованы в данной системе при помощи разработанных алгоритмов и методов.

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

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

3. Экологическая часть и безопасность жизнедеятельности

.1 Исследование воздействия опасных и вредных факторов при эксплуатации ЭВМ и их воздействие на организм человека

Пользователь ПЭВМ и его руководитель должны знать о вредном воздействии факторов и об эффективных способах зашиты от них, что уменьшает вероятность получения ими различных профессиональных заболеваний, а также снижает количество сбоев и ошибок в работе операторов.

Перечислим основные нарушения, допускаемые со стороны администрации:

практически нигде не проводится аттестация рабочих мест по условиям труда, а это значит, что существующие нарушения требований безопасно не выявляются и не устраняются;

большинство операторов и пользователей ПК не знают, какие опасные и вредные производственные факторы действуют на них на компьютеризированном рабочем месте;

пользователи, работающие на ПЭВМ не знают фактических величин параметров опасных и вредных производственных факторов, действующих на рабочем месте;

операторы (и другие пользователи) не знакомы с основами трудового законодательства об охране труда, со своими правами, с обязанностями администрации по обеспечению нормальных условий труда;

на предприятиях отсутствуют нормативные документы по охране труда и безопасности ПК;

практически повсеместно не проводится обучение безопасным приемам и методам труда на ПК, а также инструктирования операторов, программистов, техников и других пользователей, тогда как работы на ПК нередко относятся к категории работ с опасными и вредными условиями труда (на основании документа Р 2.2.755-99);

находящиеся в эксплуатации и приобретаемые вновь мониторы практически нигде не имеют сертификатов безопасности и гигиенических сертификатов (согласно требованиям СанПиН 2.2.2.542-96), причем торгующие организации зачастую вручают малограмотным покупателям фальсифицированные гигиенические сертификаты и сертификаты безопасности;

операторы и пользователи не проходят периодических медосмотров, как работающие во вредных условиях труда на основании приказа Минздрава РФ и департамента Госкомсанэпиднадзора РФ от 05.10.1995 № 280/88, а именно: п.п. 5.2.2 (электромагнитные поля радиочастот); п.п. 6.1.5 (работы, связанные с локальными мышечными напряжениями преимущественно мышц кисти и предплечья); п.п. 6.2 (зрительно-напряженные работы и наблюдение за экраном);

далеко не всем операторам и пользователям выдаются положенные им средства индивидуальной защиты на основании п. 3.8 СанПиН 2.2.2.542-96;

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

во многих офисных и производственных помещениях и мест место несоответствие санитарным нормам по площади и объему на одного работающего (нередко эти параметры оказывались меньше нормы в 2-2,5 раза).

На работающего пользователя на ПЭВМ постоянно или периодически действуют следующие опасные и вредные факторы:

Загрязнение воздуха вредными веществами, пылью, микроорганизмами и положительными аэроионами.

Несоответствие нормам параметров микроклимата.

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

Повышенный уровень шума на рабочем месте.

Повышенный уровень статистического электричества при неправильно запроектированной рабочей зоне.

Опасный уровень напряжения в электрической цепи, замыкание которой может пройти через тело человека.

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

Повышенный уровень ионизирующих излучений (мягкое рентгеновское, гамма-излучение).

Отсутствие или недостаток естественного света.

Недостаточная освещенность рабочей зоны.

Повышенная яркость света.

Пониженная контрастность.

Прямая и обратная блёсткость.

Повышенная пульсация светового потока (мерцание изображения).

Длительное пребывание в одном и том же положении и повторение одних и тех же движений приводит к синдрому длительных статических нагрузок (СДСН).

Нерациональная организация рабочего места.

Несоответствие эргономических характеристик оборудования нормируемым величинам.

Умственное перенапряжение, которое обусловлено характером решаемых задач приводит к синдрому длительных психологических нагрузок (СДПН).

Большой объем перерабатываемой информации приводит к значительным нагрузкам на органы зрения.

Монотонность труда.

Нервно-психические нагрузки.

Нервно-эмоциональные стрессовые нагрузки.

Опасность возникновения пожара.

Остановимся подробнее на недостаточной освещенности рабочей зоны помещения, где установлены ПЭВМ, а также на влиянии повышенной яркости света, пониженной контрастности, прямой и обратной блёсткости и повышенной пульсации светового потока. При работе на ПЭВМ органы зрения пользователя выдерживают большую нагрузку с одновременным постоянным напряженным характером труда, что приводит к нарушению функционального состояния зрительного анализатора и центральной нервной системы. Нарушение функционального состояния зрительного анализатора проявляется в снижении остроты зрения, устойчивости ясного видения, аккомодации, электрической чувствительности и лабильности.

Причинами нарушения функционального состояния зрительного анализатора являются:

постоянная переадаптация органов зрения в условиях наличия в поле зрения объекта различения и фона различной яркости;

недостаточная четкость и контрастность изображения на экране;

строчность воспринимаемой информации;

постоянные яркостные мелькания;

наличие ярких пятен на клавиатуре и экране за счет отражения светового потока;

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

невысокое качество исходной информации на бумаге;

неравномерная и недостаточная освещенность на рабочем месте.

Наряду с перечисленными общепринятыми особенностями работы пользователя на рабочем месте ПЭВМ существуют особенности восприятия информации с экрана монитора, среди которых выделяются следующие:

экран монитора является источником света, на который в процессе работы непосредственно обращены органы зрения пользователя, что вводит оператора в другое психофизиологическое состояние;

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

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

длительная привязанность внимания пользователя к экрану монитора создает дискомфортное восприятие информации, в отличие от чтения обычной печатной информации;

экран монитора является источником падающего светового потока на органы зрения пользователя, в отличие от обычной печатной информации, которая считывается за счет отраженного светового потока;

информация на экране монитора периодически обновляется в процессе сканирования электронного луча по поверхности экрана и при низкой частоте происходит мерцание изображения, в отличие от неизменной ин формации на бумаге.

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

.2 Способы защиты пользователей от опасных и вредных факторов

.2.1 Электрическая безопасность

А) Анализ электрической опасности

Анализ электрической опасности целесообразно проводить на примере наиболее опасного двухфазного (двухполюсного) прикосновения. При этом сопротивление тела человека Rч для напряжения 5 В и выше переменного тока 50 Гц можно рассчитать по формуле:

 кОм

где Uпр - напряжение прикосновения.

В нашей стране в качестве расчётных значений приняты Rч = 1000 Ом при Uпр= 50 В и выше, при этом продолжительность воздействия тока на человека считается менее 1 с, и Rч =6000 Ом при Uпр= 36 В и менее при длительности воздействия тока более 1с.

Следует учитывать что при Uпр около 200 В всегда происходит пробой рогового слоя кожи и Rч становится равным примерно 300 Ом.

В моём рабочем помещении используются питающие напряжения 220 В, 50 Гц. Для данных условий стандарт предусматривает следующие нормы для электроустановок.

Наибольшие допустимые значения:

Нормальный режим работы. Uпр= 2 В, Iч = 0,3 мА.

Аварийный режим работы производственных электроустановок.

Таблица аварийного режима работы производственных электроустановок.

 Норм. Вели-чина

Продолжительность воздействия tс.


0,01-0,08

0,1

0,2

0,4

0,5

0,8

1,0

Более 1,0

Uпр, В

550

340

160

120

105

75

60

20

Iч, мА.

650

400

190

140

125

75

50

6


Таблица аварийного режима работы производственных электроустановок.

Нормируемая величина

Продолжительность воздействия tс.


0,01-0,08

0,1

0,2

0,4

0,5

0,8

1,0

Более 1,0

Uпр, В

220

200

100

55

50

30

25

12

Iч, мА.

220

200

100

55

50

30

25

2


Б) Необходимые меры

Рабочее помещение сухое (50 %), нежаркое (25 0С), с токонепроводящим полом, без токопроводящей пыли, отсутствует возможность одновременного прикосновения человека к имеющим соединение с землёй металлоконструкциям зданий, технологическим аппаратам, механизмам и т. п. c одной стороны и к металлическим корпусам электрооборудования, которые при пробое изоляции могут оказаться под напряжением, - с другой.

Следовательно, помещение относится к помещениям без повышенной опасности. Согласно ГОСТ 12.1.030-81 в таких помещениях защитному заземлению и занулению подлежат металлические нетоковедущие части оборудования при напряжении 380 В переменного и ³ 440 В постоянного тока. Во взрывоопасных помещениях все установки обязательно заземляются независимо от величины питающих напряжений.

Поскольку помещение без повышенной опасности и U = 220В, то металлические нетоковедущие части оборудования в заземлении и занулении не нуждаются.

.2.2 Пожарная безопасность

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

Наиболее широкое применение получили стеклянно- плавкие предохранители (СП) и малоинерционные предохранители (МП). Значение тока плавкой вставки определяют из соотношения:

вст. = (1,21 . 1,37) Iном.

где Iном - номинальное значение тока в приборе.

Инерционно-плавкие предохранители (ИП), защищают электрические цепи с большими пусковыми токами и рассчитываются по номинальному току потребителя без учёта пусковых токов:

вст. = (1,25 . 1,5) Iном.

Тугоплавкие предохранители (ТП) защищают электрические цепи только от коротких замыканий и не защищают от перегрузок:

вст. = (1,4 . 1,5) Iном.

В моём рабочем помещении применяются сетевые фильтры Pilot GL c Iвст. = 10 А. Стены здания (силикатный кирпич) относятся к несгораемым материалам. Количество эвакуационных выходов должно быть не менее двух. Допускается использование одного эвакуационного выхода, если расстояние от наиболее удалённого рабочего места до этого выхода не превышает 25 м.

По правилам ГОСТ необходимо наличие углекислотного огнетушителя. Это требование выполнено.

.2.3 Предельно допустимые значения излучений

В настоящее время весь диапазон радиочастот разбит на 3 поддиапазона: высоких частот /ВЧ/ от 60 кГц до 30 МГц, ультравысоких частот /УВЧ/ от 30 МГц до 300 МГц и от 300 МГц до 300 ГГц. Стандартом (ГОСТ 12.1.006-84) ПДУ нормируются в диапазонах ВЧ и УВЧ предельно допустимые значения напряжённости электрического поля Е /В/м/ и магнитного поля Н /А/м/, а в диапазоне СВЧ - предельно допустимая плотность потока энергии /ППЭ, Вт/м2/. Установлены следующие предельно допустимые значения Е и Н:

Е /В/м/

в диапазоне 60 кГц . 300 МГц,

в диапазоне 3 МГц . 30 МГц,

в диапазоне 30 МГц . 50 МГц,

в диапазоне 50 МГц . 300 МГц,

Н /А/м/

в диапазоне 60 кГц . 1,5 МГц,

,3 в диапазоне 30 кГц . 50МГц.

Предельно допустимую плотность потока энергии ЭМП в диапазоне частот 300 МГц . 300 ГГц на рабочих местах и в местах возможного нахождения персонала, связанного с воздействием ЭМП, устанавливают исходя из допустимого значения энергетической нагрузки на организм и времени пребывания в зоне облучения, однако во всех случаях она не должна превышать 10 Вт/м2 / 1000 мкВт/см2/, а при наличии рентгеновского излучения или высокой температуры воздуха в рабочих помещениях /выше 280С/ - 1 Вт/ м2 / 100 мкВт/см2 /.

.3 Эргономические требования к рабочему месту

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

оптимальное размещение оборудования, входящего в состав рабочего места

достаточное рабочее пространство, позволяющее осуществлять все необходимые движения и перемещения.

Эргономическими аспектами проектирования рабочих мест, в частности, являются:

высота рабочей поверхности

размеры пространства для ног

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

характеристики рабочего кресла

требования к поверхности рабочего стола

регулируемость элементов рабочего места

Главными элементами рабочего места программиста являются стол и кресло. Основным рабочим положением является положение сидя. Рабочая поза сидя вызывает минимальное утомление программиста. Рациональная планировка рабочего места предусматривает четкий порядок и постоянство размещения предметов, средств труда и документации. То, что требуется для выполнения работ чаще, расположено в зоне легкой досягаемости рабочего пространства. Моторное поле - пространство рабочего места, в котором могут осуществляться двигательные действия человека. Максимальная зона досягаемости рук - это часть моторного поля рабочего места, ограниченного дугами, описываемыми максимально вытянутыми руками при движении их в плечевом суставе. Оптимальная зона - часть моторного поля рабочего места, ограниченного дугами, описываемыми предплечьями при движении в локтевых суставах с опорой в точке локтя и с относительно неподвижным плечом.

Для комфортной работы стол должен удовлетворять следующим условиям:

высота стола должна быть выбрана с учетом возможности сидеть свободно, в удобной позе, при необходимости опираясь на подлокотники;

нижняя часть стола должна быть сконструирована так, чтобы программист мог удобно сидеть, не был вынужден поджимать ноги;

поверхность стола должна обладать свойствами, исключающими появление бликов в поле зрения программиста;

конструкция стола должна предусматривать наличие выдвижных ящиков (не менее 3 для хранения документации, листингов, канцелярских принадлежностей).

высота рабочей поверхности рекомендуется в пределах 680-760мм.

высота поверхности, на которую устанавливается клавиатура, должна быть около 650мм.

Большое значение придается характеристикам рабочего кресла. Так, рекомендуемая высота сиденья над уровнем пола находится в пределах 420-550мм. Поверхность сиденья мягкая, передний край закругленный, а угол наклона спинки - регулируемый. Положение экрана определяется: - расстоянием считывания (0,6…0,7м); - углом считывания, направлением взгляда на 20 ниже горизонтали к центру экрана, причем экран перпендикулярен этому направлению. Должна также предусматриваться возможность регулирования экрана: - по высоте +3 см; - по наклону от -10 до +20 относительно вертикали; - в левом и правом направлениях. Большое значение также придается правильной рабочей позе пользователя. При неудобной рабочей позе могут появиться боли в мышцах, суставах и сухожилиях. Требования к рабочей позе пользователя видеотерминала следующие: - голова не должна быть наклонена более чем на 20, - плечи должны быть расслаблены, - локти - под углом 80…100, - предплечья и кисти рук - в горизонтальном положении. Причина неправильной позы пользователей обусловлена следующими факторами: нет хорошей подставки для документов, клавиатура находится слишком высоко, а документы - низко, некуда положить руки и кисти, недостаточно пространство для ног. В целях преодоления указанных недостатков даются общие рекомендации:

лучше передвижная клавиатура;

должны быть предусмотрены специальные приспособления для регулирования высоты стола, клавиатуры и экрана, а также подставка для рук.

Существенное значение для производительной и качественной работы на компьютере имеют размеры знаков, плотность их размещения, контраст и соотношение яркостей символов и фона экрана. Если расстояние от глаз оператора до экрана дисплея составляет 60…80 см, то высота знака должна быть не менее 3мм, оптимальное соотношение ширины и высоты знака составляет 3:4, а расстояние между знаками 15…20% их высоты. Соотношение яркости фона экрана и символов - от 1:2 до 1:15. Во время пользования компьютером медики советуют устанавливать монитор на расстоянии 50-60 см от глаз. Специалисты также считают, что верхняя часть видеодисплея должна быть на уровне глаз или чуть ниже. Когда человек смотрит прямо перед собой, его глаза открываются шире, чем когда он смотрит вниз. За счет этого площадь обзора значительно увеличивается, вызывая обезвоживание глаз. К тому же если экран установлен высоко, а глаза широко открыты, нарушается функция моргания. Это значит, что глаза не закрываются полностью, не омываются слезной жидкостью, не получают достаточного увлажнения, что приводит к их быстрой утомляемости. Создание благоприятных условий труда и правильное эстетическое оформление рабочих мест на производстве имеет большое значение, как для облегчения труда, так и для повышения его привлекательности, положительно влияющей на производительность труда.

4. Заключение

.1 Анализ существующих систем.

Проведя анализ существующий систем, были выбраны функции, которые необходимо было реализовать, такие как:

Обеспечение согласования форматов обмена данными между интерактивным интерфейсом и трехмерными объектами

Возможность трехмерной визуализации

Возможность добавления объектов

Данные возможности наиболее часто встречаются в аналогичных программных продуктах.

.2 Обеспечение согласования форматов обмена данными между интерактивным интерфейсом и трехмерными объектами.

Для обеспечения согласования обмена данными между интерактивным интерфейсом и трехмерными объектами мы используем базу данных XML.

.3 Возможность добавления объектов.

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

4.4 Функция трехмерной визуализации

Реализация функции трехмерной визуализации основана на использовании формата данных *.x3d, который позволяет программно описать трехмерные объекты.

Исходными данными для данного алгоритма являются файлы формата *.x3d, в которых описывается каждый из объектов в отдельности.

Были разработаны вспомогательные алгоритмы, такие как:

Алгоритм создания объекта

Алгоритм выбора объекта

Алгоритм создание результирующего файла формата *.x3d

Алгоритм записи в файл формата *.x3d

5. Приложение 1. Текст программы

5.1 Блок объявления переменных

//Глубина 0 предназначена для слоя сетки

//Глубина 1 предназначена для слоя точек

//Глубина 2 предназначена для слоая рамки точки

//Глубина 3 предназначена для слоя линий

//Глубина 4 предназначена для слоя стенки

//Глубина с 5 до 10 для элементов меню

//Глубина с 20 до 100 для объектов

//Количество элементовnum:Number = 0;

//Флаг, если урл получено

var flag_url:Boolean = false;

//Флаг, если Х полученоflag_x:Boolean = false;

//Флаг, если У полученоflag_y:Boolean = false;

//Флаг возможности рисованияflag1: Boolean = true;

//Флаг выделенияflag2: Boolean = false;

//Флаг вставки объектаflag3: Boolean = false;

var wall_created:Boolean = false;

//Флаг конца рисования(когда линия замыкается)

var drawing_end: Boolean = false;

//Флаг поворотаflag_rot:Boolean = false;

// :) ??select_flag:Boolean = false;

//Флаг создания объектаcreate_obj:Boolean = false;

//Флаг установки объекта на рабочее поле

var end_drag_obj:Boolean = false;

//Флаг выделения объектаselect_obj:Boolean = false;

//Флаг нахождения объекта и готовности к выделению

var rdy_to_select:Boolean = false;selected_obj:Boolean = false;rotate_obj:Boolean = false;delete_obj:Boolean = false;

//Флаг окончания заполнения массивов из XML

var flag_xml:Boolean = false;

//Флан нахождения мыши в менюflag_onmenu:Boolean = false;border_on:Boolean = false;

//Массив точекarr_p: Array = new Array;

//Массив объектов на полеarr_objonpole:Array = new Array;

//Массив линий

var arr_l: Array = new Array;

//Шаг сеткиstep:Number = 10;

//Размер точкиw_p:Number = 5;h_p:Number = 5;x:Number;y:Number;

//Размеры рабочего поляwmax:Number = 400;

var hmax:Number = 370;wmin:Number = 40;hmin:Number = 10;center_pole_x:Number = (wmax - wmin)/20;center_pole_y:Number = (hmax - hmin)/20;

//Минимум и максимум комнатыmin_wallcoordx:Number = 0;max_wallcoordx:Number = 0;min_wallcoordy:Number = 0;max_wallcoordy:Number = 0;

//Цвет сеткиcolor_net:Number = 0xCCCCCC;

//Цвет точекcolor:Number = 0xFF2222;

//Цвет линийcolorl:Number = 0x0066CC;

//Массив координат точекarr_coordx: Array = new Array;arr_coordy: Array = new Array;

//Массив координат стенкиarr_wallcoordx: Array = new Array;arr_wallcoordy: Array = new Array;

//Идентификатор типа объектовtype_of_obj:String;

//Массивы для меню

//Массив объектов меню

var menu_obj:Array = new Array;

//Массив названия элементаmenu_items:Array = new Array;

//Массив ссылок на элементыmenu_items_src:Array = new Array;

//Массив х координат элементовmenu_items_x:Array = new Array;

//Массив у координат элементовmenu_items_y:Array = new Array;

//Массив флагов объектовmenu_obj_flag:Array = new Array;select_num:Number;old_select_num:Number;obj_on_pole:Number = 0;

var last_num:Number = 5;

//Массив и переменная, отвечающая за категорию объекта

var category:Number;arr_category:Array = new Array;

//Массив и переменная, отвечающая за выбранный объект

var arr_obj_num:Array = new Array;

var select_number:Number;

//Масивы координат созданных объектов

var arr_obj_x:Array = new Array;arr_obj_y:Array = new Array;arr_obj_w:Array = new Array;arr_obj_h:Array = new Array;

//Массив отвечающий за поворот объектаarr_rotation:Array = new Array;

var obj_rotation:Number;obj_rotation_old:Number = 0;obj_center_rot_x:Number;obj_center_rot_y:Number;obj_string:String = "";arr_obj_string:Array = new Array;file_created:Boolean = false;

//Массивы для объектов(элементов по категориям)

//Массивы для группы "Столы"tables_view:Number = 0;

var n_tables:Number = 0;n_lights:Number = 0;n_chears:Number = 0;n_beds:Number = 0;n_shkafs:Number = 0;n_athers:Number = 0;

//Флаг, отвечающий за загрузку элементовbed_flag:Boolean = false;

//Массив объектовbed_obj:Array = new Array;

//Массив названия элементаbed_items:Array = new Array;

//Массив ссылок на элементыbed_items_src:Array = new Array;

//Массив х координат элементовbed_items_x:Array = new Array;

//Массив у координат элементовbed_items_y:Array = new Array;

//Массив флагов объектовbed_obj_flag:Array = new Array;bed_items_w:Array = new Array;bed_items_h:Array = new Array;

//Флаг, отвечающий за загрузку элементовshkaf_flag:Boolean = false;

//Массив объектовshkaf_obj:Array = new Array;

//Массив названия элементаshkaf_items:Array = new Array;

//Массив ссылок на элементыshkaf_items_src:Array = new Array;

//Массив х координат элементовshkaf_items_x:Array = new Array;

//Массив у координат элементовshkaf_items_y:Array = new Array;

//Массив флагов объектовshkaf_obj_flag:Array = new Array;shkaf_items_w:Array = new Array;shkaf_items_h:Array = new Array;

//Флаг, отвечающий за загрузку элементовchear_flag:Boolean = false;

//Массив объектовchear_obj:Array = new Array;

//Массив названия элементаchear_items:Array = new Array;

//Массив ссылок на элементыchear_items_src:Array = new Array;

//Массив х координат элементовchear_items_x:Array = new Array;

//Массив у координат элементовchear_items_y:Array = new Array;

//Массив флагов объектовchear_obj_flag:Array = new Array;chear_items_w:Array = new Array;chear_items_h:Array = new Array;

//Флаг, отвечающий за загрузку элементовtable_flag:Boolean = false;

//Массив объектовtable_obj:Array = new Array;

//Массив названия элементаtype_items:Array = new Array;

//Массив ссылок на элементыtable_items_src:Array = new Array;

//Массив х координат элементовtable_items_x:Array = new Array;

//Массив у координат элементовtable_items_y:Array = new Array;

//Массив флагов объектовtable_obj_flag:Array = new Array;table_items_w:Array = new Array;table_items_h:Array = new Array;

//Флаг, отвечающий за загрузку элементовlight_flag:Boolean = false;

//Массив объектовlight_obj:Array = new Array;

//Массив названия элементаlight_items:Array = new Array;

//Массив ссылок на элементыlight_items_src:Array = new Array;

//Массив х координат элементовlight_items_x:Array = new Array;

//Массив у координат элементовlight_items_y:Array = new Array;

//Массив флагов объектовlight_obj_flag:Array = new Array;light_items_w:Array = new Array;light_items_h:Array = new Array;

//Флаг, отвечающий за загрузку элементовather_flag:Boolean = false;

//Массив объектовather_obj:Array = new Array;

//Массив названия элементаather_items:Array = new Array;

//Массив ссылок на элементыather_items_src:Array = new Array;

//Массив х координат элементовather_items_x:Array = new Array;

//Массив у координат элементовather_items_y:Array = new Array;

//Массив флагов объектовather_obj_flag:Array = new Array;ather_items_w:Array = new Array;ather_items_h:Array = new Array;

//Массив видимых объектовarr_visible:Array = new Array;arr_visible_i:Array = new Array;arr_visible_w:Array = new Array;arr_visible_h:Array = new Array;arr_visible_flag:Array = new Array;

//Флаги открытия менюtable_menu_open:Boolean = false;light_menu_open:Boolean = false;chear_menu_open:Boolean = false;beds_menu_open:Boolean = false;shkaf_menu_open:Boolean = false;ather_menu_open:Boolean = false;

//Начальное значение угла для поворотаy_st:Number = 0;

//Счетчики, используемые в программеi:Number = 1;

var k:Number = 1;select:Number;

//Количество точек стенкеwall_i:Number = 1;

var i_but:Number = 5;

//Необходимые клипы

_root.createEmptyMovieClip("grid", 0);

_root.createEmptyMovieClip("points", 1);

_root.createEmptyMovieClip("borderlayer", 2);

_root.createEmptyMovieClip("linelayer", 3);

_root.createEmptyMovieClip("roomlayer", 4);

_root.createEmptyMovieClip("walllayer", 5);

_root.createEmptyMovieClip("tempobj", 30);

_root.createEmptyMovieClip("selectpixl", 100);

_root.createEmptyMovieClip("borderobj", 101);

//Подключаем классmenuXml;bedsXml;shkafXml;chearXml;tableXml;lightsXml;atherXml;objXml;

// создаем экземпляр - объект myxml

//var myxml:menuXml = new menuXml('menuitems.xml');menu:menuXml = new menuXml('xmls/menuitems.xml');bed:bedsXml = new bedsXml('xmls/beditems.xml');shkaf:shkafXml = new shkafXml('xmls/shkafitems.xml');chear:chearXml = new chearXml('xmls/chearitems.xml');table:tableXml = new tableXml('xmls/tableitems.xml');light:lightsXml = new lightsXml('xmls/lightitems.xml');ather:atherXml = new atherXml('xmls/atheritems.xml');objx3d:XML = new XML();outvar:LoadVars = new LoadVars();invar:LoadVars = new LoadVars();

.2 Блок синтаксического анализатора базы данных

mx.utils.Delegate; // подключаем Delegate classatherXml {file:String; // адрес xml-файлаvar _xml:XML = null; // загруженный объект xml

public var _data:Object = null; // результирующий объект с данными

public var lenght:Number = 0;var succ:Boolean = false;var end_parse:Boolean = false;

// Конструктор классаfunction atherXml(f:String) {.file = f;._xml = new XML(); // создаем объект xml

// игнорировать текстовые узлы состоящие из пробелов._xml.ignoreWhite = true;

// указываем облость действия обработчику

this._xml.onLoad = Delegate.create(this, xmlParser);._xml.load(this.file); // начинаем загрузку xml-документа

}function xmlParser(success):Void {

// метод Лоад возвращает успешность загрузки, флаг(success) {._data = new Object(); // инициализация объекта с даннымиgroup = this._xml.firstChild.firstChild; // указатель на первый элемент(group) { // в цикле проходим по всем элементам

var elem_num = group.attributes.elem_num;._data[elem_num] = new Object();._data[elem_num]['gr_name'] = group.attributes.gr_name;._data[elem_num]['items'] = new Object;

var item = group.firstChild; // первый ребенок группы

while(item) { // цикл по детямprop_num = item.attributes.prop_num;._data[elem_num]['items'][prop_num] = new Object();._data[elem_num]['items'][prop_num]['name'] = item.attributes.name;._data[elem_num]['items'][prop_num]['description'] = item.firstChild.nodeValue;= item.nextSibling;

}= group.nextSibling;

lenght = lenght + 1;

}

}

// функция для использования полученных данных

_root.parseather(success);_parse = true;

}

}

.3 Блок основной программы

();();

_root.onMouseDown = function () {= _xmouse;

y = _ymouse;

//Если происходит попытка поставить точку вне зоны рисования,

//то срабатывает миханизм отключения рисования

if ((x + (w_p/2) > wmax) or (y + (h_p/2) > hmax) or (drawing_end) or (x - (w_p/2) < wmin) or (y - (h_p/2) < hmin)) {= false;

};

//Если происходит попытка поставить точку в зоне рисования,

//то срабатывает миханизм включения рисования(((x + (w_p/2) < wmax) && (y + (h_p/2) < hmax) && (x - (w_p/2) > wmin) && (y - (h_p/2) > hmin))&&(!flag2)&&(!drawing_end)&&(!create_obj)) {= true;

};

// При нажатии на левую кнопку мыши в зоне рисования ставим точку

if (flag1) {_coordx[i] = Math.floor((x + step/2)/step)*step;_coordy[i] = Math.floor((y + step/2)/step)*step;

//Если коокдинаты точки соответствуют координатам начальной точки, то линия замыкается

//и рисование перестает быть возможным((arr_coordx[i] == arr_coordx[1])&&(arr_coordy[i] == arr_coordy[1]) && (i != 1)) {

drawlastline(i);_end = true;_obj[2]._alpha = 50;_obj[2].enabled = false;_obj[3]._alpha = 100;_obj[3].enabled = true;

} else {

// Рисуем непосредственно точку_obj[1]._alpha = 100;

menu_obj[1].enabled = true;_p[i] = points.createEmptyMovieClip("mc"+i,i);(arr_p[i], color);_p[i]._x = arr_coordx[i] - w_p/2;_p[i]._y = arr_coordy[i] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;(i!= 1) {(i);

};= i + 1;

};

};

//Если координаты мыши соответствуют координатам точки, то вокруг этой точки

//рисуется рамка и происходит выделение(flag2) {

x_temp = Math.floor((x + step/2)/step)*step;_temp = Math.floor((y + step/2)/step)*step;(var n=1; n<=i-1; n++) {((x_temp == arr_coordx[n]) && (y_temp == arr_coordy[n])) {_flag = true;= n;(n, w_p, h_p);

arr_p[n].startDrag();

};

};

//Блок установки объекта в облости рисования

if ((x <= max_wallcoordx)&&(x>=min_wallcoordx)&&(y >= min_wallcoordy)&&(y <= max_wallcoordy)&&(create_obj)) {.stopDrag();_on_pole += 1;.duplicateMovieClip("obj" + obj_on_pole, 30 + obj_on_pole);.clear();_category[obj_on_pole] = category;_obj_num[obj_on_pole] = arr_visible_i[select_number];_obj_x[obj_on_pole] = (_root["obj" + obj_on_pole]._x)/10 - wmin/10 - center_pole_x;_obj_y[obj_on_pole] = (_root["obj" + obj_on_pole]._y)/10 - hmin/10 - center_pole_y;_obj_w[obj_on_pole] = arr_visible_w[select_number];_obj_h[obj_on_pole] = arr_visible_h[select_number];_center_rot_x = _root["obj" + obj_on_pole]._x;_center_rot_y = _root["obj" + obj_on_pole]._y;_rotation[obj_on_pole] = 0;cat_name = arr_category[obj_on_pole];(obj_on_pole);d.load("objx3d/"+"obj" + cat_name + "_" + arr_obj_num[obj_on_pole] + ".x3d");d.onLoad = function(success:Boolean){(success){_obj_string[obj_on_pole] = objx3d.toString();// converts dots XML object to a string and stores it in dotsToXMLString.

} else{("Could not load XML");

}

}_obj = false;_obj[4].enabled = true;_obj[4]._alpha = 100;_obj[15].enabled = true;_obj[15]._alpha = 100;_obj[16].enabled = true;_obj[16]._alpha = 100;_obj[17].enabled = true;_obj[17]._alpha = 100;_obj[18].enabled = false;_obj[18]._alpha = 50;

};((rdy_to_select)&&(!rotate_obj)) {.stopDrag();

_root["obj" + select_num].startDrag();

_root["obj" + select_num]._alpha = 50;_obj = false;_to_select = false;_obj = true;

};((rdy_to_select)&&(rotate_obj)) {.stopDrag();(select_num != old_select_num) {_rotation_old = 0;

};(obj_rotation_old);_temp = _xmouse;_temp = _ymouse;_obj = false;_to_select = false;_obj = true;

};(flag_xml) {

//Включение режима выделения(menu_obj_flag[1]) {= true;.clear();

};

//Включения режима рисования

if (menu_obj_flag[2]) {= false;.clear();

};

//Рисование стенки(menu_obj_flag[3]) {_created = true;();();_obj[1].enabled = false;_obj[1]._alpha = 50;(table_flag) {(var n_i = 1; n_i <= n_tables; n_i++) {_obj[n_i]._alpha = 100;_obj[n_i].enabled = true;

};

};

};

//Обработка поворотной кнопки(menu_obj_flag[4]) {._x = _xmouse;._y = _ymouse;.startDrag();_obj = true;_obj = true;

};((menu_obj_flag[15])&&(obj_on_pole != 0)) {_string = "<X3D><Scane><Group><Viewpoint centerOfRotation" + chr(61) + chr(34) + "0 0 0" + chr(34) + "/>";(var n_i = 1; n_i <= obj_on_pole; n_i++) {_string = obj_string + "<Transform translation" + chr(61) + chr(34) + int((arr_obj_x[n_i])*10)/10 + " " + int((arr_obj_y[n_i])*10)/10 + " " + "0" + chr(34) + " " + "rotation" + chr(61) + chr(34) + "0 0 " + int((arr_rotation[n_i])*100)/100 + " " + "1" + chr(34) + ">";_string = obj_string + arr_obj_string[n_i];(n_i != obj_on_pole) {_string = obj_string + "</Transform></Group><Group>";

}(arr_obj_x[n_i]);(arr_obj_y[n_i]);(arr_rotation[n_i]);

};_string = obj_string + "</Transform></Group></Scane></X3D>"_obj_flag[15] = false;(obj_string);= obj_string;("writetofile.php", "", "POST");("writetofile.php", "_blank")_created = true;_obj[15].enabled = false;_obj[15]._alpha = 50;_obj[18].enabled = true;_obj[18]._alpha = 100;

};(menu_obj_flag[17]) {._x = _xmouse;._y = _ymouse;.startDrag();_obj = true;

};(menu_obj_flag[18]) {

getURL("rdyroom.x3d", _blank);

};

//Обнуление элементов (очистка рабочего поля, обнуление исходных данных)

if (menu_obj_flag[5]) {(var n_i = 1; n_i <= obj_on_pole; n_i = n_i + 1) {

_root["obj" + n_i].removeMovieClip();_obj_string[n_i] = "";_cotegory[n_i] = undefined;_obj_num[n_i] = undefined;_number = undefined;_obj_x[n_i] = undefined;_obj_y[n_i] = undefined;_rotation[n_i] = 0;_rotation = undefined_rotation_old = undefined;_center_rot_x = undefined;_center_rot_y = undefined;

};(var n_i = 1; n_i <= i; n_i++) {_p[n_i].clear();_l[n_i].clear();_coordx[n_i] = null;_coordy[n_i] = null;

};(var n_i = 1; n_i <= wall_i; n_i++) {_wallcoordx[n_i] = null;_wallcoordy[n_i] = null;

};._visible = false;_obj = false;_obj = false;_to_select = false;.clear();.clear();.clear();= false;= false;= false;_end = false;_created = false;_rotation_old = 0;_rotation = 0;_on_pole = 0;= 1;= 1;_i = 1;_obj[1]._alpha = 50;_obj[1].enabled = false;_obj[2]._alpha = 100;_obj[2].enabled = true;_obj[3]._alpha = 50;_obj[3].enabled = false;_obj[4]._alpha = 50;_obj[4].enabled = false;_obj[15]._alpha = 50;_obj[15].enabled = false;_obj[16]._alpha = 50;_obj[16].enabled = false;_obj[17]._alpha = 50;_obj[17].enabled = false;_obj[18]._alpha = 50;_obj[18].enabled = false;

}(menu_obj_flag[6]) {(type_of_obj == "bed") {(bed_items_x, bed_items_y, bed_items_src, arr_visible, bed_obj_flag, 23, bed_items_w, bed_items_h);

};(type_of_obj == "tabel") {(table_items_x, table_items_y, table_items_src, arr_visible, table_obj_flag, 23, table_items_w, table_items_h);

};(type_of_obj == "shkaf") {(shkaf_items_x, shkaf_items_y, shkaf_items_src, arr_visible, shkaf_obj_flag, 23, shkaf_items_w, shkaf_items_h);

};(type_of_obj == "chear") {(chear_items_x, chear_items_y, chear_items_src, arr_visible, chear_obj_flag, 23, chear_items_w, chear_items_h);

};(type_of_obj == "light") {(light_items_x, light_items_y, light_items_src, arr_visible, light_obj_flag, 23, light_items_w, light_items_h);

};(type_of_obj == "ather") {(ather_items_x, ather_items_y, ather_items_src, arr_visible, ather_obj_flag, 23, ather_items_w, ather_items_h);

};

};(menu_obj_flag[7]) {(type_of_obj == "bed") {(bed_items_x, bed_items_y, bed_items_src, arr_visible, bed_obj_flag, 23, bed_items_w, bed_items_h);

};(type_of_obj == "tabel") {(table_items_x, table_items_y, table_items_src, arr_visible, table_obj_flag, 23, table_items_w, table_items_h);

};(type_of_obj == "shkaf") {(shkaf_items_x, shkaf_items_y, shkaf_items_src, arr_visible, shkaf_obj_flag, 23, shkaf_items_w, shkaf_items_h);

};(type_of_obj == "chear") {(chear_items_x, chear_items_y, chear_items_src, arr_visible, chear_obj_flag, 23, chear_items_w, chear_items_h);

};(type_of_obj == "light") {(light_items_x, light_items_y, light_items_src, arr_visible, light_obj_flag, 23, light_items_w, light_items_h);

};(type_of_obj == "ather") {(ather_items_x, ather_items_y, ather_items_src, arr_visible, ather_obj_flag, 23, ather_items_w, ather_items_h);

};

};(menu_obj_flag[8]) {= 1;(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(ather_menu_open) {_menu_open = false;

};_of_obj = "bed";(bed_items_x, bed_items_y, bed_items_src, arr_visible, bed_obj_flag, 23, bed_items_w, bed_items_h);(!bed_menu_open) {_obj[9]._y += 40*5 + 10*5 + 20;_obj[10]._y += 40*5 + 10*5 + 20;_obj[11]._y += 40*5 + 10*5 + 20;_obj[12]._y += 40*5 + 10*5 + 20;_obj[13]._y += 40*5 + 10*5 + 20;_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 297;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 297;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[8]._x - 25;_obj[14]._y = menu_obj[8]._y + 4;

};_menu_open = true;

}(menu_obj_flag[9]) {= 2;(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(ather_menu_open) {_menu_open = false;

};_of_obj = "tabel";(table_items_x, table_items_y, table_items_src, arr_visible, table_obj_flag, 23, table_items_w, table_items_h);(!table_menu_open) {_obj[10]._y += 40*5 + 10*5 + 20;_obj[11]._y += 40*5 + 10*5 + 20;_obj[12]._y += 40*5 + 10*5 + 20;_obj[13]._y += 40*5 + 10*5 + 20;_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 332;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 332;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[9]._x - 25;_obj[14]._y = menu_obj[9]._y + 4;

};_menu_open = true;

}(menu_obj_flag[10]) {= 3;(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(ather_menu_open) {_menu_open = false;

};_of_obj = "shkaf";(shkaf_items_x, shkaf_items_y, shkaf_items_src, arr_visible, shkaf_obj_flag, 23, shkaf_items_w, shkaf_items_h);(!shkaf_menu_open) {_obj[11]._y += 40*5 + 10*5 + 20;_obj[12]._y += 40*5 + 10*5 + 20;_obj[13]._y += 40*5 + 10*5 + 20;_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 367;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 367;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[10]._x - 25;_obj[14]._y = menu_obj[10]._y + 4;

};_menu_open = true;

}(menu_obj_flag[11]) {= 4;(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(ather_menu_open) {_menu_open = false;

};_of_obj = "chear";(chear_items_x, chear_items_y, chear_items_src, arr_visible, chear_obj_flag, 23, chear_items_w, chear_items_h);(!chear_menu_open) {_obj[12]._y += 40*5 + 10*5 + 20;_obj[13]._y += 40*5 + 10*5 + 20;_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 402;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 402;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[11]._x - 25;_obj[14]._y = menu_obj[11]._y + 4;

};_menu_open = true;

}(menu_obj_flag[12]) {= 5;(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(ather_menu_open) {_menu_open = false;

};_of_obj = "light";(light_items_x, light_items_y, light_items_src, arr_visible, table_obj_flag, 23, light_items_w, light_items_h);(!light_menu_open) {_obj[13]._y += 40*5 + 10*5 + 20;_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 437;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 437;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[12]._x - 25;_obj[14]._y = menu_obj[12]._y + 4;

};_menu_open = true;

}(menu_obj_flag[13]) {= 6;(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;_menu_open = false;

};_of_obj = "ather";(ather_items_x, ather_items_y, ather_items_src, arr_visible, ather_obj_flag, 23, ather_items_w, ather_items_h);(!ather_menu_open) {_obj[6]._alpha = 100;_obj[6].enabled = true;_obj[6]._x = 530;_obj[6]._y = 472;_obj[7]._alpha = 100;_obj[7].enabled = true;_obj[7]._x = 450;_obj[7]._y = 472;_obj[14]._alpha = 100;_obj[14].enabled = true;_obj[14]._x = menu_obj[13]._x - 25;_obj[14]._y = menu_obj[13]._y + 4;

};_menu_open = true;

}(menu_obj_flag[14]) {_obj[14]._alpha = 0;_obj[14].enabled = false;(var n_i=1; n_i<=5;n_i++) {_visible_i[n_i] = undefined;_visible_w[n_i] = undefined;_visible_h[n_i] = undefined;

};(bed_menu_open) {_obj[9]._y -= 40*5 + 10*5 + 20;_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};(table_menu_open) {_obj[10]._y -= 40*5 + 10*5 + 20;_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};(shkaf_menu_open) {_obj[11]._y -= 40*5 + 10*5 + 20;_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};(chear_menu_open) {_obj[12]._y -= 40*5 + 10*5 + 20;_obj[13]._y -= 40*5 + 10*5 + 20;(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};(light_menu_open) {_obj[13]._y -= 40*5 + 10*5 + 20;(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};(ather_menu_open) {(var n_i = 1; n_i <=5; n_i++) {_visible[n_i].removeMovieClip();

};_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_menu_open = false;

};

}((arr_visible_flag[1])&&(wall_created)) {_number = 1;(arr_visible_w, arr_visible_h);

};((arr_visible_flag[2])&&(wall_created)) {_number = 2;(arr_visible_w, arr_visible_h);

};((arr_visible_flag[3])&&(wall_created)) {_number = 3;(arr_visible_w, arr_visible_h);

};((arr_visible_flag[4])&&(wall_created)) {_number = 4;(arr_visible_w, arr_visible_h);

};((arr_visible_flag[5])&&(wall_created)) {_number = 5;(arr_visible_w, arr_visible_h);

};

}

};

_root.onMouseUp = function () {= _xmouse;

y = _ymouse;

//Если перетаскивается объект (select_flag), то данный фрагмент его отпускает

if ((selected_obj)&&(!rotate_obj)) {

_root["obj" + select_num]._alpha = 100;(select_num)

_root["obj" + select_num].stopDrag();_obj_x[select_num] = (_root["obj" + select_num]._x)/10 - wmin/10 - center_pole_x;_obj_y[select_num] = (_root["obj" + select_num]._y)/10 - hmin/10 - center_pole_y;_center_rot_x = _root["obj" + obj_on_pole]._x;_center_rot_y = _root["obj" + obj_on_pole]._y;();(arr_obj_x[select_num]);(arr_obj_y[select_num]);_obj = false;_obj = false;.clear();

};((selected_obj)&&(rotate_obj)) {_rotation_old = obj_rotation_old + obj_rotation;(obj_rotation_old >= 360) {_rotation_old = obj_rotation_old - 360;

};_rotation[select_num] = obj_rotation_old * 0.0173;_obj = false;_obj = false;_obj = false;.clear();_select_num = select_num;

};(select_flag) {_p[select].stopDrag();_coordx[select] = Math.floor((x + step/2)/step)*step;_coordy[select] = Math.floor((y + step/2)/step)*step;_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;_flag = false;

};

};

_root.onMouseMove = function () {

//При выделенной точке и перемещении курсора мыши перемещается сама

//точка, рамка выделения, а также перерисовываются линии, входящие в эту точку

if (select_obj) {();

};((selected_obj)&&(rotate_obj)) {_rotation = (y_temp - _ymouse)/Math.PI*180 / 10;._rotation = obj_rotation + obj_rotation_old;

_root["obj" + select_num]._rotation = obj_rotation + obj_rotation_old;

};

_root.menu_obj[1].onRollOver = function () {_obj_flag[1] = true;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[2].onRollOver = function () {_obj_flag[2] = true;_obj_flag[1] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[3].onRollOver = function () {_obj_flag[3] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[4].onRollOver = function () {_obj_flag[4] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[5].onRollOver = function () {_obj_flag[5] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[6].onRollOver = function () {_obj_flag[6] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[7].onRollOver = function () {_obj_flag[7] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[8].onRollOver = function () {_obj_flag[8] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[9].onRollOver = function () {_obj_flag[9] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[10].onRollOver = function () {_obj_flag[10] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[11].onRollOver = function () {_obj_flag[11] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[12].onRollOver = function () {_obj_flag[12] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[13].onRollOver = function () {_obj_flag[13] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[14].onRollOver = function () {_obj_flag[14] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[15].onRollOver = function () {_obj_flag[15] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[16] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[16].onRollOver = function () {_obj_flag[16] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[17] = false;_obj_flag[18] = false;

}

_root.menu_obj[17].onRollOver = function () {_obj_flag[17] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[18] = false;

}

_root.menu_obj[18].onRollOver = function () {_obj_flag[18] = true;_obj_flag[1] = false;_obj_flag[2] = false;_obj_flag[3] = false;_obj_flag[4] = false;_obj_flag[5] = false;_obj_flag[6] = false;_obj_flag[7] = false;_obj_flag[8] = false;_obj_flag[9] = false;_obj_flag[10] = false;_obj_flag[11] = false;_obj_flag[12] = false;_obj_flag[13] = false;_obj_flag[14] = false;_obj_flag[15] = false;_obj_flag[16] = false;_obj_flag[17] = false;

}

//Флаги объектов(включение)

_root.arr_visible[1].onRollOver = function () {_visible_flag[1] = true;_visible_flag[2] = false;_visible_flag[3] = false;_visible_flag[4] = false;_visible_flag[5] = false;

}

_root.arr_visible[2].onRollOver = function () {_visible_flag[1] = false;_visible_flag[2] = true;_visible_flag[3] = false;_visible_flag[4] = false;_visible_flag[5] = false;

}

_root.arr_visible[3].onRollOver = function () {_visible_flag[1] = false;_visible_flag[2] = false;_visible_flag[3] = true;_visible_flag[4] = false;_visible_flag[5] = false;

}

_root.arr_visible[4].onRollOver = function () {_visible_flag[1] = false;_visible_flag[2] = false;_visible_flag[3] = false;_visible_flag[4] = true;_visible_flag[5] = false;

}

_root.arr_visible[5].onRollOver = function () {_visible_flag[1] = false;_visible_flag[2] = false;_visible_flag[3] = false;_visible_flag[4] = false;

arr_visible_flag[5] = true;

}

//Отслеживание выхода за пределы кнопки

_root.menu_obj[1].onRollOut = function () {_obj_flag[1] = false;

}

_root.menu_obj[2].onRollOut = function () {_obj_flag[2] = false;

}

_root.menu_obj[3].onRollOut = function () {_obj_flag[3] = false;

}

_root.menu_obj[4].onRollOut = function () {_obj_flag[4] = false;

}

_root.menu_obj[5].onRollOut = function () {_obj_flag[5] = false;

}

_root.menu_obj[6].onRollOut = function () {_obj_flag[6] = false;

}

_root.menu_obj[7].onRollOut = function () {_obj_flag[7] = false;

}

_root.menu_obj[8].onRollOut = function () {_obj_flag[8] = false;

}

_root.menu_obj[9].onRollOut = function () {_obj_flag[9] = false;

}

_root.menu_obj[10].onRollOut = function () {_obj_flag[10] = false;

}

_root.menu_obj[11].onRollOut = function () {_obj_flag[11] = false;

}

_root.menu_obj[12].onRollOut = function () {_obj_flag[12] = false;

}

_root.menu_obj[13].onRollOut = function () {_obj_flag[13] = false;

}

_root.menu_obj[14].onRollOut = function () {_obj_flag[14] = false;

}

_root.menu_obj[15].onRollOut = function () {_obj_flag[15] = false;

}

_root.menu_obj[16].onRollOut = function () {_obj_flag[16] = false;

}

_root.menu_obj[17].onRollOut = function () {_obj_flag[17] = false;

}

_root.menu_obj[18].onRollOut = function () {

menu_obj_flag[18] = false;

}

//Флаги объектов (выключение)

_root.arr_visible[1].onRollOut = function () {_visible_flag[1] = false;

}

_root.arr_visible[2].onRollOut = function () {_visible_flag[2] = false;

}

_root.arr_visible[3].onRollOut = function () {_visible_flag[3] = false;

}

_root.arr_visible[4].onRollOut = function () {_visible_flag[4] = false;

}

_root.arr_visible[5].onRollOut = function () {

arr_visible_flag[5] = false;

}

//Если была нажата кнопка "Перетащить", то выделяется точка, и начинается перетаскивание

//с перересовкой линий, связанных с этой точкой

if (select_flag) {.clear();= _xmouse;= _ymouse;_coordx[select] = Math.floor((x + step/2)/step)*step;_coordy[select] = Math.floor((y + step/2)/step)*step;(select == 1) {_coordx[i] = arr_coordx[1];_coordy[i] = arr_coordy[1];_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;

} else {_p[select]._x = arr_coordx[select] - w_p/2;_p[select]._y = arr_coordy[select] - h_p/2;_coordx[select] = arr_p[select]._x + w_p/2;_coordy[select] = arr_p[select]._y + h_p/2;

};(select);(select, w_p, h_p);

};

};

//Функция для нахождения sortcoordofwall():Void {_wallcoordx = arr_wallcoordx[1];_wallcoordx = arr_wallcoordx[1];_wallcoordy = arr_wallcoordy[1];_wallcoordy = arr_wallcoordy[1];(var n_i = 1; n_i <= wall_i-1; n_i=n_i+1) {

//Нахождение максимумов(max_wallcoordx < arr_wallcoordx[n_i+1]) {_wallcoordx = arr_wallcoordx[n_i+1];

};(max_wallcoordy < arr_wallcoordy[n_i+1]) {_wallcoordy = arr_wallcoordy[n_i+1];

};

//Нахождение минимумов(min_wallcoordx > arr_wallcoordx[n_i+1]) {_wallcoordx = arr_wallcoordx[n_i+1];

};(min_wallcoordy > arr_wallcoordy[n_i+1]) {_wallcoordy = arr_wallcoordy[n_i+1];

};

};

};

//Функция заполнения массивов из данных XML;

function parsemenu(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in menu._data) {= parseFloat(elem_num);_of_obj = menu._data[elem_num]['gr_name'];(type_of_obj == "menu") {_flag = true;(menu, 5, elem_num, menu_items, menu_items_src, menu_items_x, menu_items_y, menu_obj, menu_obj_flag);_obj[1]._alpha = 50;_obj[1].enabled = false;_obj[2]._alpha = 100;_obj[2].enabled = true;_obj[3]._alpha = 50;_obj[3].enabled = false;_obj[4]._alpha = 50;_obj[4].enabled = false;_obj[5]._alpha = 100;_obj[5].enabled = true;_obj[6]._alpha = 0;_obj[6].enabled = false;_obj[7]._alpha = 0;_obj[7].enabled = false;_obj[14]._alpha = 0;_obj[14].enabled = false;_obj[15]._alpha = 50;_obj[15].enabled = false;_obj[16]._alpha = 50;_obj[16].enabled = false;_obj[17]._alpha = 50;_obj[17].enabled = false;_obj[18]._alpha = 50;_obj[18].enabled = false;

};

};_xml = true;

};= 0;

};parsebeds(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in bed._data) {= parseFloat(elem_num);_of_obj = bed._data[elem_num]['gr_name'];(type_of_obj == "bed") {_beds = n_beds + 1;_flag = true;(bed, 23, n_beds, bed_items, bed_items_src, bed_items_x, bed_items_y, bed_obj, bed_obj_flag, bed_items_w, bed_items_h);

};

};_xml = true;

};

};parseshkaf(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in shkaf._data) {= parseFloat(elem_num);_of_obj = shkaf._data[elem_num]['gr_name'];(type_of_obj == "shkaf") {_shkafs = n_shkafs + 1;_flag = true;(shkaf, 23, n_shkafs, shkaf_items, shkaf_items_src, shkaf_items_x, shkaf_items_y, shkaf_obj, shkaf_obj_flag, shkaf_items_w, shkaf_items_h);

};

};_xml = true;

};

};parsechear(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in chear._data) {= parseFloat(elem_num);_of_obj = chear._data[elem_num]['gr_name'];(type_of_obj == "chear") {_chears = n_chears + 1;_flag = true;(chear, 23, n_chears, chear_items, chear_items_src, chear_items_x, chear_items_y, chear_obj, chear_obj_flag, chear_items_w, chear_items_h);

};

};_xml = true;

};

};parsetable(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in table._data) {= parseFloat(elem_num);_of_obj = table._data[elem_num]['gr_name'];(type_of_obj == "tabel") {_tables = n_tables + 1;_flag = true;(table, 23, n_tables, table_items, table_items_src, table_items_x, table_items_y, table_obj, table_obj_flag, table_items_w, table_items_h);

};

};_xml = true;

};

};parselights(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in light._data) {= parseFloat(elem_num);_of_obj = light._data[elem_num]['gr_name'];(type_of_obj == "light") {_lights = n_lights + 1;_flag = true;(light, 23, n_lights, light_items, light_items_src, light_items_x, light_items_y, light_obj, light_obj_flag, light_items_w, light_items_h);

};

};_xml = true;

};

};parseather(succ:Boolean):Void {

if (!succ) {('Возникла ошибка при попытке загрузить xml');

}else {

// распечатываем наш объект с помощью двух вложенных циклов

for (var elem_num in ather._data) {= parseFloat(elem_num);_of_obj = ather._data[elem_num]['gr_name'];(type_of_obj == "ather") {_athers = n_athers + 1;_flag = true;(ather, 23, n_athers, ather_items, ather_items_src, ather_items_x, ather_items_y, ather_obj, ather_obj_flag, ather_items_w, ather_items_h);

};

};_xml = true;

};

};

//Блок разбора базы(Универсальный парсер)

// in_k - величина смещения глубины(для того, чтобы мувики не попадали друг на друга)

// num_in - номер элемента(elem_num)

// type_in - тип элемента (меню, стол, стул, лампа)(menu_items)

// url_in - ссылка на картинку элемента(menu_items_src)

// x_in - координата х объекта(menu_items_x)

// y_in - координата y объекта(menu_items_y)

// obj_in - мувиклип, в котором содержиться объект(menu_obj)

// obj_flag - флаг объекта(menu_obj_flag)

function unisersalPars(in_xml:menuXml, in_k:Number, num_in:String, type_in:Array, url_in:Array, x_in:Array, y_in:Array, obj_in:Array, obj_flag:Array, w_in:Array, h_in:Array) {(var prop_num in in_xml._data[num_in]['items']) {

//Если имя параметра URL, то оно записывается в массив URL

if (in_xml._data[num_in]['items'][prop_num]['name'] == "url") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_url = true;

}

//Если имя параметра X, то оно записывается в массив X

if (in_xml._data[num_in]['items'][prop_num]['name'] == "x") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_x = true;

}

//Если имя параметра Y, то оно записывается в массив Y

if (in_xml._data[num_in]['items'][prop_num]['name'] == "y") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_y = true;

}

//Если имя параметра W, то оно записывается в массив W

if (in_xml._data[num_in]['items'][prop_num]['name'] == "w") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];

flag_w = true;

}

//Если имя параметра H, то оно записывается в массив H

if (in_xml._data[num_in]['items'][prop_num]['name'] == "h") {_in[num] = in_xml._data[num_in]['items'][prop_num]['description'];_h = true;

}((flag_url) && (flag_x) && (flag_y)) {(x_in, y_in, url_in, obj_in, obj_flag, in_k);

};

};

};

//Функция частиного вывода объектовpartview(x_in_i:Array, y_in_i:Array, url_in_i:Array, obj_in_i:Array, obj_flag_i:Array, in_k_i:Number, w_in_i:Array, h_in_i:Array) : Void {(type_of_obj == "menu") {= type_of_obj + num;_in_i[num] = _root.createEmptyMovieClip(name, num+in_k_i);(url_in_i[num], obj_in_i[num]);_in_i[num]._x = parseFloat(x_in_i[num]);_in_i[num]._y = parseFloat(y_in_i[num]);_flag_i[num] = false;_in_i[num]._alpha = 100;_in_i[num].enabled = false;_url = false;_x = false;_y = false;

};(type_of_obj == "bed") {((menu_obj_flag[8])&&(!bed_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_beds - n_i + 1], obj_in_i[n_i]);_visible_i[n_i] = n_beds - n_i + 1;_visible_w[n_i] = w_in_i[n_beds - n_i + 1];_visible_h[n_i] = h_in_i[n_beds - n_i + 1];(last_num == 0) {_in_i[n_i]._y = menu_obj[8]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_beds - n_i + 1]);

} else {_in_i[n_i]._y = menu_obj[8]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_beds - n_i + 1]);

};((x_in_i[n_beds - n_i] != 0)&&(last_num <n_beds - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(bed_menu_open)&&(last_num < n_beds)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_beds - n_i + 1] != undefined) {(url_in_i[n_beds - (n_i + buf_last) + 1], obj_in_i[n_i]);

_visible_i[n_i] = n_beds - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_beds - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_beds - (n_i + buf_last) + 1];

}((x_in_i[n_beds - (n_i + buf_last) + 1] != 0)&&(last_num <n_beds)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(bed_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_beds - n_i + 1] != undefined) {(url_in_i[n_beds - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_beds - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_beds - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_beds - (buf_last - n_i)];

}((x_in_i[n_tables - (buf_last - n_i)] != 0)&&(last_num <= n_beds)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;_y = false;

} else {_in_i[n_i]._y = menu_obj[9]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_tables - n_i + 1]);

};((x_in_i[n_tables - n_i] != 0)&&(last_num <n_tables - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(table_menu_open)&&(last_num < n_tables)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_tables - n_i + 1] != undefined) {(url_in_i[n_tables - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_tables - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_tables - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_tables - (n_i + buf_last) + 1];

}((x_in_i[n_tables - (n_i + buf_last) + 1] != 0)&&(last_num <n_tables)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(table_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_tables - n_i + 1] != undefined) {(url_in_i[n_tables - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_tables - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_tables - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_tables - (buf_last - n_i)];

}((x_in_i[n_tables - (buf_last - n_i)] != 0)&&(last_num <= n_tables)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;_y = false;

};(type_of_obj == "shkaf") {((menu_obj_flag[10])&&(!shkaf_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_shkafs - n_i + 1], obj_in_i[n_i]);_visible_i[n_i] = n_shkafs - n_i + 1;_visible_w[n_i] = w_in_i[n_shkafs - n_i + 1];_visible_h[n_i] = h_in_i[n_shkafs - n_i + 1];(last_num == 0) {_in_i[n_i]._y = menu_obj[10]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_shkafs - n_i + 1]);

} else {_in_i[n_i]._y = menu_obj[10]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_shkafs - n_i + 1]);

};((x_in_i[n_shkafs - n_i] != 0)&&(last_num <n_shkafs - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(shkaf_menu_open)&&(last_num < n_shkafs)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_shkafs - n_i + 1] != undefined) {(url_in_i[n_shkafs - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_shkafs - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_shkafs - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_shkafs - (n_i + buf_last) + 1];

}((x_in_i[n_shkafs - (n_i + buf_last) + 1] != 0)&&(last_num <n_shkafs)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(shkaf_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_shkafs - n_i + 1] != undefined) {(url_in_i[n_shkafs - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_shkafs - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_shkafs - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_shkafs - (buf_last - n_i)];

}((x_in_i[n_shkafs - (buf_last - n_i)] != 0)&&(last_num <= n_shkafs)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;_y = false;

};(type_of_obj == "chear") {((menu_obj_flag[11])&&(!chear_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_chears - n_i + 1], obj_in_i[n_i]);_visible_i[n_i] = n_chears - n_i + 1;_visible_w[n_i] = w_in_i[n_chears - n_i + 1];_visible_h[n_i] = h_in_i[n_chears - n_i + 1];(last_num == 0) {_in_i[n_i]._y = menu_obj[11]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_chears - n_i + 1]);

} else {_in_i[n_i]._y = menu_obj[11]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_chears - n_i + 1]);

};((x_in_i[n_chears - n_i] != 0)&&(last_num <n_chears - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(chear_menu_open)&&(last_num < n_chears)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_chears - n_i + 1] != undefined) {(url_in_i[n_chears - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_chears - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_chears - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_chears - (n_i + buf_last) + 1];

}((x_in_i[n_chears - (n_i + buf_last) + 1] != 0)&&(last_num <n_chears)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(chear_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_chears - n_i + 1] != undefined) {(url_in_i[n_chears - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_chears - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_chears - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_chears - (buf_last - n_i)];

}((x_in_i[n_chears - (buf_last - n_i)] != 0)&&(last_num <= n_chears)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;_y = false;

};(type_of_obj == "light") {((menu_obj_flag[12])&&(!light_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_lights - n_i + 1], obj_in_i[n_i]);_visible_i[n_i] = n_lights - n_i + 1;_visible_w[n_i] = w_in_i[n_lights - n_i + 1];_visible_h[n_i] = h_in_i[n_lights - n_i + 1];(last_num == 0) {_in_i[n_i]._y = menu_obj[12]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_lights - n_i + 1]);

} else {_in_i[n_i]._y = menu_obj[12]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_lights - n_i + 1]);

};((x_in_i[n_lights - n_i] != 0)&&(last_num <n_lights - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(light_menu_open)&&(last_num < n_lights)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_lights - n_i + 1] != undefined) {(url_in_i[n_lights - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_lights - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_lights - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_lights - (n_i + buf_last) + 1];

}((x_in_i[n_lights - (n_i + buf_last) + 1] != 0)&&(last_num <n_lights)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(light_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_lights - n_i + 1] != undefined) {(url_in_i[n_lights - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_lights - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_lights - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_lights - (buf_last - n_i)];

}((x_in_i[n_lights - (buf_last - n_i)] != 0)&&(last_num <= n_lights)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;_y = false;

};(type_of_obj == "ather") {((menu_obj_flag[13])&&(!ather_menu_open)) {_num = 0;(var n_i = 1; n_i <=5; n_i++) {= type_of_obj + n_i;_in_i[n_i] = _root.createEmptyMovieClip(name, n_i+in_k_i);(url_in_i[n_athers - n_i + 1], obj_in_i[n_i]);(last_num == 0) {_in_i[n_i]._y = menu_obj[13]._y + 10 + last_num*40 + 30;_in_i[n_i]._x = parseFloat(x_in_i[n_athers - n_i + 1]);_visible_i[n_i] = n_athers - n_i + 1;_visible_w[n_i] = w_in_i[n_athers - n_i + 1];_visible_h[n_i] = h_in_i[n_athers - n_i + 1];

} else {_in_i[n_i]._y = menu_obj[13]._y + 10 + last_num*40 + 30 + last_num*10;_in_i[n_i]._x = parseFloat(x_in_i[n_athers - n_i + 1]);_visible_i[n_i] = n_athers - n_i + 1;

};((x_in_i[n_athers - n_i] != 0)&&(last_num <n_athers - 5)) {_num += 1;

};_flag_i[n_i] = false;_in_i[n_i]._alpha = 100;_in_i[n_i].enabled = true;

};

};((menu_obj_flag[6])&&(ather_menu_open)&&(last_num < n_athers)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_athers - n_i + 1] != undefined) {(url_in_i[n_athers - (n_i + buf_last) + 1], obj_in_i[n_i]);_visible_i[n_i] = n_athers - (n_i + buf_last) + 1;_visible_w[n_i] = w_in_i[n_athers - (n_i + buf_last) + 1];_visible_h[n_i] = h_in_i[n_athers - (n_i + buf_last) + 1];

}((x_in_i[n_athers - (n_i + buf_last) + 1] != 0)&&(last_num <n_athers)) {_num += 1;

};_flag_i[n_i] = false;

};

};((menu_obj_flag[7])&&(ather_menu_open)&&(last_num > 1)) {buf_last = last_num;(var n_i = 1; n_i <=5; n_i++) {(url_in_i[n_athers - n_i + 1] != undefined) {(url_in_i[n_athers - (buf_last - n_i)], obj_in_i[Math.abs(n_i-6)]);_visible_i[Math.abs(n_i-6)] = n_athers - (buf_last - n_i);_visible_w[Math.abs(n_i-6)] = w_in_i[n_athers - (buf_last - n_i)];_visible_h[Math.abs(n_i-6)] = h_in_i[n_athers - (buf_last - n_i)];

}((x_in_i[n_athers - (buf_last - n_i)] != 0)&&(last_num <= n_athers)) {_num -= 1;

};_flag_i[n_i] = false;

};

};_url = false;_x = false;

flag_y = false;

};

};

//Блок кода, посвещенный рисованию линий, точек, стенки, рамки.

//Функция рисования точекcreatepoint(target:MovieClip, color_p:Number) : Void {.lineStyle(2,color_p);.moveTo(0,0);.beginFill(color_p);.lineTo(w_p,0);.lineTo(w_p,h_p);.lineTo(0,h_p);.lineTo(0,0);

target.endFill();

};

//Функция создания рамки вокруг выделяемой точки

function createborder(n_p:Number, w_in:Number, h_in:Number) : Void {.clear();.lineStyle(1,color);.moveTo((arr_coordx[n_p]-w_in),(arr_coordy[n_p]-h_in));.lineTo((arr_coordx[n_p]-w_in),(arr_coordy[n_p]+h_in));.lineTo((arr_coordx[n_p]+w_in),(arr_coordy[n_p]+h_in));.lineTo((arr_coordx[n_p]+w_in),(arr_coordy[n_p]-h_in));.lineTo((arr_coordx[n_p]-w_in),(arr_coordy[n_p]-h_in));

};createborder_obj(target:MovieClip) : Void {.clear();.lineStyle(1,color);.moveTo(target._x - 5, target._y - 5);.lineTo(target._x - 5, target._y + target._height + 5);.lineTo(target._x + target._width + 5, target._y + target._height + 5);.lineTo(target._x + target._width + 5, target._y - 5);.lineTo(target._x - 5, target._y - 5);

};

//Функция рисования линии между точкамиdrawline(i_l:Number) : Void {= i_l;_l[i_l-1] = linelayer.createEmptyMovieClip("line" + i_l,k);_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);

};redrawline(i_l:Number) : Void {((i_l == 1) && (drawing_end)) {_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[i_l+1], arr_coordy[i_l+1]);_l[i-1].clear();_l[i-1].lineStyle(1,colorl);_l[i-1].moveTo(arr_coordx[i-1], arr_coordy[i-1]);_l[i-1].lineTo(arr_coordx[1], arr_coordy[1]);

} else if (i_l == (i - 1)){_l[i_l-1].clear();_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[1], arr_coordy[1]);

} else {_l[i_l-1].clear();_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].clear();_l[i_l].lineStyle(1,colorl);_l[i_l].moveTo(arr_coordx[i_l], arr_coordy[i_l]);_l[i_l].lineTo(arr_coordx[i_l+1], arr_coordy[i_l+1]);

};

};

//Функция рисования последней, завершающей линииdrawlastline(i_l:Number) : Void {= i_l;_l[i_l-1] = linelayer.createEmptyMovieClip("line" + i_l,k);_l[i_l-1].lineStyle(1,colorl);_l[i_l-1].moveTo(arr_coordx[i_l-1], arr_coordy[i_l-1]);_l[i_l-1].lineTo(arr_coordx[1], arr_coordy[1]);

};

//Функция рисования стены. Очищается слой, в котором производится рисование, обнуляются

//массивы координат, индекс, а также становятся невидимыми точки и линии

function createwall():Void {.clear();.clear();arr_wallcoordx = 0;arr_wallcoordy = 0;_i = 1;(var n = 2; n<=i; n = n+1) {_p[n-1]._visible = false;_l[n-1]._visible = false;(arr_coordx[n-1],arr_coordx[n], arr_coordy[n-1], arr_coordy[n]);

};_obj[3].enabled = false;_obj[3]._alpha = 50;

};

//Заполняется массив точек стенки. Для этого вычисляется уравнение каждой прямой

//и все ее точки заносятся в массивы координат стены.

function pointline(x1:Number, x2:Number, y1:Number, y2:Number) {k = (y1 - y2)/(x1 - x2);b = (y2*x1 - y1*x2)/(x1 - x2);.lineStyle(2,0x8a9d88);(x1 > x2) {.moveTo(x2, (k*x2+b));(var n = x2; n <= x1; n = n + 1 ){_wallcoordx[wall_i] = n;_wallcoordy[wall_i] = k*n + b;_i = wall_i + 1;

};.lineTo(arr_wallcoordx[wall_i-1], arr_wallcoordy[wall_i-1]);

};(x1 < x2) {.moveTo(x1, (k*x1+b));(var n = x1; n <= x2; n = n +1 ){_wallcoordx[wall_i] = n;_wallcoordy[wall_i] = k*n + b;_i = wall_i + 1;

};.lineTo(arr_wallcoordx[wall_i-1], arr_wallcoordy[wall_i-1]);

};((x1 == x2) and (y1<y2)) {.moveTo(x1, y1);(var n = y1; n <= y2; n = n +1 ){_wallcoordx[wall_i] = x1;_wallcoordy[wall_i] = n;_i = wall_i + 1;

};.lineTo(arr_wallcoordx[wall_i-1], arr_wallcoordy[wall_i-1]);

};((x1 == x2) and (y1 > y2)) {.moveTo(x1, y2);(var n = y2; n <= y1; n = n +1 ){_wallcoordx[wall_i] = x1;_wallcoordy[wall_i] = n;_i = wall_i + 1;

};.lineTo(arr_wallcoordx[wall_i-1], arr_wallcoordy[wall_i-1]);

};();

};

//Функция для рисования комнатыdrawroom() : Void {.moveTo(arr_coordx[1], arr_coordy[1]);.beginFill(0xe7e7e7);(var n_i = 2; n_i <= i; n_i++) {.lineTo(arr_coordx[n_i], arr_coordy[n_i]);

};.endFill();

};

//Функция создания объектаcreateobj (arr_visible_w_in:Array, arr_visible_h_in:Array) : Void {.clear();w_in = arr_visible_w_in[select_number];h_in = arr_visible_h_in[select_number];.beginFill(0x00FF00);.moveTo(0, 0);.lineTo(w_in, 0);.lineTo(w_in, h_in);.lineTo(0, h_in);.lineTo(0, 0);.endFill();_obj = true;._x = _xmouse;._y = _ymouse;

tempobj.startDrag();

};

//Функция создания пиксельного объекта

function creatselectpixl() : Void {.lineStyle(1, 0x000);.moveTo(0,0);.lineTo(1,0);.lineTo(1,1);.lineTo(0,1);.lineTo(0,0);._visible = false;

};

//Функция созджания сеткиcreatnet() : Void {(var k=wmin; k<=wmax; k=k+step) {.lineStyle(2,color_net);.moveTo(k, hmin);.lineTo(k, hmin);.lineTo(k, hmax);

}(var k=hmin; k<=hmax; k=k+step) {.lineStyle(2,color_net);.moveTo(wmin, k);.lineTo(wmin, k);.lineTo(wmax, k);

}

};

//Функция проверки, отвечающая за столкновения мышки с объектом

function testofhit() : Void {

//rdy_to_select = false;(var n_i = 1; n_i <= obj_on_pole; n_i++) {(selectpixl.hitTest(_root["obj" + n_i])) {_to_select = true;_num = n_i;

};

};

};testofhittrash() : Void {(_root["obj" + select_num].hitTest(menu_obj[16])) {

//_root["obj" + select_num].removeMovieClip();(select_num == obj_on_pole) {

_root["obj" + select_num].clear();_category[select_num] = undefined;_obj_num[select_num] = undefined;_obj_x[select_num] = undefined;_obj_y[select_num] = undefined;_obj_w[select_num] = undefined;_obj_h[select_num] = undefined;_rotation[select_num] = undefined;_obj_string[select_num] = undefined;

};_on_pole = obj_on_pole - 1;(var n_i = select_num; n_i <= obj_on_pole; n_i++) {_category[n_i] = arr_category[n_i + 1];_obj_num[n_i] = arr_obj_num[n_i + 1];_obj_x[n_i] = arr_obj_x[n_i + 1];_obj_y[n_i] = arr_obj_y[n_i + 1];_obj_w[n_i] = arr_obj_w[n_i + 1];_obj_h[n_i] = arr_obj_h[n_i + 1];_rotation[n_i] = arr_rotation[n_i + 1];_obj_string[n_i] = arr_obj_string[n_i + 1];

_root["obj" + (n_i + 1)].duplicateMovieClip("obj" + n_i, 30 + n_i);

_root["obj" + (n_i + 1)].clear();

};_category[obj_on_pole + 1] = undefined;_obj_num[obj_on_pole + 1] = undefined;_obj_x[obj_on_pole + 1] = undefined;_obj_y[obj_on_pole + 1] = undefined;_obj_w[obj_on_pole + 1] = undefined;_obj_h[obj_on_pole + 1] = undefined;_rotation[obj_on_pole + 1] = undefined;_obj_string[obj_on_pole + 1] = undefined;

};

};createobjbord(n_i_i) : Void {.clear();._rotation = 0;.lineStyle(1, 0x000);.moveTo(0, 0);.lineTo(arr_obj_w[n_i_i] + 10, 0);.lineTo(arr_obj_w[n_i_i] + 10, arr_obj_h[n_i_i] + 10);.lineTo(0, arr_obj_h[n_i_i] + 10);.lineTo(0, 0);(arr_obj_w[n_i_i]);(arr_obj_h[n_i_i]);._x = _root["obj" + n_i_i]._x - 5;._y = _root["obj" + n_i_i]._y - 5;

};();

6. Приложение 2. Руководство оператора

.1 Аннотация

Настоящее руководство распространяется исключительно на программу и не заменяет учебную, справочную литературу, руководства от производителя ОС и прочие источники информации, освещающие работу с графическим пользовательским интерфейсом операционной системы.

Данное руководство оператора содержит следующие разделы:

Назначение программы

Условия выполнения программы

Выполнение программы

Сообщения оператору

В настоящем руководстве оператора содержатся все необходимые сведения по эксплуатации программного продукта.

.2 Назначение программы

Данная система разработана с целью повышения удобства создания дизайна интерьера. Это реализуется путем интеграции системы в различные веб-сайты, что позволяет работать с данным продуктом удаленно.

Функция обеспечивает возможность выполнения перечисленных ниже функций:

Создание файла формата *.x3d

Отображение файла формата *.x3d

Добавление объектов

Перемещение созданных объектов по рабочему полю с помощью мыши

Вращение созданных объектов при помощи мыши

Поточечное рисование границ проектируемого помещения.

Создание области установки объектов

Перемещение установленных точек с помощью мыши.

Удаление выбранного объекта.

Очистка рабочей области.

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

.3 Условия выполнения программы

.3.1 Минимальный состав технических средств

В состав технических средств должен входить IBM-совместимый персональный компьютер (ПЭВМ), включающий в себя:

процессор Pentium 4 с тактовой частотой, 2,4 ГГц

оперативную память объемом не менее 256 Мб

мышь или другой манипулятор (графических планшет и т.д.)

.3.2 Минимальный состав программных средств

В состав программных средств, необходимых для корректного использования системы, входят:

проигрыватель Adobe Flash Player не ниже 8-ой версии

сервер Apache не ниже версии 2.0

обязательная поддержка сервером PHP не ниже 4-ой версии

проигрыватель файлов формата X3D, такие как CosmoPlayer, InstantPlayer, H3DAPI и др.

6.4 Выполнение программы

.4.1 Загрузка и запуск программы

При использовании системы без подключения к интернет распакуйте архив, содержащий все необходимые файлы, в отдельную папку. Щелкните два раза на файле с именем drawwall.swf, drawwall.exe или drawwall.html.

При использовании системы удаленно необходимо открыть браузер, и ввести в адресной строке адрес веб-ресурса, который использует данную систему.

Для корректного запуска программы убедитесь, что в вашей системе установлен проигрыватель Adobe Flash Player (не ниже 8-ой версии). Если проигрыватель установлен, то на экране появится окно программы (рис.1)

Рис.1

6.4.2 Выполнение программы

А) Поточечное рисование границ проектируемого помещения

Для создания точки необходимо выбрать соответствующий инструмент в меню под номером 2(). После этого переместите курсор мыши в рабочее поле (под номером 10) и нажмите на левую кнопку мыши один раз. Вы увидите, что на рабочем поле появится точка, в указанном вами месте. Для установки следующей точки повторите вышеперечисленные операции. Для создания замкнутой линии необходимо выбрать инструмент под номером 2, навести на первую точку, и нажать на левую кнопку мыши. Контур замкнется, а инструмент под номером 2 перестанет быть активным.

Б) Перемещение установленных точек с помощью мыши

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

В) Создание области установки объектов

Для создания области установки объектов убедитесь, что на рабочем поле вами была нарисована замкнутая линия. Если это так, то для создания области установки объектов необходимо нажать на кнопку меню под номером 3 (). Если все было сделано верно, то вы увидите, как нарисованный вами ранее контур закраситься, а пункты меню под номерами 1 и 2 перестанут быть активными.

Г) Добавление объектов

Для добавления объектов вам необходимо, чтобы была создана область установки объектов. Если это так, то вы можете установить любой имеющийся в системе объект.

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

Открыв раздел, вы можете выбрать любой объект, который в нем содержаться. Для этого просто наведите курсор мыши на нужный вам объект и нажмите на левую кнопку мыши. Вы увидите, как объект появиться под курсором повторным щелчком в созданной заранее области установки объектов вы создадите объект в своем проекте.

Д) Перемещение созданных объектов по рабочему полю с помощью мыши

Для перемещения объектов по рабочему полю необходимо выбрать в меню инструмент под номером 5 (). После этого наведите курсор мыши на интересующий вас объект, нажмите на левую кнопку мыши и не отпуская перетащите в любое место рабочего поля.

Е) Вращение созданных объектов при помощи мыши

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

Ж) Удаление выбранного объекта

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

З) Очистка рабочей области.

Для этого необходимо выбрать в меню инструмент под номером 6 (). При нажатии, все элементы, содержащиеся в рабочей области, будут удалены (область установки объектов и все объекты). Пункты меню под номерами 1 и 2 станут активными.

И) Создание файла формата *.x3d.

Для создания файла формата *.x3d необходимо, чтобы в рабочей области были созданы область установки объектов и хотя бы один объект. Если это так, то пункт меню под номером 8 станет активным (). При нажатии на этот пункт меню создается требуемый файл, а пункт меню под номером 9 становиться активным.

К) Отображение файла формата *.x3d

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

.4.3 Завершение работы программы

Для завершения работы необходимо нажать на пиктограмму «крестик» в верхнем правом углу окна.

7. Список используемой литературы

Практические советы по XML - <http://xmlhack.ru/faq>. html <http://xmlhack.ru/faq.html>

Работа с XML Action script - <http://blog.browseforart.com/category/> actionscript-30/

Языки веб-программирования - http://www.programmers club.ru/arnold-create-site6/3ds Max 9 .- <http://www.3dmax.ru/articles/3dmax/4/>

Хранение данных удаленно - http://www.flash-ripper.com/articles/flash/2002_07_30_localsobject.php#notes <http://www.flash-ripper.com/articles/flash/2002_07_30_localsobject.php>

Extensible 3D graphics for web authors - http://www.x3dgraphics.com/examples/X3dForWebAuthors/index.html

Похожие работы на - Разработка базы данных 3D-объектов системы проектирования интерьеров

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!