news 2026/9/18 17:43:32

CogResultsAnalysisTool实战详解:视觉结果分析与流程控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CogResultsAnalysisTool实战详解:视觉结果分析与流程控制

对做视觉项目的人来讲,CogResultsAnalysisTool是个绕不开的“细节工具”。很多新手第一次打开它,看到Inputs、Outputs、Rules三块区域,会以为这是个复杂的脚本框架,或者干脆把它当成一个“写代码的地方”放着不管;而真正调过几个项目之后才会发现,这个工具在流程控制、结果统计、动态切换配方、多相机防错这类场景里,简直是承上启下的关键节点。

它的定位简单说就一句话:一个专门用来“分析其他工具运行结果”的工具。它不采集图像、不做检测、不定位,它只干一件事——把前面工具的输出结果读进来,按你设定的规则算一算,再把结果发给后面工具,或者存成变量供整个流程使用。你可以把它理解为产线上的“质检班长”:自己不干活,但谁干得好不好、下一步该让谁上场、这批数据怎么汇总,都由它说了算。

这篇文章我会从零开始,把CogResultsAnalysisTool的使用方式、脚本语法、典型应用场景和踩坑经验一次讲透。无论你是刚接触VisionPro的新手,还是已经被项目里各种逻辑判断绕晕的集成工程师,这篇文章都能给你一些可以直接抄走的方案。文章里的示例都是我在实际项目里验证过的写法,包括参数配置、脚本代码、排错思路,照着做基本能跑通。

1. 先搞清楚CogResultsAnalysisTool是个什么样的工具

1.1 从工具名字拆解它的定位

VisionPro里的工具大致分两类:一类是直接跟图像打交道的“眼睛”类工具,比如CogPMAlignTool定位、CogBlobTool斑点分析、CogIDTool读码;另一类是纯逻辑处理工具,最典型的就是CogResultsAnalysisTool和CogFixtureTool。

CogResultsAnalysisTool从名字拆开看:Results是结果,Analysis是分析,Tool是工具,连起来就是“结果分析工具”。它拿到的是其他工具执行完的真值数据(FixturedPositionX、Score、Area、DecodedData这类),而不是图像本身。它本身也没有图像输入端子,你拖到流程里会发现它的输入输出都只是数值、字符串、布尔量。

我见过不少刚接触的人把这个工具当成“万能脚本器”,试图在里面写复杂的图像处理逻辑,这是理解偏了。它不是用来处理图像的,它是用来做流程决策的。打个比方:一条检测工位上,PMAlign工具负责告诉系统“产品在哪个位置”,Blob工具负责告诉系统“缺陷面积有多大”,CogResultsAnalysisTool则负责把这两个信息拿过来,判断“位置对不对、缺陷超不超标,最终给OK/NG结论”。它做的是“裁判”的工作,不是“球员”的工作。

1.2 它解决的核心痛点:多工具协作时的判断与分流

在实际产线项目里,没有任何一个工位是靠单个工具完成的。一个典型的视觉检测流程至少是:图像采集、图像预处理、定位、测量/检测、结果判定、数据通信。越复杂的项目,工具之间的依赖关系越乱,判断逻辑越多。如果把这些判断逻辑全部写在上位机C#或VB程序里,每次产品换型都得改代码、重新编译,产线上根本等不起;如果全部靠连线(将工具输出直接连到下游工具输入),一个路径分支多了之后,流程会变成一团乱麻。

CogResultsAnalysisTool的核心作用就是把这些判断逻辑从程序代码里“抽出来”,放到视觉流程里可视化配置。操作人员在现场就能调整判断阈值、切换检测配方、查看统计数据,完全不用碰代码。

它的典型应用场景包括:

  • 动态切换产品型号:读码器识别到当前产品是A型号还是B型号,ResultsAnalysisTool根据这个信息动态改写下游工具的参数或启用/禁用某个工具;
  • 多相机防错协同:两三个相机分别拍不同部位,各自给出OK/NG后,汇总到这个工具里做“与/或”联合判定,任何一个NG整体就NG;
  • 结果统计与追溯:把每次检测的关键数值累加、求均值、算合格率,方便现场实时查看当前班次的良率;
  • 生产流程控制:根据检测结果决定触发哪个输出信号、往PLC发什么数据、是否保存当前图像。

这四个场景几乎是视觉项目里最常遇到的。把这一个工具用熟了,等于给你的视觉流程装了一个“决策大脑”,而不是让每个工具各自为战。

1.3 界面三块区域:Inputs、Outputs、Rules

CogResultsAnalysisTool的配置界面非常简洁,核心就三块区域:

  • Inputs(输入):在这里声明你要读入哪些外部数据,可以是其他工具的输出结果,也可以是整个Job的全局变量。声明之后,这些值才能在Rules里被引用;
  • Outputs(输出):在这里声明你需要对外输出的变量,这些变量供下游工具、脚本、通信模块使用;
  • Rules(规则):这里写具体的逻辑表达式和赋值语句,也就是这个工具真正“干活”的地方。

把这三块理解成“入口—处理—出口”,脑子里就有画面了。Inputs是数据源,Rules是加工厂,Outputs是成品仓库。数据从Inputs进来,在Rules里按你设定的逻辑加工,最后从Outputs输出到下游。

注意:千万不要把Inputs和Outputs当成“多余的变量声明”,这一步省了后续写规则时你会发现根本找不到数据引用。正确的习惯是:先规划好这个工位需要哪些输入、哪些输出,再动手写Rules。

2. 动手配置一个完整的CogResultsAnalysisTool流程

2.1 环境准备与工具添加

本文的示例基于VisionPro 9.0及以上版本,版本差异不影响核心功能。在开始之前,你需要:

  • 电脑已安装VisionPro完整版或包含CogResultsAnalysisTool授权的版本;
  • 一个能运行的视觉流程(Job),里面至少有一个能出结果的工具,比如CogPMAlignTool或CogBlobTool;
  • 准备一个简单的测试图像,或者直接用VisionPro自带的示例图像。

配置启动步骤很简单:

  1. 打开VisionPro的QuickBuild或VS环境,加载你的项目;
  2. 在工具流中添加CogResultsAnalysisTool,位置一般放在所有检测工具之后、最终判定输出之前;
  3. 双击打开工具界面,进入CogResultsAnalysisTool的配置面板。

2.2 配置Inputs输入数据

假设我们有一个最简单的场景:用CogPMAlignTool做定位,用CogBlobTool检测缺陷面积,最终要判断这个产品是否合格。判定标准是:定位分数大于0.8,缺陷面积小于100像素。

我们需要从两个来源读数据,所以先把它们声明成Inputs:

  1. 在Inputs区域点击“Add Input”;
  2. 在弹出的数据绑定对话框中,选择“Tool Output”,然后选择CogPMAlignTool;
  3. 选择输出参数为“Score”(匹配分数),命名输入变量为“PMAlignScore”;
  4. 用同样的方式添加CogBlobTool的“Area”输出,命名输入变量为“BlobArea”。

到这里,数据源已经接进来了。Inputs区域会显示两行记录,每一行包含变量名、数据类型、绑定的工具和参数路径。数据类型的常见选项包括Double、Int、String、Bool等,VisionPro会自动根据绑定的输出结果推断类型,但建议你核对一下,避免变量类型不匹配导致后面规则写不了。

2.3 编写Rules规则:从表达式到最终判定

Inputs配置好了,接下来是核心环节——Rules区域写规则。CogResultsAnalysisTool的规则语法非常接近VB Script,支持变量赋值、条件判断、算术运算、字符串处理等。

我们先把两个输入拿来做判定,在Rules区域写入:

Dim bPass As Boolean bPass = (PMAlignScore > 0.8) And (BlobArea < 100)

这一句把两个条件的“与”运算结果赋值给布尔变量bPass,视觉上非常直观。然后把这结果输出到Outputs区域。在Outputs区域添加一个输出变量,命名为“FinalPass”,数据类型选Boolean,然后回到Rules区域写一行:

FinalPass = bPass

整个工具的任务就完成了。流程跑起来后,只要PMAlign定位分数不达标或者Blob缺陷面积超标,FinalPass就会返回False,下游工具、PLC通信、图像保存模块都可以基于这个布尔值做各自的动作。

2.4 配置Outputs输出与下游联动

下游工具想要使用这个判定结果,可以直接把CogResultsAnalysisTool的输出变量绑定到自己的输入。比如后面接一个CogScriptTool,里面读取FinalPass,决定是否将图像存盘;或者接一个CogImageConvertTool,根据FinalPass决定是否转换并输出图像。

具体操作为:在目标工具的输入端子界面,选择绑定到CogResultsAnalysisTool的“FinalPass”输出,这样下游工具每次运行都会自动获取最新的判定结果。

提示:如果只有“判定”这一个需求,你也可以不连下游工具,直接通过VisionPro的通信模块(如CogResultsAnalysisTool本身支持的结果记录功能)输出结果。但实际项目中,这个工具往往是流程链路的“中间站”,所以把它放在检测工具和后续执行模块之间是最常见的排布方式。

3. CogResultsAnalysisTool规则语法:从入门到进阶

3.1 数据类型、变量声明与命名规范

CogResultsAnalysisTool的脚本语法基于VB Script,但也支持一定程度的类型声明。写规则时,最基础的一点就是理解变量怎么存活、怎么赋值、怎么转换。

支持的基本类型有:

类型说明示例
Dim x As Integer32位整数Dim count As Integer
Dim x As Double双精度浮点数Dim score As Double
Dim s As String字符串Dim msg As String
Dim b As Boolean布尔值Dim bPass As Boolean

在Rules区域里,变量可以先用Dim声明,也可以直接使用Inputs和Outputs里定义好的变量。所有声明和赋值代码按顺序执行,规则从上往下跑,最后一行运行完,这个工具本次的运行就结束了。

命名规范上,我强烈建议:变量名不要用中文,不要用空格,不要以数字开头,尽量用有意义的英文组合。比如PMAlignScore、BlobArea、FinalPass、IsOK,一看就知道是什么。不要图省事写a、b、c这类单字母,写惯了无所谓,但项目交接或者现场调试的时候,单字母变量会把人逼疯。

3.2 从输出结果中提取关键数值的取数路径

在Inputs区域绑定数据时,你会看到一长串属性路径,比如:

CogPMAlignTool1.Outputs.Item(0).Score CogBlobTool1.Outputs.Item(0).Area CogIDTool1.Outputs.Item(0).DecodedData CogFixtureTool1.Outputs.FixturedPositionX

这些路径不需要你手写,在绑定界面里通过图形化选择就能生成。但你需要理解路径的含义:.Item(0)表示第一个结果对象,比如PMAlign设置了多个搜索模式时就会有多个Item;ScoreAreaDecodedData是具体的属性名,VisionPro的工具结果对象都公开了这些属性供外部访问。

实际项目中,还会经常遇到取图像坐标、角度、卡尺测量尺寸等场景。比如CogPMAlignTool的定位结果中,最常用的几个属性是:

  • FixturedPositionX/FixturedPositionY:标准坐标系下的位置;
  • FixturedPositionRot:标准坐标系下的角度;
  • Score:匹配分数,范围一般在0到1之间;
  • TrainedPositionX/TrainedPositionY:训练时的原始位置。

理解这些属性的含义,比你多写几百行脚本都有用。因为大部分情况下,我们用CogResultsAnalysisTool做逻辑判断,都是在跟这些数值打交道。

3.3 多条件组合判断与字符串处理

真实项目里很少只有一个判断条件。比如同时要检测位置、角度、缺陷面积、读码结果,那么Rules区域就会变成多行组合判断。

示例:假设我们有定位分数Score、位置偏差OffsetX、缺陷面积Area、读码结果CodeString,判定规则是:分数大于0.8、偏移小于0.5毫米、面积小于100、读码必须包含特定前缀“ABC”。

Dim bScoreOK As Boolean Dim bOffsetOK As Boolean Dim bAreaOK As Boolean Dim bCodeOK As Boolean bScoreOK = (Score > 0.8) bOffsetOK = (Abs(OffsetX) < 0.5) bAreaOK = (Area < 100) bCodeOK = (Left(CodeString, 3) = "ABC") Dim bFinalOK As Boolean bFinalOK = bScoreOK And bOffsetOK And bAreaOK And bCodeOK

这里的Abs()是取绝对值函数,Left()是取字符串左边指定数量字符的函数。这些函数在VB Script里都是内置的,直接用就好。

字符串处理在结果分析工具里非常实用,尤其是需要拼接日志、生成追溯码、格式化输出给PLC的时候。常用的字符串函数还有:

函数作用示例
Mid(string, start, length)截取子串Mid("ABCDEF", 2, 3) 结果 "BCD"
Len(string)返回字符串长度Len("ABCD") 结果 4
InStr(string, substring)查找子串位置,找不到返回0InStr("ABCD", "BC") 结果 2
CStr(value)转换为字符串CStr(12.5) 结果 "12.5"
CInt(value)转换为整型CInt(12.5) 结果 13(四舍五入)
CDbl(value)转换为浮点数CDbl("12.5") 结果 12.5

比如你要生成一条包含所有关键数值的生产记录,就可以这样写:

Dim logMsg As String logMsg = "Time=" & CStr(Now) & ", Score=" & CStr(Score) & ", Area=" & CStr(Area) & ", Result=" & CStr(bFinalOK)

&是字符串连接符,Now返回当前时间。这样一行代码就能拼出一条完整的日志,后续发给上位机或者写入本地文件都方便。

3.4 进阶:多条件分支与配方动态切换

CogResultsAnalysisTool的Rules区域是顺序执行的,所以分支逻辑可以直接用VB Script的If Else End If来实现。这一节举两个真实项目里很典型的进阶玩法。

玩法一:多产品型号的检测流程切换

一条流水线上,混流生产两种型号的产品:A和B。A产品的定位用CogPMAlignTool的Model A,B产品的定位用CogPMAlignTool的Model B。你不需要在流程里放两套工具链,只需要一套工具链加一个ResultsAnalysisTool做切换。

假设CogIDTool已经读出了产品码,产品码第一位是1表示A型号,是2表示B型号,代码可以这么写:

Dim productType As String productType = Left(DecodedCode, 1) If productType = "1" Then ' 使用Model A的定位结果,判定标准用A的阈值 Dim bPassA As Boolean bPassA = (PMA_Score > 0.85) And (PMA_Area < 100) FinalPass = bPassA ElseIf productType = "2" Then ' 使用Model B的定位结果,判定标准用B的阈值 Dim bPassB As Boolean bPassB = (PMB_Score > 0.75) And (PMB_Area < 80) FinalPass = bPassB Else FinalPass = False End If

这里需要注意:VisionPro的工具输出绑定不能像写代码一样动态切换路径,所以在Inputs区域里要把两种模型下需要的数值都绑定进来(PMA_Score、PMA_Area、PMB_Score、PMB_Area),然后在Rules逻辑中决定用哪一组。

玩法二:不合格品的二次复测流程

有些项目要求第一次检测NG后,自动旋转一个角度重新拍一张图再测一次,两次都NG才最终判定NG。这种流程一般在VisionPro里用循环工具链或CogJobManager实现,但ResultsAnalysisTool负责记录“这是第几次测量”和“最终是否放行”。

Dim currentCount As Integer currentCount = 0 If bFirstMeasureNG Then currentCount = currentCount + 1 ' 第一次NG,触发旋转复测 TriggerRetest = True Else TriggerRetest = False End If

这个场景的关键是跨工具、跨周期保存状态。CogResultsAnalysisTool本身不保存历史状态,所以“上次是否NG”需要通过Inputs区域绑定一个全局存储变量(比如Job的共享变量)来实现。如果用到这个功能,建议配合ScriptTool或全局变量表一起使用,把状态数据持久化。

4. 实战场景:三个典型的CogResultsAnalysisTool应用方案

4.1 多相机防错:三个相机联合判定,一票否决

多相机防错在汽车零部件、消费电子装配线上非常常见。比如一个产品需要同时检查正面、反面、侧面三个部位,三个相机分别拍照,各自跑一套检测逻辑,最后在CogResultsAnalysisTool里做联合判定。

假设三个相机的检测工具分别输出三个布尔结果:FrontPass、BackPass、SidePass。那么Rules区域只需要一行核心判断:

FinalPass = FrontPass And BackPass And SidePass

任何一个相机检测NG,最终结果就是NG。如果想细化NG类型,可以用多几个布尔输出:

FinalPass = FrontPass And BackPass And SidePass FrontFail = Not FrontPass BackFail = Not BackPass SideFail = Not SidePass

这样下游PLC就能精确知道是哪个部位出了问题,现场调试人员不必再去翻每个相机的日志。我在一个实际项目中,就是用这种方式把每个工位的NG类型细分成了十几类,故障定位效率成倍提升。

4.2 结果统计:自动计算当前班次合格率

生产现场经常需要实时看良率,但PLC端写统计逻辑对程序员要求比较高。有了CogResultsAnalysisTool,统计逻辑可以直接在视觉流程里完成。

把每次的判定结果(True/False)输入进来,配合全局变量做累计:

Dim totalCount As Integer Dim passCount As Integer Dim yieldRate As Double totalCount = TotalCounter + 1 If FinalPass Then passCount = PassCounter + 1 End If ' 更新全局计数器 TotalCounter = totalCount PassCounter = passCount ' 输出当前良率 If totalCount > 0 Then YieldRate = passCount / totalCount * 100 Else YieldRate = 0 End If

这里的关键是TotalCounter和PassCounter必须是全局变量,否则每次工具运行都会从0开始,统计就失去了意义。在VisionPro中,可以通过Job的全局变量表或Shared变量实现跨周期保存。这个方案适合做日采集、班组统计,实际操作中我会在流程开始时初始化这两个变量为零,然后每个周期累加一次。

提醒:如果统计量非常大且要求高并发访问,不建议在ResultsAnalysisTool里做,因为这会占用视觉系统处理时间。一两个简单累加没问题,复杂的数据库操作尽量丢给上位机。

4.3 字符串拼接:生成序列号追溯信息

很多项目要求把检测数据跟产品序列号绑定起来,形成完整追溯链。CogIDTool读到的序列号是字符串,检测结果是数值,ResultsAnalysisTool可以很方便地把它们拼成一条完整记录。

假设输入有:SerialNumber(字符串)、Score(浮点数)、Area(浮点数),输出有:TraceabilityInfo(字符串)。那么规则就是:

TraceabilityInfo = "SN=" & SerialNumber & ";Score=" & CStr(Score) & ";Area=" & CStr(Area)

生成的字符串直接发给PLC或上位机数据库。如果需要按固定长度补零,可以用字符串函数处理:

Dim snPadded As String snPadded = Right("00000000" & SerialNumber, 8)

这行代码把序列号补成8位,不足8位前面补0。这种小技巧在对接ERP/MES系统时特别常用,因为不同系统对序列号格式要求往往非常严格。

5. 常见问题排查与避坑经验

5.1 规则不生效:先检查输入输出绑定

我发现很多“工具没反应”的案例,根因并不是规则写错,而是Inputs或Outputs没有正确绑定。绑定的数据路径错了、绑的是旧版本工具的旧输出、或者绑定的是整个工具而不是具体的属性,都会导致变量拿到错误的值。

脚本调试第一步,一定是在Outputs区域右键,选择“View Output Data”查看当前工具的实际输出值。如果输出值是0或空字符串,说明问题出在输入端;如果输入值正确但输出不对,才是逻辑问题。

5.2 数据获取不到值:分清Item索引和属性名

绑定数据时,工具结果里经常会看到Item(0)这个层级。比如CogPMAlignTool的匹配结果,可能有多个匹配对象,Item(0)表示第一个匹配结果,Item(1)表示第二个。如果只做单目标定位,Item(0)没问题;但如果给了多个匹配,你绑定Item(0)只代表“最像的那个”,不一定是你想要的。

还有一点:属性名区分大小写吗?在VisionPro的绑定表达式里,属性名一般是区分大小写的,比如Score写成score就找不到。我自己的习惯是全部照着工具的自带属性提示来选择,绝不手写属性名,这样可以避开很多低级错误。

5.3 数值精度问题:避免浮点比较的坑

因为浮点数的存储特性,直接比较两个Double值是否相等经常会出问题。比如你算了一个数值等于刚好49.9999999,但阈值设的是50,按真实值它是合格的,但浮点比较结果可能不符合预期。

实际项目中我会尽量避免浮点数的严格相等判断,而是用范围判断:

Dim bAreaInRange As Boolean bAreaInRange = (Area >= 49.5) And (Area <= 50.5)

或者干脆用数值取舍:CDbl(FormatNumber(Area, 2))先把数值格式化为两位小数再比较。

5.4 常见问题速查表

现象原因处理方式
输出一直是False输入绑定错误,拿到的是旧值或空值查看Output Data,确认输入值是否合理
输入数据没更新工具执行顺序问题,上游工具没跑在工具流中确认上游工具已运行或已设置自动运行
脚本报错“变量未定义”变量名拼写不一致或用错了大小写检查Inputs/Outputs中定义的变量名
数值结果偏大/偏小单位换算问题(像素/毫米)绑定输入时确认是否经过了标定(Calibration)
字符串拼接后出现空白部分输出值为空字符先用CStr转换,再判断空值情况
运行速度变慢规则中写大量循环或复杂计算简化规则,把重计算放到上层系统

5.5 我踩过的坑:几个实操心得

心得一:先建Inputs再写Rules,顺序不要颠倒。有些人喜欢先在Rules里把逻辑写好,再回头去建Inputs,结果变量名对不上,来回改好几遍。正确做法是:先规划好需要的所有输入输出,一次配好,然后专心写Rules。

心得二:每个输出变量都取一个明确的名字,并加注释。在Rules区域,VB Script是支持单引号注释的:

' 最终判定结果:True合格,False不合格 FinalPass = bPass

团队协作时,别人接手项目看到注释会很感激你。我自己维护的旧项目中,看到那些没有注释的规则脚本,每次改都胆战心惊。

心得三:善用“View Output Data”和“Display Runtime Result”。VisionPro提供运行时结果查看窗口,断点式排查问题非常高效。工具跑完一帧图像后,可以看到所有输出变量当前值,哪一步不对一目了然。这个功能比翻日志强一百倍。

6. CogResultsAnalysisTool应用之后的场景扩展

这个工具用熟了之后,你会发现它能做的事情远不止“判断合格不合格”。我个人体会最深的几个扩展方向,供大家参考:

扩展一:作为流程的“调度中心”。在复杂的多工位视觉检测系统中,CogResultsAnalysisTool完全可以承担整个工位流程的状态机角色。用几个整数变量记录当前状态,通过If Else分支切换检测模式、触发复位、发送异常报警。状态机上、下电逻辑在视觉系统里其实非常实用,但它时常被忽略,大家更倾向去上位机做。

扩展二:作为上位机与视觉现场之间的“翻译官”。很多PLC通信协议里,需要把视觉判定结果按位映射成某个整型数值,比如Bit0表示是否存在、Bit1表示尺寸是否合格、Bit2表示读码是否成功等。你完全可以在CogResultsAnalysisTool里写一个整数拼装逻辑,把多个布尔结果打包成一个数字再发给PLC,省去上位机二次解析工作。

Dim msgCode As Integer msgCode = 0 If Not bExistThen msgCode = msgCode + 1 End If If Not bSizeOK Then msgCode = msgCode + 2 End If If Not bCodeOK Then msgCode = msgCode + 4 End If

这样的“二进制位映射”方式在许多项目中被验证高效稳定,PLC工程师看到这样的输出会非常开心。

扩展三:结合CogScriptTool做更复杂的字符串处理。CogResultsAnalysisTool的字符串函数够用,但真要处理复杂格式(比如JSON、XML拼接),它并不擅长。我总是把两个工具配合使用:ResultsAnalysisTool负责收集和整理数据,ScriptTool负责生成复杂通信报文。放在项目中,两者各司其职,稳定性非常高。

如果你正卡在“多工具逻辑判断”这块,希望这篇文章能给你一个明确的思路。工具本身并不复杂,复杂的是应用场景里的各种边界条件。但只要你把Inputs、Rules、Outputs这条链路吃透,再配合现场调试时的耐心排查,绝大多数逻辑问题都能迎刃而解。这个工具真正跑顺之后,你会发现自己对视觉流程的理解又会深一层。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 17:43:16

在 Codex 里 DeepSeek V2 总报错?TaoToken 这样填 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 17:43:05

openai/skills 挑个技能,Base URL 填 TaoToken 再让 Codex 跑 mcp-builder

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 17:42:29

ATVC 实践:通过 PyTorch 调用 ATVC 模板开发 Add 自定义 Vector 算子

ATVC 实践&#xff1a;通过 PyTorch 调用 ATVC 模板开发 Add 自定义 Vector 算子 【免费下载链接】atvc ATVC&#xff08;Ascend C Templates for Vector Compute&#xff09;&#xff0c;是为基于Ascend C开发的典型Vector算子封装的一系列模板头文件的集合&#xff0c;可帮助…

作者头像 李华
网站建设 2026/9/18 17:42:22

MyBatis-Flex与MyBatis-Plus深度对比与实战指南

1. 项目概述最近在Java持久层框架领域&#xff0c;一个新选手MyBatis-Flex突然闯入开发者视野。作为一个长期使用MyBatis-Plus的老鸟&#xff0c;我第一时间下载体验了这个号称"完爆MyBatis-Plus"的新框架。经过两周的实际项目验证&#xff0c;我想分享一些真实的使用…

作者头像 李华
网站建设 2026/9/18 17:42:02

Flutter分页库http_pagination的鸿蒙适配方案

1. 项目背景与核心价值在移动应用开发中&#xff0c;分页加载是最基础也最容易被忽视的功能模块之一。Flutter生态中的http_pagination库通过封装分页逻辑与状态管理&#xff0c;为开发者提供了开箱即用的分页解决方案。但随着鸿蒙系统的崛起&#xff0c;跨平台兼容性问题逐渐凸…

作者头像 李华