Undo и AcGePoint2dArray

Автор Тема: Undo и AcGePoint2dArray  (Прочитано 9107 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Undo и AcGePoint2dArray
« : 24-12-2022, 08:40:39 »
Custom object(немного низменный пример Polysamp), содержащий AcGePoint2dArray mVertex,
при команде undo происходит увеличение точек в AcGePoint2dArray ( append), 
а не возвращение в предыдущее значение. Хотя при записи я использовал assertWriteEnabled();
 И в документации вроде написано что даже если вы планируете реализовать механизм applyPartialUndo
на первых этапах разработки можете полагаться на автоматическую отмену.
Может кто подскажет как  реализовать undo в этом случае?  ???
Вопрос 2 когда выполняется метод AsdkPoly::applyPartialUndo из документации? :(
(Или у меня тут что-то поломано с исходным кодом?) :-\
AutoCAD почему то игнорирует applyPartialUndo.

Код - C++ [Выбрать]
  1. Acad::ErrorStatus AkPret99::subTransformBy(const AcGeMatrix3d& xform)
  2. {    
  3.     if (mDragDataFlags & kCloneMeForDraggingCalled) {
  4.         mDragDataFlags |= kUseDragCache;
  5.         mDragPlaneNormal = mPlaneNormal;
  6.         mDragElevation = mElevation;
  7.         AcGeMatrix2d xform2d(xform.convertToLocal(mDragPlaneNormal,mDragElevation));
  8.         mDragCenter = mCenter;
  9.         mDragCenter.transformBy(xform2d);
  10.         mDragPlaneNormal.normalize();
  11.     } else {
  12.        
  13.         assertWriteEnabled();
  14.         AcGeMatrix2d xform2d(xform.convertToLocal(mPlaneNormal,mElevation));
  15.         mCenter.transformBy(xform2d);
  16.                 for(int i=0;i<mVertex.length();i++)     mVertex.at(i)=mVertex.at(i).transformBy(xform2d);
  17.  
  18.         mPlaneNormal.normalize();
  19.     }
  20.     return Acad::eOk;
  21. }


 ((-1 . <Entity name: 7ff4a9e0d1e0>) (0 . "AKPRET99") (330 . <Entity name: 7ff4a9e03980>) (5 . "2EFE") (100 . "AcDbEntity")
(67 . 0) (410 . "Model") (8 . "0") (48 . 100.0) (100 . "AkPret99") (90 . 1) (10 7051.0 7788.5 0.0)
(90 . 2) (210 0.0 0.0 1.0) (1 . "test") (340 . <Entity name: 7ff4a9e072a0>) (40 . 0.0)
(12 6397.0 7237.0 0.0) (12 7705.0 8340.0 0.0))


после undo

(-1 . <Entity name: 7ff4a9e0d1f0>) (0 . "AKPRET99") (330 . <Entity name: 7ff4a9e03980>) (5 . "2EFF") (100 . "AcDbEntity")
(67 . 0) (410 . "Model") (8 . "0") (48 . 100.0) (100 . "AkPret99") (90 . 1) (10 8517.0 7788.5 0.0)
(90 . 4) (210 0.0 0.0 1.0) (1 . "test") (340 . <Entity name: 7ff4a9e072a0>)
(40 . 0.0)
(12 9102.0 7237.0 0.0) (12 10410.0 8340.0 0.0) (12 7863.0 7237.0 0.0) (12 9171.0 8340.0 0.0))



« Последнее редактирование: 26-12-2022, 10:47:09 от alex-63 »

Отмечено как Решение Александр Ривилис 27-12-2022, 19:26:48

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Undo и AcGePoint2dArray
« Ответ #1 : 26-12-2022, 21:38:59 »
Проверь корректность работы этих методов:
Код - C++ [Выбрать]
  1. virtual Acad::ErrorStatus
  2. dwgInFields(AcDbDwgFiler* filer);
  3.  
  4. virtual Acad::ErrorStatus
  5. dwgOutFields(AcDbDwgFiler* filer) const;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн alex-63Автор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Re: Undo и AcGePoint2dArray
« Ответ #2 : 27-12-2022, 09:02:34 »
Точно в dwgInFields была ошибка.
Необходимо было добавить mVertex.removeAll()

 
Код - C++ [Выбрать]
  1. mVertex.removeAll();
  2.          for(int i=0;i<len;i++)  
  3.            {AcGePoint2d pt;
  4.                  pFiler->readPoint2d(&pt);                       
  5.                  mVertex.append(pt);
  6.            }

Спасибо за помощь :D
и Ваше терпение.