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:
@@ -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 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user