21#include <magic_enum.hpp>
47#include <api/common/types/base_types.pb.h>
50using namespace kiapi::common::commands;
51using types::CommandStatus;
52using types::DocumentType;
53using types::ItemRequestStatus;
60 registerHandler<GetOpenDocuments, GetOpenDocumentsResponse>(
71 registerHandler<RemoveFromSelection, SelectionResponse>(
75 registerHandler<GetGraphicsDefaults, GraphicsDefaultsResponse>(
77 registerHandler<GetBoundingBox, GetBoundingBoxResponse>(
79 registerHandler<GetPadShapeAsPolygon, PadShapeAsPolygonResponse>(
81 registerHandler<GetTitleBlockInfo, types::TitleBlockInfo>(
83 registerHandler<ExpandTextVariables, ExpandTextVariablesResponse>(
88 registerHandler<GetNetClassForNets, NetClassForNetsResponse>(
92 registerHandler<SaveDocumentToString, SavedDocumentResponse>(
94 registerHandler<SaveSelectionToString, SavedSelectionResponse>(
96 registerHandler<ParseAndCreateItemsFromString, CreateItemsResponse>(
102 registerHandler<GetBoardEditorAppearanceSettings, BoardEditorAppearanceSettings>(
104 registerHandler<SetBoardEditorAppearanceSettings, Empty>(
118 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
119 return tl::unexpected( *busy );
121 RunActionResponse response;
123 if(
frame()->GetToolManager()->RunAction( aCtx.
Request.action(),
true ) )
124 response.set_status( RunActionStatus::RAS_OK );
126 response.set_status( RunActionStatus::RAS_INVALID );
135 if( aCtx.
Request.type() != DocumentType::DOCTYPE_PCB )
139 e.set_status( ApiStatusCode::AS_UNHANDLED );
140 return tl::unexpected( e );
143 GetOpenDocumentsResponse response;
144 common::types::DocumentSpecifier doc;
146 wxFileName fn(
frame()->GetCurrentFileName() );
148 doc.set_type( DocumentType::DOCTYPE_PCB );
149 doc.set_board_filename( fn.GetFullName() );
151 doc.mutable_project()->set_name(
frame()->
Prj().GetProjectName().ToStdString() );
152 doc.mutable_project()->set_path(
frame()->
Prj().GetProjectDirectory().ToStdString() );
154 response.mutable_documents()->Add( std::move( doc ) );
162 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
163 return tl::unexpected( *busy );
167 if( !documentValidation )
168 return tl::unexpected( documentValidation.error() );
178 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
179 return tl::unexpected( *busy );
183 if( !documentValidation )
184 return tl::unexpected( documentValidation.error() );
186 wxFileName boardPath(
frame()->
Prj().AbsolutePath( wxString::FromUTF8( aCtx.
Request.path() ) ) );
188 if( !boardPath.IsOk() || !boardPath.IsDirWritable() )
191 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
192 e.set_error_message( fmt::format(
"save path '{}' could not be opened",
193 boardPath.GetFullPath().ToStdString() ) );
194 return tl::unexpected( e );
197 if( boardPath.FileExists()
198 && ( !boardPath.IsFileWritable() || !aCtx.
Request.options().overwrite() ) )
201 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
202 e.set_error_message( fmt::format(
"save path '{}' exists and cannot be overwritten",
203 boardPath.GetFullPath().ToStdString() ) );
204 return tl::unexpected( e );
210 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
211 e.set_error_message( fmt::format(
"save path '{}' must have a kicad_pcb extension",
212 boardPath.GetFullPath().ToStdString() ) );
213 return tl::unexpected( e );
218 if( board->
GetFileName().Matches( boardPath.GetFullPath() ) )
224 bool includeProject =
true;
226 if( aCtx.
Request.has_options() )
227 includeProject = aCtx.
Request.options().include_project();
238 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
239 return tl::unexpected( *busy );
243 if( !documentValidation )
244 return tl::unexpected( documentValidation.error() );
265 return std::make_unique<BOARD_COMMIT>(
frame() );
282 if( aDocument.type() != DocumentType::DOCTYPE_PCB )
285 wxFileName fn(
frame()->GetCurrentFileName() );
286 return 0 == aDocument.board_filename().compare( fn.GetFullName() );
296 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
297 e.set_error_message(
"Tried to create an item in a null container" );
298 return tl::unexpected( e );
304 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
305 e.set_error_message( fmt::format(
"Tried to create a pad in {}, which is not a footprint",
307 return tl::unexpected( e );
312 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
313 e.set_error_message( fmt::format(
"Tried to create a footprint in {}, which is not a board",
315 return tl::unexpected( e );
323 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
324 e.set_error_message( fmt::format(
"Tried to create an item of type {}, which is unhandled",
325 magic_enum::enum_name( aType ) ) );
326 return tl::unexpected( e );
334 const std::string& aClientName,
335 const types::ItemHeader &aHeader,
336 const google::protobuf::RepeatedPtrField<google::protobuf::Any>& aItems,
337 std::function<
void( ItemStatus, google::protobuf::Any )> aItemHandler )
343 if( !containerResult && containerResult.error().status() == ApiStatusCode::AS_UNHANDLED )
346 e.set_status( ApiStatusCode::AS_UNHANDLED );
347 return tl::unexpected( e );
349 else if( !containerResult )
351 e.CopyFrom( containerResult.error() );
352 return tl::unexpected( e );
358 if( containerResult->has_value() )
360 const KIID& containerId = **containerResult;
361 std::optional<BOARD_ITEM*> optItem =
getItemById( containerId );
369 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
370 e.set_error_message( fmt::format(
371 "The requested container {} is not a valid board item container",
373 return tl::unexpected( e );
378 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
379 e.set_error_message( fmt::format(
380 "The requested container {} does not exist in this document",
382 return tl::unexpected( e );
388 for(
const google::protobuf::Any& anyItem : aItems )
395 status.set_code( ItemStatusCode::ISC_INVALID_TYPE );
396 status.set_error_message( fmt::format(
"Could not decode a valid type from {}",
397 anyItem.type_url() ) );
398 aItemHandler( status, anyItem );
404 board::types::Dimension dimension;
405 anyItem.UnpackTo( &dimension );
407 switch( dimension.dimension_style_case() )
414 case board::types::Dimension::DIMENSION_STYLE_NOT_SET:
break;
421 if( !creationResult )
423 status.set_code( ItemStatusCode::ISC_INVALID_TYPE );
424 status.set_error_message( creationResult.error().error_message() );
425 aItemHandler( status, anyItem );
429 std::unique_ptr<BOARD_ITEM> item( std::move( *creationResult ) );
431 if( !item->Deserialize( anyItem ) )
433 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
434 e.set_error_message( fmt::format(
"could not unpack {} from request",
435 item->GetClass().ToStdString() ) );
436 return tl::unexpected( e );
439 std::optional<BOARD_ITEM*> optItem =
getItemById( item->m_Uuid );
441 if( aCreate && optItem )
443 status.set_code( ItemStatusCode::ISC_EXISTING );
444 status.set_error_message( fmt::format(
"an item with UUID {} already exists",
445 item->m_Uuid.AsStdString() ) );
446 aItemHandler( status, anyItem );
449 else if( !aCreate && !optItem )
451 status.set_code( ItemStatusCode::ISC_NONEXISTENT );
452 status.set_error_message( fmt::format(
"an item with UUID {} does not exist",
453 item->m_Uuid.AsStdString() ) );
454 aItemHandler( status, anyItem );
460 status.set_code( ItemStatusCode::ISC_INVALID_DATA );
461 status.set_error_message(
462 "attempted to add item with no overlapping layers with the board" );
463 aItemHandler( status, anyItem );
467 status.set_code( ItemStatusCode::ISC_OK );
468 google::protobuf::Any newItem;
472 item->Serialize( newItem );
473 commit->
Add( item.release() );
478 commit->
Modify( boardItem );
483 aItemHandler( status, newItem );
489 :
_(
"Added items via API" ) );
493 return ItemRequestStatus::IRS_OK;
500 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
501 return tl::unexpected( *busy );
507 e.set_status( ApiStatusCode::AS_UNHANDLED );
508 return tl::unexpected( e );
511 GetItemsResponse response;
514 std::vector<BOARD_ITEM*> items;
515 std::set<KICAD_T> typesRequested, typesInserted;
516 bool handledAnything =
false;
518 for(
int typeRaw : aCtx.
Request.types() )
520 auto typeMessage =
static_cast<common::types::KiCadObjectType
>( typeRaw );
521 KICAD_T type = FromProtoEnum<KICAD_T>( typeMessage );
526 typesRequested.emplace( type );
528 if( typesInserted.count( type ) )
536 handledAnything =
true;
537 std::copy( board->
Tracks().begin(), board->
Tracks().end(),
538 std::back_inserter( items ) );
544 handledAnything =
true;
548 std::copy( fp->Pads().begin(), fp->Pads().end(),
549 std::back_inserter( items ) );
558 handledAnything =
true;
561 std::back_inserter( items ) );
571 handledAnything =
true;
572 bool inserted =
false;
576 if( item->Type() == type )
578 items.emplace_back( item );
591 handledAnything =
true;
593 std::copy( board->
Zones().begin(), board->
Zones().end(),
594 std::back_inserter( items ) );
605 if( !handledAnything )
608 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
609 e.set_error_message(
"none of the requested types are valid for a Board object" );
610 return tl::unexpected( e );
615 if( !typesRequested.count( item->Type() ) )
618 google::protobuf::Any itemBuf;
619 item->Serialize( itemBuf );
620 response.mutable_items()->Add( std::move( itemBuf ) );
623 response.set_status( ItemRequestStatus::IRS_OK );
629 const std::string& aClientName )
632 std::vector<BOARD_ITEM*> validatedItems;
634 for( std::pair<const KIID, ItemDeletionStatus> pair : aItemsToDelete )
638 validatedItems.push_back( item );
639 aItemsToDelete[pair.first] = ItemDeletionStatus::IDS_OK;
669 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
670 return tl::unexpected( *busy );
676 e.set_status( ApiStatusCode::AS_UNHANDLED );
677 return tl::unexpected( e );
682 for(
int typeRaw : aCtx.
Request.types() )
684 auto typeMessage =
static_cast<types::KiCadObjectType
>( typeRaw );
685 KICAD_T type = FromProtoEnum<KICAD_T>( typeMessage );
696 SelectionResponse response;
701 item->Serialize( *response.add_items() );
711 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
712 return tl::unexpected( *busy );
718 e.set_status( ApiStatusCode::AS_UNHANDLED );
719 return tl::unexpected( e );
732 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
733 return tl::unexpected( *busy );
739 e.set_status( ApiStatusCode::AS_UNHANDLED );
740 return tl::unexpected( e );
746 std::vector<EDA_ITEM*> toAdd;
748 for(
const types::KIID&
id : aCtx.
Request.items() )
750 if( std::optional<BOARD_ITEM*> item =
getItemById(
KIID(
id.value() ) ) )
751 toAdd.emplace_back( *item );
756 SelectionResponse response;
759 item->Serialize( *response.add_items() );
768 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
769 return tl::unexpected( *busy );
775 e.set_status( ApiStatusCode::AS_UNHANDLED );
776 return tl::unexpected( e );
782 std::vector<EDA_ITEM*> toRemove;
784 for(
const types::KIID&
id : aCtx.
Request.items() )
786 if( std::optional<BOARD_ITEM*> item =
getItemById(
KIID(
id.value() ) ) )
787 toRemove.emplace_back( *item );
792 SelectionResponse response;
795 item->Serialize( *response.add_items() );
804 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
805 return tl::unexpected( *busy );
809 if( !documentValidation )
810 return tl::unexpected( documentValidation.error() );
812 BoardStackupResponse response;
813 google::protobuf::Any any;
817 any.UnpackTo( response.mutable_stackup() );
820 for( board::BoardStackupLayer& layer : *response.mutable_stackup()->mutable_layers() )
822 if( layer.type() == board::BoardStackupLayerType::BSLT_DIELECTRIC )
825 PCB_LAYER_ID id = FromProtoEnum<PCB_LAYER_ID>( layer.layer() );
828 layer.set_user_name(
frame()->
GetBoard()->GetLayerName(
id ) );
838 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
839 return tl::unexpected( *busy );
843 if( !documentValidation )
844 return tl::unexpected( documentValidation.error() );
847 GraphicsDefaultsResponse response;
850 constexpr std::array<kiapi::board::BoardLayerClass, LAYER_CLASS_COUNT> classOrder = {
851 kiapi::board::BLC_SILKSCREEN,
852 kiapi::board::BLC_COPPER,
853 kiapi::board::BLC_EDGES,
854 kiapi::board::BLC_COURTYARD,
855 kiapi::board::BLC_FABRICATION,
856 kiapi::board::BLC_OTHER
861 kiapi::board::BoardLayerGraphicsDefaults* l = response.mutable_defaults()->add_layers();
863 l->set_layer( classOrder[i] );
866 kiapi::common::types::TextAttributes*
text = l->mutable_text();
881 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
882 return tl::unexpected( *busy );
888 e.set_status( ApiStatusCode::AS_UNHANDLED );
889 return tl::unexpected( e );
892 GetBoundingBoxResponse response;
893 bool includeText = aCtx.
Request.mode() == BoundingBoxMode::BBM_ITEM_AND_CHILD_TEXT;
895 for(
const types::KIID& idMsg : aCtx.
Request.items() )
897 KIID id( idMsg.value() );
898 std::optional<BOARD_ITEM*> optItem =
getItemById(
id );
907 bbox =
static_cast<FOOTPRINT*
>( item )->GetBoundingBox( includeText );
911 response.add_items()->set_value( idMsg.value() );
912 PackBox2( *response.add_boxes(), bbox );
924 if( !documentValidation )
925 return tl::unexpected( documentValidation.error() );
927 PadShapeAsPolygonResponse response;
928 PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( aCtx.
Request.layer() );
930 for(
const types::KIID& padRequest : aCtx.
Request.pads() )
932 KIID id( padRequest.value() );
933 std::optional<BOARD_ITEM*> optPad =
getItemById(
id );
935 if( !optPad || ( *optPad )->Type() !=
PCB_PAD_T )
938 response.add_pads()->set_value( padRequest.value() );
942 pad->TransformShapeToPolygon( poly,
pad->Padstack().EffectiveLayerFor( layer ), 0,
945 types::PolygonWithHoles* polyMsg = response.mutable_polygons()->Add();
958 if( !documentValidation )
959 return tl::unexpected( documentValidation.error() );
964 types::TitleBlockInfo response;
966 response.set_title( block.
GetTitle().ToUTF8() );
967 response.set_date( block.
GetDate().ToUTF8() );
968 response.set_revision( block.
GetRevision().ToUTF8() );
969 response.set_company( block.
GetCompany().ToUTF8() );
970 response.set_comment1( block.
GetComment( 0 ).ToUTF8() );
971 response.set_comment2( block.
GetComment( 1 ).ToUTF8() );
972 response.set_comment3( block.
GetComment( 2 ).ToUTF8() );
973 response.set_comment4( block.
GetComment( 3 ).ToUTF8() );
974 response.set_comment5( block.
GetComment( 4 ).ToUTF8() );
975 response.set_comment6( block.
GetComment( 5 ).ToUTF8() );
976 response.set_comment7( block.
GetComment( 6 ).ToUTF8() );
977 response.set_comment8( block.
GetComment( 7 ).ToUTF8() );
978 response.set_comment9( block.
GetComment( 8 ).ToUTF8() );
989 if( !documentValidation )
990 return tl::unexpected( documentValidation.error() );
992 ExpandTextVariablesResponse reply;
995 std::function<bool( wxString* )> textResolver =
996 [&]( wxString* token ) ->
bool
1002 for(
const std::string& textMsg : aCtx.
Request.text() )
1005 reply.add_text(
text.ToUTF8() );
1015 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1016 return tl::unexpected( *busy );
1020 if( !documentValidation )
1021 return tl::unexpected( documentValidation.error() );
1024 std::vector<EDA_ITEM*> toSelect;
1026 for(
const kiapi::common::types::KIID&
id : aCtx.
Request.items() )
1028 if( std::optional<BOARD_ITEM*> item =
getItemById(
KIID(
id.value() ) ) )
1029 toSelect.emplace_back(
static_cast<EDA_ITEM*
>( *item ) );
1032 if( toSelect.empty() )
1034 ApiResponseStatus e;
1035 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
1036 e.set_error_message( fmt::format(
"None of the given items exist on the board",
1037 aCtx.
Request.board().board_filename() ) );
1038 return tl::unexpected( e );
1056 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1057 return tl::unexpected( *busy );
1061 if( !documentValidation )
1062 return tl::unexpected( documentValidation.error() );
1064 NetsResponse response;
1067 std::set<wxString> netclassFilter;
1069 for(
const std::string& nc : aCtx.
Request.netclass_filter() )
1070 netclassFilter.insert( wxString( nc.c_str(), wxConvUTF8 ) );
1076 if( !netclassFilter.empty() && nc && !netclassFilter.count( nc->
GetName() ) )
1079 board::types::Net* netProto = response.add_nets();
1080 netProto->set_name( net->GetNetname() );
1081 netProto->mutable_code()->set_value( net->GetNetCode() );
1091 NetClassForNetsResponse response;
1095 google::protobuf::Any any;
1097 for(
const board::types::Net& net : aCtx.
Request.net() )
1105 auto [pair, rc] = response.mutable_classes()->insert( { net.name(), {} } );
1106 any.UnpackTo( &pair->second );
1115 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1116 return tl::unexpected( *busy );
1120 if( !documentValidation )
1121 return tl::unexpected( documentValidation.error() );
1123 if( aCtx.
Request.zones().empty() )
1126 frame()->CallAfter( [mgr]()
1134 ApiResponseStatus e;
1135 e.set_status( ApiStatusCode::AS_UNIMPLEMENTED );
1136 return tl::unexpected( e );
1148 if( !documentValidation )
1149 return tl::unexpected( documentValidation.error() );
1151 SavedDocumentResponse response;
1152 response.mutable_document()->CopyFrom( aCtx.
Request.document() );
1156 [&](
const wxString& aData )
1158 response.set_contents( aData.ToUTF8() );
1170 SavedSelectionResponse response;
1178 [&](
const wxString& aData )
1180 response.set_contents( aData.ToUTF8() );
1193 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1194 return tl::unexpected( *busy );
1198 if( !documentValidation )
1199 return tl::unexpected( documentValidation.error() );
1201 CreateItemsResponse response;
1211 if( !documentValidation )
1212 return tl::unexpected( documentValidation.error() );
1214 BoardLayers response;
1217 response.add_layers( ToProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( layer ) );
1226 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1227 return tl::unexpected( *busy );
1231 if( !documentValidation )
1232 return tl::unexpected( documentValidation.error() );
1237 for(
int layerIdx : aCtx.
Request.layers() )
1240 FromProtoEnum<PCB_LAYER_ID>(
static_cast<board::types::BoardLayer
>( layerIdx ) );
1243 visible.
set( layer );
1259 if( !documentValidation )
1260 return tl::unexpected( documentValidation.error() );
1262 BoardLayerResponse response;
1264 ToProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>(
frame()->GetActiveLayer() ) );
1273 if( std::optional<ApiResponseStatus> busy =
checkForBusy() )
1274 return tl::unexpected( *busy );
1278 if( !documentValidation )
1279 return tl::unexpected( documentValidation.error() );
1283 if( !
frame()->
GetBoard()->GetEnabledLayers().Contains( layer ) )
1285 ApiResponseStatus err;
1286 err.set_status( ApiStatusCode::AS_BAD_REQUEST );
1287 err.set_error_message( fmt::format(
"Layer {} is not a valid layer for the given board",
1288 magic_enum::enum_name( layer ) ) );
1289 return tl::unexpected( err );
1300 BoardEditorAppearanceSettings reply;
1306 reply.set_inactive_layer_display( ToProtoEnum<HIGH_CONTRAST_MODE, InactiveLayerDisplayMode>(
1308 reply.set_net_color_display(
1309 ToProtoEnum<NET_COLOR_MODE, NetColorDisplayMode>( displayOptions.
m_NetColorMode ) );
1311 reply.set_board_flip(
frame()->GetCanvas()->GetView()->IsMirroredX()
1312 ? BoardFlipMode::BFM_FLIPPED_X
1313 : BoardFlipMode::BFM_NORMAL );
1317 reply.set_ratsnest_display( ToProtoEnum<RATSNEST_MODE, RatsnestDisplayMode>(
1330 const BoardEditorAppearanceSettings& newSettings = aCtx.
Request.settings();
1333 FromProtoEnum<HIGH_CONTRAST_MODE>( newSettings.inactive_layer_display() );
1335 FromProtoEnum<NET_COLOR_MODE>( newSettings.net_color_display() );
1337 bool flip = newSettings.board_flip() == BoardFlipMode::BFM_FLIPPED_X;
1346 FromProtoEnum<RATSNEST_MODE>( newSettings.ratsnest_display() );
tl::expected< T, ApiResponseStatus > HANDLER_RESULT
std::unique_ptr< EDA_ITEM > CreateItemForType(KICAD_T aType, EDA_ITEM *aContainer)
constexpr int ARC_HIGH_DEF
Base class for API handlers related to editor frames.
HANDLER_RESULT< bool > validateDocument(const DocumentSpecifier &aDocument)
HANDLER_RESULT< std::optional< KIID > > validateItemHeaderDocument(const kiapi::common::types::ItemHeader &aHeader)
If the header is valid, returns the item container.
COMMIT * getCurrentCommit(const std::string &aClientName)
virtual void pushCurrentCommit(const std::string &aClientName, const wxString &aMessage)
std::set< std::string > m_activeClients
virtual std::optional< ApiResponseStatus > checkForBusy()
Checks if the editor can accept commands.
HANDLER_RESULT< commands::SelectionResponse > handleAddToSelection(const HANDLER_CONTEXT< commands::AddToSelection > &aCtx)
HANDLER_RESULT< commands::CreateItemsResponse > handleParseAndCreateItemsFromString(const HANDLER_CONTEXT< commands::ParseAndCreateItemsFromString > &aCtx)
HANDLER_RESULT< Empty > handleInteractiveMoveItems(const HANDLER_CONTEXT< InteractiveMoveItems > &aCtx)
bool validateDocumentInternal(const DocumentSpecifier &aDocument) const override
HANDLER_RESULT< Empty > handleSetActiveLayer(const HANDLER_CONTEXT< SetActiveLayer > &aCtx)
API_HANDLER_PCB(PCB_EDIT_FRAME *aFrame)
static HANDLER_RESULT< std::unique_ptr< BOARD_ITEM > > createItemForType(KICAD_T aType, BOARD_ITEM_CONTAINER *aContainer)
std::optional< BOARD_ITEM * > getItemById(const KIID &aId) const
std::unique_ptr< COMMIT > createCommit() override
Override this to create an appropriate COMMIT subclass for the frame in question.
HANDLER_RESULT< BoardStackupResponse > handleGetStackup(const HANDLER_CONTEXT< GetBoardStackup > &aCtx)
HANDLER_RESULT< types::TitleBlockInfo > handleGetTitleBlockInfo(const HANDLER_CONTEXT< commands::GetTitleBlockInfo > &aCtx)
HANDLER_RESULT< commands::SelectionResponse > handleGetSelection(const HANDLER_CONTEXT< commands::GetSelection > &aCtx)
HANDLER_RESULT< NetClassForNetsResponse > handleGetNetClassForNets(const HANDLER_CONTEXT< GetNetClassForNets > &aCtx)
std::optional< EDA_ITEM * > getItemFromDocument(const DocumentSpecifier &aDocument, const KIID &aId) override
HANDLER_RESULT< commands::ExpandTextVariablesResponse > handleExpandTextVariables(const HANDLER_CONTEXT< commands::ExpandTextVariables > &aCtx)
HANDLER_RESULT< Empty > handleSetVisibleLayers(const HANDLER_CONTEXT< SetVisibleLayers > &aCtx)
HANDLER_RESULT< Empty > handleSaveCopyOfDocument(const HANDLER_CONTEXT< commands::SaveCopyOfDocument > &aCtx)
HANDLER_RESULT< GraphicsDefaultsResponse > handleGetGraphicsDefaults(const HANDLER_CONTEXT< GetGraphicsDefaults > &aCtx)
HANDLER_RESULT< Empty > handleClearSelection(const HANDLER_CONTEXT< commands::ClearSelection > &aCtx)
HANDLER_RESULT< commands::RunActionResponse > handleRunAction(const HANDLER_CONTEXT< commands::RunAction > &aCtx)
HANDLER_RESULT< BoardLayers > handleGetVisibleLayers(const HANDLER_CONTEXT< GetVisibleLayers > &aCtx)
HANDLER_RESULT< commands::SelectionResponse > handleRemoveFromSelection(const HANDLER_CONTEXT< commands::RemoveFromSelection > &aCtx)
HANDLER_RESULT< commands::GetOpenDocumentsResponse > handleGetOpenDocuments(const HANDLER_CONTEXT< commands::GetOpenDocuments > &aCtx)
HANDLER_RESULT< BoardEditorAppearanceSettings > handleGetBoardEditorAppearanceSettings(const HANDLER_CONTEXT< GetBoardEditorAppearanceSettings > &aCtx)
HANDLER_RESULT< NetsResponse > handleGetNets(const HANDLER_CONTEXT< GetNets > &aCtx)
HANDLER_RESULT< commands::SavedDocumentResponse > handleSaveDocumentToString(const HANDLER_CONTEXT< commands::SaveDocumentToString > &aCtx)
HANDLER_RESULT< commands::GetBoundingBoxResponse > handleGetBoundingBox(const HANDLER_CONTEXT< commands::GetBoundingBox > &aCtx)
HANDLER_RESULT< Empty > handleSaveDocument(const HANDLER_CONTEXT< commands::SaveDocument > &aCtx)
void deleteItemsInternal(std::map< KIID, ItemDeletionStatus > &aItemsToDelete, const std::string &aClientName) override
HANDLER_RESULT< commands::GetItemsResponse > handleGetItems(const HANDLER_CONTEXT< commands::GetItems > &aCtx)
HANDLER_RESULT< PadShapeAsPolygonResponse > handleGetPadShapeAsPolygon(const HANDLER_CONTEXT< GetPadShapeAsPolygon > &aCtx)
PCB_EDIT_FRAME * frame() const
HANDLER_RESULT< Empty > handleSetBoardEditorAppearanceSettings(const HANDLER_CONTEXT< SetBoardEditorAppearanceSettings > &aCtx)
HANDLER_RESULT< Empty > handleRefillZones(const HANDLER_CONTEXT< RefillZones > &aCtx)
HANDLER_RESULT< types::ItemRequestStatus > handleCreateUpdateItemsInternal(bool aCreate, const std::string &aClientName, const types::ItemHeader &aHeader, const google::protobuf::RepeatedPtrField< google::protobuf::Any > &aItems, std::function< void(commands::ItemStatus, google::protobuf::Any)> aItemHandler) override
HANDLER_RESULT< BoardLayerResponse > handleGetActiveLayer(const HANDLER_CONTEXT< GetActiveLayer > &aCtx)
HANDLER_RESULT< Empty > handleRevertDocument(const HANDLER_CONTEXT< commands::RevertDocument > &aCtx)
HANDLER_RESULT< commands::SavedSelectionResponse > handleSaveSelectionToString(const HANDLER_CONTEXT< commands::SaveSelectionToString > &aCtx)
void pushCurrentCommit(const std::string &aClientName, const wxString &aMessage) override
void SetContentModified(bool aModified=true)
BASE_SET & set(size_t pos)
Container for design settings for a BOARD object.
bool m_TextUpright[LAYER_CLASS_COUNT]
int m_TextThickness[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Information pertinent to a Pcbnew printed circuit board.
BOARD_STACKUP GetStackupOrDefault() const
const NETINFO_LIST & GetNetInfo() const
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
BOARD_ITEM * GetItem(const KIID &aID) const
const ZONES & Zones() const
bool ResolveTextVar(wxString *token, int aDepth) const
TITLE_BLOCK & GetTitleBlock()
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
void SetVisibleLayers(LSET aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings changes the bit-mask of vis...
const wxString & GetFileName() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const DRAWINGS & Drawings() const
void SaveSelection(const PCB_SELECTION &selected, bool isFootprintEditor)
void SetWriter(std::function< void(const wxString &)> aWriter)
void SaveBoard(const wxString &aFileName, BOARD *aBoard, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Write aBoard to a storage file in a format that this PCB_IO implementation knows about or it can be u...
void SetBoard(BOARD *aBoard)
Represent a set of changes (additions, deletions or modifications) of a data model (e....
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
static DELETED_BOARD_ITEM * GetInstance()
void ReleaseFile()
Release the current file marked in use.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
KICAD_T Type() const
Returns the type of object.
virtual wxString GetFriendlyName() const
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
void UpdateAllLayersColor()
Apply the new coloring scheme to all layers.
bool IsMirroredX() const
Return true if view is flipped across the X axis.
void RecacheAllItems()
Rebuild GAL display lists.
bool IsMirroredY() const
Return true if view is flipped across the Y axis.
std::string AsStdString() const
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
LSET is a set of PCB_LAYER_IDs.
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
A collection of nets and the parameters used to route or test these nets.
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Handle the data for a net.
Container for NETINFO_ITEM elements, which are the nets.
NETINFO_ITEM * GetNetItem(int aNetCode) const
DISPLAY_OPTIONS m_Display
static TOOL_ACTION zoneFillAll
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION move
move or drag an item
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
APPEARANCE_CONTROLS * GetAppearancePanel()
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void SetDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions, bool aRefresh=true)
Update the current display options.
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
NET_COLOR_MODE m_NetColorMode
How to use color overrides on specific nets and netclasses.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
The main frame for Pcbnew.
void SetActiveLayer(PCB_LAYER_ID aLayer) override
Change the currently active layer to aLayer and also update the APPEARANCE_CONTROLS.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Load a KiCad board (.kicad_pcb) from aFileName.
bool SavePcbCopy(const wxString &aFileName, bool aCreateProject=false, bool aHeadless=false)
Write the board data structures to aFileName.
bool Files_io_from_id(int aId)
Read and write board files according to aId.
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
void SetReferencePoint(const VECTOR2I &aP)
virtual void Serialize(google::protobuf::Any &aContainer) const
Serializes this object to the given Any message.
Represent a set of closed polygons.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Hold the information shown in the lower right corner of a plot, printout, or editing view.
const wxString & GetCompany() const
const wxString & GetRevision() const
const wxString & GetDate() const
const wxString & GetComment(int aIdx) const
const wxString & GetTitle() const
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
static const std::string KiCadPcbFileExtension
#define KICTL_REVERT
reverting to a previously-saved (KiCad) file.
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API void PackBox2(types::Box2 &aOutput, const BOX2I &aInput)
KICOMMON_API std::optional< KICAD_T > TypeNameFromAny(const google::protobuf::Any &aMessage)
KICOMMON_API void PackPolyLine(types::PolyLine &aOutput, const SHAPE_LINE_CHAIN &aSlc)
Class to handle a set of BOARD_ITEMs.
RequestMessageType Request
RATSNEST_MODE m_RatsnestMode
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension