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

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

Изменение выравнивания атрибута блока в зависимости от положения атрибута относительно блока

Ответ
Поиск в этой теме
Непрочитано 07.04.2020, 12:11 #1
Изменение выравнивания атрибута блока в зависимости от положения атрибута относительно блока
BIKE-off
 
Регистрация: 17.06.2011
Сообщений: 19

Если атрибут блока находится справа от самого блока и у этого атрибута параметр выравнивания задан как "Середина справа", то при изменении значения атрибута на более длинное, атрибут "наедет" на блок.
Вот бы такой LISP, который позволяет массово изменить параметр выравнивания атрибутов относительно их блоков, то есть если атрибут справа, то изменить ему параметр выравнивания на "Середина слева", не меняя положения самого атрибута.

Примерно как на слайде:


Логика такая: выбираем атрибут, выбираем блоки (или все), атрибутам задаётся нужный параметр выравнивания.
Что-то подобное MvAtt / RoAtt / EdAtt, но здесь выравнивание задаётся одинаковое. И для многострочных атрибутов у меня не заработало
Просмотров: 1716
 
Автор темы   Непрочитано 14.04.2020, 12:23
#2
BIKE-off


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


Собрал LISP с требуемым результатом из двух других, используемых мной (авторов указал в комментариях).
Поскольку программистом меня можно назвать только условно, то что получилось, то получилось.
С однострочными атрибутами работает некорректно, поскольку "Особенности примитивов TEXT и ATTRIB", но многострочные атрибуты с нулевой шириной, которые мне и были нужны, обрабатывает вроде бы правильно (проверял в AutoCAD 2020 - English).

Может кому ещё пригодится .

Код:
[Выделить все]
 
;;;Программа для изменения выравнивания многострочного атрибута блока в зависимости от положения центра атрибута относительно точки вставки блока
;;;Для запуска программы набрать в командной строке: aliAtt
;;;Указать нужный атрибут, затем выбрать область чертежа, в которой будет производиться изменение выравнивания
;;;
;;;Автор: Байков Виталий (aka BIKE-off) + авторы заимствованных фрагментов

(defun c:aliAtt (/)

  (vl-load-com)

;;;  ===============================================================================
;;;  Фрагмент из программы RNM (автор: Гуськов Вячеслав)
;;;  Позволяет выбрать атрибут с отслеживанием правильности выбора и выходом по ESC
;;;  ===============================================================================

  (defun *error* (msg)
    (princ
      "\n<<  Принудительное завершение работы программы  >>"
    ) ;_ end of princ
    (cond
      ((not msg))
      ((member msg '("Function cancelled" "quit / exit abort")))
      ((princ (strcat "\nError: " msg))
       (cond (*debug* (vl-bt)))
      )
    ) ;_ end of cond
  ) ;_ end of defun

  (setq nm   nil
        att0 nil
  ) ;_ end of setq
  (while (null (and nm (car (member nm '("ATTRIB")))))
                                        ; в оригинале был список "TEXT" "MTEXT" "INSERT"
    (setq
      att0 (car
             (nentsel
               "\n\n>>  Выберите атрибут (  Для выхода нажмите ESC )"
             ) ;_ end of nentsel
           ) ;_ end of car
    ) ;_ end of setq
    (while (null att0)
      (setq att0
             (car
               (nentsel
                 "\n<<  Объект не выбран, повторите  ( Для выхода нажмите ESC ) >>"
               ) ;_ end of nentsel
             ) ;_ end of car
      ) ;_ end of setq
    ) ;_ end of while
    (setq nm (cdr (assoc 0 (entget att0))))
    (if (and nm (member nm '("ATTRIB"))); в оригинале был список "TEXT" "MTEXT" "INSERT"
      (princ "\n>>  Выберите область вхождения блоков  ")
      (princ "\n<<  Ошибка. Неправильный выбор объекта  >>")
    )                                   ;if
  )                                     ;while

;;;  ===============================================================================
;;;  Конец фрагмента из программы RNM
;;;  ===============================================================================


  (setq att_name (cdr (assoc 2 (entget att0))))
                                        ;ТЭГ атрибута
  (setq blc0 (cdr (assoc -1 (entget (cdr (assoc 330 (entget att0)))))))
                                        ;блок


;;;  ===============================================================================
;;;  Фрагмент из программы CBN (автор: Ющенко Александр)
;;;  Получает блок, и создаёт набор таких блоков из указанной области чертежа
;;;  ===============================================================================


  (setq block_name
         (vla-get-EffectiveName (vlax-ename->vla-object blc0))
  ) ;_ end of setq
  (setq block_set (ssget (list (cons 0 "INSERT"))))
  (setq n (sslength block_set)
        i 0
  ) ;_ end of setq
  (setq items_to_del nil)
  (while (< i n)                        ;cond
    (if (not (= block_name
                (vla-get-EffectiveName
                  (vlax-ename->vla-object (ssname block_set i))
                ) ;_ end of vla-get-EffectiveName
             ) ;_ end of =
        ) ;_ end of not
      (progn                            ;true
        (if (not (vl-consp items_to_del))
                                        ;если нет списка items_to_del (true - создаем его, если есть (false) заполняем
          (progn                        ;true
            (setq items_to_del (list (ssname block_set i)))
          ) ;_ end of progn
          (progn                        ;false
            (setq items_to_del (cons (ssname block_set i) items_to_del))
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
    (setq i (1+ i))                     ;iteration
  )                                     ;while
  (setq n (length items_to_del)
        i 0
  ) ;_ end of setq
  (while (< i n)                        ;cond
    (setq block_set (ssdel (nth i items_to_del) block_set))
    (setq i (1+ i))                     ;iteration
  ) ;_ end of while


;;;  ===============================================================================
;;;  Конец фрагмента из программы CBM
;;;  ===============================================================================



  (setq i1 0)                           ;первый блок
  (while
    (/= i1 (sslength block_set))
     (setq b1 (vlax-ename->vla-object (ssname block_set i1)))
     (setq att1 (entnext (vlax-vla-object->ename b1)))
     (while
       (/= (cdr (assoc 2 (entget att1))) att_name)
                                        ;проверка на совпадение ТЭГа требуемому
        (setq att1 (entnext att1))
     ) ;_ end of while
     (setq a1 att1)

     (setq a1 (vlax-ename->vla-object a1)) ;атрибут

     (vla-put-Alignment a1 acAlignmentMiddleCenter)
                                        ;выравнивание "СЦ" для определения положения атрибута

     (setq c1 (vlax-safearray->list
                (vlax-variant-value (vla-get-TextAlignmentPoint a1))
                                        ;координаты точки выравнивания атрибута
              ) ;_ end of vlax-safearray->list
     ) ;_ end of setq
     (setq c2 (vlax-safearray->list
                (vlax-variant-value (vla-get-InsertionPoint b1))
                                        ;координаты точки вставки блока
              ) ;_ end of vlax-safearray->list
     ) ;_ end of setq

     (if (= (vlax-get-property b1 'Rotation)
                                        ;при совпадении - минус угол поворота блока
            (vlax-get-property a1 'Rotation)
         ) ;_ end of =
       (progn
         (setq d1 (angle c2 c1))
         (setq d1 (- (angle c2 c1) (vlax-get-property b1 'Rotation)))
       ) ;_ end of progn
       (progn                           ;при несовпадении - минус угол поворота блока и минус угол поворота атрибута
         (setq d1 (- (angle c2 c1) (vlax-get-property b1 'Rotation)))
         (setq d1 (- d1
                     (- (vlax-get-property a1 'Rotation)
                        (vlax-get-property b1 'Rotation)
                     ) ;_ end of -
                  ) ;_ end of -
         ) ;_ end of setq
       ) ;_ end of progn
     ) ;_ end of if

     (setq d1 (atoi (angtos d1)))

     (setq d2
            (cond
              ((and (= (- (car c1) (car c2)) 0)
                    (= (- (cadr c1) (cadr c2)) 0)
               ) ;_ end of and
               10
              )                         ;при совпадении - выравнивание "СЦ"

              ((and (>= d1 0) (<= d1 15)) 9)
                                        ;для угла 0...15° выравнивание "СЛ" и т. д.
              ((and (> d1 15) (< d1 75)) 12)
              ((and (>= d1 75) (<= d1 105)) 13)
              ((and (> d1 105) (< d1 165)) 14)
              ((and (>= d1 165) (<= d1 195)) 11)
              ((and (> d1 195) (< d1 255)) 8)
              ((and (>= d1 255) (<= d1 285)) 7)
              ((and (> d1 285) (< d1 345)) 6)
              ((>= d1 345) 9)
            ) ;_ end of cond
     ) ;_ end of setq

     (vlax-put-property a1 'Alignment d2)
                                        ;требуемое выравнивание

     (setq i1 (1+ i1))                  ;следующий блок
  ) ;_ end of while


) ;_ end of defun

Вложения
Тип файла: lsp aliAtt.lsp (7.4 Кб, 13 просмотров)

Последний раз редактировалось BIKE-off, 19.04.2020 в 11:47. Причина: Добавлен учёт поворотов блока и атрибута
BIKE-off вне форума  
 
Автор темы   Непрочитано 19.04.2020, 11:52
#3
BIKE-off


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


Иногда нужно по месту быстро изменить выравнивание одного атрибута.

Сокращённый вариант LISP

Код:
[Выделить все]
 
;;;Программа для изменения выравнивания многострочного атрибута блока в зависимости от положения центра атрибута относительно точки вставки блока
;;;Для запуска программы набрать в командной строке: aliAttOne
;;;Указать нужный атрибут
;;;
;;;Автор: Байков Виталий (aka BIKE-off) + авторы заимствованных фрагментов

(defun c:aliAttOne (/)

  (vl-load-com)

;;;  ===============================================================================
;;;  Фрагмент из программы RNM (автор: Гуськов Вячеслав)
;;;  Позволяет выбрать атрибут с отслеживанием правильности выбора и выходом по ESC
;;;  ===============================================================================

  (defun *error* (msg)
    (princ
      "\n<<  Принудительное завершение работы программы  >>"
    ) ;_ end of princ
    (cond
      ((not msg))
      ((member msg '("Function cancelled" "quit / exit abort")))
      ((princ (strcat "\nError: " msg))
       (cond (*debug* (vl-bt)))
      )
    ) ;_ end of cond
  ) ;_ end of defun

  (setq nm   nil
        att0 nil
  ) ;_ end of setq
  (while (null (and nm (car (member nm '("ATTRIB")))))
                                        ; в оригинале был список "TEXT" "MTEXT" "INSERT"
    (setq
      att0 (car
             (nentsel
               "\n\n>>  Выберите атрибут (  Для выхода нажмите ESC )"
             ) ;_ end of nentsel
           ) ;_ end of car
    ) ;_ end of setq
    (while (null att0)
      (setq att0
             (car
               (nentsel
                 "\n<<  Объект не выбран, повторите  ( Для выхода нажмите ESC ) >>"
               ) ;_ end of nentsel
             ) ;_ end of car
      ) ;_ end of setq
    ) ;_ end of while
    (setq nm (cdr (assoc 0 (entget att0))))
    (if (and nm (member nm '("ATTRIB"))); в оригинале был список "TEXT" "MTEXT" "INSERT"
      (princ "\n>>  Выберите область вхождения блоков  ")
      (princ "\n<<  Ошибка. Неправильный выбор объекта  >>")
    )                                   ;if
  )                                     ;while

;;;  ===============================================================================
;;;  Конец фрагмента из программы RNM
;;;  ===============================================================================

  (setq b1 (vlax-ename->vla-object (cdr (assoc 330 (entget att0)))))
                                        ;блок
  (setq a1 (vlax-ename->vla-object att0)) ;атрибут

  (vla-put-Alignment a1 acAlignmentMiddleCenter)
                                        ;выравнивание "СЦ" для определения положения атрибута

  (setq c1 (vlax-safearray->list
             (vlax-variant-value (vla-get-TextAlignmentPoint a1))
                                        ;координаты точки выравнивания атрибута
           ) ;_ end of vlax-safearray->list
  ) ;_ end of setq
  (setq c2 (vlax-safearray->list
             (vlax-variant-value (vla-get-InsertionPoint b1))
                                        ;координаты точки вставки блока
           ) ;_ end of vlax-safearray->list
  ) ;_ end of setq

  (if (= (vlax-get-property b1 'Rotation)
                                        ;при совпадении - минус угол поворота блока
         (vlax-get-property a1 'Rotation)
      ) ;_ end of =
    (progn
      (setq d1 (angle c2 c1))
      (setq d1 (- (angle c2 c1) (vlax-get-property b1 'Rotation)))
    ) ;_ end of progn
    (progn                              ;при несовпадении - минус угол поворота блока и минус угол поворота атрибута
      (setq d1 (- (angle c2 c1) (vlax-get-property b1 'Rotation)))
      (setq d1 (- d1
                  (- (vlax-get-property a1 'Rotation)
                     (vlax-get-property b1 'Rotation)
                  ) ;_ end of -
               ) ;_ end of -
      ) ;_ end of setq
    ) ;_ end of progn
  ) ;_ end of if

  (setq d1 (atoi (angtos d1)))

  (setq d2
         (cond
           ((and (= (- (car c1) (car c2)) 0)
                 (= (- (cadr c1) (cadr c2)) 0)
            ) ;_ end of and
            10
           )                            ;при совпадении - выравнивание "СЦ"

           ((and (>= d1 0) (<= d1 15)) 9)
                                        ;для угла 0...15° выравнивание "СЛ" и т. д.
           ((and (> d1 15) (< d1 75)) 12)
           ((and (>= d1 75) (<= d1 105)) 13)
           ((and (> d1 105) (< d1 165)) 14)
           ((and (>= d1 165) (<= d1 195)) 11)
           ((and (> d1 195) (< d1 255)) 8)
           ((and (>= d1 255) (<= d1 285)) 7)
           ((and (> d1 285) (< d1 345)) 6)
           ((>= d1 345) 9)
         ) ;_ end of cond
  ) ;_ end of setq

  (vlax-put-property a1 'Alignment d2)
                                        ;требуемое выравнивание




) ;_ end of defun
Вложения
Тип файла: lsp aliAttOne.lsp (4.7 Кб, 10 просмотров)
BIKE-off вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение выравнивания атрибута блока в зависимости от положения атрибута относительно блока

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение атрибута блока , который находится в блоке (из пространства модели) konservnii LISP 17 28.03.2017 15:22
Нарушение порядка положения объектов относительно друг друга. ProPeller AutoCAD 17 06.10.2015 15:38
Дописать префикс/суффикс перед/после значения атрибута блока Liam AutoCAD 7 05.10.2013 23:05
Непонятное поведение многострочного атрибута блока Нитонисе AutoCAD 2 11.09.2010 17:35
Изменить поле (формула) атрибута блока EfremenkoDO Программирование 5 08.04.2010 11:43