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

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

Поворот текста в пространстве

Ответ
Поиск в этой теме
Непрочитано 19.08.2010, 14:26
Поворот текста в пространстве
katm___
 
Регистрация: 19.08.2010
Сообщений: 6

Нужен макрос для поворота текста из горизонтальной плоскости в вертикальную. Поворот должен осуществляться сразу для всего текста. Координаты текста не меняются. Причем должна быть возможность поворота текста не только вокруг оси Х но и вокруг оси Y, ось Z - вертикальная. Все что нашел на форуме не подходит, или криво сделано.
Исходный файл внизу. Если нет готового решения, то цену и сроки за работу мне на почту. Вопросы вниз.

Вложения
Тип файла: dwg
DWG 2004
A.dwg (34.5 Кб, 2830 просмотров)


Последний раз редактировалось katm___, 19.08.2010 в 15:41.
Просмотров: 12551
 
Непрочитано 21.08.2010, 16:49
#21
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Я врубился вы оба не понимаете что хочет автор вопроса
А автор понимает? Каков вопрос, таков ответ!
Вопрос: Вокруг какой оси X поворачивать? В какой системе координат? Если в мировой, то
Если в системе координат объекта, то
gomer вне форума  
 
Непрочитано 21.08.2010, 17:16
#22
Дима_

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


Я то собственно про то что в любой системе координат "сподручней" крутить текст не через vla или тем более комманные методы - а "правильно" изменяя dxf 210 (по сути как бы Вы не крутили только 210 и поменяеться), поэтому я и считаю что надо именно им оперировать. А про улетание в чертеже автора я уже писал в посте 13 (trans ...).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.08.2010 в 17:25.
Дима_ вне форума  
 
Непрочитано 21.08.2010, 17:28
#23
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я то собственно про то что в любой системе координат "сподручней" крутить текст не через vla или тем более комманные методы - а "правильно" изменяя dxf 210 (по сути как бы Вы не крутили только 210 и поменяеться), поэтому я и считаю что надо именно им оперировать.
Абсолютно несогласен в связи со сложностью определения
самого вектора 3d или матрицы поворота
Просто навскидку: как определишь нормаль для поворота
относительно оси Х на +30 град и относительно оси Y на -45 град?
А если еще относительно Z?
Не спорю что можно но на фига???

Я не математик (8 классов) так лучше как проще я думаю
(по крайней мере для простых юзеров)
Олег (jr.) вне форума  
 
Непрочитано 21.08.2010, 19:09
#24
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Тоже раз пытался написать что-то похожее, задача стояла выровнять текст по текущему виду.
Код:
[Выделить все]
(defun c:Text_on_the_USC (/ ss i temp)
  (if (setq
	i  -1
	ss (ssget ":L" '((0 . "TEXT")))
      )
    (repeat (sslength ss)
      (setq temp (entget (ssname ss (setq i (1+ i))))
	    temp (subst	(cons 10 (trans (cdr (assoc 10 temp)) 0 1))
			(assoc 10 temp)
			temp
		 )
	    temp (subst	(cons 210 (trans '(0 0 1) 1 0 T))
			(assoc 210 temp)
			temp
		 )
	    temp (subst '(50 . 0)
			(assoc 50 temp)
			temp)
	        )
      (entmod temp)
    )
  )
)
работает совсем не корректно
[IMG]http://s61.***********/i173/1008/c0/705286e80679.gif[/IMG]
, кажется надо что-то с 11 группой тоже сделать
По-моему получилась бы полезная команда, может кто из умных поможет...
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 21.08.2010, 21:17
#25
Кулик Алексей aka kpblc
Moderator

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


Не только 11, но и 10, похоже...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.08.2010, 22:37
#26
Дима_

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


Насчет 11 не знаю (пусть крутиться не убежит), все что я подразумевал:
Код:
[Выделить все]
(mapcar '(lambda (lst)
           (entmod (subst (list 210 0 -1 0)
                          (assoc 210 lst)
                          (subst (cons 10 (trans (cdr (assoc 10 lst))
                                                 (cdr (assoc 210 lst))
                                                 '(0 -1 0)))
                                 (assoc 10 lst)
                                 lst))))
        (mapcar 'entget (sstolist (ssget (list (cons 0 "*text"))))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.08.2010, 23:40
#27
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


В самом общем виде, когда dxf-210 не совпадает с 0,0,1, действительные координаты начальной точки текста не совпадает с dxf-10.
Например, если создать повернутый в пространстве текст, поместить в его начало точку и посмотреть dxf-10 коды этих объектов, обнаружим три большие разницы:
((-1 . <Имя объекта: 7ef9f608>) (0 . "TEXT") (330 . <Имя объекта: 7ef9bcf8>) (5 . "669") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 3530.38 559.743 235.689) (40 . 125.976) (1 . "повернутый текст") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 235.689) (210 -0.666667 0.666667 0.333333) (100 . "AcDbText") (73 . 0))

((-1 . <Имя объекта: 7ef9f810>) (0 . "POINT") (330 . <Имя объекта: 7ef9bcf8>) (5 . "6A2") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPoint") (10 -2521.55 -2471.16 606.294) (210 0.0 0.0 1.0) (50 . 0.0))

Скорее всего dxf-10 текста являются проекциями нач. точки текста на плоскость, проходящую через 0,0,0 и
перпендикулярную вектору dxf-210 (первые две координаты) и на сам вектор dxf-210 (третья координата).
Т.е. для сохранения действительных координат начала текста (чтобы текст не "улетал") надо при
изменении dxf-210 пересчитывать dxf-10.

Последний раз редактировалось Li6-D, 21.08.2010 в 23:58.
Li6-D вне форума  
 
Непрочитано 22.08.2010, 00:06
#28
Кулик Алексей aka kpblc
Moderator

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


DXF Reference не пробовали прочитать?
Цитата:
10 First alignment point (in OCS)
11 Second alignment point (in OCS) (optional)
210 Extrusion direction (optional; default = 0, 0, 1)
Дополнительно : http://www.arcada.com.ua/forum/viewtopic.php?t=653
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2010, 00:13
#29
zamtmn

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


Всегда было интересно, почему програмисты на AutoLISP усиленно крутят вектор нормали, а не как все пользуют матрицы?
zamtmn вне форума  
 
Непрочитано 22.08.2010, 00:46
#30
Дима_

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


Потому-что в dxf представлении есть координата по вектору нормали, былаб-там матрица - крутили-бы ее. (Что-то типа нам побоку что крутить, в чем написано в том и крутим). Так-же как химики вес колбасы в молях считают, а японцы с правым рулем ездят.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 22.08.2010, 00:47
#31
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Уточнение к посту #27 в связи с замечанием #28:
При изменении dxf-210 если dxf-72 и dxf-73 = 0 пересчитывать надо только dxf-10, если dxf-72 = 3 или 5 пересчитываем dxf-10 и dxf-11, в остальных случаях - только dxf-11.
Теперь правильно?
Li6-D вне форума  
 
Непрочитано 22.08.2010, 00:55
#32
zamtmn

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


Насколько я понимаю матрицы системы координат объекта нет только формально, ее можно получить (я не прав?), также есть vla-TransformBy - можно воздействовать на примитив любой матрицей преобразования. Зачем эти головняки с 210, 10, 11 и 50?
zamtmn вне форума  
 
Непрочитано 22.08.2010, 23:26
1 | #33
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Попробуйте покрутить с этим:

Код:
[Выделить все]
(defun C:TXT-ROTATE3D ( / axis ang ss i obj P)
  (vl-load-com)
  (initget "X Y")
  (setq axis (if (= (getkword "\nУкажите ось поворота текста [X/Y] <Y>: ") "X")
              '(1 0 0)
              '(0 1 0)
  )          )
  (initget 1)
  (setq ang (getangle "\nУкажите угол поворота текста в градусах: "))
  (repeat (if (setq ss (ssget '((0 . "TEXT"))))
            (setq i (sslength ss))
            (progn (alert "Текст не указан") 0)
          )
    (setq i (1- i)
          obj (entget (ssname ss i))
          P (trans (cdr (assoc 10 obj)) (cdr (assoc 210 obj)) 0)
    )          
    (vla-rotate3D
      (vlax-ename->vla-object (cdar obj))
      (vlax-3D-point P)
      (vlax-3D-point (mapcar '+ P axis))
      ang
    )
  )
  (princ)
)
При повороте остаются неподвижными начальные точки текста.
Если задать угол 90 - текст будет повернут на pi/2 против часовой стрелки вокруг выбранной оси (X или Y), минус 90 - по часовой стрелке.
Можно утрировать программу исключив выбор текста (будет повернут весь текст в рисунке) и исключить ввод значения угла (будет запрошено направление поворота на pi/2 - по или против часовой стрелки)

Последний раз редактировалось Li6-D, 22.08.2010 в 23:34.
Li6-D вне форума  
 
Непрочитано 25.08.2010, 10:44
#34
kp+

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


Offtop: Автор темы, ты где? Что скажешь? Тема уже живет своей собственной жизнью. Значит, это нужная тема
kp+ вне форума  
 
Непрочитано 25.08.2010, 11:35
#35
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


По сути обозначилось два подхода к повороту текста в пространстве:
  1. Путем rotate3d или vla-rotate3d;
  2. Трансфомация через dxf-entmod или vla-transformby.
с первым лично мне не понятно как точно вычислить вторую точку оси поворота
со вторым мне вообще ничего не понятно
gomer вне форума  
 
Непрочитано 25.08.2010, 14:14
#36
kp+

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Путем rotate3d или vla-rotate3d
Цитата:
Сообщение от gomer Посмотреть сообщение
с первым лично мне не понятно как точно вычислить вторую точку оси поворота
вот так:
Код:
[Выделить все]
    (setq pt2_mts (list
		    (+ 0.0 (car pt2_mts))
		    (+ 1.0 (cadr pt2_mts))
		    (+ 0.0 (caddr pt2_mts))
    		  )
    )
это если поворот вокруг Y
kp+ вне форума  
 
Непрочитано 25.08.2010, 15:50
#37
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от kp+ Посмотреть сообщение
вот так:
Результат не предсказуем, в случае если текст произвольно в пространстве висит...
А если рассматривать текст как прямоугольник и поворачивать его вокруг большей или меньшей сторон
gomer вне форума  
 
Непрочитано 26.08.2010, 00:01
1 | #38
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Ну вот общая программа для 3D поворота текста, включая пожелание:
Цитата:
Сообщение от gomer Посмотреть сообщение
А если рассматривать текст как прямоугольник и поворачивать его вокруг большей или меньшей сторон
По сравнению с программой поста #33 может крутить строки и вокруг точек вставки.
Обе программы работают для любых углов поворота, любого положения текста в пространстве.
Код:
[Выделить все]
(defun C:TXT-ROTATE3D ( / RP RA P ang ss i obj)
  ;;; Программа для поворота строк текста в пространстве.
  ;;; Строки поворачиваются вокруг точек вставки или начальных точек.
  ;;; Оси поворота:
  ;;; B (перпендикулярны текущей плоскости строк);
  ;;; H (расположены по высоте строк);
  ;;; L (расположены вдоль строк);
  ;;; X,Y,Z или 2точки - тут всё ясно.
  ;;; http://forum.dwg.ru/showthread.php?t=56192&page=2 (©Li6-D)
  (vl-load-com)
  (initget "I L")
  (setq RP (getkword "\nУкажите вид точки на осях поворота строк - вставки [i], левая [L] <I>: ")
        RP (if (= RP "L")
            '(cdr (assoc 10 obj))
            '(cdr
               (assoc
                 (if (or (zerop (+ (cdr (assoc 72 obj)) (cdr (assoc 73 obj))))
                         (member (cdr (assoc 72 obj)) '(3 5))) 10 11)
                 obj
  )        ) ) )
  (initget "B H L X Y Z 2точки")
  (setq RA (getkword "\nУкажите оси поворота строк [B/H/L/X/Y/Z/2точки] <2точки>: ")
        RA (cond
             ((= RA "B") '(trans (mapcar '+ P '(0 0 1)) (cdr (assoc 210 obj)) 0))
             ((= RA "H")
              '(trans
                 (polar P (+ (cdr (assoc 50 obj)) (/ pi 2)) 1)
                 (cdr (assoc 210 obj))
                 0
             ) )
             ((= RA "L") '(trans (polar P (cdr (assoc 50 obj)) 1) (cdr (assoc 210 obj)) 0))
             ((= RA "X") '(mapcar '+ (trans P (cdr (assoc 210 obj)) 0) '(1 0 0)))
             ((= RA "Y") '(mapcar '+ (trans P (cdr (assoc 210 obj)) 0) '(0 1 0)))
             ((= RA "Z") '(mapcar '+ (trans P (cdr (assoc 210 obj)) 0) '(0 0 1)))
             (t (initget 9)
                (setq P (getpoint "\nУкажите первую точку: "))
                (initget 41)
                (append
                 '(mapcar '+ (trans P (cdr (assoc 210 obj)) 0)) 
                  (list (list 'quote (mapcar '- (getpoint P "\nУкажите вторую точку: ") P)))
  )        ) )  )
  (initget 1)
  (setq ang (getangle "\nУкажите угол поворота строк текста в градусах: "))
  (repeat (if (setq ss (ssget '((0 . "TEXT"))))
            (setq i (sslength ss))
            (progn (alert "Текст не указан") 0)
          )
    (setq i (1- i) obj (entget (ssname ss i)) P (eval RP))
    (vla-rotate3D
      (vlax-ename->vla-object (cdar obj))
      (vlax-3D-point (trans P (cdr (assoc 210 obj)) 0))
      (vlax-3D-point (eval RA))
      ang
  ) )
  (princ)
)

Последний раз редактировалось Li6-D, 29.08.2010 в 13:00. Причина: Решение обобщенной задачи
Li6-D вне форума  
 
Автор темы   Непрочитано 20.03.2013, 22:22 Итог
#39
katm___


 
Регистрация: 19.08.2010
Сообщений: 6


Этот вариант работает отлично, также и более ранняя версия работала, причем она даже проще
katm___ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Поворот текста в пространстве



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Поворот текста klinker AutoCAD 9 20.10.2010 09:52
Научите правильно чертить Dr_Zlo AutoCAD 112 03.03.2009 08:31
Поворот текста в таблице Мишаня AutoCAD 2 24.04.2007 12:10