90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "MCPHandler.h"
|
|
#include "MCPAssetFinder.h"
|
|
#include "MCPUtils.h"
|
|
#include "Engine/Blueprint.h"
|
|
#include "EdGraph/EdGraph.h"
|
|
#include "EdGraph/EdGraphNode.h"
|
|
#include "EdGraph/EdGraphPin.h"
|
|
#include "Kismet2/BlueprintEditorUtils.h"
|
|
#include "Blueprint_RefreshAllNodes.generated.h"
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
|
|
UCLASS()
|
|
class UMCP_Blueprint_RefreshAllNodes : public UObject, public IMCPHandler
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
UPROPERTY(meta=(Description="Blueprint name or package path"))
|
|
FString Blueprint;
|
|
|
|
virtual FString GetDescription() const override
|
|
{
|
|
return TEXT("Refresh all nodes in a Blueprint, removing orphaned pins. "
|
|
"Reports compiler warnings and errors.");
|
|
}
|
|
|
|
virtual void Handle(const FJsonObject* Json, FStringBuilderBase& Result) override
|
|
{
|
|
// Load Blueprint
|
|
MCPAssets<UBlueprint> Assets;
|
|
if (!Assets.Exact(Blueprint).Errors(Result).ENone().ETwo().Load()) return;
|
|
UBlueprint* BP = Assets.Object();
|
|
|
|
int32 GraphCount = MCPUtils::AllGraphs(BP).Num();
|
|
int32 NodeCount = MCPUtils::AllNodes(BP).Num();
|
|
|
|
// Refresh all nodes
|
|
FBlueprintEditorUtils::RefreshAllNodes(BP);
|
|
|
|
// Remove orphaned pins from all nodes
|
|
int32 OrphanedPinsRemoved = 0;
|
|
for (UEdGraphNode* Node : MCPUtils::AllNodes(BP))
|
|
{
|
|
for (int32 i = Node->Pins.Num() - 1; i >= 0; --i)
|
|
{
|
|
UEdGraphPin* Pin = Node->Pins[i];
|
|
if (Pin && Pin->bOrphanedPin)
|
|
{
|
|
Pin->BreakAllPinLinks();
|
|
Node->Pins.RemoveAt(i);
|
|
OrphanedPinsRemoved++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mark as modified and recompile after orphan removal
|
|
FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(BP);
|
|
|
|
// Summary
|
|
Result.Appendf(TEXT("Refreshed %s: %d graphs, %d nodes"), *MCPUtils::FormatName(BP), GraphCount, NodeCount);
|
|
if (OrphanedPinsRemoved > 0)
|
|
{
|
|
Result.Appendf(TEXT(", %d orphaned pins removed"), OrphanedPinsRemoved);
|
|
}
|
|
Result.Append(TEXT("\n"));
|
|
|
|
// Collect compiler warnings and errors
|
|
if (BP->Status == BS_Error)
|
|
{
|
|
Result.Append(TEXT("ERROR: Blueprint has compiler errors after refresh\n"));
|
|
}
|
|
|
|
for (UEdGraphNode* Node : MCPUtils::AllNodes(BP))
|
|
{
|
|
if (!Node->bHasCompilerMessage) continue;
|
|
const TCHAR* Prefix = (Node->ErrorType == EMessageSeverity::Error) ? TEXT("ERROR") : TEXT("WARNING");
|
|
Result.Appendf(TEXT("%s: [%s] %s: %s\n"),
|
|
Prefix, *MCPUtils::FormatName(Node->GetGraph()),
|
|
*MCPUtils::FormatName(Node), *Node->ErrorMsg);
|
|
}
|
|
}
|
|
};
|