Rvzt Decode-Encode
Summary
1.Search Sets
2.Appearance Templates
3.Rvzt API
- 3.1 Get Tokens
- 3.2 Refresh Tokens
- 3.3 Get Licence
- 3.4 Get Projects
- 3.5 Get Sheets
- 3.6 Get Workflows
- 3.7 Add Stamps
1. Search Sets
1.1 Get Search Sets
Expand
Exported Search Sets are saved in a .vimsst file format. Let's start by looking at the content of one search set with only two conditions and an OR operator:The content looks like this:
b'\n\x10MarkerSearchSets\x10\x01\x18\x00"\xce\x02\n$0cca6a0f-ca95-4dd6-bd50-a71e109587ae\x10\x80\xe1\xbf\xb8\xb7\xb9\x9a\xef\x08\x18\x80\xe1\xbf\xb8\xb7\xb9\x9a\xef\x08"$07408a06-3eae-47dc-aaed-39aa1fc2f6b2(\x000\x01:#Actual Start or End Date_2026-02-01B\xc2\x01\x08\x00\x12]\x08\x00\x12Y\x12W\x08\n\x12\x19\n\nTimeLiner+\x12\x0bTimeLiner +\x1a&\n\x11Actual Start Date\x12\x11Actual Start Date"\x0e\x08\x06\x18\x80\xde\xac\x98\xa2\x9c\x98\xef\x08(\x00(\x06\x12\x02\x08\x03\x12Y\x08\x00\x12U\x12S\x08\n\x12\x19\n\nTimeLiner+\x12\x0bTimeLiner +\x1a"\n\x0fActual End Date\x12\x0fActual End Date"\x0e\x08\x06\x18\x80\xde\xac\x98\xa2\x9c\x98\xef\x08(\x00(\x06\x18\x00'Which makes it more readable:
{'1': b'MarkerSearchSets', '2': 1, '3': 0, '4': {'1': b'0cca6a0f-ca95-4dd6-bd50-a71e109587ae', '2': 639064519730000000, '3': 639064519730000000, '4': b'07408a06-3eae-47dc-aaed-39aa1fc2f6b2', '5': 0, '6': 1, '7': b'Actual Start or End Date_2026-02-01', '8': {'1': 0, '2': [{'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual Start Date', '2': b'Actual Start Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}, {'1': 3}, {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual End Date', '2': b'Actual End Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}], '3': 0}}}Output:
[ {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual Start Date', '2': b'Actual Start Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}, {'1': 3}, {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual End Date', '2': b'Actual End Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}} ]Key '4' in the decoded data is now a list of objects:
{'1': b'MarkerSearchSets', '2': 1, '3': 0, '4': [{'1': b'c536c502-4483-4218-bec4-ba706ad3fb71', '2': 639075091320000000, '3': 639075091320000000, '5': 0, '6': 2, '7': b'Test'}, {'1': b'81160f0d-1160-4928-8567-97312b71db46', '2': 639064519730000000, '3': 639075091360000000, '4': b'c536c502-4483-4218-bec4-ba706ad3fb71', '5': 0, '6': 1, '7': b'Actual Start or End Date_2026-02-01', '8': {'1': 0, '2': [{'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual Start Date', '2': b'Actual Start Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}, {'1': 4}, {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual End Date', '2': b'Actual End Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}], '3': 0}}, {'1': b'774f3d34-9e56-4f23-bbc8-ed998a997574', '2': 639057743530000000, '3': 639075091380000000, '4': b'c536c502-4483-4218-bec4-ba706ad3fb71', '5': 0, '6': 1, '7': b'Ex Bridge Demo Hidden', '8': {'1': 0, '2': [{'1': 1}, {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'EXISTING BRIDGE'}, '5': 6}}}, {'1': 4}, {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 5 - Existing Abutment Demo Pile Sheet Removal$T-Roffs'}, '5': 6}}}, {'1': 3}, {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 5 - Existing Abutment Demo Pile Sheet Removal$T-Roffs'}, '5': 6}}}, {'1': 2}, {'1': 3}, {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 6 - Excavation Skirt Wall$Link Slab'}, '5': 6}}}], '3': 1}}]}If we place the previous Search Set inside a folder named "Test", the output will be:
searchsets are inside a folder id: b'c536c502-4483-4218-bec4-ba706ad3fb71', folder name: Test id: b'81160f0d-1160-4928-8567-97312b71db46', Search Set name: Actual Start or End Date_2026-02-01 conditions id: b'81160f0d-1160-4928-8567-97312b71db46', name: Actual Start or End Date_2026-02-01 {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual Start Date', '2': b'Actual Start Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}} {'1': 4} {'1': 0, '2': {'2': {'1': 10, '2': {'1': b'TimeLiner+', '2': b'TimeLiner +'}, '3': {'1': b'Actual End Date', '2': b'Actual End Date'}, '4': {'1': 6, '3': 639054721500000000, '5': 0}, '5': 6}}}the output will be:
```text id: b'774f3d34-9e56-4f23-bbc8-ed998a997574', Search Set name: Ex Bridge Demo Hidden conditions id: b'774f3d34-9e56-4f23-bbc8-ed998a997574', name: Ex Bridge Demo Hidden {'1': 1} {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'EXISTING BRIDGE'}, '5': 6}}} {'1': 4} {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 5 - Existing Abutment Demo Pile Sheet Removal$T-Roffs'}, '5': 6}}} {'1': 3} {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 5 - Existing Abutment Demo Pile Sheet Removal$T-Roffs'}, '5': 6}}} {'1': 2} {'1': 3} {'1': 0, '2': {'2': {'1': 0, '2': {'1': b'LcOaNode', '2': b'Item'}, '3': {'1': b'LcOaNodeLayer', '2': b'Layer'}, '4': {'1': 5, '2': b'STAGE 6 - Excavation Skirt Wall$Link Slab'}, '5': 6}}} ```1.2 Create Search Sets with xml
Expand
1.3 Create Search Sets with vimsst
Expand
4. Create Appearance Templates
The most efficient way to create appearance templates is to use search sets. Search sets can be added to apperance templates using their id and their name. Therefore before generating appearance templates we need to collect all the search sets that we will be using.
We can create
5. Save the edited file
filename = 'output.vimsst'
with open(filename, "wb") as f:
f.write(encItem)
print ("File saved")
Written on February 1, 2026