Jump to content

Простейшая автоматизация с помощью отчётов таблиц


Recommended Posts

  • 4 weeks later...

К вопросу о использовании комментариев внутри самой таблицы. 

Комментарии доступны в "Построителе выражений" после создания комментария и закрытия таблицы. 

После закрытия они появляются в  "Инспекторе" и появляются "Построителе выражений". 

image.png.dcb23404856ac6d5c666c6c363fe8041.png

 

 

Using cell comments in the same table.dwg

  • Like 2
Link to comment
Share on other sites

  • 3 weeks later...
В 16.11.2012 в 13:34, Artem_R сказал:

MCAD, а не планируется добавить в таблицы функции для работы со строками? Таблицы и так замечательные, а стали бы великолепные. :) Это увеличило бы возможности вот такой мелкой автоматизации.

 

Оказывается  до сих пор актуально:

для тех кто не читает справку

Добавлено в версии 20.1

 

image.png.7c81a02f86c4f092d5d52728e40a201e.png

 

 

в версии 21

 

image.png.1333db8f7f72cf372ce04b8019588fa6.png

________________

image.png.388bf63f2a37ca8f3b12dc5b54b19e4b.png

 

  • Like 2
  • Thanks 2
Link to comment
Share on other sites

  • 1 year later...

исходник

Фабула.

Прошедший год, кроме всего прочего, запомнился тем, что многие организации наконец-то закончили этап внедрения BIM (это не мои слова). Видимо, ожидаемо получилось так, что руководство этих организация стало привлекать опытных менеджеров к решению других задач. Ну, и как обычно, в конце года, неожиданно пришла пора выпуска документации. В частности, поднялся вопрос, пронумеровать листы комплекта или как быстро подсчитать количество форматов  по тому или иному разделу выполненному разными сотрудниками.

Все, представленное ниже, это просто пример. В частном случае блоки, атрибуты обозначения форматов будут отличаться от тех, которыми пользуется в других организациях. Но, надеюсь, что если у Вас возникнет желание, то адаптация под Ваши задачи не займёт много времени.

 

 

Подготовка шаблона таблицы.

Предварительно подготовим таблицу для более удобного использования в платформе nanocad.

Добавим  «Именованные ячейки» в качестве переменных.

H7 – 1-й Раздел

H8 – 2-й Раздел

H9 – 3-й Раздел

H10 – 4-й Раздел

H11 – 5-й Раздел

H12 – 6-й Раздел

В этих переменных мы будем хранить «Марку» раздела. Конечно, можно вводить эти значения непосредственно в выражение, но постараюсь показать наиболее гибкий вариант.

J7 – Договор

J8 - Разделитель

J9 - Предприятие

J10- Изделие

Формирование отчёта

Чертежи одной марки должны располагаться на одной линии (Object.OriginY);

1.       В данном примере «Форматы» фильтруются по слою MCAD_ФОРМАТЫ;

image001.png.360e2d7f85c1ee61bbb582b95189bac8.png

2.       В колонки  «B» и «C»  берём  значения =rnd(Object."Position Y"/100) и rnd(Object."Position X"))

3.       В колонке «С» заранее вводим =count()

4.       Теперь мы можем определить, сколько блоков находится в каждом ряду. Для этого открываем диалог «Группировать и объединять»

 image002.png.98621596799110123c33db1dca07df87.png

 

image003.png.4354bfa83788fd8fdbb02b309197085d.png

5.       Присвоение чертежам «Марки» происходит на основании индекса строки  в столбце “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»

image004.png.cebef9d89c9ea18cc294f92243a1a8cc.png

6.        Дальнейшее определение марки происходит в колонке «Q», в соответствии с индексом объедения по Object.OriginY и присвоению соответствующего значения переменных  This.‘’й-Раздел’’  в виде   «Именованная ячейка» как:

=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”, описанная выше;

7.       Теперь в колонке “H” мы можем сформировать обозначение

=This."Предприятие"+iff(This."Предприятие"=="";"";This."Разделитель")+This."Изделие"+"."+off(0;9)+" (Листы 1..."+off(0;-4)+")"

8.       Теперь, когда мы определили, сколько блоков находится в каждом ряду необходимо, пронумеровать их  по возрастанию параметра  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»

9.       Определяем порядковый номер страницы в комплекте документации в колонке «М»

=iff(This."Отображать номер страницы"==1;off(0;-12)+This."Начальный номер страницы"-1;"")

10.   Общее количество страниц начинается с переменной заданной на форме и вычисляется как: iff(This."Отображать номер страницы"==1;row+This."Начальный номер страницы"-1;"");

11.   Отображение на чертеже номеров страниц может быть отключено, переменной на форме This."Отображать номер страницы"; дополнительно в колонке «P» добавим проверку для

=iff(This."Отображать номер страницы"==TRUE;"Видим";"Скрыт"). Для отображения поля номера страницы.

12.   В колонки «I», «J», «K» берём атрибуты блока

=Object.NAME_OF_THE_BUILDING             

=Object.NAMEOFTTHECOMPLEX   

=Object.NAME_OF_IMAGES

 

image006.png.ecb8ffe251f0107a711cf0538bc87d93.png

Теперь, когда мы определили все необходимые атрибуты, осталось вернуть их значения в блок. В колонку «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"  

image007.png.7890695efca14347e00dcb92e6608ebd.png

 

13.   Вид фрагмента основной надписи в первом ряду.

image008.png.7483a94111ac12cd194a630be719a9d2.png

 

14.   Теперь  при изменении «Именованной ячейки» H7 (1-й Раздел) или при добавлении, например трёх форматов справа от указанного «Обозначение» пересчитается и  листы будут соответствовать нужным значениям

image009.png.b57f9426f315772e022e30a5251550fe.png

 

15.   Все форматы имеют разный размер, но нам нужно привести их к формату А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)

image010.png.51711f6fa61699529eaec2c3b4d408d5.png

 

Функция subLeft вернёт только обозначение формата, без кратности

image012.png.94b93b18b6df493f028b33ba9747c180.png

 

Для А3, нужно умножить это значение на 2, для А2 на 4, для А1 на 8 и для А0 на 16.

Теперь нужно проверить, если в Object.«Выбор» есть  «х»

image013.png.23f2d42a3aafbee06109e43888fb5f44.png

 

То взять 11-символ из Object.«Выбор» и использовать его в качестве множителя.

16.   Добавляем «Итог отчёта»

 

И в колонке:

  • «K» ="Всего листов: "+off(-2;-10)

«L»  ="Форматов кратно А4: "+"

      "+summ(section(-1))+" шт."

  • «N» =off(0;-2)

image016.jpg.855cbf7634fbe29da5d01e5d57066b02.jpg

 

Итог

 

Если вы дочитали до этого места то, наверное, уже поняли, что ничего сложного в этом алгоритме нет. Это не программирование как таковое. Вам не нужно ни определять типы данных, ни создавать сложные функции и процедуры. Ничего такого!!! Вам просто нужно мысленно представить каким путём вы достигаете поставленной задачи при обычном проектировании и последовательно реализовать этот алгоритм в виде отчёта.

Файл примера можно посмотреть тут

 

 

  • Thanks 2
Link to comment
Share on other sites

  • 2 weeks later...

Типовой вопрос:

Как значение одного объекта (например блока) учесть в разных колонках отчёта.

 

На чертеже размещены блоки, представляющие из себя «Перекрытия» определенной «Серии». Блоки обладают двумя параметрами «Выбора», «Марка» и «Этаж». Нам нужно подсчитать, сколько блоков, определенной «Марки» размещены по этажам. В примере условно рассмотрено пять этажей и «Подвал», но этот метод позволит Вам расширить возможности отчёта. При необходимости, конечно.

00:14 Открываем заготовку отчета и в меню «Разделы» выбираем «Вставить раздел отчета»

image001.png.3ad411743ac4c9956ba585610850da56.png

00:22 Нажимаем на «Выбрать исходные объекты» image002.png.47bdab18b1c7ba770cc8ee7f7ccd8f1d.png указываем, что нам нужны блоки и, в качестве дополнительного фильтра, задаем «Имя» - «плиты пустотные»

image003.png.8ddd08579a0af642d0baebebdd0e023d.png

00:36 Последовательно выбирая из контекстного меню , назначаем колонка свойства из атрибутов блока. Колонка «В» - Object."СЕРИЯ" , клонка «С» - Object."МАРКА". В колонке «J» - пишем count().

image004.png.fd0e4da411bfa508e9dd39bee45b9bf1.png

01:10 В «Итоге» отчёта вставляем из контекстного меню «Сумма» summ(section(-1))

 01:15 Нажимаем «Группировать и объединять».

 image005.png.e024534ffba432522d286dba29446e3d.png 

Перетаскиваем из левой части обозначение колонки «В» и назначаем «Объединять» и «Сортировать по возрастанию». Теперь все ячейки, с одинаковым обозначением «Серии» будут объединены.

01:25 Назначаем для колонки «С» группировку по «Марке». Теперь все строки, объединённые по серии, сгруппированы по «Марке». В колонке «J» автоматически подсчитывается общее количество блоков соответствующей «Марки».

image006.png.b6ce8f3682b14a20250b353d30d44560.png

01:36 Временно убираем «Группировку» по «С», чтобы более наглядно продемонстрировать алгоритм подсчёта.

01:40 В колонке «D» вставляем свойство блока (Выбор) «Этаж». В данном случае мы выбрали его из контекстного меню.

01:55 Открываем «Построитель выражений». В этой колонке нам нужно подсчитать, сколько блоков имеют параметр «Этаж» значение «Подвал». Пишем условие, ели значение равно «Подвал», то «1»,если иное значение, то «0» iff(Object."Этаж"=="Подвал";1;0)

image008.png.85ca33bd95ba39d4a7370e6a1440e7de.png

02:20 Возвращаем группировку по «С» и видим, что пока мы не получили нужный результат. В колонке появились только значения «0» и «1».

02:28. Снова заходим в «Построитель выражений» и суммируем все значение в сгруппированной строке отчёта. =sum(iff(Object."Этаж"=="Подвал";1;0))

image009.png.86c1d39016b447949891cc29dee73727.png

02:39 Повторяем данное условие для каждого этажа, редактируя значение аргумента Object."Этаж" в зависимости от текущей колонки.

03:30 В данной постановке задача уже решена. Мы имеем возможность подсчитать все «Плиты перекрытия» по этажам, но отображаются все колонки, хотя пока у нас нет «Плит перекрытия» для четвёртого и пятого этажа. Так как мы делаем «универсальный» отчёт, то желательно автоматически скрывать «нулевые» колонки.

03:32 Для этого в «Итоге» отчёта, суммируем значения внутри секции отчёта для колонки «D».

03:33 Открываем «Построитель выражений» и Задаём условие, что если «Итог» колонки равен «0», то и ширина колонки равна «0», иначе назначаем «8» мм. =ctlSetColumnWidth( iff(summ(section(-1))==0;0;8))

image010.png.9c162e51bd856b4a7c720b14968799d6.png

04:02 «Размножаем» данное выражение по колонкам «этажей». Так как ролик делался практически одним дублем и без последующей обработки, то прошу отнестись с пониманием, что иногда приходилось делать откаты ctrl+Z, но это никак не влияет на работу отчёта. 

 04:32 Теперь колонки с «нулевыми» значениями в «Итоге» отчёта имеют нулевую ширину.

04:45 теперь отчёт практически полностью готов. Но иногда проще и нагляднее, кроме обозначения «Марки», видеть на чертеже «Позицию» вместе длинным обозначением «Марки». Так как это «временный» атрибут, необходимы только в процессе работы и проверки чертежа, дадим проектировщику возможность удобного переключения для его отображения или скрытия.

04:45 Заходим в любую «Скрытую ячейку» и назначаем «Комментарий». В нашем случае это будет ячейка «О2» - «Show Pos»

image011.png.4558aed66a79e62b23d9161e130a9ac9.png

04:58 В ячейке «N» строки отчёта вводим условие, что если значение в «Комментированной ячейке» равно «1», То пишем «Поз.» + row если нет то «» (пустое значение). =iff(This."Show Pos"==1;"Поз. "+ row;"")

image012.png.47c5d2da5d0acfff96fd7d3cb59a1879.png

05:41 Теперь нам нужно передать это значение в атрибут блока Object.POSITION. ctlSetValue(off(0;-1);Object.POSITION) Заодно наступим на «грабли» и, получив по лбу при проверке работы отчёта, быстро исправим позже 06:35.

image013.png.de9e8b28bc1d0234f25d01eae0cc6391.png

06:18 Проверяем работу отчёта , меняя значение комментированной ячейки. Как мы видим, что у некоторых блоков не меняется значение атрибута POSITION.

06:35 Возвращаемся в редактор и добавляем, =sum(ctlSetValue(off(0;-1);Object.POSITION)) . Теперь значение должно передаваться во все блоки.

image.png.5dbb1b835743b35bfdaf6b4d3d71a493.png

07:13 Сохраняем таблицу в базу данных, создав, при необходимости, новую папку в нужном разделе.

07:32 Теперь этот отчёт можно использовать во всех чертежах, где при оформлении документации используются данные блоки «плиты пустотные»

  • Like 2
  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...