7,540
edits
Changes
→Ruby makrók
Ruby makró használatával a következő fejezetben foglalkozunk.
===Ruby makrókváltozók===
A Ruby egy egyszerű, szkript alapú programozási nyelv, aminek a segítségével megadhatunk akár komplex formulákat is az anyagmennyiség számítására. A komponensekhez tartozó táblázatokban, a 'Formula' mezők mindegyikékben használhatjuk a ruby nyelven készült makrókat. Ettől nem kell megijedni, használatuk nagyon egyszerű még azok számára is, akik meg foglalkoztak még programozással. Ha a 'Formula' mezőben nem statikus szöveget szeretnénk használni, hanem Ruby formulát, akkor az érték megadását egy '=' jellel kell kezdeni, ez jelzi a CA számára, hogy a cellába írtakat nem statikus szövegként kell értelmezni, hanem Ruby segítségével kell kiértékelni. Ez akár lehet egy egyszerű matematika művelet is. Az alábbi példában egy egyszerű képletet adtunk meg:
<pre>
Azt hogy egy adott objektumhoz összességében milyen változók érhetők el kétféle képen tudhatjuk meg:
===Ruby konzol==={{note|Ezen fejezet megértéséhez némi programozási előismeret szükséges, sajnos a könyv keretein túlmutatna ezen alapismeretek átadása is}}A CA-ban van egy beépített Ruby konzol, ahol mindig az aktuálisan kiválasztott objektum vonatkozásában írhatunk Ruby szkripteket. Listázhatjuk az elérhető változókat, vagy kipróbálhatjuk az általunk írt makrókat. A Ruby konzol a 'Tools -> Ruby Console...' menüpontban nyitható meg. Az aktuálisan kiválasztott objektumra mindig az 'owner' kulcsszóval tudunk hivatkozni. A kiválasztott objektum összes elérhető attribútumát így listázhatjuk: <pre>owner.names</pre> Ha egy fal objektum van kiválasztva, mikor a Ruby konzolt megnyitjuk és beírjuk az 'owner.names' kifejezést, akkor az alábbi változó listát kapjuk: :[[File: ClipCapIt-230702-160935.PNG]]
<pre>
=> [..., "wall_type", ..., "layer", "upper_layers", ... ""lower_layers", .... "length", ]</pre> <br>Ez azt jelenti, hogy a kiválasztott fal objektumunk (amire az 'owner' kulcsszóval hivatkozunk) az itt felsorolt változó nevekkel rendelkezik. Ha a fal típus nevére vagyunk kíváncsiak, a fenti lista alapján: '''owner.nameswall_type''':[[File:ClipCapIt-230702-161234.PNG]] A listában szereplő változók közül vannak összetett objektumok (további változókat tartalmaznak) tömbök, boolean-ek, Integer és String típusú változók is. Falak esetében az alábbi változók a leghasznosabbak: * length: Szám típus, az adott falszakasz hosszát tartalmazza* layer: Összetett objektum, a fal fő, vázszerkezetet is tartalmazó rétegét írja le. * upper_layers: A fő falszakasz rétegrendje, tömb típus. A 0. elem a legkülső réteg (tipikusan a vakolat külső falak esetében). Ha a fal tartalmaz parapet falat is (pony wall) akkor annak a rétegei a 'lower_layers' tömbben vannak. * lower_layers: Ha a fal rendelkezik parapet fallal (pony wall), akkor annak a rétegrendjét tartalmazó tömb. A 0. elem itt is a legkülső réteg. Ruby-ban objektum mezőket a '.' operátorral lehet meghivatkozni. Tehát ha pl az 'owner' objektumnak az 'upper_layers' mezőjére vagyunk kíváncsiak, akkor a 'owner.upper_layers' kifejezést kell beírni a Ruby konzolra, úgy hogy a falszakasz továbbra is ki van választva. A tömbök elemeire a [index] operátorral lehet hivatkozni, tehát a legkülső réteg objektumát így kaphatjuk meg: 'owner.lower_layers[0]'. Ha helyesen írjuk be a kifejezést a konzolra, és a meghivatkozott elem nem egy primitív típus (String, Integer, boolen), akkor a CA ki fogja írni nekünk az objektum összes mezőjét, amikből így már tudunk válogatni, máshogy nagyon nehéz lenne rájönni, hogy milyen mezők érhetők el az adott elemnél: :[[File:ClipCapIt-230702-175816.PNG]]Láthatjuk, hogy a 'owner.lower_layers[0]' objektum milyen további mezőket tartalmaz. Pl. van neki 'material_data' mezője, ami ha tovább boncolgatjuk, láthatjuk, hogy van neki egy 'descerption' mezője, ami már egy String típus, ebben van benne az adott fal réteg neve. Nézzük meg a példában szereplő fal rétegrendjét a 'Wall type definiton' ablakban: :[[File:ClipCapIt-230702-180210.PNG]]Láthatjuk, hogy a falunk 4 réteget tartalmaz. Ha arra vagyunk kíváncsiak, hogy hány négyzetméter homlokzati fóliára van szükségünk ehhez a falszakaszhoz, akkor kívülről nézve a második rétegre van szükségünk, amit az '1'-es indexel vehetünk elő az 'upper_layers' tömbből, mivel 0-val indul az indexelés. Írjuk be a Ruby konzolra: '''owner.upper_layers[1].material_data.description''':[[File:ClipCapIt-230702-180530.PNG]]Láthatjuk, hogy kintről nézve a második réteg valóban a homlokzati fóliát tartalmazza. Ha arra lennénk kíváncsiak, hogy mekkora ennek a felülete, akkor azt kétféleképpen is megkaphatjuk: <br>Az adott réteg területe: <pre>> owner.upper_layers[1].area=> 3.40494 m² (Area)</pre><br>Az adott rétegen használt anyag mennyisége. <pre>> owner.upper_layers[1].material_data.quantity=> 3.40494 m² (Area)
</pre>
Az anyag mennyisége mindig az anyag tulajdonságoktól függ. Ha megnézzük a 'Housewrap' anyag tulajdonságait, akkor láthatjuk, hogy a mennyiséget a terület alapján kell számolni, vagyis a komponens területét kell figyelembe venni, ezért egyezik meg fentebb a két szám: :[[File:ClipCapIt-230702-145435181252.PNG]] <br>
===Objektum összes attribútumának listázása===
A másik módszer, hogy megtudjuk, hogy egy objek
<br>
===Komponens mennyiségek megadása (Component count)===
Nyissuk meg újra a falszakasz specifikációs fülét, és a komponens fülön adjunk hozzá egy új komponenst a listához, és a 'Count' sor 'Formula' mezőjébe írjuk be: '''=owner.upper_layers[1].material_data.quantity''' éréket, figyelve hogy '=' -el kezdődjön a sor. (Ha nem statikus szöveget akarunk megadni egy 'Formula' mezőben, hanem Ruby képletet, akkor mindig '=' kell kezdeni a sort)
:[[File:ClipCapIt-230702-181825.PNG]]
Láthatjuk, hogy itt is megjelent a fenti érték: 3.4 sq m.
<br>
{{note|Az 'owner' változó elhagyható a sor elejéről, mert ezt alapértelmezetten hozzáteszi a CA}
<br>
Ugyan ezen falszakasz specifikációs komponensei között megtalálhatjuk a 'Housewrap' komponenst is. Ezt automatikusan hozta létre a CA a falhoz. Ezeknek az automatikusan hozzáadott komponenseknek az az érdekessége, hogy a CA automatikusan hozzájuk rendeli a megfelelő Ruby változókat, és elő is tölti a megfelelő Ruby kifejezésekkel a 'Formula' cellákat. Ezen komponensek esetében rövid alakkal tudunk hivatkozni a megfelelő anyagtulajdonságokra, anélkül, hogy be kéne írni egy kilométer hosszú Ruby kifejezést.
:[[File:ClipCapIt-230702-184714.PNG]]
Láthatjuk, hogy a 'Housewarp' -hez tartozó 'Formula' az alábbi: '''=material_data.quantity''''
Vagyis ezen példa esetében a '''=owner.upper_layers[1]''' rész elhagyható.
<br>
Persze minden komponens típus esetében más és más Ruby változók érhetők el, és beépített típusok esetében a CA mindig a megfelelő Ruby változókkal tölti elő a 'Formula' mezőket. Ha kézzel hozunk létre egy komponenst, akkor nincs rá mód, hogy összerendeljük azt valamelyik objektum Ruby attribútummal vagy anyaggal az anyaggal. Ha számított értéket akarunk hozzá létrehozni, akkor mindig a teljes elérési utat ki kell írni, kezdve az 'owner' változótól.
<br>
<br>
A komponenshez tartozó mértékegységet szintén a 'Count' sorhoz tartozó 'Formula' mezőben állíthatjuk be kétféle módon is. Ha kétszer belekattintunk a Formula cellába, akkor megjelenik egy legördülő lista, amiben ki tudjuk választani a használni kívánt mértékegységet:
:[[File:ClipCapIt-230702-185622.PNG]]
A másik lehetőség, hogy a felugró, jobb oldali ikonra kattintunk: 'Number Formatting'.
:[[File:ClipCapIt-230702-185655.PNG]]
A felugró ablakban részlettesen is beállíthatjuk a használni kívánt mértékegységet.
===Anyagok komponenshez rendelése===