When user edit external reference in place, there is no way to get to know if user had saved the changes or discarded.
If your application would like to capture the user intent, for example.
if (e.GlobalCommandName == /*MSG0*/"REFCLOSE") { if (save){ //logic 1 } if(discard){ //logic 2 } }
This post will show one way to find out, if Xref is saved or discarded
class XrefCheckEditor; XrefCheckEditor* xrefEd = nullptr; class XrefLongTranReactor; XrefLongTranReactor* xrefTransRctr = nullptr; Acad::ErrorStatus getSysVar(const TCHAR* varName, TCHAR* val) { resbuf rb; if (acedGetVar(varName, &rb) == RTNORM) { assert(rb.restype == RTSTR); val = rb.resval.rstring; free(rb.resval.rstring); return(Acad::eOk); } else return(Acad::eInvalidInput); } namespace EditInPlaceXref { enum EditInPlaceXrefState { Discarded, Saved }; EditInPlaceXrefState XrefState; EditInPlaceXrefState Reset() { XrefState = Discarded; return XrefState; } } class XrefLongTranReactor : public AcApLongTransactionReactor { virtual void endCheckIn(AcDbLongTransaction& lt) { if (lt.type() == AcDbLongTransaction::kXrefDb) { //We are good, changes have been Saved. EditInPlaceXref::XrefState = EditInPlaceXref::Saved; } } }; class XrefCheckEditor : public AcEditorReactor { virtual void commandEnded(const TCHAR* cmdStr) { if (wcscmp(cmdStr, L"REFCLOSE") == 0) { switch (EditInPlaceXref::XrefState) { case EditInPlaceXref::Saved: acutPrintf(L"\n Modifications To In External Reference Are Saved"); EditInPlaceXref::Reset(); break; case EditInPlaceXref::Discarded: acutPrintf(L"\n Modifications To In External Reference Are Discarded"); break; default: break; } } } }; void watch() { if (xrefEd == nullptr && xrefTransRctr == nullptr) { xrefEd = new XrefCheckEditor(); xrefTransRctr = new XrefLongTranReactor(); } acedEditor->addReactor(xrefEd); acapLongTransactionManager->addReactor(xrefTransRctr); } void unWatch() { acedEditor->removeReactor(xrefEd); acapLongTransactionManager->removeReactor(xrefTransRctr); if (xrefEd != nullptr) { delete xrefEd; xrefEd = nullptr; } if (xrefTransRctr != nullptr) { delete xrefTransRctr; xrefTransRctr = nullptr; } acutPrintf(_T("Watching Editor Reactor\n")); } void checkIfXrefSavedOrDiscarded() { acutPrintf(_T("\nThis function checks if changes made to edit-in place xref are saved or discarded")); acutPrintf(_T("\nModifications %s"), EditInPlaceXref::XrefState ? _T("Saved") : _T("Discarded")); }