Вероятно всеки, който се е занимавал професионално с проектиране (най-вече в областта на строителството, дизайна и други), има своите предпочитания към софтуерния продукт, който ползва ежедневно и който му спестява един куп усилия, за по-лесно и удобно решаване на проектантски проблеми и задачи. За съжаление всеки продукт обикновено заедно със своите предимства, носи и своите ограничения и недостатъци, независимо дали говорим за Архикад, Ревид, 3DsMax, АutoCad и др. Може би единствено AutoCAD не беше подходящ за горния списък, тъй като личното ми мнение е, че той носи със себе си единствено и само недостатъци, без нито едно предимство, пред който и да е друг софтуер за 3D моделиране и изготвяне на чертежи :). В съвременния свят, предоставящ възможност за работа едновременно в 3D и 2D без късане на връзката между модела, чертежа и количествата, смятам за крайно неадекватно, че в практиката все още масово се работи с някакви двумерни драсканици, наречени чертежи, които не дават никаква пространствена представа за цялостното решение, включващо всички специалности (архитектура, ОВК, ВиК, конструкция и т.н.) и по този начин се дава предпоставка за допускане на множество конфликтни места в проекта, които се установяват обикновено на късен етап, по време на строителството. Дотук с AutoCAD и производните нему проблеми. 🙂 Сега ще започна с истинската идея на тази статия, а именно една добавка под формата на GDL обект за Архикад.
Ето линк към GDL обекта: BezierSurfaceDPY-v14–11-01-2013.gsm
Принципно обекта е писан за ArchiCAD 14. Разбира се съвсем спокойно ще тръгне на по-новите версии, както между впрочем и на по-ниските (за по ниските ще трябва първо да се зареди като библиотечен елемент в Архикад 14 и след това документа да се запише на по-ниска версия).
Каква е идеята на обекта и каква беше причината да хвърля усилието и да го напиша? По принцип, започвайки да работя на Архикад преди години, в началото мислех, че това е една ужасна програма, поставяща огромни да ги наречем творчески ограничения върху проектантската дейност. В последствие обаче, посвиквайки с основните идеи на програмата, трябва да кажа, че наистина отчитам голямото усилие, което е хвърлено, за да може програмата наистина да бъде изключително в помощ на проектанта за бързо и качествено изготвяне на целия проект от концептуалното моделиране и измисляне, до създаване на детайлен 3D модел и съпътстващите го задължителни двумерни чертежи. Най-хубавото е, че веднъж хвърлено усилието за правилно изграждане на работния модел, в последствие всички промени, които се налагат (като каприз на инвеститора или дори собствен каприз на проектанта) не представляват особен проблем и времето за нанасянето на корекциите и отразяването им на всички чертежи става наистина малко поради неразривната връзка между модела и чертежа.
И все пак наред с предимствата, за съжаление до голяма степен проблема с творческото ограничение, свързано с ограниченията в тримерното моделиране, които налага програмата, все още не е добре решен (макар и в новите версии на Архикад да се правят такива опити, все още са доста назад от това, което бих желал да се случи). Използването на външни програми за моделиране като 3DsMax например изобщо не е добър вариант, тъй като от една страна се къса връзка с модела, от друга страна 3DsMax работи равнини елементи (лица, ръбове и върхове), което при големи модели отнема ужасно много памет, с която съвременните компютри просто не разполагат (в офиса, в който работя съм използвал наистина мощни съвременни машини и дори те срещат сериозни затруднения със справянето с такива модели). Дори и да можеха да се справят с големите модели, самият факт че обемите не са плътни (имат само лица, ръбове и върхове) усложнява работата върху чертежите, тъй като при разрез през такъв обект, вместо да се получи разрез през плътно тяло се получава разрез през куха кутия, което в последствие трябва да се оправя ръчно и е доста досадно.
Ето защо, решавайки всички тези проблеми, аз се обърнах към вградения в Архикад GDL script, който позволява сравнително лесно моделиране на параметрични геометрични (макар и не задължително) обекти. Хубавото е, че тези обекти дават възможност да бъдат плътни, което при големи обекти работи много по-добре откъм памет в сравнение с кухите многостени, а освен това се поддържат всички настройки за разрез и 2D графика, които се поддържат в Архикад.
В случая за целта аз съм използвал небезизвестната повърнина, на името на открилия я френския математик и инженер Пиер Безие. Повърхнината се дефинира посредством интерполирането между няколко наброй наредени точки в пространството. Нямам за цел в статията да обяснявам математическата дефиниция на самата повърхнина, макар и да я смятам за доста интересна. На читателя, който се интересува, бих препоръчал две статии от wikipedia: Bezier surface и Bezier curve, като особено втората статия считам за изключително полезна, тъй като кривите на Безие са в основата на цялата идея и разбирайки ги тях почти няма да има проблем с разбирането на повърхнините на Безие (повърнините се получават в следствие на интерполиране между няколко наредени пространствени криви на Безие). Във втората статия има много полезни анимирани картинки, които наистина много нагледно показват идеята за формообразуването в зависимост от степента на кривата (от броя на контролните точки).
След като заредите обекта като библиотечен елемент в Архикад (през Library manager), ще можете да го намерите при другите GDL обекти в Embedded Library и маркирайки елемента ще видите подобен на долния екран с настройките на съответния обект.
Тук е мястото да кажа, че самият обект е разработван за лични цели(за да мога успешно да моделирам дипломния си проект, към който ще дам снимки по-долу), поради което не всички функционалности са напълно завършени (оказа се че съчетаването едновременно на работа в архитектурно ателие, ученето за Telerik Academy и правенето на дипломна работа в университета не е много лесно да се реализира :)). Ще се опитам спомена по-надолу накратко какво съм успял да постигна и за какво не ми е стигнало времето, но съм имал доброто желание 🙂 и може би в някакъв бъдещ момент в следваща версия на GDL обекта, ще направя необходимите добавки.
По менюто в частта Parameters – тук се съдържат абсолютно всички параметри за контролирането на обекта. Ще карам точка по точка:
- Точки на Безие – Това са координатите на 16те точки контролиращи кривата. На практика тези параметри не се използват от потребителя (координатите автоматично си се генерират и прегенерират при местенето на hotspot-овете и при прилагането на различни трансформации към обекта (като хомотетия например). Важна обаче е опцията режим на кривата – при линейния режим се работи само с 4 контролни точки, което е в пъти по лесно за контролиране, отколкото кубичния режим с 16 точки. С линейния режим обаче може да се постига единствено формата Хиперболичен-параболоид (което е би-линейна повърхнина на Безие и съответно често е наричана и праволинейна повърхнина). Кубичният режим позволява много по-голям контрол над кривината и тангентите на повърхнината, поради което могат да се постигат много по-разнообразни и интересни форми. Моят принцип на работа е следния – в началото си пускам линейния режим докато си наместя годе долу контурните точки, както си ги представям, че трябва да станат. След това включвам кубичния режим и си играя с другите точки така че да измоделирам желаната финална форма.
- Гъстота на мрежата – тук имате възможност да контролирате гъстотата на мрежата в двете направления на повърхнината, което е важно както за гладкостта на кривата, така и за растера (ако например моделирате остъклена фасада и търсите постигане на някакъв растер с определени ограничения в размерите на полетата). Мрежата се начленява на равни интервали за u и v (двата параметъра дефиниращи формообразуването на тази параметрична крива).
- 3D детайли – Тук се намират основните параметри, които ще са предполагам доста често използвани. Това се параметрите за оразмеряване на сеченията на елементите, както и за включването/изключването на всеки вид от тях (линейни елементи – могат да бъдат както цилиндрични, така и тънки линии, така и да липсват; повърхнинни елементи – могат да имат дебелина, могат и да са плоски, могат и да липсват; контролни елементи – линии и точки използвани за визуализирането на контролните точки дефиниращи кривата).
- Hotspots – Това е доста важна секция, даваща поне за мен най-добрата функционалност на обекта с възможността той да бъде моделиран посредством “горещи точки” :). За по удобна работа в 3D в зависимост от целите, може да се включва/изключва възможността за придвижване по всяка една от 3-те посоки x, y или z, както в 3D така и в план.
- Материали – ами тук се настройват материалите на различните елементи(линейни, повърхнини и др.)
- 2D графика – това са рапидографите и щрихите използвани при изготвянето на двумерните чертежи
- Скрий – това е една функционалност, която добавих в последния момент за направата на дипломната ми, поради необходимостта да скрия диагоналните елементи в мрежата. Тази функционалност не е довършена в частите си различни от скриване на диагонали.
По менюто в UI частта кръстена “Повърхнина на Безие – Деян Йосифов – 11.01.2013 година” – тази секция съдържа елементи от частта Parameters, които съм сметнал за най-важни и за които съм искал да има бърз и лесен достъп чрез UI частта. Единствената част, която е нова в сравнение с частта Parameters, е секцията “Трансформации”, където може да се извърши грубо оразмеряване на повърхнината с хомотетии по x, y или z. Това е полезно, когато например начално имате повърнина с размери 2 на 2 метра, а вие искате да направите нещо доста по-голямо с размерите да речем 20 на 20. Вместо да местите всяка от контролните точки, може просто да напишете необходимия коефициент за хомотетия в необходимата посока (за горния пример коефициента е 10 тъй като искаме 10 пъти да се увеличи размера). След като сте въвели коефициента, за да стане активно оразмеряването трябва да цъкнете на бутона до съответната форма за коефициента (например бутона “Хомотетия по X”).
Това е накратко за постигнатите към този момент опции и функционалности. Ето и няколко картинки от моята дипломна работа (на тема футболен стадион), за моделирането на която съм използвал показания горе GDL обект:
На края на статията ще се опитам с няколко думи да обясня идеята на имплементацията. Като начало каква е идеята на писането на GDL script и къде човек може да се научи как точно се прави това? Ами отговорът е доста лесен – в Help менюто на Архикад може да намерите pdf файл на име GDL Reference Guide, където е описана цялата идея в сравнително кратка документация с линкове между страниците. Ето и screenshot къде точно се намира документацията:
Като цяло GDL е изключително прост и окастрен откъм опции скриптов език. Под окастрен имам предид, че няма възможност да пишете собствени методи и функции, няма while цикъл и други такива иначе толкова полезни неща, имащи ги в нормалните езици за програмиране :). От към цикли езикът разполага с For цикъл. Също така има If-Else функционалност, което е добре :). Има GoTo, което по принцип е ужасно, но в краен случай може и до него да опрете, предвид липсата на while цикъл. Има опции да вкарвате някакви данни във буфера с командата Put и в последствие с командата Get или командата Use да използвате определен брой стойности от буфера, който работи на принципа на опашката (пръв влязъл пръв излиза). Идеята на този буфер е ако генерирате с някакъв цикъл да речем някакви параметри (да кажем координати) след това да може да ги използвате в някоя от вградените в GDL функции. Разгледайте документацията. Любопитно е :).
Как е организиран конкретния GDL обект. За да го отворите трябва да отидете във File -> Libraries and Objects -> Open object и ако сте маркирали преди това обекта то така ще отворите неговия script.
В секцията Parameters се дефинират параметрите на обекта като всеки параметър си има име, тип(дължина, ъгъл, рапитограф, щрих, булев, текст и др.) и начална стойност. Имената на параметрите ще се използват в последствие в скрипта.
Следващата важна секция е Master script. Там се съдържа както 2D, така и 3D, така и всякакъв друг скрипт, който е важно да се знае, че се изпълнява преди всеки друг скрипт. Тук аз си инициализирам началните масиви, необходими за запаметяване на координатите на точките от мрежата, както и си пресмятам всички точки от мрежата в зависимост от режима на кривата (линеен или кубичен). Ето го и скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | UNid = 1 !!!---Transform Variables Declaration---!!! DIM ii[3] DIM jj[3] DIM kk[3] length = 0 !!!---END Transform Variables Declaration---!!! !!!---HyperbolicParapoloidMode---!!! IF mode = "ëèíååí" THEN PARAMETERS bx[1][2] = (2/3)*bx[1][1] + (1/3)*bx[1][4] PARAMETERS bx[1][3] = (1/3)*bx[1][1] + (2/3)*bx[1][4] PARAMETERS by[1][2] = (2/3)*by[1][1] + (1/3)*by[1][4] PARAMETERS by[1][3] = (1/3)*by[1][1] + (2/3)*by[1][4] PARAMETERS bz[1][2] = (2/3)*bz[1][1] + (1/3)*bz[1][4] PARAMETERS bz[1][3] = (1/3)*bz[1][1] + (2/3)*bz[1][4] PARAMETERS bx[4][2] = (2/3)*bx[4][1] + (1/3)*bx[4][4] PARAMETERS bx[4][3] = (1/3)*bx[4][1] + (2/3)*bx[4][4] PARAMETERS by[4][2] = (2/3)*by[4][1] + (1/3)*by[4][4] PARAMETERS by[4][3] = (1/3)*by[4][1] + (2/3)*by[4][4] PARAMETERS bz[4][2] = (2/3)*bz[4][1] + (1/3)*bz[4][4] PARAMETERS bz[4][3] = (1/3)*bz[4][1] + (2/3)*bz[4][4] PARAMETERS bx[2][1] = (2/3)*bx[1][1] + (1/3)*bx[4][1] PARAMETERS bx[3][1] = (1/3)*bx[1][1] + (2/3)*bx[4][1] PARAMETERS by[2][1] = (2/3)*by[1][1] + (1/3)*by[4][1] PARAMETERS by[3][1] = (1/3)*by[1][1] + (2/3)*by[4][1] PARAMETERS bz[2][1] = (2/3)*bz[1][1] + (1/3)*bz[4][1] PARAMETERS bz[3][1] = (1/3)*bz[1][1] + (2/3)*bz[4][1] PARAMETERS bx[2][4] = (2/3)*bx[1][4] + (1/3)*bx[4][4] PARAMETERS bx[3][4] = (1/3)*bx[1][4] + (2/3)*bx[4][4] PARAMETERS by[2][4] = (2/3)*by[1][4] + (1/3)*by[4][4] PARAMETERS by[3][4] = (1/3)*by[1][4] + (2/3)*by[4][4] PARAMETERS bz[2][4] = (2/3)*bz[1][4] + (1/3)*bz[4][4] PARAMETERS bz[3][4] = (1/3)*bz[1][4] + (2/3)*bz[4][4] PARAMETERS bx[2][2] = (2/3)*bx[1][2] + (1/3)*bx[4][2] PARAMETERS bx[3][2] = (1/3)*bx[1][2] + (2/3)*bx[4][2] PARAMETERS by[2][2] = (2/3)*by[1][2] + (1/3)*by[4][2] PARAMETERS by[3][2] = (1/3)*by[1][2] + (2/3)*by[4][2] PARAMETERS bz[2][2] = (2/3)*bz[1][2] + (1/3)*bz[4][2] PARAMETERS bz[3][2] = (1/3)*bz[1][2] + (2/3)*bz[4][2] PARAMETERS bx[2][3] = (2/3)*bx[1][3] + (1/3)*bx[4][3] PARAMETERS bx[3][3] = (1/3)*bx[1][3] + (2/3)*bx[4][3] PARAMETERS by[2][3] = (2/3)*by[1][3] + (1/3)*by[4][3] PARAMETERS by[3][3] = (1/3)*by[1][3] + (2/3)*by[4][3] PARAMETERS bz[2][3] = (2/3)*bz[1][3] + (1/3)*bz[4][3] PARAMETERS bz[3][3] = (1/3)*bz[1][3] + (2/3)*bz[4][3] ENDIF !!!---END HyperbolicParapoloidMode---!!! !!!---Points Preparations---!!! IF MAX(u, v)>-1 AND MAX(u, v)9 AND MAX(u, v)19 AND MAX(u, v)29 AND MAX(u, v)39 AND MAX(u, v)49 AND MAX(u, v)59 AND MAX(u, v)69 AND MAX(u, v)79 AND MAX(u, v)89 AND MAX(u, v) |
Тук е мястото да спомена, че коментарите в GDL започват със знака “!”. Такива съм използвал доста, дори само за лично удобство, за да се ориентирам по-лесно в кода (както казах тук няма методи и други такива улеснения, така че писането е доста).
Следва 2D скрипта. Там се дефинира двумерната графика в плана, която в случая съм задал да бъде просто Монжова проекция на обекта отгоре. Тук също така се дефинират и хотспотовете, които са за плана.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | pen linii fill fill_type project2{2} 3, 270, 32+3, back_pen, 0, 0, 90 !!!---Hotspots2D---!!! IF Hotspots2D THEN FOR i=1 TO 4 FOR j=1 TO 4 IF mode = "êóáè÷åí" OR (mode = "ëèíååí" AND (i=1 OR i=4) AND (j=1 OR j=4)) THEN hotspot2 bx[i][j], by[i][j], UNid, bx[i][j], 2 : UNid=UNid+1 hotspot2 0, by[i][j], UNid, bx[i][j], 1 + 128 : UNid=UNid+1 hotspot2 -1, by[i][j], UNid, bx[i][j], 3 : UNid=UNid+1 hotspot2 bx[i][j], by[i][j], UNid, by[i][j], 2 : UNid=UNid+1 hotspot2 bx[i][j], 0, UNid, by[i][j], 1 + 128 : UNid=UNid+1 hotspot2 bx[i][j], -1, UNid, by[i][j], 3 : UNid=UNid+1 ENDIF NEXT j NEXT i ENDIF !!!---END Hotspots2D---!!! |
Следва 3D скрипта, който разбира се е основната част от имплементацията. Там в зависимост от стойностите на параметрите генерирам необходимите 3-мерни обекти, както и hotspots, отново ако са включени от потребителя като параметри. В тази част от кода има множество линейни трансформации, повечето от който ги правя чрез матрица на трансформациите, тъй като повечето обекти в GDL скрипт се генерират от готови функции, изискващи смяната на координатната система.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | !PRINT SYMB_POS_X, SYMB_POS_Y, SYMB_POS_Z !RULED{2} 3, 1+2+4 +16+32, ! !0, 0, 1, !1, 0, 1, !0, 1, 1, ! !0, 0, 5, !1, 0, 5, !1, 1, 5 !!!---Create LINEAR Geometry---!!! !!!---Linii---!!! IF linearElements = "ëèíèè" AND surfaceElements <> "coon" THEN PEN colorLines FOR i=1 TO u FOR j=1 TO v IF NOT(hideDiagonals) THEN LIN_ px[i][j], py[i][j], pz[i][j], px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1] ENDIF LIN_ px[i][j], py[i][j], pz[i][j], px[i+1][j], py[i+1][j], pz[i+1][j] LIN_ px[i][j], py[i][j], pz[i][j], px[i][j+1], py[i][j+1], pz[i][j+1] IF i = u THEN LIN_ px[i+1][j], py[i+1][j], pz[i+1][j], px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1] ENDIF IF j = v THEN LIN_ px[i][j+1], py[i][j+1], pz[i][j+1], px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1] ENDIF NEXT j NEXT i ENDIF IF linearElements = "ëèíèè" AND surfaceElements = "coon" THEN PEN colorLines FOR i=1 TO u LIN_ px[i][1], py[i][1], pz[i][1], px[i+1][1], py[i+1][1], pz[i+1][1] LIN_ px[i][v+1], py[i][v+1], pz[i][v+1], px[i+1][v+1], py[i+1][v+1], pz[i+1][v+1] NEXT i FOR i=1 TO v LIN_ px[1][i], py[1][i], pz[1][i], px[1][i+1], py[1][i+1], pz[1][i+1] LIN_ px[u+1][i], py[u+1][i], pz[u+1][i], px[u+1][i+1], py[u+1][i+1], pz[u+1][i+1] NEXT i ENDIF !!!---END Linii---!!! !!!---Mnogosteni---!!! MATERIAL matLinears PEN linii IF linearElements = "ìíîãîñòåíè" AND rr > 0 AND surfaceElements = "coon" THEN RESOL sides FOR i=1 TO u kk[1] = px[i+1][1] - px[i][1] kk[2] = py[i+1][1] - py[i][1] kk[3] = pz[i+1][1] - pz[i][1] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][1], ii[2], jj[2], kk[2], py[i][1], ii[3], jj[3], kk[3], pz[i][1] CYLIND length, rr DEL 1 ENDIF kk[1] = px[i+1][v+1] - px[i][v+1] kk[2] = py[i+1][v+1] - py[i][v+1] kk[3] = pz[i+1][v+1] - pz[i][v+1] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][v+1], ii[2], jj[2], kk[2], py[i][v+1], ii[3], jj[3], kk[3], pz[i][v+1] CYLIND length, rr DEL 1 ENDIF NEXT i FOR i=1 TO v kk[1] = px[1][i] - px[1][i+1] kk[2] = py[1][i] - py[1][i+1] kk[3] = pz[1][i] - pz[1][i+1] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[1][i+1], ii[2], jj[2], kk[2], py[1][i+1], ii[3], jj[3], kk[3], pz[1][i+1] CYLIND length, rr DEL 1 ENDIF kk[1] = px[u+1][i] - px[u+1][i+1] kk[2] = py[u+1][i] - py[u+1][i+1] kk[3] = pz[u+1][i] - pz[u+1][i+1] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[u+1][i+1], ii[2], jj[2], kk[2], py[u+1][i+1], ii[3], jj[3], kk[3], pz[u+1][i+1] CYLIND length, rr DEL 1 ENDIF NEXT i ENDIF !!!--- Not coon ---!!! IF linearElements = "ìíîãîñòåíè" AND rr > 0 AND surfaceElements <> "coon" THEN RESOL sides FOR i=1 TO u FOR j=1 TO v IF NOT(hideDiagonals) THEN kk[1] = px[i+1][j+1] - px[i][j] kk[2] = py[i+1][j+1] - py[i][j] kk[3] = pz[i+1][j+1] - pz[i][j] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][j], ii[2], jj[2], kk[2], py[i][j], ii[3], jj[3], kk[3], pz[i][j] CYLIND length, rr DEL 1 ENDIF ENDIF kk[1] = px[i+1][j] - px[i][j] kk[2] = py[i+1][j] - py[i][j] kk[3] = pz[i+1][j] - pz[i][j] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][j], ii[2], jj[2], kk[2], py[i][j], ii[3], jj[3], kk[3], pz[i][j] CYLIND length, rr DEL 1 ENDIF kk[1] = px[i][j+1] - px[i][j] kk[2] = py[i][j+1] - py[i][j] kk[3] = pz[i][j+1] - pz[i][j] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][j], ii[2], jj[2], kk[2], py[i][j], ii[3], jj[3], kk[3], pz[i][j] CYLIND length, rr DEL 1 ENDIF IF i = u THEN kk[1] = px[i+1][j+1] - px[i+1][j] kk[2] = py[i+1][j+1] - py[i+1][j] kk[3] = pz[i+1][j+1] - pz[i+1][j] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i+1][j], ii[2], jj[2], kk[2], py[i+1][j], ii[3], jj[3], kk[3], pz[i+1][j] CYLIND length, rr DEL 1 ENDIF ENDIF IF j = v THEN kk[1] = px[i+1][j+1] - px[i][j+1] kk[2] = py[i+1][j+1] - py[i][j+1] kk[3] = pz[i+1][j+1] - pz[i][j+1] IF kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] > 0 THEN IF ABS(kk[1]) < 0.0001 AND ABS(kk[2]) < 0.0001 THEN ii[1] = 1 ii[2] = 0 ii[3] = 0 ELSE ii[1] = -kk[2] ii[2] = kk[1] ii[3] = 0 length = SQR(ii[1]*ii[1] + ii[2]*ii[2]) ii[1] = ii[1]/length ii[2] = ii[2]/length ENDIF length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) kk[1] = kk[1]/length kk[2] = kk[2]/length kk[3] = kk[3]/length jj[1] = ii[2]*kk[3] - ii[3]*kk[2] jj[2] = ii[3]*kk[1] - ii[1]*kk[3] jj[3] = ii[1]*kk[2] - ii[2]*kk[1] XFORM ii[1], jj[1], kk[1], px[i][j+1], ii[2], jj[2], kk[2], py[i][j+1], ii[3], jj[3], kk[3], pz[i][j+1] CYLIND length, rr DEL 1 ENDIF ENDIF NEXT j NEXT i ENDIF !!!---END Mnogosteni---!!! !!!---END Create LINEAR Geometry---!!! !!!---SURFACE Geometry---!!! MATERIAL matSurface !PEN linii PEN liniiSurface !!!---Create FACE Geometry---!!! IF surfaceElements = "ëèöà" THEN FOR i=1 TO u FOR j=1 TO v ii[1] = px[i+1][j+1] - px[i][j] ii[2] = py[i+1][j+1] - py[i][j] ii[3] = pz[i+1][j+1] - pz[i][j] jj[1] = px[i+1][j] - px[i][j] jj[2] = py[i+1][j] - py[i][j] jj[3] = pz[i+1][j] - pz[i][j] kk[1] = ii[2]*jj[3] - ii[3]*jj[2] kk[2] = ii[3]*jj[1] - ii[1]*jj[3] kk[3] = ii[1]*jj[2] - ii[2]*jj[1] length = kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] IF (length > 0.0001) THEN PLANE_ 3, px[i][j], py[i][j], pz[i][j], 1, px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1], 1, px[i+1][j], py[i+1][j], pz[i+1][j], 1 ENDIF ii[1] = px[i+1][j+1] - px[i][j] ii[2] = py[i+1][j+1] - py[i][j] ii[3] = pz[i+1][j+1] - pz[i][j] jj[1] = px[i][j+1] - px[i][j] jj[2] = py[i][j+1] - py[i][j] jj[3] = pz[i][j+1] - pz[i][j] kk[1] = ii[2]*jj[3] - ii[3]*jj[2] kk[2] = ii[3]*jj[1] - ii[1]*jj[3] kk[3] = ii[1]*jj[2] - ii[2]*jj[1] length = kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3] IF (length > 0.0001) THEN PLANE_ 3, px[i][j], py[i][j], pz[i][j], 1, px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1], 1, px[i][j+1], py[i][j+1], pz[i][j+1], 1 ENDIF NEXT j NEXT i ENDIF !!!---END Create FACE Geometry---!!! !!!---Create COONS Geometry---!!! IF surfaceElements = "coons" THEN FOR i=1 TO u FOR j=1 TO v COONS 2, 2, 0, px[i][j], py[i][j], pz[i][j] ,px[i][j+1], py[i][j+1], pz[i][j+1], px[i+1][j], py[i+1][j], pz[i+1][j] ,px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1], px[i][j], py[i][j], pz[i][j] ,px[i+1][j], py[i+1][j], pz[i+1][j], px[i][j+1], py[i][j+1], pz[i][j+1] ,px[i+1][j+1], py[i+1][j+1], pz[i+1][j+1] NEXT j NEXT i ENDIF !!!---END Create COONS Geometry---!!! !!!---Create COON Geometry---!!! IF surfaceElements = "coon" THEN FOR i=1 to u+1 PUT px[i][1] PUT py[i][1] PUT pz[i][1] NEXT i FOR i=1 to u+1 PUT px[i][v+1] PUT py[i][v+1] PUT pz[i][v+1] NEXT i FOR i=1 to v+1 PUT px[1][i] PUT py[1][i] PUT pz[1][i] NEXT i FOR i=1 to v+1 PUT px[u+1][i] PUT py[u+1][i] PUT pz[u+1][i] NEXT i COONS u+1, v+1, 0, GET(6*(u+v+2)) ENDIF !!!---END Create COON Geometry---!!! !!!---Create PRISM Geometry---!!! IF surfaceElements = "ïðèçìè" and thickness > 0 THEN FOR i=1 TO u FOR j=1 TO v ii[1] = px[i+1][j+1] - px[i][j] ii[2] = py[i+1][j+1] - py[i][j] ii[3] = pz[i+1][j+1] - pz[i][j] jj[1] = px[i+1][j] - px[i][j] jj[2] = py[i+1][j] - py[i][j] jj[3] = pz[i+1][j] - pz[i][j] kk[1] = ii[2]*jj[3] - ii[3]*jj[2] kk[2] = ii[3]*jj[1] - ii[1]*jj[3] kk[3] = ii[1]*jj[2] - ii[2]*jj[1] length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) IF (length > 0.0001) THEN XFORM ii[1], jj[1], kk[1]/length, px[i][j] - (kk[1]/length)*(thickness/2), ii[2], jj[2], kk[2]/length, py[i][j] - (kk[2]/length)*(thickness/2), ii[3], jj[3], kk[3]/length, pz[i][j] - (kk[3]/length)*(thickness/2) PRISM 3, thickness, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0 DEL 1 ENDIF ii[1] = px[i][j+1] - px[i][j] ii[2] = py[i][j+1] - py[i][j] ii[3] = pz[i][j+1] - pz[i][j] jj[1] = px[i+1][j+1] - px[i][j] jj[2] = py[i+1][j+1] - py[i][j] jj[3] = pz[i+1][j+1] - pz[i][j] kk[1] = ii[2]*jj[3] - ii[3]*jj[2] kk[2] = ii[3]*jj[1] - ii[1]*jj[3] kk[3] = ii[1]*jj[2] - ii[2]*jj[1] length = SQR(kk[1]*kk[1] + kk[2]*kk[2] + kk[3]*kk[3]) IF (length > 0.0001) THEN XFORM ii[1], jj[1], kk[1]/length, px[i][j] - (kk[1]/length)*(thickness/2), ii[2], jj[2], kk[2]/length, py[i][j] - (kk[2]/length)*(thickness/2), ii[3], jj[3], kk[3]/length, pz[i][j] - (kk[3]/length)*(thickness/2) PRISM 3, thickness, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0 DEL 1 ENDIF NEXT j NEXT i ENDIF !!!---END Create PRISM Geometry---!!! !!!---END SURFACE Geometry---!!! !!!---Hotspots And Controls Geometry---!!! IF HotspotsX OR HotspotsY OR HotspotsZ THEN FOR i=1 TO 4 FOR j=1 TO 4 IF mode = "êóáè÷åí" OR (mode = "ëèíååí" AND (i=1 OR i=4) AND (j=1 OR j=4)) THEN IF HotspotsX THEN hotspot bx[i][j], by[i][j], bz[i][j], UNid, bx[i][j], 2 : UNid=UNid+1 hotspot 0, by[i][j], bz[i][j], UNid, bx[i][j], 1 + 128 : UNid=UNid+1 hotspot -1, by[i][j], bz[i][j], UNid, bx[i][j], 3 : UNid=UNid+1 ENDIF IF HotspotsY THEN hotspot bx[i][j], by[i][j], bz[i][j], UNid, by[i][j], 2 : UNid=UNid+1 hotspot bx[i][j], 0, bz[i][j], UNid, by[i][j], 1 + 128 : UNid=UNid+1 hotspot bx[i][j], -1, bz[i][j], UNid, by[i][j], 3 : UNid=UNid+1 ENDIF IF HotspotsZ THEN hotspot bx[i][j], by[i][j], bz[i][j], UNid, bz[i][j], 2 : UNid=UNid+1 hotspot bx[i][j], by[i][j], 0, UNid, bz[i][j], 1 + 128 : UNid=UNid+1 hotspot bx[i][j], by[i][j], -1, UNid, bz[i][j], 3 : UNid=UNid+1 ENDIF IF VertexCubesSide > 0 THEN MATERIAL matPoints ADD bx[i][j] - VertexCubesSide/2, by[i][j] - VertexCubesSide/2, bz[i][j] - VertexCubesSide/2 BLOCK VertexCubesSide, VertexCubesSide, VertexCubesSide DEL 1 ENDIF ENDIF IF lines AND mode = "êóáè÷åí" THEN PEN penLinii tx = 1 ty = 1 LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] tx = 1 ty = 3 LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] tx = 3 ty = 1 LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] tx = 3 ty = 3 LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] LIN_ bx[tx][ty], by[tx][ty], bz[tx][ty], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx + 1][ty], by[tx + 1][ty], bz[tx + 1][ty] LIN_ bx[tx + 1][ty + 1], by[tx + 1][ty + 1], bz[tx + 1][ty + 1], bx[tx][ty + 1], by[tx][ty + 1], bz[tx][ty + 1] ENDIF NEXT j NEXT i ENDIF !!!---END Hotspots---!!! |
Следващият скрипт е Parameter script, където се задават възможните стойности на някои параметрите с изборна стойност, както и там се дефинира кореспонденцията между UI бутоните за хомотетия и пресмятането на новите стойности на координатите след хомотетията.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | VALUES "mode", "êóáè÷åí", "ëèíååí" VALUES "surfaceElements", "ïðèçìè", "ëèöà", "áåç", "coons", "coon" VALUES "linearElements", "áåç", "ìíîãîñòåíè", "ëèíèè" IF linearElements <> "ìíîãîñòåíè" THEN LOCK "rr", "sides" ENDIF IF linearElements <> "ëèíèè" THEN LOCK "colorLines" ENDIF IF surfaceElements = "áåç" OR surfaceElements = "ëèöà" THEN LOCK "thickness" ENDIF IF lines = 0 THEN LOCK "penLinii" ENDIF !!!---Transformation Group---!!! IF GLOB_UI_BUTTON_ID = 1 THEN temp = 0 FOR i=1 TO 4 FOR j=1 TO 4 temp = temp + bx[i][j] NEXT j NEXT i temp = temp/16 FOR i=1 TO 4 FOR j=1 TO 4 PARAMETERS bx[i][j] = homX * bx[i][j] + (1 - homX)*temp NEXT j NEXT i PARAMETERS homX = 1 ENDIF IF GLOB_UI_BUTTON_ID = 2 THEN temp = 0 FOR i=1 TO 4 FOR j=1 TO 4 temp = temp + by[i][j] NEXT j NEXT i temp = temp/16 FOR i=1 TO 4 FOR j=1 TO 4 PARAMETERS by[i][j] = homY * by[i][j] + (1- homY)*temp NEXT j NEXT i PARAMETERS homY = 1 ENDIF IF GLOB_UI_BUTTON_ID = 3 THEN temp = 0 FOR i=1 TO 4 FOR j=1 TO 4 temp = temp + bz[i][j] NEXT j NEXT i temp = temp/16 FOR i=1 TO 4 FOR j=1 TO 4 PARAMETERS bz[i][j] = homZ * bz[i][j] + (1- homZ)*temp NEXT j NEXT i PARAMETERS homZ = 1 ENDIF !!!---END Transformation Group---!!! |
И последният скрипт е Interface script, където се дефинира прозореца от UI частта с бутоните и fieldset-ове.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | UI_DIALOG "Ïîâúðõíèíà íà Áåçèå - Äåÿí Éîñèôîâ - 11.01.2013 ãîäèíà" !!!---Size is 444 x 266---!!! !!!---Transformation Group---!!! x = 10 y = 10 UI_GROUPBOX "Òðàíñôîðìàöèè", x, y, 202, 125 UI_BUTTON UI_FUNCTION, "Õîìîòåòèÿ ïî X", x+10, y+20, 100,20, 1 UI_INFIELD{3} homX, x+120, y+20, 60, 20 !UI_OUTFIELD "> 0", x+135+33, y+20+3, 30, 20 UI_BUTTON UI_FUNCTION, "Õîìîòåòèÿ ïî Y", x+10, y+45, 100,20, 2 UI_INFIELD{3} homY, x+120, y+45, 60, 20 !UI_OUTFIELD "> 0", x+135+33, y+45+3, 30, 20 UI_BUTTON UI_FUNCTION, "Õîìîòåòèÿ ïî Z", x+10, y+70, 100,20, 3 UI_INFIELD{3} homZ, x+120, y+70, 60, 20 !UI_OUTFIELD "> 0", x+135+33, y+70+3, 30, 20 UI_OUTFIELD "Õîìîòåòèèòå ñà ñïðÿìî öåíòúðà íà", x+10, y+95+0, 180, 12 UI_OUTFIELD "òåæåñòòà íà êîíòðîëíèòå òî÷êè.", x+10, y+95+13, 180, 12 !!!---END Transformation Group---!!! !!!---Hotspots Group---!!! x = 202 + 2*10 y = 10 UI_GROUPBOX "Hotspots", x, y, 202, 125 UI_INFIELD{3} HotspotsX, x+10, y+20, 15, 15 UI_OUTFIELD "3D Hotspots X", x+28, y+20, 80, 15 UI_INFIELD{3} HotspotsY, x+10, y+38, 15, 15 UI_OUTFIELD "3D Hotspots Y", x+28, y+38, 80, 15 UI_INFIELD{3} HotspotsZ, x+10, y+56, 15, 15 UI_OUTFIELD "3D Hotspots Z", x+28, y+56, 80, 15 UI_INFIELD{3} Hotspots2D, x+10, y+74, 15, 15 UI_OUTFIELD "2D Hotspots", x+28, y+74, 80, 15 !!!---END Hotspots Group---!!! !!!---3D Details Group---!!! x = 10 y = 140 UI_GROUPBOX "3Ä Äåòàéëè", x, y, 202, 120 UI_INFIELD{3} surfaceElements, x+10, y+20, 15+50, 15 UI_OUTFIELD "Ïîâúðõíèííè åëåìåíòè", x+28+50, y+20, 120, 15 UI_INFIELD{3} linearElements, x+10, y+40, 15+50, 15 UI_OUTFIELD "Ëèíåéíè åëåìåíòè", x+28+50, y+40, 120, 15 UI_INFIELD{3} VertexCubesSide, x+10, y+60, 15+50-20, 15 UI_OUTFIELD "Ñòðàíà êîíòðîëíè êóá÷åòà", x+28+50-20, y+60, 120+20, 15 UI_INFIELD{3} lines, x+10+15, y+80, 15+50-20-15, 15 UI_OUTFIELD "Êîíòðîëíè ëèíèè", x+28+50-20, y+80, 120+20, 15 UI_INFIELD{3} mode, x+10, y+100, 15+50, 15 UI_OUTFIELD "Ðåæèì íà êðèâàòà", x+28+50, y+100, 120, 15 !!!---END 3D Details Group---!!! !!!---Hide Group---!!! x = 202 + 2*10 y = 140 UI_GROUPBOX "Ñêðèé", x, y, 202, 120 UI_INFIELD{3} hideDiagonals, x+10, y+20, 15, 15 UI_OUTFIELD "Ñêðèé äèàãîíàëè", x+28, y+20, 160, 15 UI_INFIELD{3} hideConture, x+10, y+38, 15, 15 UI_OUTFIELD "Ñêðèé êîíòóð", x+28, y+38, 160, 15 UI_INFIELD{3} hideULines, x+10, y+56, 15, 15 UI_OUTFIELD "Ñêðèé U ëèíèè", x+28, y+56, 160, 15 UI_INFIELD{3} hideVLines, x+10, y+74, 15, 15 UI_OUTFIELD "Ñêðèé V ëèíèè", x+28, y+74, 160, 15 !!!---END Hide Group---!!! |
В общи линии това е по кода. Надявам се този GDL обект, да стане полезен и за други хора освен за самия мен 🙂 и да съм успял да събудя интерес у някой да се пробва да напише нещо и на този (макар и доста странен и окастрен) скриптов език. 🙂
P.S.: Забелязах, че при copy-paste от Архикад нещата, които са на кирилица в скрипта стават на каракацили и джуджуфлечки. 🙂 За съжаление в момента нямам време да ги преписвам 1 по 1, затова може да отворите скриптовете в Архикад, за по-подробен преглед. Когато намеря време ще оправя този проблем. 🙂
Leave a Reply