Výraz vypočíta jeden výsledok z aktuálneho kontextu ProjectWise, operácií CEL a registrovaných lookupov.
Prostredie CEL špecifické pre Bentley ProjectWise
PW CEL
Technická príručka začína rýchlym vysvetlením, čo PW CEL dovoľuje, čo už neumožňuje a aké limity treba rešpektovať. Následne vysvetľuje kontexty, objekty, lookupy, rozšírenia Bentley, Library Expressions, testovanie aj reálne atribútové situácie. Nejde o kurz s lekciami, ale o pracovnú referenciu pre konfiguráciu PW.
Táto referencia je určená pre ProjectWise Administrator 2026 a oddeľuje prenositeľné core CEL od kontextov, objektov a lookupov ProjectWise a od rozšírení Bentley.
01 · ProjectWise scope
Čo je PW CEL
ProjectWise CEL je prostredie CEL od spoločnosti Bentley pre Atribúty dokumentov, vlastnosti Work Area a Workflow Rules Engine. Nie je to všeobecné dátové API ProjectWise a nedokáže ľubovoľne čítať databázové tabuľky, interné ID ani hromadne spracúvať údaje.
PW CEL v troch bodoch
Nie je možné napísať ľubovoľný SELECT, zvoliť tabuľku alebo databázový pohľad, vytvárať vlastné spojenia (JOIN), volať procedúry ani voľne prehľadávať databázu ProjectWise.
Namiesto databázovej tabuľky hľadáme podporovaný objekt alebo lookup. Zložitá logika SQL môže vyžadovať vopred pripravené údaje alebo prepracovanie integrácie.
Oblasti konfigurácie
02 · Runtime model
Kontexty a objekty
Aktívny kontext určuje, ku ktorým názvom a objektom má výraz prístup. Výraz platný v jednom kontexte môže v inom zlyhať.
Atribúty dokumentu
Dostupné názvythisDocumentthisFolderthisFormthisUserutcTime- Použitie
- Výrazy Default value, Update value a Value list
- Dôležitá hranica
- Funkcie hierarchie Folder a WorkArea sú dostupné iba v tomto kontexte.
Vlastnosti Work Area
Dostupné názvythisFormthisUserutcTime- Použitie
- Výrazy hodnôt vlastností, najmä závislé od iných polí formulára
- Dôležitá hranica
- Nesprístupňuje názov aktuálneho priečinka ani jeho nadradenú hierarchiu.
Verzia vo Workflow Rules
Dostupné názvycurrentVersionutcTime- Použitie
- Akcie CHANGE_VERSION vo Workflow Rules Engine
- Dôležitá hranica
- Výsledok výrazu sa použije ako nová verzia dokumentu.
Objekty ProjectWise
Otvorte objekt a uvidíte jeho polia, typy, metódy, správanie pri hodnote null a prevádzkové hranice. Tieto názvy tvoria skutočný kontrakt kontextu ProjectWise.
DocumentthisDocumentAktuálny dokument a jeho ProjectWise metadáta.
| Pole | Typ | Význam |
|---|---|---|
.guid | GUID | Identifikátor dokumentu |
.name | string | Názov dokumentu |
.description | string | Opis dokumentu |
.file | File | Objekt priradeného súboru |
.version | string | Označenie verzie |
.versionSeq | integer | Systémové poradové číslo verzie |
.workflow | Workflow | Priradený workflow |
.state | State | Aktuálny stav workflow |
.createdBy | User | Používateľ, ktorý dokument vytvoril |
.createdOn | timestamp | Čas vytvorenia v UTC |
.updatedBy | User | Používateľ poslednej zmeny |
.updatedOn | timestamp | Čas poslednej zmeny v UTC |
.application | Application | Priradená aplikácia |
Metódy
getPWLink()→stringgetPWLink(PWLinkType)→stringgetPWLink(PWLinkType, bool)→stringgetHttpLink()→stringgetHttpLink(AppToOpen)→stringAttribute FormthisFormMapa aktuálnych, aj ešte neuložených hodnôt formulára adresovaných interným názvom poľa.
FolderthisFolderPriečinok aktuálneho dokumentu a jeho poloha v hierarchii.
| Pole | Typ | Význam |
|---|---|---|
.guid | GUID | Identifikátor priečinka |
.name | string | Názov priečinka |
.description | string | Opis priečinka |
.workflow | Workflow | Priradený workflow |
.environment | Environment | Priradený Environment |
.updatedBy | User | Používateľ poslednej zmeny |
.updatedOn | timestamp | Čas poslednej zmeny v UTC |
.createdBy | User | Používateľ, ktorý priečinok vytvoril |
.createdOn | timestamp | Čas vytvorenia v UTC |
.isWorkArea | bool | Či je priečinok Work Area |
Metódy
getWorkArea()→WorkArea | nullgetOwnerWorkArea()→WorkArea | nullgetOwnerWorkArea(string)→WorkArea | nullgetTopFolder()→FoldergetTopWorkArea()→WorkArea | nullgetRelativeFolder(int)→Folder | nullgetFolderPath(Folder)→list<Folder>WorkAreafolder hierarchy resultWork Area získaná z priečinka alebo inej Work Area.
| Pole | Typ | Význam |
|---|---|---|
.folder | Folder | Priečinok reprezentovaný Work Area |
.type | string | Typ Work Area |
.properties | map<string,string> | Hodnoty vlastností typu Work Area |
Metódy
getWorkArea()→WorkAreagetOwnerWorkArea()→WorkArea | nullgetOwnerWorkArea(string)→WorkArea | nullgetTopFolder()→FoldergetTopWorkArea()→WorkArea | nullgetRelativeFolder(int)→Folder | nullgetFolderPath(Folder)→list<Folder>UserthisUser / document user fieldAktívny používateľ alebo používateľ uvedený v inom ProjectWise objekte.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Prihlasovacie meno |
.description | string | Opis alebo celé meno používateľa |
.email | string | E-mailová adresa |
FilethisDocument.fileFyzický súbor priradený k dokumentu.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Názov súboru |
.size | int | Veľkosť súboru v bajtoch |
.updatedBy | User | Používateľ poslednej zmeny súboru |
.updatedOn | timestamp | Čas poslednej zmeny súboru v UTC |
Workflowdocument.workflow / folder.workflowWorkflow priradený dokumentu alebo priečinku.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Názov workflow |
.description | string | Opis workflow |
StatethisDocument.stateAktuálny stav dokumentu vo workflow.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Názov stavu |
.description | string | Opis stavu |
ApplicationthisDocument.applicationProjectWise aplikácia priradená k dokumentu.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Názov aplikácie |
EnvironmentthisFolder.environmentEnvironment priradený priečinku.
| Pole | Typ | Význam |
|---|---|---|
.name | string | Názov Environmentu |
Dokumenty, priečinky a Work Areas v praxi
Otvorte situáciu a prepojte objektový model s konkrétnym dokumentom, súborom, hierarchiou priečinkov alebo vlastnosťou Work Area a očakávaným výsledkom.
Documentdocument-metadata-summaryPrečítanie súhrnu dokumentu
Atribút potrebuje kompaktný prehľad názvu, verzie a workflow stavu aktuálneho dokumentu.
{'name': thisDocument.name,
'version': thisDocument.version,
'state': thisDocument.state.name}thisDocument.name = 'BS-A1-DR-001.dgn'thisDocument.version = 'P03'thisDocument.state.name = 'Approved'{name: 'BS-A1-DR-001.dgn', version: 'P03', state: 'Approved'}map<string,string>- Prečíta skalárne metadáta z aktuálneho objektu Document.
- Cez vlastnosť state prejde do vnoreného objektu State.
- Vybrané hodnoty vráti v jednej CEL mape.
thisDocumentDocument.nameDocument.versionState.nameDocument → Filedocument-file-nameOšetrenie dokumentu so súborom aj bez súboru
Zobrazovaná hodnota má ukázať názov fyzického súboru, ale nový alebo placeholder dokument ho nemusí mať.
thisDocument.file.name == '' ? '(no file)' : thisDocument.file.namethisDocument.file.name = 'BS-A1-DR-001.dgn''BS-A1-DR-001.dgn'string- Z thisDocument prečíta vnorený objekt File.
- Pred použitím skontroluje jeho name.
- Vráti skutočný názov súboru alebo explicitný fallback.
thisDocument.fileFile.nameconditionalempty objectFolder → Environmentfolder-environmentZobrazenie priečinka a jeho Environmentu
Vypočítaná hodnota má identifikovať priečinok dokumentu aj Environment, ktorý je k nemu priradený.
thisFolder.name + ' · ' + thisFolder.environment.namethisFolder.name = 'Drawings'thisFolder.environment.name = 'BS Document Attributes''Drawings · BS Document Attributes'string- Prečíta aktuálny priečinok dokumentu.
- Cez environment prejde do vnoreného objektu Environment.
- Oba názvy spojí do čitateľného označenia.
thisFolderFolder.nameFolder.environmentEnvironment.nameFolder hierarchyfolder-parentPrečítanie názvu nadradeného priečinka
Aktuálny dokument je v Drawings, ale atribút potrebuje discipline priečinok o jednu úroveň vyššie.
[thisFolder.getRelativeFolder(1)].map(parent, parent == null ? '' : parent.name)[0]folder path = Project > Building A > Architecture > DrawingsthisFolder.name = 'Drawings''Architecture'string- Začne v priečinku dokumentu.
- Posunie sa o jednu úroveň smerom k vrcholu hierarchie.
- Vráti názov rodiča alebo prázdny string, ak rodič nie je dostupný.
thisFoldergetRelativeFolderFolder.namenull guardFolder hierarchy → Documentdocument-full-pathZostavenie kompletnej cesty dokumentu
Hodnota podobná pôvodnému FULLNAME sa musí zostaviť zo skutočnej hierarchie a názvu dokumentu.
thisFolder.getTopFolder().getFolderPath(thisFolder).map(f, f.name).join('\') + '\' + thisDocument.namefolder names = ['Project', 'Building A', 'Drawings']thisDocument.name = 'A-101.dgn''Project\Building A\Drawings\A-101.dgn'string- Nájde najvyšší priečinok a vyžiada cestu späť k thisFolder.
- Objekty Folder nahradí ich názvami a spojí ich spätnými lomkami.
- Na koniec pridá názov aktuálneho dokumentu.
thisFolderthisDocument.namegetTopFoldergetFolderPathmapjoinFolder → WorkAreaowner-workarea-propertyPrečítanie vlastnosti z nadradenej Project Work Area
Atribút dokumentu potrebuje project code uložený na najbližšej nadradenej Work Area typu Project.
[thisFolder.getOwnerWorkArea('Project')].map(wa, wa == null ? '' : wa.properties.ProjectCode)[0]owning WorkArea.type = 'Project'owning WorkArea.properties.ProjectCode = 'BS-RAIL-001''BS-RAIL-001'string- Smerom nahor vyhľadá najbližšiu nadradenú Work Area typu Project.
- Objekt skontroluje, pretože vyhľadanie môže vrátiť null.
- Z mapy string vlastností prečíta ProjectCode.
thisFoldergetOwnerWorkAreaWorkArea.typeWorkArea.propertiesnull guardDocument creationnew-document-null-guardKontrola thisDocument počas vytvárania dokumentu
Default výraz sa môže spustiť skôr, než je nový objekt Document dostupný.
thisDocument == null ? '(new document)' : thisDocument.namethisDocument = null'(new document)'string- Pred čítaním vlastnosti Document skontroluje kontextový objekt.
- Ak je null, vráti bezpečnú hodnotu pre čas vytvárania.
- Skutočný názov prečíta až po vytvorení objektu Document.
thisDocumentnullconditionalDocument.name03 · Data selection
Lookupy a podporované datasety
PW CEL nesprístupňuje „podporované tabuľky SQL“. Sprístupňuje registrované lookupy a presne určené vstavané datasety DMS.*.
Tri zdroje lookupov
Document Environment lookup
Používa atribúty dokumentov vo vybranom Environment ako riadky lookupu.
Standard lookup
Načíta externé ERP, CRM alebo iné údaje cez PowerShell alebo SDK.
Built-in lookup
Sprístupňuje vybrané systémové údaje ProjectWise cez lookup názvy DMS.*.
Ako sa registrované lookupy definujú a plnia
Definícia lookupu a zdroj údajov sú dve odlišné veci. Lookup typu Environment číta aktuálne atribúty dokumentov, lookup typu Standard dostáva nahrané riadky a vstavané lookupy poskytuje ProjectWise.
Environment lookupNew-PWLookupDynamický pohľad na vybrané atribúty dokumentov v jednom Environmente.
Definícia nekopíruje riadky Environmentu. Nové, zmenené a odstránené hodnoty atribútov dokumentov sa prejavia pri ďalšom vyhodnotení lookupu. Nový atribútový stĺpec treba pridať do definície lookupu, až potom ho CEL môže vyberať.
| Pole definície | Príklad | Čo riadi |
|---|---|---|
| Lookup name | LKP.Status | Jedinečný v datasource; DMS. je rezervované |
| Environment name | Lookup Table - General Attributes | Environment použitý ako dynamický zdroj riadkov |
| Columns | PW_CODE, PW_DESCRIPTION | Atribúty Environmentu sprístupnené CEL |
| Default value column | PW_CODE | Použije sa ako value pri select() |
| Default description column | PW_DESCRIPTION | Voliteľný description pre select() |
| Primary filter | PW_FILTER = Status | Voliteľné pevné equals filtre bez rozlíšenia veľkosti písmen |
| Sorting columns | PW_SORTORDER = asc | Logické radenie; radiaci stĺpec nemusí byť dostupný na výber |
Standard lookupNew-PWLookup · Set-PWLookupData · SDKDataset spravovaný ProjectWise a naplnený z externého systému.
Definícia opisuje stĺpce a defaulty; dáta sa nahrávajú samostatne. Za synchronizáciu so SQL, ERP, CRM, CSV alebo iným zdrojom zodpovedá integrácia.
| Pole definície | Príklad | Čo riadi |
|---|---|---|
| Lookup name | my.towns | Jedinečný v datasource; DMS. je rezervované |
| Columns | country, region, name | Najviac 10 string stĺpcov po 255 znakov |
| Default value column | name | Použije sa ako value pri select() |
| Default description column | region | Voliteľný description pre select() |
| Sorting columns | sort_order = asc | Voliteľné logické radenie |
Vstavané datasety lookupov
| Názov lookupu | Dostupné stĺpce | Povinný skrytý filter | Obsah |
|---|---|---|---|
DMS.Users | namedescriptionemail | — | Všetci používatelia datasource |
DMS.UserLists | namedescription | — | Všetky zoznamy používateľov |
DMS.UsersInList | namedescriptionemail | list | Používatelia v zozname; filter podľa list je povinný |
DMS.UserGroups | namedescription | — | Skupiny používateľov datasource |
DMS.UsersInGroup | namedescriptionemail | group | Používatelia v skupine; filter podľa group je povinný |
DMS.Workflows | namedescription | — | Workflowy v datasource |
DMS.States | namedescription | — | Stavy v datasource |
DMS.StatesInWorkflow | namedescription | workflow | Stavy vo workflowe; filter podľa workflow je povinný |
Postup dotazu nad lookupom
Získajte lookup, použite čo najpresnejšie filtre a potom zavolajte select() pre riadky alebo selectOne() pre jeden textový reťazec.
getLookup('DMS.UsersInGroup')
.filterEquals('group', 'Design')
.select('name', 'description')Zdokumentované funkcie lookupov
Filtre lookupu vytvárajú ďalší objekt typu Lookup. Údaje sa vrátia až cez select() alebo selectOne(), preto veľké datasety najprv čo najpresnejšie filtrujte.
getLookup
LookupgetLookup(name)Získa registrovaný alebo built-in lookup; názov nerozlišuje veľkosť písmen.
getLookup('DMS.Users')listLookups
list<string>listLookups()Vypíše názvy registrovaných a built-in lookupov v datasource.
listLookups()filterEquals
Lookup<Lookup>.filterEquals(column, value)Pridá filter rovnosti; zreťazené lookup filtre sa aplikujú spoločne.
.filterEquals('country', 'US')filterNotEquals
Lookup<Lookup>.filterNotEquals(column, value)Vylúči riadky, ktorých stĺpec sa rovná zadanej hodnote.
.filterNotEquals('status', 'inactive')filterContains
Lookup<Lookup>.filterContains(column, substring)Pridá substring filter bez rozlíšenia veľkosti písmen.
.filterContains('state', 'new')filterNotContains
Lookup<Lookup>.filterNotContains(column, substring)Vylúči riadky obsahujúce substring bez rozlíšenia veľkosti písmen.
.filterNotContains('name', 'test')filterIn
Lookup<Lookup>.filterIn(column, values)Ponechá riadky, ktorých hodnota stĺpca je v zadanom zozname.
.filterIn('status', ['active', 'pending'])filterNotIn
Lookup<Lookup>.filterNotIn(column, values)Vylúči riadky, ktorých hodnota stĺpca je v zadanom zozname.
.filterNotIn('status', ['inactive', 'closed'])select
list<{value: string, description: string}><Lookup>.select([valueColumn], [descriptionColumn])Vráti zodpovedajúce riadky value listu. Bez argumentov použije nakonfigurované default stĺpce.
.select('name', 'description')selectOne
string<Lookup>.selectOne(column[, fallback])Vráti jednu hodnotu stĺpca. Bez fallbacku nula alebo viac riadkov zlyhá; s fallbackom ho oba prípady vrátia.
.selectOne('description', '')04 · Host additions
Bentley / ProjectWise rozšírenia
Tieto názvy poskytuje ProjectWise. Nemožno ich prezentovať ako prenositeľnú syntax core CEL.
Prístup k Folder a WorkArea
getWorkAreagetOwnerWorkAreagetTopFoldergetTopWorkAreagetRelativeFoldergetFolderPathIba kontext Atribúty dokumentu; metódy vracajúce objekty môžu vrátiť null.
Rozšírenia pre string
charAtformatincrementAlphaVersionindexOflastIndexOfparseparseRegexreplacereversesplitsubstringtoLowertoUppertrimtakeLefttakeRightdropLeftdropRightProjectWise pridáva .NET formátovanie, parsery a pomocné funkcie na výrezy.
Rozšírenia pre list
takeLefttakeRightdropLeftdropRightVrátia vybraný okraj alebo zvyšok zoznamu.
Časové rozšírenia
toLocalTimetoUTCsecondsOffsetPoužívajú TZDB/IANA názvy a zložený objekt lokálneho času ProjectWise.
Odkazy na dokument
getPWLinkgetHttpLinkPWLinkTypeAppToOpenVytvára PW URL/URN alebo webové odkazy smerujúce do WEB, WEBVIEW alebo PWE.
Signatúry, návratové typy, správanie a príklady
Hierarchia Folder a WorkAreaDocument Attributes context onlyNavigácia od priečinka dokumentu ku koreňu datasource a späť.
getWorkArea
WorkArea | nullFolder.getWorkArea() / WorkArea.getWorkArea()Prevedie priečinok Work Area na objekt WorkArea; bežný priečinok vráti null.
thisFolder.getWorkArea().typegetOwnerWorkArea
WorkArea | null<Folder|WorkArea>.getOwnerWorkArea([workAreaType])Nájde najbližšiu vlastnícku Work Area, voliteľne podľa typu bez rozlíšenia veľkosti písmen.
thisFolder.getOwnerWorkArea('Project').properties.CodegetTopFolder
Folder<Folder|WorkArea>.getTopFolder()Vráti najvyšší priečinok vzhľadom na cestu aktuálneho dokumentu.
thisFolder.getTopFolder().namegetTopWorkArea
WorkArea | null<Folder|WorkArea>.getTopWorkArea()Vráti najvyššiu Work Area v aktuálnej ceste alebo null, ak neexistuje.
thisFolder.getTopWorkArea().typegetRelativeFolder
Folder | null<Folder|WorkArea>.getRelativeFolder(level)0 ponechá východisko, kladné číslo ide nahor a záporné smerom k dokumentu.
thisFolder.getTopFolder().getRelativeFolder(-3).descriptiongetFolderPath
list<Folder><Folder|WorkArea>.getFolderPath(endFolder)Vráti usporiadanú cestu priečinkov medzi východiskom a koncovým priečinkom.
thisFolder.getTopFolder().getFolderPath(thisFolder).map(f, f.name).join('\')String funkcie18 ProjectWise entriesFormátovanie, parsovanie, vyhľadávanie, delenie a kontrolované výrezy.
charAt
string<string>.charAt(position)Znak na pozícii počítanej od nuly
'abc'.charAt(1)format
string<format>.format(value[, locale])Formátovanie hodnôt, čísel a dátumov kompatibilné s .NET
'{0:yyyy-MM-dd}'.format(utcTime)incrementAlphaVersion
string<string>.incrementAlphaVersion([alphabet])Zvýši poslednú abecednú pozíciu verzie
'Z'.incrementAlphaVersion()indexOf
int<string>.indexOf(fragment[, offset])Prvý výskyt od nuly, voliteľne od offsetu
'abc'.indexOf('b')lastIndexOf
int<string>.lastIndexOf(fragment[, maxIndex])Posledný výskyt od nuly, voliteľne s hornou hranicou
'abcba'.lastIndexOf('b')parse
list<map><string>.parse(patterns)Parsuje pomenované A, N a wildcard fragmenty; vracia singleton zoznam
'P01.02'.parse(['{pre:A}{maj:N}.{min:N}'])parseRegex
list<map><string>.parseRegex(patterns)Testuje regex vzory a vracia index zhody a zachytené skupiny
'P01.02'.parseRegex([R'(P\d+)([.])(\d+)'])replace
string<string>.replace(what, replacement[, limit])Nahradí všetky alebo obmedzený počet výskytov
'abccc'.replace('c', 'x', 2)reverse
string<string>.reverse()Obráti poradie znakov
'abc'.reverse()split
list<string><string>.split(separator[, limit])Rozdelí text, voliteľne s obmedzením počtu výsledkov
'ab-cd-ef'.split('-', 2)substring
string<string>.substring(position[, count])Vráti text od pozície; druhý argument je počet, nie koncový index
'abc'.substring(1, 2)toLower
string<string>.toLower()Prevedie text na malé písmená
'ABC'.toLower()toUpper
string<string>.toUpper()Prevedie text na veľké písmená
'abc'.toUpper()trim
string<string>.trim()Odstráni medzery na začiatku a konci
' ab '.trim()takeLeft
string<string>.takeLeft(count)Vráti prvých count znakov
'abcdef'.takeLeft(3)takeRight
string<string>.takeRight(count)Vráti posledných count znakov
'abcdef'.takeRight(3)dropLeft
string<string>.dropLeft(count)Odstráni prvých count znakov
'abcdef'.dropLeft(2)dropRight
string<string>.dropRight(count)Odstráni posledných count znakov
'abcdef'.dropRight(2)List funkcietake / dropVýber alebo odstránenie prvkov z oboch okrajov zoznamu.
takeLeft
list<list>.takeLeft(count)Ponechá prvých count prvkov
[1,2,3,4].takeLeft(2)takeRight
list<list>.takeRight(count)Ponechá posledných count prvkov
[1,2,3,4].takeRight(2)dropLeft
list<list>.dropLeft(count)Odstráni prvých count prvkov
[1,2,3,4].dropLeft(2)dropRight
list<list>.dropRight(count)Odstráni posledných count prvkov
[1,2,3,4].dropRight(2)Časové funkcie a objektytimestamp · duration · PWLocalTimeČas vyhodnotenia v UTC, IANA pásma, lokálne formátovanie a konverzie.
timestamp and duration
timestamp / durationtimestamp(...) ± duration(...)K dispozícii zostáva aritmetika a porovnávanie timestampov z core CEL.
timestamp('2020-12-10T00:00:00Z') + duration('1h')toLocalTime
PWLocalTime<timestamp>.toLocalTime(timeZone)Prevedie UTC na lokálny čas ProjectWise podľa TZDB/IANA názvu.
utcTime.toLocalTime('Europe/London')secondsOffset
int<PWLocalTime>.secondsOffsetSprístupní aktuálny posun časového pásma v sekundách.
utcTime.toLocalTime('Europe/Berlin').secondsOffsettoUTC
timestamp<PWLocalTime>.toUTC()Prevedie objekt lokálneho času späť na UTC timestamp.
utcTime.toLocalTime('Europe/London').toUTC()format local time
string<format>.format(PWLocalTime[, locale])Formátuje čas až po aplikovaní lokálneho posunu.
'{0:yyyy-MM-dd}'.format(utcTime.toLocalTime('Europe/London'))05 · Help in practice
Oficiálne situácie ProjectWise CEL
Príklady z dokumentácie Bentley ukazujú, ako sa kontextové objekty a rozšírenia skladajú do kompletných atribútových výrazov. Pri každom vzore je vysvetlený vstup, transformácia, výsledok a hranica hostiteľa.
Závislý dátum v title blocku
Nastaví dátum iba vtedy, keď pole autora obsahuje reálnu hodnotu.
thisForm.TB_DRAWN_BY != '---' ? '{0:yyyy-MM-dd}'.format(utcTime) : '---'thisForm číta aktuálnu ešte neuloženú hodnotu autora. Podmienka buď naformátuje čas vyhodnotenia, alebo ponechá placeholder title blocku.
thisForm.TB_DRAWN_BY = 'P.Novák'utcTime = timestamp('2026-08-17T09:15:00Z')'2026-08-17'stringthisFormutcTimeformatconditionalPrípona súboru
Prečíta poslednú časť názvu priradeného súboru.
[thisDocument.file.name.split('.')].map(r, r[r.size()-1])Singleton list vytvorí lokálnu hodnotu, split rozdelí názov súboru a posledný index vyberie príponu.
thisDocument.file.name = 'BS-A1-DR-001.dgn''dgn'stringthisDocument.filesplitmapsizeNázov súboru s pevnou štruktúrou
Vyberie pomenovaný číselný fragment a ošetrí nezhodný formát.
thisDocument.file.name.parse(['{a:N}P{b:N}.{c:N}.DWG']).map(r, r.match == 0 ? r.b : -1)parse vráti jednu mapu výsledku. match určí úspešný vzor a b obsahuje požadovaný fragment.
thisDocument.file.name = '100P20.30.DWG''20'stringthisDocument.fileparsemapconditionalIniciály aktuálneho používateľa
Vytvorí iniciály z opisu aktuálneho používateľa.
thisUser.description.split(' ').map(r, r.substring(0,1)).join()Opis sa rozdelí na slová, každé slovo poskytne prvý znak a join vytvorí výsledný string.
thisUser.description = 'Peter Novák''PN'stringthisUsersplitmapsubstringjoinFormátovaný dátum dokumentu
Naformátuje čas zmeny dokumentu pre hodnotu atribútu.
'{0:yyyy-MM-dd}'.format(thisDocument.updatedOn)updatedOn je UTC timestamp; format vráti požadovanú textovú reprezentáciu.
thisDocument.updatedOn = timestamp('2026-08-17T14:20:00Z')'2026-08-17'stringthisDocument.updatedOnformatCesta dokumentu
Zostaví čitateľnú cestu a názov dokumentu bez pôvodného tokenu FULLNAME.
thisFolder.getTopFolder().getFolderPath(thisFolder).map(f, f.name).join('\\') + '\\' + thisDocument.nameFunkcia hierarchie vráti objekty Folder, map ponechá názvy, join vloží oddeľovače a na koniec sa pridá názov dokumentu.
folder names = ['Project', 'Building A', 'Drawings']thisDocument.name = 'A-101.dgn''Project\Building A\Drawings\A-101.dgn'stringthisFolderthisDocumentgetTopFoldergetFolderPathmapjoin06 · BS attributes in practice
Reálne ukážky BS atribútov
Tieto výrazy pochádzajú z dodanej konfigurácie BS v ProjectWise. Každá ukážka prepája skutočný kód atribútu s príkladom hodnôt formulára alebo riadkov lookupu, očakávaným výsledkom a vysvetlením krok za krokom.
PW_FULLNAMEbs-pw-fullnameDoplnenie celého mena z vybraného ProjectWise používateľa
Formulár ukladá ProjectWise login v PW_USERNAME, ale title block potrebuje čitateľný opis používateľa.
getLookup('DMS.Users')
.filterEquals('name', thisForm.PW_USERNAME)
.selectOne('description', '')thisForm.PW_USERNAME = 'pnovak'DMS.Users row = {name: 'pnovak', description: 'Peter Novák'}'Peter Novák'string- Otvorí built-in dataset DMS.Users.
- Ponechá riadok, ktorého name sa rovná loginu vo formulári.
- Vráti description alebo prázdny string, ak nie je dostupný práve jeden riadok.
thisForm.PW_USERNAMEDMS.UsersnamedescriptionPW_USERINITIALSbs-pw-userinitialsVytvorenie iniciál z doplneného celého mena
PW_FULLNAME už obsahuje čitateľné meno a ďalší atribút z neho potrebuje odvodiť krátke iniciály.
thisForm.PW_FULLNAME.trim()
.split(' ')
.map(p, p.charAt(0))
.join()
.toUpper()thisForm.PW_FULLNAME = 'Peter Novák''PN'string- Odstráni medzery okolo celého mena.
- Rozdelí meno na slová a z každého ponechá prvý znak.
- Znaky spojí a prevedie na veľké písmená.
thisForm.PW_FULLNAMEtrimsplitmapcharAtjointoUpperTB_DRAWN_BYbs-tb-drawn-byDoplnenie autora title blocku iba po aktivovaní triggera
Trigger rozhodne, či sa zapíše nakonfigurované title-block meno aktuálneho používateľa, alebo zostane placeholder.
thisForm.TRIG_DRAWN == '1'
? getLookup('Lkp.UserSupl')
.filterEquals('PW_USERNAME', thisUser.name)
.selectOne('PW_TBNAME', '')
: '---'thisForm.TRIG_DRAWN = '1'thisUser.name = 'pnovak'Lkp.UserSupl row = {PW_USERNAME: 'pnovak', PW_TBNAME: 'P.Novák'}'P.Novák'string- Najprv skontroluje trigger.
- V doplnkovom používateľskom lookupe nájde aktuálny login.
- Vráti nakonfigurované meno pre title block.
thisForm.TRIG_DRAWNthisUser.nameLkp.UserSuplPW_TBNAMEFI_ROLE_CODEbs-fi-role-codeOdvodenie role code z hierarchie priečinkov
Rola je zakódovaná v description priečinka na pevnej pozícii pod najvyšším priečinkom.
thisFolder.getTopFolder().getRelativeFolder(-3).descriptionfolder path = Project > Building A > Architecture > DocumentsDocuments.description = 'ARC''ARC'string- Z priečinka dokumentu prejde na najvyšší priečinok.
- Posunie sa tri úrovne späť smerom k dokumentu.
- Prečíta description vybraného priečinka.
thisFoldergetTopFoldergetRelativeFolderFolder.descriptionRV_DATE_1bs-rv-date-1Zapísanie lokálneho dátumu schválenia
Dátum revízie zostáva placeholderom, kým nie je uvedený schvaľovateľ; potom použije londýnsky kalendárny dátum.
thisForm.TB_APPROVED_BY == '---'
? '---'
: '{0:yyyy-MM-dd}'.format(utcTime.toLocalTime('Europe/London'))thisForm.TB_APPROVED_BY = 'A.Smith'utcTime = timestamp('2026-08-17T22:30:00Z')'2026-08-17'string- Skontroluje, či existuje reálny schvaľovateľ.
- Prevedie UTC čas vyhodnotenia do Europe/London.
- Naformátuje iba lokálny kalendárny dátum.
thisForm.TB_APPROVED_BYutcTimetoLocalTimeformatPW_USERNAMEbs-pw-usernamePonúknutie iba používateľov, ktorí chýbajú v doplnkovom lookupe
Administrátor dopĺňa používateľské záznamy a nemá znovu vidieť loginy, ktoré už sú zaregistrované.
getLookup('DMS.Users')
.select('name')
.map(dmsuser,
!(dmsuser in getLookup('Lkp.UserSupl').select('PW_USERNAME')),
dmsuser)DMS.Users names = ['pnovak', 'asmith', 'bnovak']Lkp.UserSupl PW_USERNAME values = ['pnovak', 'asmith']only bnovak remains selectablevalue-list rows- Načíta mená všetkých používateľov datasource.
- Načíta mená, ktoré už existujú v Lkp.UserSupl.
- Ponechá iba mená, ktoré nie sú v doplnkovom zozname.
DMS.UsersLkp.UserSuplselectmapin07 · Reuse and proof
Library Expressions
Výrazy CEL uložené v databáze sú registrované pod lib. Library Expression prijíma jeden argument typu map, číta ho cez arg a môže vrátiť ľubovoľný typ podporovaný jazykom CEL.
lib.calculate({'x': 1, 'y': 2})
// inside the library expression
arg.x + arg.ySpráva cez PowerShell
Get-PWCelLibraryExpressionNew-PWCelLibraryExpressionUpdate-PWCelLibraryExpressionRemove-PWCelLibraryExpressionTestovanie cez pwps
Invoke-PWCelExpression podporuje spustenie bez kontextu, v kontexte verzie a v kontexte Atribútov dokumentu so zodpovedajúcimi hodnotami kontextu ProjectWise.
Invoke-PWCelExpression -Expression "1 + 1"Invoke-PWCelExpression -Expression "currentVersion.incrementAlphaVersion()" -CurrentVersion "A"Invoke-PWCelExpression -Expression "thisDocument.name" -DocumentGUID "<guid>" -FormFields @{ Field = "value" }Built-in výrazy verzie pre WRE
ProjectWise dokumentuje týchto 20 algoritmov DMS.* pre verzie. Library Expressions môžu sprístupniť vstavané výrazy cez menný priestor lib.DMS.*.
DMS.INC_ALPHADMS.INC_ALPHANUM_MAJDMS.INC_ALPHANUM_MAJ_P1DMS.INC_ALPHANUM_MINDMS.INC_ALPHANUM_MIN_P1DMS.INC_MAJDMS.INC_MAJ_P1_P1DMS.INC_MAJ_P1_P2DMS.INC_MAJ_P2_P1DMS.INC_MINDMS.INC_MIN_P1_P1DMS.INC_MIN_P1_P2DMS.INC_MIN_P2_P1DMS.INC_NUMBERDMS.INC_NUMBER_P1DMS.PUBDMS.PUB_P1DMS.REMOVE_ALPHANUM_MINDMS.REMOVE_MINDMS.REMOVE_MIN_P108 · Legacy → PW CEL
Migrácia pôvodných konfigurácií
Toto je iba jedna časť PW CEL. Prípady rozlišujú systémové premenné ProjectWise od skutočných funkcií SQL a určujú, či je zmena priama, významová alebo vyžaduje prepracovanie.
Čo pokrýva migračná príloha dokumentácie Bentley
Systémové premenné ProjectWise
Kontextové hodnoty používateľa, formulára, priečinka, Work Area a UTC času. Interné číselné ID, názvy tabuliek a viaceré staršie premenné nemajú priamy prístup z CEL.
$USER.NAME$$EDIT#XXX$VAULT.NAME$$DATE$Vstavané funkcie SQL
Zdokumentované náhrady zahŕňajú konverzie, podmienky, náhradné hodnoty pri null, textové reťazce, dátumy a kolekcie. Viaceré funkcie SQL nemajú priamu náhradu.
IIFISNULLCHARINDEXDATEADDSUBSTRINGISO19650 stored procedures
Bentley dokumentuje náhrady v CEL pre týchto šesť starších procedúr.
dms_ISO19650_attr_lkpdms_ISO19650_attr_lkp_statedms_ISO19650_user_name_calcdms_ISO19650_action_namesdms_ISO19650_datedms_ISO19650_root_folder_attributeMeno aktuálneho používateľa
Nahraďte systémovú premennú používateľa kontextovým objektom ProjectWise CEL.
$USER.NAME$thisUser.nameHodnota poľa aktívneho formulára
Preveďte odkaz na atribút $EDIT na mapu thisForm.
$EDIT#DisciplinethisForm.DisciplineVlastnosť nadradenej Work Area
Nahraďte projektovú systémovú premennú explicitným prechodom cez hierarchiu.
$PROJECT#PROJECT_CodethisFolder.getOwnerWorkArea().properties.CodeAktuálny dátum v lokálnom pásme
Nahraďte $DATE$ explicitnou konverziou UTC času a formátovaním.
$DATE$'{0:yyyy-MM-dd}'.format(utcTime.toLocalTime('Europe/Bratislava'))Podmienená hodnota
Nahraďte SQL IIF ternárnym operátorom CEL.
IIF(500 < 1000, 'YES', 'NO')500 < 1000 ? 'YES' : 'NO'Náhradná hodnota pri null
Nahraďte SQL ISNULL explicitnou kontrolou null.
ISNULL(prop, 'ABC')prop == null ? 'ABC' : propPozícia znaku v texte
Pri náhrade CHARINDEX zohľadnite rozdielne číslovanie pozícií.
CHARINDEX('C', 'ABC')'ABC'.indexOf('C') + 1Cesta k dokumentu
Nahraďte nepodporovanú premennú FULLNAME skladaním cesty z objektov.
$DOCUMENT.FULLNAME$thisFolder.getTopFolder().getFolderPath(thisFolder).map(f, f.name).join('\\') + '\\' + thisDocument.name