2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);Вот это неправильно. Насколько я понимаю transform при каждом вызове соответствует перемещению из начальной точки.
Вот это я уже понял. Значит перед началом трансформации нужно временно сохранить первоначальные данные. Но вот вопрос - как и куда? На ум приходит мысль использовать обработку события CommandWillStart, но мне что-то не очень хочется. Но и в TransformOverrule я не вижу ничего подходящего2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);Вот это неправильно. Насколько я понимаю transform при каждом вызове соответствует перемещению из начальной точки.
Есть вариант в TransformOverrule.CloneMeForDragging возвращать false. В этом случае transform будет не из начальной точки, а из предыдущей.Попробовал. Теперь при использовании команды Move перемещаемый примитив тоже уезжает от суммирования матриц трансформации. Зато вместе с расширенными данными :D
Вопрос - как при этом получить скопированный объект?Наверное через Database.ObjectAppended
Допустим я сделал TransformOverrule для отрезка. И у меня есть расширенные данные, которые соответствуют точкам отрезка (начало и конец).TransformOverrule используется только для того, чтобы отследить изменение отрезка и актуализировать его расширенные данные?
При работе метода TransformBy я попробовал такие действия:
1. Читаю данные из объекта
2. Обновляю данные типа так: Data.StartPoint = Data.StartPoint.TransformBy(transform);
3. Записываю данные обратно в примитив
Кстати, возможно, пригодится в данном случае. В расширенные данные можно поместить координаты точки под определенным кодом и они будут изменяться вместе с объектом (World Space Position и далее)Да, хорошая возможность. У меня мало опыта работы с XData и сразу возникает вопрос - я смогу ведь только одну такую точку сохранить? Я сейчас именно про World Space Position говорю. А если у меня несколько таких "важных" точек?
Кстати, возможно, пригодится в данном случае. В расширенные данные можно поместить координаты точки под определенным кодом и они будут изменяться вместе с объектом (World Space Position и далее): http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-3481BF7B-73CB-4FD5-B421-C25BE92C6D56Когда-то (очень-очень давно) я пробовал использовать эти коды. К сожалению они не всегда трансформировались и мне пришлось тогда от них отказаться в пользу реакторов.
я смогу ведь только одну такую точку сохранить?Нет. Их может быть произвольное количество. Просто тебе нужно будет учитывать их порядок для того чтобы понять, что первый 1011 - это точка начала, второй 1011 - конец и т.д. Но советую тщательно потестировать работоспособность.
Данных с именем World space position всего три - 1011, 1021, 1031. МалоНе путай "мягкое с теплым". В DXF-файле это три группы (1011, 1021, 1031). А в lisp/arx/.NET - это одна группа 1011. Но элементов с этой группой в XData может быть несколько. Например: '((1011 . (0.0 0.0 0.0)) (1011 . (1.0 1.0 1.0)) (1011 . (2.0 2.0 2.0))
Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?Данных с именем World space position всего три - 1011, 1021, 1031. МалоНе путай "мягкое с теплым". В DXF-файле это три группы (1011, 1021, 1031). А в lisp/arx/.NET - это одна группа 1011. Но элементов с этой группой в XData может быть несколько. Например: '((1011 . (0.0 0.0 0.0)) (1011 . (1.0 1.0 1.0)) (1011 . (2.0 2.0 2.0))
Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?Именно. И так можно делать несколько раз.
По ссылке, что Дмитрий дал, написано:Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?Именно. И так можно делать несколько раз.
World Space PositionПо описанию - прям отличный вариант. И если я в этот код несколько точек помещу - они все меняться будут? Вот тут что-то не уверен. Но потом вы написали:
1011. Unlike a simple 3D point, the WCS coordinates are moved, scaled, rotated, and mirrored along with the parent entity to which the extended data belongs. The WCS position is also stretched when the AutoCAD STRETCH command is applied to the parent entity and when this point lies within the select window.
Когда-то (очень-очень давно) я пробовал использовать эти коды. К сожалению они не всегда трансформировались и мне пришлось тогда от них отказаться в пользу реакторов.И теперь я даже не знаю - пробовать или нет :-\
И если я в этот код несколько точек помещу - они все меняться будут?Да. Должны меняться все.
И теперь я даже не знаю - пробовать или нетЭто было, если мне не изменяет память, еще в DOS'овской версии AutoCAD R12. Так что если я пишу, что это очень-очень давно, то это так и есть. Уже почти 25 лет прошло. Возможно это был баг, который потом исправили. Так что советую проверить.
Это было, если мне не изменяет память, еще в DOS'овской версии AutoCAD R12. Так что если я пишу, что это очень-очень давно, то это так и есть. Уже почти 25 лет прошло. Возможно это был баг, который потом исправили. Так что советую проверитьВот как раз сегодня и займусь) Начинал с XRecord, затем скаканул к сериализации в XData, теперь попробую вообще обычные dxfCode. Иду к упрощению =)
А вот и нет)) Вываливается ошибка, если я пробую сразу добавить массив. А вот так добавляются:Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?Именно. И так можно делать несколько раз.
Но я впал в небольшой ступор - а как их теперь получить?По индексу в массиве:
Не думаю, что так будет хорошо. Нужно точно знать эти индексы, а в процессе написания кода можно внести изменения и упустить этот момент.Но я впал в небольшой ступор - а как их теперь получить?По индексу в массиве:Код - C# [Выбрать]
InsertionPoint = (Point3d)resBufArr[0];
А вот и нет)) Вываливается ошибка, если я пробую сразу добавить массив. А вот так добавляются:Значит я просто тебя не понял.
Попробую как-раз на получении ручек. Отпишусь потом получилось или нетИтак - попробовал. Работает! С перемещением и копированием все хорошо. Даже с копированием в другой документ. Но счастье длилось не долго - до тех пор как я повернул примитив. Вот тут началось что-то такое, что я уже пол вечера понять не могу.
7.105427357601E-15Неудачный пример привел ))
3. Использую команду из Express Tools - List Xdata и получаю такое значение: * Code 1011, 3D World space position: (0 50 0). Т.е. то значение, которое мне и нужно, НО!то и в .NET API ты получишь тоже значение.