|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>Изменение этого параметра никоим образом не должно изменять >>значение нормали объекта. Куда ось Z объекта была направлена,
>>туда и должна остаться быть направленной. А она рушиться. >>И точка вставки блока порою улетает. Во! Не факт, но я думаю: Положение тела в 3D однозначно задоется 3мя базисными векторами, 0x,0y,0z (вернее сказать 2мя, т.к. третий всегда можно посчитать по 2 изза взаимоортогональности) Угол - это угол между 0x фактической 0x расчитаной по arbitrary axis algorithm, когда ты меняешь нормаль - угол может поменяться, а ты ему присваиваешь старое значение - вот всё и летит. Угол нужен только в 2д, там с ним всё понятно, в 3д - он только мешает, т.к. не матрица преобразования расчитывается по углу, а угол расчитывается из матрицы преобразований. |
|||
|
||||
На этом форуме, встречается мой код, для вставки блока с поворотом вокруг произвольной оси. Вставка выполняется с отслеживанием курсора, через grread. Создавая этот код я столкнулся с проблемой - при указании угла поворота в произвольной системе координат, угол отличается от подразумевавшегося. т.е. если блок находится в точке не лежащей на XY мировой и нормаль отличается от мировой, то указывая точку на экране не так просто вычислить действительный угол поворота в плоскости блока. Для этой цели, я переводил указанную точку в систему координат экрана, далее вычислял еще одну точку, в которой z была другой, но xy в экранной системе координат совпадали. Далее, находил точку пересечения плоскости блока с линией, заданной этими двумя точками. Угол в системе координат блока, относительно оси Х и вектором из точки вставки и найденной точкой и давали искомый угол.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
|
||||
Цитата:
хотя... Контура подрезки xclip хранят в своих dxf кодах матрицы, причем сразу две матрицы 4х4, одна для подрезаемого объекта, вторая для самого контура подрезки. ps. Конечно, матрицы хранятся не в самих объектах, а в словарях, как впрочем и контура...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>матрица трансформации не хранится в объекте, а услужливо вычисляется при запросе.
ИМХО Это угол не хранится, а услужливо вычисляется (под объектом я подразумеваю не то что видно в лисп, а то что действительно лежит в закрамах автокада), без матриц в 3d графике шагу ни ступить. |
|||
|
|||||
zamtmn,
Цитата:
Цитата:
И я не старое значение присваиваю, а новое. И когда нормаль я меняю - угол не меняется, в смысле в свойствах объекта он остается прежним. Цитата:
Цитата:
И почему изменение свойства Rotation в объекте TEXT нормаль не меняет, а в MTEXT меняет? Елпанов Евгений, о, как я тебя понимаю! Через экран? Это круто! Мы люди технические. Математика для нас как клоунов план производства работ. Мы любые проблемы решаем исключительно штангенциркулем. Если очень надо, то используем микрометр. Вот не только MTEXT страдает глюком, блоки тоже не хотят крутится вокруг нормали, еще и труднопредсказуемым перемещением страдают. Люди! Если вы, по случайности, залезли в свойство Rotation объектов Автокада, не забудьте после этого восстановить нормаль и точку вставки. Последний раз редактировалось Supermax, 24.11.2009 в 20:52. |
|||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>Или одним и углом поворота вокруг него, что собственно в Автокаде и присутствует.
Да елки палки, чтоб этот угол применить надо: знать вокруг чего вращат - знаем (нормаль); исходное состояние которое вращаем - его не знаем! тут вся хитрость - исходное состояние это расчет оси 0x описаный а dxf справке. меняем нормаль - меняется эта расчетная 0х - соответственно угол если его не пересчитать становится пальцем в небо; Почувствуй разницу между окружностью и блоком окружность симетрична вокруг нормали - для описания хватает одной оси z блок не симетричен, нужно 2(3) оси, во времена доса память экономили - придумали этот хитрый способ с осью и углом (экономия 40 байт на объект) еще пример - допустим нормаль равна 1,0,0 - чему равна исходная ось x которую надо повернуть на извесный угол? >>И кто мне объяснит, почему в 3D полилинии и в 2D полилинии свойства Normal нет, а в простой линии есть? в 2d полилинии есть (у нее своя соординаиная система), в линии и 3д полилинии нет (они в wcs) ИМХО: при 3д повороте блока в автокаде (при черчении) блок трансформируется матрицей - одновременно меняются базисные оси, точка вставки, потом считается угол. ты пытаешся воспроизвести это пошагово, 1. 3Д вращательные операции не комутативны - результат зависит от порядка применения 2. нет гарантий что на каждом шаге умный автокад не пересчитывает чтото за тебя - типа точки вставки при изменении нормали отсюда "глюки" Последний раз редактировалось zamtmn, 24.11.2009 в 21:17. |
|||
|
||||
zamtmn, опять не-е-е.
Цитата:
Цитата:
Маленькая функция на основе моей vektor-translate: Возвращает точку вставки объекта и три его единичных вектора (X Y Z) (естественно в МСК). Если точки вставки нет, то за точку вставки принимается (0.0 0.0 0.0) Если угла нет, то при расчете угол равен 0.0 (может так станет всем понятно что мне надо) Применение: (vectors-x-y-z (car (entsel))) Код:
Последний раз редактировалось Supermax, 24.11.2009 в 21:54. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>А про точку вставки забыл? Положение объекта в Автокаде определено точкой вставки, нормалью и углом поворота вокруг нее
Нет, не забыл. я имел ввиду поворотную ориентацию объекта. еще пример неоднозначности нормали и угла и зависимость угла от нормали: Втыкаем вилку в монитор - это будет нормаль 1 - поворачиваем вилку чтоб смотрела вертикально вверх, не вращая 2 - поворачиваем вилку чтоб смотрела влево , не вращая 3 - поворачиваем вилку в исходное положение (чтоб смотрела вперед) , не вращая вилка в исходном положении, вращения вокруг вилки небыло, почему монитор набоку и вилка повернута? edit: вот еще цитата про X-axis dir из описания мтекста в OpenDWG R13/R14/R2000/R2004/R2007 File Format Specification Цитата:
Последний раз редактировалось zamtmn, 24.11.2009 в 22:30. |
|||
|
||||
Э! Ты меня так просто не поймаешь! Ты его поворачиваешь сначала вокруг оси X МСК, затем вокруг оси Z МСК, а потом вокруг оси Y МСК, так чего ты хочешь? Ты на него сначала смотришь в фас, затем снизу, затем опять снизу, затем опять в фас, но с поворотом.
Если поворачивать монитор не от себя вертикально, а от себя влево под 45 градусов, то он должен (если нет поворота) стать на угол, а у тебя при прохождении 45 градусов, во время поворота влево он все время смотрит на тебя боком. Вот тут он у тебя и вращается! Последний раз редактировалось Supermax, 24.11.2009 в 23:18. |
||||
|
||||
Ага, за один поворот 2 миллиметра по оси Y
за еще один поворот на 360 (210 0.0 -4.89843e-016 1.0) Возьми и построй линию из этих координат в точку 0,0,0 А по тексту не скажешь, что он повернут. В этой паре вообще не должно быть цифр выходящих за диапазон от -1 до 1 Елпанов Евгений устанавливал большие значения, но говорит, что машина сама потом единичный вектор устанавливает. А тут по оси Z 1 мм а по оси Y аж 2 это поворот больше 45 градусов! А я что-то не наблюдаю этого в живье. Последний раз редактировалось Supermax, 24.11.2009 в 23:11. |
||||
|
||||
А, пардон по е забыл!
Только что проверил. в 2007 каде функция entmod при замене 50 пары сбивает точку вставки у текста, а у мтекста не сбивает. И сбивает она потому, что список сформирован с нарушением порядка расположения точечных пар. А про порядок расположения точечных пар в списках для функций entmod b entmakex вообще, нигде, ни гу гу. Последний раз редактировалось Supermax, 25.11.2009 в 15:00. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
Гляжу справку
TEXT: 10 First alignment point (in OCS) DXF: X value; APP: 3D point MTEXT: 10 Insertion point DXF: X value; APP: 3D point может в этом всё дело? хотя и там и там ocs былоб логичнее и в книжке и там и там ocs. Ты че добиваешся? разные примитивы - разное поведенье. глюки надо у себя искать, а не у автокада)) |
|||
|
||||
zamtmn, я ничего не добиваюсь, и если ты думаешь, что я днями напролет ползаю по объектам Автокада и ищу в нем глюки, так я тебе отвечу - делать мне больше нечего, как заниматься такой ерундой.
Тут тема, про ориентацию объектов, и управление этой ориентацией. Это понятно? Из всех доступных способов это сделать, только один - установить объекту угол поворота, направление нормали и точку вставки. Это надеюсь понятно? Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно? То, что при этом с некоторыми объектами происходят нехорошие вещи не моя вина, но тем, ради кого я эту тему открыл, знать это необходимо. Это понятно? Если ты хочешь на собственном опыте убедиться в этом - изучай AutoLISP. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
Да не кипятись ты, мне эти нормали повороты также интересны как и тебе.
Я с ними поковырялся выше крыши, и сделал вывод: Это огрызок внутреннего представления объектов автокада, пригодный для экономного хранения объектов на диске, но практически не причодный для переориентации объекта. >>Реализовать можно это либо заменой точечных пар в списке описания объекта, либо установкой через ActiveX функции этих свойств. Это понятно? не, не понятно. хочешь просто и понятно крутануть объект на произвольные углы в 3D - применяй к ниму матрицу преобразования (посчитаную тобой), если это возможно в лиспе. автокад заботливо вернет тебе новый, посчитаный "угол" и нормаль. Последний раз редактировалось zamtmn, 25.11.2009 в 17:50. |
|||
|
||||
Цитата:
Ну посчитал я нужный мне угол и нормаль, а что дальше? А дальше - надо их установить! А как? - А вот так: Скопируй вот это в буфер и вставь в командную строку Автокада. (entget (car (entsel))) И жми ентер. Тебя попросят указать объект - ткни в него. Подними планку окна просмотра событий и ты увидишь распечатку точечных пар объекта. Этот список передается аргументом функции (entmod '(список точечных пар)) и если в нем есть отличие от того, которое есть в натуре - объект модифицируется в соответствии с новыми данными. Можно заменить 50 точечную пару (это угол поворота) на новую и модифицировать объект. Только вот такой метод модификации приводит к сбоям если точечная пара стоит не на своем месте в списке (а в конце, так проще ее к списку приаттачить). Есть тема про обучение на Лиспе, там и тряси народ на инфу. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
1. из угла и нормали можно восстановить векторы.
2. из векторов можно посчитать угол. 3. получить нужное положение присвоив нормаль и угол можно только при гарантии что между каждым присвоением автокад ничего не пересчитывает, ты же говоришь что всё летит - значит пересчитывает, или ты чтото делаешь не так(( >>Скопируй вот это в буфер и вставь в командную строку Автокада... У нас разговор слепого с глухим)) Скажи: в лиспе можно преобразовывать объекты матрицами? чтонибудь наподобии TransformBy в ARX. если есть то ими и нужно пользоваться для переориентации. В лиспе можно для блока получить его матрицу трансформации? если можно то из нее можно вынуть нужные тебе 0x, 0y без лишних вычислений Последний раз редактировалось zamtmn, 25.11.2009 в 18:46. |
|||
|
||||
Цитата:
Цитата:
|
||||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рифмоплетство. | Kryaker | Разное | 554 | 14.11.2023 11:59 |
Определение высот рельефа по близлежащим точкам | dextron3 | Программирование | 21 | 10.11.2011 13:14 |
Интерполяция между двумя точками | postbudka | Программирование | 27 | 21.05.2009 10:00 |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |
Координаты точки, лежащей на полилинии | Al_Taron | Программирование | 1 | 27.11.2006 09:45 |