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

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

Dxf группа 210

Ответ
Поиск в этой теме
Непрочитано 04.03.2008, 16:29 #1
Dxf группа 210
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,839

Всем привет, подскажите формат 210 группы, суть проблемы - хочу сориентировать блок в 3Д пространстве по 2 3Д точкам (p1 p2):
Пробовал:
(setq v1 (- (car p2) (car p1))
v2 (- (cadr p2) (cadr p1))
v3 (- (caddr p2) (caddr p1))
maxv (max v1 v2 v3)
);end setq
(if (/= v1 0) (setq v1 (/ maxv v1)))
(if (/= v2 0) (setq v2 (/ maxv v2)))
(if (/= v3 0) (setq v3 (/ maxv v3)))
И выходит полная еруднда.
Нужно чтоб, при вставке в p1 и указании вектора блок вставал на линию p1 p2 - для двухмерного прекрасно подходит 50 группа - (cons 50 (angle p1 p2)), а для 210 группы мне знаний не хватает.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Просмотров: 5122
 
Непрочитано 04.03.2008, 16:57
#2
Александр Ривилис

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


Попробуй так:
Код:
[Выделить все]
(defun get_uniform ( p1 p2 / x y z v n)
  (setq v (mapcar '- p2 p1) x (car v) y (cadr v) z (caddr v))
  (setq n (sqrt (+ (* x x) (* y y) (* z z))))
  (setq v (mapcar '/ v (list n n n))) 
) ;_endof defun
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 04.03.2008, 17:37
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Спасибо - результат возращает такой же, что и у меня - видимо в 210 что-то другое требуется.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.03.2008, 18:42
#4
Александр Ривилис

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


Ну тот же результат быть не может. Для примера возми отрезок (0,0,-10)-(0,0,10) Сделай из него блок. Вставь этот блок и поменяй группу 210 по двум точкам. Блок с отрезком будет сориентирован вдоль отрезка [p1-p2]. Останется установить базовую точку на отрезке. Т.е. группа 210 определяет направление оси Z блока. Если тебе нужно что-то другое - объясни.

Последний раз редактировалось Александр Ривилис, 04.03.2008 в 19:03.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 04.03.2008, 22:27
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А понял - я почему-то думал, что 210 - ось х показывает - тупой, теперь вроде все ясно становиться - завтра проверю (сейчас под рукой нет), отпишусь.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 05.03.2008, 14:03
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В общем так, создаем блок с именем 123 (неважно какой) затем
(entmakex (list (cons 0 "insert")
(list 10 100 100 0)
(cons 2 "123")
(list 210 0.5 0.5 0.5)
))
Дале смотри свойства (entget (entlast)):

((-1 . <Имя объекта: 7efa2428>) (0 . "INSERT") (330 . <Имя объекта: 7efa0cf8>)
(5 . "1BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbBlockReference") (2 . "123") (10 100.0 100.0 0.0) (41 . 1.0) (42 . 1.0)
(43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.57735
0.57735 0.57735)
)

А теперь _propirties:
Положение X - -111.5355
Положение Y - 29.8858
Положение Z - 81.6497

Объясните как из одного другое получаеться, а то на нужный угол (3Д) блок никак не наклонить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.03.2008, 15:23
#7
Александр Ривилис

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


Ну с группой 210 все понятно. Она содержит единичный вектор. И поэтому не (0.5 0.5 0.5) а (0.57735
0.57735 0.57735
). Ну а по поводу группы 10:
Код:
[Выделить все]
Command: (trans '(100 100 0) '(0.57735 0.57735 0.57735) 0) (-111.536 29.8858 
81.6497)
Ни о чем не говорит?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.03.2008, 15:59
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В общем теперь я совсем запутался - мне надо повернуть блок в 3D пространстве, таким образом, чтобы ось х относительно блока лежала на точках p1 p2, но точка вставки при этом не изменилась, повторюсь в 2D это достигается (cons 50 (angle p1 p2)), как подобное для 3D сделать???
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.03.2008, 16:27
#9
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


1.
Точка вставки при создании вхождения блока (DXF код 10) должна указываться в Системе Крдинат Объекта (СКО). Ось Z СКО определяется вектором нормали (код 210), ось X - векторным произведением оси Z МСК на вектор нормали (всегда лежит в плоскости XY МСК), ось Y -ортогонально осям Z и X так, чтобы образовывалась тройка векторов XYZ правого вращения.
Если желаемая точка вставки задана в МСК, то получить её значение в СКО можно так:
(setq oks_xyz (trans wcs_xyz 0 norm)), где
oks_xyz - список из 3х координат точки вставки (код 10),
wcs_xyz - список из трех координат желаемой точки всавки в МСК,
norm - список из трех чисел, определяющих вектор нормали для будущего примитива INSERT. Вектор нормали должен быть единичной длины!
Далее, при формировании списка entmake формируются следующие подсписки:
(list ..... (cons 10 oks_xyz) ......(cons 210 norm)...)

2.
DXF код 50 позволяет дополнительно повернуть INSERT вокруг точки вставки на требуемый угол.

3.
В общем случае, если требуется вставка блока в конкретную точку некоторой произвольно ориентированной ПСК (заданной направлениями осей и точкой начала координат) с требуемым углом поворота относительно направления X этой ПСК, то напавление оси Z этой ПСК необходимо взять в качестве вектора нормали, вычислить для данной ПСК углы Эйлера (нутации, прецессии и чистого вращения), используя угол чистого вращения пересчитать координаты точки вставки блока из ПСК в СКО и прибавить угол чистого вращения к требуемому углу поворота вставки относительно направления X ПСК, чтобы получить угол для точечной пары с кодом 50.
Pastor вне форума  
 
Непрочитано 05.03.2008, 16:32
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
В общем теперь я совсем запутался - мне надо повернуть блок в 3D пространстве, таким образом, чтобы ось х относительно блока лежала на точках p1 p2, но точка вставки при этом не изменилась, повторюсь в 2D это достигается (cons 50 (angle p1 p2)), как подобное для 3D сделать???
Тогда, попробую распутать.
Первым делом отделим мух и котлеты. 210 код - содержит вектор нормали плоскости, другими словами, в нем содержится точка, направление на которую из центра координат, будет перпендикулярно плоскости блока. Для внутренней системы координат блока, это будет направление Z. Теперь про угол, который скрывается за кодом 50 - это угол вращения в плоскости. Если все это обобщить, то 210 код и точка вставки, определяют единственно возможную плоскость, а код 50, определяет направление X на этой плоскости...
Елпанов Евгений вне форума  
 
Непрочитано 05.03.2008, 16:37
#11
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
Вектор нормали должен быть единичной длины!
По моим наблюдениям, в примитив можно пихать вектор любой длинны...
Елпанов Евгений вне форума  
 
Непрочитано 05.03.2008, 17:15
#12
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
а код 50, определяет направление X на этой плоскости...
Осталось сказать, относительно чего?
Pastor вне форума  
 
Непрочитано 06.03.2008, 13:31
#13
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Осталось сказать, относительно чего?
относительно точки вставки, вокруг вектора нормали

>> суть проблемы - хочу сориентировать блок в 3Д пространстве по 2 3Д точкам (p1 p2)

чтобы однозначно сориентировать объект нужно 3 вектора (можно 2, третий вычисляется их векторным произвидением)
или 1 но тогда еще нужно хранить угол поворота новой системы координат относительно мировой
посмотри в атокадовской справке "DXF Reference/Arbitrary Axis Algorithm" - так расчитываются базисные вектора, + плюс для блоков всё это дело поворачивается на "DXF код 50"
zamtmn вне форума  
 
Автор темы   Непрочитано 06.03.2008, 14:01
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Всем большое спасибо - решил следующим образом:

(entmakex ......
(append '(10) (trans p1 0
(list (- (car p2) (car p1))
(- (cadr p2) (cadr p1))
(- (caddr p2) (caddr p1))
)))
(list 210 (- (car p2) (car p1))
(- (cadr p2) (cadr p1))
(- (caddr p2) (caddr p1))
)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Dxf группа 210



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт DXF файла в МОНОМАХ Bublik 22 Мономах 30 19.01.2017 11:38
как открыть DXF файл с новыми типами линий МихаилМ AutoCAD 7 20.01.2010 19:28
Чем отличается DXF от DWG? Петич AutoCAD 2 28.05.2007 22:37
пример простейшего dxf файла, содержащего SPLINE hidjab Программирование 2 16.02.2007 10:29
Пакетный перегон dxf -> dwg возможно ли ? bdfy AutoCAD 4 15.11.2006 21:41