Пояснительная записка (1230040), страница 8
Текст из файла (страница 8)
Рисунок 2.5 – Выбор библиотеки DelphiTLB
Может так случиться, что нужная библиотека не найдется. Тогда необходимо щелкнуть на кнопку Add (добавить) и вручную добавить файл acax16enu.tlb (рисунок 2.6):
Рисунок 2.6 – Задание пути до библиотеки
В указанном примере была создана отдельная станица (Palette Page) для объектов AutoCad. В результате появилось семь новых компонентов: AcadDocument, AcadDatabase, AcadLayerStateManager, AcadSecurityParams, AcadTableStyle, AcadSortentsTable, AcadAcCmColor. Основным из них является первый компонент AcadDocument.
2.3.2 Подключение к AutoCad из Delphi
После подключения библиотеки типов AutoCAD_TLB, нужно подключится к AutoCAD
Для этого создается в Delphi обычное приложение (File>New>Application). В разделе uses вручную дописаны модули AutoCAD_TLB, ComObj.
Далее записана функция, которая будет отвечать за связь с AutoCad.
Function GetAcadApplication(Visible: Boolean): IAcadApplication;
var
v : OleVariant;
begin
Try
// попытка присоединиться к уже запущенной копии AutoCad
v := GetActiveOleObject('AutoCAD.Application');
Except
// если не получилось присоединиться, то запускается новая копия AutoCad
v:= CreateOleObject('AutoCAD.Application');
end;
// приводится переменную типа OleVariant к типу IAcadApplication
Result := IDispatch(v) as IAcadApplication;
// далее проверяется, нужно ли делать приложение AutoCad видимым
if Visible then Result.Visible := True;
end;
Функция возвращает интерфейс приложения AutoCad, объявленный в модуле AutoCAD_TLB.pas. Теперь можно в любом месте программы присоединиться к запущенной копии AutoCad или запустить новую.
-
Взаимодействие AutoCAD с пользователем.
Взаимодействие с пользователем заключается в запросах различных данных, объектов, выводе сообщений. Эти действия реализуются объектом AcadUtility, коллекцией AcadSelectionSets и ее объектом AcadSelectionSet.
2.4.1 Инициализация ограничений ввода
procedure InitializeUserInput(Bits: Byte; KeyWordList: OleVariant);
Вызов метода InitializeUserInput задает ограничения по вводу данных для методов: GetKeyword, GetInteger, GetReal, GetDistance, GetAngle, GetOrientation, GetPoint, и GetCorner.
Параметры: Bits— битовый флаг, являющийся суммой бит в соответствии с их весами; обязательный.
2.4.2 Вывод сообщения в командную строку
procedure Prompt(const Message: WideString); — функция выводит в командную строку текст Message
Параметры:
Message — текст сообщения; необязательный.
Пример использования:
Acad.ActiveDocument.Utility.Prompt('Press any key...');
2.4.3 Запрос координат точки
function GetPoint(Point: OleVariant; Prompt: OleVariant): OleVariant;
Параметры:
Point — 3-х элементный массив координат начальной точки; необязательный
Prompt — текст подсказки, выводимой в командную строку; необязательный
Возвращаемое значение — 3-х элементный массив координат точки.
Пример использования:
var
Pnt1, Pnt2: OleVariant;
begin
// Запрос у пользователя координат первой точки
Pnt1:= Acad.ActiveDocument.Utility.GetPoint(EmptyParam, 'Укажите первую точку: ');
// Запрос у пользователя координат второй точки с отображением "резиновой нити" от первой точки
Pnt2:= Acad.ActiveDocument.Utility.GetPoint(Pnt1, 'Укажите вторую точку: ');
// Построение отрезка из первой во вторую точку
Acad.ActiveDocument.ModelSpace.AddLine(Pnt1, Pnt2);
end;
2.4.4 Запрос угла прямоугольника
function GetCorner(Point: OleVariant; Prompt: OleVariant): OleVariant;
Параметры:
Point — 3-х элементный массив координат начальной точки; обязательный
Prompt — текст подсказки, выводимой в командную строку; необязательный
Возвращаемое значение — 3-х элементный массив координат точки.
Пример использования:
var
Pnt1, Pnt2, Pnt3, Pnt4: OleVariant;
begin
// Запрос у пользователя координат первой точки
Pnt1:= Acad.ActiveDocument.Utility.GetPoint(EmptyParam, 'Укажите первый угол: ');
// Запрос у пользователя координат второй точки с
// отображением "резинового прямоугольника" от первой точки
Pnt2:= Acad.ActiveDocument.Utility.GetCorner(Pnt1, 'Укажите второй угол: ');
// Вычисление остальных координат прямоугольника
Pnt3:= AcadPoint(Pnt1[0], Pnt2[1]);
Pnt4:= AcadPoint(Pnt2[0], Pnt1[1]);
// Построение прямоугольника
Acad.ActiveDocument.ModelSpace.AddLine(Pnt1, Pnt3);
Acad.ActiveDocument.ModelSpace.AddLine(Pnt3, Pnt2);
Acad.ActiveDocument.ModelSpace.AddLine(Pnt2, Pnt4);
Acad.ActiveDocument.ModelSpace.AddLine(Pnt4, Pnt1);
end;
2.4.5 Запрос угла
function GetAngle(Point: OleVariant; Prompt: OleVariant): Double;
Параметры:
Point — 3-х элементный массив координат начальной точки; необязательный
Prompt — текст подсказки, выводимой в командную строку; необязательный
Возвращаемое значение — угол в радианах против часовой стрелки (т.е. игнорирует значение ANGDIR).
Функция выводит в командную строку подсказку Prompt и ожидает от пользователя ввода либо значения угла (в текущем формате угловых единиц), либо ввода 2-х точек прямой с отображением "резиновой нити". При получении угла учитываются переменные ANGBASE и ANGDIR.
Пример использования:
var
Ang: Double;
begin
// Запрос у пользователя угла
Ang:= Acad.ActiveDocument.Utility.GetAngle(, 'Укажите значение угла: ');
ShowMessage(Format('Задан угол %f градусов', [RadToDeg(Ang)]));
end;
2.4.7 Запрос вещественного числа
function GetReal(Prompt: OleVariant): Double;
Параметры:
Prompt — текст подсказки, выводимой в командную строку; необязательный
Возвращаемое значение — введенное пользователем вещественное число.
Пример использования:
var
Dbl: Double;
begin
// Запрос у пользователя целого числа
Dbl:= Acad.ActiveDocument.Utility.GetReal('Введите вещественное число: ');
// Вывод значения в командную строку
Acad.ActiveDocument.Utility.Prompt(Format('Число = %f', [Dbl]));
end;
2.4.8 Запрос объекта
procedure GetEntity(out Obj: IDispatch; out PickedPoint: OleVariant; Prompt: OleVariant);
Параметры:
Obj— указанный объект; обязательный
PickedPoint — 3-х элементный массив координат указанной точки; обязательный
Prompt — текст подсказки, выводимой в командную строку; необязательный
Пример использования:
var
BasePnt, Obj: OleVariant;
Entity: IDispatch;
RetStr: String;
OldColor: TOleEnum;
Flag: Boolean;
begin
Flag:= True;
while Flag do // Зациклить, пока не ввели N(n) или Esc
begin
try
Acad.ActiveDocument.Utility.GetEntity(Entity, BasePnt, 'Выделите объект ');
Obj:= Entity;
// Подсветить указанный объект красным
OldColor:= Obj.Color;
Obj.Color:= acRed;
Obj.Update;
Acad.ActiveDocument.Utility.InitializeUserInput(128, 'Yes No');
RetStr:= Acad.ActiveDocument.Utility.GetKeyword(
Format('Тип объекта: %s. Продолжить? (<Yes>/No): ', [Obj.EntityName]));
if RetStr = 'No' then Flag:= False;
Obj.Color:= OldColor;
Obj.Update;
except
Flag:= False;
end;
end;
end;
2.4.9 Выбор объектов, наборы выбора
Набор выбора (SelectionSet) — это группа объектов для выполнения над ними каких-либо операций (перемещение, копирование и т.п.). В документе может быть создано до 128 наборов выбора, для управления которыми служит коллекция SelectionSets.
Основные методы SelectionSet:
procedure SelectOnScreen(FilterType: OleVariant; FilterData: OleVariant); — позволяет пользователю указать выбираемые объекты на экране.
Параметры:
FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный
FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный
Параметры:
Point — 3-х элементный массив координат точки; обязательный
FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный
FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный
Параметры:
Mode — определяет режим выбора; обязательный. Возможны 3 значения: acSelectionSetFence — выбрать все объекты, пересекающиеся с рамкой; acSelectionSetWindowPolygon — выбрать все объекты, внутри рамки; acSelectionSetCrossingPolygon — выбрать все объекты, внутри рамки и пересекающиеся с ней;
PointsList — выриантный массив точек, задающих ограничительную рамку;
FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный;
FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный.
-
Экспорт координат точек объектов из AutoCAD в Excel
2.5.1 Экспорт координат точек объектов по средствам Lisp - программ
Язык программирования Лисп предназначен в первую очередь для обработки символьной информации. Поэтому естественно, что в мире Лиспа числа играют далеко не главную роль. Основные типы данных в Лиспе называются “атом” и “точечная пара”.
При выполнении работ имитационного моделирования ставится задача сбора существующего картографического материала на заданный участок местности. В большинстве случаев – это растровые подложки и файлы геоинформационных систем (ГИС). С импортом растра в программные продукты Delphi все просто: привязываем, загружаем в систему и оцифровываем тот участок, который нам нужен. С файлами ГИС дела обстоят намного сложнее. Перед импортом в программные продукты Delphi их нужно перевести в обменный формат DXF – открытый формат файлов для обмена двухмерной графической информацией между приложениями САПР. Этот формат был создан фирмой Autodesk для системы AutoCAD, и поддерживается практически всеми CAD-системами на платформе PC.
Существует ряд сложностей при импорте таких файлов в систему Delphi. Одна из них – масштаб. В AutoCAD нет строгого определения понятия масштаба. Есть прямоугольная система координат с единицами измерения, и каждый пользователь применяет свои значения: проектировщик видит в них миллиметры, строитель – сантиметры, а кто-то, возможно, — дециметры.
Вторая проблема – это структура файла. Каждый исполнитель рисует чертежи по-своему. У каждого специалиста свой набор слоев и блоков, кто-то вообще рисует в одном слое. Поэтому созданием одной схемы соответствия для импорта DXF-файлов в системы Delphi здесь не обойтись. Иногда DXF-файл приходится дорисовывать под существующую схему соответствия. Существует еще третья проблема, которая является наиболее трудоемкой для решения. Большинство чертежей нарисованы корректно, но они лежат в плоскости 0 и все элементы изображены на одном слое (рисунок 2.6). Такие файлы созданы только для печати, и для того чтобы результаты труда можно было в дальнейшем использовать.
Рисунок 2.6 - Пример плоского DXF-файла
Ведь если существуют полноценные векторные файлы чертежей, значит, есть и средства, позволяющие доработать их под требования пользователя. В данном проекте я продемонстрирую, как можно доработать DXF-файл в системе AutoCAD перед импортом объектов, координат в базу данных.
-
Доработка Dxf‐Файлов
В плоских DXF-файлах топографических планов точки представлены объектом «точка», который имеет координаты (Х, У) на плоскости, отметку Z=0 и размещенный рядом текст с указанием отметки точки (рисунок 2.7). В результате импорта такого файла все точки плана попадут в базу данных с отметкой 0. Для того чтобы можно было проектировать, необходимо вручную «поднимать» все отметки. В случае, когда в проекте несколько тысяч точек, это является очень трудоемким процессом.














