close

Вход

Забыли?

вход по аккаунту

?

Luch(1)

код для вставкиСкачать
 Содержание
Введение4
1. Описание метода и алгоритма5
1.1. Постановка задачи трассировки5
1.2. Лучевой алгоритм решения задачи трассировки7
2. Описание программы9
3. Инструкция пользователя10
4. Пример работы программы.15
Литература18
Приложение. Текст программы19
Введение
Данная работа была выполнена в рамках учебного курса для получения практических навыков реализации алгоритмов автоматического проектирования узлов ЭВМ. Цель данной работе - разработка алгоритма и программного обеспечения модуля лучевой трассировки, позволяющего распределить связи исходной схемы по слоям многослойной печатной платы. Исходными данными являются: фрагмент монтажной плоскости, запрещенные зоны, эквипотенциальные контакты.
Для реализации алгоритмического и программного обеспечения модуля лучевой трассировки был спроектирован и реализован оболочка-редактор схемы. Оболочка-редактор схемы имеет интуитивно понятный интерфейс позволяющий создавать и редактировать схему, сохранять и загружать ее, и реализующий взаимодействие с модулем. С помощью оболочки-редактора схем задаются все исходные данные.
Результатом работы является эскиз трассы луча.
1. Описание метода и алгоритма
1.1. Постановка задачи трассировки
Трассировка заключается в определении конкретной геометрии печатного или проводного монтажа, реализующего соединения между элементами схемы. Исходными данными для трассировки являются список цепей, метрические параметры и топологические свойства типовой конструкции и ее элементов и результаты решения задачи размещения, по которым находятся координаты выводов элементов. Формальная постановка задачи трассировки и методы ее решения в значительной степени зависят от вида монтажа (проводной или печатный) и конструктивно-технологических ограничений, определяющих метрические параметры и топологические свойства монтажного пространства.
В типовых конструкциях, начиная с блока и выше, довольно широко используется проводной монтаж, что объясняется высокой трудоемкостью проектирования и сложностью изготовления печатного монтажа. Изготовление печатного монтажа усложняется с увеличением размеров коммутационных плат, а надежность его падает. Проводной монтаж может осуществляться по прямым, соединяющим выводы элементов, или с помощью жгутов, которые прокладывают в специальных каналах. Основные ограничения - количество проводников, которые можно подсоединять к одному выводу (обычно не более трех), и число проводов в каждом жгуте - пропускная способность канала.
Трассировка проводного монтажа. Заключается в определении порядка соединения выводов в соответствии с принципиальной электрической схемой и с учетом заданных ограничений. Критерием качества. как правило, является минимум суммарной длины соединений. Нахождение порядка соединения выводов элементов внутри цепи сводится к задаче построения на фиксированных вершинах минимального покрывающего или связывающего дерева. Будем использовать модель схемы в виде графа, в котором выводам элементов сопоставлены вершины я на этих вершинах строится полный подграф. Таким образом, каждая цепь представляется отдельной компонентой связности. Необходимо построить минимальные покрывающие деревья на тех компонентах связности, число вершин в которых больше двух. Напомним, что в результате размещения элементов определены координаты их выводов в соответствующей метрике, т. е. вершины компонент связности отображены в граф решетки монтажного пространства.
Трассировка печатных соединений предполагает выполнение следующих этанов :
1. Определение порядка соединения выводов внутри цени. 2. Распределение соединений но слоям печатной платы. 3. Нахождение последовательности проведения соединений в каждом слое.
4. Получение конфигурации проводников.
При решении задачи трассировки используются следующие основные критерии:
1. Минимум суммарной длины всех проводников.
2. Минимум числа их пересечений.
3. Минимум изгибов проводников.
4. Минимум числа слоев МПП и переходов со слоя на слой.
5. Минимальная длина параллельных участков соседних проводников.
6. Равномерное распределение проводников но монтажной области.
Критерий 1 приводит к уменьшению задержки распространения сигналов по линиям связи, критерии 2, 3 и 4 повышают надежность и технологичность печатной платы, критерии 5 и 6 увеличивают помехоустойчивость конструктивной реализации схемы и вероятность проведения всех трасс. Указанные критерии не удается объединить в обобщенный показатель качества, поэтому на каждом этапе трассировки для конкретной технологии учитывается один наиболее важный критерий или указывается их приоритет.
Трассировка цепей выполняется последовательно и каждая проложенная трасса является препятствием для всех непроведенных. В связи сэтим большое значение приобретает задача нахождения последовательности проведения соединений в каждом слое. Сформулируем условия отсутствия пересечений двух ребер и методику определения последовательности их проведения. Расмотрим два ребра u(i,j) и u(k,p). Их уравнения в параметрической форме для ребер u(i,j) и u(k,p) соответственно имеют вид :
t = λ*t(i) + (1- λ)*t(j) t = μ*t(k) + (1 - μ)*t(p)
S = λ*S(i) + (1 - λ)*S(j) S = μ*S(k) + (1 - μ)*S(p)
где λ=((t(k)-t(p))*(S(j)-S(p))-(S(k)-S(p))*(t(j)-t(p))/((t(k)-t(p))*(S(j)-S(i))-(S(k)-S(p))*(t(j)-t(i));
μ=((t(j)-t(p))*(S(j)-S(i))-(S(j)-S(p))*(t(j)-t(i))/((t(k)-t(p))*(S(j)-S(i))-(S(k)-S(p))*(t(j)-t(i));
Ребра пересекаются, если
0 <= λ <= 1, 0 <= μ <=1.
На oсновании этого условия определяется список пересекающихся ребер. Непересекающиеся ребра можно трассировать в произвольном порядке. Для определения последовательности проведения пересекающихся ребер составляют уравнения удлинения при огибании, считая, что огибающий пpoводник может проходить сколь угодно близко от вершины. Уравнения составляются для всех пар пересекающихся ребер. Для каждого ребра подсчитывается число oгибаний и удлинение. Список ребер ранжируется в порядке возрастания числа огибаний. Если у некоторыx групп ребер число oгибаний одинаково, то первыми проводятся ребра с меньшим удлинением.
1.2. Лучевой алгоритм решения задачи трассировки
Рассмотрим основные положения метода, используя для наглядности иллюстрации дискретное рабочее поде (ДРП). В работе лучевой трассировки плоскость монтажа разбивается на элементарные квадраты со стороной, равной расстоянию между осями соседних печатных проводников. При использовании ДРП для описания алгоритма лучевой трассировки включение элементарной ячейки в путь означает проведение печатного проводника так, как это показано на рис.1, т. е. считаем, что основная координатная сетка смещена на h/2, чтобы пути следовали из ячейки в ячейку, а не по координатным линиям ДРП. На каждом шаге алгоритма некоторые ячейки являются занятыми, к ним относятся ячейки, попадающие в области, запрещенные для трассировки: краевые поля монтажной платы, зоны размещения элементов и их выводов, ранее проведенные проводники
Рис. 1. Соответствие ячейки ДРП основной координатной сетке.
Суть алгоритма состоит в исследовании сетки между начальной и конечной ячейками ДРП по некоторым заранее заданным направлениям подобно лучам. При этом определяется количество лучей и направление их распространения. Направления могут быть следующими: вправо и вниз, вправо и вверх, влево и вниз, влево и вверх. Если с помощью этого способа не удается пройти путь от начальной ячейки до конечной, то пытаются найти путь на следующем слое. Если не удается провести соединение ни на одном из существующих слоев, то создается новый слой и соединение проводится на нем. При невозможности найти путь надо использовать другие алгоритмы, например волновой алгоритм Ли.
С помощью алгоритма лучевой трассировки обычно находят 60% трасс. Он работает намного быстрее волнового алгоритма. Волновой алгоритм характеризуется высокой эффективностью нахождения пути за счет исследования всех свободных ячеек ДРП, но требует значительного времени на распространение волны. В связи с этим используются различные методы ускорения выполнения первого этапа алгоритма. Одним из них является выбор начальной точки. При выборе в качестве источника распространения волны площадки, максимально удаленной от центра платы, просматривается меньшee число свободных ячеек ДРП. Это становится очевидным по мере роста числа протрассированных цепей. Более эффективен метод встречной волны. Выигрыш во времени пропорционален отношению числа исследуемых ячеек при одновременном распространении волны и при распространении волны из одного источника. При непрерывной модели окрестности волны на свободном поле ДРП отношение исследуемых площадей M=π*r*r/(2*π(r/2)^2)=2. Для реальных состоянии ДРП выигрыш во времени может отличаться, однако в среднем оценка является объективной. Использование данной идеи приводит к усложнению алгоритма.
Поле распространения волны можно уменьшить, ограничивая его прямоугольником, внутри которого находятся соединяемые площадки. Начальная площадь прямоугольника обычно на 10-20% больше площади прямоугольника, проходящего через эти площадки. Если соединение найти не удалось, то границы прямоугольника расширяются. Данный метод обладает большей эффективностью ускорения работы алгоритма но сравнению с вышеописанными.
2. Описание программы
Данная программа реализована на языке C++ в IDE Borland(r) C++ Builder(tm) 5.03 в виде MDI - приложения.
MDI (Multiple Document Interface) - приложения являются удобным средством для одновременного выведения на экран данных, которые хранятся в различных файлах и для их сравнения. Различные документы имеют общее рабочее пространство, называемое родительским окном. В MDI - приложениях это родительское окно всегда является главной формой приложения. В нем могут быть открыты другие окна, в которых могут быть открыты или созданы документы. Эти окна не могут размещаться за пределами окна приложения. Они называются дочерними окнами. Можно создать только одно родительское окно, дочерних же окон теоретически может быть сколь угодно много.
Программа предоставляет пользователю следующие возможности:
1. Ввод и размещение микросхем разных видов
2. Задание связей между выводами микросхем путем их построения
3. Редактирование схемы
4. Введения метрических свойств монтажного пространства
* размеры платы (при создании платы) 5. Введение топологических свойств монтажного пространства
* ширина проводников * расстояние между центрами проводников
6. Сохранение и открытие схемы и результата трассировки если он есть
7. Трассировка лучевым алгоритмом
8. Распределение соединений по слоям если это необходимо
9. Просмотр результата трассировки
* все слои сразу или по отдельности
10. Копирование в буфер обмена для последующей вставки в программу редактирования и печати.
3. Инструкция пользователя
При запуске программы на экране появляется главная форма приложения.
Создать новую схему можно нажав на пункт меню Файл-Создать (File|New) или кнопку на панели управления. После этого пользователю предложат ввести размеры платы.
После того как вы нажали OK создастся дочернее безымянное окно с чистой платой.
Теперь можно приступать к введению и редактированию схемы. Для этого необходимо внимательно ознакомится с нижеприведенным описанием меню и панели инструментов.
Меню File.
1. Файл (New) - создание нового документа
2. Открыть (Open) - открытие ранее сохраненного документа
3. Закрыть (Close) - закрытие активного дочернего окна
4. Сохранить (Save) - сохранение документа
5. Сохранить как (Save as) - сохранение документа под другим именем
6. Выход (Exit) - выход из программы
Меню Буфер обмена (Edit)
1. Копировать (Copy) - копировать в буфер обмена M$(r) Windows(tm) активное окно схемы
2. Копировать с сеткой (Copy with grid) - то же, что и Копировать (Copy), но добавляется сетка
Меню Окна(Window) - предназначено для работы с дочерними окнами.
1. Уложить каскадом (Cascade) - расположить дочерние окна каскадом
2. Уложить горизонтально (Tile Horizontally) - расположить дочерние окна горизонтально
3. Уложить вертикально (Tile Vertically) - расположить дочерние окна вертикально
4. Свернуть все (Minimize All) - минимизировать все дочерние окна
5. Упорядочить (Arrange All) - используется, когда дочерние окна минимизированы
Панели инструментов
Для ускорения и повышения комфорта при работе с программой предназначены две панели инструментов. На панель инструментов выведены наиболее часто используемые команды, некоторые дублируют соответствующие из главного меню. Если подвести мышь к кнопке, то через небольшой промежуток времени появится подсказка, а в панели состояния в нижней части окна появляется описание команды.
Панель, дублирующая некоторые команды главного меню:
Панель редактирования схемы:
- в этом режиме можно изменить характеристики элементов, для этого надо дважды кликнуть мышью на нужном элементе
- в этом режиме можно добавлять элементы в схему. Для этого надо кликнуть мышью в нужном месте схемы и текущий элемент будет добавлен
- в этом режиме можно передвигать элементы. Для этого надо кликнуть мышью на нужном элементе и, удерживая нажатой кнопку мыши, перетащить мышью элемент на новое место.
- в этом режиме можно удалять элементы или связи. Для этого надо кликнуть мышью на удаляемом элементе или связи и он будет удален
- в этом режиме можно добавлять связи в схему. Для этого надо кликнуть левой кнопкой мыши на выводе микросхемы, затем, нажимая левую кнопку мыши, задать промежуточные точки. Чтобы отказаться от проведения соединения надо кликнуть правой кнопкой мыши. Для завершения соединения надо кликнуть левой кнопкой мыши на том выводе микросхемы, к которому проводится связь.
- в этом режиме можно добавлять запретные для трассировки зоны на схему. Для этого надо на схеме кликнуть мышью в левом верхнем углу создаваемой зоны, затем - в нижнем правом углу.
- в этом режиме можно удалять запретные для трассировки зоны. Для этого надо кликнуть мышью на удаляемой зоне.
- эта кнопка вызывает диалог создания микросхемы нового типа.
- эта кнопка вызывает диалог начала трассировки схемы.
- этот управляющий элемент позволяет преключать изображаемый слой схемы. 0- показать все слои, 1- первый слой, 2- второй слой и т.д. Действует только на результате трассировки.
ПОЛЕЗНЫЕ СОВЕТЫ ПРИ СОЗДАНИИ СХЕМЫ.
1. При создании новой схемы укажите размеры платы указанные в задании
2. Разместите микросхемы указанных типов на плату следующим образом:
2.1. нажмите левой мышкой на быструю кнопку диалог создания микросхемы 2.2. создайте микросхемы нужного вида или загрузите ее из файла
2.3. Выйдите из конструктора, нажав ОК
2.4. нажмите левой кнопкой мыши на плате в том месте где будет находится верхний левый угол данной микросхемы
2.5. если после введения всех микросхем они располагаются не так как указанно в задании разместите их путем перетаскивания на свои места:
2.5.1. нажмите на панели кнопку режима движения 2.5.2. нажмите и удерживайте в нажатом состоянии левую кнопку мыши на той микросхеме которую необходимо переместить
2.5.3. переместите курсор мыши, удерживая левую кнопку мыши в нажатом состоянии, так что бы верхний левый угол микросхемы находился там где указано в задании
2.5.4. отпустите левую кнопку мыши
2.6. если при задании микросхем вы ввели микросхему не того типа то её можно удалить:
2.6.1. нажмите на панели кнопку режима удаления 2.6.2. нажмите левой кнопкой мыши на микросхеме предназначенной для удаления, при этом будут удалена вместе с ее соединениями
2.7. не пытайтесь расположить микросхему за пределами платы или на другой микросхеме т.к. в этом случае вы не сможете провести трассировку
3. Задайте связи между выводами микросхем указанных в задании, не обязательно такой же формы, следующим образом: 3.1. нажмите на панели кнопку режима соединения 3.2. нажмите левой кнопкой мыши на одном из двух контактов участвующих в соединении, при этом в точке окончания проводника появится крест
3.3. задайте точки перегиба проводника путем нажатия в этих точках левой кнопки мыши, от текущей точки перегиба проводник сам будет двигаться в том направлении в котором находится курсор мыши относительно текущей точки перегиба, причем будет двигаться по прямой не зависимо от того будет ли курсор мыши отклонен от направления движения провода
3.4. завершите проведение провода путем нажатия левой кнопки мыши на втором контакте.
3.5. используйте крест для точного задания точек перегиба и для попадания на второй контакт связи
3.6. если во время проведения проводника вам не нравится его конфигурация вы можете прервать проведение проводника нажав на правую кнопку мыши
3.7. не пытайтесь провести провод за пределами платы т.к. в этом случае вы не сможете провести трассировку 4. Задайте запрещенные для трассировки зоны следующим образом:
4.1. нажмите на панели кнопку режима запрещенные для трассировки зоны 4.2. нажмите левой кнопкой мыши на плате в том месте где будет находится верхний левый угол запрещенной зоны
4.3. нажмите правой кнопкой мыши на плате в том месте где будет находится нижний правый угол запрещенной зоны
4.4. если после введения запрещенной зоны она располагается не так как указанно в задании, то ее можно удалить и разместить заново. Для этого нажмите на панели кнопку режима удаления запрещенной для трассировки зоны , нажмите левой кнопкой мыши на запрещенной зоне предназначенной для удаления.
После правильного расположения всех микросхем и проведения всех проводников можно приступать к трассировке, сохранив перед этим набранную схему. Для этого необходимо нажать быструю кнопку на панели инструментов . После этого на экране появится диалог начала трассировки схемы. Задайте параметры и нажмите ОК. Теперь можно посмотреть результаты трассировки: все слои сразу или по отдельности и сделать выводы, для переключения между слоями пользуйтесь соответствующими быстрыми кнопками . Теперь можно копировать введенную вами схему и результат трассировки, пользуясь кнопкой или пунктами меню "Буфер обмена" и указанными выше кнопками для переключения между слоями. 4. Пример работы программы.
Для примера рассмотрим плату размером 600х400 со следующей схемой:
Зададим свойства монтажного пространства: толщина проводников равна 2, а расстояние между проводниками равно 6.
После трассировки схема принимает вид:
А например слой номер два имеет следующий вид:
Еще пример. Размер схемы: 600х400
После трассировки схема принимает вид:
Литература
1. Савельев А.Я. Овчинников В.А. Конструирование систем и ЭВМ. М.:Высшая школа 1984.
2. Громов Ю.Ю.,Татаренко С.И. Программирование на языке СИ: Учебное пособие. Тамбов,1995.
3. Зыков А.А. Основы теории графов. М.:Наука, 1987.
4. Морозов К.К. Одиноков В.Г. Курейчик В.М. Автоматизированное проектирование конструкций радиоэлектронной аппаратуры. М.:Высш. шк. 1988.
5. Страустрап, Бьярн. Введение в язык С++. 1995.
6. Брусенцев В. Анатомия C Run-Time. The RSDN Group. RSDN Magazine #10. 2002.
7. Рамодин, Дмитрий. Программирование для Windows. МИР ПК #05/97
Приложение. Текст программы
RayProject.cpp
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------
USEFORM("RayMainForm.cpp", MainForm);
USEFORM("RayChild.cpp", MDIChild);
USERES("RayProject.res");
USEFORM("about.cpp", AboutBox);
USEFORM("Dialog1.cpp", SizeDlg);
USEUNIT("Element.cpp");
USEUNIT("Pin.cpp");
USEUNIT("Line.cpp");
USEFORM("Constructor.cpp", ConstrDlg);
USEFORM("ChangeDialog.cpp", ChangeDlg);
USEFORM("TraseDialog.cpp", TraseDlg);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application->Initialize();
Application->Title = "Ray Project";
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
return 0;
}
RayMainForm.h
class TMainForm : public TForm
{
__published:
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *FileNewItem;
TMenuItem *FileOpenItem;
TMenuItem *FileCloseItem;
TMenuItem *Window1;
TMenuItem *Help1;
TMenuItem *N1;
TMenuItem *FileExitItem;
TMenuItem *WindowCascadeItem;
TMenuItem *WindowTileItem;
TMenuItem *WindowArrangeItem;
TMenuItem *HelpAboutItem;
TOpenDialog *OpenDialog;
TMenuItem *FileSaveItem;
TMenuItem *FileSaveAsItem;
TMenuItem *Edit1;
TMenuItem *CopyItem;
TMenuItem *WindowMinimizeItem;
TStatusBar *StatusBar;
TActionList *ActionList1;
TAction *FileNew1;
TAction *FileSave1;
TAction *FileExit1;
TAction *FileOpen1;
TAction *FileSaveAs1;
TWindowCascade *WindowCascade1;
TWindowTileHorizontal *WindowTileHorizontal1;
TWindowArrange *WindowArrangeAll1;
TWindowMinimizeAll *WindowMinimizeAll1;
TAction *HelpAbout1;
TWindowClose *FileClose1;
TWindowTileVertical *WindowTileVertical1;
TMenuItem *WindowTileItem2;
TImageList *ImageList1;
TControlBar *ControlBar1;
TToolBar *ToolBar2;
TToolButton *ToolButton9;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TToolButton *ToolButton7;
TToolButton *ToolButton8;
TToolButton *ToolButton10;
TToolButton *ToolButton11;
TToolBar *ToolBar1;
TToolButton *ToolButton12;
TToolButton *ToolButton13;
TToolButton *ToolButton14;
TImageList *ImageList2;
TToolButton *ToolButton15;
TToolButton *ToolButton16;
TToolButton *ToolButton17;
TToolButton *ToolButton19;
TToolButton *ToolButton20;
TToolButton *ToolButton21;
TToolButton *ToolButton22;
TToolButton *ToolButton23;
TToolButton *ToolButton18;
TSaveDialog *SaveDialog1;
TCSpinButton *CSpinButton1;
TToolButton *ToolButton24;
TEdit *Edit2;
TAction *CopytoBuf;
TAction *CopytoBufwithGrid;
TToolButton *ToolButton5;
TMenuItem *Copywithgrid1;
void __fastcall FileNew1Execute(TObject *Sender);
void __fastcall FileOpen1Execute(TObject *Sender);
void __fastcall HelpAbout1Execute(TObject *Sender);
void __fastcall FileExit1Execute(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall ToolButton13Click(TObject *Sender);
void __fastcall ToolButton12Click(TObject *Sender);
void __fastcall ToolButton14Click(TObject *Sender);
void __fastcall ToolButton15Click(TObject *Sender);
void __fastcall ToolButton16Click(TObject *Sender);
void __fastcall ToolButton17Click(TObject *Sender);
void __fastcall ToolButton19Click(TObject *Sender);
void __fastcall ToolButton21Click(TObject *Sender);
void __fastcall FileSaveAs1Execute(TObject *Sender);
void __fastcall FileSave1Execute(TObject *Sender);
void __fastcall ToolButton23Click(TObject *Sender);
void __fastcall Edit2Change(TObject *Sender);
void __fastcall CSpinButton1DownClick(TObject *Sender);
void __fastcall CSpinButton1UpClick(TObject *Sender);
void __fastcall CopytoBufExecute(TObject *Sender);
void __fastcall CopytoBufwithGridExecute(TObject *Sender);
private:
void __fastcall CreateMDIChild(const String Name);
public:
virtual __fastcall TMainForm(TComponent *Owner);
void __fastcall CreateMDIChildwithSize(String Name, int width, int height);
void ToBuff(TMDIChild *Child,bool withgrid);
};
//----------------------------------------------------------------------------
struct SaveSch
{
int width;
int height;
int EleCount;
int ZonesCount;
int LinesCount;
};
extern TMainForm *MainForm;
extern TMDIChild *__fastcall MDIChildCreate(void);
//extern bool SaveSchema(TMDIChild *ch,FILE *f);
deals mode;
TStatusBar *status;
Options opt;
TraseOptions topt;
extern void AddMass(int **mas);
extern bool Ray2(TList *poi,int **mas,int is,int js,int ie,int je);
//----------------------------------------------------------------------------
#endif ChangeDialog.h
#ifndef ChangeDialogH
#define ChangeDialogH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "Constructor.h"
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TChangeDlg : public TConstrDlg
{
__published:// IDE-managed Components
private:// User declarations
public:// User declarations
__fastcall TChangeDlg(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TChangeDlg *ChangeDlg;
//---------------------------------------------------------------------------
#endif
Constructor.h
class TConstrDlg : public TForm
{
__published:
TPanel *Panel1;
TPanel *Panel2;
TButton *OKBtn;
TButton *CancelBtn;
TPanel *Panel3;
TPanel *Panel5;
TPaintBox *setka;
TPaintBox *plata2;
TPanel *Panel4;
TSplitter *Splitter1;
TSplitter *Splitter2;
TSpeedButton *SpeedButton1;
TSpeedButton *SpeedButton2;
TSpeedButton *SpeedButton3;
TSpeedButton *SpeedButton4;
TEdit *Edit1;
TSpeedButton *SpeedButton5;
TColorDialog *ColorDialog1;
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
TSpeedButton *SpeedButton6;
TSpeedButton *SpeedButton7;
void __fastcall FormCreate(TObject *Sender);
void __fastcall plata2Paint(TObject *Sender);
void __fastcall SpeedButton2Click(TObject *Sender);
void __fastcall SpeedButton1Click(TObject *Sender);
void __fastcall SpeedButton4Click(TObject *Sender);
void __fastcall SpeedButton3Click(TObject *Sender);
void __fastcall Edit1Change(TObject *Sender);
void __fastcall SpeedButton5Click(TObject *Sender);
void __fastcall SpeedButton7Click(TObject *Sender);
void __fastcall SpeedButton6Click(TObject *Sender);
private:
public:
Element *current;
virtual __fastcall TConstrDlg(TComponent* AOwner);
};
Declare.h
//---------------------------------------------------------------------------
// File : Declare.h
// Created : May 10, 2003
// Author : Petrov Andrey A.
// Description: Header
//---------------------------------------------------------------------------
#ifndef DECLAREH
#define DECLAREH
enum deals{MOVE,NONE,CREATE,DELET,LINE,CHANGE,ZONE,DELETZONE};
//extern deals mode;
enum ActiveMoveItem{NO,YESS};
enum ActiveLineDraw{ON,OFF};
struct Options
{
bool EnableCross;
bool EnableSetka;
int SetkaHeightCell;
int SetkaWidthCell;
bool EnableStepMoving;
int StepMovingX;
int StepMovingY;
bool EnableLine90;
};
struct TraseOptions
{
int LineWidth;
int LineDistance;
};
extern void SetDefaultOptions(void);
#endif
Element.h
//---------------------------------------------------------------------------
// File : Element.h
// Created : May 9, 2003
// Author : Petrov Andrey A.
// Description: Element class
//---------------------------------------------------------------------------
#include <vcl.h>
#ifndef ElementH
#define ElementH
class Element
{
public:
TRect Body;
bool Vertical;
AnsiString Text;
int Num;
TList *Pins;
TColor ColBody;
//---------------------------------------------------------------------------
Element();
~Element();
Element(TRect Body2,bool Vert,AnsiString Text2,int n,TList *h,TColor c);
Element(Element &e);
Element (Element *e);
void Draw(TCanvas *can);
void Move(int dx,int dy);
};
struct SaveElement
{ TRect Body;
bool Vertical;
int TextCount;
int Num;
TColor ColBody;
int PinsCount;
};
extern bool AddPin(Element *e);
extern bool AddPinLeft(Element *e);
extern bool DelPin(Element *e);
extern bool DelPinLeft(Element *e);
extern int NextNumPinLeft(Element *e);
extern bool AddPinRight(Element *e);
extern bool DelPinRight(Element *e);
extern int NextNumPinRight(Element *e);
extern bool IsInElement(Element *e,int x,int y);
extern TRect Area51(Element *e);
extern void EraseElement(TList *l,int ind,TCanvas *can,TColor col);
extern void EraseElement2(Element *e,TCanvas *can,TColor col);
extern bool IsRectOnEle(TRect rec,Element *e);
extern bool IsRectOnRect(TRect rec,TRect e);
extern void * IsInPin(Element *e,int x,int y);
extern bool IsInZone(TRect *e,int x,int y);
extern bool AddCellWidth(Element *e);
extern bool DelCellWidth(Element *e);
//---------------------------------------------------------------------------
#endif
Line.h
//---------------------------------------------------------------------------
// File : Line.h
// Created : May 11, 2003
// Author : Petrov Andrey A.
// Description: Line class
//---------------------------------------------------------------------------
#include "Pin.h"
#include <vcl.h>
#ifndef LineH
#define LineH
class Line
{
public:
Pin *start;
Pin *end;
TColor ColLine;
TList *points;
int Thick;
//---------------------------------------------------------------------------
Line();
~Line();
void Draw(TCanvas *can);
};
struct SaveLine
{
TColor ColLine;
int PointsCount;
int Thick;
};
extern bool IsInLine(Line *e,int x,int y);
//---------------------------------------------------------------------------
#endif
Pin.h
//---------------------------------------------------------------------------
// File : Pin.h
// Created : May 9, 2003
// Author : Petrov Andrey A.
// Description: Pin class
//---------------------------------------------------------------------------
#include "Element.h"
#ifndef PinH
#define PinH
class Pin
{
public:
TColor ColPin;
TRect PinBody;
int DVert;
int DHoriz;
Element *root;
//---------------------------------------------------------------------------
Pin();
~Pin();
Pin(Pin &p);
void Draw(TCanvas *can,int top,int left);
void Draw(TCanvas *can);
void Draw(TCanvas * can, TColor curcol);
};
struct SavePin
{ TColor ColPin;
TRect PinBody;
int DVert;
int DHoriz;
};
extern bool IsPin(Pin *curpin,int x,int y,int left,int top);
extern TPoint PinCenter(Pin *p);
extern bool ComparePins(Pin *f,Pin *s);
//---------------------------------------------------------------------------
#endif
RayChild.h
//----------------------------------------------------------------------------
#ifndef RayChildH
#define RayChildH
//----------------------------------------------------------------------------
#include "Element.h"
#include "Declare.h"
#include "Line.h"
#include <vcl\Controls.hpp>
#include <vcl\Forms.hpp>
#include <vcl\Graphics.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Windows.hpp>
#include <vcl\System.hpp>
#include <StdCtrls.hpp>
#include <ExtCtrls.hpp>
//----------------------------------------------------------------------------
class TMDIChild : public TForm
{
__published:
TPanel *Panel1;
TImage *buffer;
TPaintBox *Setka;
TPaintBox *fon;
TPaintBox *lines_fon;
TPaintBox *plata;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormCreate(TObject *Sender);
void __fastcall plataPaint(TObject *Sender);
void __fastcall plataMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall plataMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall plataMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall SetkaPaint(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall plataDblClick(TObject *Sender);
private:
public:
TList *ele;
TList *lines;
TList *zones;
Element *cur,*example;
TColor platacolor;
int Xold,Yold,Xline,Yline;
int Xzone,Yzone;
bool BeginLine;
bool BeginCross;
bool BeginZone;
TRect Moving;
TRect *curZ;
ActiveMoveItem MoveIt;
ActiveLineDraw IsLine;
Line *Curline;
TPenMode OldPenMode;
int **mas,I,J,Cell;
bool DrCell,result;
TList *Res;
int layers,drlay;
virtual __fastcall TMDIChild(TComponent *Owner);
bool SetupSize(int width, int height);
void __fastcall CreateMouseDown(TShiftState Shirt, int X, int Y);
void __fastcall DeleteMouseDown(TShiftState Shift, int X, int Y);
void __fastcall MoveMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall MoveOnMouseMove(TShiftState Shift, int X, int Y);
void __fastcall LineMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall LineOnMouseMove(TShiftState Shift, int X, int Y);
void HideCross();
void __fastcall MoveMouseUp(TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall ZoneMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall ZoneOnMouseMove(TShiftState Shift, int X, int Y);
void __fastcall DeleteZoneOnMouseMove(TShiftState Shift, int X, int Y);
void __fastcall DeleteZoneOnMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
void SetupMass(int **m,int i,int j,int c);
void SetupLayers(int kol);
};
extern deals mode;
extern int CellBody;
extern TStatusBar *status;
extern int ThickLineDefault;
extern TColor ColLineDefault;
extern Options opt;
extern void DrawZone(TCanvas *can,TRect *z);
extern void DrawMass(TCanvas *can,int **mas,int I,int J,int cell);
//----------------------------------------------------------------------------
#endif
TraseDialog.h
class TTraseDlg : public TForm
{
__published: TButton *OKBtn;
TButton *CancelBtn;
TPanel *Panel1;
TEdit *Edit1;
TEdit *Edit2;
TLabel *Label1;
TLabel *Label2;
private:
public:
virtual __fastcall TTraseDlg(TComponent* AOwner);
};
1
Документ
Категория
Рефераты
Просмотров
51
Размер файла
266 Кб
Теги
лабораторная работа, лаба, luch, лабораторная
1/--страниц
Пожаловаться на содержимое документа