База знаний
Поиск
Обучающие примеры
- Экспликация помещений и инструмент «форма помещения»
- Работа с отметками уровней
- Создание пользовательского формата и штампа
- Масштаб символов СПДС GraphiCS
- Пример работы с инструментами СПДС GraphiCS: магнит, размеры, выноска
- Связь графических данных и табличных форм
- Условие установки зависимостей
- Связь универсального маркера и табличной формы
- Видимость элементов управления в форме
- Формирование ведомости рабочих чертежей
- Создание проекта и выбор техники в Стройплощадке
- Пример получения отчетов в Стройплощадке
- Универсальный маркер КМД
- Раздел справки пользовательской формы
Условие установки зависимостей
Задача
Создание сообщения для пользователя при невозможной установке зависимостей соединяемых объектов.
Пример
Соединение двух труб ГОСТ 8732–78 и ГОСТ 8734–75. Номенклатура типоразмеров у трубы ГОСТ 8732–78 больше, чем у 8734–75, поэтому при присоединении 8734–75 к 8732–78 диаметр труб может не совпасть. Если диаметр трубы ГОСТ 8732–78 составляет 325 мм, то при присоединении трубы ГОСТ 8734–75 будет выбран максимальный доступный диаметр – 250 мм, не равный диаметру исходной трубы по ГОСТ 8732–78.

Решение. Вариант 1
Чтобы известить пользователя можно воспользоваться функцией MessageBox. Для этого нужно открыть Мастером объектов объект «Труба ГОСТ 8734» и внести в скрипт следующие изменения:
1. Добавить защищённый параметр AnswerProtected(seted, hid, Answer);
2. Переключиться на функцию 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
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. Сохранить объект.
В этом случае, при попытке установить зависимость будет появляться диалог с вариантами:
- «Изменить диаметр у исходного объекта» устанавливает двунаправленную зависимость
- «Оставить как есть» устанавливает однонаправленную зависимость

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





