Autocad: Перевод координат из ModelSpace в PaperSpace

Автор Тема: Autocad: Перевод координат из ModelSpace в PaperSpace  (Прочитано 5152 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Коллеги, добрый день.
Встала задача образмерить чертеж, который имеется в modelspace. На него сделаны 3 видовых экрана (3 проекции) в paperspace. Все координаты привязки в modelspace у меня есть, но я никак не могу понять как перевести координаты из мирового пространства в листовое. Помогите знаниями, пожалуйста.


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Должно быть что-то такое:
Код - Visual Basic [Выбрать]
  1. Dim pointPaperDCS As Variant
  2. pointPaperDCS = ThisDrawing.Utility.TranslateCoordinates(pointWCS, acWorld, acPaperSpaceDCS, False)
где pointWCS - координаты в мировой системе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Большое спасибо за ответ. Пробую. Правда пока не понимаю, если в пространстве листа есть несколько видов, а в TranslateCoordinates никак не фигурирует привязка к ним, то как будет учитываться на каком из видовых экранов я хочу получить размер.
Если можно, объясните, пожалуйста.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Большое спасибо за ответ. Пробую. Правда пока не понимаю, если в пространстве листа есть несколько видов, а в TranslateCoordinates никак не фигурирует привязка к ним, то как будет учитываться на каком из видовых экранов я хочу получить размер.
Если можно, объясните, пожалуйста.
В том, который активен. Так что если тебе нужны точки с нескольких видовых экранов, то придётся между ними попереключаться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, вот пример обратной процедуры, т.е. по точке в пространстве листа получение точки в пространстве модели:
http://jprdintprev.autodesk.com/adn/servlet/devnote?siteID=4814862&id=5411288&preview=1&linkID=4900509
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Александр, благодарю! Полезнейшая информация!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот еще один вариант - это .NET, но оттуда можно кое-что почерпнуть: http://adndevblog.typepad.com/autocad/2014/11/from-model-space-to-paper-space.html
Там в частности используется функция acedTrans(), которая полный аналог Utility.TranslateCoordinates из VBA.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Спасибо за помощь!
Оххх, есть еще каверзный вопросик.
Я пишу программу на 1С, да бывает и такое)) И у меня нет типа "перечисления". Все перечисления я задаю порядковыми номерами. В случае с TranslateCoordinates получается такая строчка:

Т11 = ЭтотЧертеж.Utility.TranslateCoordinates (Т1, 0, 4, Ложь);

Но ругается на аргумент OCSNormal. Получается что системы координат в перечислении не в том же порядке, как даны в справке
acWorld
acUCS
acOCS
acDisplayDCS
acPaperSpaceDCS

Можно как-нибудь наверняка узнать какому номеру какое из перечислений соответствует?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Нумерация с 0 и acOCS последний (значение 4). Остальные вроде правильно - сейчас не могу проверить.

P.S.: Проверил. Точно:
Код - C++ [Выбрать]
  1. enum AcCoordinateSystem
  2.     {
  3.         acWorld = 0,
  4.         acUCS   = 1,
  5.         acDisplayDCS    = 2,
  6.         acPaperSpaceDCS = 3,
  7.         acOCS   = 4
  8.     }   AcCoordinateSystem;
  9.  
« Последнее редактирование: 26-10-2017, 10:46:37 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
Для чистоты эксперимента решил сначала на VBA обкатать, но тоже проблема.

Код - Visual Basic [Выбрать]
  1. Private Sub CommandButton1_Click()
  2.  
  3. ThisDrawing.MSpace = True
  4.  
  5. Dim pt1, pt2, pt3 As Variant
  6. pt1 = ThisDrawing.Utility.GetPoint(, "Point1") 'Выбираю точку в PaperSpace с активным видом (низ стакана)
  7. pt2 = ThisDrawing.Utility.GetPoint(, "Point2") 'Выбираю точку в PaperSpace с активным видом (верхстакана)
  8.  
  9. ThisDrawing.MSpace = False
  10.  
  11. pt3 = ThisDrawing.Utility.GetPoint(, "33") 'выбираю точку в  PaperSpace с выключенным видовым экраном, это будет точка выноски текста
  12.  
  13. pt11 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acPaperSpaceDCS, False)
  14. pt22 = ThisDrawing.Utility.TranslateCoordinates(pt2, acWorld, acPaperSpaceDCS, False)
  15.  
  16. ThisDrawing.MSpace = False
  17. Dim R As AcadDimAligned
  18. R = ThisDrawing.PaperSpace.AddDimAligned(pt11, pt22, pt3)
  19. End Sub
  20.  

В результате появляется размер на столько большой, что не умещается в paperspace.
Подскажите, что не так делаю?

Отмечено как Решение AndONE 26-10-2017, 09:34:37

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже, что примеры ты не смотрел.
Из первого примера видно, что нужно по два преобразования для каждой точки (в примере обратная последовательность):
1. acWorld -> acDisplayDCS
2. acDisplayDCS -> acPaperSpaceDCS
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndONEАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 0
На самом деле смотрел, но это не очевидно, не из справки, не из первого примера, где Вы предложили сразу конвертировать из Мировых в Листовые.

Тем не менее, Вы правы, требуется сначала перевести мировые с включенным вьюпортом в дисплейные, потом выключить вьюпорт, а только потом конвертировать их в листовые. Тут получается комбинаторика из возможных вариантов, и вчера весь день комбинируя, я пробовал с промежуточными дисплейными, но выключал вьюпорт после последней конвертации, что не давало нужный результат.
Своей подсказкой Вы сократили количество вариантов до минимума и почти сразу получилось.
Огромной Вам спасибо за поддержку!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
На самом деле смотрел, но это не очевидно, не из справки, не из первого примера, где Вы предложили сразу конвертировать из Мировых в Листовые.
Что ты хочешь - склероз. :-) Про двойную конвертацию забыл. Только углубившись в материал удалось вспомнить этот нюанс.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение