Лекции и лабораторные работы по AutoCAD'у

         

Создание базы данных на Microsoft


Добавить в приложение-сервер, созданное в лабораторной работе №4 такую функциональность.
Создание базы данных на Microsoft Access, которая содержит поля "каталожный номер", "наименование", "тип".
В базу данных добавить несколько произвольных записей (5-10).
Используя расширенные данные (XData) обеспечить пометку пользователем примитивов чертежа, соответствующей записью из базы данных.
Создать спецификацию элементов, которые содержат расширенные данные, используя COM-технологию в Microsoft Excel.
Добавить соответствующие пункты меню AutoCAD для вызова добавленных функций.

Дополнительная информация


К любому примитиву чертежа можно добавлять расширенные данные, т.е. текстовые или числовые данные, которые желательно хранить вместе с геометрией (например, марки материалов, наименования узлов, секций и т.п.). Обычно наличие такой информации позволяет разрабатывать программы связи с базами данных. Расширенные данные связываются с именем определенного приложения. У одного графического примитива могут быть данные нескольких приложений, которые располагаются последовательно в определенной структуре.

В том случае, когда расширенные данные присоединены к примитиву, то в базе чертежа они следуют за обычными данными. Для расширенных данных отведено пространство (нужно вспомнить DXF-коды) начиная с 1000 по 1071.

Строковые константы

1000. Строковые константы в расширенных данных могут быть длиной не более 255 знаков (256-й знак зарезервирован под символ с кодом 0).

Имя приложения

1001 (тоже строковая константа). Используется только для указания имени приложения, длиной не более 31 знака (если код 1001 попадает внутрь списка, организуемого с помощью DXF-кодов 1002, то он интерпретируется как обычная строковая константа, а не имя приложения). Имя приложения должно состоять только из латинских букв, цифр и символов $, -, _.

Название слоя

1003. Название слоя, с которым связываются расширенные данные.

Метка в базе чертежа

1005. Метка объекта в базе чертежа

3D точка

1010. Три вещественных числа, обозначающие координату точки в 3-х мерном пространстве.



Вещественное число

1040. Вещественное число.

Короткое целое число

1070. 16-битовое целое число (со знаком или без знака).

Длинное целое число

1071. 32-битовое целое число. Если присвоить значение в группе 1071 как короткое целое число или вещественное число, то оно будет преобразовано в длинное целое число. Если присвоит, например строковую константу, то оно преобразуется в 32-битный нуль (0L).

ObjectARX всегда трактует группы 1071 как длинные целые.


Существуют и другие группы специальных расширенных данных:
Управляющая строка
1002. Расширенными данными можно управлять используя скобки "{" и "}". С помощью группы 1002 можно формировать в расширенных данных списковые структуры. Они должны начинаться открывающей скобкой с кодом 1002, затем должны идти данные, включаемые в список, а закрывающая скобка с кодом 1002 завершает оформление списка.
Двоичные данные
1004. Двоичные данные длиной не более 127 байтов. Обрабатываются только в ObjectARX.
3-х мерная точка положения в МСК
1011. Трехмерная точка интерпретируется как положение в МСК. Такая точка перемещается, масштабируется, поворачивается, и симметрируется одновременно с родительским примитивом рисунка.
3-х мерная точка перемещения
1012. Такая точка не перемещается, не масштабируется и не растягивается одновременно с родительским примитивом, но участвует вместе с ним в операциях масштабирования, поворота и симметрирования.
3-х мерная точка направления
1013. Трехмерная точка интерпретируется как направление в МСК. Учувствует в операциях поворота и симметрирования. Вектор с координатами, взятыми из группы с кодом 1013, является нормализованным, т.е. единичной длинны.
Расстояние
1041. Вещественное число, интерпретируемое как расстояние. Оно масштабируется одновременно с родительским примитивом.
Коэффициент масштаба
1042. Вещественное число, интерпретируемое как коэффициент масштаба. Масштабируется одновременно с родительским примитивом.
Пример использования расширенных данных на Object Pascal (Delphi).
function AcPoint(x, y, z: double) : OleVariant;
begin
   Result := VarArrayCreate([0, 2], varDouble);
   Result[0] := x; Result[1] := y; Result[2] := z;
end;
procedure CadDev_XDataExample;
const
   appid = 'MYAPPID';
var
   AcadApplication, Objects, vaPoint, vaType, vaData: OleVariant;
   i : integer;
begin
   
   // Получаем ссылку на откытый AutoCAD


2004 или запускаем новый
   AcadApplication := GetActiveOleObject('AutoCAD.Application.16');
   // Получаем множество выбранных объектов
   Objects := AcadApplication.ActiveDocument.SelectionSets.Add('XDATAEXAMPLE');
   Objects.SelectOnScreen;
   // Регестрируем приложение
   AcadApplication.ActiveDocument.RegisteredApplications.Add(appid);
   // Создаем гркппы кодов и массивы данных
   vaType := VarArrayCreate([0, 4], varSmallInt);
   vaData := VarArrayCreate([0, 4], varVariant);
   // Создаем вариантый массив 3D точки
   vaPoint := AcPoint(4.0, 6.0, 0.0);
   // Заполняем массив
   vaType[0] := 1001; // Название приложения должно быть вначале
   vaData[0] := appid;
   vaType[1] := 1070; // Целочисленное
   vaData[1] := 99;
   vaType[2] := 1040; // Вещественное
   vaData[2] := 2.5;
   vaType[3] := 1000; // Строка
   vaData[3] := 'Здавствуй яблочко!';
   vaType[4] := 1010; // 3D точка
   vaData[4] := vaPoint;
   // К каждому объекту в выбранных объктах
   // присоеденим расширенные данные XData
   For i := 0 to Objects.Count - 1 do
      Objects.Item(i).SetXData(vaType, vaData);
   Objects.Delete;
end;

Используя возможности технологии ActiveX AutoCAD


Используя возможности технологии ActiveX AutoCAD выполнить следующее:
1.      Удалить все группы меню и панели инструментов, создав, при этом, группу меню "Файл" с единственным пунктом меню "Выход". При выполнении этого задания предусмотреть возможность восстановления предыдущих настроек среды AutoCAD.
2.      В документе создать три слоя:
·          BaseLine
с толщиной линий 0,5 мм и типом линии Continous;
·          Lines
с толщиной линий 0,2 мм и типом линии DashDot;
·          Text
с толщиной линий 0,5 мм и типом линии Continous.
Цвета слоев должны быть различными.
3.      В этом же документе создать следующие стили текста:
·          3
(три) высотой 3 мм и типом шрифта Arial;
·          5
(три) высотой 5 мм и типом шрифта Arial.
4.      Сохранить файл под именем Lab1.dwg.

Порядок выполнения работы


1.      В качестве переменной, ссылающейся на документ AutoCAD использовать переменную AcadDocument типа OleVariant, значение которой присвоить с помощью функции CreateOleObject(‘AutoCAD.Drawing.16’).

Чтобы использовать функцию CreateOleObject, необходимо подключить библиотеку ComObj

в разделе uses.

2.      Создать свои настройки среды AutoCAD, используя объект Preferences.  В качестве названия  своей конфигурации использовать имя CadDev1.

3.      Создать следующие папки в текущей папке выполняемой программы:

support            содержит файлы поддержки, которые будут создаваться;

templates       содержит файлы шаблонов, которые будут использоваться;

blocks              содержит файлы с блоками, которые будут использоваться;

sources            в этой папке будут находится исходные тексты некоторых программ.

4.       

5.       



Основываясь на результатах предыдущей лабораторной


Основываясь на результатах предыдущей лабораторной работы, используя возможности технологии ActiveX AutoCAD выполнить следующее:
5.      Создать собственную конфигурацию AutoCAD (Profile) с именем "CadDev1", используя объект "Preferences".
6.      Создать одну единственную группу меню MenuGroups
с именем "CadDev1" с единственным меню "Файл" и пунктом меню "Выход". Группу меню выполнить в виде файла CadDev1.mnu. В конфигурации CadDev1 указать эту группу меню.
7.      Вычертить фигуру, используя свой вариант задания. Объекты фигуры расположить на следующих слоях (для этого необходимо загрузить dwg-файл, сохраненный в предыдущей лабораторной работе):
·          Базовая линия - BaseLine (толщина линии 0,5 мм, тип линии Continous);
·          Осевые линии - Lines (толщина линии 0,2 мм, тип линии DashDot);
·          Размеры и текст - Text (толщина линий 0,5 мм, тип линии Continous).
Цвета слоев должны быть различными.
Для текста размера использовать стиль текста 3 (высота символов 3 мм и типом шрифта Arial);
8.      Сохранить файл под именем Lab2.dwg.

Порядок выполнения работы


6.      В качестве переменной, ссылающейся на документ AutoCAD использовать глобальную переменную AcadDocument типа OleVariant, значение которой присвоить с помощью функции CreateOleObject(‘AutoCAD.Drawing.16’).

Чтобы использовать функцию CreateOleObject, необходимо подключить библиотеку ComObj

в разделе uses.

7. Создать свою конфигурацию среды AutoCAD, используя объект Preferences (см. объектную модель AutoCAD).

8.      Создать файл CadDev1.mnu.

//

// Пустой файл без меню и панелей инструментов

// Используется только для выполнения лабораторной работы

//

***MENUGROUP=CADDEV1

***POP1

**FILE

ID_MnFILE   [&Файл]

ID_APP_EXIT [В&ыход\tCtrl+Q]^C^C_quit

***TOOLBARS

***HELPSTRING

ID_MnFILE   [Файл]

ID_APP_EXIT [Выход из AutoCAD]

Файл меню должен быть сохранен в папке, в которой указан путь в конфигурации CadDev1

и указан в этой же конфигурации, как файл меню AutoCAD.

9.      Написать процедуру, которая вычертит деталь в пространстве модели, изображенную в задании, согласно своего варианта. Для удобства написания кода, рекомендуется создать переменную MSpace типа OleVariant и присвоить ей значение AcadDocument.ModelSpace.

Все указанные размеры на задании принять как параметры, согласно которых будет вычерчиваться деталь.

10.  Сохранить файл чертежа.



Результаты предыдущих лабораторных работ оформить


Результаты предыдущих лабораторных работ оформить в виде одного приложения.
На базе приложения создать внутренний сервер автоматизации. Сервер должен экспортировать такие методы:

·         GetApplication
Получает указатель на текущий объект Application приложения AutoCAD.
·         Run1Lab
Выполняет подпрограмму первой лабораторной работы.
·         Run2Lab
Выполняет подпрограмму второй лабораторной работы.
·         Run3Lab
Выполняет подпрограмму третьей лабораторной работы.
·         ResetAcad
Восстанавливает установки AutoCAD по умолчанию

Обеспечить вызов сервера из AutoLISP программы используя функциональность ActiveX данного языка.
Для вызова методов сервера автоматизации создать дополнительное меню AutoCAD.

Дополнительная информация


9.      В технологии ActiveX объектная модель работающего приложения представляется как совокупность объектов, свойств, методов и событий. Для каждого из элементов этой модели имеется своя реализация в виде данных новых типов (структур) и функций, обеспечивающих взаимодействие с пользователем.

10.  Для использования расширения языка AutoLISP, реализующее в системе AutoCAD технологию ActiveX, необходимо использовать функцию (vl-load-com).

Эта функция загружает большое количество функций, входящих в расширение AutoLISP. Возвращаемого значения у функции нет.

11.  Чтобы получить указатель корневого объекта иерархии AutoCAD (имя объекта – Application) используйте функцию (vlax-get-acad-object).

Возвращаемое значение – VLA-объект.

12.  Функция (vla-get-activedocument)

возвращает указатель открытого документа.

13.  Функции (vla-get-modelspace) и (vla-get-paperspace) возвращают соответственно указатели на пространство модели рисунка и пространство листа документа.

14.  Пример функции AutoLISP, которая обеспечивает подготовку к работе с ActiveX:

(defun begin_activex ( /)

  (vl-load-com)

  (setq acad_application (vlax-get-acad-object)

  (setq active_document (vla-get-activedocument acad_application))

  (setq model_space (vla-get-modelspace activedocument))

); defun

15.  Создать указатель на объект приложения перед его запуском можно используя функцию

(vlax-create-object <имя>)

Аргумент <имя>

- строка, определяющая тип объекта. Может быть одно из следующих видов: “<приложение>.<тип>.<версия>”

или “<приложение>.<тип>”. Например “<CadDev>.<Lab5>”.

Возвращаемое значение – VLA-объект.

16.  Функция вычисляет указатель для объекта приложения или самого приложения:

(vlax-get-object <имя>)

Аргумент <имя>

- строка, определяющая тип объекта. (Описание см. п.7).

17.  Функция, которая вычисляет указатель объекта приложения или создает его, если такого указателя не было:


(vlax-get-or-create-object <имя>)
Аргумент <имя>
- строка, определяющая тип объекта. (Описание см. п.7).
18.  Функция (vlax-invoke-method) применяет метод с указанным именем.
(vlax-invoke-method <объект> <метод> <арг1> [<арг2> … [аргN] … ]))
Возвращаемое значение определяется вызываемым методом.
19.  Функция, которая вычисляет свойство объекта.
(vlax-get-property <объект> <свойство>)
20.  Функция, которая присваивает значение свойству объекта.
(vlax-put-property <объект> <свойство>)
21.  Функция импортирует информацию из библиотеки типов:
(vlax-import-type-library :tlb-filename <файл> [:methods-prefix <мпрефикс> :properties-prefix <спрефикс> :constants-prefix <конпрефикс>])
Аргумент <файл>
может быть строкой с именем файла библиотеки типов.
Аргумент <мпрефикс>
– строка, которая будет добавляться при импорте к формируемым именам функций, соответствующих методам. По умолчанию имеет значение пустой строки.
Аргумент <свпрефикс>
– строка, которая будет добавляться при импорте к формируемым именам функций чтения и модификации свойств (например, для префикса xxx- и свойства Radius генерируются имена xxx-get-radius и xxx-put-radius). По умолчанию имеет значение пустой строки.
Аргумент <конпрефикс>
– строка, которая будет добавляться при импорте у формируемым именам констант. По умолчанию имеет значение пустой строки.
Пример,
(defun InitCadDev ( / CadDev_DLLPath)
  (progn
    ;; Если используется NT
платформа, то необходимо
    ;; жестко прописать путь к библиотеке (рекомендация)
    (setq CadDev_DLLPath
      (strcat (getenv "systemdrive")
      "\\Program Files\\Cad Developer Labs\\")
    )
    ;; Если мы нашли библиотеку ...
    (if (findfile (strcat CadDev_DLLPath "caddev5.dll"))
      ;; Импортируем её
      (vlax-Import-Type-Library


        :tlb-filename   (strcat CadDev_DLLPath "caddev5.dll")
        :methods-prefix    "cdm-"
        :properties-prefix "cdp-"
        :constants-prefix  "cdk-"
      )
      ;; Если не находим - сообщаем пользователям
      (alert (strcat "Не найдено:\n" CadDev_DLLPath "caddev5.dll"))
    )
  )
)
Справочную информацию о AutoLISP и VisualLISP можно найти на страничке http://caddev.narod.ru/download.html.
(код 1):
procedure StartAutoCAD;
var
  AcadApplication: OleVariant;
begin
  AcadApplication := CreateOleObject(‘AutoCAD.Application.16’);
  // Код, необходимый для решения поставленной задачи
end;
 
(код 2):
var
  ...
  AcadDocument: OleVariant;
begin
  ... 
  AcadDocument := AcadApplication.ActiveDocument;
  ...
end;
(код 3):
procedure CreateAutoCADDocument;
var
  AcadDocument: OleVariant;
begin
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
 
  // Выполнение необходимой задачи
 
  AcadDocument.Save; // Сохранение документа
  AcadDocument.Application.Quit; //Завершение работы и выход из AutoCAD
end;
(код 4):
var
  StartPoint, EndPoint,
  AcadDocument, LineObj: OleVariant;
begin
  StartPoint := VarArrayCreate([0, 2], varDouble);
  EndPoint := VarArrayCreate([0, 2], varDouble);
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
  StartPoint[0] := 0; StartPoint[1] := 0; StartPoint[2] := 0;
  EndPoint[0] := 30; EndPoint[1] := 20; EndPoint[2] := 0;
  LineObj := AcadDocument.ModelSpace.AddLine(StartPoint, EndPoint);
end;
(код 5):
var
  StartPoint, EndPoint,
  AcadDocument, ModelSpace, LineObj: OleVariant;
begin
  StartPoint := VarArrayCreate([0, 2], varDouble);
  EndPoint := VarArrayCreate([0, 2], varDouble);
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
  ModelSpace := AcadDocument.ModelSpace;
  StartPoint[0] := 0; StartPoint[1] := 0; StartPoint[2] := 0;


  EndPoint[0] := 30; EndPoint[1] := 20; EndPoint[2] := 0;
  LineObj := ModelSpace.AddLine(StartPoint, EndPoint);
end;
(код 6):
var
  AcadDocument, LayerCollection: OleVariant;
begin
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
  LayerCollection := AcadDocument.Layers;
  // Выполнение необходимой задачи
end;
(код 7):
var
  AcadDocument, MenuGroupsCollection: OleVariant;
begin
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
  MenuGroupsCollection := AcadDocument.Application.MenuGroups;
  // Выполнение необходимой задачи
end;
(код 8):
var
  AcadDocument, NewLayer: OleVariant;
begin
  AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);
  NewLayer := AcadDocument.Layers.Add(‘MyNewLayer’);
  // Выполнение необходимой задачи
end;

Основы параметрического проектирования


Основы параметрического проектирования

В соответствии с общей идеологией системы Автокад главное ее предназначение - вовсе не рисование чертежей на компьютере (это приводит к падению производительности труда конструктора в 2..3 раза [2]), а создание на ее основе специализированной САПР определенного класса изделий. Такие САПР резко, в 15..20 раз повышают производительность.

Как же надо правильно использовать Автокад? Анализ работы конструкторско-технологических служб ряда промышленных предприятий позволил установить, что одна из наиболее трудоемких проектных процедур в ходе КТПП - разработка конструкторской документации на ряд близких по конструкции деталей и/или сборочных единиц (ДСЕ), отличающихся в основном своими размерными параметрами или вариантами исполнения. Данная процедура является трудоемким и нетворческим процессом с низкой производительностью и высокой вероятностью внесения ошибок. Особенно часто требуется выпускать конструкторскую документацию на средства технологического оснащения (СТО) машиностроительного производства: тиски, кондукторы, пресс-формы и т.д., причем подготовка этой документации должна вестись опережающими темпами для обеспечения времени на изготовление СТО к моменту запуска изделия в производство.

Следует четко определить, какие изделия можно считать подлежащими параметризации. При рассмотрении 2D-проекций детали видно, что они могут быть разбиты на элементарные графические примитивы: отрезки и дуги (рисунок 7.1, а). Каждый примитив однозначно определяется координатами своих базовых точек: начальной и конечной точек отрезка, начальной, конечной точек и центра дуги. Тогда проекцию можно представить в виде графа, вершины которого соответствуют базовым точкам, а ребра - параметрическим связям между ними (рисунок 7.1, б).

Рисунок 7.1 - Проекция детали (а) и ее представление в виде графа (б).

Каждая связь i-j,

проходящая от i-й до j-й базовой точки есть вектор параметров

 

, где                                                    (7.1)


 - расстояние от точки i до точки j;

 - угол между прямой, проходящей через точки i и j и прямой, выбранной в качестве начала отсчета углов.

Введем следующее определение:

Два объекта называются конструктивно подобными, если их соответствующие проекции представляются одними и теми же графами.

Использование графов дает возможность, задавшись произвольными координатами
 i-й базовой точки, однозначно определить координаты всех остальных базовых точек при обходе графа по формулам:

                                          (7.2)

Таким образом, имея граф, описывающий семейство однотипных объектов, конструктору достаточно задать размерные связи между его базовыми точками, а специализированная САПР выполнит обход графа, расчет координат и отображение полученной проекции. Для этого представим граф в виде функции отображения (топологической функции) вида

, где                                                (7.3)

x,y

- координаты начальной точки,

 
 - вектор параметров графа.

Многие изделия представляются в виде вариантных чертежей, когда изделие состоит из постоянной части с варьируемыми размерами и вариантной части с уникальной геометрией. Например, для станочных тисок проектируются уникальные губки под каждую конкретную деталь, фиксируемую этими тисками, но корпус, ходовой винт, струбцина и прочие ДСЕ тисок остаются конструктивно неизменными. В данном случае определение конструктивно подобного изделия не выполняется. Поэтому необходимо ввести понятие варианта конструкции, для чего следует разбить граф проекции на константную часть C и переменную часть V. Тогда достаточно потребовать соответствия графов только константных частей для их автоматизированного параметрического проектирования, а вариантные части, являющиеся уникальными, проектируются с применением универсальных САПР с последующим объединением частей C и V.

Очень часто конструктору приходится выпускать документацию на ряд изделий, которые отличаются только своими размерами (линейными или угловыми), а форма их остается неизменной. Яркий пример таких изделий - технологическая оснастка: кондукторы, мерительный инструмент, пресс-формы и др. (рисунок 7.2).





Рисунок 7.2 - Конструктивно однородные изделия.

Сущность параметрического проектирования

состоит в создании математической модели класса конструктивно однородных изделий, а затем в генерации изображений этих изделий по набору задаваемых размерных параметров.


При параметрическом проектировании конструктор запускает программу, рассчитанную на определенный класс изделий, и вводит требуемые размеры. Программа отрисовывает на экране чертеж детали. Конструктор оценивает его и при необходимости вводит размеры снова до достижения требуемого результата. Одновременно может рассчитываться масса детали, что позволяет контролировать ее "на ходу", прямо в процессе проектирования.

Проекция изделия как векторное изображение состоит из множества базовых геометрических элементов

- отрезков и дуг. Положение этих элементов на плоскости определяется координатами их базовых точек

(рисунок 7.3). Для отрезка базовыми точками являются его начало и конец, а для дуги - начало, конец и центр (дугу можно задать и через другие параметры: радиус, угол, направление и т.д. Автокад поддерживает 18 способов задания дуги).



Рисунок 7.3 - Базовые точки геометрических примитивов.

Таким образом, программа-параметризатор рабоает по следующему алгоритму:

1.     Ввод исходных данных;

2.     Отрисовка текущего варианта

3.     Запрос пользователю: повторить?

4.     Если да, то переход на п. 1

5.     Конец

Несомненно, здесь нужен большой цикл типа WHILE, который мы уже рассматривали в такой роли.

Попробуем написать простейший параметризатор для детали, изображенной на рисунке 7.4.



Рисунок 7.4 - Заданная геометрия детали.

Сначала нужно определиться с координатами базовых точек. Поскольку проекция симметрична, достаточно найти координаты только двух точек А и В. Нижняя половина проекции отрисуется автоматически при помощи команды Автокада ЗЕРКАЛО.

Не нужно делать лишнюю работу вместо компьютера. компьютер должен работать, а человек - думать.



Определим размерные параметры детали. Очевидно, их два: длина цилиндра и его диаметр.

Для сложных деталей возможны различные наборы размеров. подходящий набор выбирается из технологических соображений.

Для расчета необходимо задаться точкой привязки - опорной точкой, определяющей положение проекции на листе чертежа. Условимся считать опорной точкой левый конец осевой линии. Также, заглянув в ЕСКД, условимся, что осевая линия выходит за контур на 5мм.

Итак, на входе нашей функции:

-        координата Х

точки привязки;

-        координата Y

точки привязки;

-        длина цилиндра L;

-        диаметр цилиндра D.

Нужно найти:

-        координату X

точки A (обозначим AX);

-        координату Y

точки A (обозначим AY);

-        координату X

точки B (обозначим BX);

-        координату Y

точки B (обозначим BY).

Очевидно, что:

                                  (7.4)

 

Будем считать, что наша функция отображения (назовем ее show) вызывается из некоторой головной функции и ей передаются параметры x, y, l, d

(координаты точки привязки, длина и диаметр цилиндра соответственно). Результаты расчета нужно записывать в локальные переменные функции show. Соображения экономии памяти, а также хорошего стиля программирования приводят к тому, что нам хватит всего двух локальных переменных: в переменную tmp мы будем заносить текущие результаты расчетов, а в переменную lst - список рассчитанных координат. Этот список будет состоять из двух элементов (точки A и B), каждый из которых, в свою очередь, тоже будет списком их двух координат: X

и Y:
.

Пишем программу (легко сказать...):

( DEFUN show ( x y d l / tmp lst )

 ; x, y, s, l - параметры

 ; tmp, lst - локальные переменные

 ; координата x точки A записывается в переменную tmp

 ( SETQ tmp ( + x 5 ) )

 ; в переменную lst записывается список координат

 ; точки A

 ( SETQ lst ( LIST tmp ( + y ( / d 2 ) ) ) )

 ; координата x точки B записывается в переменную tmp

 ( SETQ tmp ( + x 5 l ) )

 ; в переменную tmp записывается список координат

 ; точки B

 ( SETQ tmp ( LIST tmp ( + y ( / d 2 ) ) ) )

 ; в список lst добавляется точка B

 ( SETQ lst ( LIST lst tmp ) )

); конец функции

<


Листинг 7.1 - Функция  расчета координат базовых точек.

 

Отрисовку будем выполнять в той же функции show.

. . .

; Удаляем все объекты

 ( COMMAND "СОТРИ" "РАМКА" '( -10000 -10000 ) '(10000 10000) "" )

; Рисуем осевую линию красным цветом (код 1)

; и штрих-пунктирно (тип линии CENTER)

( COMMAND "ЦВЕТ" 1 "ТИПЛИН" "У" "CENTER" "")

( COMMAND "ПЛИНИЯ" ( LIST x y ) ( LIST ( + x l 10 ) y ) "" )

; Рисуем контур детали белым цветом (код 1)

; и сплошной линией (тип линии CONTINUOS)

( COMMAND "ЦВЕТ" 7 "ТИПЛИН" "У" "CONTINUOUS" "")

( COMMAND "ПЛИНИЯ"

 ( LIST ( + x 5 ) y ) ; левая точка пересечения осевой

 ; с контуром

 ( CAR lst ) ; точка A

 ( CADR lst ) ; точка B

 ( LIST ( + x l 5 ) y ) ; правая точка пересечения осевой с контуром

  "" ) ; прерывание команды "ПЛИНИЯ"

( COMMAND "ЗЕРКАЛО"

 ( CAR lst ) ; выбрали объект, указав точку А

 "" ; прервали выбор объектов

 ( LIST x y ) ; первая точка осевой линии -

 ;точка пересечения контура с осевой слева

 ( LIST ( + x 5 ) y ) ; вторая точка осевой линии

  "Н" ) ; старые объекты не удалять

 ; Проставляем длину

 ( COMMAND "ЦВЕТ" 1 )

 ( COMMAND "РАЗМЕР1"

  "ГОР" ; размер горизонтальный

  ( CAR lst ) ; начало первой выносной линии - точка А

  ( CADR lst ) ; начало второй выносной линии - точка В

  ( POLAR ( CAR lst ) ( / PI 2 ) 30 ) ; размерная линия            

;  отстоит от контура на 30мм

  "" ) ; размерный текст ставится автоматически

; Проставляем диаметр

( COMMAND "РАЗМЕР1" "ВЕР" ( CADR lst )

 ( LIST ( CAR ( CADR lst ) ) ( - ( CADR ( CADR lst ) ) d ) )

 ( POLAR ( CADR lst ) 0 30 )

 ; "@" - знак диаметра в шрифте eskd.shx.

 ; После него выводим диаметр, преобразованный

 ; в текстовую строку

 ( STRCAT "@" ( RTOS d 2 2 ) ) )

( COMMAND "ПОКАЖИ" "ВСЕ" )

); конец функции
<


Листинг 7.2 - Функция  расчета координат базовых точек и отрисовки.

Размерные параметры конкретного изделия вводятся конструктором с клавиатуры. Следует помнить, что человеку свойственно ошибаться, а также развлекаться, вводя слово "Вася" в ответ на запрос "Введите диаметр". Поэтому в функции ввода исходных данных следует предусмотреть хотя бы минимальную защиту от ввода некорректных значений. Для этого используется функция INITGET.

Итак, функция ввода данных на входе не имеет параметров, а вот возвращать она должна несколько чисел. Единственный способ возвратить несколько значений - объединить их в список. Теперь мы можем написать функцию ввода данных для нашего примера (назовем ее getdim).

( DEFUN getdim ( / l d )

; ввод длины и диаметра

; возвращаемый список: ( диаметр длина )

( INITGET 7 ) ; запрет пустого ввода и ввода чисел <=0

( SETQ l ( GETREAL "\nВведите длину валика: " ) )

( INITGET 7 )

( SETQ d ( GETREAL "\nВведите диаметр валика: " ) ) 

 ( LIST d l ) ; возвращаемое значение

) ; конец функции getdim

Листинг 7.3 - Функция  ввода параметров.

Головная функция должна выполнять подготовительные операции (например, установку системных переменных Автокада для отрисовки размеров в соответствии с требованиями ЕСКД) и циклический вызов двух остальных функций: getdim

и show. Для удобства перед именем головной функции можно добавить символы "C:". Тогда в Автокаде появится новая команда с именем вашей головной функции и можно будет не набирать скобки при ее вызове. В примере головная функция называется C:main, поэтому для ее вызова в командной строке Автокада достаточно набрать main.

Самостоятельно разберитесь с одним из возможных вариантов организации цикла, приведенном в примере.

( DEFUN C:main ( / l x y flag )

 ; Устанавливаем размерные переменные по ЕСКД

 ; Текст над размерной линией, а не в разрыве

 ( SETVAR "DIMTAD" 1 )

 ; Текст вне размерных линий параллелен линиям

 ( SETVAR "DIMTOH" 0 )

 ; Текст между размерными линиями горизонтален

 ( SETVAR "DIMTIH" 0 )

 ; Проведение линии между выносными, если текст сбоку

 ( SETVAR "DIMTOFL" 1 )

 ; Продолжение выносных линий за размерными, мм

 ( SETVAR "DIMEXE" 1 )

 ; Отключение генерации допусков

 ( SETVAR "DIMTOL" 0 )

 ; Размер стрелок

 ( SETVAR "DIMASZ" 3 )

 ; Продолжение выносных линий за размерную

 ( SETVAR "DIMEXE" 3 )

 ( SETQ flag T )

 ( WHILE flag

  ( SETQ l ( getdim ) x 10 y 10 )

  ( show x y ( CAR l ) ( CADR l ) )

  ( SETQ ans ( GETSTRING "\nПовторить?<Д/Н>: " ) )

  ( SETQ flag ( OR ( = ans "Д" ) ( = ans "д" ) ) )

 ); конец WHILE

 ( PRIN1 )

)
Листинг 7.4 - Головная функция .