<?xml encoding=”UTF-8″>By Madhukar
Moogala
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 Reactorn"));
}
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"));
}

Leave a Reply