Условие установки зависимостей

Задача

Создание сообщения для пользователя при невозможной установке зависимостей соединяемых объектов.

Пример

Соединение двух труб ГОСТ 8732–78 и ГОСТ 8734–75. Номенклатура типоразмеров у трубы ГОСТ 8732–78 больше, чем у 8734–75, поэтому при присоединении 8734–75 к 8732–78 диаметр труб может не совпасть. Если диаметр трубы ГОСТ 8732–78 составляет 325 мм, то при присоединении трубы ГОСТ 8734–75 будет выбран максимальный доступный диаметр – 250 мм, не равный диаметру исходной трубы по ГОСТ 8732–78.

Пример соединения труб разных диаметров
Пример соединения труб разных диаметров

Решение. Вариант 1

Чтобы известить пользователя можно воспользоваться функцией MessageBox. Для этого нужно открыть Мастером объектов объект «Труба ГОСТ 8734» и внести в скрипт следующие изменения:

1. Добавить защищённый параметр Answer
Protected(seted, hid, Answer);
2. Переключиться на функцию OnConnect
Список обработчика событий и выбор функции OnConnect
Список обработчика событий и выбор функции OnConnect
3. Преобразовать скрипт OnConnect к следующему виду
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;
    };
  };
};
4. Внести изменения в функцию OnChangeParameters
Список обработчика событий и выбор функции OnChangeParameters
Список обработчика событий и выбор функции OnChangeParameters
5. Добавить в скрипт OnChangeParameters следующие строки
// проверка на то, что сохраненное значение объекта ненулевое
if (getObjData(getWorkId(0),obj)) { 
  // в случае неравенства диаметров и если диалог еще не появлялся, то
  if (obj.B!=B && Answer==UnknownValue) { 
    // ответ определяется диалогом
    Answer=MessageBox("Значения диаметра "+obj.B+" нет в таблице объекта. Ставить двунаправленную зависимость?", MB_YESNO, MB_ICONWARNING);
  };
};
6. Сохранить объект

При попытке установить зависимость будет появляться сообщение.

  • При ответе «Да» диаметр трубы ГОСТ 8732 будет выравниваться по ближайшему доступному диаметру ГОСТ 8734.
  • При ответе «Нет» будет устанавливаться однонаправленная зависимость.

Решение. Вариант 2

Добавить в объект ГОСТ 8734–75 форму, определяющей поведение объектов при невозможной установке зависимостей.

Создание формы
Создание формы

1. Нарисовать элементы управления и задать свойства для поля диаметра трубы, диаметра исходной трубы и переключателей

2. Сохранить форму, задав для неё название и необходимый размер.

3. Внести в скрипт объекта следующие изменения.

ActHeader

Protected( seted, hid,Answer);

OnConnect

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

OnChangeParameters

// проверка на то, что сохраненное значение объекта ненулевое
if (getObjData(getWorkId(0), obj)) {
  // в случае неравенства диаметров и если диалог еще не появлялся, то
  if (obj.B!=B && Answer==UnknownValue) {
    // ответ определяется диалогом-формой
    ShowForm("Form1");
  };
};

4. Сохранить объект.

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

  • «Изменить диаметр у исходного объекта» устанавливает двунаправленную зависимость
  • «Оставить как есть» устанавливает однонаправленную зависимость
Диалог сообщения
Диалог сообщения

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

Газовые мини электростанции для коттеджей.. болванки оптом.