понедельник, 26 сентября 2011 г.

Книга по WOODY ч.6


Пример описания параметрического контура на языке Java Script
Если Вы познакомились с разделом "JScript - интерфейс описания параметрических контуров деталей", то Вам будет полезно рассмотреть предлагаемый здесь пример описания параметрического контура. Контур, описание которого Вам здесь предлагается, условно называется "Впадина с перегибом". Возможно, Вы уже использовали этот контур и знакомы с ним. Если нет, Вы можете найти его в диалоге "Параметрический контур".
Для начала, найдем в файле contourlist.js строки, соответствующие этому контуру. Они приведены ниже:
TabCont.AddContourTab(20, "Впадина с перегибом", "Contour20");
TabCont.AddParamTab("Вставка A", "A", 0.3);
TabCont.AddParamTab("Вставка B", "B", 0.2);
TabCont.AddParamTab("Вставка C", "C", 0.4);
Для того, чтобы описать свой контур, зависящий, например, от 2 параметров, как Вы уже догадались, Вам нужно для начала создать файл с расширением .js, назвав его, к примеру, Contour999 (имя должно быть уникальным), затем в конец файла contourlist.js дописать нечто похожее на следующее:
ТabCont.AddContourTab(999 ,"Мой контур", "Contour999");
TabCont.AddParamTab("Первый параметр", "Х1", 0.4);
TabCont.AddParamTab("Второй параметр", "Х2", 0.6);
Теперь, чтобы увидеть название своего контура в списке параметрических контуров, нажмите кнопку "Обновить список" в диалоге "Параметрический контур". Список контуров обновляется также при открытии документа или создании нового.
Просматривая список контуров, Вы увидите, что контуров стало на один больше. И все благодаря Вам! Но это только начало, тем более, что в окошке с изображением контура ничего нет. Мы описали лишь общие характеристики нашего контура и файл с именем Contour999.js у нас пуст.
Вернемся к примеру из диалогового окна, а именно к файлу contour20.js. Этот файл содержит описание контура "Впадина с перегибом". Рассмотрим его подробно. Первые предложения файла Contour20.js выглядят примерно так:
#include "Contour.jsh" // -Подключается библиотека с необходимыми константами;
var TabCont = Document.GetParamContour(); //-Объявляется переменная TabCont. Метод GetParamContour() уже нам встречался раньше.
var SizeX = TabCont.GetSizeX();
var SizeY = TabCont.GetSizeY(); //-В переменных SizeX и SizeY запоминаем габариты детали.
var A = TabCont.GetParam(0);
var B = TabCont.GetParam(1);
var C = TabCont.GetParam(2);
Переменные А,В,С - 1,2 и 3 параметры контура "Впадина с перегибом" соответственно. Мы их объявили и сразу инициализировали параметрами нашего контура. Их не следует путать со вторым параметром метода AddParamTab() для нашего примера. Приведенные выше строки позволяют получить все параметры, однозначно определяющие описываемый нами в файле contour20.js параметрический контур.
Продолжив рассмотрение файла Contour20.js, мы встретим следующую условную конструкцию:
if (C>SizeY) C=SizeY;
Можно догадаться, что это означает следующее: если С, то есть 3 параметр нашего контура больше габарита по вертикали, то приравняем его этому габариту. С может оказаться больше габарита только в результате ошибки пользователя. Мы вышеприведенной строкой застраховываем себя от такой ошибки и от ее нехороших последствий. Далее мы встретим:
if((A+B)>SizeX){
if((A>SizeX) && (B>SizeX)){
A=4*SizeX/5;
B=A;
} else
if(A>SizeX) A=3*(SizeX-B)/4; else
if(B>SizeX) B=3*(SizeX-A)/4;
}
else также относится к условному оператору и означает "иначе", && означает "и". Таким образом последнее предложения можно перевести на естественный язык так: в случае, если сумма параметров А и В превышает габарит, необходимо выполнить действия, стоящие между первой и последней фигурными скобками. Это такие действия: проверить, оба ли параметра (и А и В) превышают габарит?(может быть и такое). Если да, то пусть А равняется четыре пятых габарита, а потом и В пусть равняется А, то есть тоже четыре пятых габарита. Далее идет слово else (иначе). Действия после "иначе" выполняются, если условие (A>SizeX) && (B>SizeX) ложно. Опишем эти действия: если только А больше SizeX, то приравнять А трем четвертым разницы между горизонтальным габаритом и параметром В (то есть SizeX-B). Иначе, если (B>SizeX) то B=3*(SizeX-A)/4.
После объявления переменной DY можно привести примерный вид координатного поля для нашего примера(см. рисунок).
Далее в нашем примере следует вывод размерных линий.
if(TabCont.GetFlagDim()){
TabCont.SetLineDim(0, 0, A, 0, 0, HorLineDim); // A
TabCont.SetLineDim(SizeX-B, DY, SizeX, DY, 1, HorLineDim); // B
TabCont.SetLineDim(SizeX, SizeY, SizeX, SizeY-C, 2, VertLineDim); // C
}
Следует обратить внимание на функцию GetFlagDim(), которая нужна для запрета вывода размерных линий во всех случаях, кроме демонстрации контура. В теле условного оператора мы выводим размерные линии для параметров А, В, С. Результат этого вывода виден в окне диалога "Параметрический контур".
Продолжим рассмотрение так заинтересовавшего нас файла Contour20.js. Мы встречаем следующие строки и понимаем, что видя их, Woody сначала создаст новый контур, а затем новую зону контура.
TabCont.NewContour();
TabCont.NewEdge();
Новую зону контура следует создавать сразу после создания контура, или в случае, если описываемая зона соответствует новому участку кромкования. После объявления новой зоны контура мы можем приступить к непосредственному описанию контура. В нашем распоряжении есть: отрезок прямой, дуга эллипса, кривая Безье.
if(DY < Min_R) {
Если DY(см. рис. выше) меньше Min_R (маленькое число, определено в файле contour.jsh), то нет смысла выводить сначала отрезок прямой, затем кривую Безье. Кривая Безье вырождается в отрезок прямой. Поэтому следующие два вызова функции AddPointEdge() просто добавят в контур горизонтальный отрезок прямой, начинающийся в точке (0,0) и заканчивающийся в точке (SizeX,0).
TabCont.AddPointEdge(0,0);
TabCont.AddPointEdge(SizeX,0);
} else{
Если ситуация обычная, то для начала добавим отрезок [(0,0); (A,0)]. Для этого и нужны следующие две строки:
TabCont.AddPointEdge(0,0);
TabCont.AddPointEdge(A,0);
Смысл описываемой в следующей строке переменной DPX станет понятен из рисунка ниже. Эта переменная нам пригодится при выводе кривой Безье.
var DPX=(SizeX-A-B)/2.5;
if ((A+B)>SizeX) DPX = (A<B ? A : B)/4;
var DPY = 0;
TabCont.AddBeze(A, 0, A+DPX, DPY, SizeX-B-DPX, DY-DPY, SizeX-B, DY, 12);
if(B>Min_R)
Текущая точка - (SizeX-B,DY). Добавим отрезок [(SizeX-B,DY); (SizeX,DY)].
TabCont.AddPointEdge(SizeX, DY);
}

Красным цветом на рисунке обозначены вторая и третья точки выведенной кривой Безье. Жирная линия иллюстрирует три, уже внесенных в контур, участка - отрезок, кривая Безье и еще один отрезок.
Продолжим рассмотрение файла Contour20.js. В последних строках этого файла мы пополняем наш контур "Впадина с перегибом" еще тремя участками контура, каждый из которых является отрезком.
TabCont.NewEdge;
if(C>Min_R) {
TabCont.AddPointEdge(SizeX,DY);
TabCont.AddPointEdge(SizeX,SizeY);
}
TabCont.NewEdge();
TabCont.AddPointEdge(SizeX,SizeY);
TabCont.AddPointEdge(0,SizeY);
TabCont.NewEdge();
TabCont.AddPointEdge(0,SizeY);
TabCont.AddPointEdge(0,0);

Комментариев нет:

Отправить комментарий