1. iot-alert
1.1.1. 此示例功能目的
对特定元素设置闪烁效果,以显示警报消息的方式通知用户。
1.1.2. 描述
数字孪生通常包括来自多个来源的数据。这可以包括来自用于近实时监控资产状态的传感器的数据。根据来自传感器的数据,通知用户与模型的一部分相关的异常或超出范围的情况会很有用。
此示例使用手动过程触发与特定元素相关的警报。一旦触发,应用程序会显示警报通知,然后启动闪烁效果,每秒覆盖元素颜色一次。预览地址
功能:
- 自定义:构件选择、警报名称、警报类型、警报消息都是自主选择或填入
- 定位:点击警报名称可定位缩放到对应的构件周边
- 保存:点击保存,可将当前的警报设置保存到后端
1.1.3. 实现方式
实现过程中,警报通知以tag的形式表达,tag名称自定义,每个tag可对应一个或多个构件id
1. 设定几组变量:
elementList:所有触发闪动效果的构件id列表,例如[0x23223333,0x22783783...]
tagList:记录所有tag的详细信息,例如[{name: "cx尺寸错误", info: "This is an error about", type: "error", ids: ["0x1", "0x9"]}]
blinkingElementsState:所有警报形成的tag列表,例如["cx尺寸错误", "y3位置偏差"...]
elementNameIdMapState: tag和构件id对应表,例如<"cx尺寸错误": ["0x1", "0x9"], "y3位置偏差": ["0x2"]...>
List item
2. 监听selection方法
//定义监听回调方法 const _onSelectionChanged = async (evt: SelectionChangeEventArgs, selectionProvider: ISelectionProvider) => { const selection = selectionProvider.getSelection(evt.imodel, evt.level); setElementsAreSelected(!selection.isEmpty); }; // 监听 Presentation.selection.selectionChange.addListener(_onSelectionChanged);
3. 创建tag
const _onCreateAlert = useCallback((selectedElementState: string[]) => { const tempSet = [...blinkingElementsState]; const tempTag = [...tagList]; tempTag.push({ type: tagType, name: tagName, info: tagInfo + " " + tagName, ids: selectedElementState }); tempSet.push(tagName); setBlinkingElementsState(tempSet); setTagList(tempTag); const map = elementNameIdMapState; map.set(tagName, selectedElementState); IotAlertApi.showAlertNotification(tagType, tagInfo, tagName, map); const ids = createBlinkingElementIdSet(tempSet, map); BlinkingEffect.doBlink(ids); setElementNameIdMapState(map); setTagName(""); }, [blinkingElementsState, elementNameIdMapState, tagInfo, tagName, tagList, tagType]);
4. 实现闪烁效果
const emph = EmphasizeElements.getOrCreate(vp); BlinkingEffect._overrideON = true; const timer = setInterval(() => { setTimeout(() => { emph.overrideElements(BlinkingEffect._ids, vp, ColorDef.white, FeatureOverrideType.ColorOnly, false); }, 1000); setTimeout(() => { emph.clearOverriddenElements(vp); }, 2000); if (!BlinkingEffect._overrideON) { clearInterval(timer); } }, 2000);