import { TitleButton } from '../LayoutInterface/Interface/ButtonInterface'; import { CloseSubWindow, CreateAndShowSubWindow, WinInfo} from './SWBase'; import NativeOpenCAX from 'libopencax.so'; import { mwInfo } from '../DispWinInfo/DispWinInfo' import { AppStorageV2, NodeContent} from '@kit.ArkUI'; import { ModelViewTab } from '../ModelViewTab'; @ObservedV2 export class XCompInfo{ @Trace nId?:string; @Trace xId?:string; @Trace name?:string; @Trace icon?:string; @Trace node?:NodeContent; constructor(_nId?:string,_xId?: string, _name?: string,_icon?:string,_node?:NodeContent) { this.nId = _nId ?? undefined; this.xId = _xId ?? undefined; this.name=_name?? undefined; this.icon=_icon?? undefined; this.node=_node?? undefined; } } @ObservedV2 export class XCompInfos{ @Trace infos?:Array; constructor(_infos?:Array) { this.infos = _infos ?? undefined; } } export let xcInfos:XCompInfos = AppStorageV2.connect(XCompInfos, () => new XCompInfos)!; export let ctInfo: XCompInfo = AppStorageV2.connect(XCompInfo, () => new XCompInfo)!; function XNRandomId(): string { // 获取当前时间戳(毫秒) const now = Date.now(); // 取时间戳的最后几位(例如4位)作为基础部分 const timePart = parseInt(now.toString().slice(-4)); // 生成剩余的4位随机数 const randomPart = Math.floor(Math.random() * 10000); // 组合两部分,并取模和偏移以确保在8位数范围内 // 例如: timePart (0-9999) + randomPart (0-9999) -> sum (0-19998) // 需要将其映射到 [10000000, 99999999] // 结果在 [0, 89999999] const combined = (timePart * 10000 + randomPart) % 90000000; // 调整范围到 [10000000, 99999999] return (combined + 10000000).toString(); } //初始化全局XComp管理 export function InitXCompNode(){ //数组为0表示初始化,Native侧这初始化主上下文,否则Native侧初始化共享上下文 const xcIs:XCompInfos = AppStorageV2.connect(XCompInfos, () => new XCompInfos)!; xcIs.infos=new Array; } //创建XComp组件 export function CreateXCompNode(name:string){ const xcIs:XCompInfos = AppStorageV2.connect(XCompInfos, () => new XCompInfos)!; let xInfo:XCompInfo=new XCompInfo; xInfo.nId='n_'+XNRandomId(); xInfo.xId='x_'+XNRandomId(); xInfo.name=name+xInfo.xId; xInfo.node=new NodeContent(); if((xcIs.infos as Array).length>0) { NativeOpenCAX.InitNativeNode(xInfo.nId,xInfo.xId,true,xInfo.node); }else{ NativeOpenCAX.InitNativeNode(xInfo.nId,xInfo.xId,false,xInfo.node); } (xcIs.infos as Array).push(xInfo); console.log(`ArkUI Node ID: ${xInfo.nId}`); console.log(`ArkUI XComp ID: ${xInfo.xId}`); } //获取当前XComp组件 export function CurrentXCompIndex(id:number):XCompInfo{ const xcIs:XCompInfos = AppStorageV2.connect(XCompInfos, () => new XCompInfos)!; return ctInfo=(xcIs.infos as Array)[id]; } //执行命令 export function ExecuteCommand(event:TitleButton){ //事件处理 if(event?.eEvent=='Execute_LoadModel'){ NativeOpenCAX.loadModel("/data/storage/el2/base/haps/entry/files/example/2027.stp"); } if(event?.eEvent=='Create_New'){ CreateXCompNode(""); } //窗体打开 if(event?.eEvent=='Execute_CreateSubWindow'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.3,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); }else if(event?.eEvent=='Execute_ExitSubWindow'){ CloseSubWindow(); } else if(event?.eEvent=='Execute_CreateSubWindow_Options'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); } else if(event?.eEvent=='Execute_NewFileWindow'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); }else if(event?.eEvent=='Execute_SaveAsFileWindow'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); }else if(event?.eEvent=='Execute_ImportFileWindow'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); }else if(event?.eEvent=='Execute_ExportFileWindow'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); } else if(event?.eEvent=='Open_NewModel'){ const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9); CreateAndShowSubWindow(winInfo); } else if(event?.eEvent=='Execute_ExitSubWindow_Options'){ CloseSubWindow(); } //视图切换 if(event?.eEvent=='CMD_VIEW_FRONT'){ NativeOpenCAX.switchView("CMD_VIEW_FRONT"); }else if(event?.eEvent=='CMD_VIEW_TOP'){ NativeOpenCAX.switchView("CMD_VIEW_TOP"); }else if(event?.eEvent=='CMD_VIEW_LEFT_SIDE'){ NativeOpenCAX.switchView("CMD_VIEW_LEFT_SIDE"); }else if(event?.eEvent=='CMD_VIEW_RIGHT_SIDE'){ NativeOpenCAX.switchView("CMD_VIEW_RIGHT_SIDE"); }else if(event?.eEvent=='CMD_VIEW_BOTTOM'){ NativeOpenCAX.switchView("CMD_VIEW_BOTTOM"); }else if(event?.eEvent=='CMD_VIEW_REAR'){ NativeOpenCAX.switchView("CMD_VIEW_REAR"); }else if(event?.eEvent=='CMD_VIEW_ISO'){ NativeOpenCAX.switchView("CMD_VIEW_ISO"); }else if(event?.eEvent=='CMD_VIEW_DIM'){ NativeOpenCAX.switchView("CMD_VIEW_DIM"); } }