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

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

Выравнивание текста и блоков относительно кривой.

Ответ
Поиск в этой теме
Непрочитано 18.06.2009, 14:44 #1
Выравнивание текста и блоков относительно кривой.
Jeriko
 
Регистрация: 18.06.2009
Сообщений: 118

Доброго времени суток.
Есть план трассы трубопровода в виде полилинии, на всем его протяжении куча текста, блоков и тд под разным углом. Существуют ли какиенибудь макросы или лиспы, что бы автоматически выровнять текст и блоки параллельно полилинии?
Просмотров: 7691
 
Непрочитано 18.06.2009, 16:14
#2
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Автоматически не могу предложить. Только с кликами. Делал для блоков но работает и для текстов как ни странно. Клик по полилинии а потом кликай по текстам
Код:
[Выделить все]
(defun C:11 ( / bl lw prm proiz ugol_pl ugol_pl_gr spis_blk ugol_t
                 kor_blok P-ugol ugol_rad ugol_grad ugol-povorota)
(setq lw (entsel "\n Select segment in a polyline. "))
(repeat 20
(setq bl (car(entsel "\n Select blok")))
(setq prm  (vlax-curve-getParamAtPoint
              (car lw)
              (vlax-curve-getClosestPointTo (car lw) (cadr lw))
              )) ;_  vlax-curve-getParamAtPoin
(setq proiz (vlax-curve-getFirstDeriv (car lw) prm))
(setq ugol_pl (angle '(0 0 0) proiz))
(setq ugol_pl_gr (* ugol_pl 57.29747))
(setq spis_blk (entget bl)); spiisok bloka 
(setq kor_blok (cdr(assoc 10 spis_blk))); tochka vstavki(x y z)        
(setq P-ugol (assoc 50 spis_blk));para ugol
(setq ugol_rad  (cdr P-ugol)) ;ugol v rad                          
(setq ugol_grad (* ugol_rad 57.29747)) ;ugol v grad
(setq ugol-povorota (- ugol_pl_gr ugol_grad))           
(setq ugol_t (+ ugol-povorota ugol_grad))
(if (and(> ugol_t 90)(< ugol_t 270))
    (setq ugol-povorota (- ugol-povorota 180)))
(command "_rotate" bl "" kor_blok ugol-povorota)
)
)

Последний раз редактировалось Кулик Алексей aka kpblc, 18.06.2009 в 23:42.
Victor вне форума  
 
Автор темы   Непрочитано 18.06.2009, 16:30
#3
Jeriko


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


Victor То что нужно, огромное Вам, спасибо!
Jeriko вне форума  
 
Непрочитано 18.06.2009, 23:42
#4
Кулик Алексей aka kpblc
Moderator

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


Victor, про тэг CODE не забывай
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2011, 21:57
#5
msilk


 
Регистрация: 06.08.2009
Сообщений: 31
<phrase 1=


Интересно...а есть такой лисп,который бы текст,не параллельно а перпендикулярно выравнивал выбранной линии.
msilk вне форума  
 
Непрочитано 18.09.2011, 23:14
#6
Кулик Алексей aka kpblc
Moderator

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


Как вариант:
Код:
[Выделить все]
 (vl-load-com)

(defun c:complex-align (/ adoc ang ent selset)

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if
    (and (= (type (setq ent (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (car (entsel "\nУкажите кривую <Отмена> : "))
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'ename
            ) ;_ end of =
         (wcmatch (cdr (assoc 0 (entget ent))) "*LINE")
         (setq ent (vlax-ename->vla-object ent))
         (= (type (setq selset (vl-catch-all-apply
                                 (function
                                   (lambda ()
                                     (ssget "_:L" '((0 . "TEXT,INSERT")))
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                                 ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'pickset
            ) ;_ end of =
         (= (type
              (setq
                ang
                 (vl-catch-all-apply
                   (function
                     (lambda ()
                       (cond
                         ((getangle
                            "\nУкажите угол поворота, градусов (0 - параллельно ближайшей точке; 90 - перпендикулярно <0> : "
                            ) ;_ end of getangle
                          )
                         (t 0.)
                         ) ;_ end of cond
                       ) ;_ end of lambda
                     ) ;_ end of function
                   ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
            'real
            ) ;_ end of =

         ) ;_ end of and
     (foreach item (mapcar (function vlax-ename->vla-object)
                           ((lambda (/ tab item)
                              (repeat (setq tab  nil
                                            item (sslength selset)
                                            ) ;_ end setq
                                (setq tab (cons (ssname selset (setq item (1- item))) tab))
                                ) ;_ end of repeat
                              ) ;_ end of lambda
                            )
                           ) ;_ end of mapcar
       (vl-catch-all-apply
         (function
           (lambda ()
             (vla-put-rotation
               item
               (+ ang
                  (angle
                    '(0. 0. 0.)
                    (vlax-curve-getfirstderiv
                      ent
                      (vlax-curve-getparamatpoint
                        ent
                        (vlax-curve-getclosestpointto
                          ent
                          (vlax-safearray->list
                            (vlax-variant-value
                              (cond
                                ((and
                                   (vlax-property-available-p item 'textalignmentpoint)
                                   (not
                                     (equal (vlax-safearray->list (vlax-variant-value (vla-get-textalignmentpoint item)))
                                            '(0. 0. 0.)
                                            1e-6
                                            ) ;_ end of equal
                                     ) ;_ end of not
                                   ) ;_ end of and
                                 (vla-get-textalignmentpoint item)
                                 )
                                (t (vla-get-insertionpoint item))
                                ) ;_ end of cond
                              ) ;_ end of vlax-variant-value
                            ) ;_ end of vlax-safearray->list
                          ) ;_ end of vlax-curve-getClosestPointTo
                        ) ;_ end of vlax-curve-getParamAtPoint
                      ) ;_ end of vlax-curve-getfirstderiv
                    ) ;_ end of angle
                  ) ;_ end of +
               ) ;_ end of vla-put-Rotation
             ) ;_ end of lambda
           ) ;_ end of function
         ) ;_ end of vl-catch-all-apply
       ) ;_ end of foreach
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2011, 09:17
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Еще вариант Вставка объектов под заданным углом к кривой
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.09.2011, 13:21
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Align Objects to Curve



Align Text, MText or Attribute to Curve

__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось Кулик Алексей aka kpblc, 28.10.2011 в 09:34.
VVA вне форума  
 
Непрочитано 19.09.2011, 15:18
#9
Кулик Алексей aka kpblc
Moderator

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


Не, ну так неинтересно У LeeMac, гляжу, вообще все есть
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2011, 19:42
#10
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Может будет кому-то интересно. Анимация к ссылке в посте #7
Миниатюры
Нажмите на изображение для увеличения
Название: 5.gif
Просмотров: 299
Размер:	444.3 Кб
ID:	66402  Нажмите на изображение для увеличения
Название: 8.gif
Просмотров: 272
Размер:	450.5 Кб
ID:	66403  
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.09.2011, 23:59
#11
msilk


 
Регистрация: 06.08.2009
Сообщений: 31
<phrase 1=


Я в восхищении!!! Во первых огромное спасибо всем за супер оперативные ответы. И то что предложил VVA это то что нужно, 5 баллов!!! А программка TararykovDG тоже очень хороша,она мне пригодиться! Еще раз Всем спасибо!!!

Последний раз редактировалось msilk, 20.09.2011 в 00:08.
msilk вне форума  
 
Непрочитано 22.09.2011, 15:41
#12
angel-fear

инженер-электрик
 
Регистрация: 21.10.2010
Краснодар
Сообщений: 134


А можно сделать нечто похожее на пост 7 или 8, но так, чтобы можно было выравнивать объекты листа относительно объектов модели?
angel-fear вне форума  
 
Непрочитано 23.09.2011, 09:57
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


angel-fear, Думаю что нет. Но можно с помощью _CHSPACE перенести копию объекта модели в лист, затем использовать любой понравившийся лисп, а копию потом удалить.
Можно 3 команды (переход в модель, копирование выбранного объекта и перенос в пространство листа) объединить одной.
Код:
[Выделить все]
(defun C:C2L ( / Express ss obj en)
    ;;;Copy 2 Layout
  (vl-load-com)
  (setq Express
    (and (vl-position "acetutil.arx" (arx))
      (not
        (vl-catch-all-error-p
          (vl-catch-all-apply
            (function (lambda nil (acet-sys-shift-down)))
          )
        )
      )
    )
  )
  (cond
    ((not(zerop (getvar 'tilemode)))
     (cond
        (Express
          (acet-ui-message "Not working in Model space" "Warning" 16)
        )
        (t
          (princ "\n** Not working in Model space **")
        )
      )
     )
    (t
     (if (= (getvar "cvport") 1)(command "_.MSPACE"))
     (setq ss (ssget "_:E:S:L" '((0 . "*LINE,CIRCLE,ACR,ELLIPSE"))))
     (setq obj (vla-copy (vlax-ename->vla-object(ssname ss 0)))
           en (vlax-vla-object->ename obj)
           )
     (command "_.CHSPACE" en "" "")
     (SSSETFIRST nil (ssadd en))
     )
    )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.09.2011, 12:46
#14
angel-fear

инженер-электрик
 
Регистрация: 21.10.2010
Краснодар
Сообщений: 134


Прерывается ошибкой:

_.MSPACE
Команда:
Выберите объекты:
; ошибка: неверный тип аргумента: lselsetp nil

или работает только с LINE,CIRCLE,ACR,ELLIPSE? сюда же можно добавить TEXT, MTEXT, размерные линии и прочее....
angel-fear вне форума  
 
Непрочитано 28.10.2011, 09:21
#15
Nata1

Инженер
 
Регистрация: 10.11.2008
Владимирская обл., пос. Вольгинский
Сообщений: 147


Цитата:
Сообщение от VVA Посмотреть сообщение
У меня этот лисп "ObjectAlignV1-1.lsp" с сайта lee-mac не работает. Выбираю объект для выравнивания, задаю точку привязки, потом выбираю кривую, куда будут выравниваться объекты и в командной строке есть только вариант <Exit>. Далее при нажатии Ентера или кнопки мыши выравниваемые объекты просто исчезают. Что-то там в коде не так...
Код опробовала на 2004 автокаде.
PS
Еще раз проверила. Работает, но объекты далеко от кривой "улетают" почему-то.
__________________
AutoCAD 2014

Последний раз редактировалось Nata1, 28.10.2011 в 11:07.
Nata1 вне форума  
 
Непрочитано 05.12.2011, 19:01
#16
La Persona

Чайник
 
Регистрация: 01.12.2011
Сообщений: 27


Вопрос примерно из той же оперы, только несколько иной. Вдоль полилинии расставлены блоки. Рядом с каждым блоком надо автоматически проставить мтекст так, чтобы он не пересекался с полилинией (т.е. если мтекст пересекается с полилинией, он должен ставится с другой стороны от нее). Буду благодарен хотя бы за идею, как это организовать..
La Persona вне форума  
 
Непрочитано 10.06.2014, 13:51
#17
RAD24


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


Здравствуйте! Можете подсказать выравнивание текста, относительно других объектов, таким образом что бы исключалось их наложение друг на друга (что бы текст сдвигался с линий( полилиний, блоков, другого текста)-не было пересечений?
RAD24 вне форума  
 
Непрочитано 11.06.2014, 13:58
#18
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


это как можно получить такой эффект (пост 7 и 15), чтобы объект двигался за мышкой.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 11.06.2014, 14:43
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


nolte, grread
http://forums.autodesk.com/t5/Visual...d/td-p/2706707
Examples of usage GRREAD - let's share
Динамические построения
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выравнивание текста и блоков относительно кривой.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Выравнивание текста pasha_1977 AutoCAD 12 16.03.2020 18:27
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Autocad 2008 не вызывается редактор текста и редактор блоков Влад AutoCAD 2 08.10.2007 08:10
Где хранятся координаты полки выноски ОТНОСИТЕЛЬНО ТЕКСТА? kp+ Программирование 2 31.07.2006 09:55