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

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

Lisp для выравнивания аттрибутов блока

Ответ
Поиск в этой теме
Непрочитано 03.02.2020, 14:18 #1
Lisp для выравнивания аттрибутов блока
Serge_Y
 
инженер-конструктор
 
Минск
Регистрация: 29.05.2004
Сообщений: 381

День добрый!
Помогите пожалуйста допилить программку: в модели есть куча блоков с аттрибутами, при этом блоки повернуты под разными углами. Необходимо выровнять все аттрибуты горизонтально. В программке получилось их выровнять, но сами аттрибуты прилетели в точку вставки блока, а нужно, чтбы они оставались на своих местах.
Спасибо!
Код:
[Выделить все]
 (defun c:rotath  (/  objs) 
      (vl-load-com)
;;;		Block Specific Routine		;;;
(setq ang (cond ((getangle (strcat "\nEnter Angle:  <"
          (angtos (setq ang (cond ( ang ) ( 0.0 ))) 
          )  ">: " )))  ( ang )
  )
)
      (if (ssget "_:L" '((0 . "INSERT") ))
            (progn
                  (vlax-for
                         att  (setq objs (vla-get-ActiveSelectionSet
                                               (vla-get-ActiveDocument
                                                     (vlax-get-acad-object))))
                        (mapcar
                              '(lambda (a)
                                     (vla-put-rotation a ang)
                                     (vla-put-alignment
                                           a
                                           acAlignmentMiddleCenter)
                                     (vlax-put
                                           a
                                           'TextAlignmentPoint
                                           (vlax-get att 'InsertionPoint))
				 
                                     )
                              (vlax-invoke att 'Getattributes)
                              )
                        )
                  (vla-delete objs)
                  )
            )
      (princ)
      )
Просмотров: 1305
 
Непрочитано 03.02.2020, 14:33
#2
kp+

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


(vlax-get att 'InsertionPoint) в строке 24
Наверно, просто очепятка.
Ну и давать указателю на блок имя att - только себя запутывать.

Последний раз редактировалось kp+, 03.02.2020 в 14:44.
kp+ вне форума  
 
Непрочитано 03.02.2020, 15:03
#3
Кулик Алексей aka kpblc
Moderator

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


Без проверок:
Код:
[Выделить все]
 (defun c:rotath (/ adoc objs)
  (vl-load-com)
;;;		Block Specific Routine		;;;
  (setq ang (cond ((getangle (strcat "\nEnter Angle:  <"
                                     (angtos (setq ang (cond (ang)
                                                             (t 0.0)
                                                             ) ;_ end of cond
                                                   ) ;_ end of setq
                                             ) ;_ end of angtos
                                     ">: "
                                     ) ;_ end of strcat
                             ) ;_ end of getangle
                   )
                  (ang)
                  ) ;_ end of cond
        ) ;_ end of setq
  (if (ssget "_:L" '((0 . "INSERT") (66 . 1)))
    (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
           (foreach ref (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
             (vlax-for att (vla-getattributes ref)
               (foreach prop (list (cons "rotation" ang)
                                   (cons "alignment" acalignmentmiddlecenter)
                                   (cons "textalignmentpoint" (vla-get-insertionpoint att))
                                   ) ;_ end of list
                 (vl-catch-all-apply (function (lambda () (vlax-put-property att (car prop) (cdr prop)))))
                 ) ;_ end of foreach
               ) ;_ end of vlax-for
             ) ;_ end of foreach
           (vla-endundomark adoc)
           ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.02.2020, 15:33
#4
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Вот такое сообщение выдает:
bad argument type: lselsetp nil
Serge_Y вне форума  
 
Непрочитано 03.02.2020, 15:57
#5
kp+

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


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
Вот такое сообщение выдает:
bad argument type: lselsetp nil
Для начала попробуйте исправить очепятку, указанную в #2, в своей, вполне работоспособной проге.
kp+ вне форума  
 
Автор темы   Непрочитано 03.02.2020, 16:08
#6
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Простите мне мою недалекость, но я не соображу, что на что надо изменить:
(vlax-get att 'InsertionPoint) на (vlax-get a 'InsertionPoint) ? Если так, то все аттрибуты улетают в точку 0,0,0
Serge_Y вне форума  
 
Непрочитано 03.02.2020, 17:10
1 | #7
kp+

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


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
(vlax-get att 'InsertionPoint) на (vlax-get a 'InsertionPoint) ?
Да. В переменной att сидит указатель на блок, в переменной a - на атрибут. Т.к. Вам надо передвинуть атрибут из его точки выравнивания в его же точку вставки, то именно такая замена и нужна.

Цитата:
Сообщение от Serge_Y Посмотреть сообщение
Если так, то все аттрибуты улетают в точку 0,0,0
Странно, у меня (чистый Акад 2010) работает. На всякий случай проверил при смещенной и повернутой ПСК - тоже все нормально (т.к. не командные методы).
Надо смотреть Ваш dwg файл.
Честно говоря, замена точки выравнивания на точку вставки красоты не добавляет, скорее портит. Ради интереса закомментировал всю эту конструкцию с изменением точки вставки/выравнивания - так без нее на моих блоках результат выглядит более адекватно.

Последний раз редактировалось kp+, 03.02.2020 в 17:19.
kp+ вне форума  
 
Автор темы   Непрочитано 03.02.2020, 17:34
#8
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Цитата:
Сообщение от kp+ Посмотреть сообщение
Ради интереса закомментировал всю эту конструкцию с изменением точки вставки/выравнивания .
Повторил Ваш метод - все заработало!
Спасибо!!!
А без комментирования атрибуты улетают в ноль
Serge_Y вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp для выравнивания аттрибутов блока

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Помогите с лиспом по переименованию нескольких вхождений динамического блока в значение его атрибута. kirillwu LISP 43 09.07.2018 13:29
LISP. Вставка блока из чертежа исходя из двух параметров (длина и ширина) Kairat.iskakov LISP 6 17.05.2016 15:04
Lisp. авто-нумерация атрибута блока. DonJad LISP 10 26.10.2014 02:04
Доработка кодя для скрытия объектов блока (LISP) AndruxaZ LISP 2 22.09.2014 14:27
LISP. Сумма значений аттрибутов блоков. dirge LISP 8 16.07.2012 19:05