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.

Core CEL a PW CEL sú dve odlišné vrstvy.

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

Na čo slúži

Výraz vypočíta jeden výsledok z aktuálneho kontextu ProjectWise, operácií CEL a registrovaných lookupov.

Čo CEL nepovoľuje

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.

Čo sa mení v praxi

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.

Čítať celé vysvetlenieOtvorte úplné porovnanie pôvodného spôsobu konfigurácie ProjectWise a PW CEL vrátane správania lookupov, podporovaných datasetov, limitov, príkladov a migračných rozhodnutí.

Oblasti konfigurácie

Document AttributesDefault · Update · Value list
WorkArea PropertiesProperty expressions
Workflow Rules EngineCHANGE_VERSION
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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ázvy
thisDocumentthisFolderthisFormthisUserutcTime
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ázvy
thisFormthisUserutcTime
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ázvy
currentVersionutcTime
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.
PoleTypVýznam
.guidGUIDIdentifikátor dokumentu
.namestringNázov dokumentu
.descriptionstringOpis dokumentu
.fileFileObjekt priradeného súboru
.versionstringOznačenie verzie
.versionSeqintegerSystémové poradové číslo verzie
.workflowWorkflowPriradený workflow
.stateStateAktuálny stav workflow
.createdByUserPoužívateľ, ktorý dokument vytvoril
.createdOntimestampČas vytvorenia v UTC
.updatedByUserPoužívateľ poslednej zmeny
.updatedOntimestampČas poslednej zmeny v UTC
.applicationApplicationPriradená aplikácia

Metódy

getPWLink()string
getPWLink(PWLinkType)string
getPWLink(PWLinkType, bool)string
getHttpLink()string
getHttpLink(AppToOpen)string
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Attribute FormthisFormMapa aktuálnych, aj ešte neuložených hodnôt formulára adresovaných interným názvom poľa.
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
FolderthisFolderPriečinok aktuálneho dokumentu a jeho poloha v hierarchii.
PoleTypVýznam
.guidGUIDIdentifikátor priečinka
.namestringNázov priečinka
.descriptionstringOpis priečinka
.workflowWorkflowPriradený workflow
.environmentEnvironmentPriradený Environment
.updatedByUserPoužívateľ poslednej zmeny
.updatedOntimestampČas poslednej zmeny v UTC
.createdByUserPoužívateľ, ktorý priečinok vytvoril
.createdOntimestampČas vytvorenia v UTC
.isWorkAreaboolČi je priečinok Work Area

Metódy

getWorkArea()WorkArea | null
getOwnerWorkArea()WorkArea | null
getOwnerWorkArea(string)WorkArea | null
getTopFolder()Folder
getTopWorkArea()WorkArea | null
getRelativeFolder(int)Folder | null
getFolderPath(Folder)list<Folder>
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
WorkAreafolder hierarchy resultWork Area získaná z priečinka alebo inej Work Area.
PoleTypVýznam
.folderFolderPriečinok reprezentovaný Work Area
.typestringTyp Work Area
.propertiesmap<string,string>Hodnoty vlastností typu Work Area

Metódy

getWorkArea()WorkArea
getOwnerWorkArea()WorkArea | null
getOwnerWorkArea(string)WorkArea | null
getTopFolder()Folder
getTopWorkArea()WorkArea | null
getRelativeFolder(int)Folder | null
getFolderPath(Folder)list<Folder>
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
UserthisUser / document user fieldAktívny používateľ alebo používateľ uvedený v inom ProjectWise objekte.
PoleTypVýznam
.namestringPrihlasovacie meno
.descriptionstringOpis alebo celé meno používateľa
.emailstringE-mailová adresa
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
FilethisDocument.fileFyzický súbor priradený k dokumentu.
PoleTypVýznam
.namestringNázov súboru
.sizeintVeľkosť súboru v bajtoch
.updatedByUserPoužívateľ poslednej zmeny súboru
.updatedOntimestampČas poslednej zmeny súboru v UTC
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Workflowdocument.workflow / folder.workflowWorkflow priradený dokumentu alebo priečinku.
PoleTypVýznam
.namestringNázov workflow
.descriptionstringOpis workflow
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
StatethisDocument.stateAktuálny stav dokumentu vo workflow.
PoleTypVýznam
.namestringNázov stavu
.descriptionstringOpis stavu
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
ApplicationthisDocument.applicationProjectWise aplikácia priradená k dokumentu.
PoleTypVýznam
.namestringNázov aplikácie
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
EnvironmentthisFolder.environmentEnvironment priradený priečinku.
PoleTypVýznam
.namestringNázov Environmentu
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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
Situácia v ProjectWise

Atribút potrebuje kompaktný prehľad názvu, verzie a workflow stavu aktuálneho dokumentu.

CEL výraz
{'name': thisDocument.name,
 'version': thisDocument.version,
 'state': thisDocument.state.name}
Ilustračný stav objektovthisDocument.name = 'BS-A1-DR-001.dgn'thisDocument.version = 'P03'thisDocument.state.name = 'Approved'
Výsledok{name: 'BS-A1-DR-001.dgn', version: 'P03', state: 'Approved'}map<string,string>
Čo sa stane, krok za krokom
  1. Prečíta skalárne metadáta z aktuálneho objektu Document.
  2. Cez vlastnosť state prejde do vnoreného objektu State.
  3. Vybrané hodnoty vráti v jednej CEL mape.
thisDocumentDocument.nameDocument.versionState.name
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Document → Filedocument-file-nameOšetrenie dokumentu so súborom aj bez súboru
Situácia v ProjectWise

Zobrazovaná hodnota má ukázať názov fyzického súboru, ale nový alebo placeholder dokument ho nemusí mať.

CEL výraz
thisDocument.file.name == '' ? '(no file)' : thisDocument.file.name
Ilustračný stav objektovthisDocument.file.name = 'BS-A1-DR-001.dgn'
Výsledok'BS-A1-DR-001.dgn'string
Čo sa stane, krok za krokom
  1. Z thisDocument prečíta vnorený objekt File.
  2. Pred použitím skontroluje jeho name.
  3. Vráti skutočný názov súboru alebo explicitný fallback.
thisDocument.fileFile.nameconditionalempty object
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Folder → Environmentfolder-environmentZobrazenie priečinka a jeho Environmentu
Situácia v ProjectWise

Vypočítaná hodnota má identifikovať priečinok dokumentu aj Environment, ktorý je k nemu priradený.

CEL výraz
thisFolder.name + ' · ' + thisFolder.environment.name
Ilustračný stav objektovthisFolder.name = 'Drawings'thisFolder.environment.name = 'BS Document Attributes'
Výsledok'Drawings · BS Document Attributes'string
Čo sa stane, krok za krokom
  1. Prečíta aktuálny priečinok dokumentu.
  2. Cez environment prejde do vnoreného objektu Environment.
  3. Oba názvy spojí do čitateľného označenia.
thisFolderFolder.nameFolder.environmentEnvironment.name
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Folder hierarchyfolder-parentPrečítanie názvu nadradeného priečinka
Situácia v ProjectWise

Aktuálny dokument je v Drawings, ale atribút potrebuje discipline priečinok o jednu úroveň vyššie.

CEL výraz
[thisFolder.getRelativeFolder(1)].map(parent, parent == null ? '' : parent.name)[0]
Ilustračný stav objektovfolder path = Project > Building A > Architecture > DrawingsthisFolder.name = 'Drawings'
Výsledok'Architecture'string
Čo sa stane, krok za krokom
  1. Začne v priečinku dokumentu.
  2. Posunie sa o jednu úroveň smerom k vrcholu hierarchie.
  3. Vráti názov rodiča alebo prázdny string, ak rodič nie je dostupný.
thisFoldergetRelativeFolderFolder.namenull guard
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Folder hierarchy → Documentdocument-full-pathZostavenie kompletnej cesty dokumentu
Situácia v ProjectWise

Hodnota podobná pôvodnému FULLNAME sa musí zostaviť zo skutočnej hierarchie a názvu dokumentu.

CEL výraz
thisFolder.getTopFolder().getFolderPath(thisFolder).map(f, f.name).join('\') + '\' + thisDocument.name
Ilustračný stav objektovfolder names = ['Project', 'Building A', 'Drawings']thisDocument.name = 'A-101.dgn'
Výsledok'Project\Building A\Drawings\A-101.dgn'string
Čo sa stane, krok za krokom
  1. Nájde najvyšší priečinok a vyžiada cestu späť k thisFolder.
  2. Objekty Folder nahradí ich názvami a spojí ich spätnými lomkami.
  3. Na koniec pridá názov aktuálneho dokumentu.
thisFolderthisDocument.namegetTopFoldergetFolderPathmapjoin
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Folder → WorkAreaowner-workarea-propertyPrečítanie vlastnosti z nadradenej Project Work Area
Situácia v ProjectWise

Atribút dokumentu potrebuje project code uložený na najbližšej nadradenej Work Area typu Project.

CEL výraz
[thisFolder.getOwnerWorkArea('Project')].map(wa, wa == null ? '' : wa.properties.ProjectCode)[0]
Ilustračný stav objektovowning WorkArea.type = 'Project'owning WorkArea.properties.ProjectCode = 'BS-RAIL-001'
Výsledok'BS-RAIL-001'string
Čo sa stane, krok za krokom
  1. Smerom nahor vyhľadá najbližšiu nadradenú Work Area typu Project.
  2. Objekt skontroluje, pretože vyhľadanie môže vrátiť null.
  3. Z mapy string vlastností prečíta ProjectCode.
thisFoldergetOwnerWorkAreaWorkArea.typeWorkArea.propertiesnull guard
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Document creationnew-document-null-guardKontrola thisDocument počas vytvárania dokumentu
Situácia v ProjectWise

Default výraz sa môže spustiť skôr, než je nový objekt Document dostupný.

CEL výraz
thisDocument == null ? '(new document)' : thisDocument.name
Ilustračný stav objektovthisDocument = null
Výsledok'(new document)'string
Čo sa stane, krok za krokom
  1. Pred čítaním vlastnosti Document skontroluje kontextový objekt.
  2. Ak je null, vráti bezpečnú hodnotu pre čas vytvárania.
  3. Skutočný názov prečíta až po vytvorení objektu Document.
thisDocumentnullconditionalDocument.name
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

03 · 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.

Dokumentovaná podmienka alebo limitPlatí pre celý datasource; oprávnenia dokumentov sa neuplatňujú. Neukladajte citlivé hodnoty.

Standard lookup

Načíta externé ERP, CRM alebo iné údaje cez PowerShell alebo SDK.

Dokumentovaná podmienka alebo limitNajviac 10 stĺpcov; každá hodnota je string s maximálne 255 znakmi.

Built-in lookup

Sprístupňuje vybrané systémové údaje ProjectWise cez lookup názvy DMS.*.

Dokumentovaná podmienka alebo limitDostupné sú iba nižšie zdokumentované datasety a stĺpce.

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íciePríkladČo riadi
Lookup nameLKP.StatusJedinečný v datasource; DMS. je rezervované
Environment nameLookup Table - General AttributesEnvironment použitý ako dynamický zdroj riadkov
ColumnsPW_CODE, PW_DESCRIPTIONAtribúty Environmentu sprístupnené CEL
Default value columnPW_CODEPoužije sa ako value pri select()
Default description columnPW_DESCRIPTIONVoliteľný description pre select()
Primary filterPW_FILTER = StatusVoliteľné pevné equals filtre bez rozlíšenia veľkosti písmen
Sorting columnsPW_SORTORDER = ascLogické radenie; radiaci stĺpec nemusí byť dostupný na výber
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
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íciePríkladČo riadi
Lookup namemy.townsJedinečný v datasource; DMS. je rezervované
Columnscountry, region, nameNajviac 10 string stĺpcov po 255 znakov
Default value columnnamePoužije sa ako value pri select()
Default description columnregionVoliteľný description pre select()
Sorting columnssort_order = ascVoliteľné logické radenie
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

Vstavané datasety lookupov

Názov lookupuDostupné stĺpcePovinný skrytý filterObsah
DMS.UsersnamedescriptionemailVšetci používatelia datasource
DMS.UserListsnamedescriptionVšetky zoznamy používateľov
DMS.UsersInListnamedescriptionemaillistPoužívatelia v zozname; filter podľa list je povinný
DMS.UserGroupsnamedescriptionSkupiny používateľov datasource
DMS.UsersInGroupnamedescriptionemailgroupPoužívatelia v skupine; filter podľa group je povinný
DMS.WorkflowsnamedescriptionWorkflowy v datasource
DMS.StatesnamedescriptionStavy v datasource
DMS.StatesInWorkflownamedescriptionworkflowStavy 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

Lookup
getLookup(name)

Získa registrovaný alebo built-in lookup; názov nerozlišuje veľkosť písmen.

getLookup('DMS.Users')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

listLookups

list<string>
listLookups()

Vypíše názvy registrovaných a built-in lookupov v datasource.

listLookups()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterEquals

Lookup
<Lookup>.filterEquals(column, value)

Pridá filter rovnosti; zreťazené lookup filtre sa aplikujú spoločne.

.filterEquals('country', 'US')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterNotEquals

Lookup
<Lookup>.filterNotEquals(column, value)

Vylúči riadky, ktorých stĺpec sa rovná zadanej hodnote.

.filterNotEquals('status', 'inactive')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterContains

Lookup
<Lookup>.filterContains(column, substring)

Pridá substring filter bez rozlíšenia veľkosti písmen.

.filterContains('state', 'new')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterNotContains

Lookup
<Lookup>.filterNotContains(column, substring)

Vylúči riadky obsahujúce substring bez rozlíšenia veľkosti písmen.

.filterNotContains('name', 'test')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterIn

Lookup
<Lookup>.filterIn(column, values)

Ponechá riadky, ktorých hodnota stĺpca je v zadanom zozname.

.filterIn('status', ['active', 'pending'])
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

filterNotIn

Lookup
<Lookup>.filterNotIn(column, values)

Vylúči riadky, ktorých hodnota stĺpca je v zadanom zozname.

.filterNotIn('status', ['inactive', 'closed'])
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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', '')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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

getWorkAreagetOwnerWorkAreagetTopFoldergetTopWorkAreagetRelativeFoldergetFolderPath

Iba kontext Atribúty dokumentu; metódy vracajúce objekty môžu vrátiť null.

Rozšírenia pre string

charAtformatincrementAlphaVersionindexOflastIndexOfparseparseRegexreplacereversesplitsubstringtoLowertoUppertrimtakeLefttakeRightdropLeftdropRight

ProjectWise pridáva .NET formátovanie, parsery a pomocné funkcie na výrezy.

Rozšírenia pre list

takeLefttakeRightdropLeftdropRight

Vrátia vybraný okraj alebo zvyšok zoznamu.

Časové rozšírenia

toLocalTimetoUTCsecondsOffset

Používajú TZDB/IANA názvy a zložený objekt lokálneho času ProjectWise.

Odkazy na dokument

getPWLinkgetHttpLinkPWLinkTypeAppToOpen

Vytvá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 | null
Folder.getWorkArea() / WorkArea.getWorkArea()

Prevedie priečinok Work Area na objekt WorkArea; bežný priečinok vráti null.

thisFolder.getWorkArea().type
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

getOwnerWorkArea

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.Code
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

getTopFolder

Folder
<Folder|WorkArea>.getTopFolder()

Vráti najvyšší priečinok vzhľadom na cestu aktuálneho dokumentu.

thisFolder.getTopFolder().name
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

getTopWorkArea

WorkArea | null
<Folder|WorkArea>.getTopWorkArea()

Vráti najvyššiu Work Area v aktuálnej ceste alebo null, ak neexistuje.

thisFolder.getTopWorkArea().type
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

getRelativeFolder

Folder | null
<Folder|WorkArea>.getRelativeFolder(level)

0 ponechá východisko, kladné číslo ide nahor a záporné smerom k dokumentu.

thisFolder.getTopFolder().getRelativeFolder(-3).description
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

getFolderPath

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('\')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
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)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

format

string
<format>.format(value[, locale])

Formátovanie hodnôt, čísel a dátumov kompatibilné s .NET

'{0:yyyy-MM-dd}'.format(utcTime)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

incrementAlphaVersion

string
<string>.incrementAlphaVersion([alphabet])

Zvýši poslednú abecednú pozíciu verzie

'Z'.incrementAlphaVersion()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

indexOf

int
<string>.indexOf(fragment[, offset])

Prvý výskyt od nuly, voliteľne od offsetu

'abc'.indexOf('b')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

lastIndexOf

int
<string>.lastIndexOf(fragment[, maxIndex])

Posledný výskyt od nuly, voliteľne s hornou hranicou

'abcba'.lastIndexOf('b')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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}'])
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

parseRegex

list<map>
<string>.parseRegex(patterns)

Testuje regex vzory a vracia index zhody a zachytené skupiny

'P01.02'.parseRegex([R'(P\d+)([.])(\d+)'])
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

replace

string
<string>.replace(what, replacement[, limit])

Nahradí všetky alebo obmedzený počet výskytov

'abccc'.replace('c', 'x', 2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

reverse

string
<string>.reverse()

Obráti poradie znakov

'abc'.reverse()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

split

list<string>
<string>.split(separator[, limit])

Rozdelí text, voliteľne s obmedzením počtu výsledkov

'ab-cd-ef'.split('-', 2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

substring

string
<string>.substring(position[, count])

Vráti text od pozície; druhý argument je počet, nie koncový index

'abc'.substring(1, 2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

toLower

string
<string>.toLower()

Prevedie text na malé písmená

'ABC'.toLower()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

toUpper

string
<string>.toUpper()

Prevedie text na veľké písmená

'abc'.toUpper()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

trim

string
<string>.trim()

Odstráni medzery na začiatku a konci

' ab '.trim()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

takeLeft

string
<string>.takeLeft(count)

Vráti prvých count znakov

'abcdef'.takeLeft(3)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

takeRight

string
<string>.takeRight(count)

Vráti posledných count znakov

'abcdef'.takeRight(3)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

dropLeft

string
<string>.dropLeft(count)

Odstráni prvých count znakov

'abcdef'.dropLeft(2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

dropRight

string
<string>.dropRight(count)

Odstráni posledných count znakov

'abcdef'.dropRight(2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
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)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

takeRight

list
<list>.takeRight(count)

Ponechá posledných count prvkov

[1,2,3,4].takeRight(2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

dropLeft

list
<list>.dropLeft(count)

Odstráni prvých count prvkov

[1,2,3,4].dropLeft(2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

dropRight

list
<list>.dropRight(count)

Odstráni posledných count prvkov

[1,2,3,4].dropRight(2)
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Časové funkcie a objektytimestamp · duration · PWLocalTimeČas vyhodnotenia v UTC, IANA pásma, lokálne formátovanie a konverzie.

timestamp and duration

timestamp / duration
timestamp(...) ± duration(...)

K dispozícii zostáva aritmetika a porovnávanie timestampov z core CEL.

timestamp('2020-12-10T00:00:00Z') + duration('1h')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

toLocalTime

PWLocalTime
<timestamp>.toLocalTime(timeZone)

Prevedie UTC na lokálny čas ProjectWise podľa TZDB/IANA názvu.

utcTime.toLocalTime('Europe/London')
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

secondsOffset

int
<PWLocalTime>.secondsOffset

Sprístupní aktuálny posun časového pásma v sekundách.

utcTime.toLocalTime('Europe/Berlin').secondsOffset
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

toUTC

timestamp
<PWLocalTime>.toUTC()

Prevedie objekt lokálneho času späť na UTC timestamp.

utcTime.toLocalTime('Europe/London').toUTC()
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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'))
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

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.

dependent-title-block-date

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) : '---'
Ako to funguje

thisForm číta aktuálnu ešte neuloženú hodnotu autora. Podmienka buď naformátuje čas vyhodnotenia, alebo ponechá placeholder title blocku.

Ilustračné hodnoty v ProjectWisethisForm.TB_DRAWN_BY = 'P.Novák'utcTime = timestamp('2026-08-17T09:15:00Z')
Výsledok'2026-08-17'string
thisFormutcTimeformatconditional
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
file-extension

Prípona súboru

Prečíta poslednú časť názvu priradeného súboru.

[thisDocument.file.name.split('.')].map(r, r[r.size()-1])
Ako to funguje

Singleton list vytvorí lokálnu hodnotu, split rozdelí názov súboru a posledný index vyberie príponu.

Ilustračné hodnoty v ProjectWisethisDocument.file.name = 'BS-A1-DR-001.dgn'
Výsledok'dgn'string
thisDocument.filesplitmapsize
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
fixed-file-name

Ná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)
Ako to funguje

parse vráti jednu mapu výsledku. match určí úspešný vzor a b obsahuje požadovaný fragment.

Ilustračné hodnoty v ProjectWisethisDocument.file.name = '100P20.30.DWG'
Výsledok'20'string
thisDocument.fileparsemapconditional
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
user-initials

Iniciá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()
Ako to funguje

Opis sa rozdelí na slová, každé slovo poskytne prvý znak a join vytvorí výsledný string.

Ilustračné hodnoty v ProjectWisethisUser.description = 'Peter Novák'
Výsledok'PN'string
thisUsersplitmapsubstringjoin
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
document-date

Formátovaný dátum dokumentu

Naformátuje čas zmeny dokumentu pre hodnotu atribútu.

'{0:yyyy-MM-dd}'.format(thisDocument.updatedOn)
Ako to funguje

updatedOn je UTC timestamp; format vráti požadovanú textovú reprezentáciu.

Ilustračné hodnoty v ProjectWisethisDocument.updatedOn = timestamp('2026-08-17T14:20:00Z')
Výsledok'2026-08-17'string
thisDocument.updatedOnformat
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
document-path

Cesta 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.name
Ako to funguje

Funkcia hierarchie vráti objekty Folder, map ponechá názvy, join vloží oddeľovače a na koniec sa pridá názov dokumentu.

Ilustračné hodnoty v ProjectWisefolder names = ['Project', 'Building A', 'Drawings']thisDocument.name = 'A-101.dgn'
Výsledok'Project\Building A\Drawings\A-101.dgn'string
thisFolderthisDocumentgetTopFoldergetFolderPathmapjoin
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

06 · 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
Situácia v ProjectWise

Formulár ukladá ProjectWise login v PW_USERNAME, ale title block potrebuje čitateľný opis používateľa.

Výraz atribútu
getLookup('DMS.Users')
  .filterEquals('name', thisForm.PW_USERNAME)
  .selectOne('description', '')
Ilustračné dátathisForm.PW_USERNAME = 'pnovak'DMS.Users row = {name: 'pnovak', description: 'Peter Novák'}
Výsledok'Peter Novák'string
Čo sa stane, krok za krokom
  1. Otvorí built-in dataset DMS.Users.
  2. Ponechá riadok, ktorého name sa rovná loginu vo formulári.
  3. Vráti description alebo prázdny string, ak nie je dostupný práve jeden riadok.
thisForm.PW_USERNAMEDMS.Usersnamedescription
Zdroj: dodaná BS konfigurácia ProjectWise
PW_USERINITIALSbs-pw-userinitialsVytvorenie iniciál z doplneného celého mena
Situácia v ProjectWise

PW_FULLNAME už obsahuje čitateľné meno a ďalší atribút z neho potrebuje odvodiť krátke iniciály.

Výraz atribútu
thisForm.PW_FULLNAME.trim()
  .split(' ')
  .map(p, p.charAt(0))
  .join()
  .toUpper()
Ilustračné dátathisForm.PW_FULLNAME = 'Peter Novák'
Výsledok'PN'string
Čo sa stane, krok za krokom
  1. Odstráni medzery okolo celého mena.
  2. Rozdelí meno na slová a z každého ponechá prvý znak.
  3. Znaky spojí a prevedie na veľké písmená.
thisForm.PW_FULLNAMEtrimsplitmapcharAtjointoUpper
Zdroj: dodaná BS konfigurácia ProjectWise
TB_DRAWN_BYbs-tb-drawn-byDoplnenie autora title blocku iba po aktivovaní triggera
Situácia v ProjectWise

Trigger rozhodne, či sa zapíše nakonfigurované title-block meno aktuálneho používateľa, alebo zostane placeholder.

Výraz atribútu
thisForm.TRIG_DRAWN == '1'
  ? getLookup('Lkp.UserSupl')
      .filterEquals('PW_USERNAME', thisUser.name)
      .selectOne('PW_TBNAME', '')
  : '---'
Ilustračné dátathisForm.TRIG_DRAWN = '1'thisUser.name = 'pnovak'Lkp.UserSupl row = {PW_USERNAME: 'pnovak', PW_TBNAME: 'P.Novák'}
Výsledok'P.Novák'string
Čo sa stane, krok za krokom
  1. Najprv skontroluje trigger.
  2. V doplnkovom používateľskom lookupe nájde aktuálny login.
  3. Vráti nakonfigurované meno pre title block.
thisForm.TRIG_DRAWNthisUser.nameLkp.UserSuplPW_TBNAME
Zdroj: dodaná BS konfigurácia ProjectWise
FI_ROLE_CODEbs-fi-role-codeOdvodenie role code z hierarchie priečinkov
Situácia v ProjectWise

Rola je zakódovaná v description priečinka na pevnej pozícii pod najvyšším priečinkom.

Výraz atribútu
thisFolder.getTopFolder().getRelativeFolder(-3).description
Ilustračné dátafolder path = Project > Building A > Architecture > DocumentsDocuments.description = 'ARC'
Výsledok'ARC'string
Čo sa stane, krok za krokom
  1. Z priečinka dokumentu prejde na najvyšší priečinok.
  2. Posunie sa tri úrovne späť smerom k dokumentu.
  3. Prečíta description vybraného priečinka.
thisFoldergetTopFoldergetRelativeFolderFolder.description
Zdroj: dodaná BS konfigurácia ProjectWise
RV_DATE_1bs-rv-date-1Zapísanie lokálneho dátumu schválenia
Situácia v ProjectWise

Dátum revízie zostáva placeholderom, kým nie je uvedený schvaľovateľ; potom použije londýnsky kalendárny dátum.

Výraz atribútu
thisForm.TB_APPROVED_BY == '---'
  ? '---'
  : '{0:yyyy-MM-dd}'.format(utcTime.toLocalTime('Europe/London'))
Ilustračné dátathisForm.TB_APPROVED_BY = 'A.Smith'utcTime = timestamp('2026-08-17T22:30:00Z')
Výsledok'2026-08-17'string
Čo sa stane, krok za krokom
  1. Skontroluje, či existuje reálny schvaľovateľ.
  2. Prevedie UTC čas vyhodnotenia do Europe/London.
  3. Naformátuje iba lokálny kalendárny dátum.
thisForm.TB_APPROVED_BYutcTimetoLocalTimeformat
Zdroj: dodaná BS konfigurácia ProjectWise
PW_USERNAMEbs-pw-usernamePonúknutie iba používateľov, ktorí chýbajú v doplnkovom lookupe
Situácia v ProjectWise

Administrátor dopĺňa používateľské záznamy a nemá znovu vidieť loginy, ktoré už sú zaregistrované.

Výraz atribútu
getLookup('DMS.Users')
  .select('name')
  .map(dmsuser,
    !(dmsuser in getLookup('Lkp.UserSupl').select('PW_USERNAME')),
    dmsuser)
Ilustračné dátaDMS.Users names = ['pnovak', 'asmith', 'bnovak']Lkp.UserSupl PW_USERNAME values = ['pnovak', 'asmith']
Výsledokonly bnovak remains selectablevalue-list rows
Čo sa stane, krok za krokom
  1. Načíta mená všetkých používateľov datasource.
  2. Načíta mená, ktoré už existujú v Lkp.UserSupl.
  3. Ponechá iba mená, ktoré nie sú v doplnkovom zozname.
DMS.UsersLkp.UserSuplselectmapin
Zdroj: dodaná BS konfigurácia ProjectWise

07 · 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.y

Správa cez PowerShell

Get-PWCelLibraryExpressionNew-PWCelLibraryExpressionUpdate-PWCelLibraryExpressionRemove-PWCelLibraryExpression

Testovanie cez pwps

Invoke-PWCelExpression podporuje spustenie bez kontextu, v kontexte verzie a v kontexte Atribútov dokumentu so zodpovedajúcimi hodnotami kontextu ProjectWise.

Bez kontextuInvoke-PWCelExpression -Expression "1 + 1"
Kontext verzieInvoke-PWCelExpression -Expression "currentVersion.incrementAlphaVersion()" -CurrentVersion "A"
Kontext atribútov dokumentuInvoke-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_P1
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

08 · 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.

IIFISNULLCHARINDEXDATEADDSUBSTRING

ISO19650 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_attribute
PW01-L01Priamy prepis
PW systémová premenná

Meno aktuálneho používateľa

Nahraďte systémovú premennú používateľa kontextovým objektom ProjectWise CEL.

$USER.NAME$thisUser.name
PW01-L02Priamy prepis
PW systémová premenná

Hodnota poľa aktívneho formulára

Preveďte odkaz na atribút $EDIT na mapu thisForm.

$EDIT#DisciplinethisForm.Discipline
PW01-L03Zmena logiky
PW systémová premenná

Vlastnosť nadradenej Work Area

Nahraďte projektovú systémovú premennú explicitným prechodom cez hierarchiu.

$PROJECT#PROJECT_CodethisFolder.getOwnerWorkArea().properties.Code
PW01-L04Zmena logiky
PW systémová premenná

Aktuá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'))
PW01-L05Priamy prepis
Funkcia SQL

Podmienená hodnota

Nahraďte SQL IIF ternárnym operátorom CEL.

IIF(500 < 1000, 'YES', 'NO')500 < 1000 ? 'YES' : 'NO'
PW01-L06Zmena logiky
Funkcia SQL

Náhradná hodnota pri null

Nahraďte SQL ISNULL explicitnou kontrolou null.

ISNULL(prop, 'ABC')prop == null ? 'ABC' : prop
PW01-L07Zmena logiky
Funkcia SQL

Pozícia znaku v texte

Pri náhrade CHARINDEX zohľadnite rozdielne číslovanie pozícií.

CHARINDEX('C', 'ABC')'ABC'.indexOf('C') + 1
PW01-L08Prepracovanie
PW systémová premenná

Cesta 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
Zdroj: oficiálna dokumentácia Bentley ProjectWise CEL

Primárne zdroje Bentley

ProjectWise Administrator 2026 · PW CEL HelpProjectWise CEL LookupsList of Built-in LookupsLibrary ExpressionsProjectWise Administrator 2026