...

суббота, 21 января 2017 г.

Мейнтейнеры не масштабируются

Карточная игра на JavaScript и Canvas, или персональный Лас-Вегас. Часть 1

Однажды на досуге я придумал карточную игру и, недолго думая, создал ее электронную версию. А потом добавил еще четыре игры, включая покер Техасский Холдем. А чтобы было еще интереснее, я встроил некое подобие прогресса: выигрываешь в одной игре – открывается новая. Запланировал я разместить свою игру в двух социальных сетях и в магазине Windows Store как html5-js приложение. А также, возможно, создать еще сборки под Android и iOs. Можно играть чрез сервер с другими людьми, а можно – офф-лайн с ИИ.

Для работы я, как всегда, не использовал никакие сторонние движки и библиотеки, даже jQuery мне не понадобилось. Только функции ванильного JavaScript, включая средства работы с холстом (canvas). Холст в игре – основа для вывода всей игровой графики. В WebGL, на этот раз, не было необходимости, поэтому зоопарк поддерживаемых браузеров расширился. Средой программирования, как обычно, стал продвинутый блокнот. Игра получилась объемом 3,8 Мб, из которых 3 Мб — это семь карт спрайтов в формате png. Запускается игра по html-файлу. Сервер на PHP. В случае выбора однопользовательской игры (то есть, с ИИ), запросы к серверу не отправляются и все расчеты ведутся на клиенте. Диздок не писал – он не нужен хипстерам.

Далее – занимательная геометрия и программирование, а во второй части будет рассказ о размещении игры в социальных сетях и в магазине.

GUI


Написание кода графической части не отняло у меня слишком много времени, так как для своих предыдущих игр я уже разработал движок меню на JavaScript на теге canvas с подгрузкой спрайтов из форматов jpg и png, или, иначе говоря, GUI. Достаточно было лишь взять тот код и определить в качестве экранных кнопок при помощи ассоциативного массива все активные области, то есть, карты и кнопки меню. Ну и еще набросать сами спрайты, то есть, создать дизайн. Основное время ушло, собственно, на описание игровой логики всех пяти игр. И чуть позже – на создание многопользовательской версии под две социальные сети и магазин Windows.

Впрочем, я немного слукавил насчет того, что мое canvas-меню так уж прямо полностью готово. Его нельзя просто так взять и… В общем, оно (говнокод) далеко от совершенства и весьма ограничено в своих возможностях. Но главное, мне захотелось, чтобы карты не лежали скучной прямой линией, а выкладывались бы веселым веером, независимо от их количества. Однако, мое меню не поддерживало поворот «кнопок». Поэтому настало время запрограммировать это безобразие раз и навсегда. Для начала.

Добро пожаловать в Вегас


Я решил, что изгиб будет задаваться неким параметром d, который обозначает, насколько центр линии карт выдвигается вверх.

Итак, дано: количество карт (n), ширина прямоугольника (w), ограниченного центрами крайних, скучных, «неизогнутых» карт, и смещение середины линейки карт вверх (d), придающее им веселья. Требуется найти точки центров и углы поворота каждой карты так, чтобы получился веер, как на картинке. Сложно сказать, насколько хорош мой метод, но это то, что мне удалось вспомнить из геометрии. Писать будем на JavaScript.

var L=0, h=0, dx=0, hx=0, hy=0;
//Находим неизвестные стороны треугольника (1..3..n), вокруг которого будет описана окружность
//Обозначим переменной a равные стороны 1..3 и 3..n
var a = Math.sqrt ( d*d+(w*w/4) );
//Найдем радиус R описанной окружности по формуле
var p = 0.5*(a+w+a);
var R = a*w*a / ( 4*Math.sqrt( p*(p-a)*(p-w)*(p-a) ) );
//Угол L0 для отклонения первой и последней карт от горизонтальной оси будет равен
var L0 = Math.asin( 1 - (d/R) );
//Угол dL, на который будут отступать карты друг от друга по окружности
var dL = ( Math.PI-(2*L0) ) / (n-1);
//Переберем в цикле все карты
for (var i=0; i<n; i++) {
    //Найдем общий угол отклонения для карты от горизонтальной оси координат
    L = L0 + (dL*i) + rot;
    //Здесь rot – еще один входной параметр, который задает общий угол наклона всего веера, если нам захочется, чтобы линия w располагалась под углом
    //Найдем отступы по вертикальной и горизонтальной осям для каждой карты, из которых и можно вывести координаты центров каждой карты
    hx = -R*Math.cos(L) - R*Math.sin(rot);
    hy = d + R*Math.sin(L) - R*Math.cos(rot);
    //Запоминая эти параметры в массиве, получим все координаты и углы
};

Вегас уже где-то близко.

Код для отображения всех спрайтов на холсте по сформированному массиву точек и углов тривиален и использует только стандартные функции работы с canvas. Схема простая: нужно сохранить состояние canvas, переместиться туда, где будет находиться центр спрайта, повернуть canvas на требуемый угол, отобразить спрайт, а затем восстановить состояние canvas. Кстати, половинную ширину (w2) и высоту (h2) спрайта не обязательно вычислять каждый раз, их можно предопределить. В общем, примерно так:

var w2 = Math.floor(spriteW/2), h2 = Math.floor(spriteH/2);
var x = spriteX+w2, y = spriteY+h2;
ctx.save();
ctx.translate(x, y);
ctx.rotate(spriteL - Math.PI/2);
ctx.drawImage(spriteMapImage,   spriteMapX, spriteMapY, spriteW, spriteH,   -w2, -h2, spriteW, spriteH);
ctx.restore();

Ура! Теперь карты вкладываются веером, ну прямо, как в Вегасе – в кино видел. Недостаток или, точнее, недоработка пока заключается в том, что, хотя спрайты карт-кнопок теперь и располагаются под углом, но кликабельные области все равно остаются не повернутыми, пусть даже при этом правильно смещенными. То есть, у них cо спрайтами совпадают только центры. Однако, для данной игры этого вполне достаточно. Угол отклонения карт будет довольно мал, и вряд ли случайно кликнешь по соседней карте. Здесь, если и будут подобные круги из карт, как на этой картинке, то не кликабельные, а просто для эффекта. Для карт игроков будут изгибы гораздо меньше.

Всегда есть, к чему стремиться. Можно в обработчике указателя мыши для проверки вхождения в область клика считать синусы и косинусы, чтобы точнее позиционироваться по наклоненной кнопке. Либо можно поворачивать canvas при движении мыши. Но все это будет, как мне показалось, сильно и необоснованно нагружать процессор. Ведь, нужно будет при каждом движении мыши перебирать синусы-косинусы всех «экранных кнопок», чтобы определять вхождение указателя в какую-либо область клика. Можно, конечно, отрабатывать углы только при событии клика, но тогда не будет такого красивого изменения вида указателя при вхождении и выходе из кликабельной области. Я еще подумаю над тем, как можно решить данную задачу. А пока двигаемся дальше.

AI


Прочитав данный подзаголовок, можно было подумать, что вот он, наконец-то, изобретен искусственный интеллект. Свершилось то, к чему так долго стремились все светлые умы цивилизации. Однако, разочарую. В данном случае под пафосной аббревиатурой AI скрывается обычный генератор случайных чисел. Ладно, шучу, не совсем обычный. Минимальная логика у нашего игрового ИИ (Иван Иваныча) все же есть. Иван Иваныч – серьезный мужик. Логика будет еще дополняться, но даже сейчас Иван Иваныч частенько обыгрывает меня, например, в мою же игру, наглец. В покер так я вообще почти всегда проигрываю. Но, возможно, я не умею в него играть. А вы говорите, искусственного интеллекта не существует. Нет, он явно что-то замышляет… Я опасаюсь, как бы случайно не создать Sky-Net.

Анимация карт


Сделаем из игры конфетку. Без анимации карт все работает как-то резко и некрасиво. Добавим еще один графический слой (читай – прозрачный холст, canvas) поверх основного и будем на нем устраивать «заезды» карт между колодой и столом, столом и игроками, колодой и игроками. С вращением, песнями и плясками. Карта, которую требуется анимировать, будет просто выноситься на внешний холст и там уже беспрепятственно двигаться, не опасаясь оказаться слоном в посудной лавке, чтобы случайно не стереть собой соседей и фон. А в конце пути она будет падать обратно на нижний холст и далее вести себя прилично. Анимацию можно и отключить через игровое меню, если она не нужна. Обработчики кликов, кстати, повесим сразу на внешний холст.

Движение карты по холсту будем задавать следующими входными параметрами: скоростью V и точками, начальной (X0;Y0) и конечной (X,Y). При движении будем отрисовывать спрайт в позиции, в которой он должен оказаться по истечении времени ti, прошедшего с момента начала движения. И предварительно, конечно же, стирать спрайт со старой позиции. Вызывать следующую отрисовку будем сразу после того, как завершится предыдущая. Таким образом, обеспечим настолько плавное движение, насколько это позволит устройство, на котором будет выполняться код. А привязка ко времени сделает движение в целом равномерным, независимо от возможных кратковременных тормозов браузера. Принцип расчета такой:

В начале функции вызова движения определим некоторые параметры для движения

//Запомним начальное время
var t0 = Date.now() / 100;
//Полные перемещения по горизонтальной и вертикальной осям
var Sx = X - X0;
var Sy = Y - Y0;
//Общее расстояние находим по формуле
var S = Math.sqrt (Sx*Sx + Sy*Sy);
//Время, прошедшее с момента начала движения (ti), относится к общему времени движения (t), как относятся соответствующие расстояния по оси, например, x, то есть, ti / t = dxi / Sx. Из этого следует, что приращение координаты для горизонтальной оси dxi = Sx * ti / t, или dxi = Sx * ti * V / S. Скорость задается как параметр движения, а расстояния мы уже вычислили. Аналогично – для вертикальной оси.
//Выведем для этой анимации некие константы-коэффициенты, которые следуют из формулы выше и которые будут использоваться для расчета горизонтальной и вертикальной координат в цикле, чтобы не вычислять эти значения при каждой итерации. То есть, пока возьмем без времени ti
var constX = V * Sx / S;
var constY = V * Sy / S;

А в цикле движения будем каждый раз рассчитывать координаты уже по времени
//Время, прошедшее с начала движения, равно
var ti = Date.now()/100 - t0;
//Текущие координаты (Xi;Yi) в зависимости от этого времени
var Xi = constX * ti + X0;
var Yi = constY * ti + Y0;


И, наконец, эти координаты будем проверять на принадлежность к отрезку движения. То есть, Xi должно лежать между X0 и X, а Yi – между Y0 и Y. Пока выполняется данное условие, отрисовываем спрайт в (Xi;Yi) и зацикливаем функцию движения. Далее код, думаю, понятен, и нет смысла его подробно расписывать. Весь принцип я объяснил.

Теперь касательно угла поворота спрайта (ai). Если заданные в качестве входных параметров начальный угол (a0) и конечный угол (a) различаются, то в функции движения вычисляем текущий угол ai следующим образом. Приращение угла, то есть, (ai) относится к приращению пути, например, по горизонтальной оси ( которое у нас равно (Xi — X0) ), как общий угол поворота (a — a0) относится к общему пути по горизонтальной оси (Sx), то есть:
ai / (Xi — X0) = (a-a0) / Sx

//И туда, где мы рассчитываем текущие координаты спрайта в цикле, добавим также расчет также текущего угла поворота, не забывая прибавить начальный угол (a).
var ai = (a-a0) * Math.abs (Xi - X0) / Math.abs(Sx) + a;
//Можно вынести за скобки цикла постоянную величину (a-a0) / Math.abs(Sx);


Отрисовываем спрайт стандартным drawImage с предварительным поворотом холста при помощи стандартных же функций JS translate и rotate, здесь, думаю, все понятно.

Да, этот алгоритм не учитывает некоторые частные случаи. Когда, например, расстояние равно 0, то возникает ошибка деления на 0. Но мы не будем задавать картам нулевое движение, зачем бы нам это? Поэтому и делать проверку на такие крайности в данном случае излишне.

Игры


Игры в комплекте следующие. «Три мешка» — моя авторская игра. «Подкидной дурак», «Покер Техасский Холдем». Это те, что открыты изначально. Теперь закрытые: «Чешский дурак» и «Три палки». Открываются они, если выиграть достаточное количество монет: для открытия первой закрытой игры у игрока должно быть 700 монет, второй – 900 монет. Изначально игроку дается 650 монет. Если же проигрывать, то игры, наоборот, будут закрываться вплоть до самой первой. Монеты можно выиграть у других игроков в открытых играх или приобрести. В однопользовательской версии монеты убраны совсем, а доступны только три игры из пяти.

Отдельно про покер


Я раньше никогда не играл в покер, но слышал, что это популярная игра и по ней даже проводят мировые турниры. Я посмотрел один такой, а также пару фильмов про карточных шулеров. Как когда я делал «Морской бой», я смотрел сериал про пиратов. Новичку сложно запомнить все покерные комбинации, а тем более, по ходу игры сразу представлять все возможные варианты. Поэтому я добавил экран, который можно вызвать во время своего хода и посмотреть все возможные на данный момент для себя комбинации. И уже в зависимости от этого сделать тот или иной ход. Этот алгоритм использует и Иван Иваныч (Искусственный Интеллект) для оценки своих шансов, поэтому писать данную функцию в любом случае пришлось бы. Вот, как в итоге это выглядит. Яркие карты – это те, которые есть на столе и на руках. Затемненные – это те, которых пока нет, но они еще могут прийти из колоды. А, если все 5 карт перевернуты, то данная комбинация уже невозможна ни при каких условиях. Зеленой точкой помечаются собранные комбинации: чем ближе к номеру один, тем, соответственно, лучше.

Для покера я просто, ради прикола, также предусмотрел такой вариант, когда в игре участвует только ИИ, без людей. Получилось что-то вроде экранной заставки, где компьютер сам с собой бесконечно играет в покер.

Дизайн


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

Английский язык


Опыт локализации предыдущих игр подсказывал мне, насколько муторно потом выдергивать из скриптов все кириллические строки и заменять их ссылками. Поэтому я добавлял их в языковой файл прямо по ходу, а в скрипты основной программы вставлял сразу ссылки (с комментариями). Cначала я заполнял только русскоязычный файл, а затем сделал копию и перевел его на английский. Языковой файл подключается динамически, в зависимости от выбранного языка, и представляет собой массив строк с определенным именем. Как обычно, простой скрипт:
var el=document.createElement("script"); el.type="text/javascript";
el.src="lng/lng_"+lng+".js"; el.async=true;
document.getElementsByTagName("head")[0].appendChild(el);


Здесь переменная lng ранее читается из параметров командной строки. Функция применения языка запускается по готовности html-документа. А во всех функциях, где присутствуют текстовые строки, уже заданы ссылки на элементы массива языкового файла с фразами. В верстке самой html-страницы никаких фраз нет, ведь, по сути, документ представляет собой просто два канваса (canvas), наложенные один на другой, да пустой блочный элемент для вывода правил игры. Правила также располагаются в «языковом» файле.

Те фразы, которые были «захардкорены» в изображениях – например, подписи на кнопках, вынесены в отдельные изображения в формате png, соответственно, для русского и английского языков. А фоны – например, сам игровой стол, подложи для меню и прочие спрайты без надписей, располагаются в общем файле.

Вот пример русскоязычной локализации и общего для русского и английского языков фона (в уменьшенном виде):


«Русскоязычная» карта спрайтов

Общая карта спрайтов (фонов) для всех языков

Подложки для главного меню слишком большие, поэтому они располагаются еще в одном, дополнительном файле. Они также общие для всех языков, а «кнопки» для них уже включены в обе «языковые» карты.

Звуки


Звуки для игры были частично сгенерированы при помощи программы-синтезатора, частично взяты из бесплатных ассетов и подключены тегом audio. Здесь рассказывать особо не о чем. Был только один неприятный момент, связанный с тем, что если не закончилось воспроизведение текущего звука, то новый звук пропускается и не воспроизводится совсем. Поэтому пришлось сокращать звуки, чтобы они не «перекрывали» друг друга в некоторых ситуациях.

Промежуточный итог


В следующей статье расскажу об опыте размещения универсального Windows-приложения в магазине Windows Store, о создании классического (десктопного) приложения под Windows из html-js файлов, а также о многопользовательской версии для социальных сетей ВКонтакте и Фейсбук. На данный момент игра доступна пока только в Windows Store в виде однопользовательского UWP-приложения x86 и x64 под Windows 8.1 – 10. Планирую также сделать сборки под Android и iOs. А также, возможно, выложить просто zip-архив для запуска однопользовательской версии игры по index.html для всех операционных систем.

Вообще, архив с html-js файлами мне кажется самым оптимальным вариантом для распространения подобных приложений, так как нет необходимости что-то собирать при помощи «тяжелых» средств разработки, нет необходимости создавать инсталлятор, нет необходимости включать в сборку какие-либо библиотеки, html можно открыть в любой ОС при помощи любого бразузера на выбор и использовать тот, в каком приложение будет работать лучше всего. Жаль, что магазины приложений не позволяют распространять приложения таким способом, а операционные системы не устанавливают и не создают ярлыки для html, как, например, это делают с исполняемыми файлами. Разве что, Windows 8.1 – 10 как-то движется в этом направлении, собранный пакет для распространения под них занимает всего 4,4 Мб. Производители браузеров могли бы тоже повернуться лицом к html-js приложениям и предусмотреть какой-нибудь режим запуска без показа интерфейса браузера, как это делается, например, в node-webkit, когда используется браузерный движок. Тогда бы не пришлось, например, в сборку «классического» приложения включать движок и «тащить» этот движок с каждым таким приложением. Ведь, потенциал у веб-приложений есть: доступна 3D графика WebGL, байт-код и скоро, возможно, браузерный код еще больше приблизится по скорости к нативному. Но обо всем этом – в следующей части. А пока я пишу сервер.

Комментарии (0)

    Let's block ads! (Why?)

    [Перевод] Чистый javascript.Объекты и структуры данных. Асинхронность. Обработка ошибок

    Перевод книги Райана Макдермота clean-code-javascript

    Оглавление:






    Объекты и структуры данных


    Используйте геттеры и сеттеры


    В javascript отсутствуют ключевые слова private и public, что усложняет реализацию классов. Лучше использовать геттеры и сеттеры для доступа к свойствам объекта, чем напрямую к ним обращаться. Вы спросите «Зачем?». Вот несколько причин:
    • Если вы хотите реализовать дольше чем просто доступ к свойству, вам надо будет поменять реализацию в одном месте, а не по всему коду.
    • Валидацию легко реализовать на уровне реализации сеттера
    • Инкапсуляция внутреннего состояния объекта
    • Легко добавить логирование и обработку ошибок на уровне геттеров и сеттеров
    • Наследуя этот класс, вы можете переопределить функциональность по умолчанию
    • Вы можете лениво подгружать свойства вашего объекта, например, с сервера.

    Плохо:
    class BankAccount {
      constructor() {
        this.balance = 1000;
      }
    }
    
    const bankAccount = new BankAccount();
    
    // Покупаем, например, обувь...
    bankAccount.balance -= 100;
    
    

    Хорошо:
    class BankAccount {
      constructor(balance = 1000) {
        this._balance = balance;
      }
    
      set balance(amount) {
        if (verifyIfAmountCanBeSetted(amount)) {
          this._balance = amount;
        }
      }
    
      get balance() {
        return this._balance;
      }
    
      verifyIfAmountCanBeSetted(val) {
        // ...
      }
    }
    
    const bankAccount = new BankAccount();
    
    // Покупаем, например, обувь...
    bankAccount.balance -= shoesPrice;
    
    // получаем баланс
    let balance = bankAccount.balance;
    
    

    Реализуйте приватные свойства ваших объектов


    Это возможно с помощью замыканий.
    Плохо:
    const Employee = function(name) {
      this.name = name;
    };
    
    Employee.prototype.getName = function getName() {
      return this.name;
    };
    
    const employee = new Employee('John Doe');
    console.log(`Employee name: ${employee.getName()}`); 
    // Employee name: John Doe
    delete employee.name;
    console.log(`Employee name: ${employee.getName()}`); 
    // Employee name: undefined
    
    

    Хорошо:
    const Employee = function (name) {
      this.getName = function getName() {
        return name;
      };
    };
    
    const employee = new Employee('John Doe');
    console.log(`Employee name: ${employee.getName()}`); 
    // Employee name: John Doe
    delete employee.name;
    console.log(`Employee name: ${employee.getName()}`);
     // Employee name: John Doe
    
    


    Асинхронность


    Используйте промисы вместо колбеков


    Колбеки приводят к чрезмерной вложенности и плохой читаемости кода.
    Плохо:
    require('request').get('http://ift.tt/1sghLaB', (requestErr, response) => {
      if (requestErr) {
        console.error(requestErr);
      } else {
        require('fs').writeFile('article.html', response.body, (writeErr) => {
          if (writeErr) {
            console.error(writeErr);
          } else {
            console.log('File written');
          }
        });
      }
    });
    
    

    Хорошо:
    require('request-promise').get('http://ift.tt/1sghLaB')
      .then((response) => {
        return require('fs-promise').writeFile('article.html', response);
      })
      .then(() => {
        console.log('File written');
      })
      .catch((err) => {
        console.error(err);
      });
    
    

    Async/Await делает код чище, чем промисы


    Промисы очень хорошая альтернатива колбекам, но в ES2017 / ES8 спецификации появился аsync/аwait, который предлагает ещё лучше решение. Все, что вам нужно, это написать функцию с префиксом async, внутри которой вы можете писать вашу асинхронную логику императивно. аsync/аwait можно использовать прямо сейчас при помощи babel.
    Плохо:
    require('request-promise').get('http://ift.tt/1sghLaB')
      .then((response) => {
        return require('fs-promise').writeFile('article.html', response);
      })
      .then(() => {
        console.log('File written');
      })
      .catch((err) => {
        console.error(err);
      });
    
    

    Хорошо:
    async function getCleanCodeArticle() {
      try {
        const response = await require('request-promise').get('http://ift.tt/1sghLaB');
        await require('fs-promise').writeFile('article.html', response);
        console.log('File written');
      } catch(err) {
        console.error(err);
      }
    }
    
    


    Обработка ошибок


    Бросать ошибки хорошее решение! Это означает, что во время выполнения вы будете знать если что-то пошло не так. Вы сможете остановить выполнение вашего приложение в нужный момент и видеть место ошибки с помощью стек трейса в консоли

    Не игнорируйте отловленные ошибки


    Ничего не делая с пойманной ошибкой вы теряете возможность исправить ошибку или отреагировать на неё когда-либо. Вывод ошибки в консоль(console.log(error)) не дает лучшего результата, потому-что ошибка может потеряться среди выводимых записей в консоль. Если вы заворачиваете кусок кода в try / catch, значит вы предполагаете возникновение ошибки. В таком случае вы должны иметь запасной план на этот случай.
    Плохо:
    try {
      functionThatMightThrow();
    } catch (error) {
      console.log(error);
    }
    
    

    Хорошо:
    try {
      functionThatMightThrow();
    } catch (error) {
      // Один из вариантов (более заметный, чем console.log):
      console.error(error);
      // Другой вариант, известить пользователя про ошибку:
      notifyUserOfError(error);
      // И еще вариант, отправить ошибку на сервер :
      reportErrorToService(error);
      // Или используйте  все три варианта!
    }
    
    

    Не игнорируйте ошибки возникшие в промисах


    Вы не должны игнорировать ошибки возникшие в промисе по той же причине что отловленные ошибки в try / catch.
    Плохо:
    getdata()
    .then((data) => {
      functionThatMightThrow(data);
    })
    .catch((error) => {
      console.log(error);
    });
    
    

    Хорошо:
    getdata()
    .then((data) => {
      functionThatMightThrow(data);
    })
    .catch((error) => {
      // Один из вариантов (более заметный, чем console.log):
      console.error(error);
      // Другой вариант, известить пользователя про ошибку:
      notifyUserOfError(error);
      // И еще вариант, отправить ошибку на сервер :
      reportErrorToService(error);
      // Или используйте  все три варианта!
    });
    
    

    Комментарии (0)

      Let's block ads! (Why?)

      [Из песочницы] Пишем универсальный UICollectionViewLayout

      UICollectionView может иметь практически любое расположение элементов. Элементы могут иметь как фиксированные размеры, так и динамические. В данной публикации внимание будет уделено только тем UICollectionViewLayout, размеры элементов которых фиксированы и задаются определенным алгоритмом (типичный пример — расположение иконок на экране Home вашего iPhone). Так же будет сделана попытка описать подход к формированию единого UICollectionViewLayout.

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

      image


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

      Если внимательно посмотреть на предыдущий пример, то можно заметить, что внутри шаблона встречаются такие блоки элементов, которые повторяются несколько раз за шаблон. Принимая во внимание возможность повторения блоков внутри шаблона логичным шагом будет разбиение шаблона на массив блоков.

      image

      Сложив все идеи вместе и описав все участвующие в формировании шаблона вещи протоколами, получилось примерно следующее:
      Протоколы (swift код)
      public protocol SquareMosaicBlock {
          
          // количество CGRect в блоке
          func frames() -> Int
          // массив [CGRect] для определенной ширины коллекции и смещения относительно начала
          func frames(origin: CGFloat, width: CGFloat) -> [CGRect]
      }
      
      public protocol SquareMosaicPattern {
          
          // массив блоков
          var blocks: [SquareMosaicBlock] { get }
      }
      
      public protocol SquareMosaicLayoutDataSource: class {
          
          func pattern() -> SquareMosaicPattern
      }
      


      — Достаточно ли протоколов SquareMosaicPattern, SquareMosaicBlock для описания любого расположения элементов?
      — Расположение элементов коллекции на изображении выше основано только на этих двух протоколах. Поэтому, скорее всего, любое расположение можно описать лишь этими протоколами"

      Приводить пример реализации самого UICollectionViewLayout, использующего данные протоколы, и делать его детальный обзор не входит в планы на данную публикацию. Любой желающий сможет самостоятельно проанализировать подход и реализацию, перейдя в репозиторий (вся логика описана всего лишь на ~100 строчках кода). Так же там можно найти пример использования.

      Однако, привести пример формирования объектов, соответствующих протоколам шаблона и блока непременно следует. Для наглядности будут описаны расположения элементов для коллекции, которая изображена на картинках.

      Объекты, соответствующие протоколам (swift код)
      struct SnakeSquareMosaicPattern: SquareMosaicPattern {
          
          var blocks: [SquareMosaicBlock] {
              return [
                  OneTwoSquareMosaicBlock(),
                  ThreeRightSquareMosaicBlock(),
                  TwoOneSquareMosaicBlock(),
                  ThreeRightSquareMosaicBlock()
              ]
          }
      }
      
      public struct OneTwoSquareMosaicBlock: SquareMosaicBlock {
          
          public func frames() -> Int {
              return 3
          }
          
          public func frames(origin: CGFloat, width: CGFloat) -> [CGRect] {
              let sideMin = width / 3.0
              let sideMax = width - sideMin
              var frames = [CGRect]()
              frames.append(CGRect(x: 0, y: origin, width: sideMax, height: sideMax))
              frames.append(CGRect(x: sideMax, y: origin, width: sideMin, height: sideMin))
              frames.append(CGRect(x: sideMax, y: origin + sideMax - sideMin, width: sideMin, height: sideMin))
              return frames
          }
      }
      
      public struct TwoOneSquareMosaicBlock: SquareMosaicBlock {
          
          public func frames() -> Int {
              return 3
          }
          
          public func frames(origin: CGFloat, width: CGFloat) -> [CGRect] {
              let sideMin = width / 3.0
              let sideMax = width - sideMin
              var frames = [CGRect]()
              frames.append(CGRect(x: 0, y: origin, width: sideMin, height: sideMin))
              frames.append(CGRect(x: 0, y: origin + sideMax - sideMin, width: sideMin, height: sideMin))
              frames.append(CGRect(x: sideMin, y: origin, width: sideMax, height: sideMax))
              return frames
          }
      }
      
      public struct ThreeRightSquareMosaicBlock: SquareMosaicBlock {
          
          public func frames() -> Int {
              return 3
          }
          
          public func frames(origin: CGFloat, width: CGFloat) -> [CGRect] {
              let side = width / 3.0
              var frames = [CGRect]()
              frames.append(CGRect(x: side + side, y: origin, width: side, height: side))
              frames.append(CGRect(x: side, y: origin, width: side, height: side))
              frames.append(CGRect(x: 0, y: origin, width: side, height: side))
              return frames
          }
      }
      


      В итоге у нас получился вполне универсальный класс SquareMosaicLayout. На его основе можно составлять разные наборы расположений элементов UICollectionView. Анимированно переходить от одного шаблона к другому. Переиспользовать блоки разных шаблонов для составления новых.

      Следующим этапом развития будет создание и пополнение предустановленных наборов блоков и шаблонов с разнообразными расположениями элементов. Так же хотелось бы добавить поддержку различных видов анимаций и SupplementaryViews / DecorationViews

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

      P.S. Доступно для установки через cocoapods: pod 'SquareMosaicLayout'

      Комментарии (0)

        Let's block ads! (Why?)

        [Из песочницы] Консультант  ERP CRM— вечный переговорщик

        Итак, если вы только подумываете о выборе профессии консультанта то подумайте еще раз потом еще сто раз и дайте себе ответ на пару вопросов:

        — Готов ли я к тому что клиент всегда прав?
        — Готов ли я понять и простить всех этих роботов, которые пол дня заливают в себя кофе, вторые пол дня звонят по телефонам и переводят лес?
        — Способен ли я убедить лидера Северной Кореи в том что демократия единственно верный путь развития современного общества?

        Думаю этого достаточно. И все же, если ваш ответ “ДА”, то читайте дальше.

        Вас ждет специфика отечественного консалтинга со всеми вытекающими отсюда последствиями. Что то наподобие первого дня за рулем на грузовике в центре Москвы. Проблема только в том, что этот день будет ваш “день сурка”. Как бы вы не повышали свой уровень взаимодействия с клиентом, как бы вы не развивали свои навыки машинного обучения, сбора и систематизации данных вам все равно будут сигналить со всех сторон как бы намекая “Тебе человек за МКАДом место, а здесь люди приличные”. Спасут вас только выдержка и интуиция. Это то, чему по-настоящему стоит учиться.

        Блуждая в интернетах, часто можно встретить бравурные статьи с какого нибудь очередного форума или президиума (написанные ради повышения KPI) о том какие мы молодцы. И золотые партнеры (о Microsoft не путать с сетевым маркетингом) и лучшие методисты и внедренцы. Либо же, если вы работаете не на стороне интегратора, то в еженедельной рассылке видите чудеса повышения качества и эффективности работы персонала. Так же вам постоянно намекают что дела у компании идут великолепно (особенно у отдельных ее членов) что позволяет вашему воспаленному мозгу рисовать фантастическую кривую капитализации компании, в надеждах что и ваша запутанная тропинка семейного бюджета рано или поздно станет шестиполосным шоссе.

        Но вы не емкость для кофе. И при наличии хотя бы пары лет опыта работы, вы вдруг видите как позолота с дверей и кабинетов начинает сходить. Глаза становятся шире. Сон хуже. Теперь вы знаете как подняли этот тот и тот проект. А если судьба закинула вас в нефтегазовый или строительный сектор экономики, ваши моральные терзания умножаются еще в несколько раз. И этот невменяемый масштаб идущих рука об руку клановости и пилы будет приходить в ваше сознание из ниоткуда и исчезать в никуда.

        На плюсах и минусах особо не останавливаюсь. Отмечу, что многое зависит мягко говоря от удачи. Лидер, проект, ситуация, клиент. Всегда есть вероятность того, что что-то пойдет не по плану. И не всегда в худшем смысле этого слова. Конечно, не стоит забывать что от вас самих до определенного момента тоже многое зависит. Если кратко — консалтер это всегда широкий кругозор, всегда новое (даже если за новой формой скрывается пережеванное старое), не всегда, но высокий доход. Глобальный минус-ты всегда неправ. Это надо принять. Сделать это не так сложно, если последний плюс про тебя.

        А теперь то, ради чего выше написано немало букв. Советы:

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

        Потребитель. Конечный потребитель вашего результата труда это как правило “человек в поле”. Ему свойственно ставить задачи, что называется в лоб, однако от вас он ждет развернутого результата решения этой задачи. Здесь стоит вспомнить о буддизме. Не стесняйтесь признаться себе что вы ничего не знаете. Постарайтесь выжать максимум знаний из каждого специалиста. Это позволит вам однажды прийти к “знанию”. Это будет ваш уровень компетенции.

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

        Политика. Не забывайте о роли политических процессов внутри компании клиента. Для выделения приоритетных направлений работы очень полезно будет знать кто в компании “решает” и кто чей родственник. На основе этой информации вы сможете понять с кем стоит “дружить”, кого стоит избегать, кого можно проигнорировать и т.д. Помните, это важно! Чем дальше вы идете, тем меньше времени у вас остается на удовлетворение потребностей каждого сотрудника. Научитесь их разделять.

        Живое общение. Да, консультанты стараются его избегать, и предпочитают сухие тексты в виде тысяч почтовых сообщений, скайпа, тимвьевера и т.д. Безусловно это правильно. Однако, как минимум на старте проекта вы должны познакомиться и пообщаться с максимальным числом сотрудников, таким образом дав понять им что вы не чужой. Вы только на стороне этого сотрудника и готовы к борьбе против всего и всех. На начальном этапе “свой парень” — это ваш путь.

        Самый умный. Не давайте повода рядовым сотрудникам подумать что вы умнее их. Этого никто не любит. Особенно, если ты десять лет сидишь в одном кресле и все это время делаешь один и тот же документ. Вы должны прийти к паритету демонстрируемых знаний. Все что от вас требуется, периодически подбрасывать, невзначай, идею. В итоге клиент сам ее вам предложит. Профит. Клиент ощутил себя умным и причастным к великому. Вы получили лояльного пользователя. Теперь все просчеты в реализации — это и его просчеты.

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

        Взаимодействие с руководителями среднего звена. Руководитель это защитник своих сотрудников. Не старайтесь в разговоре с ним, противопоставлять себя его подчиненным. Ничего хорошего из этого не выйдет. Старайтесь с уважением и на равных разъяснить свою позицию. Если вы идете с предложением — будьте готовы дать аргументированный ответ. Руководитель это немного бизнесмен. Эти люди как никто другой верят в то, что деньги компании это и их деньги. По этому только факты, способы решения поставленных задач и примерные сроки их выполнения.

        Тайм-менеджемент. Ежедневно по всему миру проводятся тренинги, пишутся книги, суть которых сводятся к тому, что вы станете супер специалистом и качество вашей жизни улучшится. К сожалению, универсального совета не существует. Опыт — один из факторов, под влиянием которого постепенно вы научитесь управлять своим временем не только на работе, но и в редкие минуты отдыха. Один из советов — старайтесь не работать в выходные. Работать в выходные неэффективно. Все что вы получите это низкий результат труда и усталость перед началом новой рабочей недели. Попробуйте пропустить следующий “рабочий выходной” и вы удивитесь тому, что на работе ничего не изменилось, а вы наконец выспались и занялись своим хобби.

        Команда. Как это банально не звучит, хорошая команда-залог успешной реализации как текущих так и перспективных задач. Не всегда команда, сформированная на ранних стадиях проекта, доходит в неизменном составе до его логического завершения или завершения этапа. Опыт внедрения показывает, что в итоговой команде, вполне, может остаться человек с более низким уровнем компетенции, однако, более упорный и неконфликтный. Если вы занимаетесь интеграцией, еще одним советом будет хороший программист. Добейтесь того что бы с вами в паре работал такой же заинтересованный кодер. Такой, которому вы сможете позвонить среди ночи и сказать “Выручай! Горим!”. Очень часто проекты гибнут от собственных механизмов защиты. В случае, если у вас в нужный момент возникнут трудности с поиском свободного разработчика или потребуется длинный трекинг утверждения постановки задачи вы потеряете много времени и главное лояльность пользователей. Хороший программист — ваш друг.

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

        Комментарии (0)

          Let's block ads! (Why?)

          [Перевод] Angular 2: почему на TypeScript?

          Куда переехать с Parse Push?

          Сводная BIM-модель: практическое занятие по технологии OpenBIM

          Летом 2016 года вышла замечательная статья, демонстрирующая технологию OpenBIM (открытого взаимодействия информационных моделей) на примере проекта многоквартирного жилого дома в г. Ярославле, архитектурная часть которого проектировалась в программном продукте ARCHICAD (одном из самых мощных BIM решений для архитекторов), а конструкторская часть (раздел КЖ) – в Tekla Structures (мощном BIM решении для инженеров конструкторов). Фактически статья продемонстрировала практическую возможность объединения нескольких независимых между собой решений в рамках совместной работы над достаточно крупным объектом.

          Специалисты «Нанософт» запросили у авторов статьи рабочую документацию по инженерной части проекта (выполненную по классической 2D технологии) и воспроизвели ее с помощью современной технологии информационного моделирования в новом программном комплексе nanoCAD Инженерный BIM, который вышел в сентябре 2016 года. А затем дополнили ранее созданную архитектурно-конструкторскую модель инженерными разделами. В результате получилась сводная BIM модель, объединяющая семь проектных разделов: архитектура, конструкции в части железобетонных конструкций и инженерные сети в частях электрика\освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

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

          Введение

          Напомню, что сам проект (рис.1) предоставила инвестиционная компания ООО «ПрофСтрой», деятельность которой направлена на строительство доступного и комфортного жилья, преимущественно эконом-класса, в Ярославле и Ярославском муниципальном районе.


          Рис. 1. Информационные (BIM) модели жилого здания: архитектурная и конструкторская часть.

          Автор проекта и архитектурной модели, созданной в программе ARCHICAD – архитектор Лысоконь А. Все несущие конструкции были выполнены в программе Tekla Structures конструкторами Сизовым В. и Роиком Д. Главный инженер проекта – Медведев А.

          Инженерная часть воссоздавалась по 2D документации специалистами Нанософт: электрическая часть – Щуров Д., отопление, водоснабжение и канализация – Суворов Н., слабые токи и системы безопасности – Бадаев М, сводная модель и общая координация – Ожигин Д.


          Рис. 2. Воссозданная по 2D документации информационная (BIM) модель жилого здания в части инженерия: электрика, освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

          Исходные данные: разбираемся со структурой здания

          Получив материалы по зданию, мы выяснили следующее:

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

          Во-вторых, начало архитектурного проекта не совпадает с началом координат сетки осей – пересечение осей А1 лежит в координатах x = 19454.1, y = -271.4, z = 0. Тем не менее начало координат инженерного проекта мы разместили в точке А1, а при сборе сводных моделей учитывали это смещение.


          Рис. 3. Проект состоит из двух корпусов, а пересечение осей А1 расположено в координатах x = 19454.1, y = -271.4, z = 0.

          В-третьих, у нас были следующие исходные данных от архитектора:

          • Поэтажные планы в формате DWG, выгружаемые из ARCHICAD-проекта – эти материалы мы использовали как основу (подложку) для проектирования инженерии и подготовки рабочей документации по разделу.
          • Единая архитектурная модель в формате IFC – эту модель мы использовали как подложку для согласования трехмерной компоновки оборудования и получения общего представления модели.
          • Рабочая документация в формате DWG – т.к. мы воспроизводили проект (а не проектировали с нуля), эти материалы мы использовали для понимания инженерного решения.

          Еще у нас была единая конструкторская модель в формате IFC, но эту модель мы практически не использовали, т.к. проект не меняли. Но мы подгружали конструкторскую модель в сводную и видели некоторые конфликты. Например, между инженеркой и армирующими прутами.

          Выходные данные для практического задания (IFC-модели)

          Рабочую документацию, расчеты, спецификации по проекту мы получаем в рамках программных продуктов – в частности, инженерные разделы мы получаем из nanoCAD Инженерный BIM. Как это делается? Это выходит немного за рамки текущей статьи: приглашаем за более подробной информацией на наши семинары и вебинары. Или посмотрите, например, плейлист «Технология информационного моделирования (BIM) и САПР-платформа nanoCAD» на нашем YouTube-канале. В рамках же этого практического задания мы соберем только сводную BIM модель.

          Из всех используемых программных продуктов в любой момент можно выгрузить информационную модель в формате IFC и она будет содержать самую свежую и актуальную информацию. Для практической работы на момент написания статьи из программных продуктов nanoCAD Электро, СКС, ОПС, ВК и Отопление мы сформировали отдельные IFC модели, которые собрали в rar-архив.

          Обратите внимание, что в архиве также лежит файл «МКЖД.АС.ifc» – это архитектурная часть проекта (IFC модель, сформированная из ARCHICAD). В архиве также лежат DWG файлы, которые получены из BIM модели ARCHICAD в автоматизированном режиме и обновляются по мере обновления основной модели – это двухмерный чертеж-задание первого этажа и трехмерная модель первого этажа (корпус 1 и корпус 2). Фактически это исходные данные по первому этажу для проектирования инженерии. Мы будем использовать их для наглядности сбора сводной модели.

          Программное обеспечение

          Для практической работы нам понадобится одна программа – платформа nanoCAD Plus 8.1, которую можно скачать на сайте разработчика.

          Но в качестве экспериментов можно использовать и другие IFC-просмоторщики:


          Установите программные продукты и запустите nanoCAD Plus 8.1.

          Шаг 1: формируем подложки

          Этот шаг скорее подготовительный и нужен для того, чтобы вы наглядно понимали, что происходит. Создайте новый проект в nanoCAD Plus (команда НОВЫЙ) и сохраните его под именем «Сводная BIM-модель.dwg».

          Далее вставляем двухмерную подложку. Для этого командой ATTACH (меню Вставка\Внешняя ссылка...) подключаем файл «01 Первый этаж 2D.dwg» из скаченных материалов (рис. 4). Обращаю внимание, что при вставке я использую относительный путь для подложки (раздел Задание пути в диалоге Вставка внешней ссылки) и указываю координаты вставки: x = -19454.1, y = 271.4, z = 0 (т.е. начало координат размещаю в точку пересечения осей А1).


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

          Когда подложка появилась на поле документа, наведите курсор на центр экрана и, удерживая клавишу SHIFT + колесо мышки, разверните чертеж под углом в 3D пространство. Или разверните ее в стандарную ЮВ изометрию (команда _SEISO).

          Повторите команду вставки подложки для файлов «01 Первый этаж 3D (часть 01).dwg» и «01 Первый этаж 3D (часть 02).dwg» с теми же координатами вставки, что и для двухмерного проекта – в ваш проект будет добавлена трехмерная геометрия архитектуры первого этажа. Это не еще BIM модель, т.к. полученная геометрия не содержит никакой информации об элементах. DWG файлы дают только геометрию и мы ее будем использовать для того, чтобы понять разницу по сравнению с настоящей BIM-моделью.

          И, наконец, задайте способ отображения трехмерного пространства: в меню Вид\Визуальные стили выберите пункт «Быстро с показом рёбер» или «Быстро».

          Если все сделано правильно, то вы получите результат, отображенный на рис.5.

          Рис. 5. Размещаем двухмерную и трехмерную подложку в проект nanoCAD для того, чтобы наглядно видеть процесс сбора BIM-проекта.

          Совет 1: используйте клавишу SHIFT и одновременно нажатое колесо мышки для того, чтобы вращать модель – это позволит рассмотреть проект со всех сторон.
          Совет 2: если у вас мощный компьютер, но при вращении модель «моргает», отключая раскраску граней, то в настройках программы (Сервис\Настройка) можно отключить Оптимизацию отрисовки треугольников (Графическая подсистема\Оптимизация отрисовки) – после этого nanoCAD будет отрисовывать модель полностью даже при вращении. Намного удобнее для глаз.

          Шаг 2: добавляем BIM-модель

          Мы полностью готовы к сбору сводной BIM-модели. Теперь с помощью команды IFCVIEW3D загрузите файл «МКЖД.О_корпус1.ifc». Вы можете выбрать любой другой файл, но я рекомендую начать именно с этого файла – он небольшой по размеру, быстро загружается и достаточно наглядный. Если все сделано правильно, то у вас появится отопительная система здания в корпусе 1 – см. рис.6.
          Совет 3: если у вас после загрузки IFC файла модель не появилась, сохраните файл на жесткий диск.
          Обратите внимание, что на функциональной панели IFC появилась структура подгруженного IFC файла (панель расположена рядом с панелью Свойства и включается\выключается через меню Вид\Панели\Функциональные панели\IFC...): этажи, классы элементов, высоты и т.д. Панель позволяет быстро найти элементы по своим классам, а также моментально отключить видимость объектов – например, можно выключить объекты верхних этажей.


          Рис. 6. Трехмерная модель проекта с DWG и IFC данными

          Также обратите внимание, что BIM-модель содержит информацию по объектам: например, если выделить радиатор, то в окне свойств отобразится информация по объекту – объем, тепловая нагрузка, высота установки относительно этажа, мощность, название, ссылка на сайт производителя и т.д. Вся эта информация была заложена в программном продукте nanoCAD Отопление и была аккуратно передана в среду nanoCAD Plus благодаря формату IFC, который как раз и предназначен для переноса такой информации между программами. Сравните, например, со свойствами объектов из DWG файла, которые содержат только общую информацию типа цвет, слой, толщина линий (см.рис. 7).


          Рис. 7. IFC объекты содержат гораздо больше параметров по сравнению с DWG блоками

          Информацию из IFC объектов можно использовать в панели Выбор при настройке выборок по проекту, так и в автоформируемых спецификациях (например, спецификации оборудования) – см. рис. 8.


          Рис. 8. Параметры и информацию из IFC объектов можно использовать в таблицах и выборках

          Шаг 3: формируем сводную BIM-модель

          Последовательно повторяя шаг 2 для других IFC моделей, мы можем собрать сводную BIM-модель – см. рис.8.

          Для каждого раздела создается список объектов на панели IFC. Каждый добавленный раздел содержит IFC объекты со своими специфическими данными, заложенными в соответствующих программных продуктах, которые могут либо задаваться в ручную, либо браться из базы данных, либо вычисляться в результате расчетов.

          При этом каждый добавленный раздел достаточно существенно нагружает компьютер и для того, чтобы собрать полную модель нужны мощные ресурсы. Наиболее тяжелой в этом проекте является модель водоснабжения – скорее всего ее подгрузку необходимо будет подождать некоторое время. Поэтому в реальной работе вы можете объединять не всю модель, а только определенные разделы или даже этажи – это позволит решать практические задачи без существенного увеличения ресурсов компьютера.


          Рис. 9. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве

          nanoCAD Plus как viewer обеспечивает отображение модели, навигацию как в параллельной (SHIFT+колесо мышки), так и в перспективной проекции (команда 3DОБЛЕТ и клавиши WSAD для управления). Это позволяет забираться внутрь проекта и визуально находить проблемные участки проекта, коллизии и недоработки. Кроме того, используя автоматические спецификации можно быстро выбирать нужные IFC объекты и контролировать параметры инженерных сетей. В целом это дает возможность представить проект целиком с учетом ситуации в смежных разделах, распределить дальнейшую работу между специалистами и вести работу в едином информационном пространстве.


          Рис. 10. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве


          Рис. 11. Различные виды сводной BIM модели в рабочем окне nanoCAD Plus 8.1

          Шаг 5: обновление IFC моделей

          На данный момент в nanoCAD Plus 8.1 обновление моделей осуществляется путем удаления IFC модели с панели IFC и загрузки новой версии модели заново. Тут нужна еще оптимизация технологического процесса – в будущем мы хотим реализовать подгрузку IFC данных как подложки. Тогда они будут обновляться самостоятельно вслед за изменением IFC-файла.

          Шаг 6: сводные BIM модели в других решениях

          В качестве дополнительного задания вы можете попытаться собрать сводные модели в Tekla BIMsight (бесплатное решение, рис.12) и в Solibri Model Checker (платное решение; бесплатная версия Solibri Model Viewer позволяет открыть только одну IFC-модель). Эти продукты разрабатываются как универсальные решения для просмотра IFC и они расширяются функционалом по автоматическому поиску коллизий, формированию отчетов на изменения, более широким инструментарием по визуализации моделей.


          Рис. 12. Сводная BIM модель в IFC-просмоторщике Tekla BIMsight позволяет в автоматизированном режиме найти коллизии между системами.

          Заключение

          Технология BIM развивается, и с каждым днем у проектировщиков появляются дополнительные инструменты по созданию качественных проектов. Еще пару лет назад собрать в рамках одного пространства модель многоэтажного жилого здания с архитектурой и инженерией было сложно, а сейчас это вполне обычное практическое задание.

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

          Специалисты «Нанософт» приглашают к сотрудничеству и готовы проконсультировать вас по вопросам создания BIM моделей инженерных сетей и организации BIM взаимодействия.

          Денис Ожигин,
          технический директор Нанософт

          Комментарии (0)

            Let's block ads! (Why?)

            пятница, 20 января 2017 г.

            Сводная BIM-модель: практическое занятие по технологии OpenBIM

            Летом 2016 года вышла замечательная статья, демонстрирующая технологию OpenBIM (открытого взаимодействия информационных моделей) на примере проекта многоквартирного жилого дома в г. Ярославле, архитектурная часть которого проектировалась в программном продукте ARCHICAD (одном из самых мощных BIM решений для архитекторов), а конструкторская часть (раздел КЖ) – в Tekla Structures (мощном BIM решении для инженеров конструкторов). Фактически статья продемонстрировала практическую возможность объединения нескольких независимых между собой решений в рамках совместной работы над достаточно крупным объектом.

            Специалисты «Нанософт» запросили у авторов статьи рабочую документацию по инженерной части проекта (выполненную по классической 2D технологии) и воспроизвели ее с помощью современной технологии информационного моделирования в новом программном комплексе nanoCAD Инженерный BIM, который вышел в сентябре 2016 года. А затем дополнили ранее созданную архитектурно-конструкторскую модель инженерными разделами. В результате получилась сводная BIM модель, объединяющая семь проектных разделов: архитектура, конструкции в части железобетонных конструкций и инженерные сети в частях электрика\освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

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

            Введение

            Напомню, что сам проект (рис.1) предоставила инвестиционная компания ООО «ПрофСтрой», деятельность которой направлена на строительство доступного и комфортного жилья, преимущественно эконом-класса, в Ярославле и Ярославском муниципальном районе.


            Рис. 1. Информационные (BIM) модели жилого здания: архитектурная и конструкторская часть.

            Автор проекта и архитектурной модели, созданной в программе ARCHICAD – архитектор Лысоконь А. Все несущие конструкции были выполнены в программе Tekla Structures конструкторами Сизовым В. и Роиком Д. Главный инженер проекта – Медведев А.

            Инженерная часть воссоздавалась по 2D документации специалистами Нанософт: электрическая часть – Щуров Д., отопление, водоснабжение и канализация – Суворов Н., слабые токи и системы безопасности – Бадаев М, сводная модель и общая координация – Ожигин Д.


            Рис. 2. Воссозданная по 2D документации информационная (BIM) модель жилого здания в части инженерия: электрика, освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

            Исходные данные: разбираемся со структурой здания

            Получив материалы по зданию, мы выяснили следующее:

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

            Во-вторых, начало архитектурного проекта не совпадает с началом координат сетки осей – пересечение осей А1 лежит в координатах x = 19454.1, y = -271.4, z = 0. Тем не менее начало координат инженерного проекта мы разместили в точке А1, а при сборе сводных моделей учитывали это смещение.


            Рис. 3. Проект состоит из двух корпусов, а пересечение осей А1 расположено в координатах x = 19454.1, y = -271.4, z = 0.

            В-третьих, у нас были следующие исходные данных от архитектора:

            • Поэтажные планы в формате DWG, выгружаемые из ARCHICAD-проекта – эти материалы мы использовали как основу (подложку) для проектирования инженерии и подготовки рабочей документации по разделу.
            • Единая архитектурная модель в формате IFC – эту модель мы использовали как подложку для согласования трехмерной компоновки оборудования и получения общего представления модели.
            • Рабочая документация в формате DWG – т.к. мы воспроизводили проект (а не проектировали с нуля), эти материалы мы использовали для понимания инженерного решения.

            Еще у нас была единая конструкторская модель в формате IFC, но эту модель мы практически не использовали, т.к. проект не меняли. Но мы подгружали конструкторскую модель в сводную и видели некоторые конфликты. Например, между инженеркой и армирующими прутами.

            Выходные данные для практического задания (IFC-модели)

            Рабочую документацию, расчеты, спецификации по проекту мы получаем в рамках программных продуктов – в частности, инженерные разделы мы получаем из nanoCAD Инженерный BIM. Как это делается? Это выходит немного за рамки текущей статьи: приглашаем за более подробной информацией на наши семинары и вебинары. Или посмотрите, например, плейлист «Технология информационного моделирования (BIM) и САПР-платформа nanoCAD» на нашем YouTube-канале. В рамках же этого практического задания мы соберем только сводную BIM модель.

            Из всех используемых программных продуктов в любой момент можно выгрузить информационную модель в формате IFC и она будет содержать самую свежую и актуальную информацию. Для практической работы на момент написания статьи из программных продуктов nanoCAD Электро, СКС, ОПС, ВК и Отопление мы сформировали отдельные IFC модели, которые собрали в rar-архив.

            Обратите внимание, что в архиве также лежит файл «МКЖД.АС.ifc» – это архитектурная часть проекта (IFC модель, сформированная из ARCHICAD). В архиве также лежат DWG файлы, которые получены из BIM модели ARCHICAD в автоматизированном режиме и обновляются по мере обновления основной модели – это двухмерный чертеж-задание первого этажа и трехмерная модель первого этажа (корпус 1 и корпус 2). Фактически это исходные данные по первому этажу для проектирования инженерии. Мы будем использовать их для наглядности сбора сводной модели.

            Программное обеспечение

            Для практической работы нам понадобится одна программа – платформа nanoCAD Plus 8.1, которую можно скачать на сайте разработчика.

            Но в качестве экспериментов можно использовать и другие IFC-просмоторщики:


            Установите программные продукты и запустите nanoCAD Plus 8.1.

            Шаг 1: формируем подложки

            Этот шаг скорее подготовительный и нужен для того, чтобы вы наглядно понимали, что происходит. Создайте новый проект в nanoCAD Plus (команда НОВЫЙ) и сохраните его под именем «Сводная BIM-модель.dwg».

            Далее вставляем двухмерную подложку. Для этого командой ATTACH (меню Вставка\Внешняя ссылка...) подключаем файл «01 Первый этаж 2D.dwg» из скаченных материалов (рис. 4). Обращаю внимание, что при вставке я использую относительный путь для подложки (раздел Задание пути в диалоге Вставка внешней ссылки) и указываю координаты вставки: x = -19454.1, y = 271.4, z = 0 (т.е. начало координат размещаю в точку пересечения осей А1).


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

            Когда подложка появилась на поле документа, наведите курсор на центр экрана и, удерживая клавишу SHIFT + колесо мышки, разверните чертеж под углом в 3D пространство. Или разверните ее в стандарную ЮВ изометрию (команда _SEISO).

            Повторите команду вставки подложки для файлов «01 Первый этаж 3D (часть 01).dwg» и «01 Первый этаж 3D (часть 02).dwg» с теми же координатами вставки, что и для двухмерного проекта – в ваш проект будет добавлена трехмерная геометрия архитектуры первого этажа. Это не еще BIM модель, т.к. полученная геометрия не содержит никакой информации об элементах. DWG файлы дают только геометрию и мы ее будем использовать для того, чтобы понять разницу по сравнению с настоящей BIM-моделью.

            И, наконец, задайте способ отображения трехмерного пространства: в меню Вид\Визуальные стили выберите пункт «Быстро с показом рёбер» или «Быстро».

            Если все сделано правильно, то вы получите результат, отображенный на рис.5.

            Рис. 5. Размещаем двухмерную и трехмерную подложку в проект nanoCAD для того, чтобы наглядно видеть процесс сбора BIM-проекта.

            Совет 1: используйте клавишу SHIFT и одновременно нажатое колесо мышки для того, чтобы вращать модель – это позволит рассмотреть проект со всех сторон.
            Совет 2: если у вас мощный компьютер, но при вращении модель «моргает», отключая раскраску граней, то в настройках программы (Сервис\Настройка) можно отключить Оптимизацию отрисовки треугольников (Графическая подсистема\Оптимизация отрисовки) – после этого nanoCAD будет отрисовывать модель полностью даже при вращении. Намного удобнее для глаз.

            Шаг 2: добавляем BIM-модель

            Мы полностью готовы к сбору сводной BIM-модели. Теперь с помощью команды IFCVIEW3D загрузите файл «МКЖД.О_корпус1.ifc». Вы можете выбрать любой другой файл, но я рекомендую начать именно с этого файла – он небольшой по размеру, быстро загружается и достаточно наглядный. Если все сделано правильно, то у вас появится отопительная система здания в корпусе 1 – см. рис.6.
            Совет 3: если у вас после загрузки IFC файла модель не появилась, сохраните файл на жесткий диск.
            Обратите внимание, что на функциональной панели IFC появилась структура подгруженного IFC файла (панель расположена рядом с панелью Свойства и включается\выключается через меню Вид\Панели\Функциональные панели\IFC...): этажи, классы элементов, высоты и т.д. Панель позволяет быстро найти элементы по своим классам, а также моментально отключить видимость объектов – например, можно выключить объекты верхних этажей.


            Рис. 6. Трехмерная модель проекта с DWG и IFC данными

            Также обратите внимание, что BIM-модель содержит информацию по объектам: например, если выделить радиатор, то в окне свойств отобразится информация по объекту – объем, тепловая нагрузка, высота установки относительно этажа, мощность, название, ссылка на сайт производителя и т.д. Вся эта информация была заложена в программном продукте nanoCAD Отопление и была аккуратно передана в среду nanoCAD Plus благодаря формату IFC, который как раз и предназначен для переноса такой информации между программами. Сравните, например, со свойствами объектов из DWG файла, которые содержат только общую информацию типа цвет, слой, толщина линий (см.рис. 7).


            Рис. 7. IFC объекты содержат гораздо больше параметров по сравнению с DWG блоками

            Информацию из IFC объектов можно использовать в панели Выбор при настройке выборок по проекту, так и в автоформируемых спецификациях (например, спецификации оборудования) – см. рис. 8.


            Рис. 8. Параметры и информацию из IFC объектов можно использовать в таблицах и выборках

            Шаг 3: формируем сводную BIM-модель

            Последовательно повторяя шаг 2 для других IFC моделей, мы можем собрать сводную BIM-модель – см. рис.8.

            Для каждого раздела создается список объектов на панели IFC. Каждый добавленный раздел содержит IFC объекты со своими специфическими данными, заложенными в соответствующих программных продуктах, которые могут либо задаваться в ручную, либо браться из базы данных, либо вычисляться в результате расчетов.

            При этом каждый добавленный раздел достаточно существенно нагружает компьютер и для того, чтобы собрать полную модель нужны мощные ресурсы. Наиболее тяжелой в этом проекте является модель водоснабжения – скорее всего ее подгрузку необходимо будет подождать некоторое время. Поэтому в реальной работе вы можете объединять не всю модель, а только определенные разделы или даже этажи – это позволит решать практические задачи без существенного увеличения ресурсов компьютера.


            Рис. 9. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве

            nanoCAD Plus как viewer обеспечивает отображение модели, навигацию как в параллельной (SHIFT+колесо мышки), так и в перспективной проекции (команда 3DОБЛЕТ и клавиши WSAD для управления). Это позволяет забираться внутрь проекта и визуально находить проблемные участки проекта, коллизии и недоработки. Кроме того, используя автоматические спецификации можно быстро выбирать нужные IFC объекты и контролировать параметры инженерных сетей. В целом это дает возможность представить проект целиком с учетом ситуации в смежных разделах, распределить дальнейшую работу между специалистами и вести работу в едином информационном пространстве.


            Рис. 10. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве


            Рис. 11. Различные виды сводной BIM модели в рабочем окне nanoCAD Plus 8.1

            Шаг 5: обновление IFC моделей

            На данный момент в nanoCAD Plus 8.1 обновление моделей осуществляется путем удаления IFC модели с панели IFC и загрузки новой версии модели заново. Тут нужна еще оптимизация технологического процесса – в будущем мы хотим реализовать подгрузку IFC данных как подложки. Тогда они будут обновляться самостоятельно вслед за изменением IFC-файла.

            Шаг 6: сводные BIM модели в других решениях

            В качестве дополнительного задания вы можете попытаться собрать сводные модели в Tekla BIMsight (бесплатное решение, рис.12) и в Solibri Model Checker (платное решение; бесплатная версия Solibri Model Viewer позволяет открыть только одну IFC-модель). Эти продукты разрабатываются как универсальные решения для просмотра IFC и они расширяются функционалом по автоматическому поиску коллизий, формированию отчетов на изменения, более широким инструментарием по визуализации моделей.


            Рис. 12. Сводная BIM модель в IFC-просмоторщике Tekla BIMsight позволяет в автоматизированном режиме найти коллизии между системами.

            Заключение

            Технология BIM развивается, и с каждым днем у проектировщиков появляются дополнительные инструменты по созданию качественных проектов. Еще пару лет назад собрать в рамках одного пространства модель многоэтажного жилого здания с архитектурой и инженерией было сложно, а сейчас это вполне обычное практическое задание.

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

            Специалисты «Нанософт» приглашают к сотрудничеству и готовы проконсультировать вас по вопросам создания BIM моделей инженерных сетей и организации BIM взаимодействия.

            Денис Ожигин,
            технический директор Нанософт

            Комментарии (0)

              Let's block ads! (Why?)

              Сводная BIM-модель: практическое занятие по технологии OpenBIM

              Летом 2016 года вышла замечательная статья, демонстрирующая технологию OpenBIM (открытого взаимодействия информационных моделей) на примере проекта многоквартирного жилого дома в г. Ярославле, архитектурная часть которого проектировалась в программном продукте ARCHICAD (одном из самых мощных BIM решений для архитекторов), а конструкторская часть (раздел КЖ) – в Tekla Structures (мощном BIM решении для инженеров конструкторов). Фактически статья продемонстрировала практическую возможность объединения нескольких независимых между собой решений в рамках совместной работы над достаточно крупным объектом.

              Специалисты «Нанософт» запросили у авторов статьи рабочую документацию по инженерной части проекта (выполненную по классической 2D технологии) и воспроизвели ее с помощью современной технологии информационного моделирования в новом программном комплексе nanoCAD Инженерный BIM, который вышел в сентябре 2016 года. А затем дополнили ранее созданную архитектурно-конструкторскую модель инженерными разделами. В результате получилась сводная BIM модель, объединяющая семь проектных разделов: архитектура, конструкции в части железобетонных конструкций и инженерные сети в частях электрика\освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

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

              Введение

              Напомню, что сам проект (рис.1) предоставила инвестиционная компания ООО «ПрофСтрой», деятельность которой направлена на строительство доступного и комфортного жилья, преимущественно эконом-класса, в Ярославле и Ярославском муниципальном районе.


              Рис. 1. Информационные (BIM) модели жилого здания: архитектурная и конструкторская часть.

              Автор проекта и архитектурной модели, созданной в программе ARCHICAD – архитектор Лысоконь А. Все несущие конструкции были выполнены в программе Tekla Structures конструкторами Сизовым В. и Роиком Д. Главный инженер проекта – Медведев А.

              Инженерная часть воссоздавалась по 2D документации специалистами Нанософт: электрическая часть – Щуров Д., отопление, водоснабжение и канализация – Суворов Н., слабые токи и системы безопасности – Бадаев М, сводная модель и общая координация – Ожигин Д.


              Рис. 2. Воссозданная по 2D документации информационная (BIM) модель жилого здания в части инженерия: электрика, освещение, слабые токи, системы безопасности, отопление, водоснабжение и канализация.

              Исходные данные: разбираемся со структурой здания

              Получив материалы по зданию, мы выяснили следующее:

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

              Во-вторых, начало архитектурного проекта не совпадает с началом координат сетки осей – пересечение осей А1 лежит в координатах x = 19454.1, y = -271.4, z = 0. Тем не менее начало координат инженерного проекта мы разместили в точке А1, а при сборе сводных моделей учитывали это смещение.


              Рис. 3. Проект состоит из двух корпусов, а пересечение осей А1 расположено в координатах x = 19454.1, y = -271.4, z = 0.

              В-третьих, у нас были следующие исходные данных от архитектора:

              • Поэтажные планы в формате DWG, выгружаемые из ARCHICAD-проекта – эти материалы мы использовали как основу (подложку) для проектирования инженерии и подготовки рабочей документации по разделу.
              • Единая архитектурная модель в формате IFC – эту модель мы использовали как подложку для согласования трехмерной компоновки оборудования и получения общего представления модели.
              • Рабочая документация в формате DWG – т.к. мы воспроизводили проект (а не проектировали с нуля), эти материалы мы использовали для понимания инженерного решения.

              Еще у нас была единая конструкторская модель в формате IFC, но эту модель мы практически не использовали, т.к. проект не меняли. Но мы подгружали конструкторскую модель в сводную и видели некоторые конфликты. Например, между инженеркой и армирующими прутами.

              Выходные данные для практического задания (IFC-модели)

              Рабочую документацию, расчеты, спецификации по проекту мы получаем в рамках программных продуктов – в частности, инженерные разделы мы получаем из nanoCAD Инженерный BIM. Как это делается? Это выходит немного за рамки текущей статьи: приглашаем за более подробной информацией на наши семинары и вебинары. Или посмотрите, например, плейлист «Технология информационного моделирования (BIM) и САПР-платформа nanoCAD» на нашем YouTube-канале. В рамках же этого практического задания мы соберем только сводную BIM модель.

              Из всех используемых программных продуктов в любой момент можно выгрузить информационную модель в формате IFC и она будет содержать самую свежую и актуальную информацию. Для практической работы на момент написания статьи из программных продуктов nanoCAD Электро, СКС, ОПС, ВК и Отопление мы сформировали отдельные IFC модели, которые собрали в rar-архив.

              Обратите внимание, что в архиве также лежит файл «МКЖД.АС.ifc» – это архитектурная часть проекта (IFC модель, сформированная из ARCHICAD). В архиве также лежат DWG файлы, которые получены из BIM модели ARCHICAD в автоматизированном режиме и обновляются по мере обновления основной модели – это двухмерный чертеж-задание первого этажа и трехмерная модель первого этажа (корпус 1 и корпус 2). Фактически это исходные данные по первому этажу для проектирования инженерии. Мы будем использовать их для наглядности сбора сводной модели.

              Программное обеспечение

              Для практической работы нам понадобится одна программа – платформа nanoCAD Plus 8.1, которую можно скачать на сайте разработчика.

              Но в качестве экспериментов можно использовать и другие IFC-просмоторщики:


              Установите программные продукты и запустите nanoCAD Plus 8.1.

              Шаг 1: формируем подложки

              Этот шаг скорее подготовительный и нужен для того, чтобы вы наглядно понимали, что происходит. Создайте новый проект в nanoCAD Plus (команда НОВЫЙ) и сохраните его под именем «Сводная BIM-модель.dwg».

              Далее вставляем двухмерную подложку. Для этого командой ATTACH (меню Вставка\Внешняя ссылка...) подключаем файл «01 Первый этаж 2D.dwg» из скаченных материалов (рис. 4). Обращаю внимание, что при вставке я использую относительный путь для подложки (раздел Задание пути в диалоге Вставка внешней ссылки) и указываю координаты вставки: x = -19454.1, y = 271.4, z = 0 (т.е. начало координат размещаю в точку пересечения осей А1).


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

              Когда подложка появилась на поле документа, наведите курсор на центр экрана и, удерживая клавишу SHIFT + колесо мышки, разверните чертеж под углом в 3D пространство. Или разверните ее в стандарную ЮВ изометрию (команда _SEISO).

              Повторите команду вставки подложки для файлов «01 Первый этаж 3D (часть 01).dwg» и «01 Первый этаж 3D (часть 02).dwg» с теми же координатами вставки, что и для двухмерного проекта – в ваш проект будет добавлена трехмерная геометрия архитектуры первого этажа. Это не еще BIM модель, т.к. полученная геометрия не содержит никакой информации об элементах. DWG файлы дают только геометрию и мы ее будем использовать для того, чтобы понять разницу по сравнению с настоящей BIM-моделью.

              И, наконец, задайте способ отображения трехмерного пространства: в меню Вид\Визуальные стили выберите пункт «Быстро с показом рёбер» или «Быстро».

              Если все сделано правильно, то вы получите результат, отображенный на рис.5.

              Рис. 5. Размещаем двухмерную и трехмерную подложку в проект nanoCAD для того, чтобы наглядно видеть процесс сбора BIM-проекта.

              Совет 1: используйте клавишу SHIFT и одновременно нажатое колесо мышки для того, чтобы вращать модель – это позволит рассмотреть проект со всех сторон.
              Совет 2: если у вас мощный компьютер, но при вращении модель «моргает», отключая раскраску граней, то в настройках программы (Сервис\Настройка) можно отключить Оптимизацию отрисовки треугольников (Графическая подсистема\Оптимизация отрисовки) – после этого nanoCAD будет отрисовывать модель полностью даже при вращении. Намного удобнее для глаз.

              Шаг 2: добавляем BIM-модель

              Мы полностью готовы к сбору сводной BIM-модели. Теперь с помощью команды IFCVIEW3D загрузите файл «МКЖД.О_корпус1.ifc». Вы можете выбрать любой другой файл, но я рекомендую начать именно с этого файла – он небольшой по размеру, быстро загружается и достаточно наглядный. Если все сделано правильно, то у вас появится отопительная система здания в корпусе 1 – см. рис.6.
              Совет 3: если у вас после загрузки IFC файла модель не появилась, сохраните файл на жесткий диск.
              Обратите внимание, что на функциональной панели IFC появилась структура подгруженного IFC файла (панель расположена рядом с панелью Свойства и включается\выключается через меню Вид\Панели\Функциональные панели\IFC...): этажи, классы элементов, высоты и т.д. Панель позволяет быстро найти элементы по своим классам, а также моментально отключить видимость объектов – например, можно выключить объекты верхних этажей.


              Рис. 6. Трехмерная модель проекта с DWG и IFC данными

              Также обратите внимание, что BIM-модель содержит информацию по объектам: например, если выделить радиатор, то в окне свойств отобразится информация по объекту – объем, тепловая нагрузка, высота установки относительно этажа, мощность, название, ссылка на сайт производителя и т.д. Вся эта информация была заложена в программном продукте nanoCAD Отопление и была аккуратно передана в среду nanoCAD Plus благодаря формату IFC, который как раз и предназначен для переноса такой информации между программами. Сравните, например, со свойствами объектов из DWG файла, которые содержат только общую информацию типа цвет, слой, толщина линий (см.рис. 7).


              Рис. 7. IFC объекты содержат гораздо больше параметров по сравнению с DWG блоками

              Информацию из IFC объектов можно использовать в панели Выбор при настройке выборок по проекту, так и в автоформируемых спецификациях (например, спецификации оборудования) – см. рис. 8.


              Рис. 8. Параметры и информацию из IFC объектов можно использовать в таблицах и выборках

              Шаг 3: формируем сводную BIM-модель

              Последовательно повторяя шаг 2 для других IFC моделей, мы можем собрать сводную BIM-модель – см. рис.8.

              Для каждого раздела создается список объектов на панели IFC. Каждый добавленный раздел содержит IFC объекты со своими специфическими данными, заложенными в соответствующих программных продуктах, которые могут либо задаваться в ручную, либо браться из базы данных, либо вычисляться в результате расчетов.

              При этом каждый добавленный раздел достаточно существенно нагружает компьютер и для того, чтобы собрать полную модель нужны мощные ресурсы. Наиболее тяжелой в этом проекте является модель водоснабжения – скорее всего ее подгрузку необходимо будет подождать некоторое время. Поэтому в реальной работе вы можете объединять не всю модель, а только определенные разделы или даже этажи – это позволит решать практические задачи без существенного увеличения ресурсов компьютера.


              Рис. 9. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве

              nanoCAD Plus как viewer обеспечивает отображение модели, навигацию как в параллельной (SHIFT+колесо мышки), так и в перспективной проекции (команда 3DОБЛЕТ и клавиши WSAD для управления). Это позволяет забираться внутрь проекта и визуально находить проблемные участки проекта, коллизии и недоработки. Кроме того, используя автоматические спецификации можно быстро выбирать нужные IFC объекты и контролировать параметры инженерных сетей. В целом это дает возможность представить проект целиком с учетом ситуации в смежных разделах, распределить дальнейшую работу между специалистами и вести работу в едином информационном пространстве.


              Рис. 10. Сводная BIM модель позволяет специалистам работать в едином информационном пространстве


              Рис. 11. Различные виды сводной BIM модели в рабочем окне nanoCAD Plus 8.1

              Шаг 5: обновление IFC моделей

              На данный момент в nanoCAD Plus 8.1 обновление моделей осуществляется путем удаления IFC модели с панели IFC и загрузки новой версии модели заново. Тут нужна еще оптимизация технологического процесса – в будущем мы хотим реализовать подгрузку IFC данных как подложки. Тогда они будут обновляться самостоятельно вслед за изменением IFC-файла.

              Шаг 6: сводные BIM модели в других решениях

              В качестве дополнительного задания вы можете попытаться собрать сводные модели в Tekla BIMsight (бесплатное решение, рис.12) и в Solibri Model Checker (платное решение; бесплатная версия Solibri Model Viewer позволяет открыть только одну IFC-модель). Эти продукты разрабатываются как универсальные решения для просмотра IFC и они расширяются функционалом по автоматическому поиску коллизий, формированию отчетов на изменения, более широким инструментарием по визуализации моделей.


              Рис. 12. Сводная BIM модель в IFC-просмоторщике Tekla BIMsight позволяет в автоматизированном режиме найти коллизии между системами.

              Заключение

              Технология BIM развивается, и с каждым днем у проектировщиков появляются дополнительные инструменты по созданию качественных проектов. Еще пару лет назад собрать в рамках одного пространства модель многоэтажного жилого здания с архитектурой и инженерией было сложно, а сейчас это вполне обычное практическое задание.

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

              Специалисты «Нанософт» приглашают к сотрудничеству и готовы проконсультировать вас по вопросам создания BIM моделей инженерных сетей и организации BIM взаимодействия.

              Денис Ожигин,
              технический директор Нанософт

              Комментарии (0)

                Let's block ads! (Why?)