Главная »Статьи »AutoCAD и Delphi »Взаимодействие с пользователем
Взаимодействие с пользователем

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

Инициализация ограничений ввода

procedure InitializeUserInput(Bits: Byte; KeyWordList: OleVariant);

Вызов метода InitializeUserInput задает ограничения по вводу данных для методов: GetKeyword, GetInteger, GetReal, GetDistance, GetAngle, GetOrientation, GetPoint, и GetCorner.

Параметры:

  • Bits— битовый флаг, являющийся суммой бит в соответствии с их весами; обязательный
  • Бит
    Описание
    1
    Запрещает NULL ввод, т.е. предотвращает ввод пользователем только Enter или пробела
    2
    Запрещает ввод нуля
    4
    Запрещает ввод отрицательных чисел
    8
    Разрешает ввод координат точек за пределами чертежных лимитов даже если системная переменная LIMCHECK установлена в 1.
    16
    Не используется
    32
    Использовать для "резиновой нити" штриховую линию вместо сплошной
    64
    Игнорировать Z-координату точек для метода GetDistance
    128
    Разрешает ввод любых данных
  • KeyWordList — строка, которая задает допустимые ключевые слова; необязательный. Ключевые слова разделяются пробелом. Если при вводе ключевого слова разрешен сокращенный вариант — обязательная часть вводится в верхнем регистре.

Примеры использования:

// не разрешен 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

Параметры:

  • Message — текст сообщения; необязательный

Пример использования:

Acad.ActiveDocument.Utility.Prompt('Press any key...');
Запрос координат точки

function GetPoint(Point: OleVariant; Prompt: OleVariant): OleVariant;

Параметры:

  • Point — 3-х элементный массив координат начальной точки; необязательный
  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — 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;

Параметры:

  • Point — 3-х элементный массив координат начальной точки; обязательный
  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — 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;

Параметры:

  • Point — 3-х элементный массив координат начальной точки; необязательный
  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — угол в радианах против часовой стрелки (т.е. игнорирует значение 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;

Параметры:

  • Point — 3-х элементный массив координат начальной точки; необязательный
  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — расстояние.

Функция выводит в командную строку подсказку 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;

Параметры:

  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — введенное пользователем целое число.

Пример использования:

var
  Int: Smallint;
begin
  // Запрос у пользователя целого числа
  Int:= Acad.ActiveDocument.Utility.GetInteger('Введите целое число <-32768...32767>: ');
  // Вывод значения в командную строку
  Acad.ActiveDocument.Utility.Prompt(Format('Число = %d', [Int]));
end;
Запрос вещественного числа

function GetReal(Prompt: OleVariant): Double;

Параметры:

  • Prompt — текст подсказки, выводимой в командную строку; необязательный

Возвращаемое значение — введенное пользователем вещественное число.

Пример использования:

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);

Параметры:

  • 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;
Выбор объектов, наборы выбора

Набор выбора (SelectionSet) — это группа объектов для выполнения над ними каких-либо операций (перемещение, копирование и т.п.). В документе может быть создано до 128 наборов выбора, для управления которыми служит коллекция SelectionSets.

Основные методы SelectionSet:

procedure SelectOnScreen(FilterType: OleVariant; FilterData: OleVariant); — позволяет пользователю указать выбираемые объекты на экране.

Параметры:

  • FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный
  • FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный

Пример использования:

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.

Параметры:

  • Point — 3-х элементный массив координат точки; обязательный
  • FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный
  • FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный

Пример использования:

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.

Параметры:

  • Mode — определяет режим выбора; обязательный. Возможны 3 значения: acSelectionSetFence — выбрать все объекты, пересекающиеся с рамкой; acSelectionSetWindowPolygon — выбрать все объекты, внутри рамки; acSelectionSetCrossingPolygon — выбрать все объекты, внутри рамки и пересекающиеся с ней;
  • PointsList — выриантный массив точек, задающих ограничительную рамку;
  • FilterType — вариантный массив переменных типа varSmallint, определяющих DXF-код фильтра; необязательный
  • FilterData — вариантный массив переменных типа varVariant, определяющих значение фильтра; необязательный

Пример использования:

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.


Внимание! Запрещается воспроизведение данной статьи или ее части без согласования с автором. Если вы желаете разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Вершинин И.В.

 
Используются технологии uCoz