跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

KiCad 符号编辑器引脚添加与同步机制解析

KiCad 符号编辑器中引脚的创建与同步逻辑涉及状态管理、标志位设置及多单元数据一致性维护。核心流程包括工具初始化、新建引脚时的属性配置(如位置、方向、类型)以及修改时的跨单元同步机制。代码通过 IS_NEW 和 IS_LINKED 标志区分引脚生命周期,利用撤销列表保障操作可逆,并通过遍历引脚列表比对属性来实现多单元间的联动更新,确保符号在不同单元下表现统一。

云间运维发布于 2025/1/16更新于 2026/7/2736 浏览
KiCad 符号编辑器引脚添加与同步机制解析

工具初始化与引脚创建流程

在 KiCad 的符号编辑器中,添加引脚不仅仅是绘制图形,更涉及内部状态的管理和对象的生命周期控制。核心逻辑位于 SYMBOL_EDITOR_PIN_TOOL 类中。

工具实例化

首先,工具基类被初始化,绑定到当前的编辑框架:

SYMBOL_EDITOR_PIN_TOOL::SYMBOL_EDITOR_PIN_TOOL() : EE_TOOL_BASE<SYMBOL_EDIT_FRAME> 

这一步确立了操作上下文,确保后续对符号的操作能正确反映在编辑器界面中。

新建引脚的逻辑

当用户触发添加引脚动作时,系统会实例化一个新的 LIB_PIN 对象。这里的关键在于标志位(Flags)的设置,它决定了引脚在后续操作中的行为:

aSymbol->ClearTempFlags(); LIB_PIN* pin = new LIB_PIN( aSymbol ); pin->SetFlags( IS_NEW ); // Flag pins to consider if( m_frame->SynchronizePins() ) pin->SetFlags( IS_LINKED ); pin->MoveTo( aPosition ); pin->SetLength( GetLastPinLength() ); pin->SetOrientation( g_LastPinOrient ); pin->SetType( g_LastPinType ); pin->SetShape( g_LastPinShape ); pin->SetNameTextSize( GetLastPinNameSize() ); pin->SetNumberTextSize( GetLastPinNumSize() ); pin->SetConvert( g_LastPinCommonConvert ? 0 : m_frame->GetConvert() ); pin->SetUnit( g_LastPinCommonUnit ? 0 : m_frame->GetUnit() ); pin->SetVisible( g_LastPinVisible ); 

注意 IS_NEW 标志,它标记了这是一个新创建的引脚,便于后续区分修改操作。同时,如果启用了引脚同步功能(SynchronizePins()),还会设置 IS_LINKED,这意味着该引脚的状态变更可能会影响其他单元中的对应引脚。

修改与多单元同步

处理现有引脚的修改时,逻辑更为复杂,特别是当符号包含多个单元(Unit)时。系统需要维护一个撤销列表,并检查是否需要跨单元同步属性:

LIB_PIN original_pin( *aPin ); if( aPin->GetEditFlags() == 0 ) SaveCopyInUndoList( aPin->GetParent() ); aPin->SetModified(); if( !aPin->IsNew() && m_frame->SynchronizePins() && aPin->GetParent() ) { LIB_PINS pinList; aPin->GetParent()->GetPins( pinList ); // a pin can have a unit id = 0 (common to all units) to unit count // So we need a buffer size = GetUnitCount()+1 to store a value in a vector // when using the unit id of a pin as index std::vector<bool> got_unit( aPin->GetParent()->GetUnitCount() + 1 ); got_unit[static_cast<size_t>(aPin->GetUnit())] = true; for( LIB_PIN* other : pinList ) { if( other == aPin ) continue; /// Only change one pin per unit to allow stacking pins /// If you change all units on the position, then pins are not /// uniquely editable if( got_unit[static_cast<size_t>( other->GetUnit() )] ) continue; if( other->GetPosition() == original_pin.GetPosition() && other->GetOrientation() == original_pin.GetOrientation() && other->GetType() == original_pin.GetType() && other->IsVisible() == original_pin.IsVisible() && other->GetName() == original_pin.GetName() ) { if( aPin->GetConvert() == 0 ) { if( !aPin->GetUnit() || other->GetUnit() == aPin->GetUnit() ) aPin->GetParent()->RemoveDrawItem( other ); } else if( other->GetConvert() == aPin->GetConvert() ) { other->SetPosition( aPin->GetPosition() ); other->ChangeLength( aPin->GetLength() ); other->SetShape( aPin->GetShape() ); } if( aPin->GetUnit() == 0 ) { if( !aPin->GetConvert() || other->GetConvert() == aPin->GetConvert() ) aPin->GetParent()->RemoveDrawItem( other ); } other->SetOrientation( aPin->GetOrientation() ); other->SetType( aPin->GetType() ); other->SetVisible( aPin->IsVisible() ); other->SetName( aPin->GetName() ); other->SetNameTextSize( aPin->GetNameTextSize() ); other->SetNumberTextSize( aPin->GetNumberTextSize() ); other->SetModified(); got_unit[static_cast<size_t>( other->GetUnit() )] = true; } } }

这段代码展示了同步的核心策略:

  1. 撤销保护:在修改前保存副本到撤销列表,防止误操作无法回退。
  2. 单位隔离:通过 got_unit 向量记录已处理的单元 ID,避免重复修改同一单元内的引脚。
  3. 属性比对:只有当位置、方向、类型等关键属性一致时,才执行同步更新或删除冗余项。
  4. 通用引脚处理:对于 Unit ID 为 0 的通用引脚,逻辑会有所不同,确保所有单元共享正确的配置。

理解这些底层逻辑,有助于在开发自定义符号或扩展编辑器功能时,正确处理引脚的关联关系和数据一致性。

目录

  1. 工具初始化与引脚创建流程
  2. 工具实例化
  3. 新建引脚的逻辑
  4. 修改与多单元同步
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Faster-Whisper 本地实时语音识别部署实战
  • PowerShell 中激活 Python 虚拟环境的几种办法
  • Web 自动化测试入门:从概念到百度搜索实战
  • 基于 Java 的家庭药品管理系统设计与实现
  • Copilot 登录失败排查指南:7 个关键检查点
  • 国内主流 AI 工具横评:豆包、元宝、千问等七款深度对比
  • 向日葵连接 Ubuntu 22.04 黑屏解决方案
  • Python 金融数据获取:问财 API 全解析与实战
  • SpringBoot 项目整合 OpenFeign 启动失败及运行时常见错误总结
  • 数据结构:双向循环链表详解
  • LIBERO:终身机器人学习综合基准测试平台
  • Java Web 前端入门:HTML 核心知识点总结
  • Python 布尔类型基础
  • 淘特 App x-sign 签名逆向分析:从抓包到算法还原
  • 基于 ThinkPHP 与 Uniapp 的防伪溯源系统搭建指南
  • 基于 AKShare 获取 A 股历史行情数据实战
  • MCP 协议详解:与 Function Call 的区别及 Python SDK 使用指南
  • 从 Copilot 到 Agentic:快手重构人 AI 流程研发铁三角实践
  • C++ STL 核心基础:迭代器、auto 与范围循环
  • 无密码登录安全对比与 WebAuthn 技术实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online