TransformOverrule : TransformBy - как получить смещенную точку?

Автор Тема: TransformOverrule : TransformBy - как получить смещенную точку?  (Прочитано 15792 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?
Именно. И так можно делать несколько раз.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А можно и вот так:
Код - C# [Выбрать]
  1.   new TypedValue((int)DxfCode.ExtendedDataWorldXCoordinate, new Point3d(1.0, 2.0, 3.0))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я правильно понимаю, что можно делать что-то типа того: 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.
По описанию - прям отличный вариант. И если я в этот код несколько точек помещу - они все меняться будут? Вот тут что-то не уверен. Но потом вы написали:
Когда-то (очень-очень давно) я пробовал использовать эти коды. К сожалению они не всегда трансформировались и мне пришлось тогда от них отказаться в пользу реакторов.
И теперь я даже не знаю - пробовать или нет  :-\

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И если я в этот код несколько точек помещу - они все меняться будут?
Да. Должны меняться все.
И теперь я даже не знаю - пробовать или нет
Это было, если мне не изменяет память, еще в DOS'овской версии AutoCAD R12. Так что если я пишу, что это очень-очень давно, то это так и есть. Уже почти 25 лет прошло. Возможно это был баг, который потом исправили. Так что советую проверить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Это было, если мне не изменяет память, еще в DOS'овской версии AutoCAD R12. Так что если я пишу, что это очень-очень давно, то это так и есть. Уже почти 25 лет прошло. Возможно это был баг, который потом исправили. Так что советую проверить
Вот как раз сегодня и займусь) Начинал с XRecord, затем скаканул к сериализации в XData, теперь попробую вообще обычные dxfCode. Иду к упрощению =)
Попробую как-раз на получении ручек. Отпишусь потом получилось или нет

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я правильно понимаю, что можно делать что-то типа того: new TypedValue(1011, Points3d[]) ?
Именно. И так можно делать несколько раз.
А вот и нет)) Вываливается ошибка, если я пробую сразу добавить массив. А вот так добавляются:
Код - C# [Выбрать]
  1. resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataWorldXCoordinate, InsertionPoint)); // 1011
  2. resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataWorldXCoordinate, EndPoint)); // 1011
Но я впал в небольшой ступор - а как их теперь получить?
Код - C# [Выбрать]
  1. TypedValue[] resBufArr = resBuf.AsArray();
  2. foreach (TypedValue typedValue in resBufArr)
  3. {
  4.     switch ((DxfCode)typedValue.TypeCode)
  5.     {
  6.         case DxfCode.ExtendedDataWorldXCoordinate:
  7.             {
  8.                 InsertionPoint = ???;
  9.                 EndPoint = ???;
  10.                 break;
  11.             }
  12.     }
  13. }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Но я впал в небольшой ступор - а как их теперь получить?
По индексу в массиве:
Код - C# [Выбрать]
  1. InsertionPoint = (Point3d)resBufArr[0];

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Но я впал в небольшой ступор - а как их теперь получить?
По индексу в массиве:
Код - C# [Выбрать]
  1. InsertionPoint = (Point3d)resBufArr[0];
Не думаю, что так будет хорошо. Нужно точно знать эти индексы, а в процессе написания кода можно внести изменения и упустить этот момент.
В данном примере (но у меня всего две точки) я сделал так:
Код - C# [Выбрать]
  1. TypedValue[] resBufArr = resBuf.AsArray();
  2. var wasInsertionPoint = false;
  3. foreach (TypedValue typedValue in resBufArr)
  4. {
  5.     switch ((DxfCode)typedValue.TypeCode)
  6.     {
  7.         case DxfCode.ExtendedDataWorldXCoordinate:
  8.             {
  9.                 if (!wasInsertionPoint)
  10.                 {
  11.                     InsertionPoint = (Point3d)typedValue.Value;
  12.                     wasInsertionPoint = true;
  13.                 }
  14.                 else
  15.                 {
  16.                     EndPoint = (Point3d)typedValue.Value;
  17.                 }
  18.                 break;
  19.             }
  20.     }
  21. }
Но если точек будет больше, то это можно решить введя вспомогательный счетчик. Ну или еще что придумать. В общем - варианты есть. Я просто поспешил задать вопрос ))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот и нет)) Вываливается ошибка, если я пробую сразу добавить массив. А вот так добавляются:
Значит я просто тебя не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Попробую как-раз на получении ручек. Отпишусь потом получилось или нет
Итак - попробовал. Работает! С перемещением и копированием все хорошо. Даже с копированием в другой документ. Но счастье длилось не долго - до тех пор как я повернул примитив. Вот тут началось что-то такое, что я уже пол вечера понять не могу.
Пример:
1. Строю примитив с расширенными данными так, чтобы первая точка была в (0,0,0)
2. Затем поворачиваю примитив так, чтобы эта точка переместилась в (0,50,0)
3. Использую команду из Express Tools - List Xdata и получаю такое значение: * Code 1011, 3D World space position: (0 50 0). Т.е. то значение, которое мне и нужно, НО!
4. При чтении из Xdata я получаю другую координату! При этом:
Код - C# [Выбрать]
  1. TypedValue[] resBufArr = resBuf.AsArray();
  2. var wasInsertionPoint = false;
  3. foreach (TypedValue typedValue in resBufArr)
  4. {
  5.     switch ((DxfCode)typedValue.TypeCode)
  6.     {
  7.         case DxfCode.ExtendedDataWorldXCoordinate:
  8.             {
  9.                 if (!wasInsertionPoint)
  10.                 {
  11.                     AcadHelpers.Editor.WriteMessage("\n(Point3d)typedValue.Value: " + (Point3d)typedValue.Value);
  12.                     InsertionPoint = (Point3d)typedValue.Value;
  13.                     wasInsertionPoint = true;
  14.                 }
  15.                 else
  16.                 {
  17.                     EndPoint = (Point3d)typedValue.Value;
  18.                 }
  19.                 break;
  20.             }
  21.     }
  22. }
вижу в командной строке (Point3d)typedValue.Value: (7.105427357601E-15,50,0). Даже не соображу куда копать и что читать  :(

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Шутишь? На числа внимательно посмотри и вспомни про точность представления чисел типа double.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
7.105427357601E-15
Неудачный пример привел ))
Ну в общем смысл в том, что проблема у меня после поворота присутствует, но я пока не могу сообразить даже где. Наверно это уже не вопрос для данной темы

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если:
3. Использую команду из Express Tools - List Xdata и получаю такое значение: * Code 1011, 3D World space position: (0 50 0). Т.е. то значение, которое мне и нужно, НО!
то и в .NET API ты получишь тоже значение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение