blog/
Как устроен GDL элемент и почему Архикад устарел
Что касается Архикада и взаимосвязи 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.
Может быть интересно:
- Маркер уклона для ArchiCAD
- Распечатать дерево проекта в ArchiCAD 23 через Python
- Про Python и ArchiCAD: удалить лишние слои
- Вывод дерева файлов через Питон
- Calculate inclination of a roof valley with Python