Files
UnrealEngine/Engine/Source/Programs/Enterprise/Datasmith/DatasmithARCHICADExporter/Private/ElementEvent.cpp
2025-05-18 13:04:45 +08:00

157 lines
5.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ElementEvent.h"
#include "Utils/ElementTools.h"
#include "Utils/TAssValueName.h"
#include "Synchronizer.h"
#include "Commander.h"
BEGIN_NAMESPACE_UE_AC
template <>
FAssValueName::SAssValueName TAssEnumName< API_ElementDBEventID >::AssEnumName[] = {
ValueName(APINotifyElement_BeginEvents),
ValueName(APINotifyElement_EndEvents),
ValueName(APINotifyElement_New),
ValueName(APINotifyElement_Copy),
ValueName(APINotifyElement_Change),
ValueName(APINotifyElement_Edit),
ValueName(APINotifyElement_Delete),
ValueName(APINotifyElement_Undo_Created),
ValueName(APINotifyElement_Undo_Modified),
ValueName(APINotifyElement_Undo_Deleted),
ValueName(APINotifyElement_Redo_Created),
ValueName(APINotifyElement_Redo_Modified),
ValueName(APINotifyElement_Redo_Deleted),
ValueName(APINotifyElement_PropertyValueChange),
EnumEnd(-1)};
static GSErrCode ElementEventCB(const API_NotifyElementType* ElemType)
{
try
{
return FElementEvent::Event(*ElemType);
}
catch (std::exception& e)
{
UE_AC_DebugF("ElementEventCB - Exception \"%s\"\n", e.what());
return APIERR_NOTSUPPORTED;
}
catch (...)
{
UE_AC_DebugF("ElementEventCB - Unknown exception\n");
return APIERR_NOTSUPPORTED;
}
}
GSErrCode FElementEvent::Initialize()
{
GSErrCode GSErr = ACAPI_Notify_CatchNewElement(nullptr, ElementEventCB);
if (GSErr != NoError)
{
UE_AC_DebugF("FElementEvent::Initialize - ACAPI_Notify_CatchNewElement error=%s\n", GetErrorName(GSErr));
}
GSErr = ACAPI_Notify_InstallElementObserver(ElementEventCB);
if (GSErr != NoError)
{
UE_AC_DebugF("FElementEvent::Initialize - ACAPI_Notify_InstallElementObserver error=%s\n", GetErrorName(GSErr));
}
return GSErr;
}
GSErrCode FElementEvent::Event(const API_NotifyElementType& ElemType)
{
UE_AC_TraceF("-> FElementEvent::Event(%s)\n", TAssEnumName< API_ElementDBEventID >::GetName(ElemType.notifID));
GS::UniString ElemTypeName;
#if AC_VERSION < 26
if (ACAPI_Goodies(APIAny_GetElemTypeNameID, (void*)(size_t)ElemType.elemHead.typeID, &ElemTypeName) != NoError)
{
ElemTypeName = GS::UniString::Printf("ElementType=%d", ElemType.elemHead.typeID);
}
#else
const API_ElemTypeID ElemTypeID = ElemType.elemHead.type.typeID;
if (API_FirstElemType <= ElemTypeID && ElemTypeID <= API_LastElemType)
{
ElemTypeName = GS::UniString::Printf("ElementType=%s", FElementTools::TypeName(ElemTypeID));
}
else
{
ElemTypeName = GS::UniString::Printf("ElementType=%d", ElemTypeID);
}
#endif
GS::UniString ElemUUID(APIGuidToString(ElemType.elemHead.guid));
switch (ElemType.notifID)
{
case APINotifyElement_BeginEvents:
UE_AC_TraceF("Element event: Begin events for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_EndEvents:
UE_AC_TraceF("Element event: End events for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_New:
UE_AC_TraceF("Element event: New for %s, %s\n", ElemTypeName.ToCStr().Get(), ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Copy:
UE_AC_TraceF("Element event: Copy for %s, %s\n", ElemTypeName.ToCStr().Get(), ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Change:
UE_AC_TraceF("Element event: Change for %s, %s\n", ElemTypeName.ToCStr().Get(), ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Edit:
UE_AC_TraceF("Element event: Edit for %s, %s\n", ElemTypeName.ToCStr().Get(), ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Delete:
UE_AC_TraceF("Element event: Delete for %s, %s\n", ElemTypeName.ToCStr().Get(), ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Undo_Created:
UE_AC_TraceF("Element event: Undo_Created for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Undo_Modified:
UE_AC_TraceF("Element event: Undo_Modified for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Undo_Deleted:
UE_AC_TraceF("Element event: Undo_Deleted for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Redo_Created:
UE_AC_TraceF("Element event: Redo_Created for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Redo_Modified:
UE_AC_TraceF("Element event: Redo_Modified for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_Redo_Deleted:
UE_AC_TraceF("Element event: Redo_Deleted for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_PropertyValueChange:
UE_AC_TraceF("Element event: PropertyValueChange for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
case APINotifyElement_ClassificationChange:
UE_AC_TraceF("Element event: ClassificationChange for %s, %s\n", ElemTypeName.ToCStr().Get(),
ElemUUID.ToCStr().Get());
break;
}
if (FCommander::IsAutoSyncEnabled())
{
FSynchronizer::PostDoSnapshot("Element modified");
}
UE_AC_TraceF("<- FElementEvent::Event\n");
return NoError;
}
END_NAMESPACE_UE_AC