Главная »Статьи »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. Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором. |