ADN Open CIS
Сообщество программистов Autodesk в СНГ

27/02/2019

Как проверить, что при редактировании XREF он сохранён или отвергнут

Когда пользователь редактирует внешнюю ссылку по месту, то невозможно определить сохранил ли он изменения или отверг их.

А что если вашей программе необходимо определиться сохранена ли внешняя ссылка или нет:

Код - C++: [Выделить]
  1. if (e.GlobalCommandName == "REFCLOSE")
  2. {
  3.   if (save){
  4.   // Сценарий 1
  5.   }
  6.   if (discard){
  7.   // Сценарий 2
  8.   }
  9. }

Здесь вы узнаете один из способов для определения того, сохранены ли изменения во внешней ссылке или они отвергнуты.

Код - C++: [Выделить]
  1. class XrefCheckEditor;
  2. XrefCheckEditor* xrefEd = nullptr;
  3. class XrefLongTranReactor;
  4. XrefLongTranReactor* xrefTransRctr = nullptr;
  5.  
  6. Acad::ErrorStatus getSysVar(const TCHAR* varName, TCHAR* val)
  7. {
  8.   resbuf rb;
  9.   if (acedGetVar(varName, &rb) == RTNORM) {
  10.     assert(rb.restype == RTSTR);
  11.     val = rb.resval.rstring;
  12.     free(rb.resval.rstring);
  13.     return(Acad::eOk);
  14.   }
  15.   else
  16.     return(Acad::eInvalidInput);
  17. }
  18.  
  19. namespace EditInPlaceXref {
  20.   enum EditInPlaceXrefState
  21.   {
  22.     Discarded,
  23.     Saved
  24.    
  25.   };
  26.   EditInPlaceXrefState XrefState;
  27.   EditInPlaceXrefState Reset() {
  28.     XrefState = Discarded;
  29.     return XrefState;
  30.   }
  31.  
  32. }
  33.  
  34. class XrefLongTranReactor : public AcApLongTransactionReactor {
  35.  
  36.   virtual void endCheckIn(AcDbLongTransaction& lt) {
  37.     if (lt.type() == AcDbLongTransaction::kXrefDb)
  38.     {
  39.       // Отлично! Изменения были сохранены.
  40.       EditInPlaceXref::XrefState = EditInPlaceXref::Saved;
  41.     }
  42.   }
  43.  
  44. };
  45. class XrefCheckEditor : public AcEditorReactor {
  46.  
  47.   virtual void commandEnded(const TCHAR* cmdStr) {
  48.     if (wcscmp(cmdStr, L"REFCLOSE") == 0)
  49.     {
  50.      
  51.       switch (EditInPlaceXref::XrefState)
  52.       {
  53.       case EditInPlaceXref::Saved:
  54.         acutPrintf(L"\n Изменения во внешней ссылке сохранены ");
  55.         EditInPlaceXref::Reset();
  56.         break;
  57.       case EditInPlaceXref::Discarded:
  58.         acutPrintf(L"\n Изменения во внешней ссылке отвергнуты ");
  59.         break;
  60.       default:
  61.         break;
  62.       }
  63.  
  64.     }
  65.   }
  66. };
  67.  
  68. void watch() {
  69.  
  70.   if (xrefEd == nullptr && xrefTransRctr == nullptr) {
  71.     xrefEd = new XrefCheckEditor();
  72.     xrefTransRctr = new XrefLongTranReactor();
  73.   }
  74.  
  75.   acedEditor->addReactor(xrefEd);
  76.   acapLongTransactionManager->addReactor(xrefTransRctr);
  77.  
  78. }
  79. void unWatch() {
  80.   acedEditor->removeReactor(xrefEd);
  81.   acapLongTransactionManager->removeReactor(xrefTransRctr);
  82.   if (xrefEd != nullptr) {
  83.     delete xrefEd;
  84.     xrefEd = nullptr;
  85.   }
  86.   if (xrefTransRctr != nullptr) {
  87.     delete xrefTransRctr;
  88.     xrefTransRctr = nullptr;
  89.   }
  90. }
  91.  
  92. void checkIfXrefSavedOrDiscarded()
  93. {
  94.   acutPrintf(_T("\nЭта функция проверяет сохранены или отвергнуты изменения
  95.          во внешней ссылке при редактировании её по месту"));
  96.   acutPrintf(_T("\nИзменения %s"),
  97.       EditInPlaceXref::XrefState ? _T("сохранены") : _T("Отвергнуты"));
  98. }

Источник: https://adndevblog.typepad.com/autocad/2019/02/how-to-check-if-xref-edit-in-placeis-saved-or-discarded.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 27.02.2019
Отредактировано 27.02.2019 в 16:30:46