Деян Йосифов

 Personal Website & Blog

Имплементация на повърхнина на Безие на GDL script за Архикад

Written By: Деян - Feb• 15•13

bezier-dpy

Вероятно всеки, който се е занимавал професионално с проектиране (най-вече в областта на строителството, дизайна и други), има своите предпочитания към софтуерния продукт, който ползва ежедневно и който му спестява един куп усилия, за по-лесно и удобно решаване на проектантски проблеми и задачи. За съжаление всеки продукт обикновено заедно със своите предимства, носи и своите ограничения и недостатъци, независимо дали говорим за Архикад, Ревид, 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, като особено втората статия считам за изключително полезна, тъй като кривите на Безие са в основата на цялата идея и разбирайки ги тях почти няма да има проблем с разбирането на повърхнините на Безие (повърнините се получават в следствие на интерполиране между няколко наредени пространствени криви на Безие). Във втората статия има много полезни анимирани картинки, които наистина много нагледно показват идеята за формообразуването в зависимост от степента на кривата (от броя на контролните точки).

Bezier-animation

 

След като заредите обекта като библиотечен елемент в Архикад (през Library manager), ще можете да го намерите при другите GDL обекти в Embedded Library и маркирайки елемента ще видите подобен на долния екран с настройките на съответния обект.

bezier-menu

Тук е мястото да кажа, че самият обект е разработван за лични цели(за да мога успешно да моделирам дипломния си проект, към който ще дам снимки по-долу), поради което не всички функционалности са напълно завършени (оказа се че съчетаването едновременно на работа в архитектурно ателие, ученето за 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 къде точно се намира документацията:

reference

Като цяло GDL е изключително прост и окастрен откъм опции скриптов език. Под окастрен имам предид, че няма възможност да пишете собствени методи и функции, няма while цикъл и други такива иначе толкова полезни неща, имащи ги в нормалните езици за програмиране :). От към цикли езикът разполага с For цикъл. Също така има If-Else функционалност, което е добре :). Има GoTo, което по принцип е ужасно, но в краен случай може и до него да опрете, предвид липсата на while цикъл. Има опции да вкарвате някакви данни във буфера с командата Put и в последствие с командата Get или командата Use да използвате определен брой стойности от буфера, който работи на принципа на опашката (пръв влязъл пръв излиза). Идеята на този буфер е ако генерирате с някакъв цикъл да речем някакви параметри (да кажем координати) след това да може да ги използвате в някоя от вградените в GDL функции. Разгледайте документацията. Любопитно е :).

Как е организиран конкретния GDL обект. За да го отворите трябва да отидете във File -> Libraries and Objects -> Open object и ако сте маркирали преди това обекта то така ще отворите неговия script.

open-gdl

В секцията Parameters се дефинират параметрите на обекта като всеки параметър си има име, тип(дължина, ъгъл, рапитограф, щрих, булев, текст и др.) и начална стойност. Имената на параметрите ще се използват в последствие в скрипта.

GDL-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, затова може да отворите скриптовете в Архикад, за по-подробен преглед. Когато намеря време ще оправя този проблем. 🙂

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply

Your email address will not be published. Required fields are marked *