Перейти к содержанию

Блоги

Блоги нашего сообщества

  1. Часто возникает вопрос со стороны пользователей: Почему из ARCHICAD не приходят помещения? И чаще всего архитекторы забывают отображать помещения в 3D модели при сохранении IFC. Ниже укрупненные шаги, как все-таки подготовить корректные IFC из ARCHICAD. Хотя в общем виде схема универсальна для любых других архитектурных BIM-систем. Итак...

     

    Со стороны ARCHICAD процесс достаточно простой:

    1. Замоделировать модель с проработкой помещений (помещения = Зоны, какие параметры задаются для помещений, такие и сохранятся потом в IFC).

    2. Перейти в 3D пространство с отображением зон. Можно отображать поэтажно, можно всю модель - тут как удобнее вам. Если архитектор не знает как в 3D отобразить зоны, то это документация. Либо вот скриншот:

    image.png

     

    3. Сохранить как IFC из 3D окна. В простейшем случае сделать просто Файл\Сохранить как..., выбрать формат IFC и настроить два параметра - Сохранять то, что отображается в 3D + Сохранять через транслятор "Точный экспорт геометрии":

    image.png

     

    В более сложных случаях там можно десятки параметров настроить: полноту передачи информационных данных, формат IFC, папка сохранения. В идеале можно настроить так, что из ARCHICAD будет сохранять в один клик не только один IFC, а куча данных - DWG, Excel таблицы, PDF, IFC по этажам, BIMx модель и т.д. - функция называется Публикатор. Но тут точно надо читать документацию и думать, что хочешь получить - в рамках краткого ответа на форуме тут не описать все возможности.

  2. Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
    Ответ прост - никак :D

    Даже если вы создадите для объекта вид сзади, который будет зеркален виду спереди, текст в геометрии себя будет вести неадекватно

    Спойлер

    MTEvOQA2R8.gif.68f408b1dec328edf836e0ec9e5b7957.gif.a4092fee4615478628e2fdad6887cc4f.gif

     

    Тогда что же делать?
    Во-первых, мы не будем создавать вид сзади. Мы заставим объект отзеркалиться обратно!
    Что нам для этого надо:
    1. Заставить объект понимать, что он отзеркален.
    2. Заставить объект, если он отзеркален, зеркалить себя обратно.

    3. Заставить объект переместить себя на нужное место.
     

    Решаем первую задачу

    Мой объект -  Пример для отзеркаливания текста (пустышка).mcd

    Вводим две переменные в объект:
    rAngleX (назовём её "Угол X") и rAngleY (назовём её "Угол Y")

    для переменной "Угол X" вычисляем угол между глобальной осью oY и вектором нашего объекта vecDirection

    rAngleX = angleTwoPi(oY,vecDirection);

    Для "Угол Y" вычисляем угол между осью oY и вектором нашего объекта vecPlane

    rAngleY = angleTwoPi(oY,vecPlane);

     

    Создаём функцию MirrorObject вначале нашего кода и прописываем там наши формулы

     

    function MirrorObject
    {
    	rAngleX = angleTwoPi(oY,vecDirection);
    	rAngleY = angleTwoPi(oY,vecPlane);
    }

     

    Прописываем нашу функцию в функциях OnInitialization, чтобы инициализировать  при вставке объекта наши переменные, и в OnMakeParameters, что при обновление объекта с помощью команды SPREGENSTD наши параметры обновились (на видео я запускаю эту команду через кнопку)
     

    Спойлер

     

    Из видео видно, что если мы зеркалим объект по оси Y то
    Угол X = 90

    Угол Y = 0

     

    А если по X, то

    Угол X = 270

    Угол Y = 180

     

    С первой задачей мы справились, наш объект понимает, что он отзеркален. Переходим ко второму пункту.

     

    Тут всё просто, на самом деле)

    Прописываем iff'ы, которые при определённых значения rAngleX и rAngleY будут разворачивать наш объект

    И загоняем их в нашу функцию  MirrorObject

    Рассмотрим момент, когда мы зеркалим по оси Y.

    Что происходит в этот  момент с объектом?
    У него меняется направления вектора vecDirection. Значит, чтобы отзеркалить объект обратно, нам надо для начала поменять направления вектора vecDirection!
    пишем:

    if(rAngleX==90 && rAngleY==0)
    {
    	vecDirection = -vecDirection;
    }

    А при зеркале по оси X меняется направление vecPlane, как следствие:

     

    if(rAngleX==270 && rAngleY==180)
    {
    	vecPlane= -vecPlane;
    }

     

    Загоняем это в нашу функцию

    function MirrorObject
    {
    	rAngleX = angleTwoPi(oY,vecDirection);
    	rAngleY = angleTwoPi(oY,vecPlane);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection = -vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane= -vecPlane;
    	}
    }

    Сохраняем объект и обновляем его на чертеже
     

    Спойлер

     

    О чудо, всё заработало!)

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

    Спойлер

     

    Логика та же, что и раньше, дописываем iff'ы исходя из угла)

     

    function MirrorObject
    {
    	rAngleY = angleTwoPi(oY,vecPlane);
    	rAngleX = angleTwoPi(oY,vecDirection);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane=-vecPlane;
    	}
    	if(rAngleX==0 && rAngleY==270)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==180 && rAngleY==90)
    	{
    		vecPlane=-vecPlane;
    	}
    }

    Запись специально не упрощал, но вы можете, если хотите,  объединить через "или" (||) часть кода)

    Проверяем результат:

    Спойлер


    Текст не зеркалится, но крутится.

    Чтобы решить эту проблему, надо ввести переменную, отвечающую за поворот текста.

    В ActHeader в Public дописываем переменную 

    sTextAngle, "hidden" 

    я её скрыл, потому что вручную менять не планирую, если хотите, можете оставить открытой.

    А коде исполнения UText дополняем переменной нашего угла:
     

    UText(mp, DegToRad(sTextAngle), 2.5*rSymScl/rScl, 0, 0.0000, T, 1,1);

    Я буду работать с углом в градусах

     

    Далее мы определяем в каких значения Угла X и Угла Y у нас текст повёрнут и выставляем для этого случая нужное нам значение sTextAngle, тем самым формирую итоговый вид нашей функции:
     

    function MirrorObject
    {
    	rAngleY = angleTwoPi(oY,vecPlane);
    	rAngleX = angleTwoPi(oY,vecDirection);
    	if(rAngleX==90 && rAngleY==0)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==270 && rAngleY==180)
    	{
    		vecPlane=-vecPlane;
    	}
    	if(rAngleX==0 && rAngleY==270)
    	{
    		vecDirection=-vecDirection;
    	}
    	if(rAngleX==180 && rAngleY==90)
    	{
    		vecPlane=-vecPlane;
    	}
    	
    	if(rAngleY==180 || rAngleY==270)
    	{
    		sTextAngle=180;
    	}
    	else
    	{
    		sTextAngle=0;
    	}
    }

    Сохраняем и обновляем наши объекты:

    Спойлер

     

    Собственно на  этом и всё) 
    Третий пункт нашей задачи нам не понадобился, так как точка вставки объекта находится по его центру.
    Если же точка вставки объекта находилась у края объекта, то нам пришлось бы кроме отзеркаливания объекта обратно в коде, прописывать дополнительно смещения объекта.
    Проведу часть такого кода из своего другого объекта, чтобы было понятна логика действия:
     

    anY = angleTwoPi(oY,vecPlane);
    anX = angleTwoPi(oY,vecDirection);
    pnt1x = pntOrigin:x;
    pnt1y = pntOrigin:y;
    if (anX==180 && anY==90)
    {
    	pntOrigin:x = pnt1x - L;
    	vecPlane=-vecPlane;
    }
    if (anX==90 && anY==0)
    {
    	pntOrigin:x = pnt1x - B;
    	vecDirection=-vecDirection;
    }

    Примеры моих объектов, с применение данной логики для отзеркаливания:

    Спойлер
    Спойлер

     

×
×
  • Создать...