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:
parent
044643b164
commit
98ae574c78
api/proto/board
common/api
pcbnew/api
@ -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
|
||||
|
@ -88,6 +88,7 @@ enum BoardLayer
|
||||
BL_User_7 = 59;
|
||||
BL_User_8 = 60;
|
||||
BL_User_9 = 61;
|
||||
BL_Rescue = 62;
|
||||
}
|
||||
|
||||
message NetCode
|
||||
|
@ -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>");
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user