Как устроен 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!

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



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