Разработка программных средств формирования групповой спецификации в среде Creo

 













ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА

Тема дипломного проекта

"Разработка программных средств формирования групповой спецификации в среде Creo"

Реферат


Пояснительная записка ___ с., 18 рисунков, 29 таблиц, 23 источника.

Ключевые слова: XML, XSL, PDF, ПРОГРАММИРОВАНИЕ.

Объект исследования или разработки - языки гипертекстовой и стилевой разметки.

Цель работы - разработка программных средств для представления групповой спецификации на сборочное изделие, генерируемой модулем PartList из среды Creo, в pdf-формат.

Метод исследования и аппаратура - использование программной среды Microsoft Visual Studio 2010 на ПК с установленной операционной системой Windows XP/Vista/7/8 и виртуальной машиной Java Runtime Environment, версии 1.6 и выше. Для функционирования программы необходим процессор с частотой ядра 2 ГГц, не менее 1024 Мб оперативной памяти, жесткий диск объёмом 80 Гб.

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

Основные конструктивные, технологические и технико-эксплуатационные характеристики - разработанная программа реализует интерфейс выбора xml-документа и xsl-шаблона. Преобразует исходный xml-файл в новый. Используя шаблон XSL и процессор трансформирующих объектов, получает файл, использующий форматирующие объекты (файл формата FO). Далее разработанное приложение вызывает процессор форматирующих объектов, преобразующий fo-файл в искомый pdf-документ.

Степень внедрения - приняты к использованию специалистами подразделения "Системы автоматизированного проектирования и подготовки производства" ООО "Инженерно-консалтинговая фирма Солвер".

Область применения - коммерческие фирмы.

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

Содержание


Введение. Постановка задачи на уровне целей

1. Обзор существующих методов и средств решения задачи

1.1 Выбор метода передачи информации

1.2 Выбор формата для представления

1.3 Выбор программных средств обработки древовидных структур данных

1.4 Выбор метода построения пользовательского интерфейса

2. Описание структуры, преобразования и представления информации с помощью технологий XML-XSL

2.1 Механизм преобразования XML в PDF. Постановка задачи

2.2 Расширяемый язык разметки XML

2.3 Язык стилей XSL

2.4 Текстовые процессоры

3. Реализация представления спецификации в xml-формате и ее преобразование в PDF-формат

3.1 Разработка структуры xml-файла

3.2 Применение XSLT-инструкций для разработки шаблона XSL

3.3 Разработка шаблона XSL

3.4 Алгоритм преобразования исходного XML в новый XML

3.5 Использование MSXSL и Apache FOP

4. Разработка конвертера xml-представлений групповых спецификаций на сборочное изделие, в pdf-формат

4.1 Разработка приложения

4.1.1 Реализация пользовательского интерфейса

4.1.2 Разработка функций реализующих алгоритм преобразования исходного XML в новый XML

4.2 Создание инсталляционного пакета

4.3 Руководство пользователя

5. Организационно-экономические расчеты

5.1 Обоснование необходимости и актуальности разработки

5.2 Определение трудоемкости разработки программного продукта

5.3 Определение состава исполнителей

5.4 Расчет сметной стоимости и договорной цены разработки ПП

5.5 Расчет трудоемкости сопровождения ПП

5.6 Определение стоимости сопровождения ПП

5.7 Планирование цены ПП

5.8 Анализ конкурентоспособности и качества разрабатываемого программного продукта

5.8.1 Анализ технической прогрессивности разрабатываемого ПП

5.8.2 Анализ изменения функциональных возможностей разрабатываемого ПП

5.8.3 Анализ соответствия разрабатываемого программного продукта нормативам

5.8.4 Анализ экономических показателей разрабатываемого ПП

5.8.5 Оценка конкурентоспособности ПП

5.9 Анализ технико-экономических показателей разработки и эксплуатации ПП

6. Безопасность и экологичность

6.1 Безопасность производственной среды

6.2 Шум на рабочем месте

Полученные результаты расчета сравниваются с допустимым значением уровня шума для отдельного рабочего места согласно СанПиН 2.2.4.1191-03.

6.3 Расчет освещённости рабочей зоны

6.4 Расчет параметров вентиляции рабочей зоны

6.6 Экологичность проекта

Заключение

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

Приложения

Введение. Постановка задачи на уровне целей


В наше время благодаря стремительному развитию вычислительной техники стали возможными разработка и использование систем автоматизированного проектирования и подготовки производства. Рынок специализированного программного обеспечения, или CAD (Computer Aided Design) технологий, насыщен всевозможными пакетами. Современные лидеры CAD систем - это так называемые системы "тяжелого" САПРа. К наиболее известным в промышленности "тяжелым" системам можно отнести следующие CAD системы: Creo, NX и CATIA. Основная часть таких пакетов - импортного производства, поэтому их надо приспосабливать к требованиям и традициям российских пользователей.

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

Локализацией одной из систем, а именно Creo, занимаются специалисты инженерно-консалтинговой компании Солвер. Данная промышленная система обладает возможностью параллельной разработки изделия: основной стратегией, применяемой ведущими компаниями. Многочисленный набор программных решений позволяет выбрать необходимую конфигурацию каждого рабочего места в соответствии с его функциональностью. Сюда включаются возможности промышленного дизайна, проектирования механических конструкций (в том числе, управление большими сборками), имитации функциональности изделия, изготовления и управления инженерными данными. На сегодняшний день решения Creo обеспечивают наиболее всестороннюю, интегрированную среду разработки продукта.

Основные задачи, которые ставятся перед любой системой автоматизированного проектирования - это сокращение сроков разработки нового изделия и повышение качества выполнения проекта. Creo решает эти задачи оптимальным путем. Программа обладает рядом преимуществ по сравнению с конкурентами. Но, как и любой другой продукт, не лишен недостатков [7].

Один из недостатков Creo - отсутствие удобных средств подготовки конструкторской документации в соответствии с отечественной ЕСКД. В том числе - средств формирования спецификаций на сборочное изделие.

Для преодоления указанного недостатка в компании "Солвер" был разработан плагин (надстройка) PartList для формирования спецификаций на сборочное изделие в соответствии с отечественными ГОСТами.

Модуль PartList предназначен для автоматизации процесса создания спецификации на сборочное изделие, разработанное в Creo (Рисунок 1). После установки модуль автоматически подключается в момент запуска Creo и позволяет назначать значения параметров спецификации компонентов сборки, устанавливать позиции компонентов (автоматически или вручную), формировать выходной документ для просмотра и печати.

Используя PartList, пользователь получает возможность:

-задать параметры спецификации детали в режиме детали;

-задать параметры спецификации сборочной единицы в режиме сборки;

-задать параметры спецификации элементов, не входящих в сборку, но представленных в спецификации (документация, ведомости, комплекты и т.п.);

-сформировать, просмотреть и распечатать спецификацию, не выходя из Creo;

-использовать при формировании спецификации автоматическое или ручное присвоение позиций;

программный приложение интерфейс конвертер

-редактировать значения параметров спецификации и полей основной надписи в режиме просмотра документа [3].


Рисунок 1 - Фрагмент групповой спецификации по ГОСТ 2.113-75


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

Основу управления жизненным циклом изделий составляет общекорпоративная информационная система управления для совместного создания, управления и использования актуальной информации об изделиях, объединяющая в единое информационное пространство людей, процессы, продукцию и информацию [8]. Для создания базы данных такой системы необходима документация в общеупотребительном электронном виде. PartList лишен возможности подготовки такой документации. Разработка средств экспорта спецификации из PartList в одном из стандартных форматов считается важной задачей. Их реализация позволит упростить процесс управления и передачи информации об изделии в рамках конструкторской подготовки производства. Уменьшить время на подготовку документации. Упростить процесс настройки рабочих мест пользователей.

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

1. Обзор существующих методов и средств решения задачи


1.1 Выбор метода передачи информации


Один из способов передачи информации в файл, пригодный для чтения, был реализован специалистами "Солвер" в программном модуле, входящем в комплект программ поставляемых с PartList. Модуль Convertor. exe, реализованный средствами Visual Basic, способен конвертировать файл c расширением *. skd собственного формата PartList в файл формата, используемого Microsoft Word (расширение *. doc).

Рассмотрим другие общеупотребительные подходы.

В современном мире уже давно наметилась тенденция разбиения разного рода информации на группы. Человек, пришедший в магазин купить книгу по информатике, может легко найти её на отдельном стенде. Ярким примером разделения информации из жизни web-мастера служат HTML (Hypertext Markup Language - язык гипертекстовой разметки) и каскадные таблицы стилей CSS (Cascading Style Sheets) [1].html - это стандартный язык разметки, используемый для описания того, как текст, изображения, гиперссылки и стандартные элементы графического интерфейса будут отображаться в web-браузере. Программист, разрабатывая web-страницу, вносит в текстовый файл данные, а так же элементы форматирования. Браузер загружая эту web-страницу, считывает данные и отображает их с учётом элементов форматирования. Но, в случае, когда для отображения объектов необходимо использовать большое количество элементов (тэгов) форматирования, гораздо удобнее воспользоваться CSS, определив в них новый элемент форматирования. Таким образом, создаваемый документ не загромождается лишней, повторяющейся информацией и легко воспринимается. Правда, HTML создавался для отображения информации и фокусируется на том, как выглядят данные. Соответственно полного отделения данных от их представления он не поддерживает. Более новой разработкой являются технологии XML и XSL.

Сейчас существует практически общепринятый подход, использующий связку технологий XML и XSL для представления, передачи и последующего преобразования информации.(Extensible Markup Language - расширяемый язык разметки) - это язык разметки, описывающий целый класс объектов данных, называемых XML-документами. Он создан для описания данных и фокусируется на том, что они из себя представляют. XML предназначен для структурирования, хранения и передачи информации [2].

XSL (Extensible Stylesheet Language - расширяемый язык таблиц стилей) - язык стилей XML. Он может описывать преобразование XML в HTML, pdf и некоторые другие форматы. Может фильтровать и сортировать XML - данные, адресоваваться к разным частям документа. С помощью XSL возможно форматировать данные в зависимости от их значения [4].

Использование технологий XML и XSL позволяет отделить структуру данных от формата её представления и предоставляет средства для реализации нескольких представлений на базе одного XML-документа. Благодаря чему возможна разработка и последующее применение разных XSL-шаблонов для различных форм применяемых в ЕСКД, при одновременном использовании одной и той же структуры данных представленной в формате XML.

XML является платформенно независимым форматом, что открывает возможность его использования в среде любой операционной системы (при условии, что на персональном компьютере установлено соответствующее программное обеспечение). Использование XML не влечёт за собой покупки лицензии, он является открытым, бесплатно распространяемым форматом данных. Организация World Wide Web Consortium разработавшая и утвердившая стандарт XML предоставляет бесплатно распространяемый конвертор, объединения файлов XML и XSL, в форматы: PDF, PCL, PS, SVG, XML. Данный конвертор представляет собой fop-процессор (Formatting Objects Processor - процессор форматирующих объектов), именуемый Apache FOP [11]. Он является Java-приложением, которое считывает дерево форматирующих объектов и затем отображает полученную страницу в указанном формате вывода.


1.2 Выбор формата для представления


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

Так как наша документация будет представлена в виде таблиц, хорошим вариантом её электронного формата был бы xls, который в свою очередь является внутренним форматом программы Microsoft Excel. Данный программный продукт специально разрабатывался специалистами компании Microsoft для работы с таблицами, поэтому позволяет легко вносить изменения в них. С экономической точки зрения, для использования программного продукта Microsoft Excel необходима покупка лицензии предприятием, а так же пользователями электронной документации. К тому же, он предоставляет посредственный "механизм" защиты информации. В Microsoft Excel реализована возможность защиты документа от изменения, но в случае его пересохранения открывается возможность редактирования. Нельзя запретить копирование текста в буфер обмена. Есть вариант установки пароля на открытие файла, но ведь возможность чтения необходима. Данное приложение входит в состав Microsoft Office, являющийся платформозависимым пакетом программ для офиса, то есть входящие в него программы могут быть установлены на компьютер только с операционной системой Windows. Значит, пользователь, работающий на Linux или Mac OS, не сможет воспользоваться электронной документацией в формате xls.

Формат doc менее удобен для редактирования таблиц, к тому же он принадлежит приложению Microsoft Word, входящему в состав пакета программ Microsoft Office. То есть, он не лишен недостатков присутствующих у xls.

HTML - электронный формат файла предназначенный для представления информации в сети Интернет. Он является открытым, бесплатно распространяемым форматом.html предоставляет возможность редактирования хранящихся в нём данных. Для внесения изменений необходим простейший текстовый редактор, но для этого пользователю необходимо знать сам язык HTML (Hypertext Markup Language - гипертекстовый язык разметки) [1]. Данный формат файла является межплатформенным, то есть допускает своё использование на различных программных платформах (в различных операционных средах).html является альтернативой формату pdf, но не предоставляет возможности защиты данных от изменений, в отличие от конкурента. К тому же HTML не удобен при просмотре больших документов, так как позволяет сохранять каждую страницу только в отдельном файле.

Формат Adobe PDF (Portable Document Format - переносимый формат документов) является универсальным файловым форматом, который сохраняет все шрифты, форматирование, цвета и графику любого исходного документа независимо от того, в каком приложении и на какой платформе создавался этот исходный документ. Файлы Adobe PDF компактны, и любой пользователь бесплатной программы Adobe Reader может открывать к ним общий доступ, просматривать свои документы PDF и перемещаться по ним, а также печатать файлы PDF в точности такими, какими они были созданы. Adobe Reader, как правило, входит в состав программного обеспечения поставляемого с большинством новых персональных компьютеров.

Использование формата pdf не несёт за собой затрат связанных с покупкой лицензии ни со стороны предприятия, ни со стороны пользователя. Он предоставляет возможность защиты данных от копирования и последующего изменения. Листы документа хранятся в одном файле, что очень удобно. Приложения для чтения pdf-файлов распространяются бесплатно. Конвертор связки XML и XSL в PDF имеет бесплатную лицензию (приложение Apache FOP).

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


1.3 Выбор программных средств обработки древовидных структур данных


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

Обработка файла формата XML и применения к нему элементов языка XSLT возможна с помощью:

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

-клиентской программы, например, браузера, которая выполняет преобразование путём чтения таблицы стилей, указанной с помощью инструкции по обработке <? xml-stylesheet? > (эти функции в некотором объёме может выполнять Internet Explorer);

-отдельной программы, предназначенной для выполнения преобразования [1].

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

Для обработки файла, использующего форматирующие объекты языка XSL-FO и создания отформатированного документа, будем использовать fop-процессор, разработанный Джеймсом Таубером, который передал его проекту Apache XML. Программа Apache FOP (Formatting Object Processor - процессор форматирующих объектов), предназначенная для синтетических анализаторов Java, основана на XML-анализаторе Xerces проекта Apache XML. Так как Apache FOP является Java-приложением, оно может быть запущено на компьютер с любой операционной системой (при условии установленной на нём виртуальной машины Java) [2].

Данный программный продукт является бесплатно распространяемым, в отличие от конкурентов. Его функциональных возможностей достаточно для представления требуемой спецификации в pdf-формате в соответствии с ГОСТ 2.113 - 75.


1.4 Выбор метода построения пользовательского интерфейса


Рассмотренные, в предыдущем подразделе, приложения предоставляют консольный интерфейс и поэтому не удобны для пользователя. Обработка большого числа файлов усложняется постоянным вводом путей к ним, передаваемых в качестве параметров, по средствам командной строки. Для устранения данного недостатка было принято решение о разработке программы XMLConverter, предоставляющей графический интерфейс пользователя. Данный программный модуль будет являться связующим звеном приложений, участвующих в преобразовании xml-документа в pdf-файл. В нём так же будет реализован алгоритм приведения спецификации в полное соответствие с ГОСТ 2.113 - 75 путём преобразования xml-документа в промежуточный xml-документ.

В качестве инструментальной среды программирования, в которой будет реализовано приложение, выбрана Microsoft Visual Studio 2010. Данный программный продукт предоставляет широкие возможности создания и редактированию приложений для операционных систем Windows XP/Vista/7/8. Visual Studio даёт возможность выбора языка программирования: С++, C#, F#, Basic. Самым гибким языком программирования, из выше перечисленных, является С++. Visual Studio предоставляет возможность выбора между двумя платформами для этого языка. Более молодой из них является NET. Её инструментальные средства хорошо продуманы. Библиотеки Framework, предоставляемые этой средой, дают широкие возможности для разработки графического пользовательского интерфейса. Используемые в NET технологии упрощают работу с функциями библиотеки Win32Api. Однако существенным недостатком этой платформы является большая ресурсоёмкость разработанного в её среде приложения. Это связано с тем, что в ней более активно используются готовые модули, предоставляющие программисту требуемые и не требуемые возможности. То есть в оперативную память загружаются и обрабатываются процессором блоки компонентов, которые не будут использоваться вообще. Альтернативой Framework является разработанная ранее библиотека MFC (Microsoft Foundation Classes - библиотека базовых классов Microsoft) [6]. Она предоставляет более скромные возможности при разработке интерфейса пользователя, так как использует не столь большое число готовых компонент, но их вполне достаточно для разработки GUI (Graphical User Interface - графический пользовательский интерфейс) приложения XMLConverter. Плюсом старой платформы является ее малая ресурсоёмкость. Так приложение, созданное с использованием MFC, занимает в оперативной памяти в 3-4 раза меньше места, чем созданное в NET.

Исходя из выше сказанного, для разработки приложения был выбран язык Visual C++ и библиотека MFC.

В рамках текущей главы были определены технологии, применяемые при преобразовании структуры данных xml-файла в pdf-документ.

2. Описание структуры, преобразования и представления информации с помощью технологий XML-XSL


2.1 Механизм преобразования XML в PDF. Постановка задачи


В рамках настоящей квалификационной работы для преобразования xml-файла, содержащего данные групповой спецификации, в pdf-файл необходимо:

этап.Разработать структуру файла формата XML, который будет генерироваться модулем PartList (Рисунок 1).

2 этап.Разработать таблицы стилей XSL по ГОСТ 2.113 - 75, описывающие преобразование и представление xml-документа в pdf-формате.

этап.Разработать приложение (XMLConverter), преобразующее искомый xml-документ в промежуточный xml-документ для приведения его в соответствие с требованиями предприятия. А также реализующее интерфейс между пользователем и программными средствами, выполняющими дальнейшее преобразование. Воспользоваться им.

этап.С помощью процессора трансформирующих объектов MSXSL выполнить преобразование xml-файла в документ, использующий форматирующие объекты (файл с расширением *. fo).

этап.Используя процессор форматирующих объектов Apache FOP, получить требуемый файл формата PDF.

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

этап.

Схема, преобразования XML в PDF, представлена на рисунке 2.1.

Рисунок 2.1 - Механизм преобразования XML в PDF


2.2 Расширяемый язык разметки XML


XML используется в качестве средства для описания грамматики других языков и контроля над правильностью составления документов. То есть, сам по себе XML не содержит никаких тегов - элементов языка предназначенных для разметки, он просто определяет условия их создания. Теги не заданы в этом языке с самого начала. Программист сам определяет их. Таким образом, если мы считаем, что для обозначения элемента line в документе необходимо использовать тег <line/>; то XML позволяет свободно использовать определяемый нами тег и мы можем включать в документ фрагменты, подобные следующему: <line> данные </line>. Как видно из примера, открывающий <line> и закрывающий </line> содержат в себе данные. Во многих случаях, когда их много, целесообразно

Процесс создания XML документа достаточно прост и требует лишь базовых знаний HTML и понимания тех задач, которые необходимо выполнить, используя XML в качестве языка разметки. Таким образом, у разработчиков появляется уникальная возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям, и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа [2].позволяет осуществлять контроль над корректностью данных, хранящихся в документах, производить проверки иерархических соотношений внутри документа и устанавливать единый стандарт на структуру документов, содержимым которых могут быть самые различные данные.


2.3 Язык стилей XSL


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

XSLT - язык преобразования XML в другие типы документов или в другие XML-документы. Он является наиболее важной частью стандарта XSL. XSLT можно применять для преобразования XML документов в формат, знакомый браузерам [2].

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

XSL-FO - язык форматирования, описывающий внешний вид страниц. Он предоставляет более совершенную визуальную модель страницы, нежели HTML и CSS. В отличие от связки последних, XSL-FO поддерживает такие типы форматирования, как направление письма с права на лево и снизу вверх, сноски, заметки на полях документа, перекрёстные ссылки на номера страниц и другие. В отличие от каскадных таблиц стилей CSS, которые преимущественно предназначены для веб-страниц, XSL-FO предназначен для более широкого круга задач. Можно, например, написать таблицу стилей XSL, которая с помощью форматирующих объектов сгенерирует вёрстку целой книги. Другая таблица стилей может "сгенерировать" из того же документа веб-сайт [4].

Подобно другим XML-приложениям, форматирующие XSL-объекты имеют собственное пространство имен <#"center">2.4 Текстовые процессоры


Для преобразования xml-документа, содержащего данные спецификации, используются текстовые процессоры: XMLConverter, MSXSL и Apache FOP. Первый, из которых, преобразует xml-документ в промежуточный xml-документ. Он добавляет отступы в виде пустых строк в спецификацию, а также дописывает их в конец последней страницы. Второй процессор используется для применения XSLT-инструкций, описанных в xsl-файле, к xml-файлу. В результате чего получается fo-файл. Он содержит данные xml-документа и форматирующие объекты xsl-шаблона. Для преобразования fo-файла в pdf-документ, используется Apache FOP.

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


3. Реализация представления спецификации в xml-формате и ее преобразование в PDF-формат


3.1 Разработка структуры xml-файла


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

Файлы описываемого формата являются текстовыми, соответственно их содержимое - это текст. Язык, применяемый для разметки содержимого этих файлов - это язык гипертекстовой разметки XML. Программы, работающие с файлами данного типа, можно отнести к классу текстовых процессоров. Они интерпретируют байты данных xml-файла как символы. Исходя из этого, разработчиками стандартов XML было введено требование, указывать кодировку файла по средствам одного из атрибутов тега xml, относящегося к инструкциям и обозначаемого следующим образом: <? xml version="1.0" encoding="UTF-8"? >. В приведённом примере это атрибут encoding, имеющий значение поля UTF-8 (однобайтный Unicode). Объект version указывает версию используемого языка разметки XML. [1]

Информационная структура, разрабатываемого файла, содержащего данные спецификации, представлена на рисунке 3.1 Как видно из рисунка, данные, входящие в спецификацию, подразделяются на данные, входящие в штамп, данные, относящиеся к разделу, и данные, входящие в строку. Штамп присутствует в одном экземпляре. Все данные, относящиеся к нему, есть всегда. Наименование раздела отсутствовать не может, так как в противном случае теряется смысл в самом разделе. Строка состоит из следующих данных: формат, зона, позиция, обозначение, наименование, количество на исполнение и примечание. Количеств на исполнение несколько. В зависимости от спецификации их может быть: 10, 30, 39. Счёт начинается с 0. Например, если количеств 10, N будет равен 9.


Рисунок 3.1 - Информационная структура, разрабатываемого файла, содержащего данные спецификации


Разделов, как и строк, может быть много. Их число определяется данными, сформированными в PartList, а также требованиями соответствующего ГОСТа. Для представления описанной структуры данных в XML формате воспользуемся тегами и их атрибутами. Для обозначения корневого элемента спецификации будем использовать элементы <specification> и </specification>. Данные, относящиеся к штампу спецификации, ограничим при помощи тега <stamp/>. Разметим содержимое элемента <stamp/> с помощью следующих атрибутов: OBOZNACHENIE, NAIMENOVANIE_1, NAIMENOVANIE_2, NAIMENOVANIE_3, NAIMENOVANIE_4, NAIMENOVANIE_5, RAZRABOTAL, PROVERIL, N_KONTROL, UTVERDIL, NAZVANIE_ORGANIZACII_1, NAZVANIE_ORGANIZACII_2, PERVICH_PRIM, kline_before, kline_after, kpage. Соответствующие значения атрибутов представлены в таблице 3.1 Наименование разбивается, в зависимости от длины, на некоторое количество строк (не больше 5). Атрибут NAZVANIE_ORGANIZACII_2 может отсутствовать, если название организации состоит из одной строки.


Таблица 3.1 - Атрибуты элемента <stamp/>

Атрибут ЗначениеOBOZNACHENIEОбозначениеNAIMENOVANIE_1Наименование, строка 1NAIMENOVANIE_2Наименование, строка 2NAIMENOVANIE_3Наименование, строка 3NAIMENOVANIE_4Наименование, строка 4NAIMENOVANIE_5Наименование, строка 5Атрибут ЗначениеRAZRABOTALРазработалPROVERILПроверилN_KONTROLНормоконтролерUTVERDILУтвердилNAZVANIE_ORGANIZACII_1Название организации, 1 NAZVANIE_ORGANIZACII_2Название организации, 2PERVICH_PRIMПервичная применяемостьkline_beforeОтступ перед разделомkline_afterОтступ после разделаKpageКоличество страниц в документе

Раздел обозначим при помощи тега <section/>. К данному элементу относится только одно поле данных "наименование", обозначим его следующим образом s_NAIMENOVANIE. Символ s в начале имени описываемого элемента служит для идентификации этого атрибута, как атрибута относящегося к тегу <section/>. Для выделения данных, относящихся к строке, будем использовать тег <line/>. Соответствующие значения атрибутов представлены в таблице 3.2 Примечание может быть представлено в виде одной строки (атрибут PRIMECHANIE), а может быть разбито на две строки (PRIMECHANIE_1 и PRIMECHANIE_2, соответственно).


Таблица 3.2 - Атрибуты элемента <line/>

АтрибутЗначениеFORMФорматZONEЗона POZICIAПозицияOBOZNACHENIEОбозначениеNAIMENOVANIEНаименованиеАтрибутЗначениеKOL-VO_0Количество 0KOL-VO_NКоличество NPRIMECHANIEПримечаниеPRIMECHANIE_1Примечание, строка 1PRIMECHANIE_2Примечание, строка 2

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


<? xml version="1.0" encoding="UTF-8"? >

<specification>

<stamp OBOZNACHENIE="СПЕЦИФИКАЦИЯ" NAIMENOVANIE_1="" NAIMENOVANIE_2="" NAIMENOVANIE_3="Разгонщик" NAIMENOVANIE_4="" NAIMENOVANIE_5="" RAZRABOTAL="Кобыльский" PROVERIL="Гундорова" N_KONTROL="Качанов" UTVERDIL="Кравец"_ORGANIZACII_1="ВГТУ, ФАЭМ" NAZVANIE_ORGANIZACII_2="ВМ-022"_PRIM = ""_before="2" kline_after="1" kpage="3"/>

<section s_NAIMENOVANIE="Документация"/>

<line FORM="" ZONE="" POZICIA="" OBOZNACHENIE="Р35-1.00.000 СБ" NAIMENOVANIE="Сборочный чертеж" KOL-VO_0="" PRIMECHANIE="" PRIMECHANIE_1="" PRIMECHANIE_2=""/>

… <! - Некоторое количество элементов <line … /> - ->

<line FORM="" ZONE="" POZICIA="" OBOZNACHENIE="Р35-1.00.000 МЧ" NAIMENOVANIE="Монтажный чертеж" KOL-VO_0="" PRIMECHANIE="" PRIMECHANIE_1="примечание" PRIMECHANIE_2=""/>

<section s_NAIMENOVANIE="Сборочные единицы"/>

<line FORM="" ZONE="" POZICIA="1" OBOZNACHENIE="Р34-1.05.000" NAIMENOVANIE="Подъемник" KOL-VO_0="1" PRIMECHANIE="" PRIMECHANIE_1="" PRIMECHANIE_2=""/>

<line FORM="" ZONE="" POZICIA="2" OBOZNACHENIE="Р35-1.01.003" NAIMENOVANIE="Гидроцилиндр" KOL-VO_0="3" PRIMECHANIE="" PRIMECHANIE_1="" PRIMECHANIE_2=""/>

</specification>


Для наглядности здесь представлен небольшой документ, не отражающий все данные спецификации, но демонстрирующий её представление в виде xml-документа. Пустые атрибуты (атрибуты, не содержащие данных, например FORM="") могут отсутствовать, они представлены в данном примере для отображения всей информационной структуры xml-файла.


3.2 Применение XSLT-инструкций для разработки шаблона XSL


Применение XSLT-инструкций обусловлено необходимостью выборки данных из xml-файла. Для их использования в шаблоне XML необходимо указать пространство имён, а именно: <xsl: stylesheet version="1.0" xmlns: xsl="#"justify">Для установки соответствия с корневым узлом xml-документа и создания соответствующего шаблона используется элемент <xsl: template> с атрибутом match, указывающим на корневой элемент. Записывается следующим образом: <xsl: template match="specification"> </xsl: template>. Объект specification - это название корневого элемента (тега) преобразуемого xml-файла. В том случае, если в качестве первого узла необходимо выбрать не корневой элемент, указывается путь к этому элементу. К примеру, значение атрибута match="specification/table" указывает, что в качестве превого узла выбран тег table. Путь к элементу указывается через символ /.

Для получения данных, относящихся к определённому элементу документа формата XML, необходимо использовть <xsl: value-of> с трабутом select, содержащим имя выделяемого элемента, либо путь к ниму. Например, select="stamp/@RAZRABOTAL". При этом не указывается ранее пройденный путь. Тоесть, если тег с именем stamp находится следующим, по иерархии, за элементом specification, а последний был выбран с помощью xsl: template, то в атрибуте select (элемента xsl: value-of), путь указывается, начиная с выбранного ранее элемента (в данном случае specification) не включительно. Если выделяемые данные принадлежат атрибуту элемента, при записи пути его имя указывается со знаком @ в начале.

Элемент xsl: template и входящий в него шаблон применяются только по отношению к корневому узлу, либо к узлу, с которого начинается преобразование. Можно также применять шаблон к дочерним элементам узла, с которым установлено соответствие. В этих целях применяется элемент <xsl: apply-templates>. В принадлежащем ему атрибуте math указывается узел, с которого необходимо начать обход дерева.

Пример использования xsl: apply-templates приведён ниже.

<? xml version="1.0" encoding="utf-8"? >

<xsl: stylesheet version="1.0" xmlns: xsl="#"justify"><xsl: template match="specification">

<xsl: apply-templates select="*"/>

</xsl: template>

<xsl: template match="line | section">

…. <! - Данные шаблона - ->

</xsl: template>

<xsl: stylesheet>

Рассмотрим приведённый код. При просмотре текста сверху вниз, первые элементы <xsl: template match="specification"> и </xsl: template> являются начальным и конечным элементами шаблона корневого узла specification. Элемент xsl: apply-templates, входящий в рассматриваемый шаблон, указывает на то, что к дочерним элементам узла specification будет применён соответствующий шаблон. Атрибут select рассматриваемого объекта содержит путь к дочерним элементам [1]. В данном случае select содержит символ *, который означает установку соответствия со всеми дочерними элементами тега specification. В этом случае элемент select может быть опущен. Шаблон для этих элементов описан так:

<xsl: template match="line | section">

…. <! - Данные шаблона - ->

</xsl: template>

Содержимое атрибута match указывает на выбор тегов с именами line или section (дочерних тегу specification). Символ | означает логический элемент "или" (дизъюнкцию).

В том случае, когда элементов xsl: apply-templates несколько (более одного), а соответственно и шаблонов, указывается имя, идентифицирующее используемый шаблон. Атрибут содержащий имя, называется mode [4]. Демонстрационный пример xsl-файла приведён ниже.

<? xml version="1.0" encoding="utf-8"? >

<xsl: stylesheet version="1.0" xmlns: xsl="#"justify"><xsl: template match="specification">

<xsl: apply-templates select="* [13>position ()] "/>

<xsl: apply-templates select="* [position () >11] " mode="page_B"/>

</xsl: template>

<xsl: template match="line | section">

…. <! - Данные шаблона - ->

</xsl: template>

<xsl: template match="line | section" mode="page_B">

…. <! - Данные шаблона - ->

</xsl: template>

<xsl: stylesheet>

В первом, при чтении сверху вниз, элементе xsl: apply-templates не указывается атрибут с именем используемого шаблона. Принадлежащему ему шаблону, размеченному с помощью тегов xsl: template, имя не присваивается. Для второго и последующих объектов xsl: apply-templates указывается арибут с именем используемого шаблона, если не используется первый шаблон без имени. Любой шаблон может использоваться несколькими элементами xsl: apply-templates.

Для описания условий выбора тех или иных элементов используется язык XPath [1]. Объект position () рассматриваемого языка служит для получения позиции просматриваемого узла в документе. Выражение * [position () >11], указывает, что будут выбраны все элементы, позиция которых больше 11. Оператор [] применяется для проверки истинности определённого условия. Узлы нумеруются отдельно для потомков каждого предка.


3.3 Разработка шаблона XSL


При разработке xsl-шаблона применяются расширяемые языки таблицы стилей: XSLT и XSL-FO. Первый применяется для трансформации xml-документа (выборки данных из XML), а второй - для описания представления этих данных.

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

Для описания представления страниц в языке XML-FO предусмотрен ряд элементов. Одним из таких элементов является fo: root. Этот объект содержит один элемент fo: layout-master-set и один или несколько элементов fo: page-sequence. В объекте fo: page-sequence размещается основное содержимое документа. Элемент fo: layout-master-set содержит шаблоны создаваемых страниц, которые также именуются мастер-страницами [4]. Мастер-страница, обозначаемая fo: simple-page-master, задаёт общий макет страницы, включая отступы, размеры заголовков, основную область страницы и так далее. Элемент fo: simple-page-master имеет атрибуты, содержащие значения размеров: страницы и отступов. Соответствующие атрибуты и их описание, представлены в таблице 3.3.


Таблица 3.3 - Соответствующие атрибуты и их описание элемента fo: simple-page-master

ЭлементОписаниеPage-heightВысота страницыPage-widthШирина страницыmargin-topОтступ сверхуMargin-bottomОтступ снизуmargin-leftОтступ слеваmargin-rightОтступ справа

Спецификация XML-FO предусматривает разбиение страницы на пять областей: центральной, заголовка, футера (нижней области), конечной области (правая часть листа) и начальной области. Рассматриваемые области задаются с помощью дочерних элементов объекта fo: simple-page-master, которые представлены в таблице 3.4.


Таблица 3.4 - Дочерние элементы объекта fo: simple-page-master

ЭлементОписание областиregion-bodyЦентральнаяRegion-beforeЗаголовокregion-afterФутерregion-startНачальнаяregion-endКонечная

Каждый, из рассматриваемых элементов, кроме region-body, имеет атрибут extent. Для region-before и region-after он определяет высоту области. Для region-start и region-end - ширину. Центральной (основной) области отводится вся страница, кроме отступов [4]. То есть, она занимает пространство других областей. Для неё существуют атрибуты, задающие отступы. Можно задать величины отступов таким образом, чтобы основная область не перекрывала другие. Имена рассматриваемых атрибутов, задающих отступы, соответствуют атрибутам страницы. Они представлены в таблице 3.3.

Демонстрационный пример xsl-файла представлен ниже.


<? xml version="1.0" encoding="utf-8"? >

<xsl: stylesheet version="1.0" xmlns: xsl="#"justify"><xsl: template match="specification">

<fo: root>

<fo: layout-master-set>

<fo: simple-page-master page-height="210mm"width="297mm"top="8mm"bottom="5mm"left="5mm"right="5mm">

<fo: region-body margin-top="27mm"bottom="90mm"left="0mm"right="0mm"/>

<fo: region-before extent="27mm"/>

<fo: region-after extent="90mm"/>

</fo: simple-page-master>

</fo: layout-master-set>

<fo: page-sequence>

. <! - Содержимое документа - ->

</fo: page-sequence>

</fo: root>

</xsl: template>

</xsl: stylesheet>


Как уже упоминалось ранее, первая страница спецификации, а точнее, её штамп, отличается от штампа, представленного на второй и последующих страницах. Отсюда можно сделать вывод, что представление этих страниц должно быть описано с помощью разных шаблонов. Для этого необходимо каждому макету страницы присвоить имя, а в элементе fo: simple-page-master указать атрибут master-name с именем данного шаблона. Соответствующий объект fo: page-sequence, содержащий описание представления данных на старнице, должен иметь потомка - атрибут master-reference. Описываемый объект должен указывать на имя одной из мастер-страниц в элементе fo: layout-master-set [1].

При использовании нескольких мастер страниц необходима их группировка в элементе fo: page-sequence-master. Рассматриваемый объект является дочерним элементу fo: layout-master-set, в котором с помощью одного или нескольких дочерних элементов задается порядок, в котором будут инициализироваться конкретные мастер-страницы. Таким образом определяется последовательность расположения описанных страниц. Для задания этой последовательности применяется элемент fo: single-page-master-reference с атрибутом master-reference, указывающим на имя одной из мастер-страниц. Пример соответствующего фрагмента файла XSL, приведён ниже.


<fo: layout-master-set>

<fo: simple-page-master master-name="page1"height="310mm"width="397mm"top="8mm"bottom="5mm"left="5mm"right="5mm">

<fo: region-body margin-top="37mm"bottom="90mm"left="0mm"right="0mm"/>

<fo: region-before extent="37mm"/>

<fo: region-after extent="90mm"/>

</fo: simple-page-master>

<fo: simple-page-master master-name="page3"height="310mm"width="397mm"top="8mm"bottom="5mm"left="5mm"right="5mm">

<fo: region-bodytop="37mm"bottom="15mm"left="0mm"right="0mm"/>

<fo: region-before extent="37mm"/>

<fo: region-after extent="15mm"/>

</fo: simple-page-master>

<fo: page-sequence-master master-name="contents">

<fo: single-page-master-reference master-reference="page1"/>

<fo: single-page-master-reference master-reference="page3"/>

</fo: page-sequence-master>

</fo: layout-master-set>


Данные, относящиеся к штампу, как было сказано ранее, статичны. Для описания статичных областей применяется элемент fo: static-content с атрибутом flow-name, указывающим на регион, для которого инициализирована мастер страница [2]. То есть, объект fo: static-content является потомком элемента fo: page-sequence. Значения атрибута flow-name указаны в таблице 3.5.


Таблица 3.5 - Значения атрибута flow-name

Значения атрибута flow-nameОписание областиxsl-region-bodyЦентральнаяxsl-region-beforeЗаголовокxsl-region-afterФутерxsl-region-startНачальнаяxsl-region-endКонечная

Содержимое же центральной области страницы, напротив, изменяется. Данные, извлечённые с помощью XSLT из xml-документа, "перетекают" с одного листа на другой. То есть fop-процессор, обрабатывая fo-файл, должен помещать данные на основную область страницы до тех пор, пока на ней хватает места. Как только ресурс листа иссякнет, fop-процессор должен создать новый лист и продолжить добавление данных. Этот процесс должен продолжаться до тех пор, пока все данные из fo-файла не будут внесены в файл формата PDF. Соответственно объём данных, расположенных в файле FO, а ранее в файле XML, определит количество страниц в файле PDF. Для реализации поточного метода выборки и представления данных в спецификации языка XSL-FO предусмотрен элемент fo: flow. Рассматриваемый объект хранит реальное содержимое, которое будет размещаться на страницах в соответствии с мастер-страницами. Это содержимое образуется последовательностью элементов: fo: block, fo: block-container, fo: table [1].

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


Таблица 3.6 - Атрибуты, используемые при форматировании текста, и их описание

АтрибутОписаниеfont-familyНазвание шрифтаfont-sizeРазмер шрифтаText-alignПоложение текста в блокеStart-indentОтступ слеваend-indentОтступ справа

Размер шрифта указывается так: font-size=14pt. Атрибут text-align, указывающий положение текста в блоке, может принимать следующие значения: center, left, right. Отступы слева и справа указываются в миллиметрах.

По умолчанию границы блока невидимы, но с помощью специальных атрибутов можно указать fop-процессору, где их необходимо нарисовать. Также можно указать толщину линий, в противном случае она будет принята по умолчанию 3.6 мм. Атрибуты, используемые для задания границ и их толщины, представлены в таблице 3.7.


Таблица 3.7 - Атрибуты, используемые для задания границ и их толщины

АтрибутОписаниеborder-styleГраницы для всего блокаBorder-before-style / border-top-styleГраница перед текстомborder-after-style / border-bottom-styleГраница после текстаBorder-start-style / border-left-styleГраница слеваborder-end-style / border-right-styleГраница справаborder-widthТолщина границы для всего блокаborder-before-width / border-top-widthТолщина границы перед текстомBorder-after-width / border-bottom-widthТолщина границы после текстаBorder-start-width / border-left-widthТолщина границы слеваBorder-end-width / border-right-widthТолщина границы справа

Объект fo: block-container предназначен для группировки нескольких блоков, либо для задания некоторых свойств конкретного блока. В рассматриваемой спецификации в некоторых ячейках штампа текст располагается вертикально. Для того, чтобы в шаблоне XSL задать поворот текста на 90 градусов, необходимо воспользоваться атрибутом reference-orientation, принадлежащем элементу fo: block-container. При этом нужно разрешить поворот текста с помощью атрибута position, присвоив ему значение absolute [4]. Для того, чтобы опустить или приподнять текст, используют атрибут top. Если необходимо текст опустить, то указывается положительное значение отступа в миллиметрах, в противном случае - отрицательное.

Объект fo: table применяются для описания таблиц. К его прямым потомкам относятся следующие элементы: fo: table-column, fo: table-body, fo: table-row, fo: table-cell [2].

Элемент fo: table-column задаёт колонку в таблице. Последовательность из пяти таких объектов задаёт пять колонок, соответственно. С помощью атрибута column-number указывается порядковый номер колонки. При помощи column-width - её ширина.

Объект fo: table-body включает в себя узлы, описывающие строки и ячейки таблицы. Он задаёт рабочую зону таблицы. То есть в нём находится фактическое содержимое таблицы. В нём, с помощью соответствующих атрибутов, могут быть указаны свойства текста.

Элемент fo: table-row используется для группировки в строки ячеек таблицы. В нём с помощью атрибута line-height указывается высота строк.

Содержимое каждой ячейки размещается в объекте fo: table-cell. Пример использования элементов, описывающих представление таблиц, приведён ниже.


<fo: table>

<fo: table-column column-number="1" column-width="35mm"/>

<fo: table-column column-number="2" column-width="35mm"/>

<fo: table-column column-number="3" column-width="20mm"/>

<fo: table-body font-family="GOST_B" font-size="10pt" text-align="center">

<fo: table-row line-height="5.75mm" >

<fo: table-cell column-number="1" border-style="solid">

<fo: block> Инв. № подл. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Подп. и дата </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Взам. инв. № </fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-body/>

<fo: table>


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

В элементе fo: table-cell, можно указать, что ячейки таблицы должны перекрывать несколько рядов или колонок, установив атрибуты number-columns-spanned и number-row-spanned в целое числовое значение, соответствующее количеству перекрыываемых данной ячейкой рядов и колонок. Необязательный атрибут column-number может изменить номер колонки, с которой начинается перекрытие. По умолчанию это текущая колонка.

Для вывода номера страницы в документе необходимо указать в шаблоне элемент <fo: page-number/> [4].

В разрабатываемом шаблоне спецификации встречаются строки таблицы, не содержащие данных. В этом случае процессор форматирующих объектов Apache FOP не выделяет места в pdf-документе для данной строки. Он только рисует границы ячеек, если они заданы. Для того, чтобы fop-процессор выделил место под строку, необходимо добавить в неё данные, к примеру, пробел. Но, Apache FOP пропускает те пробелы, которые указаны в начале и в конце текстовой строки, а также пробеллы "стоящие сами по себе". Для того, чтобы указать символ пробела явно, нужно воспользоваться записью такого вида: &#160;. Где 160 - код символа "пробел" в кодировке UTF-8. Рассматриваемый элемент &#160; относится к объектным ссылкам, "границы" объектной ссылки указываются с помощью символов & и;. Знак # указывает на то, что 160 - это код символа.

Если текст не помещается в ячейке таблицы, Apache FOP переносит его на новую строчку. В соответствии ГОСТ 2.113 - 75, многострочный текст в некоторых случаях может занимать одну строку таблицы. Для решения данной проблемы в случае с колонкой "Примечание" текст в PartList разбивается на две строки, данные которых помещаются соответственно в атрибуты: PRIMECHANIE_1 и PRIMECHANIE_2 разработанного XML документа. При этом уменьшается шрифт и задаются размеры для новых строк, входящих в ячейку. В результате текст располагается в ней в две строки, но принадлежит одной строке таблицы. В противном случае примечание выводится в атрибут PRIMECHANIE. Описанное представление ячейки таблицы приведено ниже.


<fo: table-cell border-after-style="solid" border-end-style="solid">

<fo: block font-size="14pt">

<xsl: value-of select="@PRIMECHANIE"/>

</fo: block>

<fo: block-container line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_1"/>

</fo: block>

</fo: block-container>

<fo: block-container top="3.82mm" line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_2"/>

</fo: block>

</fo: block-container>

</fo: table-cell>


Разработанный шаблон XSL, описывающий представление групповой спецификации по ГОСТ 2.113 - 75, приведён в приложении A.


3.4 Алгоритм преобразования исходного XML в новый XML


В соответствии с ГОСТ 2.113 - 75 в групповой спецификации отступы в виде строк между разделами могут задаваться в зависимости от требований организации. Как правило, первая и последняя строки основной области страницы должны быть пустыми. Не допускается разрыв в виде переноса на другой лист между наименованием раздела и соответствующими данными. Если данные заполняют не всю страницу, необходимо, добавить, пусты строки.

Средствами, предоставляемыми XSL и MSXSL, не возможно обеспечить выполнение всех перечисленных требований. В настоящей квалификационной работе для решения указанной проблемы разработано специальное приложение, преобразующее исходный xml-документ в новый xml-документ. В частности, это приложение определяет, где в таблице спецификации необходимо вставить "пустые" строки (<line FORM="&#160; "/>), и добавляет их.

Приложение разработано на языке С++, имеет графический пользовательский интерфейс и использует библиотеки: MFC и Win32API. Процесс его реализации описан в пункте 4.


3.5 Использование MSXSL и Apache FOP


Для выполнения XSLT-инструкций, описанных в разработанном шаблоне, применим программу MSXSL. Для запуска преобразования xml-документа в fo-файл необходимо выполнить команду: msxsl example. xml example. xsl /o example. fo

Где msxsl - это программный модуль, выполняющий преобразование. Example. xml - имя преобразуемого xml-файла. Example. xsl - имя применяемого xsl-шаблона. Следующий элемент указывает на то, что полученный в результате файл должен быть сохранен. Последний элемент указывает имя файла результата. В рассмотренном примере, в качестве параметров передаются только имена файлов. Подразумевается, что файлы находятся в одном каталоге с MSXSL. Если это не так, необходимо передать полный путь к тем, которые находятся в не рабочего каталога, рассматриваемого приложения.

После создания fo-файла, содержащего xml-данные и объекты форматирования, необходимо запустить приложение Apache FOP для преобразования его в pdf-файл.

На сегодняшний день рекомендуемая консорциумом World Wide Web версия fop-процессора 0.20.5. Но, по причине того, что программа этой версии не поддерживает возможность поворота текста, была выбрана последняя версия 0.93 [11].

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

этап.Скопировать нужный файл шрифта (Arial. ttf) из каталога Windows в каталог fop-процессора (к примеру, в C: \fop-0.93\conf\Fonts).

2 этап.Выполнить следующую команду (для генерации описания шрифта):

java - cp C: \fop-0.93\build\fop. jar; C: \fop-0.93\lib\avalon-framework-4.2.0. jar; C: \fop-0.93\lib\commons-logging-1.0.4. jar; C: \fop-0.93\lib\commons-io-1.1 jar org. apache. fop. fonts. apps. TTFReader - d C: \fop-0.93\conf\Fonts\Arial. ttf C: \fop-0.93\conf\Fonts\Arial. xml

этап.Добавить запись в файл C: \fop-0.93\conf\fop. xconf, следующего вида (должна находиться внутри тэгов <fonts> </fonts>):


<font metrics-url="C: \fop-0.93\conf\Fonts\arial. xml" kerning="yes" embed - url="C: \fop-0.93\conf\Fonts\arial. ttf">

<font-triplet name="Arial" style="normal" weight="normal"/>

<font-triplet name="ArialMT" style="normal" weight="normal"/>

</font>


Запуск FOP производится с помощью команды:

C: \fop-0.93\fop - c C: \fop-0.93\conf\fop. xconf Example. fo Example. pdf.

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

Второй предназначен для того, чтобы применился третий.

Третий атрибут - это путь к файлу с объявлением шрифтов.

Четвёртый атрибут - путь к fo-файлу.

Пятый атрибут - путь к pdf-файлу.

В рамках текущей главы:

-разработана структура xml-документа;

-разработаны xsl-шаблоны, описывающие преобразование и представление групповой спецификации;

-подключены шрифты, поддерживающие кириллицу, к приложению Apache FOP;

-выяснен формат командной строки для программ MSXSL и Apache FOP.

4. Разработка конвертера xml-представлений групповых спецификаций на сборочное изделие, в pdf-формат


4.1 Разработка приложения


4.1.1 Реализация пользовательского интерфейса

Для разработки интерфейса пользователя воспользуемся средствами, предоставляемыми Microsoft Visual Studio 2010 и библиотекой MFC. Использование которой возможно только при написании программ на языке Visual C++. Для создания проекта в рассматриваемой среде программирования, необходимо: запустить рассматриваемую программу (в случае, если она уже инсталлирована на ПК, иначе, сначала установить её); в меню "File" выбрать "New"; в открывшемся подменю щёлкнуть левой кнопкой мыши по "Project", рисунок 4.1; в открывшемся окне, в элементе, отображающем дерево проектов выбрать "Visual C++", а затем "MFC"; в дочернем окне с названием "Templates", выбрать "MFC Application"; указать имя создаваемого проекта (в нашем случае "XMLConverter"), и каталог, где он будет располагаться, как показано на рисунке 4.2; щёлкнуть "OK"; в открывшемся окне, во вкладке "Application Type", указать "Dialog based"; выбрать "Use MFC in a static library" (в этом случае все библиотеки MFC, при компиляции, будут упакованы в файл EXE, разрабатываемого приложения), как показано на рисунке 4.3; щелкнуть "Finish".


Рисунок 4.1 - Подменю с использованием кнопки "Project"


Рисунок 4.2 - "XMLConverter" с располагаемым каталогом


Рисунок 4.3 - Выбор категории "Use MFC in a static library"


В созданном проекте, для редактирования диалогового окна, щёлкаем в меню по "View". В открывшемся списке выбираем "Resource View". В появившемся окне, в дереве представляющем ресурсы проекта, щёлкаем по элементу "Dialog". В раскрывшемся списке выбираем "IDD_XMLCONVERTOR_DIALOG", как показано на рисунке 4.4.


Рисунок 4.4 - Выбор диалога "IDD_XMLCONVERTOR_DIALOG"


Для добавления элементов в форму, нам понадобится меню "Toolbox". Для его открытия необходимо щёлкнуть в меню "View" по элементу с соответствующим именем. Из появившегося диалогового меню будем использовать объекты: "Button", "Edit Control", "Combo Box", "Static Text", "List Control". На рисунке 4.5 показана часть меню "Toolbox".


Рисунок 4.5 - Часть меню "Toolbox"


Для того чтобы добавить элемент, достаточно щёлкнуть мышкой по выбранному объекту, и держа клавишу нажатой, перетащить его на редактируемый диалог. Для открытия окна свойств добавленного элемента необходимо, щёлкнуть по нему правой кнопкой мыши, выбрать, в появившемся контекстном меню, элемент "Properties" (Рисунок 4.6).

Добавим необходимые элементы к окну разрабатываемого приложения, как показано на рисунке 4.7 С помощью поля "Caption", свойств каждого объекта, приведём его заголовок в соответствие с рассмотренным рисунком.


Рисунок 4.6 - Выбор элемента "Properties"


Рисунок 4.7 - Добавление необходимых элементов к окну разрабатываемого приложения


Для того чтобы при запуске приложения кнопки: "Преобразовать xml в pdf" и "Удалить выбранный элемент" были не активны, нужно установить, в свойствах каждого элемента, значение поля "Disabled" в "True". Чтобы элемент "List Control" отображал колонки, необходимо в его свойствах, для поля "View" указать значение "Report". Для оконного объекта "Combo Box", в поле "Type" нужно выбрать значение "Drop List". Чтобы рассматриваемый объект содержал значения, воспользуемся полем Data, введя в него строку вида "ГрупСпец_Ф1_gost-B_0-9; ГрупСпец_Ф1_gost-B_10-19; ГрупСпец_Ф1_gost-B_20-29;". В которой через точку с запятой указан список значений элемента "Combo Box". Так как поле, в котором будет отображаться директория для вывода pdf-файлов, не должно подвергаться редактированию, установим его свойство "Read Only" в "True".

Добавим в класс разрабатываемой формы функции - обработчики событий, вызываемые по нажатию соответствующей кнопки. То есть, определим методы, каждый из которых будет вызываться при получении формой соответствующего сообщения от Windows. Для этого, в редакторе форм, два раза щелкнем по кнопке в окне разрабатываемой программы. Редактор Visual Studio автоматически добавит функцию - обработчик сообщения "ON_BN_CLICKED" (отправляемого Windows приложению при щелчке левой кнопкой мыши по элементу "Buttom"), которое поступит в очередь и обработается приложением в порядке следования. Так как сообщения обрабатываются программой очень быстро, щёлчек пользователя по описываемой кнопке, запущенного на выполнение приложения, вызовет соответствующую функцию практически мгновенно. Таким образом добавляются обрабочки событий щелчка левой кнопки мыши для каждого объекта "Buttom".

Для элемента формы типа "List Control", с идентификатором ресурса "IDC_LIST1" определим три обработчика следующих сообщений: "LVN_ITEMCHANGED", "LVN_DELETEITEM", "LVN_ITEMACTIVATE". Первый будет вызываться при выборе элемента, рассматриваемого объекта. Второй при его удалении. Третий при двойном щелчке мышкой по элементу. Для их добавления, необходимо щёлкнуть правой кнопкой мыши по рассматриваемому элементу, в окне редактора форм, и в появившемся меню выбрать "Add Event Handler". В выведенном окне (Рисунок 4.8): выбрать сообщение; указать класс (в данном случае "CXMLConverterDlg"), в который будет добавлена функция; ввести имя добавляемого метода в поле с названием "Function handler name" или оставить предложенное по умолчанию. После выполнения описанных действий щёлкнуть по кнопке "Add and Edit".


Рисунок 4.8 - Указание класса "CXMLConverterDlg"


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


CListCtrl *pList = (CListCtrl*) GetDlgItem (IDC_LIST1);>InsertColumn (0,_T ("Полный путь к xml-файлу"),0,370,-1);>InsertColumn (1,_T ("Статус"),0,100,-1);>InsertColumn (2,_T ("Состояние"),0,100,-1);


Здесь, с помощью функции GetDlgItem () получаем указатель на оконный элемент с идентификатором "IDC_LIST1". Метод InsertColumn () создаёт колонку. В него в качестве параметров передаются: порядковый номер, название, положение текста (0 означает, что текст будет выравниваться по левому краю), ширина, связь с другими колонками (если значение - 1, связи нет). Макрос _T () применяется для преобразования строки в Unicode. Рассмотренный фрагмент кода необходимо поместить в виртуальную функцию OnInitDialog (), которая вызывается Windows при инициализации диалогового окна [6].

Данные выводятся в "IDC_LIST1" с помощь функций: InsertItem () и SetItem (). Первый метод используется для добавления элементов в главный (первый) столбец. Второй для добавления элементов в дочнрние столбцы. В качестве параметра в каждую из функций передается указатель на структуру типа "LV_ITEM". Которая содержит переменные определяющие: номер (позицию) элемента в строке, номер столбца, выводимый текст, максимальную длину выводимой строки. Структура инициализируется перед вызовом функций: InsertItem () и SetItem () [6]. Демонстрационный пример кода представлен ниже.

*pList = (CListCtrl*) GetDlgItem (IDC_LIST1);_ITEM lvitem;. mask = LVIF_TEXT;. iItem = 0;. iSubItem = 0;. pszText = str. GetBuffer ();. cchTextMax = lstrlen (str);>InsertItem (&lvitem);. iSubItem = 1;. pszText = _T ("Не выполнено");. cchTextMax = lstrlen (_T ("Не выполнено"));>SetItem (&lvitem);


Флаг "LVIF_TEXT" разрешает вывод текста. Переменная str строкового типа CString, который является классом входящем в MFC и предоставляет широкие возможности работы со строкой.

Переменная данного типа является динамической, то есть память под нее выделяется по мере необходимости. Так как переменная pszText, структуры lvitem, должна присвоить указатель, адресующий статический блок памяти, необходимо сделать его таковым. Для этого применяется метод класса CString именуемый GetBuffer () [6]. Чтобы считать данные из элемента типа "List Control", нужно заменить в рассмотренном коде вызов функции InsertItem () на GetItem (). После её выполнения в переменной str окажется текст требуемой ячейки.

Чтобы удалить необходимую строку, используют функцию DeleteItem (), как показано ниже.

*pList = (CListCtrl*) GetDlgItem (IDC_LIST1);>DeleteItem (m_nSelectItem);


Где m_nSelectItem - порядковый номер удаляемой строки. Весь элемент "List Control" очищают с помощью метода DeleteAllItems ().

Для ввода полного пути к преобразуемому xml-файлу, воспользуемся стандартным диалоговым классом CFileDialog, предоставляемым MFC. Объявим переменную типа этого класса.

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

Второй установим в 0. Третий, указывает, какого типа файлы будут видны в диалоге. Для запуска построения модального диалогового окна открытия файла воспользуемся функцией DoModal ().

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

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

fdialog (TRUE,0,_T ("*. xml"));. DoModal ();


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

_t sDir [512];brinfo;. hwndOwner = 0;. pidlRoot = 0;. pszDisplayName = sDir;. lpszTitle =_T ("Выберите папку для вывода pdf-файлов");. ulFlags = BIF_RETURNONLYFSDIRS;. lpfn = 0;. lParam = 0;


Для вывода диалогового окна воспользуемся функцией SHBrowseForFolder (&brinfo).

Которая возвращает значение типа LPITEMIDLIST. Используя переменную рассмотренного типа и функцию SHGetPathFromIDList () получим путь к выбранной пользователем папке. Пример представлен ниже.

pDirList = SHBrowseForFolder (&brinfo);(pDirList,sDir);


В результате будет выводится диалог представленный на рисунке 4.9.


Рисунок 4.9 - Выведение диалога


Для того, чтобы сделать не активными кнопки программы необходимо воспользоваться функциями: GetDlgItem () и EnableWindow (). Первая возврвщает указатель на объект. Вторая делает его пассивным, либо активным, в зависимости от значений FALSE или TRUE, соответственно. Применение этих функций продемонстрированно ниже.(IDC_BUTTON1) - >EnableWindow (FALSE);

Для предусмотрения возможности ввода количества отступов до и после раздела в генерируемой спецификации, создадим с помощью редактора форм диалоговое окно. Для этого в меню "Resource View" (Рисунок 4.4) нужно щёлкнуть правой кнопкой мыши по элементу "Dialog" и выбрать "Add Resource". В появившемся окне (Рисунок 4.10) выбрать "Dialog" и щёлкнуть "New". В результате в проект будет добавлен новый шаблон диалога. После выполнения ряда действий, принципы проведения которых были описаны ранее, получется диалоговое окно представленное на рисунке 4.11.


Рисунок 4.10 - Выбор категории "Dialog" и кнопки "New"


Рисунок 4.11 - Получение диалогового окна


После создания формы диалога, необходимо добавить для нее класс в проект. Для этого необходимо щёлкнуть правой кнопкой мыши по форме и в появившемся контекстном меню выбрать "Add Class". В выведенном на экран окне указать имя создаваемого класса "CSetting" в поле "Class name". В качестве базового класса, методы которого будут наследоваться, оставить предложенный по умолчанию CDialog. Щелкнуть "Finish". При добавлении событий для элементов формы, их обрабочики будут помещаться в определённый для них класс Setting. То есть, в только что созданный. Далее неообходимо указать заголовочный файл нового диалога в cpp-файле основного диалога. Затем внести объявление класса в виде записи "class CSetting" в заголовочный файл класса CXMLConverterDlg. Для вызова окна представленного на рисунке 4.11 при щелчке мышкой по кнопке в главном диалоге, необходимо внести в обработчик соответствующего события код представленный ниже.

*pSitting = new CSitting ();>DoModal ();[] pSitting;


Для того, чтобы считывать и хранить значения вносимые в элемент "Edit Controll" необходимо добавить переменную. Для этого в редакторе форм необходимо щёлкнуть правой кнопкой мыши по нужному объекту, выбрать в меню "Add Variable". В появившемся окне указать категорию, имя и тип переменной. Возможно так же ввести минимальное и максимальное её значения. Пример представлен на рисунке 4.12.


Рисунок 4.12 - Выбор объекта "Add Variable"


В результате выполнения работ описанных в текущей главе, был разработан пользовательский интерфейс приложения XMLConverter.

4.1.2 Разработка функций реализующих алгоритм преобразования исходного XML в новый XML

Во время выполнения настоящей квалификационной работы был разработан алгоритм преобразования xml-документа в промежуточный xml-документ. При его рассмотрении примем во внимание, что все расчёты количества добавляемых строк ведутся с учётом заданных величин отступов сверху и снизу для разделов в спецификации. Отступы представлены в виде пустых строк. Введём в алгоритм счётчик общего количества строк i. Он нужен для контроля позиции текущего элемента, а также, чтобы вычислить количество пустых строк, которые необходимо добавить в конец xml-документа. Перед запуском алгоритма i равно 0. Под элементами будем понимать, теги <line/> и <section/>. Преобразование рассматривается на уровне этих объектов. Рассматривая их, будем иметь в виду, что они несут с собой данные, хранимые в атрибутах. Каждый из этих элементов (<line/> и <section/>) образует строку таблицы спецификации. То есть, говоря о строке pdf-документа, будем подразумевать, что это <line/> или <section/> xml-документа и наоборот.

Алгоритм состоит из следующих шагов.

этап.Увеличиваем счётчик на единицу. Рассматриваем i-ю строку xml-документа. Если это <section/>, переходим к этапу 2. Иначе переходи к этапу 5.

2 этап.Проверяем, не попадёт ли раздел на вторую строку страницы спецификации, при добавлении пустых строк (по одной, начиная с нуля) сверху, в пределах заданного отступа. Если да, вносим необходимое число пустых элементов <line/> и увеличиваем счётчик на количество добавленных строк. Переходим к этапу 7. Иначе, увеличиваем счётчик на величину заданного отступа. Переходим к этапу 3.

этап.Проверяем, не получается ли разрыв между разделом и первой не пустой строкой, после него, в виде переноса последней на другой лист спецификации, при добавлении пустых строк (по одной, начиная с нуля) снизу, в пределах заданного отступа. Если да, добавляем перед <section/> необходимое число <line/>, сдвигая, таким образом, раздел на вторую строку следующего листа. Увеличиваем счётчик на число добавленных строк. Переходим к этапу 7. В противном случае переходим к этапу 4.

этап.Проверяем, не попадёт ли раздел на первую строку страницы спецификации. Если да, добавляем перед <section/> один пустой <line/> и увеличиваем счётчик на единицу. Переходим к этапу 7.

этап.Проверяем, не попадёт ли <line/> на последнюю строку страницы спецификации. Если да, добавляем перед ним две пустых строки и увеличиваем счётчик на два. Переходим к следующему этапу.

этап.Проверяем, не попадёт ли <line/> на первую строку страницы спецификации. Если да, добавляем перед ним один пустой <line/> и увеличиваем счётчик на единицу. Переходим к этапу 8.

этап.Увеличиваем счётчик на величину заданного отступа снизу раздела. Переходим к следующему этапу.

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

Перейдем к программной реализации представленного алгоритма. Чтение данных из xml-файла производится с помощью функции ReadFile (). Но, для начала, необходимо открыть файл с помощью функции CreateFile () [10]. Рассмотрим следующий фрагмент кода.

hFile = CreateFile (sDir,GENERIC_READ,0,0,OPEN_EXISTING,0,0);fileSize = GetFileSize (hFile,0);*fileBuffer = new char [fileSize];bytesRead;(hFile,fileBuffer,fileSize,&bytesRead,0);


Первый параметр передаваемый в функцию CreateFile () - это строковая переменная содержащая путь к открываемому xml-файлу. Флаг GENERIC_READ означает, что файл открывается только для чтения. Флаг OPEN_EXISTING сведетельствует от том будет открыт существующий файл. Рассматривыемый метод возвращает идентификатор открытого ресурса (файла). Функция GetFileSize () возвращает размер открытого файла. С помощью функции ReadFile () данные всего файла считываются в оперативную память (по адресу содержащемуся в fileBuffer). Третий параметр рассматриваемого метода - количество байт для чтения. После выполнения функции, переменная bytesRead будет содержать число реально прочитанных байт.

Для программной проверки, не попадёт ли раздел на вторую строку страницы спецификации (этап 2, рассмотренного алгоритма) был разработан следующий фрагмент кода.

(DWORD k = 0; k < kline_before + 1; k++)

{( ( (*line) + k == 2) || ( (*line) + k == (K+2)) || ( ( ( (*line) + k - (K+2)) % T == 0) && ( ( (*line) + k) > (K+2))))

{[section] [2] = k;= true;;

}

}


Здесь переменная kline_before содержит значение количесива пустых <line/> добавляемых сверху <section/>. По адресу хранящимуся в line, находится значение счётчика строк. Переменная K - это количество строк на первой странице спецификации. Т - количество строк на 2й и последующих страницах спецификации. Переменная section содержит количество просмотренных разделов. И соответственно, номер текущего раздела. Переменая массива positionSectionStart [section] [2] содержит количество строк добавляемых перед текущим разделом. Переменная массива positionSectionStart [section] [0] содержит позицию символа < (текущего тега <section/> или <line/>) в xml-файле. Значение элемента массива positionSectionStart [section] [1] информирует о том, что positionSectionStart [section] [0] содержит позицию объекта <section> или <line/>.

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

(DWORD k = 0; k < kline_after + 2; k++)

{

// Проверяем не попала ли секция в конец листа спецификации( ( ( (*line) +k) == K) || ( ( ( ( (*line) +k-K) %T) == 0) && ( ( (*line) +k) > K)))

{

(*section10_29) ++;_29 [*section10_29] [0] = section;

// Должны быть добавлены как минимум 2 строки_29 [*section10_29] [1] = k + 2;

*line += k + 2;;

}

}


Здесь переменная kline_after одержит значение количесива пустых <line/> добавляемых снизу <section/>. По адресу хранящимуся в section10_29 находится значение счётчика разделов попавших в начало или конец листа спецификации. Элемент массива positionSection10_29 [*section10_29] [0] содержит порядковый номер раздела в xml-документе. Переменая positionSection10_29 [*section10_29] [2] содержит число дополнительно добавляемых строк перед разделом, для переноса его на новый лист спецификации.

Программная реализация проверки попадания раздела в конец листа спецификации представлена ниже.

( (*line == 1) || (*line == (K+1)) || ( ( (*line - (K+1)) %T== 0) && ( (*line > (K+1))))

{

(*section10_29) ++;_29 [*section10_29] [0] = section;_29 [*section10_29] [1] = 1;

*line ++;;

}


Проверка на этапах 5 и 6 реализуется аналогично.

Код функций, реализующих алгоритм преобразования xml-файла в новый xml-документ, представлен в приложении B.


4.2 Создание инсталляционного пакета


Для создания пакета инсталляции разработанного приложения и всех сопутствующих компонентов воспользуемся бесплатно распространяемой программой "NetScat Extreme Installer", версии 1.04. Для этого, после её запуска на вкладке "Общие" введём данные, как показано на рисунке 4.13.


Рисунок 4.13 - Использование программы "NetScat Extreme Installer"


На вкладке "Файлы" укажем директорию, в которой находятся файлы, предназначенные для компоновки создаваемого инсталлятора. Вкладка "Ярлыки" предназначена для ввода данных о ярлыках, которые необходимо создать инсталлятору при установке приложения. Соответствующие информационные поля заполняются, как показано на рисунке 4.14. Запись "%Desktop%" обозначает, что ярлык будет создан на рабочем столе. То есть вместо этой записи будет подставлен путь к папке рабочего стола. Запись "%Dest%" обозначает путь к рабочей папке устанавливаемого приложения. Далее необходимо набрать текст лицензионного соглашения на вкладке "Соглашение". Есть возможность загрузить уже существующее соглашение из файла с расширением rtf или txt. На вкладке "Языки" выбираются языки, перечень которых будет предложен при запуске инсталляционного пакета, созданного NetScat Extreme Installer. Результат выбора определит, какой из представленных языков будет использован мастером, для ведения диалога с пользователем во время установки.


Рисунок 4.14 - Заполнение соответствующих информационных полей


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

В результате работы программы NetScat Extreme Installer, был создан инсталляционный пакет для программы XMLConvertor и сопутствующих ей компонентов.


4.3 Руководство пользователя


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

этап.Для установки программы запустить файл_Setup. exe, следовать предписаниям программы установщика.

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

3 этап.После запуска приложения, щёлкнуть мышкой по кнопке "Выбрать xml-файл". Файлов можно выбрать несколько, все они будут преобразованы поочерёдно. Если выбран не тот файл, его можно удалить из списка, воспользовавшись кнопкой "Удалить выбранный элемент".

этап.Выбрать с помощью ниспадающего списка требуемый xsl-шаблон, он будет применён для всех выбранных xml-файлов.

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

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

этап.Щёлкнуть преобразовать xml в pdf. На экране появятся поочерёдно два окна консоли. Это работают MSXSL и процессор форматирующих объектов Apache FOP.

этап.После выполнения требуемых операций xml-файлы будут преобразованы в PDF, напротив каждого пути (отображаемого в окне приложения) в столбце состояния появится надпись "Выполнено".

этап.Для открытия директории, где находятся полученные pdf-файлы с помощью встроенного в Windows файлового менеджера Explorer, достаточно щёлкнуть по кнопке "Открыть".

В рамках настоящей квалификационной работы было разработано приложение, предоставляющее интуитивно понятный пользовательский интерфейс, позволяющий управлять компонентами, входящими в его состав. Был разработан и реализован в программе, алгоритм обработки структуры данных xml-файла в новый xml-документ. Пример первых двух страниц полученного pdf-документа, в результате работы программы XMLConverter, представлен соответственно в приложениях С и D.

5. Организационно-экономические расчеты


5.1 Обоснование необходимости и актуальности разработки


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

Локализацией одной из систем, а именно Creo, занимаются специалисты инженерно-консалтинговой компании Солвер. Данная промышленная система обладает возможностью параллельной разработки изделия: основной стратегией, применяемой ведущими компаниями. Многочисленный набор программных решений позволяет выбрать необходимую конфигурацию каждого рабочего места в соответствии с его функциональностью. Сюда включаются возможности промышленного дизайна, проектирования механических конструкций (в том числе, управление большими сборками), имитации функциональности изделия, изготовления и управления инженерными данными.

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

Один из недостатков Creo - отсутствие удобных средств подготовки конструкторской документации в соответствии с отечественной ЕСКД. В том числе - средств формирования спецификаций на сборочное изделие.

Для преодоления указанного недостатка в компании "Солвер" был разработан плагин (надстройка) PartList для формирования спецификаций на сборочное изделие в соответствии с отечественными ГОСТами.

Модуль PartList предназначен для автоматизации процесса создания спецификации на сборочное изделие, разработанное в Creo (Рисунок 1). После установки модуль автоматически подключается в момент запуска Creo и позволяет назначать значения параметров спецификации компонентов сборки, устанавливать позиции компонентов (автоматически или вручную), формировать выходной документ для просмотра и печати.

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

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


5.2 Определение трудоемкости разработки программного продукта


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

Параметры разрабатываемого ПП приведены в таблице 5.1.


Таблица 5.1 - Параметры разрабатываемого ПП

ПараметрЗначениеСтадии разработки ПП1) техническое задание2) технический проект3) рабочий проект4) внедрениеСтепень новизны ПППС, является развитием определенного параметрического ряда ПС на прежнем типе ЭВМ/ОСНовый тип ЭВМ----------Новый тип ОС----------Степень охвата реализуемых функций стандартными ПП60%Средства разработки ППСистемы программирования на основе Java c СУБД (MySQL), Google Web Toolkit, Spring Framework, HibernateХарактер среды разработкиПерсональные IBM PC-совместимые ЭВМ c ОС Windows Группа сложностиГруппа 3 (минимальная сложность) Функции ПП1) вывод данных на экран2) обработка ошибочных ситуаций3) формирование базы данных4) обработка записей базы данных5) конвертация документа

В соответствии с параметрами ПП, указанными в таблице 5.1, определим численные величины, характеризующие ПП, используя для этого табличные зависимости, определенные "Нормами".

Результаты приведем в таблице 5.2.


Таблица 5.2 - Численные величины, характеризующие ПП

ВеличинаОбозначениеЗначениеУдельный вес трудоемкости стадий разработки ПП: предварительного проектирования, технического проекта, рабочего проекта и внедрения соответственноLПрПр0,06LТП0,5LРП0,34LВн0,1Поправочный коэффициент, учитывающий степень новизны ПП и использование при разработке ПП новых типов ЭВМ и ОСKН0,40Поправочный коэффициент, учитывающий степень использования в разработке стандартных ППKТ0,8Поправочный коэффициент, учитывающий характер среды разработки и средства разработки ППKУР0,17

Используя данные таблицы 5.2, произведем расчеты, необходимые для определения трудоемкости ПП, в соответствии с "Нормами". Значения рассчитанных величин приведем в таблице 5.3 Общий объем разрабатываемого ПП оценен в 24010 условных машинных команд.


Таблица 5.3 - Расчет трудоемкости ПП

ВеличинаОбозначение и порядок расчетаЗначениеКоэффициент сложности ПП1,16Общий объем разрабатываемого ПП 36940Базовая трудоемкость разработки ПП, чел. дниTБ1528Трудоемкость разработки ПП с учетом конкретных условий разработки, чел. дни259,8Общая трудоемкость разработки ПП, чел. дни 301,37

Общая трудоемкость разработки ПП, определяем по формуле:


= 125,3 чел. дней.


Таким образом, общая трудоемкость разработки ПП равняется 125,3 чел. дней.


5.3 Определение состава исполнителей


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


Таблица 5.4 - Расчет необходимого количества исполнителей

ВеличинаОбозначение и порядок расчета ЗначениеОбщее число дней в годуDK365Число выходных и праздничных дней в годуDВ118Фонд рабочего времени одного работающего в месяц, дни20.6Директивный срок выполнения разработки, мес. Д4

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



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


Таблица 5.5 - Состав исполнителей разработки ПП

Профессия исполнителяКоличество, чел. Месячный оклад, р. 1. Руководитель проекта124 5002. Ведущий программист113 000Всего 237 500

5.4 Расчет сметной стоимости и договорной цены разработки ПП


На момент написания работы ставка социальных отчислений составляет 30%;

Сметную стоимость и договорную цену ПП рассчитаем в таблице 5.12, выполнив предварительно расчеты составляющих сметной стоимости в таблицах 5.6-5.11.

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


Таблица 5.6 - Расчет затрат на материалы и покупные изделия

Наименование материалаЦена за единицу, р. Норма Расхода, штСтоимость, р. 1 Бумага для принтера20036002 Ручка203603 Диск DVD-RW503150Итого810Транспортно-заготовительные расходы (15%) 121.5Всего931.5

Таблица 5.7 - Показатели, по расчету затрат на оплату труда работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала

ПоказательОбозначениеНорматив минимальной заработной платы в РФ на дату планового расчета, р. ЗMINПовышающий коэффициентKПКоличество ПЭВМ, обслуживаемых одним работникомНОБСЛПроцент премииП

Расчет затрат на оплату труда работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала, проведем в таблице 5.8 При расчете исходим из того, что в информационно-вычислительном центре, где проходит разработка ПП, всего 10 машин.


Таблица 5.8 - Затраты на оплату труда работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала

Персонал, обеспечивающий функционирование ПЭВМДолжность работникаПоказательЗначениеПорядок расчета РОСНЗначение РОСНИнженер - электронщикЗMIN750010 800KП1НОБСЛ10П20Системный программистЗMIN65009 360KП1НОБСЛ10П20ОператорЗMIN52007 488KП1НОБСЛ10П20Административный персоналНачальник ИВЦЗMIN1000014 400KП1НОБСЛ10П20Вспомогательный персоналУборщицаЗMIN47006 768KП1НОБСЛ10П20

Расчет затрат на электроэнергию произведем в таблице 5.9.


Таблица 5.9 - Расчет затрат на электроэнергию

ВеличинаОбозначение и порядок расчетаЗначениеДлительность рабочей смены, часtСМ8Количество рабочих дней в плановом периодеDР247Продолжительность нерабочего времени в предпраздничные дни, часtП1Количество предпраздничных дней в плановом периодеDП9Номинальный фонд времени работы оборудования за рассчитываемый период, час 1975Число рабочих смен в суткиKСМ1Процент плановых потерь рабочего времени, %?20Эффективный годовой фонд времени работы ПЭВМ, час 1 580Стоимость электроэнергии на момент выполнения плановых расчетов, р. /кВт-часЦЭ2,97Суммарная мощность ПЭВМ с периферией, кВтPЭВМ1Затраты на силовую электроэнергию, р. 4692,6Суммарная мощность, которая идет на освещение, кВтPОСВ0,5Затраты на осветительную электроэнергию, р. 2346,3

Расчет затрат на эксплуатацию специального оборудования произведем в таблице 5.10.

Таблица 5.10 - Расчет на эксплуатацию специального оборудования

ПоказательЗначение Основная заработная плата работников, обеспечивающих функционирование ПЭВМ, в том числе: инженера-электронщика; системного программиста; оператора. 10 800 9 360 7 488Основная заработная плата административного персонала14 400Основная заработная плата вспомогательного персонала6 768Общая основная заработная плата работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала за расчетный период48 816Дополнительная заработная плата работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала9 763Социальные отчисления с заработной платы работников, обеспечивающих функционирование ПЭВМ, административного и вспомогательного персонала10 170Амортизационные отчисления с оборудования 2100Затраты на электроэнергию, в том числе: затраты на силовую электроэнергию; затраты на электроэнергию, идущую на освещение. 4692,6 2346,3 Общие затраты на электроэнергию 7038,9Расходы на профилактику оборудования540Прочие производственные расходы 14 644,8Годовые расходы на содержание и эксплуатацию одной ПЭВМ91 690Стоимость одного машино-часа работы ПЭВМ 59,1


Сумма расходов на содержание и эксплуатацию ПЭВМ, относящихся к данному программному продукту, составит 7400,2 р.

Расчет затрат на оплату труда и социальные отчисления осуществляется в таблице 5.11.

Таблица 5.11 - Расчет затрат на оплату труда и социальные отчисления

Профессия исполнителяКоличество исполнителей, чел. Месячный оклад, р. Заработная плата за период разработки ПП, р. (4 месяца) Руководитель проекта124 50098 000Ведущий программист113 00052 000Итого218 750150 000Дополнительная заработная плата (15%) --22 500Социальные отчисления с заработной платы р (30%) --51 750

Расчет сметной стоимости и договорной цены разработки ПП произведем в таблице 5.12.


Таблица 5.12 - Расчет стоимости и договорной цены разработки ПП

Наименование статьи затратСумма, р. Материалы и покупные изделия931.5Расходы на содержание и эксплуатацию оборудования7400Основная заработная плата исполнителей 150 000Дополнительная заработная плата исполнителей 22 500Социальные отчисления с заработной платы р51 750Научные и производственные командировки-Контрагентские расходы-Накладные расходы90000Сметная стоимость разработки ПП322 581.5Прибыль (20 %) 64516Договорная цена разработки387098

Таким образом, стоимость разработки программного комплекса программных средств для представления групповой спецификации на сборочное изделие, генерируемой модулем PartList в среде Creo, в pdf-формате. составляет 387098 рублей.

5.5 Расчет трудоемкости сопровождения ПП


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

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


Таблица 5.13 - Параметры, влияющие на расчет трудоемкости сопровождения ПП

ПараметрЗначениеХарактер внедренияЛокальное внедрение ПСФункции ППВывод данных на экранФормирование базы данныхОбъем документации1,5 тыс строк

В соответствии с параметрами, влияющими на трудоемкость сопровождения ПП, указанными в таблице 5.13, определим численные величины, характеризующие сопровождение ПП. Проведем расчеты, необходимые для определения трудоемкости сопровождения ПП. Результаты приведем в Таблице 5.14.


Таблица 5.14 - Расчет трудоемкости сопровождения ПП

ВеличинаОбозначение и порядок расчетаЗначениеКоэффициент, учитывающий уровень повышения сложности ПСKСЛ0,33Коэффициент, учитывающий наличие в фонде аналогов ПСKАН1,12Норма времени на проверку функционирования поставленных ПП на контрольных задачах пользователяНВР. ОС. 13Трудоемкость приемки и освоения опытного образца ПП 4,8Коэффициент, учитывающий степень участия службы сопровождения в разработке ПСKУЧ1,2Норма времени на настройку поставленных ПП на параметры задач пользователейНВР. ПР. 7Трудоемкость проверки и оценки опытного образца ПП 2,772Норма времени на анализ ОПСНВР АН5,3Трудоемкость разработки документации по доработке ПП 2,1Норма времени на обучение специалистов организации-заказчика работе с ППНВР. ОБ. 17Трудоемкость обучения специалистов организации заказчика работе с ПП5,6Трудоемкость сопровождения ППТСОПРОСПРРРОБ15,272

Трудоемкость сопровождения ПП определяем по формуле:


ТСОПРОСПРРРОБ =15,272 чел. дней.


Таким образом, трудоемкость сопровождения ПП равняется 15,272 чел. дней.


5.6 Определение стоимости сопровождения ПП


Расчет стоимости сопровождения произведем в таблице 5.15, предполагая, что сопровождение проводит специалист с месячным окладом 7500 р.

Таблица 5.15 - Расчет стоимости сопровождения ПП

ВеличинаОбозначение и порядок расчетаЗначениеФонд рабочего времени одного работающего в месяц (рассчитан в пункте 4.3) FМ21Месячный оклад исполнителя, осуществляющего сопровождение ППЗП МЕС7 500Дневной оклад исполнителя, осуществляющего сопровождение ПП357,14Стоимость сопровождения программного продукта5454,24

Стоимость сопровождения программного продукта определяем по формуле:


= 5454,24


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


5.7 Планирование цены ПП


Запланируем реализацию 100 копий разработанного программного продукта.

Определим цену программного продукта, используя формулу


, где - стоимость проекта.

,


где DС - часть стоимости разработки, приходящаяся на одну копию программы;

Расчет цены программного продукта произведем в таблице 5.16.


Таблица 5.16 - Расчет цены ПП

ВеличинаОбозначение ЗначениеПланируемое число копий ППN100Часть стоимости разработки, приходящаяся на одну копию программы3870Стоимость проекта9325

Таким образом, цена программного средства равняется 9325 рублей.


5.8 Анализ конкурентоспособности и качества разрабатываемого программного продукта


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

-оценку функциональной пригодности;

-оценку способности к взаимодействию;

-оценку защищенности;

-оценку надежности;

-оценку потребности в ресурсах памяти и производительности компьютера.


5.8.1 Анализ технической прогрессивности разрабатываемого ПП


Таблица 5.17 - Расчет коэффициента технической прогрессивности разрабатываемого ПС

Наименование параметраВес, bЗначение ПараметраПЭПБПНВремя решения задачи, сек0,41013150,760,670,300,27Объем оперативной памяти, МБ0,32030350,670,570, 200,17Объем памяти на жестком диске, МБ0,310350150,030,670,010, 20Итого1,0-----0,510,64

Значение коэффициента технической прогрессивности определяется по формуле:


,


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


5.8.2 Анализ изменения функциональных возможностей разрабатываемого ПП

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


Таблица 5.18 - Функциональные возможности

Неизмеряемые параметрыНаличие параметраБалльные оценкиБазовый ППНовый ППБазовыйНовыйНаличие шаблона XSL для групповой спецификации по ГОСТ 2.113 - 75нетда12Наличие конвертера, обеспечивающего преобразование исходного xml-документа в документ, соответствующий требованиями предприятия к спецификациямнетда12Возможность сформировать, просмотреть и распечатать спецификациюдада22Возможность редактирования значения параметров спецификации и полей основной надписи в режиме просмотра документадада22Итого68

Значение коэффициента функциональных возможностей определяем по формуле:


kФВ = 8/6 = 1,3


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


5.8.3 Анализ соответствия разрабатываемого программного продукта нормативам

Нормативные или, так называемые, регламентируемые параметры характеризуют соответствие разрабатываемого ПП международным и национальным стандартам, нормативам, законодательным актам и др. В данной разработке kНОРМ=1.


5.8.4 Анализ экономических показателей разрабатываемого ПП

Цена потребления (ЦП) представляет собой затраты покупателя на приобретение, доработку, а также эксплуатацию анализируемого ПС на протяжении периода эксплуатации.



Тогда эксплуатационные издержки за год можно оценить как сумму расходов на эксплуатационные принадлежности, накладных расходов и прочих расходов


р.,

р.

р.

р.


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

Таблица 5.19 - Расчет цены потребления ПС

Наименование расходовСумма, р. Базовый ПСНовый ПСПродажная цена ПС53403870Стоимость сопровождения ПС5454,245454,24Эксплуатационные издержки потребителя за весь период эксплуатации ПС293156,7292391,82Цена потребления303948301713

Значение коэффициента цены потребления kЦП = 301713/303948=0,99, а следовательно эксплуатация требует больших затрат.

Экономические параметры разрабатываемого ПС лучше чем у базового, так как КЦП < 1.


5.8.5 Оценка конкурентоспособности ПП

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


В нашем случае kИ = 1,25*1,3* (1/0,99) =1,64.


Анализируемый ПП конкурентоспособен, так как kИ > 1.


5.9 Анализ технико-экономических показателей разработки и эксплуатации ПП


В результате выполнения организационно-экономических расчетов мы получили показатели разработки и эксплуатации ПП, которые сравним с базовым ПП. Показатели сведем в таблицу 5.20.


Таблица 5.20 - Технико-экономические показатели разработки и эксплуатации ПП

ПоказателиНовый ПП1. Затраты на разработку, р. 3870982. Продажная цена, р. 93253. Эксплуатационные издержки потребителя за весь период эксплуатации ПП, р. 292391,824. Цена потребления, р. 3017135. Интегральный коэффициент конкурентоспособности ПП1,646. Коэффициент изменения функциональных возможностей1,37. Коэффициент технической прогрессивности 1,258. Коэффициент цены потребления0,99

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

6. Безопасность и экологичность


6.1 Безопасность производственной среды


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

Помещение, в котором осуществлялась разработка диплома, представляет собой комнату площадью 18 , площадь остекления 4 , высота потолков - 3,5 м. В помещении находятся два окна. Оно оборудовано шестью рабочими местами.

Работа осуществлялась на ПЭВМ со следующими характеристиками: системный блок (Intel Pentium Dual Core 2,0 ГГц, 2048 Мб ОЗУ, видеокарта G102M 512 Мб, DVD-ROM, блок питания 500Вт), монитор (LCD 19 дюймов), клавиатура, мышь.


6.2 Шум на рабочем месте


Шум может привести не только к нарушениям слуха (в случае постоянного нахождения при шуме более 85 децибел (dB)), но может быть фактором стресса и повысить систолическое кровяное давление.

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

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

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

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

Источниками шума персонального компьютера являются работа дискового накопителя и вентиляции (кулеры на процессоре, корпусе, шум от работающих жестких дисков и DVD-приводов). Шум возникает также при работе печатающей и копировально-множительной техники. Возникающие при работе компьютера шумы охватывают диапазон 30 Гц-40 кГц.

Полученные результаты расчета сравниваются с допустимым значением уровня шума для отдельного рабочего места согласно СанПиН 2.2.4.1191-03.


Таблица 6.1 - Уровни шума в помещении

Тип помещенияУровни звукового давления, Дб, на частотахСреднегеометрические октавных полос, Гц31.563125250500100020004000Допустимые значения шума для выполнения работы на компьютере8671615449454240Фактические значения шума на рабочем месте3027322931302636

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

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

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

Согласно СанПиН 2.2.4.1191-03 для обеспечения звукоизоляции помещений при их отделке рекомендуется применять звукопоглощающие материалы с максимальными коэффициентами звукопоглощения в диапазоне частот 63-8000 Гц.


6.3 Расчет освещённости рабочей зоны


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

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

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

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

Нормами для данных работ установлена освещённость рабочего места ЕН=300 лк (для работ высокой точности, когда наименьший размер объекта различения равен 0,3-0,5 мм).

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

Общий световой поток определяется по следующей формуле


, (6.1)


где ЕН - освещённость рабочего места по норме;

S - площадь помещения, м2;

z1 - коэффициент запаса, который учитывает износ и загрязнение светильников (z1=1,5);

z2=1,1 - коэффициент, учитывающий неравномерность освещения;

h - коэффициент использования светового потока выбирается в зависимости от типа светильника, размеров помещения, коэффициентов отражения стен и потолка помещения.

Площадь помещения, если его длина составляет =6 м, а ширина =3 м, составляет


. (6.2)


Коэффициент использования светового потока рассчитывается по следующим данным: коэффициент отражения побелённого потолка Rп=70%; коэффициент отражения от стен, оклеенных светлыми обоями Rст=80%;

коэффициент


, (6.3)


где hР - расчетная высота (hП=3,5 - 0,15 - 0,8 = 2,55 м).

Тогда для люминесцентных ламп (i=0,78) коэффициент использования светового потока равен h=0,49.

Общий световой поток равен


. (6.4)


Наиболее приемлемыми для помещения вычислительного центра являются люминесцентные лампы ЛБ (белого света) или ЛТБ (тёпло-белого света), мощностью 20, 40 или 80 Вт.

Световой поток одной лампы ЛТБ40 составляет F1=3100 лм, следовательно, для получения светового потока Fобщ=18183 лм необходимо N-ламп, число которых можно определить по формуле


; (6.5)

(6.6)


Таким образом, необходимо установить 6 ламп ЛТБ40.

Электрическая мощность всей осветительной системы вычисляется по следующей формуле


, (6.7)


где P1 - мощность одной лампы (P1= 40 Вт);

N - число ламп.


. (6.8)


Таким образом, помещение имеет оптимальное светового потока лм, что составляет запас 5% от требуемого значения и обеспечивает освещенность 315лк.


6.4 Расчет параметров вентиляции рабочей зоны


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

Расчет вентиляции проводится для наиболее неблагоприятных условий: тёплый период года, в помещении включены все ПЭВМ (6 шт. мощностью 500 Вт). В помещении работает 3 инженера. Учитывая, что один человек выделяет 90 Вт тепла, тепловыделение от людей составит:



Тепловыделения от ПЭВМ и источников искусственного освещения определяются по формуле:


(6.9)


где Q - тепловыделения, Вт;- суммарная мощность устройств, Вт;

n - коэффициент тепловых потерь

(n=0,7 для ПЭВМ, n=0,55 для люминесцентных ламп).

Тепловыделения от 3-х ПЭВМ составит



Тепловыделения от 6-ти ламп ЛТБ-40 составят:



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


(6.10)


где - тепловыделения от солнечной радиации, Вт;

S - площадь остекления, м2;- тепловыделения через 1 м2 поверхности остекления, Вт/м2;

h - коэффициент учёта характера остекления.

В рассматриваемом случае S= 4 м2, q = 145 Вт/ м2, h = 1,15.

Тогда по 5.10:



Суммарные избыточные тепловыделения



Объём приточного воздуха, необходимого для поглощения избытков тепла определяется по формуле:


(6.11)


где G - объём приточного воздуха, м3/ч;- теплоизбытки, Вт;р - удельная теплоёмкость воздуха (1000 Дж/ (кг ));

r - плотность воздуха (1,2 кг/м3);

- температура удаляемого воздуха, ;

- температура приточного воздуха, .

Температура приточного воздуха в тёплый период года для широты Воронежа принимается равной 20 . Температура удаляемого воздуха определяется по формуле:


(6.12)


где - температура удаляемого воздуха, ;

- оптимальная температура воздуха в рабочей зоне (23 );- температурный градиент (1 /м);- высота помещения (2,7 м).


= 23 + 1 (2,7-2) = 23,7 .


Тогда по формуле 6.11 имеем:



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

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

круглого стального воздуховода длиной 1,5 м;

воздухораспределителя ВП для подачи воздуха в помещение.

Потери давления в вентиляционной системе определяются по формуле:


(6.13)


где H - потери давления, Па;- удельные потери давления на трение в воздуховоде, Па/м;- длина воздуховода, м;

x - суммарный коэффициент местных потерь в системе;- скорость воздуха (V=3 м/с);

r - плотность воздуха (r=1,2 кг/ м3).

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

вентиляционной системы:



Принимаем в качестве диаметра ближайшую cтандартную величину - 0,45 м. Для воздуховода данного диаметра удельные потери давления на трение R=0,24 Па/м.

Местные потери возникают в жалюзийной решётке (x=1,2), воздухораспределителе (x=1,4) и калорифере (x=2,2). Тогда суммарный коэффициент x = 1,2+1,4+2,2 = 4,8.

Тогда по формуле 6.13 имеем:



С учётом 10% -ого запаса



6.5 Требования по пожарной безопасности


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

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

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

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

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

Число эвакуационных выходов из зданий, помещений и с каждого этажа зданий определяется расчетом, но должно составлять не менее двух. Эвакуационные выходы должны располагаться рассредоточено. При этом лифты и другие механические средства транспортирования людей при расчетах не учитывают. Ширина участков путей эвакуации должна быть не менее 1 м, а дверей на путях эвакуации не менее 0.8м. Ширина наружных дверей лестничных клеток должна быть не менее ширины марша лестницы, высота прохода на путях эвакуации - не менее 2 м. При проектировании зданий и сооружений для эвакуации людей должны предусматриваться следующие виды лестничных клеток и лестниц: незадымляемые лестничные клетки (сообщающиеся с наружной воздушной зоной или оборудованные техническими устройствами для подпора воздуха); закрытые клетки с естественным освещением через окна в наружных стенах; закрытые лестничные клетки без естественного освещения; внутренние открытые лестницы (без ограждающих внутренних стен); наружные открытые лестницы. Для зданий с перепадами высот следует предусматривать пожарные лестницы.


Рисунок 6.1 - План эвакуации из производственного помещения


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

В качестве пожарных извещателей в машинном зале устанавливаются дымовые фотоэлектрические извещатели типа ИДФ-1 или ДИП-1. Исходя из высоты потолка (4 м) и площади помещения (30-40 м2) по нормам достаточно одного извещателя на машинный зал. Эти устройства характеризуются высокой скоростью и надежностью срабатывания и работают на принципе рассеяния частицами дыма теплового излучения.

Основные способы пожаротушения:

§охлаждение очага горения или горящего материала ниже определенных температур;

§изоляция очага горения от воздуха или снижение концентрации кислорода в воздухе путем разбавления негорючими газами;

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

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

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

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

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

В помещении в целях обеспечения пожарной безопасности предусмотрено:

-щит пожарный открытый;

-2 порошковых огнетушителя ОП-5;

-углекислотный огнетушитель ОУ-2;

воздушно-пенный огнетушитель ОВП-4;

ящик пожарный с песком;

лопата;

2 конусообразных ведра.

6.6 Экологичность проекта


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

Заключение


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

В рамках настоящей дипломной работы были разработаны:

-структура xml-представления спецификации;

-шаблоны XSL для групповой спецификации по ГОСТ 2.113 - 75;

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

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

Результатом использования разработанных программных средств явилось получение спецификации в формате PDF удовлетворяющей нормам ГОСТ 2.113 - 75.

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

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

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


1.С.Н. Смирнов, XML и JDBC. Практическое введение, Гелиос АРВ, 2010г., 188с.

2.Джо Грэй, Динар Дальви, Фредрик Нормен, XML.net, Лори, 2012г., 642с.

3.PartList. Руководство пользователя. - Воронеж, Солвер. - 2013 г., 38 с.

.Елена Бенкен, PHP, MySQL, XML. Программирование для Интернета, БХВ-Петербург, 2011 г., 304 с.

.Дуг Тидуэлл, XSLT, Символ-Плюс, 2010 г., 960 с

.Борис Пахомов, С/С++ и MS Visual C++ 2012, БХВ-Петербург, 2013 г., 502 с.

.Введение в Creo Parametric 2.0. - Воронеж, Солвер. - 2013г., 707 с.

.Введение в Windchill PDMLink 10.0. - Воронеж, Солвер. - 2012 г., 202 с.

.Кукин П.П. Безопасность жизнедеятельности. Безопасность технологических процессов и производств. - М.: Высшая школа, 1999. - 318 с.

.ГОСТ 12.1.003-83 ССБТ Шум. Общие требования безопасности. - М.: Госстандарт СССР, 1983 - 11 с.

.СанПиН 2.2.2.542-96. Гигиенические требования к видеодисплейным терминалам, ПЭВМ и организации работы. - М.: ИВЦ Госкомсанэпидемнадзора России, 1996. - 32 с.

.ГОСТ 12.1.038-82 ССБТ. Электробезопасность. Общие требования и номенклатура видов защиты. Госстандарт СССР, - М.: 1982 - 7 с.

.СНИП 23-05-95 Естественное и искусственное освещение. - М.: Минстрой России, 1995. - 70 с.

.СанПиН 2.2.4.548-96 Гигиенические требования к микроклимату производственных помещений. - М.: ИВЦ Госкомсанэпидемнадзора России, 1996. - 12 с.

.СНиП II-2-80 Пособие по определению пределов огнестойкости конструкций, пределов распространения огня по конструкциям и групп возгораемости материалов. - М.: ЦНИИСК им. Кучеренко, 1984 - 57 с.

.20 ГОСТ 12.1.004-91 ССБТ. Пожарная безопасность. Общие требования. - М.: Госстрой СССР, 1991 - 65 с.

.ГОСТ 12.0.003-74. Система стандартов безопасности труда. Опасные и вредные производственные факторы. Классификация. - М.: ИПК Издательство стандартов, 2004. - 4 с.

.ГОСТ 12.1.004-91. Система стандартов безопасности труда. Пожарная безопасность. Общие требования. - М.: Стандартинформ, 2006. - 69 с.

.ГОСТ 12.2.032-78. Система стандартов безопасности труда. Рабочее место при выполнении работ сидя. Общие эргономические требования. - М.: ИПК Издательство стандартов, 2002. - 9 с.

.СанПиН 2.2.2/2.4.1340-03. Санитарно-эпидемиологические правила и нормативы. Гигиенические требования к персональным электронно-вычислительным машинам и организации работы. - М.: Информационно-издательский центр Минздрава России, 2003. - 27 с.

.Наролина Т.С. Технико-экономическое обоснование дипломных проектов: учеб. пособие. / Т.С. Наролина. Воронеж: ГОУВПО "Воронежский государственный технический университет", 2008.92с.

.Самогородская М.И. Методические указания по выполнению организационно-экономических расчетов в дипломном проектировании для студентов специальности 071900 "Информационные системы" дневного обучения / М.И. Самогородская. Воронеж: ВГТУ, 2001.46 с.

.Оценка интеллектуальной собственности: Учеб. пособие / Под ред. С.А. Смирнова. М.: Финансы и статистика, 2003.352 с.: ил.

Приложения


Приложение А


ЛИСТИНГ ШАБЛОНА XSL

<? xml version="1.0" encoding="utf-8"? >

<xsl: stylesheet version="1.0" xmlns: xsl="#"justify"><xsl: template match="specification">

<fo: root>

<fo: layout-master-set>

<fo: simple-page-master master-name="page1"height="210mm"width="297mm"top="8mm"bottom="5mm"left="5mm"right="5mm">

<fo: region-bodytop="27mm"bottom="90mm"left="0mm"right="0mm"/>

<fo: region-before extent="27mm"/>

<fo: region-after extent="90mm"/>

</fo: simple-page-master>

<fo: simple-page-master master-name="page2"height="210mm"width="297mm"top="8mm"bottom="5mm"left="5mm"right="5mm">

<fo: region-bodytop="27mm"bottom="15mm"left="0mm"right="0mm"/>

<fo: region-before extent="27mm"/>

<fo: region-after extent="15mm"/>

</fo: simple-page-master>

<fo: page-sequence-master master-name="contents">

<fo: single-page-master-reference master-reference="page1"/>

<fo: single-page-master-reference master-reference="page2"/>

</fo: page-sequence-master>

</fo: layout-master-set>

<! - // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // / - ->

<fo: page-sequence master-reference="page1">

<! - -ШАПКА ТАБЛИЦЫ И ШТАМПА - ->

<fo: static-content flow-name="xsl-region-before">

<fo: table>

<fo: table-column column-number="1" column-width="35mm"/>

<fo: table-column column-number="2" column-width="35mm"/>

<fo: table-column column-number="3" column-width="20mm"/>

<fo: table-column column-number="4" column-width="20mm"/>

<fo: table-column column-number="5" column-width="35mm"/>

<fo: table-column column-number="6" column-width="22mm"/>

<fo: table-column column-number="7" column-width="60mm"/>

<fo: table-column column-number="8" column-width="60mm"/>

<fo: table-body font-family="GOST_B" font-size="10pt" text-align="center">

<fo: table-row line-height="5.75mm" >

<fo: table-cell column-number="1" border-style="solid">

<fo: block> Инв. № подл. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Подп. и дата </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Взам. инв. № </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Инв. № дубл </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Подп. и дата </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="dashed">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-before-style="dashed" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-before-style="dashed" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row line-height="5.75mm">

<fo: table-cell column-number="1" border-after-style="solid" border-left-style="solid" border-right-style="solid">

<fo: block> &#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="dashed">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

<fo: table table-layout="fixed" width="287mm">

<fo: table-column column-number="1" column-width="7.5mm"/>

<fo: table-column column-number="2" column-width="7.5mm"/>

<fo: table-column column-number="3" column-width="10mm"/>

<fo: table-column column-number="4" column-width="60mm"/>

<fo: table-column column-number="5" column-width="60mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="10mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-column column-number="9" column-width="10mm"/>

<fo: table-column column-number="10" column-width="10mm"/>

<fo: table-column column-number="11" column-width="10mm"/>

<fo: table-column column-number="12" column-width="10mm"/>

<fo: table-column column-number="13" column-width="10mm"/>

<fo: table-column column-number="14" column-width="10mm"/>

<fo: table-column column-number="15" column-width="10mm"/>

<fo: table-column column-number="16" column-width="42mm"/>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Формат

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="2mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Зона

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid">

<fo: block-container line-height="10mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Позиция

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="10" column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block font-size="14pt">

Кол. на исполнение

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row >

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="2mm" position="absolute" reference-orientation="90">

<fo: block></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid">

<fo: block-container line-height="10mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block ></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid">

<fo: block font-size="16pt" text-align="center">

Обозначение

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid">

<fo: block font-size="16pt" text-align="center">

Наименование

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="14" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="15" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="16" border-right-style="solid" text-align="center">

<fo: block font-size="16pt">

Примечание

</fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row>

<fo: table-cell column-number="1" border-after-style="solid" border-start-style="solid" border-right-style="solid">

<fo: block>

&#160;

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="14" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="15" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</fo: static-content>

<! - _____________________________________________________-->

<! - -Нижняя область штампа 1й страницы - ->

<fo: static-content flow-name="xsl-region-after">

<! - -***Page 1, after, 1 ***-->

<fo: table>

<fo: table-column column-number="1" column-width="135mm"/>

<fo: table-column column-number="2" column-width="10mm"/>

<fo: table-column column-number="3" column-width="10mm"/>

<fo: table-column column-number="4" column-width="10mm"/>

<fo: table-column column-number="5" column-width="10mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="10mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-column column-number="9" column-width="10mm"/>

<fo: table-column column-number="10" column-width="10mm"/>

<fo: table-column column-number="11" column-width="10mm"/>

<fo: table-column column-number="12" column-width="10mm"/>

<fo: table-column column-number="13" column-width="42mm"/>

<fo: table-body>

<fo: table-row line-height="4.64mm" font-size="10pt" font-family="GOST_B">

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body>

<fo: table-row line-height="4.64mm" font-size="12pt" font-family="GOST_B" text-align="center">

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block-container line-height="15mm" top="1mm" left="-3mm" position="absolute" reference-orientation="90">

<fo: block>Лит. </fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body line-height="4.64mm">

<fo: table-row >

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid" border-after-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body>

<fo: table-row line-height="19.64mm" font-size="12pt" font-family="GOST_B" text-align="center">

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid" border-after-style="solid">

<fo: block-container line-height="15mm" top="8mm" left="-3mm" position="absolute" reference-orientation="90">

<fo: block>Код</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

<! - -*** Page 1, after, 2 ***-->

<fo: table>

<fo: table-column column-number="1" column-width="167mm"/>

<fo: table-column column-number="2" column-width="15mm"/>

<fo: table-column column-number="3" column-width="45mm"/>

<fo: table-column column-number="4" column-width="60mm"/>

<fo: table-body>

<fo: table-row line-height="7.14mm" font-size="12pt" font-family="GOST_B">

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="dashed">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="dashed" border-after-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="dashed" border-after-style="dashed">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid" border-after-style="dashed">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body>

<fo: table-row line-height="7.14mm" font-family="GOST_B">

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="dashed">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

<! - -*** Page 1, after, 3 ***-->

<fo: table>

<fo: table-column column-number="1" column-width="102mm"/>

<fo: table-column column-number="2" column-width="8mm"/>

<fo: table-column column-number="3" column-width="12mm"/>

<fo: table-column column-number="4" column-width="20mm"/>

<fo: table-column column-number="5" column-width="15mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="120mm"/>

<fo: table-body line-height="4.63mm" font-size="10pt" font-family="GOST_B" text-align="center">

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-before-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" column-width="8mm" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid" border-after-style="solid" number-rows-spanned="2">

<fo: block text-align="center" font-size="18pt" font-family="GOST_B">

<xsl: value-of select="stamp/@OBOZNACHENIE"/>

</fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" column-width="8mm" border-start-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block>

Изм

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

Лист

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block>

№ докум.

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block>

Подп.

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block>

Дата

</fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

<! - _____________________________________________________________ - ->

<! - -Нижняя область штампа (часть 2),1й страницы - ->

<fo: table>

<fo: table-column column-number="1" column-width="102mm"/>

<fo: table-column column-number="2" column-width="20mm"/>

<fo: table-column column-number="3" column-width="20mm"/>

<fo: table-column column-number="4" column-width="15mm"/>

<fo: table-column column-number="5" column-width="10mm"/>

<fo: table-column column-number="6" column-width="70mm"/>

<fo: table-column column-number="7" column-width="5mm"/>

<fo: table-column column-number="8" column-width="5mm"/>

<fo: table-column column-number="9" column-width="5mm"/>

<fo: table-column column-number="10" column-width="15mm"/>

<fo: table-column column-number="11" column-width="20mm"/>

<fo: table-body line-height="4.64mm" font-size="10pt" start-indent="1mm" font-family="GOST_B">

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> Разраб. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

<xsl: value-of select="stamp/@RAZRABOTAL"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block font-size="12pt" text-align="center">

<xsl: value-of select="stamp/@NAIMENOVANIE_1"/>

</fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="3" border-after-style="solid" border-right-style="solid">

<fo: block text-align="center"> Лит. </fo: block>

</fo: table-cell>

<fo: table-cell border-after-style="solid" border-right-style="solid">

<fo: block text-align="center"> Лист </fo: block>

</fo: table-cell>

<fo: table-cell border-after-style="solid" border-right-style="solid">

<fo: block text-align="center"> Листов </fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> Пров. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

<xsl: value-of select="stamp/@PROVERIL"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block font-size="12pt" text-align="center">

<xsl: value-of select="stamp/@NAIMENOVANIE_2"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-after-style="solid" border-right-style="solid" text-align="center">

<fo: block>

<fo: page-number/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-after-style="solid" border-right-style="solid" text-align="center">

<fo: block>

<xsl: value-of select="stamp/@kpage"/>

</fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> &#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block font-size="12pt" text-align="center">

<xsl: value-of select="stamp/@NAIMENOVANIE_3"/>

</fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="5" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> Н. Контр. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

<xsl: value-of select="stamp/@N_KONTROL"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block font-size="12pt" text-align="center">

<xsl: value-of select="stamp/@NAIMENOVANIE_4"/>

</fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="5" border-right-style="solid">

<fo: block font-size="14pt" text-align="center" font-family="GOST_B">

<xsl: value-of select="stamp/@NAZVANIE_ORGANIZACII_1"/>

</fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block> Утв. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

<xsl: value-of select="stamp/@UTVERDIL"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block font-size="12pt" text-align="center">

<xsl: value-of select="stamp/@NAIMENOVANIE_5"/>

</fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</fo: static-content>

<! - -_______________________________________________________-->

<! - -Создаём потоковый объект, который будет включать в себе выводимый текст-->

<fo: flow flow-name="xsl-region-body">

<xsl: apply-templates select="* [12>position ()] "/>

</fo: flow>

</fo: page-sequence>

<! - ***************************************************** - ->

<fo: page-sequence master-reference="page2">

<! - -ШАПКА ТАБЛИЦЫ И ШТАМПА - ->

<fo: static-content flow-name="xsl-region-before">

<fo: table>

<fo: table-column column-number="1" column-width="35mm"/>

<fo: table-column column-number="2" column-width="35mm"/>

<fo: table-column column-number="3" column-width="20mm"/>

<fo: table-column column-number="4" column-width="20mm"/>

<fo: table-column column-number="5" column-width="35mm"/>

<fo: table-column column-number="6" column-width="22mm"/>

<fo: table-column column-number="7" column-width="60mm"/>

<fo: table-column column-number="8" column-width="60mm"/>

<fo: table-body font-family="GOST_B" font-size="10pt" text-align="center">

<fo: table-row line-height="5.75mm" >

<fo: table-cell column-number="1" border-style="solid">

<fo: block> Инв. № подл. </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Подп. и дата </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Взам. инв. № </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Инв. № дубл </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-before-style="solid" border-after-style="solid" border-right-style="solid">

<fo: block> Подп. и дата </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="dashed">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-before-style="dashed" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-before-style="dashed" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

<fo: table-row line-height="5.75mm">

<fo: table-cell column-number="1" border-after-style="solid" border-left-style="solid" border-right-style="solid">

<fo: block> &#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="dashed">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-right-style="dashed">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

<fo: table table-layout="fixed" width="287mm">

<fo: table-column column-number="1" column-width="7.5mm"/>

<fo: table-column column-number="2" column-width="7.5mm"/>

<fo: table-column column-number="3" column-width="10mm"/>

<fo: table-column column-number="4" column-width="60mm"/>

<fo: table-column column-number="5" column-width="60mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="10mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-column column-number="9" column-width="10mm"/>

<fo: table-column column-number="10" column-width="10mm"/>

<fo: table-column column-number="11" column-width="10mm"/>

<fo: table-column column-number="12" column-width="10mm"/>

<fo: table-column column-number="13" column-width="10mm"/>

<fo: table-column column-number="14" column-width="10mm"/>

<fo: table-column column-number="15" column-width="10mm"/>

<fo: table-column column-number="16" column-width="42mm"/>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Формат

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="2mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Зона

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid">

<fo: block-container line-height="10mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block text-align="right" font-size="12pt">

Позиция

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell number-columns-spanned="10" column-number="6" border-right-style="solid" border-after-style="solid">

<fo: block font-size="14pt">

Кол. на исполнение

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row >

<fo: table-cell column-number="1" border-left-style="solid" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="2" border-right-style="solid">

<fo: block-container line-height="7.5mm" top="2mm" position="absolute" reference-orientation="90">

<fo: block></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="3" border-right-style="solid">

<fo: block-container line-height="10mm" top="1mm" position="absolute" reference-orientation="90">

<fo: block ></fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="4" border-right-style="solid">

<fo: block font-size="16pt" text-align="center">

Обозначение

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-right-style="solid">

<fo: block font-size="16pt" text-align="center">

Наименование

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>

</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="9" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="10" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="11" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="12" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="13" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="14" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="15" border-right-style="solid">

<fo: block-container line-height="10mm" position="absolute" text-align="center">

<fo: block>


</fo: block>

</fo: block-container>

</fo: table-cell>

<fo: table-cell column-number="16" border-right-style="solid" text-align="center">

<fo: block font-size="16pt">

Примечание

</fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

<fo: table-body line-height="5mm" font-family="GOST_B">

<fo: table-row>

<fo: table-cell column-number="1" border-after-style="solid" border-start-style="solid" border-right-style="solid">

<fo: block>

&#160;

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="14" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="15" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</fo: static-content>

<! - ______________________________________________________ - ->

<! - -Нижняя область штампа, 2й и последующих страниц-->

<fo: static-content flow-name="xsl-region-after">

<fo: table>

<fo: table-column column-number="1" column-width="102mm"/>

<fo: table-column column-number="2" column-width="8mm"/>

<fo: table-column column-number="3" column-width="12mm"/>

<fo: table-column column-number="4" column-width="20mm"/>

<fo: table-column column-number="5" column-width="15mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="110mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-body line-height="4.65mm" font-size="10pt" font-family="GOST_B" text-align="center">

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid">

<fo: block-container line-height="7mm" position="absolute">

<fo: block border-after-style="solid">Лист</fo: block>

</fo: block-container>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" column-width="8mm" border-after-style="solid" border-left-style="solid" border-right-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block> </fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block></fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-right-style="solid">

<fo: block text-align="center" font-size="18pt" font-family="GOST_B">

<xsl: value-of select="stamp/@OBOZNACHENIE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid">

<fo: block-container top="3.5mm" position="absolute">

<fo: block>

<fo: page-number/>

</fo: block>

</fo: block-container>

</fo: table-cell>

</fo: table-row>

<fo: table-row>

<fo: table-cell column-number="1" border-left-style="solid" border-after-style="solid">

<fo: block>&#160; </fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" column-width="8mm" border-bottom-style="solid" border-left-style="solid" border-right-style="solid">

<fo: block>

Изм

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-right-style="solid">

<fo: block>

Лист

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-right-style="solid">

<fo: block>

№ докум.

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-right-style="solid">

<fo: block>

Подп.

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-right-style="solid">

<fo: block>

Дата

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-right-style="solid">

<fo: block text-align="center" font-size="18pt" font-family="GOST_B">

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-right-style="solid" border-after-style="solid" text-align="center">

<fo: block></fo: block>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</fo: static-content>

<! - ______________________________________________________ - ->

<fo: flow flow-name="xsl-region-body">

<xsl: apply-templates select="* [position () >11] " mode="page_B"/>

</fo: flow>

</fo: page-sequence>

</fo: root>

</xsl: template>

<xsl: template match="line | section">

<fo: table table-layout="fixed" width="287mm">

<fo: table-column column-number="1" column-width="7.5mm"/>

<fo: table-column column-number="2" column-width="7.5mm"/>

<fo: table-column column-number="3" column-width="10mm"/>

<fo: table-column column-number="4" column-width="60mm"/>

<fo: table-column column-number="5" column-width="60mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="10mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-column column-number="9" column-width="10mm"/>

<fo: table-column column-number="10" column-width="10mm"/>

<fo: table-column column-number="11" column-width="10mm"/>

<fo: table-column column-number="12" column-width="10mm"/>

<fo: table-column column-number="13" column-width="10mm"/>

<fo: table-column column-number="14" column-width="10mm"/>

<fo: table-column column-number="15" column-width="10mm"/>

<fo: table-column column-number="16" column-width="42mm"/>

<fo: table-body line-height="7.64mm" font-size="12pt" font-family="GOST_B" start-indent="1mm">

<fo: table-row>

<fo: table-cell column-number="1" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@FORM"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@ZONE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@POZICIA"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-end-style="solid">

<fo: block>

<xsl: value-of select="@OBOZNACHENIE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-end-style="solid">

<fo: block>

<fo: block text-align="center" font-style="backslant" text-decoration="underline">

<xsl: value-of select="@s_NAIMENOVANIE"/>

</fo: block>

<xsl: value-of select="@NAIMENOVANIE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_0"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_1"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_2"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_3"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_4"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_5"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_6"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_7"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="14" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_8"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="15" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_9"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-after-style="solid" border-end-style="solid">

<fo: block>

<xsl: value-of select="@PRIMECHANIE"/>

</fo: block>

<fo: block-container line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_1"/>

</fo: block>

</fo: block-container>

<fo: block-container top="3.82mm" line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_2"/>

</fo: block>

</fo: block-container>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</xsl: template>

<! - page_B // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /-->

<xsl: template match="line | section" mode="page_B">

<fo: table table-layout="fixed" width="185mm">

<fo: table-column column-number="1" column-width="7.5mm"/>

<fo: table-column column-number="2" column-width="7.5mm"/>

<fo: table-column column-number="3" column-width="10mm"/>

<fo: table-column column-number="4" column-width="60mm"/>

<fo: table-column column-number="5" column-width="60mm"/>

<fo: table-column column-number="6" column-width="10mm"/>

<fo: table-column column-number="7" column-width="10mm"/>

<fo: table-column column-number="8" column-width="10mm"/>

<fo: table-column column-number="9" column-width="10mm"/>

<fo: table-column column-number="10" column-width="10mm"/>

<fo: table-column column-number="11" column-width="10mm"/>

<fo: table-column column-number="12" column-width="10mm"/>

<fo: table-column column-number="13" column-width="10mm"/>

<fo: table-column column-number="14" column-width="10mm"/>

<fo: table-column column-number="15" column-width="10mm"/>

<fo: table-column column-number="16" column-width="42mm"/>

<fo: table-body line-height="7.805mm" font-size="12pt" font-family="GOST_B" start-indent="1mm">

<fo: table-row>

<fo: table-cell column-number="1" border-start-style="solid" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@FORM"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="2" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@ZONE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="3" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@POZICIA"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="4" border-after-style="solid" border-end-style="solid">

<fo: block>

<xsl: value-of select="@OBOZNACHENIE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="5" border-after-style="solid" border-end-style="solid">

<fo: block>

<fo: block text-align="center" font-style="backslant" text-decoration="underline">

<xsl: value-of select="@s_NAIMENOVANIE"/>

</fo: block>

<xsl: value-of select="@NAIMENOVANIE"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="6" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_0"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="7" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_1"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="8" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_2"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="9" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_3"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="10" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_4"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="11" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_5"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="12" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_6"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="13" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_7"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="14" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_8"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="15" border-after-style="solid" border-end-style="solid">

<fo: block text-align="center">

<xsl: value-of select="@KOL-VO_9"/>

</fo: block>

</fo: table-cell>

<fo: table-cell column-number="16" border-after-style="solid" border-end-style="solid">

<fo: block>

<xsl: value-of select="@PRIMECHANIE"/>

</fo: block>

<fo: block-container line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_1"/>

</fo: block>

</fo: block-container>

<fo: block-container top="3.82mm" line-height="3.82mm" position="absolute">

<fo: block font-size="10pt">

<xsl: value-of select="@PRIMECHANIE_2"/>

</fo: block>

</fo: block-container>

</fo: table-cell>

</fo: table-row>

</fo: table-body>

</fo: table>

</xsl: template>

</xsl: stylesheet>

Приложение B


КОД ФУНКЦИЙ, ПРЕОБРАЗУЮЩИХ XML В XMLCXMLСonverterDlg:: Converting_XML_in_XML (wchar_t *sDir, wchar_t *sPartDir)

{

// ---------------------------------------------------------------------

// sDir - содержит полный путь к xml-файлу

// sPartDir - содержит имя xml-файла без расширения

// ---------------------------------------------------------------------(TRUE);hFile = CreateFile (sDir,GENERIC_READ,0,0,OPEN_EXISTING,0,0);(hFile == INVALID_HANDLE_VALUE) return true;fileSize = GetFileSize (hFile,0);

// Выделяем память для проецирования туда содержимого файла*fileBuffer = new char [fileSize];

// Число реально прочитанных байтbytesRead;bReadWriteError = ReadFile (hFile,fileBuffer,fileSize,&bytesRead,0);(! bReadWriteError) return true;(hFile);teg;

// Позиция в файлеpositionStart;GroupSpecification = FALSE;K = 29, T = 32;( (m_sPattern == "ГрупСпец_Ф1_gost-B_0-9") || ( (m_sPattern == "ГрупСпец_Ф1_gost-\_10-19")) || ( (m_sPattern == "ГрупСпец_Ф1_gost-B_20-29")))

{= TRUE;= 10;=19;

}

// Counter_of_lines - считает количество тегов в xml-файлеcounter = Counter_of_lines (fileBuffer,fileSize,K,T);

// [0] - Позиция первого символа тега section или строки располагающейся в начале // конце таблицы

// [1] - Определяет, что это секция или строка, которую необходимо перенести

// [2] - Определяет количство добавляемых строк перед объектом section**positionSectionStart = new DWORD* [counter];(DWORD n=0; n<counter; n++)[n] = new DWORD [3];*positionSectionEnd = new DWORD [counter];positionLineEnd, positionStampBefore = 0;section10_29 = - 1, **positionSection10_29;_29 = new DWORD* [counter];(DWORD n=0; n<counter; n++)_29 [n] = new DWORD [2];sizeLine10_29 = 0;kline_before = 1, kline_after = 2;(m_yes_kline == TRUE)

{_before = m_kline_before;_after = m_kline_after;

}

// Количество секцийsection = 0;line = 0, kline, nline = 0;bSection = false;bLine = false;sLine [] = "<line FORM=&#160; />";sizeLine = sizeof (sLine) - 1; // Минус завершающий символ

// Общий размер строк добавляемых до и после разделовsizeAllLine = 0;(DWORD i = 0; i<fileSize; i++)

{(fileBuffer [i] == '<')

{= i;{++;(fileBuffer [i]! = ' ')

{(fileBuffer [i+1]! = ' ') teg += fileBuffer [i];

{+= fileBuffer [i];(teg == "section")

{[section] [0] = positionStart;[section] [1] = 0;++;+= sizeLine *\ AddLine_BeforeAfter (positionSection10_29, \

&section10_29, &line, kline_before, kline_after, positionSectionStart,section, K, T);= true;

}(teg == "line")

{++;( (line == K) || ( ( (line-K) %T ==\ 0) && (line > K)))

{copyline;(copyline. GetBufferSetLength (sizeLine) \

,&fileBuffer [positionStart],sizeLine);(CStringA (copyline)! =\ CStringA (sLine))

{[section] [0] = positionStart;[section] [1] = 2;+=2;_29 += sizeLine*2;++;++;

}

}( (line == (K+1)) || ( ( (line- (K+1)) %T == 0) && (line > (K+1))))

{copyline;(copyline. GetBufferSetLength (sizeLine),&fileBuffer\

[positionStart],sizeLine);(CStringA (copyline)! = CStringA (sLine))

{[section] [0] = positionStart;[section] [1] = 1;++;++;_29 += sizeLine;++;

}

}= true;

}(teg == "stamp")

{= "";{++;+= fileBuffer [i];(teg == "kline_before")

{= "";{++;( (fileBuffer [i] == '') && (m_yes_kline == FALSE))_before = atoi (&fileBuffer [i+1]);

}while (fileBuffer [i]! = '');

}(teg == "kline_after")

{= "";{++;( (fileBuffer [i] == '') && (m_yes_kline == FALSE))_after = atoi (&fileBuffer [i+1]);

}while (fileBuffer [i]! = '');

}(fileBuffer [i] == ' ') teg = "";

// Ищем закрывающий символ элемента stamp(fileBuffer [i] == '>')= i;

}while (fileBuffer [i]! = '>');

}

}

}( (bSection == true) && (fileBuffer [i] == '>'))

{[section] = i+1;++;

}( (bLine == true) && (fileBuffer [i] == '>'))= i+1;

}while (fileBuffer [i]! = '>');= false;= false;= "";

}

}dPage;

// Расщитываем число добавляемых строк(GroupSpecification)

{(line > 10)

{= kline = (line - 10) / 19;= line - 10 - kline * 19;=19 - kline; // kline - искомое число строк

}kline = 10 - line;

}

{

// line содержит общее количество просмотренных строк(line > 29)

{= kline = (line - 29) / 32;= line - 29 - kline * 32;=32 - kline; // kline - искомое число строк

}else kline = 29 - line;

}sizeLine_after = sizeLine * kline_after;*line_after = new char [sizeLine_after];sTemp [7];(dPage+2,sTemp,10);sKPage;= " kpage="; sKPage+= sTemp; sKPage+= "";(DWORD i = 0; i<sizeLine_after; i+= sizeLine)(&line_after [i],sLine,sizeLine);

// Расчёт размера нового файла.

// Размеры: текущего файла, добавляемых линий до и после секций,

// добавляемых строк в конце файла, параметра указывающего кол-во страниц,

// строк добавляемых для переноса line на новый листfileSizeNew = fileSize + sizeAllLine + kline*sizeLine+sKPage. GetLength () +\ sizeLine10_29;

// Выделение блока оперативной памяти для нового файла*fBuffer = new char [fileSizeNew];(fBuffer,fileBuffer,fileSize);

// Включаем в тег stamp, атрибут kpage содержащий кол-во листов в документе(&fBuffer [positionStampBefore1], (CStringA) sKPage. GetBuffer (),\. GetLength ());(&fBuffer [positionStampBefore - 1 +\. GetLength ()],&fileBuffer [positionStampBefore-1],fileSize - \);size3 = sKPage. GetLength ();int t = 0, k = 0;(DWORD j = 0; j<section; j++)

{

// Если это позиция названия раздела(positionSectionStart [j] [1] == 0)

{(k = 0; k<positionSectionStart [j] [2]; k++)

{(&fBuffer [positionSectionStart [j] \

[0] +size3],sLine,sizeLine);+= sizeLine;

}( (j == positionSection10_29 [t] [0]) && (section10_29! = - \

) && ( (t<=section10_29)))

{(k = 0; k<positionSection10_29 [t] [1]; k++)

{(&fBuffer [positionSectionStart [j] [0] +\],sLine,sizeLine);+= sizeLine;

}++;

}(&fBuffer [positionSectionStart [j] [0] +size3],\

&fileBuffer [positionSectionStart [j] [0]],fileSize - positionSectionStart [j] [0]);(&fBuffer [positionSectionEnd [j] +size3] \

,line_after,sizeLine_after);+= sizeLine_after;(&fBuffer [positionSectionEnd [j] +size3],\

&fileBuffer [positionSectionEnd [j]],fileSize - positionSectionEnd [j]);

}// Если это первая или последняя строка таблицы

{(k = 0; k<positionSectionStart [j] [1]; k++)

{(&fBuffer [positionSectionStart [j] [0] +size3],\,sizeLine);+=sizeLine;

}(&fBuffer [positionSectionStart [j] [0] +size3],\

&fileBuffer [positionSectionStart [j] [0]],fileSize - positionSectionStart [j] [0]);

}

}

// Дописываем строки в конце файла XML(DWORD k = 0; k < kline; k++)

{(&fBuffer [positionLineEnd+size3],sLine,sizeLine);+=sizeLine;

}(&fBuffer [positionLineEnd+size3],&fileBuffer [positionLineEnd],\- positionLineEnd);

// Формируем имя промежуточного файлаstrPartDir;= "temp\;+= sPartDir;+= "xml";hFileWrite = CreateFile (strPartDir,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);(hFileWrite == INVALID_HANDLE_VALUE)

{(fileBuffer,fBuffer,positionSectionStart,\_29,line_after,counter);true;

}bufferWrite;= WriteFile (hFileWrite,fBuffer,fileSizeNew,&bufferWrite,0);( (hFileWrite == INVALID_HANDLE_VALUE) || (! bReadWriteError))

{(fileBuffer,fBuffer,positionSectionStart,\_29,line_after,counter);(hFileWrite);true;

}(hFileWrite);(fileBuffer,fBuffer,positionSectionStart,\_29,line_after,counter);[] positionSectionEnd;false;

}

// Функция определяющая количество строк добавляемых до и после элементов // sectionCXMLСonverterDlg:: AddLine_BeforeAfter (DWORD **positionSection10_29, DWORD *section10_29,DWORD *line,DWORD kline_before, DWORD kline_after, DWORD **positionSectionStart,DWORD section, DWORD K, DWORD T)

{

// ---------------------------------------------------------------------

// К - количество строк на первой странице спецификации

// Т - количество строк на 2й и последующих страницах спецификации

// ---------------------------------------------------------------------_29 [ (*section10_29) +1] [1] = - 1;yes = false;(DWORD k = 0; k < kline_before + 1; k++)

{

// Если секция может попасть на вторую строку листа, уменьшаем отступ на // необходимое кол-во строк( ( (*line) + k == 2) || ( (*line) + k == (K+2)) || ( ( ( (*line) + k - \

(K+2)) % T == 0) && ( ( (*line) + k) > (K+2))))

{[section] [2] = k;= true;;

}

}

// Если не нужно изменять количество строк, принимаем указанное число(! yes) positionSectionStart [section] [2] = kline_before;

// Увеличиваем счётчик строк на количество добавляемых строк перед секцией

*line += positionSectionStart [section] [2];

// Содержит кол-во добавляемых строк для переноса section на другой листnSection10_29 = 0;(DWORD k = 0; k < kline_after + 2; k++)

{

// Проверяем не попала ли секция в конец листа спецификации( ( ( (*line) +k) == K) || ( ( ( ( (*line) +k-K) %T) == 0) && ( ( (*line) +k) > K)))

{

(*section10_29) ++;_29 [*section10_29] [0] = section;_29 [*section10_29] [1] = k + 2;

// Должны быть добавлены как минимум 2 строки_29 += k + 2;

*line += k + 2;;

}

}

// Проверяем не попала ли секция в начало листа спецификации( (*line == 1) || (*line == (K+1)) || ( ( ( (*line) +k - \

(K+1)) %T==0) && ( ( (*line) +k) > (K+1))))

{

(*section10_29) ++;_29 [*section10_29] [0] = section;_29 [*section10_29] [1] = k + 1;_29 += k + 1;

*line += k + 1;;

}

// Увеличиваем счётчик строк, на количество добавляемых строк после секции

*line += kline_after;

// Возвращаем общее число добавляемых строк (до и после элемента section)positionSectionStart [section] [2] + kline_after + nSection10_29;

}CXMLСonverterDlg:: FreeBuffer (char *fileBuffer,char *fBuffer,\**positionSectionStart,DWORD **positionSection10_29,char *line_after,\ DWORD counter)

{[] line_after;[] fileBuffer;[] fBuffer;(DWORD n=0; n<counter; n++)

{[] positionSectionStart [n];[] positionSection10_29 [n];

}

}CXMLСonverterDlg:: Counter_of_lines (char *fileBuffer,DWORD fileSize,\K, DWORD T)

{counter_line = 0;(DWORD i = 0; i<fileSize; i++)

{(fileBuffer [i] == '<')

{_line++;

}

}counter_line;

}

Приложение С


ПЕРВАЯ СТРАНИЦА ГРУППОВОЙ СПЕЦИФИКАЦИИ, ПРЕДСТАВЛЕННОЙ В ФОРМАТЕ PDF

Приложение D


ВТОРАЯ СТРАНИЦА ГРУППОВОЙ СПЕЦИФИКАЦИИ, ПРЕДСТАВЛЕННОЙ В ФОРМАТЕ PDF


ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА Тема дипломного проекта "Разработка программных средств формирован

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ