SVOKBIM

ŠVOK/VN BIM (Revit) • Koordinavimas • ŠVOK/VN projektavimas

Teikiu ŠVOK ir vandentiekio / nuotekų (VN) BIM paslaugas: iš 2D brėžinių, PDF ar schemų parengiu Revit modelį (RVT / IFC) koordinavimui, kiekiams ir darbo brėžiniams. Taip pat tvarkau susikirtimus ir atlieku užduotis Trimble Connect arba Dalux aplinkose bei projektuoju ŠVOK, VN sistemas.

PASLAUGOS

1. ŠVOK / VN BIM modeliavimas (Revit)
Iš 2D brėžinių, PDF ar schemų parengiu ŠVOK ir VN BIM modelį Revit aplinkoje (RVT / IFC).
Modelis skirtas koordinavimui, kiekiams ir darbo brėžiniams.
2. Koordinavimas ir susikirtimų tvarkymas (Dalux / Trimble Connect)
Tvarkau susikirtimus ir atlieku užduotis bendroje duomenų aplinkoje.
3. ŠVOK / VN sistemų projektavimas
Projektuoju ŠVOK ir VN sistemas.

DARBO EIGA

1. Pirminė informacija
Projekto medžiaga: 2D brėžiniai, PDF, schemos, architektūriniai brėžiniai / modelis, reikalavimai ir terminai.
2. Modeliavimas / koordinavimas
Parengiu modelį arba koordinuoju pagal sutartą apimtį, prioritetus ir terminus.
3. Kokybės patikra
Prieš perdavimą atlieku kokybės patikrą: žymėjimų ir pavadinimų tvarka, parametrai, kontroliniai pjūviai, susikirtimų peržiūra.
4. Perdavimo paketas
Perduodu sutartus rezultatus: RVT / IFC, PDF, žiniaraščius ir (ar) ataskaitas.
Esant poreikiui – korekcijų ciklas pagal suderintą apimtį.

Esu atestuotas ypatingojo statinio projekto dalies vadovas ir ypatingojo statinio projekto dalies vykdymo priežiūros vadovas.
Statiniai: gyvenamieji ir negyvenamieji pastatai.
Projekto dalys: vandentiekio ir nuotekų šalinimo, šildymo, vėdinimo ir oro kondicionavimo.
Turiu daugiau nei 16 metų patirties ŠVOK / VN srityje, iš jų daugiau nei 9 metus dirbu BIM aplinkoje su Revit.

ŠVOK · rekuperatorių ventiliatorių savitoji galia (SFP)

SFP skaičiuoklė

Konvertuoja ventiliatorių savitąją galią tarp Wh/m³, kW/(m³/s), W/(m³/h), W/(l/s) ir Pa, o gautą reikšmę patikrina pagal STR 2.01.02:2016 14 p. 1 lentelės reikalavimus A, A+ ir A++ klasių pastatams.

„rekuperatoriaus ventiliatorių naudojamas elektros energijos kiekis neturi viršyti 0,75 Wh/m³“ — 1 Wh/m³ yra lygiai tas pats, kas 1 W/(m³/h) ir 3,6 kW/(m³/s). Tai vienintelė lygybė, kurią verta įsiminti.
Kablelis arba taškas — nesvarbu. Įveskite viso įrenginio (abiejų ventiliatorių) reikšmę projektiniame darbo taške.

Klasė nustatoma pagal abu rodiklius kartu — ventiliatorių Wh/m³ ir η.
—
Įveskite reikšmęRezultatas atsiras iš karto.

Ta pati reikšmė kitais vienetais

ReikšmėVienetasKur sutinkama
Wh/m³STR 2.01.02:2016 formuluotė; Ecodesign (ES 1253/2014) gyvenamųjų RVU deklaracijos (SPI)
W/(m³/h)Tapatu Wh/m³ — galia dalinta iš valandinio debito
kW/(m³/s)LST EN 16798-3 (buv. EN 13779) SFP; Swegon, Systemair, Komfovent, TROX parinkimo programos
W/(m³/s)EN 16798-3 SFP kategorijų lentelė; Ecodesign NRVU SFPint (kitas apibrėžimas — žr. atmintinę)
W/(l/s)Skandinavijos ir UK (Part L) praktika
kJ/m³ ≡ kPaEnergija oro kubui; skaitine verte lygu ekvivalentiniam slėgiui Δp/ηbendr
J/m³ ≡ PaTas pats, baziniais SI vienetais

Atvirkščiai: kiek galios galima „išleisti“

Pmax = SFPriba [Wh/m³] × q [m³/h]. Abiem ventiliatoriams kartu, projektiniame darbo taške.

Ką sako STR 2.01.02:2016

Suvestinė redakcija nuo 2026-01-01
KlasėVentiliatorių el. energijaRekuperatoriaus ηIšimtis atskirų srautų*Punktas
A≤ 0,75 Wh/m³ (≤ 2,70 kW/(m³/s))≥ 0,65—14 p., 1 lentelė, 5.3 papunktis
A+≤ 0,55 Wh/m³ (≤ 1,98 kW/(m³/s))≥ 0,75≥ 0,6814 p., 1 lentelė, 6.3 papunktis
A++≤ 0,45 Wh/m³ (≤ 1,62 kW/(m³/s))≥ 0,80≥ 0,6814 p., 1 lentelė, 7.3 papunktis
B ir žemesnėsRekuperatoriaus rodikliams reikalavimų 1 lentelėje nėra (B klasei — tik C1, C2, atitvaros, sandarumas, šilumos ir pirminės energijos sąnaudos, AEI dalis)14 p., 1 lentelė, 4 eil.

1 lent. 5.3„jei pastate (jo dalyje) įrengta mechaninio vėdinimo su rekuperacija sistema, rekuperatoriaus naudingumo koeficientas turi būti ne mažesnis už 0,65, o rekuperatoriaus ventiliatorių naudojamas elektros energijos kiekis neturi viršyti 0,75 Wh/m³. Šis reikalavimas netaikomas sandėliavimo, garažų, gamybos ir pramonės paskirties pastatams“

1 lent. 6.3„… rekuperatoriaus naudingumo koeficientas turi būti ne mažesnis už 0,75 (išskyrus atskirų srautų rekuperatorius, jų naudingumo koeficientas turi būti ne mažesnis kaip 0,68)*, o rekuperatoriaus ventiliatorių naudojamas elektros energijos kiekis neturi viršyti 0,55 Wh/m³. …“

1 lent. 7.3„… rekuperatoriaus naudingumo koeficientas turi būti ne mažesnis už 0,80 (išskyrus atskirų srautų rekuperatorius, jų naudingumo koeficientas turi būti ne mažesnis kaip 0,68)*, o rekuperatoriaus ventiliatorių naudojamas elektros energijos kiekis neturi viršyti 0,45 Wh/m³. …“

*„pastate (jo dalyje), kurio mikroklimatui ir oro kokybei keliami specialūs higienos reikalavimai, galima įrengti atskirų srautų rekuperatorių.“ (14 p. pakeitimai: D1-648 2019-10-29; D1-576 2020-09-28; D1-281 2022-08-25)

48.2„jei pastate (jo dalyje) įrengta mechaninio vėdinimo su rekuperacija sistema, atitinkamos energinio naudingumo klasės pastato (jo dalies) rekuperatoriaus naudingumo koeficiento vertė [3.21] ir rekuperatoriaus ventiliatorių sunaudojamas elektros energijos kiekis turi atitikti Reglamento 14 punkto reikalavimus.“

2 priedasJei nėra rekuperatoriaus dokumentų, nežinomas gamintojas ar tipas, arba ventiliatoriai sunaudoja daugiau kaip 2 Wh/m³ — sertifikavimo skaičiavimuose imama 2 Wh/m³ ir η = 0,65 (pastato būklės duomenų lapo 7.8 ir 7.10 papunkčiai; 2 priedo 38 p. dydžiai Gre,x, GreH,x, formulė 2.131). Todėl į projektą įrašykite gamintoją, tipą ir abu rodiklius.

Šaltinis: LR aplinkos ministro 2016-11-11 įsakymas Nr. D1-754, STR 2.01.02:2016 „Pastatų energinio naudingumo projektavimas ir sertifikavimas“, galiojanti suvestinė redakcija nuo 2026-01-01 — e-seimas.lrs.lt. Senesnė redakcija (iki D1-648) reikalavo A+ η ≥ 0,80 ir A++ η ≥ 0,90 — todėl seni straipsniai ir programų nustatymai gali klaidinti.

Vienetų perskaičiavimas

  • 1 Wh/m³ = 1 W/(m³/h) — tapatybė, nes W·h/m³ = W/(m³/h). Skaičius nesikeičia.
  • 1 Wh/m³ = 3,6 kW/(m³/s) = 3600 W/(m³/s) — nes 1 Wh = 3600 J, o J/m³ = W·s/m³ = W/(m³/s).
  • 1 kW/(m³/s) = 0,278 Wh/m³ (dalinti iš 3,6). Ribos programų vienetais: A — 2,70; A+ — 1,98; A++ — 1,62 kW/(m³/s).
  • 1 W/(l/s) = 1 kW/(m³/s) — nes 1 m³/s = 1000 l/s.
  • W/(m³/s) ≡ Pa — savitoji galia turi slėgio dimensiją: SFP = Δpbendr / ηbendr (ventiliatorius + variklis + valdiklis). 0,75 Wh/m³ atitinka 2700 Pa esant 100 % naudingumui, arba ~1350 Pa bendro slėgio abiem ventiliatoriams esant ηbendr = 0,5.
SFP [Wh/m³] = (P_tiek + P_ištr) [W] / q [m³/h]
SFP [kW/(m³/s)] = SFP [Wh/m³] × 3,6

Į ką žiūrėti parinkimo programoje

  • Imkite viso įrenginio SFP (abu ventiliatoriai, „SFP AHU“, „SFPv“, „SFP total“) projektiniame taške — su projektiniu debitu ir išoriniu statiniu slėgiu. STR nenurodo matavimo sąlygų, tad pagrindas — projektinis darbo taškas.
  • Ecodesign SFPint (ES reglamentas 1253/2014, NRVU) skaičiuojamas tik iš įrenginio vidinių komponentų slėgio nuostolio, be ortakių tinklo išorinio slėgio — jis visada mažesnis už tikrą SFP projektiniame taške ir su STR riba tiesiogiai nelyginamas.
  • Gyvenamųjų RVU deklaracijose (ES 1254/2014) nurodomas SPI, W/(m³/h) — skaitine verte tai Wh/m³, bet matuotas pagal EN 13141-7 etaloniniame taške (70 % maks. debito, 50 Pa), ne projektiniame.
  • η (rekuperatoriaus naudingumo koeficientas) STR 48.2 p. sieja su [3.21] LST EN ISO 15242; praktikoje — sausas temperatūrinis naudingumas pagal EN 308 / EN 13141-7 subalansuotiems srautams, be kondensacijos. Ecodesign „šiluminis naudingumas“ ηt skaičiuojamas tuo pačiu principu.
  • Reikalavimas taikomas kiekvienam rekuperaciniam įrenginiui pastate (jo dalyje): sertifikuojant į skaičiavimą įtraukiami visi įrenginiai su savo rodikliais, o klasės sąlyga — „jei įrengta … sistema“ — tikrinama kiekvienai.

EN 16798-3 SFP kategorijos (orientacinė)

KategorijaW/(m³/s)Wh/m³Pastaba

Kategorijų ribos pagal LST EN 16798-3:2017 (paveldėtos iš LST EN 13779:2007 10 lentelės, pridėta SFP 0). Prieš cituojant ekspertizei pasitikrinkite standarto tekste — čia jos tik padeda „sujungti“ STR ribą su programose rodomomis kategorijomis: A klasės riba (2700 W/(m³/s)) patenka į SFP 5, A+/A++ — į SFP 4.

Skaičiuoklė lygina tik du 1 lentelės rodiklius — ventiliatorių Wh/m³ ir η. Pastato klasę galiausiai lemia visi 1 lentelės reikalavimai (C1, C2, atitvaros, sandarumas, AEI dalis ir kt.), o „B ir žemesnė“ čia reiškia tik tai, kad rekuperatoriui atskiro reikalavimo nėra.
Skaičiavimai vykdomi naršyklėje, į serverį niekas nesiunčiama; paskutinės įvestys įsimenamos tik šiame įrenginyje. Skaičiuoklė yra pagalbinė priemonė — už projektinius sprendimus atsako projektuotojas. © svokbim.lt
(() => { const UNITS = { whm3: { f: 1, lbl: 'Wh/m³' }, wm3h: { f: 1, lbl: 'W/(m³/h)' }, kwm3s:{ f: 1/3.6, lbl: 'kW/(m³/s)' }, wm3s: { f: 1/3600, lbl: 'W/(m³/s)' }, wls: { f: 1/3.6, lbl: 'W/(l/s)' }, kjm3: { f: 1/3.6, lbl: 'kJ/m³' }, jm3: { f: 1/3600, lbl: 'J/m³' }, }; const LIMITS = [ { key: 'app', name: 'A++', sfp: 0.45, eta: 0.80, etaSep: 0.68, pt: '1 lent. 7.3' }, { key: 'ap', name: 'A+', sfp: 0.55, eta: 0.75, etaSep: 0.68, pt: '1 lent. 6.3' }, { key: 'a', name: 'A', sfp: 0.75, eta: 0.65, etaSep: 0.65, pt: '1 lent. 5.3' }, ]; const CATS = [ ['SFP 0', 0, 300], ['SFP 1', 300, 500], ['SFP 2', 500, 750], ['SFP 3', 750, 1250], ['SFP 4', 1250, 2000], ['SFP 5', 2000, 3000], ['SFP 6', 3000, 4500], ['SFP 7', 4500, Infinity], ]; const EPS = 1e-9; const $ = id => document.getElementById(id); const H = s => s.replace(/«/g, String.fromCharCode(60)); const parseNum = s => { if (s == null) return NaN; const t = String(s).trim().replace(/\s/g, '').replace(',', '.'); if (t === '') return NaN; const v = Number(t); return Number.isFinite(v) ? v : NaN; }; const fmt = (v, d) => { if (!Number.isFinite(v)) return '—'; const abs = Math.abs(v); if (d == null) d = abs >= 1000 ? 0 : abs >= 100 ? 1 : abs >= 10 ? 2 : 3; return v.toLocaleString('lt-LT', { minimumFractionDigits: d, maximumFractionDigits: d }); }; const toU = (whm3, u) => whm3 / UNITS[u].f; let mode = 'value'; const KEY = 'sfp-skaiciuokle-v1'; const ids = ['sfpIn','unitIn','pSup','pExh','qSup','qExh','eta','etaFmt','sepFlow','exempt','revQ']; const save = () => { try { const o = { mode }; ids.forEach(i => { const el = $(i); o[i] = el.type === 'checkbox' ? el.checked : el.value; }); localStorage.setItem(KEY, JSON.stringify(o)); } catch (e) {} }; const load = () => { try { const o = JSON.parse(localStorage.getItem(KEY) || 'null'); if (!o) return; ids.forEach(i => { if (!(i in o)) return; const el = $(i); if (el.type === 'checkbox') el.checked = !!o[i]; else el.value = o[i]; }); if (o.mode) setMode(o.mode, false); } catch (e) {} }; function setMode(m, doSave = true) { mode = m; document.querySelectorAll('#sfp .tab').forEach(t => t.setAttribute('aria-selected', String(t.dataset.mode === m))); $('mode-value').hidden = m !== 'value'; $('mode-calc').hidden = m !== 'calc'; if (doSave) save(); update(); } function drawScale(val) { const W = 640, x0 = 12, x1 = 628, maxV = 1.0; const X = v => x0 + (Math.min(v, maxV) / maxV) * (x1 - x0); const zones = [ { a: 0, b: 0.45, c: 'var(--app)', l: 'A++' }, { a: 0.45, b: 0.55, c: 'var(--ap)', l: 'A+' }, { a: 0.55, b: 0.75, c: 'var(--a)', l: 'A' }, { a: 0.75, b: maxV, c: 'var(--line-strong)', l: 'reikalavimas neįvykdytas' }, ]; $('zones').innerHTML = H(zones.map(z => `«rect x="${X(z.a)}" y="30" width="${X(z.b) - X(z.a)}" height="14" fill="${z.c}" rx="2">«/rect> «text class="zl" x="${(X(z.a) + X(z.b)) / 2}" y="62" text-anchor="middle">${z.l}«/text>`).join('')); $('ticks').innerHTML = H([0, 0.45, 0.55, 0.75, 1.0].map(v => `«line x1="${X(v)}" y1="26" x2="${X(v)}" y2="48" stroke="var(--surface)" stroke-width="1.5">«/line> «text x="${X(v)}" y="20" text-anchor="${v === 0 ? 'start' : v === 1 ? 'end' : 'middle'}">${fmt(v, 2)}«/text>`).join('')); if (Number.isFinite(val) && val >= 0) { const x = X(val), over = val > maxV; $('marker').innerHTML = H( `«polygon points="${x},30 ${x - 7},18 ${x + 7},18" fill="var(--ink)">«/polygon> «line x1="${x}" y1="30" x2="${x}" y2="44" stroke="var(--ink)" stroke-width="2">«/line> ${over ? `«text x="${x1}" y="12" text-anchor="end" style="fill:var(--bad)">▶ ${fmt(val, 2)} Wh/m³«/text>` : ''}`); } else $('marker').innerHTML = ''; } function classify(sfp, eta, sep, exempt) { const res = { bySfp: null, byEta: null, cls: null, checks: [] }; if (exempt) { res.cls = 'exempt'; return res; } const haveSfp = Number.isFinite(sfp) && sfp >= 0, haveEta = Number.isFinite(eta) && eta > 0; for (const L of LIMITS) { const etaReq = sep ? L.etaSep : L.eta; const sOk = haveSfp ? sfp <= L.sfp + EPS : null; const eOk = haveEta ? eta + EPS >= etaReq : null; res.checks.push({ L, etaReq, sOk, eOk, ok: sOk !== false && eOk !== false && (sOk !== null || eOk !== null) }); } res.bySfp = haveSfp ? (LIMITS.find(L => sfp <= L.sfp + EPS) || null) : undefined; res.byEta = haveEta ? (LIMITS.find(L => eta + EPS >= (sep ? L.etaSep : L.eta)) || null) : undefined; const both = res.checks.find(c => c.ok); res.cls = (haveSfp || haveEta) ? (both ? both.L : 'none') : null; return res; } function update() { let sfp, srcNote = ''; if (mode === 'value') { const v = parseNum($('sfpIn').value), u = $('unitIn').value; sfp = Number.isFinite(v) ? v * UNITS[u].f : NaN; srcNote = Number.isFinite(v) ? `iš ${fmt(v)} ${UNITS[u].lbl}` : ''; } else { const ps = parseNum($('pSup').value), pe = parseNum($('pExh').value); const qs = parseNum($('qSup').value), qe = parseNum($('qExh').value); const P = (Number.isFinite(ps) ? ps : 0) + (Number.isFinite(pe) ? pe : 0); const q = Math.max(Number.isFinite(qs) ? qs : 0, Number.isFinite(qe) ? qe : 0); sfp = q > 0 && P > 0 ? P / q : NaN; srcNote = Number.isFinite(sfp) ? `${fmt(P, 0)} W / ${fmt(q, 0)} m³/h` : ''; } let eta = parseNum($('eta').value); if ($('etaFmt').value === 'pct' && Number.isFinite(eta)) eta = eta / 100; if (Number.isFinite(eta) && eta > 1 && $('etaFmt').value === 'frac') eta = eta / 100; const sep = $('sepFlow').checked, exempt = $('exempt').checked; document.querySelectorAll('#convTable tbody tr').forEach(tr => { const u = tr.dataset.u, v = toU(sfp, u); tr.querySelector('.num').textContent = fmt(v); tr.classList.toggle('hl', mode === 'value' && u === $('unitIn').value); }); $('srcNote').textContent = srcNote; const r = classify(sfp, eta, sep, exempt); const V = $('verdict'), B = $('vBadge'), M = $('vMsg'); V.className = 'verdict'; const sfpTxt = Number.isFinite(sfp) ? `${fmt(sfp, 3)} Wh/m³ = ${fmt(sfp * 3.6, 2)} kW/(m³/s)` : ''; if (r.cls === 'exempt') { V.classList.add('k-empty'); B.textContent = 'n/t'; M.innerHTML = H(`«strong>Reikalavimas netaikomas«/strong>Sandėliavimo, garažų, gamybos ir pramonės paskirties pastatams 1 lentelės 5.3/6.3/7.3 papunkčiai netaikomi. ${sfpTxt ? 'Vis tiek: ' + sfpTxt + '.' : ''}`); } else if (r.cls === null) { V.classList.add('k-empty'); B.textContent = '—'; M.innerHTML = H(`«strong>Įveskite reikšmę«/strong>Rezultatas atsiras iš karto.`); } else if (r.cls === 'none') { V.classList.add('k-none'); B.textContent = 'B ir žem.'; const why = []; if (r.bySfp === null) why.push(`ventiliatoriai ${fmt(sfp, 3)} Wh/m³ > 0,75 Wh/m³`); if (r.byEta === null) why.push(`η = ${fmt(eta, 2)}, riba 0,65`); M.innerHTML = H(`«strong>Neatitinka nė vienos klasės rekuperatoriaus reikalavimų«/strong>${why.join('; ')}. Pastatas su tokiu įrenginiu gali būti tik B ar žemesnės klasės (arba keiskite įrenginį / darbo tašką).`); } else { const L = r.cls; V.classList.add('k-' + L.key); B.textContent = L.name; const parts = []; if (r.bySfp !== undefined) parts.push(`ventiliatoriai ${fmt(sfp, 3)} Wh/m³ ≤ ${fmt(L.sfp, 2)} Wh/m³ (${fmt(sfp*3.6, 2)} ≤ ${fmt(L.sfp*3.6, 2)} kW/(m³/s))`); if (r.byEta !== undefined) parts.push(`η = ${fmt(eta, 2)} ≥ ${fmt(sep ? L.etaSep : L.eta, 2)}`); let limiting = ''; if (r.bySfp && r.byEta && r.bySfp.key !== r.byEta.key) { const lim = r.bySfp.key === L.key ? 'ventiliatorių el. energija' : 'rekuperatoriaus η'; const other = r.bySfp.key === L.key ? r.byEta.name : r.bySfp.name; limiting = ` Ribojantis rodiklis — ${lim}; pagal kitą rodiklį tiktų ${other}.`; } M.innerHTML = H(`«strong>Tinka iki ${L.name} klasės pastato«/strong>${parts.join('; ')} — STR 2.01.02:2016 14 p., ${L.pt}.${limiting}`); } $('chips').innerHTML = H(r.checks.length ? r.checks.map(c => { const s = c.sOk === null ? '' : (c.sOk ? '✓' : '✗') + ' ≤' + fmt(c.L.sfp, 2); const e = c.eOk === null ? '' : (c.eOk ? '✓' : '✗') + ' η≥' + fmt(c.etaReq, 2); const cls = c.ok ? 'ok' : (c.sOk === null && c.eOk === null ? 'na' : 'bad'); return `«span class="chip ${cls}">${c.L.name} «span style="font-family:var(--font-mono);font-weight:400">${[s, e].filter(Boolean).join(' · ') || '—'}«/span>«/span>`; }).join('') : ''); drawScale(sfp); const wm3s = sfp * 3600; const cat = Number.isFinite(wm3s) ? CATS.find(c => wm3s < c[2] + EPS || c[2] === Infinity) : null; $('sfpCatNote').textContent = cat ? `Ši reikšmė (${fmt(wm3s, 0)} W/(m³/s)) → ${cat[0]}` : ''; $('catTable').querySelector('tbody').innerHTML = H(CATS.map(c => { const lo = c[1], hi = c[2]; const range = hi === Infinity ? `> ${fmt(lo, 0)}` : `${fmt(lo, 0)} – ${fmt(hi, 0)}`; const rangeWh = hi === Infinity ? `> ${fmt(lo / 3600, 3)}` : `${fmt(lo / 3600, 3)} – ${fmt(hi / 3600, 3)}`; const note = c[0] === 'SFP 4' ? 'A+ ir A++ ribos (1980 ir 1620)' : c[0] === 'SFP 5' ? 'A klasės riba (2700)' : ''; return `«tr class="${cat && cat[0] === c[0] ? 'hl' : ''}">«td>${c[0]}«/td>«td class="unit">${range}«/td>«td class="unit">${rangeWh}«/td>«td class="note">${note}«/td>«/tr>`; }).join('')); const q = parseNum($('revQ').value); $('revOut').innerHTML = H(LIMITS.map(L => `«dt>${L.name}«/dt>«dd>${Number.isFinite(q) && q > 0 ? fmt(L.sfp * q, 0) + ' W' : '—'}«/dd>`).join('')); save(); } document.querySelectorAll('#sfp .tab').forEach(t => t.addEventListener('click', () => setMode(t.dataset.mode))); ids.forEach(i => $(i).addEventListener('input', update)); ids.forEach(i => $(i).addEventListener('change', update)); load(); update(); })();

SUSISIEKTI

Jei projektui reikalingi papildomi Revit modeliavimo pajėgumai arba BIM koordinavimas, bendradarbiavimą galime pradėti nuo nedidelės apimties bandomojo darbo (pvz., vieno aukšto ar vienos sistemos)El. paštas: [email protected]
Telefonas: +370 616 58104