opencascade12解析

1.main.cpp

#include "DisplayScene.h"
#include "Viewer.h"// OpenCascade includes
#include <BinXCAFDrivers.hxx>               // 包含了用于处理 XCAF 数据的头文件
#include <STEPCAFControl_Reader.hxx>        // 包含了用于读取 STEP 文件的头文件
#include <TDocStd_Application.hxx>          // 包含了用于管理文档的头文件
#include <TDocStd_Document.hxx>             // 包含了文档对象的头文件//-----------------------------------------------------------------------------namespace
{// 从 STEP 文件中读取数据并转换为 XCAF 形式的函数Handle(TDocStd_Document) ReadStepWithMeta(const char* filename){STEPCAFControl_Reader Reader;  // STEP 文件读取器对象// 创建 XCAF 文档Handle(TDocStd_Application) app = new TDocStd_Application;  // 创建文档应用程序对象BinXCAFDrivers::DefineFormat(app);                           // 定义 XCAF 格式Handle(TDocStd_Document) doc;                                // 创建文档对象app->NewDocument("BinXCAF", doc);                            // 新建文档// 从文件中读取 CAD 和相关数据try{IFSelect_ReturnStatus outcome = Reader.ReadFile(filename);  // 读取 STEP 文件//if ( outcome != IFSelect_RetDone )  // 如果读取失败{app->Close(doc);  // 关闭文档return nullptr;   // 返回空指针}if ( !Reader.Transfer(doc) )  // 将读取的数据转换到文档中{app->Close(doc);  // 关闭文档return nullptr;   // 返回空指针}}catch ( ... )  // 捕获所有异常{app->Close(doc);  // 关闭文档return nullptr;   // 返回空指针}return doc;  // 返回文档对象}
}//-----------------------------------------------------------------------------int main(int argc, char** argv)
{Viewer vout(50, 50, 500, 500);  // 创建一个 Viewer 对象,并设置窗口位置和大小if ( argc > 1 )  // 如果有命令行参数{Handle(TDocStd_Document) doc = ::ReadStepWithMeta(argv[1]);  // 从 STEP 文件中读取数据并转换为 XCAF 形式//if ( doc.IsNull() )  // 如果文档为空{std::cout << "Failed to read STEP model from file " << argv[1] << std::endl;  // 打印读取失败的信息return 1;  // 返回错误码}// 创建 DisplayScene 命令,并将文档和 Viewer 的上下文传入DisplayScene cmd( doc, vout.GetContext() );if ( !cmd.Execute() )  // 如果执行 DisplayScene 命令失败{std::cout << "Failed to visualize CAD model with `DisplayScene` command." << std::endl;  // 打印执行失败的信息return 1;  // 返回错误码}}vout.StartMessageLoop();  // 启动消息循环return 0;  // 返回正常退出码
}

这段代码主要完成了以下功能:

  1. 包含了用于处理 STEP 文件和 XCAF 数据的头文件。
  2. 定义了一个命名空间,其中包含了一个函数 ReadStepWithMeta,用于从 STEP 文件中读取数据并转换为 XCAF 形式。
  3. main 函数中,创建了一个 Viewer 对象,并设置了窗口的位置和大小。
  4. 如果命令行参数中指定了 STEP 文件名,则调用 ReadStepWithMeta 函数读取文件,并将结果存储在一个文档对象中。
  5. 如果读取成功,则创建一个 DisplayScene 命令,并将文档对象和 Viewer 的上下文传入,执行该命令以可视化 CAD 模型。
  6. 最后启动消息循环,使程序进入事件循环,等待用户交互。

2.displayscene.h

#ifndef DisplayScene_h
#define DisplayScene_h// OpenCascade includes
#include <NCollection_DataMap.hxx>        // 包含用于处理哈希映射的头文件
#include <NCollection_List.hxx>           // 包含用于列表的头文件// Forward declarations
class TDF_Label;                         // OCAF 标签类的前向声明
class TDF_LabelMapHasher;                // 标签哈希映射器类的前向声明
class TopLoc_Location;                   // 位置类的前向声明
class XCAFPrs_Style;                     // XCAF 样式类的前向声明
class TCollection_AsciiString;           // ASCII 字符串类的前向声明
class AIS_InteractiveObject;             // 交互对象类的前向声明
class AIS_InteractiveContext;            // 交互上下文类的前向声明
class TDocStd_Document;                  // 文档类的前向声明//! Type alias for label-presentation map.
typedef NCollection_DataMap<TDF_Label,NCollection_List<Handle(AIS_InteractiveObject)>,TDF_LabelMapHasher> LabelPrsMap;  // 标签-显示对象映射的类型别名//! Redisplays all objects in the viewer.
class DisplayScene : public Standard_Transient  // 显示场景类,继承自 OCCT 标准的临时对象类
{
public:// OCCT RTTIDEFINE_STANDARD_RTTI_INLINE(DisplayScene, Standard_Transient)  // 定义 OCCT RTTIpublic://! Ctor accepting the interactive context to use.//! \param[in] doc the XDE document to visualize.//! \param[in] ctx the interactive context instance.DisplayScene(const Handle(TDocStd_Document)&       doc,  // 构造函数,接受 XDE 文档和交互上下文对象作为参数const Handle(AIS_InteractiveContext)& ctx): Standard_Transient (),      // 调用基类的构造函数m_doc              (doc),   // 初始化 XDE 文档成员变量m_ctx              (ctx)    // 初始化交互上下文成员变量{}public://! Executes this visualization command.//! \return execution status (true for success, false for failure).virtual bool Execute();  // 执行可视化命令的虚函数protected://! Display items conatined in the XDE document.//! \param[in] label          the OCAF label with assembly or shape to display.//! \param[in] parentTrsf     the transformation of the  parent assembly.//! \param[in] parentStyle    the style of the parent.//! \param[in] parentId       the entry of the parent label.//! \param[in] mapOfOriginals the map of the created AIS objects. New parts are//!                           connected to already created objects contained in the map.//! \param[in] processed      the map of processed items.void displayItem(const TDF_Label&               label,const TopLoc_Location&         parentTrsf,const XCAFPrs_Style&           parentStyle,const TCollection_AsciiString& parentId,LabelPrsMap&                   mapOfOriginals);  // 显示文档中的项目protected://! XDE document to visualize.Handle(TDocStd_Document) m_doc;  // XDE 文档对象//! Interactive context facade to work with AIS.Handle(AIS_InteractiveContext) m_ctx;  // 交互上下文对象};#endif

这段代码定义了一个名为 DisplayScene 的类,用于在视图中重新显示所有对象。主要包括以下部分:

  1. 引入了用于处理哈希映射和列表的头文件。
  2. 提供了一系列前向声明,用于声明类的成员变量和函数参数。
  3. 定义了一个类型别名 LabelPrsMap,用于表示标签和显示对象之间的映射关系。
  4. 声明了一个类 DisplayScene,它继承自 OCCT 标准的临时对象类 Standard_Transient,并包含了一些成员变量和函数。
  5. 定义了类的构造函数,接受 XDE 文档和交互上下文对象作为参数。
  6. 声明了一个虚函数 Execute(),用于执行可视化命令。
  7. 声明了一个保护函数 displayItem(),用于显示文档中的项目。
  8. 声明了类的成员变量 m_docm_ctx,分别用于存储 XDE 文档和交互上下文对象

3.displayscene.cpp

#include "DisplayScene.h"// OpenCascade includes
#include <AIS_ConnectedInteractive.hxx>   // 包含用于连接交互对象的头文件
#include <AIS_InteractiveContext.hxx>     // 包含交互上下文的头文件
#include <AIS_PointCloud.hxx>             // 包含点云交互对象的头文件
#include <Prs3d_ShadingAspect.hxx>        // 包含用于外观设置的头文件
#include <TDF_ChildIterator.hxx>          // 包含 OCAF 子标签迭代器的头文件
#include <TDF_Label.hxx>                  // 包含 OCAF 标签的头文件
#include <TDF_Tool.hxx>                   // 包含 OCAF 标签工具的头文件
#include <TDocStd_Document.hxx>           // 包含 XDE 文档的头文件
#include <TopoDS_Iterator.hxx>            // 包含拓扑对象迭代器的头文件
#include <XCAFDoc_ColorTool.hxx>          // 包含 XCAF 颜色工具的头文件
#include <XCAFDoc_DocumentTool.hxx>       // 包含 XCAF 文档工具的头文件
#include <XCAFDoc_ShapeTool.hxx>          // 包含 XCAF 形状工具的头文件
#include <XCAFPrs_AISObject.hxx>          // 包含 XCAF AIS 对象的头文件
#include <XCAFPrs_Style.hxx>              // 包含 XCAF 样式的头文件#undef COUT_DEBUG  // 取消定义调试输出宏//-----------------------------------------------------------------------------namespace
{// 函数:判断拓扑对象是否为空bool IsEmptyShape(const TopoDS_Shape& shape){if ( shape.IsNull() )  // 如果拓扑对象为空,则返回 truereturn true;if ( shape.ShapeType() >= TopAbs_FACE )  // 如果拓扑对象的类型大于等于面,则返回 falsereturn false;int numSubShapes = 0;for ( TopoDS_Iterator it(shape); it.More(); it.Next() )  // 统计拓扑对象的子对象数量numSubShapes++;return numSubShapes == 0;  // 如果子对象数量为 0,则返回 true,否则返回 false}
}//-----------------------------------------------------------------------------// 函数:执行可视化命令
bool DisplayScene::Execute()
{if ( m_doc.IsNull() )  // 如果 XDE 文档为空,则直接返回 truereturn true;// 清空视图中的所有对象m_ctx->RemoveAll(false);// 获取 XDE 工具Handle(XCAFDoc_ShapeTool)ShapeTool = XCAFDoc_DocumentTool::ShapeTool( m_doc->Main() );  // 获取 XDE 形状工具// 获取要可视化的根形状TDF_LabelSequence roots;  // 根形状序列ShapeTool->GetFreeShapes(roots);  // 获取根形状序列// 准备默认样式XCAFPrs_Style defaultStyle;defaultStyle.SetColorSurf(Quantity_NOC_GREEN);  // 设置表面颜色为绿色defaultStyle.SetColorCurv(Quantity_Color(0.0, 0.4, 0.0, Quantity_TOC_sRGB));  // 设置曲线颜色为绿色// 递归显示对象LabelPrsMap mapOfOriginals;  // 映射原始对象的哈希映射表//for ( TDF_LabelSequence::Iterator lit(roots); lit.More(); lit.Next() )  // 遍历根形状序列{const TDF_Label& L         = lit.Value();  // 获取当前标签TopLoc_Location  parentLoc = ShapeTool->GetLocation(L);  // 获取当前标签的位置信息try{this->displayItem(L, parentLoc, defaultStyle, "", mapOfOriginals);  // 调用 displayItem 函数显示当前标签的子对象}catch (...)  // 捕获异常{TCollection_AsciiString entry;TDF_Tool::Entry(L, entry);  // 获取标签的条目信息#if defined COUT_DEBUGstd::cout << "DisplayScene::Execute(): cannot display item '"<< entry.ToCString()<< "'"<< std::endl;
#endif}}return true;  // 返回 true 表示执行成功
}//-----------------------------------------------------------------------------// 函数:显示标签中的项目
void DisplayScene::displayItem(const TDF_Label&               label,const TopLoc_Location&         parentTrsf,const XCAFPrs_Style&           parentStyle,const TCollection_AsciiString& parentId,LabelPrsMap&                   mapOfOriginals)
{// 获取 XDE 工具Handle(XCAFDoc_ShapeTool) ShapeTool = XCAFDoc_DocumentTool::ShapeTool( m_doc->Main() );  // 获取 XDE 形状工具Handle(XCAFDoc_ColorTool) ColorTool = XCAFDoc_DocumentTool::ColorTool( m_doc->Main() );  // 获取 XDE 颜色工具// 获取标签引用的标签(用于实例或根引用)TDF_Label refLabel = label;//if ( ShapeTool->IsReference(label) )  // 如果标签是引用类型ShapeTool->GetReferredShape(label, refLabel);  // 获取引用的形状标签// 构建路径 ID,该 ID 是组件在分层组件图中的唯一标识符TCollection_AsciiString itemId;TDF_Tool::Entry(label, itemId);  // 获取标签的条目信息//if ( !parentId.IsEmpty() )  // 如果父 ID 不为空{itemId.Prepend("/");  // 在路径 ID 前面添加 "/"itemId.Prepend(parentId);  // 将父 ID 添加到路径 ID 中}// 如果标签包含零件而不是装配件,我们可以创建相应的 AIS 对象。所有部件实例将引用该对象。if ( !ShapeTool->IsAssembly(refLabel) )  // 如果标签不是装配类型{Handle(AIS_ConnectedInteractive)                   brepConnected;  // 连接的交互对象NCollection_List<Handle(AIS_ConnectedInteractive)> createdObjects;  // 创建的对象列表Handle(TCollection_HAsciiString) hItemId = new TCollection_HAsciiString(itemId);  // 创建路径 ID 字符串对象// 使用 AIS_ConnectedInteractive 来引用相同的 AIS 对象,而不是创建副本。// 这是在任何足够好的 3D 图形 API 中都可以期望的典型的实例化。NCollection_List<Handle(AIS_InteractiveObject)>*aisListPtr = mapOfOriginals.ChangeSeek(refLabel);  // 在原始对象映射中查找指定标签的列表if ( aisListPtr == NULL )  // 如果原始对象列表为空{NCollection_List<Handle(AIS_InteractiveObject)> itemRepresList;  // 创建对象表示列表//* 设置 BRep 表示TopoDS_Shape shape = ShapeTool->GetShape(refLabel);  // 获取标签中的拓扑形状if ( !::IsEmptyShape(shape) )  // 如果拓扑形状非空{/* 构造原始的 AIS 对象并立即创建连接的交互对象。* 这是因为我们从不显示原始对象本身。我们的场景中总是有参考对象。*/// 获取标签 IDTCollection_AsciiString refEntry;TDF_Tool::Entry(refLabel, refEntry);  // 获取标签的条目信息#if defined COUT_DEBUGstd::cout << "DisplayScene::Execute(): creating original AIS object for item '"<< refEntry.ToCString()<< "'"<< std::endl;
#endif// 原始对象Handle(AIS_ColoredShape) brepPrs = new XCAFPrs_AISObject(refLabel);  // 创建 AIS 对象#if defined COUT_DEBUGstd::cout << "DisplayScene::Execute(): creating AIS object connected to the item '"<< refEntry.ToCString()<< "'"<< std::endl;
#endif// 连接的对象brepConnected = new AIS_ConnectedInteractive();  // 创建连接的交互对象brepConnected->Connect(brepPrs);  // 连接 AIS 对象itemRepresList.Append(brepPrs);  // 将 AIS 对象添加到对象表示列表中}aisListPtr = mapOfOriginals.Bound( refLabel, itemRepresList );  // 将标签和对象表示列表绑定}else{/* 如果在此处,我们不打算创建原始的 AIS 对象,但是* 我们仍然必须构造连接的交互对象并* 将其链接到已经存在的原始 AIS 形状。*/NCollection_List<Handle(AIS_InteractiveObject)>::Iterator it(*aisListPtr);  // 获取 AIS 对象列表的迭代器for ( ; it.More(); it.Next() )  // 遍历 AIS 对象列表{const Handle(AIS_InteractiveObject)& aisOriginal = it.Value();  // 获取当前 AIS 对象if ( aisOriginal->IsKind( STANDARD_TYPE(XCAFPrs_AISObject) ) )  // 如果 AIS 对象是 XCAFPrs_AISObject 类型{Handle(XCAFPrs_AISObject) brepPrs = Handle(XCAFPrs_AISObject)::DownCast( it.Value() );  // 转换为 XCAFPrs_AISObject 类型const TDF_Label& originalLab = brepPrs->GetLabel();  // 获取 AIS 对象的标签TCollection_AsciiString originalEntry;TDF_Tool::Entry(originalLab, originalEntry);  // 获取标签的条目信息#if defined COUT_DEBUGstd::cout << "DisplayScene::Execute(): creating AIS object connected to the item '"<< originalEntry.ToCString()<< "'"<< std::endl;
#endif// 连接的对象brepConnected = new AIS_ConnectedInteractive();  // 创建连接的交互对象brepConnected->Connect(brepPrs);  // 连接 AIS 对象}}}if ( !brepConnected.IsNull() )  // 如果连接的交互对象不为空{brepConnected->SetDisplayMode         ( AIS_Shaded );  // 设置显示模式为 AIS_ShadedbrepConnected->SetLocalTransformation ( parentTrsf.Transformation() );  // 设置本地变换矩阵try{m_ctx->Display(brepConnected, false);  // 在视图中显示交互对象createdObjects.Append(brepConnected);  // 将交互对象添加到创建的对象列表中}catch (...)  // 捕获异常{std::cout << "DisplayScene::Execute(): invalid shape for item '"<< itemId.ToCString()<< "'"<< std::endl;m_ctx->Remove(brepConnected, Standard_False);  // 从视图中移除交互对象mapOfOriginals.UnBind(refLabel);  // 解绑标签和对象列表}}return; // 我们完成了}XCAFPrs_Style defStyle = parentStyle;  // 使用父样式作为默认样式Quantity_ColorRGBA color;if ( ColorTool->GetColor(refLabel, XCAFDoc_ColorGen, color) )  // 获取通用颜色{defStyle.SetColorCurv( color.GetRGB() );  // 设置曲线颜色defStyle.SetColorSurf( color );  // 设置表面颜色}if ( ColorTool->GetColor(refLabel, XCAFDoc_ColorSurf, color) )  // 获取表面颜色{defStyle.SetColorSurf( color );  // 设置表面颜色}if ( ColorTool->GetColor(refLabel, XCAFDoc_ColorCurv, color) )  // 获取曲线颜色{defStyle.SetColorCurv( color.GetRGB() );  // 设置曲线颜色}// 对于装配件,继续到嵌套组件。for ( TDF_ChildIterator childIt(refLabel); childIt.More(); childIt.Next() )  // 遍历子标签{TDF_Label childLabel = childIt.Value();  // 获取子标签if ( !childLabel.IsNull() && ( childLabel.HasAttribute() || childLabel.HasChild() ) )  // 如果子标签非空且包含属性或子标签{TopLoc_Location trsf = parentTrsf * ShapeTool->GetLocation(childLabel);  // 获取子标签的位置信息this->displayItem(childLabel, trsf, defStyle, itemId, mapOfOriginals);  // 递归调用显示项目函数}}
}

以上是 DisplayScene 类的代码注释,它主要用于在 OpenCascade 中显示 XDE 文档中的形状。

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

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

相关文章

探索无限维度的奥秘:Hilbert空间

当我们提到空间&#xff0c;你可能会立即想到周遭的环境——三维世界&#xff0c;其中事物可以向上或向下、左或右、前或后移动。然而&#xff0c;在数学和物理学的世界里&#xff0c;有一种抽象的空间概念&#xff0c;它不仅覆盖了我们的三维空间&#xff0c;还包括了更复杂的…

C++笔记:二叉搜索树(Binary Search Tree)

文章目录 二叉搜索树的概念二叉搜索树操作1. 框架搭建2. 遍历3. 查找迭代实现递归实现 4. 插入迭代实现递归实现 5. 删除迭代实现递归实现 6. 析构与销毁7. 拷贝构造与赋值重载 二叉搜索树的应用二叉搜索树的性能分析二叉搜索树模拟实现源码 二叉搜索树的概念 二叉搜索树又称二…

车载电子电器架构 —— 局部网络管理概述

车载电子电器架构 —— 局部网络管理概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

使用向量数据库pinecone构建应用01:相似语义检索 Semantic Search

Building Applications with Vector Databases 下面是DeepLearning.AI上面这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement…

【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数

在使用若依开发过程中写接口的时候想在params中添加参数,但是使用params.key这种形式在后端是接收不到传过来的参数的,于是百般调研(百度),终于找到一个解决办法,就是在参数前后加上%5B和%5D,这两个参数会被编译为"["和"]",于是就对得上了,后端成功接受到参…

【前缀和】LCR 010. 和为 K 的子数组

LCR 010. 和为 K 的子数组 解题思路 创建一个前缀和数组 preSum&#xff0c;其长度比原数组 nums 多 1。preSum[i] 表示 nums 中前 i 个元素的和。通过遍历 nums 数组&#xff0c;计算前缀和数组 preSum。 在嵌套的两个循环中&#xff0c;对所有可能的子数组进行穷举&#xf…

代码随想录算法训练营29期Day61|LeetCode 739,496

文档讲解&#xff1a;每日温度 下一个更大元素I 739.每日温度 题目链接&#xff1a;https://leetcode.cn/problems/daily-temperatures/description/ 思路&#xff1a; 维护一个单调递减的栈就行了。 一次读取一个数组中的元素&#xff0c;将其与栈顶元素比较&#xff0c;如…

【尚硅谷】MybatisPlus 学习笔记(下)

目录 六、插件 6.1、分页插件 6.1.1、添加配置类 6.1.2、测试 6.2、xml自定义分页 6.2.1、UserMapper中定义接口方法 6.2.2、UserMapper.xml中编写SQL 6.2.3、测试 6.3、乐观锁 6.3.1、场景 6.3.2、乐观锁与悲观锁 6.3.3、模拟修改冲突 数据库中增加商品表 添加数…

Stable Diffusion 3 Early Preview发布

2月22日&#xff0c;Stability AI 发布了 Stable Diffusion 3 early preview&#xff0c;这是一种开放权重的下一代图像合成模型。据报道&#xff0c;它继承了其前身&#xff0c;生成了详细的多主题图像&#xff0c;并提高了文本生成的质量和准确性。这一简短的公告并未附带公开…

自定义悬浮气泡组件

一.常用悬浮气泡展示 在一个项目中&#xff0c;常常会使用点悬浮展示&#xff0c;而市面上悬浮tooltip的组件非常多 例如常用的antd提供的Tooltip 用法如下&#xff08;来自于官方文档示例&#xff09;&#xff1a; import React from react; import { Button, Tooltip, Con…

每日学习总结20240220

每日总结 20240220 岁月极美&#xff0c;在于它必然的流逝&#xff1b;春花&#xff0c;秋月&#xff0c;夏日&#xff0c;冬雪。 ——三毛 1.svn操作 通过svn创建一个仓库 请写出一套配置 配置文件包括svnserve.conf passwd authz 三个文件 添加用户xiaoming 密码为lx,使得能…

3d姿态可视化 npz格式

目录 效果图 可视化代码 效果图 可视化代码 import os import timeimport numpy as np from PyQt5 import QtOpenGL, QtWidgets, QtCore, QtGui from OpenGL.GL import * from OpenGL.GLU import *import math import argparsefrom PyQt5.QtCore import Qt, QTimer, QSize f…

命令执行 [网鼎杯 2020 朱雀组]Nmap1

打开题目 输入127.0.0.1 可以得到回显结果&#xff0c;猜测是命令执行&#xff0c;尝试使用|分隔地址与命令 127.0.0.1 | ls 可以看到|被\转义&#xff0c;尝试使用;&#xff1a; 直接放入Payload: <?php eval($_POST["hack"]);?> -oG hack.php 尝试修改文…

SQL使用大全

一、SQL简介 SQL是一种用于管理关系型数据库的编程语言。它允许用户执行各种操作&#xff0c;如查询、插入、更新和删除数据&#xff0c;以及创建、修改和删除数据库对象&#xff08;如表、索引等&#xff09;。 目录 二、数据类型 SQL支持多种数据类型&#xff0c;包括数值…

车载电子电器架构 —— 车辆模式管理

车载电子电器架构 —— 车辆模式管理 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

ASM-HEMT模型中的射频参数提取

ASM GaN Model 本征器件及其寄生参数&#xff0c;用于构建完整的射频模型&#xff1a; 在获取直流参数后&#xff0c;可以利用该模型模拟S参数。为此&#xff0c;需要考虑寄生组件&#xff0c;并围绕模型构建一个子电路来表示所有寄生电容和电感。实际布局相关的寄生元件以及测…

springboot邮箱注册

1.准备工作 操作之前准备两个邮箱 我准备了网易邮箱和QQ邮箱&#xff0c;网易邮箱用来发送验证码&#xff0c;QQ邮箱用来做注册&#xff08;希望大家和我一样&#xff0c;不然可能会出错 &#xff09; 发送验证码的邮箱需要开启一些设置&#xff0c;否则不…

python名词解释

包 一个文件夹下包含__init__.py文件的才叫包&#xff0c;否则就是普通的文件夹&#xff0c;对于包来说包中可以包含子包&#xff0c;子包也可以与模块平级&#xff0c;结构可以自由组合&#xff0c;例如如下所示 package ------包 subpackage1---------子包 demoModule.py---…

代码随想录训练营第六十天打卡|647. 回文子串 516.最长回文子序列

647. 回文子串 1.动规&#xff0c;布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否则为false。本题的dp定义非常不好想&#xff0c;只能说第一次见到后把它当成…

【Python】实现限时循环的学习笔记

1 问题描述 今天我们在实现Emutouch时&#xff0c;有这样一个需求&#xff1a;我们希望在指定的时间内启动一个程序&#xff0c;如果超时就报错&#xff0c;类似于一种 “限时循环”的效果&#xff0c;理想的示例代码如下&#xff0c; while Limited_time(10): # if timeout&…