Фабула
Прошедший год, кроме всего прочего, запомнился тем, что многие организации наконец-то закончили этап внедрения BIM (это не мои слова). Видимо, ожидаемо получилось так, что руководство этих организация стало привлекать опытных менеджеров к решению других задач. Ну, и как обычно, в конце года, неожиданно пришла пора выпуска документации. В частности, поднялся вопрос, пронумеровать листы комплекта или как быстро подсчитать количество форматов по тому или иному разделу выполненному разными сотрудниками.
Все, представленное ниже, это просто пример. В частном случае блоки, атрибуты обозначения форматов будут отличаться от тех, которыми пользуется в других организациях. Но, надеюсь, что если у Вас возникнет желание, то адаптация под Ваши задачи не займёт много времени.
Пример реализации в СПДС GraphiCS и нано СПДС
Простой пример
Предварительно подготовим таблицу для более удобного использования в платформе nanocad.
Добавим «Именованные ячейки» в качестве переменных.
H7 – 1-й Раздел
H8 – 2-й Раздел
H9 – 3-й Раздел
H10 – 4-й Раздел
H11 – 5-й Раздел
H12 – 6-й Раздел
В этих переменных мы будем хранить «Марку» раздела. Конечно, можно вводить эти значения непосредственно в выражение, но постараюсь показать наиболее гибкий вариант.
J7 – Договор
J8 - Разделитель
J9 - Предприятие
J10- Изделие
Чертежи одной марки должны располагаться на одной линии (Object.OriginY);
В данном примере «Форматы» фильтруются по слою;
В колонки «B» и «C» берём значения =rnd(Object."Position Y"/100) и rnd(Object."Position X"))
В колонке «С» заранее вводим =count()
Теперь мы можем определить, сколько блоков находится в каждом ряду. Для этого открываем диалог «Группировать и объединять»
Присвоение чертежам «Марки» происходит на основании индекса строки в столбце “G” как: =iff(off(0;-6)==1;1;iff(off(-1;-5)==off(0;-5);off(-1;0);off(-1;0)+1)) где off(0;-5) объединённая колонка по значению Object."Position Y". Добавляем объединение по «G»
Дальнейшее определение марки происходит в колонке «Q», в соответствии с индексом объедения по Object.OriginY и присвоению соответствующего значения переменных This.‘’[i]й-Раздел’’ заданных в виде «Именованная ячейка» как:
=Select(
off(0;-10)==1;This."1-й Раздел";
off(0;-10)==2;This."2-й Раздел";
off(0;-10)==3;This."3-й Раздел";
off(0;-10)==4;This."4-й Раздел";
off(0;-10)==5;This."5-й Раздел";
off(0;-10)==6;This."6-й Раздел";
TRUE;"Нет раздела")
Тут off(0;-10) – колонка “G”, описанная выше;
Теперь в колонке “H” мы можем сформировать обозначение
=This."Предприятие"+iff(This."Предприятие"=="";"";This."Разделитель")+This."Изделие"+"."+off(0;9)+" (Листы 1..."+off(0;-4)+")"
Теперь, когда мы определили сколько блоков находится в каждом ряду необходимо, пронумеровать их по возрастанию параметра Object."Position X". Для этого в колонку «F» вводим выражение: =iff(off(0;-5)==1;1;iff(off(-1;-4)!=off(0;-4);1;off(-1;0)+1)). Это значит, на самом деле, очень простое действие. Если (iff) ячейка, которая находится (off) в той же строке (0) , на пять колонок влево (-5) равна «1», то пишем «1». Дальше проверяем, если координата «Y » не равна выше стоящей ячейке off(-1;-4)!=off(0;-4) , то ставим «1», если равна, то берём значение верхней ячейки off(-1;0) и прибавляем «1»
Определяем порядковый номер страницы в комплекте документации в колонке «М»
=iff(This."Отображать номер страницы"==1;off(0;-12)+This."Начальный номер страницы"-1;"")
Общее количество страниц начинается с переменной заданной на форме и вычисляется как:
iff(This."Отображать номер страницы"==1;row+This."Начальный номер страницы"-1;"");
Отображение на чертеже номеров страниц может быть отключено, переменной на форме This."Отображать номер страницы"; дополнительно в колонке «P» добавим проверку для
=iff(This."Отображать номер страницы"==TRUE;"Видим";"Скрыт"). Для отображения поля номера страницы.
В колонки «I», «J», «K» берём атрибуты блока
=Object.NAME_OF_THE_BUILDING
=Object.NAMEOFTTHECOMPLEX
=Object.NAME_OF_IMAGES
Теперь, когда мы определили все необходимые атрибуты, осталось вернуть их значения в блок. В колонку «P»:
=ctlSetValue(off(0;1);Object.SHEET_NUMBER)+ctlSetValue(off(0;-1);Object.SHEET_COUNT)+ctlsetValue(off(0;10);Object.DESIGNATION)+ctlsetValue(off(0;11);Object."Выбор1")+ctlSetValue(off(0;8);Object.N_SHEET)+"ctlSetValue"
Вид фрагмента основной надписи в первом ряду.
Теперь при изменении «Именованной ячейки» H7 (1-й Раздел) или при добавлении, например трёх форматов справа от указанного «Обозначение» пересчитается и листы будут соответствовать нужным значениям
Все форматы имеют разный размер, но нам нужно привести их к формату А4. В колонке отчёта «L» вводим:
=Select(
subLeft(Object."Выбор";9)=="Формат А4";1*iff(subString(Object."Выбор"+" ";10;1)=="x";subString(Object."Выбор";11;1);1);
subLeft(Object."Выбор";9)=="Формат А3";2*iff(subString(Object."Выбор"+" ";10;1)=="x";subString(Object."Выбор";11;1);1);
subLeft(Object."Выбор";9)=="Формат А2";4*iff(subString(Object."Выбор"+" ";10;1)=="x";subString(Object."Выбор";11;1);1);
subLeft(Object."Выбор";9)=="Формат А1";8*iff(subString(Object."Выбор"+" ";10;1)=="x";subString(Object."Выбор";11;1);1);
subLeft(Object."Выбор";9)=="Формат А0";16*iff(subString(Object."Выбор"+" ";10;1)=="x";subString(Object."Выбор";11;1);1);
TRUE;0)
Функция вернёт только обозначение формата, без кратности
Для А3, нужно умножить это значение на 2, для А2 на 4, для А1 на 8 и для А0 на 16.
Теперь нужно проверить, если в Object.«Выбор» есть «х»
То взять 11-символ из Object.«Выбор» и использовать его в качестве множителя.
subString(Object."Выбор";11;1)
Добавляем «Итог отчета»
И в колонке:
- «K» ="Всего листов: "+off(-2;-10)
- «L» ="Форматов кратно А4: "+"
"+summ(section(-1))+" шт."
- «N» =off(0;-2)
Файл с примером тут
Итог
Если вы дочитали до этого места то, наверное, уже поняли, что ничего сложного в этом алгоритме нет. Это не программирование как таковое. Вам не нужно ни определять типы данных, ни создавать сложные функции и процедуры. Ничего такого!!! Вам просто нужно мысленно представить каким путём вы достигаете поставленной задачи при обычном проектировании и последовательно реализовать этот алгоритм в виде отчёта.