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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Особенности работы функции TRANS

Особенности работы функции TRANS

Ответ
Поиск в этой теме
Непрочитано 26.05.2006, 14:24 #1
Особенности работы функции TRANS
kp+
 
идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091

Подскажите, PLS, почему конструкция типа
Код:
[Выделить все]
(trans <point> <entname> 0)
не работает (в смысле возвращает те же координаты, что и были введены)?

В другом варианте
Код:
[Выделить все]
(vl-cmdf "ucs" "n" "ob" <entname>)
(trans <point> 1 0)
работает как часы

Как заставить работать первый вариант?
Просмотров: 8749
 
Непрочитано 26.05.2006, 14:57
#2
AY

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


В справке написано:
Цитата:
For some objects, the OCS is equivalent to the WCS; for these objects, conversion between OCS and WCS is a null operation
т.е. для некоторых объектов объектная система коордитнат эквивалентна мировой со всеми вытекающими последствиями.

Надо полагать, что это как раз и есть ваш случай.

Мне кажется, что выравнивание пользовательской системы координат по объкту в общем случае не означает, что она выравнивается по объектной системе координат (OCS). Отсюда и возникает вопрос который вы задаете.
AY вне форума  
 
Непрочитано 26.05.2006, 15:01
#3
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


странный вопрос.

у функции trans второй аргумент - код соответствия CS (системы коорд) из которой будут пересчитываться координаты точки. Соответственно <entname> тут никак не при чем.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 26.05.2006, 15:10
#4
AY

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


>Apelsinov
Отнють. В справке написано:
Цитата:
(trans pt from to [disp])
If you use an entity name for the from or to argument, it must be passed in the format returned by the entnext, entlast, entsel, nentsel, and ssname functions. This format lets you translate a point to and from the Object Coordinate System (OCS) of a particular object.
Что, как мне понимается, означает "использовать можно если осторожно".
AY вне форума  
 
Непрочитано 26.05.2006, 15:24
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


AY
Не знал...
:cry:
был не прав, приношу свои извинения....
(хотя сам бы такой фигней пользоваться не стал)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 26.05.2006, 15:45
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Фактически код:
Код:
[Выделить все]
(trans p ename 0)
при условии, что (= (type ename) 'ENAME) эквивалентен коду:
Код:
[Выделить все]
(trans p (cdr (assoc 210 (entget ename))) 0)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 26.05.2006, 17:11
#7
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Цитата:
Сообщение от AY
В справке написано:
Цитата:
For some objects, the OCS is equivalent to the WCS; for these objects, conversion between OCS and WCS is a null operation
т.е. для некоторых объектов объектная система коордитнат эквивалентна мировой со всеми вытекающими последствиями.

Надо полагать, что это как раз и есть ваш случай.

Мне кажется, что выравнивание пользовательской системы координат по объкту в общем случае не означает, что она выравнивается по объектной системе координат (OCS). Отсюда и возникает вопрос который вы задаете.
Мне попадался только один такой вариант - MTEXT. Для него команда
"UCS" "N" "OB"
выдала "This object does not define a coordinate system"
Для других объектов, в т. ч. однострочных текстов и блоков, эта команда работает.
kp+ вне форума  
 
Непрочитано 26.05.2006, 17:54
#8
AY

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


>Александр Ривилис

Для такого примитива:
Код:
[Выделить все]
((-1 . <Entity name: 7dc48f70>) (0 . "LINE") (330 . <Entity 
name: 7dc48cf8>) (5 . "E6") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"0") (100 . "AcDbLine") (10 214.604 -37.3531 -32.8813) (11 101.312 11.0889 
71.5781) (210 0.258819 0.0 0.965926))
Такой код:
Код:
[Выделить все]
(setq ename (car(entsel ""))
      p '(1 1 0))

(princ
(trans p ename 0) 
)

(terpri)

(princ
(trans p (cdr (assoc 210 (entget ename))) 0) 
)
Выдает вот что:
Код:
[Выделить все]
(1.0 1.0 0.0)
(-0.965926 1.0 0.258819)
т.е. получается неувязочка.


>kp+
Достоверно я, конечно, утверждать не могу, но, как уже писалось у многих объектов нет собственной системы координат например у объекта line (что понятно все и так просто). С другой стороны для сложных объектов - блоков, например, такая необходимость есть и объектная система координат у них присутствует и объкты в блоке описаны относительно этой системы координат. Поэтому я и берусь утверждать, что выровнять пользовательскую систему координат по линии можно, а преобразование координат результата не даст т.е. даст, но никакого преобразования не будет.
AY вне форума  
 
Непрочитано 26.05.2006, 19:53
#9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от AY
т.е. получается неувязочка.
Согласен. Думаю, что это не единственный примитив, для которого это правило не соблюдается. Оно теоретически соблюдается для плоских примитивов (CIRCLE,ARC,LWPOLYLINE...) Но средств в lisp'е для того чтобы определить плоский ли примитив или нет я не знаю. В ObjectARX с этим все проще, т.е. для любого примитива можно определить плоский он или нет (AcDbEntity::isPlanar()), и если плоский, то получить плоскость в которой он лежит (AcDbEntity::getPlane()) и соответственно вектор направления. Для отрезка (LINE) возвращается что он плоский, но тип "плоскостности" не плоский, а линейный (это справедливо и для XLINE и для XRAY), а не плоский и поэтому вектор выдавливания (группа 210) не определяет плоскость в которой он лежит и соответственно не определяет систему координат объекта (OCS), которая для линейных примитивов соответствует WCS.
Александр Ривилис вне форума  
 
Непрочитано 30.05.2006, 10:18
#10
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


> Александр Ривилис
Цитата:
Но средств в lisp'е для того чтобы определить плоский ли примитив или нет я не знаю
Прямого нет ,но есть:
1.Анализ свойства ObjectName (примитива или примитивов в блоке)
2.Применение функции vlax-curveisPlanar(для объектов-кривых)
3.Применение метода vla-getboundingbox (с анализом maxpt minpt)
Эдуард вне форума  
 
Непрочитано 31.05.2006, 00:55
#11
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


Кстати, замечено, что не всегда trans возвращает координаты точки, иногда выдает ошибку, когда вы пытаетесь получить координаты по объекту в другом пространстве (например, (trans ptbeg en 1) или (trans ptbeg en 0), не помню точно).
KAI вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Особенности работы функции TRANS

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск