![]() |
| Главная »Статьи »AutoCAD и Delphi » |
|
Взаимодействие с пользователем заключается в запросах различных данных, объектов, выводе сообщений. Эти действия реализуются объектом AcadUtility, коллекцией AcadSelectionSets и ее объектом AcadSelectionSet. |
||||||||||||||||||
|
procedure InitializeUserInput(Bits: Byte; KeyWordList: OleVariant); Вызов метода InitializeUserInput задает ограничения по вводу данных для методов: GetKeyword, GetInteger, GetReal, GetDistance, GetAngle, GetOrientation, GetPoint, и GetCorner. Параметры:
Примеры использования: // не разрешен NULL ввод Acad.ActiveDocument.Utility.InitializeUserInput(1); // не разрешен NULL ввод и использовать для "резиновой нити" штриховую линию (33 = 32 + 1) Acad.ActiveDocument.Utility.InitializeUserInput(33); // не разрешен NULL ввод, заданы ключевые слова Acad.ActiveDocument.Utility.InitializeUserInput(1, 'Yes No'); |
||||||||||||||||||
|
procedure Prompt(const Message: WideString); — функция выводит в командную строку текст Message Параметры:
Пример использования: Acad.ActiveDocument.Utility.Prompt('Press any key...'); |
||||||||||||||||||
|
function GetPoint(Point: OleVariant; Prompt: OleVariant): OleVariant; Параметры:
Возвращаемое значение — 3-х элементный массив координат точки. Пример использования: var Pnt1, Pnt2: OleVariant; begin // Запрос у пользователя координат первой точки Pnt1:= Acad.ActiveDocument.Utility.GetPoint(, 'Укажите первую точку: '); // Запрос у пользователя координат второй точки с отображением "резиновой нити" от первой точки Pnt2:= Acad.ActiveDocument.Utility.GetPoint(Pnt1, 'Укажите вторую точку: '); // Построение отрезка из первой во вторую точку Acad.ActiveDocument.ModelSpace.AddLine(Pnt1, Pnt2); end; |
||||||||||||||||||
|
function GetCorner(Point: OleVariant; Prompt: OleVariant): OleVariant; Параметры:
Возвращаемое значение — 3-х элементный массив координат точки. Пример использования: var Pnt1, Pnt2, Pnt3, Pnt4: OleVariant; begin // Запрос у пользователя координат первой точки Pnt1:= Acad.ActiveDocument.Utility.GetPoint(, 'Укажите первый угол: '); // Запрос у пользователя координат второй точки с // отображением "резинового прямоугольника" от первой точки 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; |
||||||||||||||||||
|
function GetAngle(Point: OleVariant; Prompt: OleVariant): Double; Параметры:
Возвращаемое значение — угол в радианах против часовой стрелки (т.е. игнорирует значение ANGDIR). Функция выводит в командную строку подсказку Prompt и ожидает от пользователя ввода либо значения угла (в текущем формате угловых единиц), либо ввода 2-х точек прямой с отображением "резиновой нити". При получении угла учитываются переменные ANGBASE и ANGDIR. Пример использования:
var
Ang: Double;
begin
// Запрос у пользователя угла
Ang:= Acad.ActiveDocument.Utility.GetAngle(, 'Укажите значение угла: ');
ShowMessage(Format('Задан угол %f градусов', [RadToDeg(Ang)]));
end;
|
||||||||||||||||||
|
function GetDistance(Point: OleVariant; Prompt: OleVariant): Double; Параметры:
Возвращаемое значение — расстояние. Функция выводит в командную строку подсказку Prompt и ожидает от пользователя ввода либо одной точки (если параметр Point опущен) либо 2-х точек с отображением "резиновой нити" Пример использования:
var
Dist: Double;
begin
// Запрос у пользователя точек для расчета расстояния
Dist:= Acad.ActiveDocument.Utility.GetDistance(, 'Select first point: ');
// Вывод значения расстояния в командную строку
Acad.ActiveDocument.Utility.Prompt(Format('Distance = %f', [Dist]));
end;
|
||||||||||||||||||
|
function GetInteger(Prompt: OleVariant): Smallint; Параметры:
Возвращаемое значение — введенное пользователем целое число. Пример использования:
var
Int: Smallint;
begin
// Запрос у пользователя целого числа
Int:= Acad.ActiveDocument.Utility.GetInteger('Введите целое число <-32768...32767>: ');
// Вывод значения в командную строку
Acad.ActiveDocument.Utility.Prompt(Format('Число = %d', [Int]));
end;
|
||||||||||||||||||
|
function GetReal(Prompt: OleVariant): Double; Параметры:
Возвращаемое значение — введенное пользователем вещественное число. Пример использования:
var
Dbl: Double;
begin
// Запрос у пользователя целого числа
Dbl:= Acad.ActiveDocument.Utility.GetReal('Введите вещественное число: ');
// Вывод значения в командную строку
Acad.ActiveDocument.Utility.Prompt(Format('Число = %f', [Dbl]));
end;
|
||||||||||||||||||
|
procedure GetEntity(out Obj: IDispatch; out PickedPoint: OleVariant; Prompt: OleVariant); Параметры:
Пример использования:
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;
|
||||||||||||||||||
|
Набор выбора (SelectionSet) — это группа объектов для выполнения над ними каких-либо операций (перемещение, копирование и т.п.). В документе может быть создано до 128 наборов выбора, для управления которыми служит коллекция SelectionSets. Основные методы SelectionSet: procedure SelectOnScreen(FilterType: OleVariant; FilterData: OleVariant); — позволяет пользователю указать выбираемые объекты на экране. Параметры:
Пример использования:
const
SelSetName = 'TestSelSet';
. . .
var
SelSet, FilterType, FilterData: OleVariant;
begin
try
// Добавить SelSet
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
except
SelSet:= Acad.ActiveDocument.SelectionSets.Item(SelSetName);
SelSet.Delete;
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
end;
FilterType:= VarArrayCreate([0, 3], varSmallint);
FilterData:= VarArrayCreate([0, 3], varVariant);
// Установить фильтр для Selection Set на окружности и дуги
FilterType[0]:= -4;
FilterData[0]:= '<or';
FilterType[1]:= 0;
FilterData[1]:= 'Arc';
FilterType[2]:= 0;
FilterData[2]:= 'Circle';
FilterType[3]:= -4;
FilterData[3]:= 'or>';
// Пользователь должен выбрать объекты на экране
SelSet.SelectOnScreen(FilterType, FilterData);
end;
procedure Clear; — очищает SelectionSet. procedure Erase; — стирает все объекты в SelectionSet, но не удаляет сам SelectionSet. procedure Delete; — удаляет SelectionSet, но не стирает его объекты. procedure AddItems(Objects: OleVariant); — добавляет в SelectionSet объекты, указанные в массиве Objects. procedure RemoveItems(Objects: OleVariant); — удаляет из SelectionSet объекты, указанные в массиве Objects.
var
SelSet, Receding: OleVariant;
begin
try
// Добавить SelSet
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
except
SelSet:= Acad.ActiveDocument.SelectionSets.Item(SelSetName);
SelSet.Delete;
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
end;
// Пользователь должен выбрать объекты на экране
SelSet.SelectOnScreen();
ShowMessage(Format('Выбрано %d объекта(-ов)', [Integer(SelSet.Count)]));
// Удалить из набора первый объект
Receding:= VarArrayCreate([0, 0], varDispatch);
Receding[0]:= SelSet.Item(0);
SelSet.RemoveItems(Receding);
ShowMessage(Format('Осталось в наборе %d объекта(-ов)', [Integer(SelSet.Count)]));
end;
procedure SelectAtPoint(Point: OleVariant; FilterType: OleVariant; FilterData: OleVariant); — выбирает объект проходящий через точку Point. Параметры:
Пример использования:
var
SelSet: OleVariant;
begin
try
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
except
SelSet:= Acad.ActiveDocument.SelectionSets.Item(SelSetName);
SelSet.Delete;
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
end;
// Выделить первый попавшийся объект, проходящий через точку (50, 50, 0)
SelSet.SelectAtPoint(AcadPoint(50, 50));
// ... и удалить его
SelSet.Erase;
end;
procedure SelectByPolygon(Mode: AcSelect; PointsList: OleVariant; FilterType: OleVariant; FilterData: OleVariant); — выбирает объекты, в области полигона образованного точками PointsList. Параметры:
Пример использования:
var
SelSet, PointsList: OleVariant;
Mode: AcSelect;
begin
try
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
except
SelSet:= Acad.ActiveDocument.SelectionSets.Item(SelSetName);
SelSet.Delete;
SelSet:= Acad.ActiveDocument.SelectionSets.Add(SelSetName);
end;
// Задать ограничичельную рамку
PointsList:= VarArrayCreate([0, 11], varDouble);
PointsList[0]:= 0; PointsList[1]:= 0; PointsList[2]:= 0;
PointsList[3]:= 100; PointsList[4]:= 0; PointsList[5]:= 0;
PointsList[6]:= 100; PointsList[7]:= 100; PointsList[8]:= 0;
PointsList[9]:= 0; PointsList[10]:= 100; PointsList[11]:= 0;
case rgrpSelectByPolygonMode.ItemIndex of // rgrpSelectByPolygonMode: TRadioGroup;
0: Mode:= acSelectionSetFence;
1: Mode:= acSelectionSetWindowPolygon;
2: Mode:= acSelectionSetCrossingPolygon;
end;
SelSet.SelectByPolygon(Mode, PointsList);
// Удалить выделенное
SelSet.Erase;
end;
К статье прилагаются примеры на Delphi 7. Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором. |