kicad源代码研究:symbol properties窗口中为SCH_SYMBOL添加或删除一个sch_field

向grid中添加一个sch_field

cpp 复制代码
FIELDS_GRID_TABLE<SCH_FIELD>* m_fields;
WX_GRID* m_fieldsGrid;
simEnableFieldRow = (int) m_fields->size();
m_fields->emplace_back( VECTOR2I( 0, 0 ), simEnableFieldRow, m_symbol, SIM_ENABLE_FIELD );
// notify the grid
wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
m_fieldsGrid->ProcessTableMessage( msg );

这段代码定义了两个指针变量 m_fields 和 m_fieldsGrid,分别指向 FIELDS_GRID_TABLE<SCH_FIELD> 类型和 WX_GRID 类型的对象。然后,它创建一个新的 VECTOR2I 对象和其他参数,并将其添加到 m_fields 向量的末尾。接下来,它向 m_fieldsGrid 发送一条消息,告诉它已经添加了一行。

ProcessTableMessage函数主要作用是什么?

ProcessTableMessage 函数是 wxGrid 类的一个成员函数,用于处理 wxGridTableMessage 类型的消息。它的主要作用是在网格表格中执行与消息相关的操作,例如添加、删除或更新行和列。在上述代码中,ProcessTableMessage 函数用于通知网格表格添加了一行。

cpp 复制代码
FIELDS_GRID_TABLE<SCH_FIELD>* m_fields;
WX_GRID* m_fieldsGrid;
   SCHEMATIC_SETTINGS& settings = m_symbol->Schematic()->Settings();
    int                 fieldID = (int) m_fields->size();
    SCH_FIELD           newField( VECTOR2I( 0, 0 ), fieldID, m_symbol,
                                  TEMPLATE_FIELDNAME::GetDefaultFieldName( fieldID, DO_TRANSLATE ) );

    newField.SetTextAngle( m_fields->at( REFERENCE_FIELD ).GetTextAngle() );
    newField.SetTextSize( VECTOR2I( settings.m_DefaultTextSize, settings.m_DefaultTextSize ) );

    m_fields->push_back( newField );

    // notify the grid
    wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
    m_fieldsGrid->ProcessTableMessage( msg );

wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_fields->size() );这句代码什么意思

这句代码创建了一个 wxGridTableMessage 对象 msg,用于通知网格表格添加行。它包含以下参数:

  • m_fields:指向数据模型的指针,表示要添加行的数据源。
  • wxGRIDTABLE_NOTIFY_ROWS_APPENDED:通知类型,表示要执行的操作是添加行。
  • m_fields->size():新添加行的索引,即当前数据源中的行数。

通过创建并发送这个消息,可以告知网格表格添加一行新数据。

删除一个sch_field

cpp 复制代码
FIELDS_GRID_TABLE<SCH_FIELD>* m_fields;
WX_GRID* m_fieldsGrid;
 for( int ii = (int) m_fields->size() - 1; ii >= 0; --ii )
    {
        SCH_FIELD& existingField = m_fields->at( ii );
        bool       found = false;
       if( editedField.GetName() == existingField.GetName() )
         {
              found = true;
              break;
         }
        if( !found )
        {
            m_fields->erase( m_fields->begin() + ii );
            wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );
            m_fieldsGrid->ClearSelection();
            m_fieldsGrid->ProcessTableMessage( msg );
        }
    }

其中:

cpp 复制代码
wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );

这句代码创建了一个 wxGridTableMessage 对象 msg,用于通知网格表格删除行。它包含以下参数:

  • m_fields:指向数据模型的指针,表示要删除行的数据源。
  • wxGRIDTABLE_NOTIFY_ROWS_DELETED:通知类型,表示要执行的操作是删除行。
  • ii:要删除的起始行的索引。
  • 1:要删除的行数。

通过创建并发送这个消息,可以告知网格表格删除指定范围内的行。

判断是否包含某一个sch_field

cpp 复制代码
 for( SCH_FIELD& existingField : *m_fields )
        {
            if( existingField.GetName() == editedField.GetName() )
            {
                found = true;
                existingField.SetText( editedField.GetText() );
                break;
            }
        }
相关推荐
归去_来兮8 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
随风飘的云10 小时前
MySQL的慢查询优化解决思路
数据库
IvorySQL14 小时前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
千寻girling14 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
赵渝强老师15 小时前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
颜酱18 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
随逸17718 小时前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头18 小时前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
IvorySQL2 天前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
CoovallyAIHub2 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉