API: Add board origin setter/getter

See https://gitlab.com/kicad/code/kicad-python/-/issues/20
This commit is contained in:
Jon Evans
2025-02-25 20:13:16 -05:00
parent 72411af9de
commit 5cec2fac9d
7 changed files with 138 additions and 6 deletions
+92 -3
View File
@@ -82,6 +82,8 @@ API_HANDLER_PCB::API_HANDLER_PCB( PCB_EDIT_FRAME* aFrame ) :
&API_HANDLER_PCB::handleGetTitleBlockInfo );
registerHandler<ExpandTextVariables, ExpandTextVariablesResponse>(
&API_HANDLER_PCB::handleExpandTextVariables );
registerHandler<GetBoardOrigin, types::Vector2>( &API_HANDLER_PCB::handleGetBoardOrigin );
registerHandler<SetBoardOrigin, Empty>( &API_HANDLER_PCB::handleSetBoardOrigin );
registerHandler<InteractiveMoveItems, Empty>( &API_HANDLER_PCB::handleInteractiveMoveItems );
registerHandler<GetNets, NetsResponse>( &API_HANDLER_PCB::handleGetNets );
@@ -869,6 +871,92 @@ HANDLER_RESULT<GraphicsDefaultsResponse> API_HANDLER_PCB::handleGetGraphicsDefau
}
HANDLER_RESULT<types::Vector2> API_HANDLER_PCB::handleGetBoardOrigin(
const HANDLER_CONTEXT<GetBoardOrigin>& aCtx )
{
if( HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
!documentValidation )
{
return tl::unexpected( documentValidation.error() );
}
VECTOR2I origin;
const BOARD_DESIGN_SETTINGS& settings = frame()->GetBoard()->GetDesignSettings();
switch( aCtx.Request.type() )
{
case BOT_GRID:
origin = settings.GetGridOrigin();
break;
case BOT_DRILL:
origin = settings.GetAuxOrigin();
break;
default:
case BOT_UNKNOWN:
{
ApiResponseStatus e;
e.set_status( ApiStatusCode::AS_BAD_REQUEST );
e.set_error_message( "Unexpected origin type" );
return tl::unexpected( e );
}
}
types::Vector2 reply;
PackVector2( reply, origin );
return reply;
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetBoardOrigin(
const HANDLER_CONTEXT<SetBoardOrigin>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
if( HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
!documentValidation )
{
return tl::unexpected( documentValidation.error() );
}
BOARD_DESIGN_SETTINGS& settings = frame()->GetBoard()->GetDesignSettings();
VECTOR2I origin = UnpackVector2( aCtx.Request.origin() );
switch( aCtx.Request.type() )
{
case BOT_GRID:
settings.SetGridOrigin( origin );
frame()->Refresh();
break;
case BOT_DRILL:
{
PCB_EDIT_FRAME* f = frame();
frame()->CallAfter( [f, origin]()
{
TOOL_MANAGER* mgr = f->GetToolManager();
mgr->RunAction( PCB_ACTIONS::drillSetOrigin, origin );
f->Refresh();
} );
break;
}
default:
case BOT_UNKNOWN:
{
ApiResponseStatus e;
e.set_status( ApiStatusCode::AS_BAD_REQUEST );
e.set_error_message( "Unexpected origin type" );
return tl::unexpected( e );
}
}
return Empty();
}
HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox(
const HANDLER_CONTEXT<GetBoundingBox>& aCtx )
{
@@ -913,10 +1001,11 @@ HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox(
HANDLER_RESULT<PadShapeAsPolygonResponse> API_HANDLER_PCB::handleGetPadShapeAsPolygon(
const HANDLER_CONTEXT<GetPadShapeAsPolygon>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
if( HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
!documentValidation )
{
return tl::unexpected( documentValidation.error() );
}
PadShapeAsPolygonResponse response;
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( aCtx.Request.layer() );