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

Задача

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

Пример

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

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

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

  • Добавить защищённый параметр Answer
Protected(seted, hid, Answer);
  • Переключиться на функцию OnConnect

  • Преобразовать скрипт 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;
		};
	};
};
  • Внести изменения в функцию OnChangeParameters

  • Добавить в скрипт OnChangeParameters следующие строки
// проверка на то, что сохраненное значение объекта ненулевое
if (getObjData(getWorkId(0),obj)) { 
	// в случае неравенства диаметров и если диалог еще не появлялся, то
	if (obj.B!=B && Answer==UnknownValue) { 
		// ответ определяется диалогом
		Answer=MessageBox("Значения диаметра "+obj.B+" нет в таблице объекта. Ставить двунаправленную зависимость?", MB_YESNO, MB_ICONWARNING);
	};
};
  • Сохранить объект

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

При ответе «Да» диаметр трубы ГОСТ 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. Сохранить объект.

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

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

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

Библиотека труб по ГОСТ 8732–78 

Библиотека труб по ГОСТ 8734–75