opencascade AIS_Manipulator源码学习
前言
AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。
详细功能
交互对象类,通过鼠标操控另一个交互对象或一组对象的局部变换。
它管理3D空间中的三种操作类型:
- 通过轴进行平移
- 轴内缩放
- 围绕轴旋转
要启用这些模式之一,需要激活选择模式(从1到3)。
操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。
此外,每个轴可以被隐藏或显示。
以下步骤演示了如何为交互对象附加、配置和使用操作器:
步骤1. 创建操作器对象并调整其外观:
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);
// 将操作器附加到已显示的对象,并管理操作模式
aManipulator->AttachToObject (anAISObject);aManipulator->EnableMode (AIS_Manipulator::Translation);aManipulator->EnableMode (AIS_Manipulator::Rotation);aManipulator->EnableMode (AIS_Manipulator::Scaling);
请注意,你可以只启用一种操作模式,但显示所有的可视部分。
这段代码允许你查看操作器并选择其操作部分。
请注意,操作器在部分选择时激活模式。
如果此模式已激活,则不会对操作器进行选择。
它可以通过高亮显示激活。启用此功能:
aManipulator->SetModeActivationOnDetection (Standard_True);
步骤2. 在事件处理链中使用以下代码对对象进行变换:
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode()){aManipulator->StartTransform (anXPix, anYPix, aV3dView);}
…
// 或者跟踪鼠标移动事件
if (aManipulator->HasActiveMode()){aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();}
…
// 或者捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);
步骤3. 要停用当前操作模式使用:
aManipulator->DeactivateCurrentMode();
步骤4. 要从对象上分离操作器使用:
aManipulator->Detach();
最后一个方法会删除操作器对象。
AIS_Manipulator
是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。以下是 AIS_Manipulator
类的详细介绍:
主要功能
AIS_Manipulator
管理 3D 空间中的三种主要变换操作:
- 平移:沿着指定的轴进行移动。
- 缩放:沿着指定的轴进行缩放。
- 旋转:围绕指定的轴进行旋转。
变换模式
要启用某种变换模式,需要激活对应的选择模式(从 1 到 3)。操作器的位置信息定义了三个正交变换轴。可以为每个轴或所有轴禁用特定的变换模式。此外,每个轴可以被隐藏或显示。
方法
使用步骤
步骤 1: 创建并配置操作器对象
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);
步骤 2: 将操作器附加到对象并管理操作模式
aManipulator->AttachToObject (anAISObject);
aManipulator->EnableMode (AIS_Manipulator::Translation);
aManipulator->EnableMode (AIS_Manipulator::Rotation);
aManipulator->EnableMode (AIS_Manipulator::Scaling);
步骤 3: 启用检测时激活模式
aManipulator->SetModeActivationOnDetection (Standard_True);
步骤 4: 在事件处理链中使用操作器进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform (anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform (anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);
步骤 5: 停用当前变换模式
aManipulator->DeactivateCurrentMode();
步骤 6: 从对象上分离操作器
aManipulator->Detach();
代码示例
下面是一个完整的示例,演示如何使用 AIS_Manipulator
来操控一个交互对象:
#include <AIS_Manipulator.hxx>
#include <AIS_Shape.hxx>
#include <V3d_View.hxx>
#include <Geom_CartesianPoint.hxx>
#include <TopoDS_Shape.hxx>
#include <BRepPrimAPI_MakeBox.hxx>// 创建一个形状
TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100, 100, 100).Shape();
Handle(AIS_Shape) anAISObject = new AIS_Shape(aBox);// 创建并配置操作器
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
aManipulator->SetPart (0, AIS_Manipulator::Scaling, Standard_False);
aManipulator->SetPart (1, AIS_Manipulator::Rotation, Standard_False);// 将操作器附加到对象并启用操作模式
aManipulator->AttachToObject(anAISObject);
aManipulator->EnableMode(AIS_Manipulator::Translation);
aManipulator->EnableMode(AIS_Manipulator::Rotation);
aManipulator->EnableMode(AIS_Manipulator::Scaling);// 启用检测时激活模式
aManipulator->SetModeActivationOnDetection(Standard_True);// 在事件处理中进行变换
// 捕捉鼠标按下事件
if (aManipulator->HasActiveMode())
{aManipulator->StartTransform(anXPix, anYPix, aV3dView);
}
// 跟踪鼠标移动事件
if (aManipulator->HasActiveMode())
{aManipulator->Transform(anXPix, anYPix, aV3dView);aV3dView->Redraw();
}
// 捕捉鼠标释放事件(应用)或逃逸事件(取消)
aManipulator->StopTransform(/*Standard_Boolean toApply*/);// 停用当前变换模式
aManipulator->DeactivateCurrentMode();// 从对象上分离操作器
aManipulator->Detach();
通过以上步骤和示例代码,用户可以在 OpenCASCADE 应用中使用 AIS_Manipulator
类来实现对三维对象的直观变换操作。
示例
1
构造一个具有默认位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator();
2
构造一个具有输入位置和轴位置并显示所有部分的操作器对象。
Standard_EXPORT AIS_Manipulator (const gp_Ax2& thePosition);
3
禁用或启用某个轴上的平移、旋转或缩放的可视部分。
3
默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const Standard_Integer theAxisIndex, const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);
4
禁用或启用所有轴上的平移、旋转或缩放的可视部分。
默认情况下所有部分都是启用的(将显示)。
启用或禁用操作器的可视部分不会管理操作(选择)模式。
如果轴索引 < 0 或 > 2,则会引发程序错误。
Standard_EXPORT void SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled);
5
附加到输入的交互对象并在相同的上下文中显示。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_InteractiveObject)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());
6
附加到输入的交互对象组并在相同的上下文中显示。
它附加到第一个对象,但管理整个组的操作。
它被放置在对象边界框的中心,其大小调整为对象边界框。
Standard_EXPORT void Attach (const Handle(AIS_ManipulatorObjectSequence)& theObject, const OptionsForAttach& theOptions = OptionsForAttach());
7启用操作模式。
它在当前上下文中激活选择模式。
如果操作器未显示,则不会激活任何模式。
Standard_EXPORT void EnableMode (const AIS_ManipulatorMode theMode);
8
启用检测时激活模式(高亮显示)。
默认情况下,模式在选择操作器部分时激活。
如果启用此模式,选择部分将不起作用。
void SetModeActivationOnDetection (const Standard_Boolean theToEnable)
9
如果手动模式激活已启用,则返回 true。
Standard_Boolean IsModeActivationOnDetection() const
10
在查看器中拖动对象。
theCtx [in] 交互上下文
theView [in] 活动视图
heOwner [in] 检测到的实体所有者
theDragFrom [in] 拖动起点
theDragTo [in] 拖动终点
theAction [in] 拖动操作
如果对象拒绝拖动操作(例如 AIS_DragAction_Start),则返回 FALSE
Standard_EXPORT virtual Standard_Boolean ProcessDragging (const Handle(AIS_InteractiveContext)& theCtx,
const Handle(V3d_View)& theView,
const Handle(SelectMgr_EntityOwner)& theOwner,
const Graphic3d_Vec2i& theDragFrom,
const Graphic3d_Vec2i& theDragTo,
const AIS_DragAction theAction) Standard_OVERRIDE;
11
初始化起始(参考)变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。如果使用 Transform(const Standard_Integer, const Standard_Integer),
初始数据会自动设置,并在 DeactivateCurrentMode 调用时重置(如果尚未重置)。
Standard_EXPORT void StartTransform (const Standard_Integer theX, const Standard_Integer theY, const Handle(V3d_View)& theView);
12
将输入变换应用于拥有对象。
@remark 变换是使用 SetLocalTransformation 为拥有对象设置的。
操作器的位置也存储在本地变换中,因此无需重新显示对象。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。
如果未初始化变换(通过 StartTransform() 调用),则不执行任何操作。
Standard_EXPORT void Transform (const gp_Trsf& aTrsf);
12
重置起始(参考)变换。
theToApply [in] 选择是否应用或取消已开始的变换。
它在链中与 StartTransform-Transform(gp_Trsf)-StopTransform 一起使用,
仅用于自定义变换集。
Standard_EXPORT void StopTransform (const Standard_Boolean theToApply = Standard_True);
13
应用从鼠标起始位置(在第一次 Transform() 调用时保存并在 DeactivateCurrentMode() 调用时重置)
14
到输入/输出鼠标位置(theX,theY)的变换。
Standard_EXPORT gp_Trsf Transform (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView);
15
根据活动模式和输入运动矢量计算父对象的变换。
您可以使用此方法根据当前模式获取对象变换,或使用自己的算法为模式实现任何其他变换。
@return 父对象的变换。
Standard_EXPORT Standard_Boolean ObjectTransformation (const Standard_Integer theX, const Standard_Integer theY,
const Handle(V3d_View)& theView, gp_Trsf& theTrsf);
16
使当前选择的操作器部分变为非活动状态并重置当前轴索引和当前模式。
在调用后 HasActiveMode() 返回 false。
@sa HasActiveMode()
Standard_EXPORT void DeactivateCurrentMode();
17
从拥有对象中分离,并从上下文中移除自身。
Standard_EXPORT void Detach();
18
@return 所有拥有对象。
Standard_EXPORT Handle(AIS_ManipulatorObjectSequence) Objects() const;
19
@return 第一个(主导)拥有对象。
Standard_EXPORT Handle(AIS_InteractiveObject) Object() const;
20
@return 一个拥有对象。
21
@warning 如果 theIndex 大于拥有对象计数或小于 1,则引发程序错误。
Standard_EXPORT Handle(AIS_InteractiveObject) Object (const Standard_Integer theIndex) const;
22
@return 如果操作器附加到某个交互对象(有拥有对象),则返回 true。
Standard_Boolean IsAttached() const { return HasOwner(); }
23
@return 如果选择了操作器的某部分(变换模式处于活动状态,拥有对象可以变换),则返回 true。
Standard_Boolean HasActiveMode() const { return IsAttached() && myCurrentMode != AIS_MM_None; }
24
启用或禁用操作器的缩放持久模式。启用此模式后,演示将保持固定的屏幕大小。
启用此选项后,将覆盖变换持久性属性和局部变换以实现必要的视觉效果。
在启用缩放持久性时,修改 AttachToObjects 方法的 AdjustSize 参数的使用。
Standard_EXPORT void SetZoomPersistence (const Standard_Boolean theToEnable);
25
返回缩放持久模式的状态(启用或禁用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }
26
返回缩放持久模式的状态(是否启用)。
Standard_Boolean ZoomPersistence() const { return myIsZoomPersistentMode; }
27
重新定义变换持久性管理以设置轴子演示的变换。
使用 ZoomPersistence 模式时,此交互对象不支持自定义变换持久性。在此模式下,此类会覆盖演示的变换持久性标志。
调试模式下,调用调试断言以捕获与 ZoomPersistence 模式的不兼容使用,在发布模式下默默无闻地不执行任何操作。
28
在启用缩放持久性时,重新考虑使用 AttachToObjects 方法中的 AdjustSize 参数。
Standard_EXPORT virtual void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers) Standard_OVERRIDE;
29
返回当前操作模式。
AIS_ManipulatorMode ActiveMode() const { return myCurrentMode; }
30
返回当前活动轴的索引。
Standard_Integer ActiveAxisIndex() const { return myCurrentIndex; }
31
返回操控器交互对象的位置。
const gp_Ax2& Position() const { return myPosition; }
32
设置操控器对象的位置。
Standard_EXPORT void SetPosition (const gp_Ax2& thePosition);
33
返回操控器的尺寸。
Standard_ShortReal Size() const { return myAxes[0].Size(); }
34
设置操控器立方体边界框的边长。
Standard_EXPORT void SetSize (const Standard_ShortReal theSideLength);
35
设置平移器、缩放器和旋转器子显示部分之间的间隔。
Standard_EXPORT void SetGap (const Standard_ShortReal theValue);
36
设置操控器执行变换动作的行为设置,无论它是否与被变换对象一起平移或旋转。
void SetTransformBehavior (const BehaviorOnTransform& theSettings) { myBehaviorOnTransform = theSettings; }
37
返回操控器变换动作的行为设置。
BehaviorOnTransform& ChangeTransformBehavior() { return myBehaviorOnTransform; }
38
返回操控器变换动作的行为设置。
const BehaviorOnTransform& TransformBehavior() const { return myBehaviorOnTransform; }
参考
相关文章:

opencascade AIS_Manipulator源码学习
前言 AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。 详细功能 交互对象类,通过鼠标操控另一个交互对象…...

Hadoop、Hive、HBase、数据集成、Scala阶段测试
姓名: 总分:Hadoop、Hive、HBase、数据集成、Scala阶段测试 一、选择题(共20道,每道0.5分) 1、下面哪个程序负责HDFS数据存储( C ) A. NameNode B. Jobtracher C. DataNode D. Sec…...

go语言day19 使用git上传包文件到github Gin框架入门
git分布式版本控制系统_git切换head指针-CSDN博客 获取请求参数并和struct结构体绑定_哔哩哔哩_bilibili (gin框架) GO: 引入GIn框架_go 引入 gin-CSDN博客 使用git上传包文件 1)创建一个github账户,进入Repositories个人仓…...
Ubuntu升级软件或系统
Ubuntu升级软件或系统 升级Ubuntu系统通常是一个相对简单的过程,但在进行操作之前,请务必备份重要数据以防万一。下面是升级Ubuntu系统的一般步骤: 使用软件更新工具升级系统 打开终端: 按下 Ctrl Alt T 组合键打开终端。 更…...

【Redis】Centos7 安装 redis(详细教程)
查看当前 Redis 版本: 当前的 redis 版本太老了,选择安装 Redis5。 一、使用 yum 安装 1、首先安装 scl 源 yum install centos-release-scl-rh 由于我之前已经安装过了,所以加载速度比较快,且显示已经安装成功,是最…...

Hakuin:一款自动化SQL盲注(BSQLI)安全检测工具
关于Hakuin Hakuin是一款功能强大的SQL盲注漏洞安全检测工具,该工具专门针对BSQLi设计,可以帮助广大研究人员优化BSQLi测试用例,并以自动化的形式完成针对目标Web应用程序的漏洞扫描与检测任务。 该工具允许用户以轻松高效的形式对目标Web应…...

在 Postman 中设置全局 token
目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时,经常会遇到在 Header 中添加 token 的情况。当接口数量较多时,需要为每个接口进行设置,而且当 token 失效时需要重新获取并设置,这样一来效率较低。 解决方案 下…...
Linux C编程:打造一个插件系统
title: ‘Linux C编程:打造一个插件系统’ date: 2017-03-07 21:16:36 tags: linux C layout: post comments: true 运行环境:linux 使用语言:c 或者c 插件,很多人用过,比如游戏插件,编辑器插件这些, 最著…...
基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)
基于毫米波生物感知雷达设计的独居老人居家监护系统(微信小程序)(192) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】60G毫米波生物感知雷达原理【3】ESP8266模块配置【4】供电方式1.3 项目开发背景【1】选题的意义…...

C++——类和对象(下)
目录 一、再探构造函数 1.基本定义以及用法 2.必须在初始化列表初始化的成员变量 3.成员变量声明位置的缺省值(C11) 4.成员变量初始化顺序 二、隐式类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 七、日期类实现 一、再探构造函数…...
Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......
探索目标:Android中集成前端页面 之前使用的webview加载html页面,使用bridge的方式进行原生安卓和html页面的通信的方式,探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…...

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。
玩转CSS:用ul li JS 模拟select,避坑浏览器不兼容。 在前端的工作中,经常会遇到 selcet控件,但我们用css来写它的样式时候,总是不那么令人满意,各种浏览器不兼容啊有没有? 那么,我…...

介绍下PolarDB
业务中用的是阿里云自研的PolarDB,分析下PolarDB的架构。 认识PolarDB 介绍 PolarDB是阿里云自研的,兼容MySQL、PostageSQL以及支持MPP的PolarDB-X的高可用、高扩展性的数据库。 架构 部署 云起实验室 - 阿里云开发者社区 - 阿里云 (aliyun.com) 数…...

基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)
基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序,可以方便管理人员对儿童预防接种预约微信小程序的管理,提高信息管理工作效率及查询…...

go语言day15 goroutine
Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程?-CSDN博客 引入协程 go语言中内置了协程goroutine&#…...

Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)
Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|(一)IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|(二)预训练词向量 Mindspore框架循环神经网络RNN模型实现…...

System类
System类常见方法 ① exit 退出当前程序 public static void main(String[] args) {System.out.println("ok1");//0表示状态,即正常退出System.exit(0);System.out.println("ok2");} ② arraycopy 复制数组元素 复制的数组元素个数必须<原数…...

【前端 02】新浪新闻项目-初步使用CSS来排版
在今天的博文中,我们将围绕“新浪新闻”项目,深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例,我们将学习如何设置图片、标题、超链接以及文本排版,同时了解CSS的引入方式和选择器优先级,以及视频和音频标签的…...

HarmonyOS和OpenHarmony区别联系
前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中,那么这两个名词分别是什么意思,他们之间又有什么联系呢?本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比,带…...

llama模型,nano
目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...