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


    向grid中添加一个sch_field

    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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    ProcessTableMessage函数主要作用是什么?

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

    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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

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

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

    删除一个sch_field

    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 );
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    其中:

    wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );
    
    • 1

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

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

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

    判断是否包含某一个sch_field

     for( SCH_FIELD& existingField : *m_fields )
            {
                if( existingField.GetName() == editedField.GetName() )
                {
                    found = true;
                    existingField.SetText( editedField.GetText() );
                    break;
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果sim.Type为BSIM_CMG或BSIMBULK时添加Model.Version属性

    void  DIALOG_SYMBOL_PROPERTIES::UpdateModelVersion()
    {
        wxString lib=m_symbol->GetLibId().GetLibNickname().wx_str();
        wxString item =m_symbol->GetLibId().GetLibItemName().wx_str();
        if(lib=="Simulation_SPICE"&&item=="NMOS_Substrate")
        {
            wxString type = m_symbol->GetFieldText( "Sim.Type" );
            wxString version = m_symbol->GetModleVersion( );
            if(type=="BSIM_CMG"||type=="BSIMBULK")
            {
                  bool found=false;
                for( SCH_FIELD& existingField : *m_fields )
               {
                    std::cout<<"existingField.GetName() "<<existingField.GetName()<<std::endl;
                    if( existingField.GetName() == "Model.Version" )
                   {
                         found = true;                
                         break;
                    }
               }
               if(!found)
               {
                 //m_symbol->AddField( _( "Model.Version" ), wxT( "Model.Version" ), true, true  );
                 SCH_FIELD field( VECTOR2I( 0, 0 ), m_fields->size(), m_symbol, "Model.Version" );
                 field.SetVisible( true );
                 field.SetText("107.0");
                 m_symbol->AddField(field);
                 m_fields->push_back( field );
                 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
                 m_fieldsGrid->ProcessTableMessage( msg );
                }
    
            }else{
                bool found=false;
                for( int ii = (int) m_fields->size() - 1; ii >= 0; --ii )
               {
                    SCH_FIELD& existingField = m_fields->at( ii );
                    bool       found = false;
    
                    if( existingField.GetName() == "Model.Version")
                    {
                        found = true;
                        break;
                    }
    
                    if( found )
                    {
                     m_symbol->RemoveField("Model.Version");
                     m_fields->erase( m_fields->begin() + ii );
                     wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );
                     m_fieldsGrid->ClearSelection();
                     m_fieldsGrid->ProcessTableMessage( msg );
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    这个代码还有一点问题,需要进一步研究。

  • 相关阅读:
    小米应用商店如何做优化?有哪些方式 ?
    【Linux】TCP的服务端(守护进程) + 客户端
    java-使用jacob实现通过邮件发送指令执行各种功能0.2.0
    java---BFS算法---走迷宫(每日一道算法2022.8.22)
    基础算法:二分查找、异或运算
    测试人员,除了测试还得会点什么
    华为机试真题 C++ 实现【字符串中找出连续最长的数字串】
    使用 Spring Profiles 的正确姿势
    长、短视频中场歇战
    11个Redis系列高频面试题,哪些你还不会?
  • 原文地址:https://blog.csdn.net/haimianjie2012/article/details/134422163