Сделал по 3му варианту, пока работает только с перемещениями камеры и редактированием геометрии выделенных примитивов мышью.
Для примитивов всё выглядит прозрачно и ундо\редо неотличимо от редактирования мышью (т.е. пользовательских команд которые ундятся и редятся). В стеке запоминается адрес метода вызванного пользователем и данные передающиеся в этот метод в 2х вариантах для comit и undo.
С простыми объектами всё ок - ундится и редится как надо. c вложенными объектами тоже всё ок, вроде даже на неограниченной глубине вложенности...
Проблемы есть в случае самомодифицирующихся объектов, например примитив net - электрическая цепь, представляет из себя список соединенных отрезков. Умеет самомодифицироваться:
-в случаее если отрезки перестали соединяться распадается на несколько примитивов net, чтоб каждый содержал только соединяющиеся отрезки
-умеет объеденять соединяющиеся отрезки являющиеся продолжением друг-друга, один отрезок удаляет, второй продлевает.
Например есть T-образная цепь, в нормальном состоянии состоит из 3х отрезков с узлом в в верхней точке вертикального отрезка.
Ситуация:
Пользователь редактирует T до вида Y(изменяет геометрию верхних отрезков), потом подумав редактирует обратно до вида T(без ундо, мышкой, верхние отрезки снова стали продолжением друг-друга)
Затем отцепляет от цепи вертикальный отрезок - цепь распадается на 2 цепи. первая с двумя верхними отрезками, вторая с отсоединенным. Причем первая еще и модифицируется, узел теперь ненужен, отрезки - продолжение другдруга, один из них удаляется, другой продляется.
Т.е. в итоге в чертеже 2 цепи, по одному отрезку в каждой.
Если сейчас пользователь жмет ундо - отсоединенный отрезок снова присоединяется к верхнему сегменту, цепи соединятся, добавится узел и верхний отрезок снова разобъется на 2 (это всё делается внутри класса net, и лезти туда совсем не хочется).
При дальнейших нажатиях ундо - будет AV, т.к. примитив метод которого запомнен - удален и вместо него сгенерирован новый.
Даже если сохранить удаленный отрезок, как его подсунуть обратно? чето я совсем туплю