Непонятка с системами координат
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Непонятка с системами координат

Непонятка с системами координат

Ответ
Поиск в этой теме
Непрочитано 14.10.2005, 12:33 #1
Непонятка с системами координат
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 616

Всем привет!

Братцы, помогите распутаться... :-)

Уже не первый такой чертеж попадается, но не могу
понять, где собака порылась :-(

(trans '(0 0) 2 3) возвращает в нем (161.05 202.603 0.0)

да и зрительно видно, что есть какая-то дополнительная
сетка с началом координат примерно в этом нижнем-левом
углу. Что это за система координат такая включается и
как привести ее к МСК?
__________________
Счастливо, Алексей!
Просмотров: 10255
 
Автор темы   Непрочитано 14.10.2005, 12:36
#2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Что-то файл не прилепился...
Переименуйте *.dwg на *.zip
[ATTACH]1129278973.dwg[/ATTACH]
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.10.2005, 12:41
#3
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


Два раза щелкни левой клавишей в видовом экране ("войди в видовой экран") и отключи Grid (Сетку) F7. Потом перейди назад в пространство листа
Хмурый вне форума  
 
Автор темы   Непрочитано 14.10.2005, 12:50
#4
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Привет!

Совет, конечно, занимательный... :-)

Беда только в том, что сетка - это вторично (и, кстати,
действительно легко отключаемо). Мне надо, чтобы
(trans '(0 0) 2 3) вернула (0 0).

Разумеется, я упрощаю условие задачи, т.к. и (trans ...)
не самоцель - это лишь одна из строк другой большой
функции.

Прошу прошения, если недостаточно четко сформулировал
свою проблему в первом посте...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.10.2005, 14:54
#5
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


То что оно тебе выдает это координаты точки начала WCS(МСК) в модели на пространстве листа.
(trans '(0 0) 2 3) может выдать (0 0) только если начало WCS модели соответствующего видового окна окажется в начале WCS листа
ытя вне форума  
 
Автор темы   Непрочитано 14.10.2005, 15:26
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Всем привет!

У... ёёё...

Да я как бы все это понимаю! Сделать только не получается.
Поэтому, давайте уж совсем конкретно.

1. Кто может сделать этот чертеж таким, чтобы он выглядел,
как сейчас, но (trans '(0 0) 2 3), набранный из пространства
листа вкладки ОА-ВЫПУСК, возвращал бы что-то близкое
к (0 0)?

2. Кто может (этого, собственно, я и добиваюсь) написать
список команд, приводящих чертеж к состоянию, описанному
в п. 1 ?

Поймите же, у меня есть подобные чертежи, в которых "все
нормально". Как привести к такому виду этот чертеж - понять
не могу. Ясно, что надо где-то и как-то менять ПСК, но как и
где (в каком пространстве)?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.10.2005, 15:42
#7
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


1. Как бя я сделал это руками:
Переместил (_move) бы окно вида в (0 0), используя в качестве базовой начало МСК этого окна.
2. см. п.1, используя точку полученную по (trans '(0 0) 2 3)
ытя вне форума  
 
Автор темы   Непрочитано 14.10.2005, 16:50
#8
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Привет!

Давайте сделаем так. Вот "правильный" файл.
В нем (trans '(0 0) 2 3) возвращает (4.77303 3.33758 0.0)
Это соответствует ожиданиям.

Задача: привести первоначальный файл к такому же состоянию
и рассказать мне, непонятливому, что же это в нем такое было. :-)

*.dwg -> *.zip
[ATTACH]1129294258.dwg[/ATTACH]
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.10.2005, 17:11
#9
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
То что оно тебе выдает это координаты точки начала WCS(МСК) в модели на пространстве листа.
(trans '(0 0) 2 3) может выдать (0 0) только если начало WCS модели соответствующего видового окна окажется в начале WCS листа
Следуя такой логике в листе рисую линию из начала координат листа в полученную точку
Код:
[Выделить все]
(command "_line" '(0 0) (trans '(0 0) 2 3) "")
И вижу, что она вовсе не совпадает с началом мировой системы которое я наблюдаю во вьюпорте. Таким образом я вообще не понимаю, что за координату выдает (trans '(0 0) 2 3) ?
AY вне форума  
 
Непрочитано 14.10.2005, 17:16
#10
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Фиолетовым показал первоначальное положение видового окна
[ATTACH]1129295792.dwg[/ATTACH]
ытя вне форума  
 
Автор темы   Непрочитано 15.10.2005, 12:04
#11
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Всем привет!

Братцы, я что, действительно непонятно выражаюсь?
В принципе - допускаю, пятница все же как-никак... :-)

Еще раз - максимально четко:

1) Файл new-b.dwg преобразовывать не надо, он меня
полностью устраивает и приведен здесь лишь для того,
чтобы показать, "как оно выглядит, когда оно правильно".

2) Файл sit1.dwg и нужно преобразовать к виду файла
new-b.dwg. Согласитесь - они подобные. Тот же набор
форматок А3 и А4, созданный в пространстве модели
и отображаемый в пространство листа через видовой экран.

3) Самое главное. Выявить, почему (trans '(0 0) 2 3) в этих
файлах возвращает _резко_ разные значения.

4) Ну, это по-возможности, дать ряд команд, которыми можно
привести файл sit1.dwg к виду файла new-b.dwg. Почему
по-возможности? Думаю, что если я пойму причину, команды
подберу сам. :-)

5) Здесь приведена упрощенная задача-минимум. Задача
максимум - создание функции, которая, будучи вызвана
из некоей программы, _автоматически_ приводила бы
файл sit1.dwg к виду файла new-b.dwg.

Ну, вроде все разложил по полочкам... :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 15.10.2005, 21:53
#12
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Извиняюсь не внимательно прочитал "пятница все же как-никак".
Но то что я сделал с new-b.dwg. , можно сделать и с sit1.dwg.
ытя вне форума  
 
Непрочитано 17.10.2005, 09:58
#13
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Цитата:
Сообщение от ===AAA===
4) Ну, это по-возможности, дать ряд команд, которыми можно
привести файл sit1.dwg к виду файла new-b.dwg. Почему
по-возможности? Думаю, что если я пойму причину, команды
подберу сам. :-)
(command "_move" (car(entsel "выбери окно:"))""(trans '(0 0) 2 3) '(0 0)"")
ытя вне форума  
 
Непрочитано 17.10.2005, 13:08
#14
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Можно попробовать двигать модель и вид во вьюпорте. Решение может сгодиться если вьюпорт один (равно как и лист в чертеже)
Код:
[Выделить все]
(defun test (/ obj tr-p1 tr-p2 model)

    (setq obj   (vlax-ename->vla-object (car (entsel "\nВыберите видовой экарн:")))
          tr-p1  (trans '(0 0) 2 3)
          tr-p2 (polar '(0 0)
                       (angle '(0 0) tr-p1)
                       (/ (distance '(0 0) tr-p1) (vla-get-CustomScale obj))
                )
          model (ssget "_X" '((410 . "Model")))
    )
    (command "_mspace" "_pan" "_non" tr-p2 "_non" '(0 0) "_pspace")

    (FOREACH x (SSNAMEX model)
        (vla-move
            (vlax-ename->vla-object (cadr x))
            (vlax-3d-point '(0 0))
            (vlax-3d-point tr-p2)
        )
    )
)
- запускать из листа, выбрать целевой вьюпорт, все слои должны быть открыты. Решение с передвижкой изображения в экране через command критики не выдерживает, но по другому у меня не получилось.
AY вне форума  
 
Автор темы   Непрочитано 18.10.2005, 11:34
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Всем привет!

К сожалению, вынужден на время отложить этот вопрос,
т.к. уехал в отпуск и не могу даже проверить ваши
советы.

Сделаю это после отпуска и, ежели вопросы останутся,
"дерну" тему вверх. Хорошо?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 07.12.2005, 07:53
#16
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Всем привет!

Снова возвращаюсь к своему вопросу.

К сожалению, предложенный AY вариант тоже не подходит. :-(((

На первый взгляд, все хорошо, в пространстве листа все
выглядит, как надо (за исключением "чудного" отображения
нескольких лимитных сеток), но вот в пространстве модели
левый-нижний угол "форматки" оказывается смещенным из
точки 0,0 МСК.

А поскольку данный чертеж создавался программой (ею же
предполагается его корректировать и в дальнейшем), то
смещение примитивов по пространству модели не подходит -
программа этого не поймет...

Давайте зайдем с другого конца - попробуем создать новый
ЛИСТ, в котором все будет работать, как надо (см. образец).

Как это сделать? У меня пока не получилось... :-(((
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 09.12.2005, 08:00
#17
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Всем привет!

Ну что, братцы, не по зубам задачка оказалась? :-) Мне тоже. :-(

Ладно, сделаю последний заход. Предположим, функция
(tranc) в этом чертеже о какой-то причине глючит. Тогда
вопрос будет стоять так:

Как, стоя в файле SIT1.DWG на вкладке ОА-ВЫПУСК в
пространстве листа, программно узнать, на какую точку
этого самого пространства листа будет отображаться
нижний-левый угол "синей форматки".

"Глазами" видно, что это примерно (4.5 3.1). Как получить
эти цифры программно?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 10:39
#18
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Как, стоя в файле SIT1.DWG на вкладке ОА-ВЫПУСК в
пространстве листа, программно узнать, на какую точку
этого самого пространства листа будет отображаться
нижний-левый угол "синей форматки".
Это как раз не сложно.
Код:
[Выделить все]
(cdr (assoc 12 (entget (car (entsel)))))
возвращает координаты центра видового экрана в пространстве модели. Исзмерив расстояние от этой точки до угла "синей форматки" в пространстве модели, и зная координаиы центра ыидового экпана в пространсве листа, можно вычислить искомое.
Лентяй вне форума  
 
Автор темы   Непрочитано 09.12.2005, 11:08
#19
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Увы, не то... :-(((

Здесь не должно быть никакого "интерактива", поскольку
эта вся колбасня лишь часть программы, работающей по
принципу "запустил и отдыхай".

Там за раз обрабатывается множество файлов. Конкретно
эта часть программы отвечает за настройку ЛИСТа для
печати, а именно, области печати.

На входе функция имеет точки углов набора форматок
пространства МОДЕЛИ (0 0) и (817 570). Нужно узнать,
куда они отобразятся в пространстве листа.

Функция (trans точка 2 3) - самое оно, но почему-то
в некоторых чертежах она отрабатывает неверно.

Нужно или найти причину, по которой она возвращает
не то, что от нее ожидают, или придумать другой
механизм (функцию), который бы работал верно.

Все, выдохся повторяться... :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 11:25
#20
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Вот я наваял для иллюстрации
Код:
[Выделить все]
(defun C:ff (/ msp vp ln ppt)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc)
        msp (vla-get-ModelSpace adoc))
  (vla-put-activespace adoc 0)
  (vla-put-mspace adoc :vlax-false)
  (vla-getentity util 'vp nil "Select Viewport")
  (vla-put-mspace adoc :vlax-true)
  (setq ln (vla-addLine msp (vlax-3d-point (cdr (assoc 12 (entget (vlax-vla-object->ename vp)))))
             (vla-getpoint util nil "\nSelect Point: "))
        ppt (polar (vlax-get vp 'Center) (vla-get-angle ln)
                   (* (vla-get-length ln) (vla-get-customscale vp))))
  (vla-delete ln) (vlax-release-object ln)
  (vla-put-mspace adoc :vlax-false)
  (print (strcat "\n PaperSpace Coordinates: " (vl-princ-to-string ppt)))
);end
Переделать в полностью автоматический режим. я думаю, несложно. Посижу, попробую.
Лентяй вне форума  
 
Непрочитано 09.12.2005, 11:29
#21
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Да, главное забыл! А в пространстве листа видовой экран один или несколько? Если один, то все просто.
Лентяй вне форума  
 
Автор темы   Непрочитано 09.12.2005, 12:08
#22
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


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

За функцию спасибо, правда, еще не смотрел, но "\nSelect Point: "
меня уже слегка пугает :-)))
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 12:27
#23
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Пока, к счастью, один
Ваше счастье :twisted: :!:
Держите тогда функцию. Возвращает список координат в пространстве листа точек, нажодяшихся в пространстве модели.
Код:
[Выделить все]
(defun Mpt2Ppt (pt1 pt2 / msp vp cp ln)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc)
        msp (vla-get-ModelSpace adoc)
        ms (vla-get-mspace adoc))
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-get-property (list adoc "ActivePViewport")))
    (vla-put-activespace adoc 0))
  (vla-put-mspace adoc :vlax-true)
  (setq vp (vla-get-ActivePViewport adoc)
        cp (vlax-3d-point (cdr (assoc 12 (entget (vlax-vla-object->ename vp))))))
  (vla-put-mspace adoc ms)
  (mapcar '(lambda (x) (setq ln (vla-addLine msp cp x)
                             pt (polar (vlax-get vp 'Center) (vla-get-angle ln)
                                  (* (vla-get-length ln) (vla-get-customscale vp))))
             (vla-delete ln) pt);lambda
    (mapcar 'vlax-3d-point (list pt1 pt2)))
);end
Пользуйтесь, и не забывайте денно и нощно сугубо и трегубо благодарить меня за то, что я есть.
Лентяй вне форума  
 
Автор темы   Непрочитано 09.12.2005, 12:28
#24
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Попробовал функцию. Увы, она вернула ровно то же самое,
что и обычная (trans точка 2 3).

Вывод: функция (trans) работает верно, глюки надо искать
в самом чертеже.

А вот здесь, боюсь, только спецы из АутоДеск помочь смогут... :-(((
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 09.12.2005, 12:33
#25
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Писал про предыдущую функцию. Но и "новая", увы, тоже самое...
Вы пробовали запускать ее именно в sit1.dwg ?

В любом случае - искренняя Вам моя благодарность за отзывчивость
и потраченное время.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 12:47
#26
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Попробовал функцию. Увы, она вернула ровно то же самое,
что и обычная (trans точка 2 3).
Натюрлих, ибо моя прога просто шаг за шагом производит то, что описывается (trans).
Цитата:
Вы пробовали запускать ее именно в sit1.dwg ?
Нет, я пользовался "нормальным" чертежом.
Кстати, ниже - небольшая доработка. Теперь функция запускается из любого пространства.
Код:
[Выделить все]
(defun Mpt2Ppt (pt1 pt2 / msp vp cp ln)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc)
        msp (vla-get-ModelSpace adoc)
        asp (vla-get-ActiveSpace adoc))
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-get-property (list adoc "ActivePViewport")))
    (vla-put-activespace adoc 0))
  (setq ms (vla-get-mspace adoc))
  (vla-put-mspace adoc :vlax-true)
  (setq vp (vla-get-ActivePViewport adoc)
        cp (vlax-3d-point (cdr (assoc 12 (entget (vlax-vla-object->ename vp))))))
  (vla-put-mspace adoc ms) (vla-put-ActiveSpace adoc asp)
  (mapcar '(lambda (x) (setq ln (vla-addLine msp cp x)
                             pt (polar (vlax-get vp 'Center) (vla-get-angle ln)
                                  (* (vla-get-length ln) (vla-get-customscale vp))))
             (vla-delete ln) pt);lambda
    (mapcar 'vlax-3d-point (list pt1 pt2)))
);end
Лентяй вне форума  
 
Автор темы   Непрочитано 09.12.2005, 13:02
#27
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Кажется, я понял, где собака порылась!!!

Если посмотреть список видового экрана в файле sit1.dwg,
то там присутствует группа (17 158.311 201.689 18.8905)
Интересно, что это? Очень похоже, что именно это смещение
добавляется к результату, возвращаемому (trans).

Для сравнения, в "нормальном" рисунке эта группа выглядит
(17 0.0 0.0 0.0) !

Кто знает, что это такое?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 13:12
#28
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


View target point (in WCS)
Справка по DXF Reference
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.12.2005, 13:13
#29
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Интересно, что это? Очень похоже, что именно это смещение
добавляется к результату, возвращаемому (trans).
В Help'е читаем: "17 - View target point (in WCS). DXF: X value; APP: 3D vector". Теперь проверь, совпадает ли значение группы со смещением, умноженным на масштаб видового экрана.
Лентяй вне форума  
 
Автор темы   Непрочитано 09.12.2005, 16:14
#30
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А масштаб видового экрана в какой группе живет?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 16:26
#31
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


DXF Reference :
"The ZOOM XP factor is calculated with the following formula:
group_41 / group_45 (or pspace_height / mspace_height)"
ытя вне форума  
 
Автор темы   Непрочитано 09.12.2005, 16:39
#32
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Осталось только _точную_ формулу составить. :-)

Ведь, черт возьми, по Х уже получилось один раз,
но не записал, что на что делил/умножал, теперь
сижу, по новой вывожу :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 09.12.2005, 16:54
#33
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Интересно, что получится, если попробовать "неправильному" viewport-у заменить 17 группу на (17 0 0 0) ?
ытя вне форума  
 
Автор темы   Непрочитано 09.12.2005, 17:08
#34
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Уже попробовал. По крайней мере через (entmod) не заменяется.

Да это, пожалуй, уже и не важно, т.к. формулу соотношения вывел,
по крайней мере с точностью до третьего знака после запятой.
Наверное, на этом и остановлюсь.

Есть у меня еще одна заморочка подобного плана (про настройки
принтеров), которую тоже пока победить не удается. Но писать о
ней пока не буду - сам попробую сперва разобраться. :-)

Всем спасибо за участие!
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Непонятка с системами координат