Условие установки зависимостей
Условие установки зависимостей
Задача
Создание сообщения для пользователя при невозможной установке зависимостей соединяемых объектов.
Пример
Соединение двух труб ГОСТ 8732–78 и ГОСТ 8734–75. Номенклатура типоразмеров у трубы ГОСТ 8732–78 больше, чем у 8734−75, поэтому при присоединении 8734−75 к 8732−78 диаметр труб может не совпасть. Если диаметр трубы ГОСТ 8732–78 составляет 325 мм, то при присоединении трубы ГОСТ 8734–75 будет выбран максимальный доступный диаметр — 250 мм, не равный диаметру исходной трубы по ГОСТ 8732–78.
Решение. Вариант 1
Чтобы известить пользователя можно воспользоваться функцией MessageBox. Для этого нужно открыть Мастером объектов объект «Труба ГОСТ 8734» и внести в скрипт следующие изменения:
function OnConnect {
// проверка типа объекта к которому устанавливается зависимость
if ( (obj.strTheType=="Tube" && obj.strTheSubType=="Round") || obj.strTheType=="vaPipe" ) {
// находим индекс ближайшей плоскости WP1, WP2, WP3, WP4
iWPindx = findNearest(pntOrigin, obj.WP, 1, 4);
// если ближайшая плоскость была найдена, то
if ( iWPindx==1 || iWPindx==2 || iWPindx==3 || iWPindx==4 ) {
// устанавливаем зависимости:
// геометрическая зависимость вставки на ближайшую плоскость
SetGeomConstraint(INSERT, CONTRDIRECT, obj, WP1, obj.WP[iWPindx], 0, TRUE);
// присваиваем одинаковые значения для отображения обычный видразрез
// lSimpleView==2 - разрез, lSimpleView==0 - обычный вид
lSimpleView = obj.lSimpleView;
// не указывать вектор вставки
NoVectorSelect = 1;
// запоминаем ID объекта, к которому установлена зависимость
setWorkId(0,obj.objectID);
if (Answer==IDYES) {
// если в диалоге была нажата кнопка "Yes" - устанавливаем двунаправленную зависимость
SetParamConstraint(rdE1, obj, EXPR, "obj.rdE"+iWPindx, TRUE);
} else {
// в противном случае - зависимость по диаметру будет однонаправленная
SetParamConstraint(rdE1, obj, EXPR, "obj.rdE"+iWPindx, FALSE);
};
// устанавливаем зависимость по толщине стенки
SetParamConstraint(rS1,obj,EXPR,"obj.rS"+iWPindx,TRUE);
//Зависимость успешно установлена
Handled = OBJ_HANDLED;
};
};
};
// проверка на то, что сохраненное значение объекта ненулевое
if (getObjData(getWorkId(0),obj)) {
// в случае неравенства диаметров и если диалог еще не появлялся, то
if (obj.B!=B && Answer==UnknownValue) {
// ответ определяется диалогом
Answer=MessageBox("Значения диаметра "+obj.B+" нет в таблице объекта. Ставить двунаправленную зависимость?", MB_YESNO, MB_ICONWARNING);
};
};
При попытке установить зависимость будет появляться сообщение.
При ответе «Да» диаметр трубы ГОСТ 8732 будет выравниваться по ближайшему доступному диаметру ГОСТ 8734.
При ответе «Нет» будет устанавливаться однонаправленная зависимость.
Решение. Вариант 2
Добавить в объект ГОСТ 8734–75 форму, определяющей поведение объектов при невозможной установке зависимостей.
Protected( seted, hid,Answer);
function OnConnect {
// проверка типа объекта к которому устанавливается зависимость
if ( (obj.strTheType=="Tube" && obj.strTheSubType=="Round") || obj.strTheType=="vaPipe" ) {
// находим индекс ближайшей плоскости WP1, WP2, WP3, WP4
iWPindx = findNearest(pntOrigin, obj.WP, 1, 4);
// если ближайшая плоскость была найдена, то
if ( iWPindx==1 || iWPindx==2 || iWPindx==3 || iWPindx==4 ) {
// устанавливаем зависимости:
// геометрическая зависимость вставки на ближайшую плоскость
SetGeomConstraint(INSERT, CONTRDIRECT, obj, WP1, obj.WP[iWPindx], 0, TRUE);
// присваиваем одинаковые значения для отображения обычный видразрез
// lSimpleView==2 - Разрез, lSimpleView==0 - Обычный вид
lSimpleView = obj.lSimpleView;
// не указывать вектор вставки
NoVectorSelect = 1;
// запоминаем ID объекта, к которому установлена зависимость
setWorkId(0, obj.objectID);
// если в диалоге была нажата кнопка "Yes" - устанавливаем
if (Answer=="IDYES") {
// двунаправленную зависимость
// нужно обратить внимание, что тип данных в поле Radiobutton - строка
SetParamConstraint(rdE1, obj, EXPR, "obj.rdE"+iWPindx, TRUE);
} else
// в противном случае - зависимость по диаметру будет однонаправленная
SetParamConstraint(rdE1, obj, EXPR, "obj.rdE"+iWPindx, FALSE);
// устанавливаем зависимость по толщине стенки
SetParamConstraint(rS1,obj,EXPR,"obj.rS"+iWPindx,TRUE);
// зависимость успешно установлена
Handled = OBJ_HANDLED;
};
};
};
// проверка на то, что сохраненное значение объекта ненулевое
if (getObjData(getWorkId(0), obj)) {
// в случае неравенства диаметров и если диалог еще не появлялся, то
if (obj.B!=B && Answer==UnknownValue) {
// ответ определяется диалогом-формой
ShowForm("Form1");
};
};
В этом случае, при попытке установить зависимость будет появляться диалог с вариантами: