База знаний

Обучающие примеры

Читать новости в почте


Поиск

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

Задача

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

Пример

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

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

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

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