API: Add CheckPadstackPresenceOnLayers

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20587


(cherry picked from commit d1e4b03ec1)

Co-authored-by: Jon Evans <[email protected]>
This commit is contained in:
Jon Evans
2025-05-26 21:47:44 -04:00
parent 71eeb754b3
commit 061cb2eba8
3 changed files with 108 additions and 0 deletions
+69
View File
@@ -78,6 +78,8 @@ API_HANDLER_PCB::API_HANDLER_PCB( PCB_EDIT_FRAME* aFrame ) :
&API_HANDLER_PCB::handleGetBoundingBox );
registerHandler<GetPadShapeAsPolygon, PadShapeAsPolygonResponse>(
&API_HANDLER_PCB::handleGetPadShapeAsPolygon );
registerHandler<CheckPadstackPresenceOnLayers, PadstackPresenceResponse>(
&API_HANDLER_PCB::handleCheckPadstackPresenceOnLayers );
registerHandler<GetTitleBlockInfo, types::TitleBlockInfo>(
&API_HANDLER_PCB::handleGetTitleBlockInfo );
registerHandler<ExpandTextVariables, ExpandTextVariablesResponse>(
@@ -1056,6 +1058,73 @@ HANDLER_RESULT<PadShapeAsPolygonResponse> API_HANDLER_PCB::handleGetPadShapeAsPo
}
HANDLER_RESULT<PadstackPresenceResponse> API_HANDLER_PCB::handleCheckPadstackPresenceOnLayers(
const HANDLER_CONTEXT<CheckPadstackPresenceOnLayers>& aCtx )
{
using board::types::BoardLayer;
if( HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
!documentValidation )
{
return tl::unexpected( documentValidation.error() );
}
PadstackPresenceResponse response;
LSET layers;
for( const int layer : aCtx.Request.layers() )
layers.set( FromProtoEnum<PCB_LAYER_ID, BoardLayer>( static_cast<BoardLayer>( layer ) ) );
for( const types::KIID& padRequest : aCtx.Request.items() )
{
KIID id( padRequest.value() );
std::optional<BOARD_ITEM*> optItem = getItemById( id );
if( !optItem )
continue;
switch( ( *optItem )->Type() )
{
case PCB_PAD_T:
{
PAD* pad = static_cast<PAD*>( *optItem );
for( PCB_LAYER_ID layer : layers )
{
PadstackPresenceEntry* entry = response.add_entries();
entry->mutable_item()->set_value( pad->m_Uuid.AsStdString() );
entry->set_layer( ToProtoEnum<PCB_LAYER_ID, BoardLayer>( layer ) );
entry->set_presence( pad->FlashLayer( layer ) ? PSP_PRESENT : PSP_NOT_PRESENT );
}
break;
}
case PCB_VIA_T:
{
PCB_VIA* via = static_cast<PCB_VIA*>( *optItem );
for( PCB_LAYER_ID layer : layers )
{
PadstackPresenceEntry* entry = response.add_entries();
entry->mutable_item()->set_value( via->m_Uuid.AsStdString() );
entry->set_layer( ToProtoEnum<PCB_LAYER_ID, BoardLayer>( layer ) );
entry->set_presence( via->FlashLayer( layer ) ? PSP_PRESENT : PSP_NOT_PRESENT );
}
break;
}
default:
break;
}
}
return response;
}
HANDLER_RESULT<types::TitleBlockInfo> API_HANDLER_PCB::handleGetTitleBlockInfo(
const HANDLER_CONTEXT<GetTitleBlockInfo>& aCtx )
{