Okenski okvirji



Seminar pri predmetu: RAČUNALNIŠKO PODPRTO KONSTRUIRANJE
Leto: 97/98
Vaja: 3.1
Napisal: Jernej Pristavec
Mentor: Leon Kos


 

ABSTRACT

This page enables the user to create window frames and shashes. Supported window shapes are triangle, quadric. It is possible to generate bars only. The user can choose among several predefined frame and shash profiles. The page generates a 3D DXF file which can be viewed by many CAD programs.

1. Definicija naloge

Izdelaj parametrični program, za generiranje geometrije oken. Okna so lahko pravokotna, trikotna ali trapezna. Okvir okna je sestavljen iz standardnih profilov. Program za izbrano obliko okna in okenskega profila generira površine 3DFACE in jih zapiše DXF datoteko. Vse normale površin morajo biti usmerjene navzven.

Program mora imeti grafični uporabniški vmesnik. Jezik: JavaScript, ker ga znajo izvajati Netscape Navigator in Internet Exporer, kar daje programu splošno uporabnost
 

2. Navodila za uporabo programa

2.1 Definicija okna

Naložimo program okno .
Izberemo ustrezno obliko okna ali samo ustrezno prirezano palico.
Izberemo dimenzijo okna tako, da podamo koordinate oglišč. Podajomo zunanje gabarite okna.

Če smo izbrali palico pomeni koordinata x3 kot prirezanja pri oglišču 1 (x1,y1) in y3 kot prirezanja pri oglišču 2 (x2,y2). Kot merimo v stopinjah, kot je prikazano na sliki:


Če hočemo imeti neprirezno palico v polja x3 in y3 vpisemo 90
 

Sedaj moramo izbrati samo še profil. Izberemo lahko enega izmed profilov za okvir okna ali enga izmed profilov za okensko krilo.

Izbrali smo vse potrebne parametre za izris okna (obliko, velikost in vrsto profila). Z vnesenimi podatki izpišemo DXF datoteko tako, da pritisenemo gumb y napisom DXF na dnu strani. Program odpre novo okno v katrem je izpisana datoteka. Datoteko shranim na poljubno mseto z ukazom File / Save As...

Datoteko DXF lahko sedaj uvotimo v skoraj vsak 3D modelirnik.
 

2.2 Definicija okenskega profila

Okenski profil je definiran kot zaključen ravninski lik. Leži v ravnini XZ. Profil je podan z oglišči. Vsako oglišče vsebuje 3 koordinate: x,y,z ,ki so zapisane vsaka v svojem polju. Točke podajamo tako, da si sledijo konturi profila. Prva in zadnja toča se sovpadata. Primer funkcije, ki definira enostaven profil z obliko štirikotnika:


 

 
Profil dodamo tako da v izvorno kodo programa dodamo točke novega profila. Profil definiramo v funkciji izbor.V blok switch dodamo polje x in z koordinat.

case "kvadtat":
            z = new InitArray(0,4,4,0,0);
            x = new InitArray(0,0,3,3,0);
          break;
 

V uporabniski vmesnik moramo dodati ime profila. V blok <select> dodamo novo vrstico:

<SELECT NAME="profili" ONCHANGE="izbor(this.form.profili)">
  <OPTION SELECTED> <B>Izberi profil </B>
  <OPTION VALUE="GR1000">GR1000 - Osnovni profil okvira 62x98
  <OPTION VALUE="GR1001">GR1001 - Osnovni profil okvira 62x76
  <OPTION VALUE="GR1002">GR1002 - Osnovni profil okvira 62x80
  <OPTION VALUE="GF1020">GF1020 - Osnovni profil krila 74x80
  <OPTION VALUE="GF1022">GF1022 - Osnovni profil krila 74x102
 <OPTION VALUE="Oznaka profila"> opis profila
 </SELECT>

Oznaka profila mora biti enaka imenu slike profila brez koncnice .gif
Skenirana slika .gif   mora biti v istem direktoriju kot program okno.htm

3. Delovanje programa

3.1 Ideja


 

3.2 Izračun kota rotacije prereza

Kot1 med sosednjima stranicama okna določimo s pomočjo skalarnega produkta. Prerez moramo zarotirati na simetralo tega kota (kot1/2). Ker je prerez definiran v XZ ravnini moramo izračunati še kot rotacije do stranice (kot2). Skupni kot rotacije je vsota obeh kotov (rot = kot2 + kot1/2).

 

3.3 Izračun kota skalacije

Ker profil režemo pod kotom različnim od 90 stopinj moramo prerez skalirati v x smeri.
Faktor skalacije določimo sx=s/v=abs(1/sin(kot1/2))    (Kot1=alfa)


 

3.4 Translacija

Translacija je enostavna. Prerez premaknemo tako, da vsem x v definiciji profila prištejemo dx in enako za y, ki mu prištejemo dy.
 

3.5 Izvedba transformacije profila

Transformacijo profila izvedemo z izačunanimi parametri s pomočjo matrične algebre.
Postopek transformacije: Postopek izvedemo z ukazi:

for (var i= 0 ; i < x.length ; i++)
    {
    xp[i] = x[i] * Math.cos(rot)*sx + x1;
    yp[i] = x[i] * Math.sin(rot)*sx + y1;
   }

transformiran profil kopiramo tako, da ga shranimo v drugo spremenljivko ( iz x v xp in y v yp)
 

3.6 Izdelovanje 3DFACE elementov

Vse točke, ki opisujejo okno so shranjene v vektorjih xp1-4 , yp1-4 in z. Zaradi premišljene transformacije prerezov ne potrebujemo dodatne topološke matrike, ker so potrebni podatki shranjeni v zaporedju točk v vektorjih.

V formatu DXF poznamo element za površino 3DFACE, ki ga definirajo štiri točke(x,y,z). Točke si sledijo v proti urnem
smislu in tako definirajo normalo iz površine.

DXF označbe 10,20,30 podajajo točko 0; 11,21,31 točko 1 .

1,2,3 na prvem mestu pomeni x,y,z.

Ustrezno usmerjenost normale dosežemo tako, da 3DFACE definiramo z:

oglišče.točka   točka je sestavljena iz x[i],y[i],z[i]

1.1– 1.2 – 2.2 – 2.1

1.2– 1.3 – 2.3 – 2.2

1.3– 1.4 – 2.4 – 2.3

:

:

2.1 – 2.2 – 3.2 – 3.1

2.2 – 2.3 – 3.3 – 3.2
 

3.7 Zapisovanje 3DFACE elementa v okno

Zapisovanje je rešeno tako, da se pomikamo po površinah profila v proti urnem smislu in funkciji podamo vse štiri točk, ta pa jih zapiše v okno po pravilu podanem v poglavju 3.6

function face(t1x,t1y,t2x,t2y,t3x,t3y,t4x,t4y,i)
{

rez.write("3DFACE\n8\n0\n")
rez.write("10\n")
rez.write(t1x + "\n")
rez.write("20\n")
rez.write(t1y + "\n")
rez.write("30\n")
rez.write(z[i] + "\n")
rez.write("11\n")
rez.write(t2x + "\n")
rez.write("21\n")
rez.write(t2y + "\n")
rez.write("31\n")
rez.write(z[i+1] + "\n")
rez.write("12\n")
rez.write(t3x + "\n")
rez.write("22\n")
rez.write(t3y + "\n")
rez.write("32\n")
rez.write(z[i+1] + "\n")
rez.write("13\n")
rez.write(t4x + "\n")
rez.write("23\n")
rez.write(t4y + "\n")
rez.write("33\n")
rez.write(z[i] + "\n")
rez.write("0\n")
}
 

for (var i= 0 ; i< x.length-1 ; i++)
    {
 
     face(xp1[i],yp1[i],xp1[i+1],yp1[i+1],xp2[i+1],yp2[i+1],xp2[i],yp2[i],i)
     if (og>1)
     {
     face(xp2[i],yp2[i],xp2[i+1],yp2[i+1],xp3[i+1],yp3[i+1],xp3[i],yp3[i],i)
     face(xp3[i],yp3[i],xp3[i+1],yp3[i+1],xp4[i+1],yp4[i+1],xp4[i],yp4[i],i)
     }
     if (og>3)
     face(xp4[i],yp4[i],xp4[i+1],yp4[i+1],xp1[i+1],yp1[i+1],xp1[i],yp1[i],i)
     }

spremenljivka og podaja obliko okna in s tem število stranic.
 

4. Primeri

Palica

 
Trikotnik

Štirikotnik