iTwinjs 4.10-4.11 更新

撤销更改

目前,撤销一个有缺陷的变更集的唯一方法是从 iModel Hub 中移除它,这可能会导致许多副作用(无法撤销)。一个更好的方法是在时间线中撤销变更集,并将其作为新的变更集引入。尽管这种方法仍然具有侵入性,并且需要锁定Schema,但它更安全,因为它允许撤销操作恢复之前的变更,确保时间线中没有任何内容被永久删除。(任何操作都被记录了,有点像git了)

BriefcaseDb.revertAndPushChanges 允许推送一个单一的变更集,该变更集撤销从当前版本到指定历史变更集的所有变更。

以下是一些细节和要求:

  • 在调用 iModel 时,它不能有任何本地修改。

  • 该操作是原子性的;如果操作失败,数据库将恢复到其之前的状态。

  • 撤销操作需要一个模式锁(对 iModel 的独占锁),因为它不会锁定受撤销影响的每个单独元素。

  • 如果在撤销后没有提供描述,则会创建并推送一个默认的变更集描述,这将释放模式锁。

  • 在模式同步(SchemaSync)期间不会撤销模式更改,或者在不使用模式同步时可以选择性地跳过模式更改。

具体的代码可参见

github\itwinjs-core\full-stack-tests\backend\src\integration\SchemaSync.test.ts

    // 2. Insert a element for the classconst el1 = await createEl({ p1: "test1" });const el2 = await createEl({ p1: "test2" });b1.saveChanges();await b1.pushChanges({ description: "insert 2 elements" });// 3. Update the element.await updateEl(el1, { p1: "test3" });b1.saveChanges();await b1.pushChanges({ description: "update element 1" });// 4. Delete the element.await deleteEl(el2);const el3 = await createEl({ p1: "test4" });b1.saveChanges();await b1.pushChanges({ description: "delete element 2" });// 5. import schema and insert element 4 & update element 3await addPropertyAndImportSchema(b1);const el4 = await createEl({ p1: "test5", p2: "test6" });await updateEl(el3, { p1: "test7", p2: "test8" });b1.saveChanges();await b1.pushChanges({ description: "import schema, insert element 4 & update element 3" });assert.isDefined(findEl(el1));assert.isUndefined(findEl(el2));assert.isDefined(findEl(el3));assert.isDefined(findEl(el4));// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2"]);// 6. Revert to timeline 2await b2.revertAndPushChanges({ toIndex: 3, description: "revert to timeline 2" });assert.equal((await getChanges()).at(-1)!.description, "revert to timeline 2");await b1.pullChanges();assert.isUndefined(findEl(el1));assert.isUndefined(findEl(el2));assert.isUndefined(findEl(el3));assert.isUndefined(findEl(el4));// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2"]);await b2.revertAndPushChanges({ toIndex: 7, description: "reinstate last reverted changeset" });assert.equal((await getChanges()).at(-1)!.description, "reinstate last reverted changeset");await b1.pullChanges();assert.isDefined(findEl(el1));assert.isUndefined(findEl(el2));assert.isDefined(findEl(el3));assert.isDefined(findEl(el4));// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2"]);await addPropertyAndImportSchema(b1);const el5 = await createEl({ p1: "test9", p2: "test10", p3: "test11" });await updateEl(el1, { p1: "test12", p2: "test13", p3: "test114" });b1.saveChanges();await b1.pushChanges({ description: "import schema, insert element 5 & update element 1" });// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3"]);// skip schema changes & auto generated commentawait b1.revertAndPushChanges({ toIndex: 2, skipSchemaChanges: true });assert.equal((await getChanges()).at(-1)!.description, "Reverted changes from 9 to 2 (schema changes skipped)");assert.isUndefined(findEl(el1));assert.isUndefined(findEl(el2));assert.isUndefined(findEl(el3));assert.isUndefined(findEl(el4));assert.isUndefined(findEl(el5));// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3"]);await b1.revertAndPushChanges({ toIndex: 10 });assert.equal((await getChanges()).at(-1)!.description, "Reverted changes from 10 to 10 (schema changes skipped)");assert.isDefined(findEl(el1));assert.isUndefined(findEl(el2));assert.isDefined(findEl(el3));assert.isDefined(findEl(el4));assert.isDefined(findEl(el5));// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3"]);// schema sync should be skip for revertawait b2.pullChanges();const b3 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });assert.isTrue(SchemaSync.isEnabled(b3));await addPropertyAndImportSchema(b1);// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b1.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3", "p4"]);// b3 should get new property via schema syncawait b3.pullChanges();// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b3.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3", "p4"]);// b2 should not see new property even after revert// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b2.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3"]);await b2.revertAndPushChanges({ toIndex: 11 });assert.equal((await getChanges()).at(-1)!.description, "Reverted changes from 11 to 11 (schema changes skipped)");// eslint-disable-next-line @typescript-eslint/no-deprecatedassert.deepEqual(Object.getOwnPropertyNames(b2.getMetaData("TestDomain:Test2dElement").properties), ["p1", "p2", "p3"]);await b1.pullChanges();await b2.pullChanges();await b3.pullChanges();

从代码中可以看到revertAndPushChanges 可以支持:

  • 回退

调用 revertAndPushChanges({ toIndex: N, description }),将当前 briefcase 的状态回退到第 N 个 changeset,并将回退结果作为新的 changeset 推送到服务器。

回退后,所有在 N 之后新增或修改的元素、属性都会被移除或还原,Schema 结构也会恢复到当时的状态。

  • 恢复

调用 revertAndPushChanges({ toIndex: N, description }),将当前 briefcase 的状态回退到第 N 个 changeset,并将回退结果作为新的 changeset 推送到服务器。

回退后,所有在 N 之后新增或修改的元素、属性都会被移除或还原,Schema 结构也会恢复到当时的状态。

  • 跳过 Schema 变更的回退

支持 skipSchemaChanges: true,只回退数据变更,保留 Schema 结构不变。

用于只想撤销数据操作而不影响 Schema 的场景。

Display

实例

某些场景需要反复显示相同的图形。例如,想象你正在编写一个装饰器(Decorator),用于在道路网络的许多交叉路口显示停车标志。你可能会为每个单独的停车标志创建一个 RenderGraphic 并绘制它们,但这样做会通过多次复制相同的几何形状而浪费大量内存,并且通过多次调用绘制操作而降低帧率。简而言之,将一个 glTF 模型在多个指定的位置以实例化方式高效渲染

WebGL 提供了实例化渲染(instanced rendering),以更高效地支持此类用例。你可以定义一个停车标志图形的单一表示形式,然后告诉渲染器在不同的位置、方向和缩放下多次绘制它。iTwin.js 现在提供了易于使用的 API,以便你创建实例化图形:

  • GraphicTemplate 定义图形的外观。你可以通过 GraphicBuilder.finishTemplateRenderSystem.createTemplateFromDescriptionreadGltfTemplate 获取模板。

  • RenderInstances 定义要绘制的模板实例集合。除了变换矩阵(Transform)之外,每个实例还可以覆盖模板外观的某些方面,如颜色和线宽,并且每个实例都可以有一个独特的 Feature,以便每个实例都能作为一个独立的实体行为。你可以使用 RenderInstancesParamsBuilder 创建 RenderInstances

  • RenderSystem.createGraphicFromTemplate 从图形模板和实例集合生成 RenderGraphic

  • GraphicTemplateRenderInstances 都是可重用的——你可以为给定的模板生成多个实例集合,并将相同的实例集合用于多个不同的模板。

对于上述停车标志的例子,你可能有一个表示停车标志的 glTF 模型和一个包含每个停车标志位置的数组。然后,你可以使用以下函数生成一个在这些位置绘制停车标志的图形:

export async function instanceGltfModel(gltf: Uint8Array | object, positions: Point3d[], iModel: IModelConnection): Promise<RenderGraphic> {// Decode the raw glTF as an instanceable  template.const template = (await readGltfTemplate({ gltf, iModel }))?.template;if (!template) {throw new Error("Failed to decode glTF model.");}// Generate an Id for a "model" to contain the instances.const modelId = iModel.transientIds.getNext();// Define multiple instances, one at each of the specified positions.const instancesBuilder = RenderInstancesParamsBuilder.create({ modelId });for (const position of positions) {instancesBuilder.add({// Translate to the specified position.transform: Transform.createTranslation(position),// Assign a unique pickable Id.feature: iModel.transientIds.getNext(),});}const instancesParams = instancesBuilder.finish();const instances = IModelApp.renderSystem.createRenderInstances(instancesParams);// Create a graphic that associates the instances with the template.return IModelApp.renderSystem.createGraphicFromTemplate({ template, instances });
}

主要流程说明

  1. 解码 glTF 模板
    使用 readGltfTemplate 将传入的 glTF 数据(可以是二进制或对象)解码为可实例化的模板(template)。如果解码失败则抛出异常。

  2. 生成临时模型 Id
    通过 iModel.transientIds.getNext() 生成一个唯一的临时模型 Id,用于标识这些实例属于哪个“模型”。

  3. 构建实例参数
    使用 RenderInstancesParamsBuilder 创建实例参数构建器。遍历所有位置(positions),为每个位置:

    • 创建一个平移变换(Transform),将 glTF 模型移动到该位置。
    • 分配一个唯一的 feature Id,便于后续拾取和高亮。
  4. 生成实例参数和实例对象
    调用 finish() 得到所有实例参数,再用 IModelApp.renderSystem.createRenderInstances 创建实例对象。

  5. 生成最终渲染图形
    调用 IModelApp.renderSystem.createGraphicFromTemplate,将模板和实例对象组合成一个可渲染的图形(RenderGraphic),用于在视图中显示。

覆盖线条颜色

iTwin.js 允许在显示时,动态覆盖几何图形的外观。然而,与 SubCategoryAppearanceGeometryParams 不同,它们可以区分“线条颜色”和“填充颜色”,而 FeatureAppearance 只提供一个单一的颜色覆盖,适用于所有类型的几何图形。

为了解决这种差异,我们新增了一种方法,允许你独立于其他几何图形动态覆盖线性几何图形的颜色和透明度。线性几何图形包括开放曲线、线字符串、点字符串以及平面区域的轮廓。

详细解释

  1. FeatureAppearance.lineRgb

    • 作用:控制线性几何图形的颜色。

    • 未定义:如果未定义,线性几何图形将使用 FeatureAppearance.rgb 的颜色。

    • false:表示不对线性几何图形的颜色进行覆盖。

    • 指定颜色:可以指定一个 RgbColor,仅适用于线性几何图形。

  2. FeatureAppearance.lineTransparency

    • 作用:控制线性几何图形的透明度。

    • 未定义:如果未定义,线性几何图形将使用 FeatureAppearance.transparency 的透明度。

    • false:表示不对线性几何图形的透明度进行覆盖。

FeatureAppearance.fromJSON({rgb: RgbColor.fromColorDef(ColorDef.white),lineRgb: false,lineTransparency: 0.5,}),

控制实景显示隐藏

之前通过 DisplayStyleState.attachRealityModel 方法添加实景模型(Context Reality Model),现在可以通过启用 ContextRealityModel.invisible 标志来隐藏。

import { ContextRealityModelProps, ContextRealityModels } from "@itwin/core-common";// 构造实景模型属性
const realityModelProps: ContextRealityModelProps = {tilesetUrl: "https://your-reality-data-url/tileset.json",name: "实景模型名称",description: "描述信息",// 还可以设置 appearanceOverrides、planarClipMask、classifiers 等
};// 获取当前视图的 DisplayStyleSettings
const displayStyle = viewport.displayStyle.settings;// 获取或创建 ContextRealityModels
const contextRealityModels = displayStyle.contextRealityModels;// 添加实景模型
const realityModel = contextRealityModels.add(realityModelProps);// 隐藏实景模型
realityModel.invisible = true;// 显示实景模型
realityModel.invisible = false;

更复杂的控制(如外观覆盖、裁剪等),可以设置 appearanceOverrides、planarClipMask 等属性。

等高线展示

const contourDisplayProps: ContourDisplayProps = {displayContours: true,groups: [{contourDef: {showGeometry: true,majorStyle: { color: ..., pixelWidth: ..., pattern: ... },minorStyle: { color: ..., pixelWidth: ..., pattern: ... },minorInterval: 2,majorIntervalCount: 8,},subCategories: CompressedId64Set.sortAndCompress([ "0x5b", "0x5a" ]),},{contourDef: {showGeometry: false,majorStyle: { ... },minorStyle: { ... },minorInterval: 1,majorIntervalCount: 7,},subCategories: CompressedId64Set.sortAndCompress([ "0x5c", "0x6a" ]),},],
};
  • displayContours: true 必须为 true,才会显示等高线。
  • groups 数组定义了多个等高线分组,每组可以指定不同的样式和适用的 subCategory(子类别)。
  • contourDef 里可以分别设置主等高线(major)和次等高线(minor)的颜色、线宽、线型、间隔等。
  • showGeometry 控制是否同时显示原始几何体。

交互工具

元素定位

在调用 ElementLocateManager.doLocate 之后,现在可以使用 Reset 来选择一些被其他元素遮挡的元素。以前,Reset 只会在定位孔径(locate aperture)内选择可见的元素。

截面视图

  • 在 iTwin.js 中,视图可以嵌套或附加,比如:
    • 一个 SheetView 可以通过 ViewAttachment 附加其他视图;
    • 一个 DrawingView 可以通过 SectionDrawing 附加 SpatialView。
  • 当你在屏幕上点击或定位元素时,实际命中的几何体可能并不直接属于当前主视图,而是属于某个被附加的子视图。
  • HitPath 结构体就用来描述这种“命中路径”,它包含两个可选属性:
    • viewAttachment:描述命中点是通过哪个 ViewAttachment 附加视图获得的(如 SheetView 附加的 DrawingView)。
    • sectionDrawingAttachment:描述命中点是通过哪个 SectionDrawing 附加视图获得的(如 DrawingView 附加的 SpatialView)

Presentation

扩展数据属性

计算属性规范中新增了一个可选的 extendedData 属性。该属性允许将计算属性字段与一些额外信息关联起来,这在动态创建的计算属性中可能特别有用

量值支持

添加对“比例”格式类型的支持(例如“1:2”)

示例:格式化比例

假设已经注册并初始化了一个 UnitsProvider,以下是格式化比例的方法:

const ratioFormatProps: FormatProps = {type: "Ratio",ratioType: "OneToN",  // Formats the ratio in "1:N" formcomposite: {includeZero: true,units: [{ name: "Units.HORIZONTAL_PER_VERTICAL" },],},
};const ratioFormat = new Format("Ratio");
ratioFormat.fromJSON(unitsProvider, ratioFormatProps).catch(() => {});

支持Node22

支持Electron 33

API 的弃用

@itwin/appui-abstract

LayoutFragmentPropsContentLayoutPropsLayoutSplitPropsBaseLayoutHorizontalSplitPropsLayoutVerticalSplitPropsStandardContentLayouts 已被弃用。请改用 @itwin/appui-react 中的相同 API。

BackendItemsManager 是内部 API,本不应被外部使用。它已被弃用,并将在 5.0.0 版本中被移除。请改用 @itwin/appui-react 中的 UiFramework.backstage

@itwin/core-backend

IModelHost.snapshotFileNameResolverFileNameResolver 已被弃用。请确保为 SnapshotConnection.openFile 提供已解析的文件路径。

@itwin/core-frontend

SnapshotConnection.openRemote 已被弃用。在 Web 应用程序中,使用 CheckpointConnection.openRemote 来打开对 iModel 的连接。

@itwin/core-quantity

  • FormatTypeScientificTypeShowSignOption 已从整型枚举重构为字符串枚举,并新增了 RatioType 作为字符串枚举。由于字符串枚举不需要序列化方法,相关的 toString 函数(包括 formatTypeToStringscientificTypeToStringshowSignOptionToString)已被弃用。

  • Parser.parseToQuantityValue 已被弃用。请改用现有的 Parser.parseQuantityString 方法。

@itwin/presentation-common

PresentationRpcInterface 的所有公共方法已被弃用。今后,不应直接调用 RPC 接口。应改用公共包装器,例如 PresentationManager

已弃用的 ECSqlStatement

ECSqlStatement 在 4.11 版本中已被弃用。请改用 IModelDb.createQueryReaderECDb.createQueryReader

以下与 ECSqlStatement 相关的类也被标记为弃用:

  • ECEnumValue

  • ECSqlValue

  • ECSqlValueIterator

  • ECSqlColumnInfo

在并发查询中,QueryOptions.convertClassIdsToClassNamesQueryOptionsBuilder.setConvertClassIdsToNames() 已被弃用。请改用 ECSQL 的 ec_classname() 函数将类 ID 转换为类名称。

即将被移除的 API

以下 @itwin/core-common 中的 API 正在从 @itwin/core-bentley 重新导出,并且在下一个主版本中将被移除,而不会提前标记为弃用。请改为从 @itwin/core-bentley 导入它们。

  • BentleyStatus

  • BentleyError

  • IModelStatus

  • BriefcaseStatus

  • DbResult

  • ChangeSetStatus

  • GetMetaDataFunction

  • LogFunction

  • LoggingMetaData

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90310.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSS-15】深入理解CSS transition-duration:掌握过渡动画的时长控制

在现代网页设计中&#xff0c;平滑的过渡效果是提升用户体验的关键因素之一。CSS transitions 为我们提供了一种简单而强大的方式来实现元素在不同状态之间的平滑过渡&#xff0c;而 transition-duration 属性则是控制这些过渡效果时长的核心工具。本文将全面探讨 transition-d…

mysql-笔记

1. 安装mysql # 使用brew安装 brew install mysql# 查看是否安装成功 mysql -V 相关文档&#xff1a; mac&#xff1a;macOS下MySQL 8.0 安装与配置教程 - KenTalk - 博客园 Linux安装&#xff1a;linux安装mysql客户端_linux mysql 客户端-CSDN博客 2. 启动mysql 每次使…

Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践

Spring Boot启动优化7板斧&#xff1a;砍掉70%启动时间的魔鬼实践1. 延迟初始化&#xff1a;按需加载的智慧2. 组件扫描精准打击&#xff1a;告别无差别扫描3. JVM参数调优&#xff1a;启动加速的隐藏开关4. 自动配置瘦身&#xff1a;砍掉Spring Boot的"赘肉"5. 类加…

从0开始学习计算机视觉--Day08--卷积神经网络

之前我们提到&#xff0c;神经网络是通过全连接层对输入做降维处理&#xff0c;将输入的向量通过矩阵和激活函数进行降维&#xff0c;在神经元上输出激活值。而卷积神经网络中&#xff0c;用卷积层代替了全连接层。 不同的是&#xff0c;这里的输入不再需要降维&#xff0c;而…

解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案

效果图报错通过对实例当前截屏的分析发现&#xff0c;实例因 Linux实例内存空间不足&#xff0c;导致操作系统出现内存溢出&#xff08;OOM&#xff09; 无法正常启动。请您根据 Code&#xff1a;1684829582&#xff0c;在文档中查询该问题对应的修复方案&#xff0c;并通过VNC…

Serverless JManus: 企业生产级通用智能体运行时

作者&#xff1a;丛霄、陆龟 概述&#xff1a;本文介绍如何使用 JManus 框架构建通用智能体应用&#xff0c;部署并运行在 Serverless 运行时&#xff0c;构建企业级高可用智能体应用的实践经验。基于阿里云 Serverless 应用引擎SAE 运行稳定高可用的智能体应用&#xff0c; 基…

MySQL的数据目录

导读&#xff1a;根据前面的所学知识&#xff0c;我们知道了InnoDB存储引擎存储数据的数据结构、存储过程&#xff0c;而被组织好的数据则被存储在操作系统的磁盘上&#xff0c;当我们在对表数据进行增删改查时&#xff0c;其实就是InnoDB存储引擎与磁盘的交互。此外&#xff0…

Web前端开发: :has功能性伪类选择器

:has功能性伪类选择器::has() 是 CSS 中的一个功能性伪类选择器&#xff0c;它允许开发者根据元素的后代元素、兄弟元素或后续元素的存在或状态来选择目标元素。它本质上是一个“父选择器”或“关系选择器”&#xff0c;解决了 CSS 长期以来无法根据子元素反向选择父元素的痛点…

深度学习8(梯度下降算法改进2)

目录 RMSProp 算法 Adam算法 学习率衰减 RMSProp 算法 RMSProp(Root Mean Square Prop)算法是在对梯度进行指数加权平均的基础上&#xff0c;引入平方和平方根。 其中e是一个非常小的数&#xff0c;防止分母太小导致不稳定,当 dw 或 db 较大时&#xff0c;(du)2,(db)2会较大&…

JAVA面试宝典 -《网络编程核心:NIO 与 Netty 线程模型详解》

网络编程核心&#xff1a;NIO 与 Netty 线程模型详解 文章目录网络编程核心&#xff1a;NIO 与 Netty 线程模型详解一、传统 BIO 模型&#xff1a;排队买奶茶的阻塞模式 &#x1f964;1.1 专业解释1.2 简单点比喻1.3 简单示例二、NIO 模型&#xff1a;智能叫号餐厅系统 &#x…

蓝桥杯 第十六届(2025)真题思路复盘解析

本文以洛谷平台所提供的题目描述及评测数据为基础进行讲解。 前言&#xff1a;这是本人的蓝桥杯试卷&#xff0c;大概排省一前40%的位置&#xff0c;实际上这届题目偏难&#xff0c;我没有做出太多的有效得分。我把当时的思路和现在学习的思路都复盘进来&#xff0c;希望给大家…

兰顿蚂蚁路径lua测试

兰顿蚂蚁local p0 local x,y,z0,7,0 local function add() local result,id Block:getBlockID(x,y,z)if id1 thenBlock:destroyBlock(x,y,z,false) pp90 elseBlock:setBlockAll(x,y,z,1,0) pp-90 end x,zx-math.floor(0.5math.sin(math.rad(p))),z-math.floor(0.5math.cos(m…

【Axure RP】什么是Axure?Axure可以用来做什么?

【Axure RP】什么是Axure&#xff1f;Axure可以用来做什么&#xff1f; 目录【Axure RP】什么是Axure&#xff1f;Axure可以用来做什么&#xff1f;Axure RP简介Axure RP 是什么&#xff1f;Axure RP核心功能和应用场景Axure RP简介 Axure RP 是什么&#xff1f; Axure RP 是一…

Java项目:基于SSM框架实现的畅玩北海旅游网站管理系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本畅玩北海旅游网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

NuxtJS中网络请求模块的封装与最佳实战

在网络开发中&#xff0c;封装一个简洁、高效的网络请求模块对于项目的可维护性和扩展性至关重要。本文将详细介绍如何在NuxtJS中封装一个通用的网络请求模块&#xff0c;并结合最佳实践来说明如何使用它来进行网络请求。良好的代码结构和封装&#xff0c;不但结构清晰还能够大…

云归子批量混剪软件批量剪辑软件批量分割视频更新记录

www.yunguizi.com 优化显卡硬件加速配置 ⚡ 优化 2025年07月07日 版本 v1.1.6 优化显卡硬件加速配置 修复了一些重要内容 &#x1f41b; 修复 2025年07月06日 版本 v1.1.6 修复了一些重要内容 重构读写机制 ⚡ 优化 2025年07月06日 版本 v1.1.6 优化了一些重要内容&#xff1b;…

SpringBoot校园外卖服务系统设计与实现源码

概述 基于SpringBoot开发的校园外卖服务系统&#xff0c;实现了从外卖管理到订单处理的全流程数字化解决方案&#xff0c;包含外卖管理、订单处理、用户管理等全方位功能。 主要内容 核心功能模块&#xff1a; ​​个人信息管理​​&#xff1a; 修改密码个人信息修改 ​​…

东软8位MCU低功耗调试总结

简介主控选用8位ES7P7021&#xff0c;应用于磁吸无线充电场景&#xff0c;有一个双向C口&#xff08;IP5219&#xff09;&#xff0c;MCU控制电量灯显示&#xff0c;通过IIC控制C口的降额&#xff0c;插入TYPE-C线之后有一个外部中断信号&#xff0c;触发MCU唤醒&#xff0c;开…

什么是 3D 文件?

3D 文件是 3D 对象的数字表示形式&#xff0c;可以在计算机辅助设计 &#xff08;CAD&#xff09; 软件中创建或编辑。它们包含有关物体的形状、大小和结构的信息&#xff0c;对 3D 打印过程至关重要。3D 文件格式允许在不同的程序和打印机之间交换 3D 模型&#xff0c;并确定模…

语言模型 RLHF 实践指南(一):策略网络、价值网络与 PPO 损失函数

在使用 Proximal Policy Optimization&#xff08;PPO&#xff09;对语言模型进行强化学习微调&#xff08;如 RLHF&#xff09;时&#xff0c;大家经常会问&#xff1a; 策略网络的动作概率是怎么来的&#xff1f;价值网络的得分是如何计算的&#xff1f;奖励从哪里来&#xf…