API: Add serialization for netclasses

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18609
This commit is contained in:
Jon Evans
2024-12-30 23:29:29 -05:00
parent aa2be7dd5a
commit 2c56e9826a
8 changed files with 252 additions and 3 deletions
+45 -2
View File
@@ -45,6 +45,7 @@ API_HANDLER_COMMON::API_HANDLER_COMMON() :
{
registerHandler<commands::GetVersion, GetVersionResponse>( &API_HANDLER_COMMON::handleGetVersion );
registerHandler<GetNetClasses, NetClassesResponse>( &API_HANDLER_COMMON::handleGetNetClasses );
registerHandler<SetNetClasses, Empty>( &API_HANDLER_COMMON::handleSetNetClasses );
registerHandler<Ping, Empty>( &API_HANDLER_COMMON::handlePing );
registerHandler<GetTextExtents, types::Box2>( &API_HANDLER_COMMON::handleGetTextExtents );
registerHandler<GetTextAsShapes, GetTextAsShapesResponse>(
@@ -85,15 +86,57 @@ HANDLER_RESULT<NetClassesResponse> API_HANDLER_COMMON::handleGetNetClasses(
std::shared_ptr<NET_SETTINGS>& netSettings =
Pgm().GetSettingsManager().Prj().GetProjectFile().m_NetSettings;
for( const auto& [name, netClass] : netSettings->GetNetclasses() )
google::protobuf::Any any;
netSettings->GetDefaultNetclass()->Serialize( any );
any.UnpackTo( reply.add_net_classes() );
for( const auto& netClass : netSettings->GetNetclasses() | std::views::values )
{
reply.add_net_classes()->set_name( name.ToStdString() );
netClass->Serialize( any );
any.UnpackTo( reply.add_net_classes() );
}
return reply;
}
HANDLER_RESULT<Empty> API_HANDLER_COMMON::handleSetNetClasses(
const HANDLER_CONTEXT<SetNetClasses>& aCtx )
{
std::shared_ptr<NET_SETTINGS>& netSettings =
Pgm().GetSettingsManager().Prj().GetProjectFile().m_NetSettings;
if( aCtx.Request.merge_mode() == MapMergeMode::MMM_REPLACE )
netSettings->ClearNetclasses();
auto netClasses = netSettings->GetNetclasses();
google::protobuf::Any any;
for( const auto& ncProto : aCtx.Request.net_classes() )
{
any.PackFrom( ncProto );
wxString name = wxString::FromUTF8( ncProto.name() );
if( name == wxT( "Default" ) )
{
netSettings->GetDefaultNetclass()->Deserialize( any );
}
else
{
if( !netClasses.contains( name ) )
netClasses.insert( { name, std::make_shared<NETCLASS>( name, false ) } );
netClasses[name]->Deserialize( any );
}
}
netSettings->SetNetclasses( netClasses );
return Empty();
}
HANDLER_RESULT<Empty> API_HANDLER_COMMON::handlePing( const HANDLER_CONTEXT<Ping>& aCtx )
{
return Empty();