7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-21 14:41:42 +00:00

API: Add PCB editor visible and active layer setters/getters

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18268
This commit is contained in:
Jon Evans 2024-12-03 21:17:48 -05:00
parent 044643b164
commit 98ae574c78
5 changed files with 147 additions and 0 deletions

View File

@ -148,6 +148,44 @@ message PadShapeAsPolygonResponse
repeated kiapi.common.types.PolygonWithHoles polygons = 2;
}
// PCB editor commands
// returns BoardLayers
message GetVisibleLayers
{
kiapi.common.types.DocumentSpecifier board = 1;
}
message BoardLayerResponse
{
kiapi.board.types.BoardLayer layer = 1;
}
message BoardLayers
{
repeated kiapi.board.types.BoardLayer layers = 1;
}
message SetVisibleLayers
{
kiapi.common.types.DocumentSpecifier board = 1;
repeated kiapi.board.types.BoardLayer layers = 2;
}
// returns BoardLayerResponse
message GetActiveLayer
{
kiapi.common.types.DocumentSpecifier board = 1;
}
message SetActiveLayer
{
kiapi.common.types.DocumentSpecifier board = 1;
kiapi.board.types.BoardLayer layer = 2;
}
//// Interactive commands ////
// These commands begin an interactive operation in the editor.
// They return a response immediately, but the editor will become busy

View File

@ -88,6 +88,7 @@ enum BoardLayer
BL_User_7 = 59;
BL_User_8 = 60;
BL_User_9 = 61;
BL_Rescue = 62;
}
message NetCode

View File

@ -213,6 +213,7 @@ PCB_LAYER_ID FromProtoEnum( board::types::BoardLayer aValue )
case board::types::BoardLayer::BL_User_7: return User_7;
case board::types::BoardLayer::BL_User_8: return User_8;
case board::types::BoardLayer::BL_User_9: return User_9;
case board::types::BoardLayer::BL_Rescue: return Rescue;
case board::types::BoardLayer::BL_UNKNOWN: return UNDEFINED_LAYER;
default:
@ -288,6 +289,7 @@ board::types::BoardLayer ToProtoEnum( PCB_LAYER_ID aValue )
case User_7: return board::types::BoardLayer::BL_User_7;
case User_8: return board::types::BoardLayer::BL_User_8;
case User_9: return board::types::BoardLayer::BL_User_9;
case Rescue: return board::types::BoardLayer::BL_Rescue;
default:
wxCHECK_MSG( false, board::types::BoardLayer::BL_UNKNOWN,
"Unhandled case in ToProtoEnum<PCB_LAYER_ID>");

View File

@ -44,6 +44,7 @@
#include <zone.h>
#include <api/common/types/base_types.pb.h>
#include <widgets/appearance_controls.h>
using namespace kiapi::common::commands;
using types::CommandStatus;
@ -83,6 +84,10 @@ API_HANDLER_PCB::API_HANDLER_PCB( PCB_EDIT_FRAME* aFrame ) :
&API_HANDLER_PCB::handleSaveSelectionToString );
registerHandler<ParseAndCreateItemsFromString, CreateItemsResponse>(
&API_HANDLER_PCB::handleParseAndCreateItemsFromString );
registerHandler<GetVisibleLayers, BoardLayers>( &API_HANDLER_PCB::handleGetVisibleLayers );
registerHandler<SetVisibleLayers, Empty>( &API_HANDLER_PCB::handleSetVisibleLayers );
registerHandler<GetActiveLayer, BoardLayerResponse>( &API_HANDLER_PCB::handleGetActiveLayer );
registerHandler<SetActiveLayer, Empty>( &API_HANDLER_PCB::handleSetActiveLayer );
}
@ -917,3 +922,94 @@ HANDLER_RESULT<CreateItemsResponse> API_HANDLER_PCB::handleParseAndCreateItemsFr
CreateItemsResponse response;
return response;
}
HANDLER_RESULT<BoardLayers> API_HANDLER_PCB::handleGetVisibleLayers( GetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
BoardLayers response;
for( PCB_LAYER_ID layer : frame()->GetBoard()->GetVisibleLayers() )
response.add_layers( ToProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( layer ) );
return response;
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetVisibleLayers( SetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
LSET visible;
LSET enabled = frame()->GetBoard()->GetEnabledLayers();
for( int layerIdx : aMsg.layers() )
{
PCB_LAYER_ID layer =
FromProtoEnum<PCB_LAYER_ID>( static_cast<board::types::BoardLayer>( layerIdx ) );
if( enabled.Contains( layer ) )
visible.set( layer );
}
frame()->GetBoard()->SetVisibleLayers( visible );
frame()->GetAppearancePanel()->OnBoardChanged();
frame()->GetCanvas()->SyncLayersVisibility( frame()->GetBoard() );
frame()->Refresh();
return Empty();
}
HANDLER_RESULT<BoardLayerResponse> API_HANDLER_PCB::handleGetActiveLayer(
GetActiveLayer& aMsg, const HANDLER_CONTEXT& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
BoardLayerResponse response;
response.set_layer(
ToProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( frame()->GetActiveLayer() ) );
return response;
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetActiveLayer( SetActiveLayer& aMsg,
const HANDLER_CONTEXT& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID>( aMsg.layer() );
if( !frame()->GetBoard()->GetEnabledLayers().Contains( layer ) )
{
ApiResponseStatus err;
err.set_status( ApiStatusCode::AS_BAD_REQUEST );
err.set_error_message( fmt::format( "Layer {} is not a valid layer for the given board",
magic_enum::enum_name( layer ) ) );
return tl::unexpected( err );
}
frame()->SetActiveLayer( layer );
return Empty();
}

View File

@ -102,6 +102,16 @@ private:
HANDLER_RESULT<commands::CreateItemsResponse> handleParseAndCreateItemsFromString(
commands::ParseAndCreateItemsFromString& aMsg, const HANDLER_CONTEXT& aCtx );
HANDLER_RESULT<BoardLayers> handleGetVisibleLayers( GetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx );
HANDLER_RESULT<Empty> handleSetVisibleLayers( SetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx );
HANDLER_RESULT<BoardLayerResponse> handleGetActiveLayer( GetActiveLayer& aMsg,
const HANDLER_CONTEXT& aCtx );
HANDLER_RESULT<Empty> handleSetActiveLayer( SetActiveLayer& aMsg, const HANDLER_CONTEXT& aCtx );
protected:
std::unique_ptr<COMMIT> createCommit() override;