blog/

Как устроен GDL элемент и почему Архикад устарел

Ivan @ 19 / 05 / 2021 @ Blog / ArchiCAD / BIM и CAD / Программирование / Скрипты
( / )

Время чтения: ~ 7 мин.

Что касается Архикада и взаимосвязи 3д и 2д в нём. В Архикаде в основе элементов лежит GDL — это интерпретируемый, максимально примитивный процедурный язык, основанный на Basic. В случае с архидовскими элементами, их структура состоит, в основном, из нескольких кусков кода, исполняемых следующим образом (при создании и изменении параметров элемента): сначала исполняется блок Master, Properties, Parameter, и, в зависимости от текущего вида — 3D или 2D. При этом, надо очень чётко понимать, что 2D — это вид в плане, то есть он не обязан соответствовать виду в 3D, или в разрезе/на фасаде. То есть я могу написать ему, чтобы он на плане показывал круг, а в 3D и на фасаде он будет в виде звезды. Кактебетакое,илонмаск? С одной стороны, это позволяет сэкономить на проецировании, но с другой — это не даёт реальной честной модели на плане, как это происходит в Ревите, например.

Егор Глебов поправляет в чате канала: «Ты бы всё-таки говорил, что это всё В ДОПОЛНЕНИЕ к тому, что архикад строит честную проекцию. То есть сделать кастомное 2D отображение — это опция, а не единственный возможный вариант. Классическая команда PROJECT2.»

Поскольку для меня эта команда никогда не применима, упустил этот момент. Однако, от этого не легче.

Кроме того, из-за структуры программы, при каждом изменении параметров, элемент перерисовывает себя, и снова исполняет все эти блоки кода. Это не современный объектно-ориентированный подход с эвентной моделью, а какой-то древний атавизм, в определённых случаях не ускоряющий работу модели, а наоборот — замедляющий.

Не говоря о том, что в ГДЛ отсутствуют многие функции, распространённые в современных языках.

Например, попробуйте догадаться, как работает вот этот код:

_newStr = ""        ! intialize a new empty string

! _currStr = "12,10"
len = STRLEN (numberToStripZeroes  )
_newStr = STRSUB (numberToStripZeroes  , len - 2, len)
if _newStr = ",00" then
    _newStr = STRSUB (numberToStripZeroes  , 0, len-3)
else
    _newStr = numberToStripZeroes  
endif

Это фрагмент вот этого кода:

eps = 0.0001
paperToModel = GLOB_SCALE/1000

define style  'txtStyle'  AC_TextFont_1, AC_TextSize_1, 8, AC_TextStyle_1
style 'txtStyle'

rot2 -90

unid=1
ms=AC_MarkerSize*paperToModel
bb=ms*1.5

hotspot2 -bb,   0 
hotspot2 bb+ms, 0


line2 -bb, 0, bb+ms, 0
add2 bb+ms, 0
line2 0, 0, -ms, -ms*0.3
line2 0, 0, -ms, ms*0.3
del 1


xPos = 0
yPos = 0



if show_slope_inclination = 1 then
    r = request ("View_Rotangle", "", _angleViewRot)
    _totalRotate = (SYMB_ROTANGLE + _angleViewRot) MOD 360
    if (_totalRotate > (90 + EPS) & _totalRotate < (270 + EPS)) then
        rot2 180
    endif

!   if SYMB_ROTANGLE > 180+EPS OR SYMB_ROTANGLE < EPS then ROT2 180
    
    if inclination_in_percents then an_gle=STR(TAN(ROOF_ANGLE)*100, 3, 2)
    
    
    ! SAVE THE TEXT VARIABLE BEFORE THE STRIPPING PROCESS
    if inclination_in_percents then
        numberToStripZeroes = an_gle
    else
        numberToStripZeroes = STR(ROOF_ANGLE, 3, 2)
    endif


    ! STRIP ZEROES FROM THE END
    _newStr = ""        ! intialize a new empty string

    ! _currStr = "12,10"
    len = STRLEN (numberToStripZeroes  )
    _newStr = STRSUB (numberToStripZeroes  , len - 2, len)
    if _newStr = ",00" then
        _newStr = STRSUB (numberToStripZeroes  , 0, len-3)
    else
        _newStr = numberToStripZeroes  
    endif
    
    
    ! OUTPUT THE TEXT
    if inclination_in_percents then
        TEXT2 xPos, yPos, "i = "+ _newStr +"%"
    else
        TEXT2 xPos, yPos, "i = "+ _newStr +"°"
    endif

endif

В современных ЯП убрать нули из конца строки очень легко, обычно для этого есть специальная функция. Более того, насколько я понял, обратиться к индексу строки (символу в строке) тут напрямую нельзя. Это очень неудобно, и странно. Обычно, в общем виде, можно написать что-то вроде string[12], и получить символ номер 12 из строки string.


Может быть интересно:


Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!
Telegram!

Подпишитесь на обновления



* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных