next-flow-interface 0.26.16 → 0.26.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.d.ts +91 -23
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -4979,11 +4979,38 @@ export declare class RsNodeService {
4979
4979
  /**
4980
4980
  * 生成节点指纹
4981
4981
  *
4982
- * 根据节点的多种属性生成唯一指纹,用于区分同名节点。
4983
- * 包含:位置、旋转、缩放、子节点数量、Mesh 顶点等信息。
4982
+ * 根据节点的多种几何属性生成唯一指纹字符串,用于区分同名节点。
4983
+ * 指纹包含节点的空间变换信息和网格几何特征。
4984
+ *
4985
+ * ## 指纹组成
4986
+ *
4987
+ * | 前缀 | 含义 | 适用类型 |
4988
+ * |------|------|----------|
4989
+ * | C | 子节点数量 | 所有 Node |
4990
+ * | P | 位置 (position) | TransformNode 及子类 |
4991
+ * | R | 旋转 (rotation) | TransformNode 及子类 |
4992
+ * | S | 缩放 (scaling) | TransformNode 及子类 |
4993
+ * | V | 顶点数量 | Mesh |
4994
+ * | I | 索引数量(面数×3) | Mesh |
4995
+ * | B | 包围盒 min/max | Mesh |
4996
+ * | D | 采样顶点坐标 | Mesh |
4997
+ *
4998
+ * ## 采样策略
4999
+ *
5000
+ * 对于 Mesh 节点,会采样 3.33%、50%、96.67% 位置的顶点坐标,
5001
+ * 以较小的数据量捕获网格的几何特征。
4984
5002
  *
4985
5003
  * @param node - Babylon.js 节点对象
4986
- * @returns 指纹字符串
5004
+ * @returns 指纹字符串,格式如 `C2P10000200003000R00000000000000S10000100001000V1234I5678B...D...`
5005
+ *
5006
+ * @example
5007
+ * ```typescript
5008
+ * const fingerprint = RsNodeService.instance.generateFingerprint(meshNode)
5009
+ * // fingerprint = "C0P10000200003000R00000000000000S10000100001000V1024I3072B..."
5010
+ * ```
5011
+ *
5012
+ * @see {@link matchOriginalNodes} 使用指纹进行节点匹配
5013
+ * @see {@link rescueGenerateSceneNode} 生成场景时调用此方法
4987
5014
  */
4988
5015
  generateFingerprint(node: Node_2): string;
4989
5016
  /**
@@ -5065,31 +5092,35 @@ export declare class RsNodeService {
5065
5092
  */
5066
5093
  getMidByNid(nid: string): string | null;
5067
5094
  /**
5068
- * 分析指定mid的模型加载内部所有节点
5095
+ * 分析并加载指定模型的所有节点映射
5069
5096
  *
5070
- * RvSceneService 中获取所有来自该 mid 的 RvSceneNode
5071
- * 并将 root 及其内部的所有节点与 RvSceneNode 对应上,调用 addNodePair 完成加载。
5072
- * 支持复制节点:带有 source.copy 的节点会从源节点 clone。
5097
+ * 当模型文件加载完成后调用此方法,将 RhineVar 协同数据中的 RvSceneNode
5098
+ * Babylon.js 场景中的实际节点建立映射关系。
5073
5099
  *
5074
- * @param mid - 模型的 mid
5075
- * @param root - 该模型的根节点
5076
- */
5077
- analyzeSceneNode(mid: string, root: Node_2): void;
5078
- /**
5079
- * 匹配原始节点(非复制节点)
5100
+ * 执行流程:
5101
+ * 1. RvSceneService 获取所有 source.mid 为该 mid 的原始节点(非复制节点)
5102
+ * 2. 调用 matchOriginalNodes 将协同数据节点与 Babylon 节点进行匹配
5103
+ * 3. 匹配成功后通过 addNodePair 建立 nid 到 Node 的映射
5080
5104
  *
5081
- * @param rvSceneNodes - 原始 RvSceneNode 列表
5082
- * @param root - Babylon.js 根节点
5083
- */
5084
- private matchOriginalNodes;
5085
- /**
5086
- * 处理复制节点
5105
+ * @param mid - 模型ID,用于筛选属于该模型的 RvSceneNode
5106
+ * @param root - 模型的 Babylon.js 根节点对象
5087
5107
  *
5088
- * 按依赖顺序处理复制节点,确保源节点已存在后再 clone。
5108
+ * @throws {Error} 当找不到任何属于该 mid 的 RvSceneNode 时抛出异常
5089
5109
  *
5090
- * @param copyNodes - 带有 source.copy 的 RvSceneNode 列表
5110
+ * @example
5111
+ * ```typescript
5112
+ * // 模型加载完成后建立节点映射
5113
+ * const root = loadedModel.rootNode
5114
+ * RsNodeService.instance.analyzeSceneNode('model-123', root)
5115
+ *
5116
+ * // 之后可以通过 nid 获取节点
5117
+ * const node = RsNodeService.instance.getNodeByNid('model-123--L0-N0')
5118
+ * ```
5119
+ *
5120
+ * @see {@link matchOriginalNodes} 内部匹配逻辑
5121
+ * @see {@link generateSceneNode} 首次生成场景节点(与此方法互补)
5091
5122
  */
5092
- private processCopyNodes;
5123
+ analyzeSceneNode(mid: string, root: Node_2): void;
5093
5124
  /**
5094
5125
  * 根据模型ID获取文件ID (fid)
5095
5126
  *
@@ -5163,7 +5194,35 @@ export declare class RsNodeService {
5163
5194
  export declare class RsSceneService {
5164
5195
  static get instance(): RsSceneService;
5165
5196
  private constructor();
5197
+ /**
5198
+ * 同步所有 Babylon 节点与 RvSceneNode 协同数据
5199
+ *
5200
+ * 将 Babylon.js 场景中的节点树结构与 RhineVar 协同数据中的 RvSceneNode 完全对齐。
5201
+ *
5202
+ * ## 同步流程
5203
+ *
5204
+ * 1. **创建缺失的 copy 节点**:检查所有带 `source.copy` 的 RvSceneNode,
5205
+ * 若对应 Babylon 节点不存在则 clone 创建。按层级顺序处理,确保父节点先于子节点创建。
5206
+ * 2. **同步 parent 关系**:检查所有节点的父子关系,修正不一致的 parent 指向。
5207
+ * 3. **同步 deleted 状态**:将 RvSceneNode 的 `deleted` 字段同步到 Babylon 节点的 `enabled` 状态。
5208
+ *
5209
+ * @throws {Error} 当 copy 源节点不存在时抛出异常
5210
+ * @throws {Error} 当 Babylon clone 操作失败时抛出异常
5211
+ */
5166
5212
  syncAll(): void;
5213
+ /**
5214
+ * 同步单个节点的 Babylon 状态与 RvSceneNode 协同数据
5215
+ *
5216
+ * @param nid - 节点唯一标识符
5217
+ * @param sceneNode - RvSceneNode 协同数据,默认从 RvSceneService 获取
5218
+ * @param targetNode - 目标 Babylon 节点,默认从 RsNodeService 获取
5219
+ * @param parentNode - 父 Babylon 节点,默认从 RsNodeService 获取
5220
+ * @returns 是否发生了变更
5221
+ *
5222
+ * @throws {Error} 当非 copy 节点的 Babylon 节点不存在时抛出异常
5223
+ * @throws {Error} 当 copy 源节点不存在时抛出异常
5224
+ * @throws {Error} 当 Babylon clone 操作失败时抛出异常
5225
+ */
5167
5226
  sync(
5168
5227
  nid: string,
5169
5228
  sceneNode?: RvSceneNode | null,
@@ -5506,6 +5565,7 @@ export declare enum RvBasicType {
5506
5565
  ICO_SPHERE = "ICO_SPHERE",
5507
5566
  CAPSULE = "CAPSULE",
5508
5567
  PLANE = "PLANE",
5568
+ TRANSFORM_NODE = "TRANSFORM_NODE",
5509
5569
  }
5510
5570
 
5511
5571
  /**
@@ -6042,6 +6102,7 @@ export declare class RvModelService {
6042
6102
  has(mid: string): boolean;
6043
6103
  hasFid(fid: string): boolean;
6044
6104
  add(rvModel: RvModel): string;
6105
+ addTransformNode(): string;
6045
6106
  remove(mid: string): boolean;
6046
6107
  generateId(): string;
6047
6108
  }
@@ -6343,10 +6404,11 @@ export declare class RvSceneService {
6343
6404
  isAncestor(nid: string, of: string): boolean;
6344
6405
  isParent(nid: string, of: string): boolean;
6345
6406
  isChild(nid: string, of: string): boolean;
6407
+ newNode(fromNid?: string): void;
6346
6408
  move(nid: string, newParent?: string): void;
6347
6409
  delete(nid: string): void;
6348
6410
  getDescendantsWithSelf(nid: string): string[];
6349
- generateId(mid: string, layer: number, index: number): string;
6411
+ generateId(mid: string, layer?: number, index?: number): string;
6350
6412
  generateIdAndNameForCopy(fromNid: string): {
6351
6413
  nid: string;
6352
6414
  name: string;
@@ -6465,6 +6527,7 @@ export declare class SceneService {
6465
6527
  offsetX: number;
6466
6528
  offsetY: number;
6467
6529
  };
6530
+ newNode(fromNid?: string): void;
6468
6531
  /**
6469
6532
  * 批量复制
6470
6533
  *
@@ -6753,6 +6816,7 @@ export declare interface Status {
6753
6816
  PluginPreLoaded: boolean;
6754
6817
  FileLoaded: boolean;
6755
6818
  ModelLoaded: boolean;
6819
+ SceneLoaded: boolean;
6756
6820
  PluginPreRendered: boolean;
6757
6821
  Rendered: boolean;
6758
6822
  Shown: boolean;
@@ -6806,6 +6870,10 @@ export declare class StatusService {
6806
6870
  unsubscribeModelLoaded(subscriber: StatusChangeSubscriber): void;
6807
6871
  afterModelLoaded(subscriber: StatusChangeSubscriber): void;
6808
6872
  waitModelLoaded(): Promise<boolean>;
6873
+ subscribeSceneLoaded(subscriber: StatusChangeSubscriber): () => void;
6874
+ unsubscribeSceneLoaded(subscriber: StatusChangeSubscriber): void;
6875
+ afterSceneLoaded(subscriber: StatusChangeSubscriber): void;
6876
+ waitSceneLoaded(): Promise<boolean>;
6809
6877
  subscribePluginPreRendered(subscriber: StatusChangeSubscriber): () => void;
6810
6878
  unsubscribePluginPreRendered(subscriber: StatusChangeSubscriber): void;
6811
6879
  afterPluginPreRendered(subscriber: StatusChangeSubscriber): void;
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "valtio": "2.1.7",
37
37
  "rhine-var": "0.11.2"
38
38
  },
39
- "version": "0.26.16",
39
+ "version": "0.26.18",
40
40
  "author": "NextFlow",
41
41
  "license": "Apache-2.0",
42
42
  "keywords": [