Продолжая войну с буфером обмена…

... и блоками вида A$C* :)

Статья, можно сказать, является продолжением О буфере обмена замолвим словечко…

Самое хорошее, конечно - это вообще такие блоки уничтожать. В принципе. Но ситуации бывают разные, и иногда приходится с ними работать. Можно переименовывать руками, но лично мне подобное проворачивать обычно лень. Проще уж программку написать :)

Логика программы достаточно проста: проходим по всем блокам, которые только есть в текущем документе. Исключаем блоки внешних ссылок. Если имя блока начинается на A$C, вперед добавляем какой-либо префикс, а в конец (на всякий случай) - счетчик таких блоков. Теоретически возможна ситуация, описанная в статье по ссылке - и тогда мало того что переименование не сработает, так еще и проблема решена не будет. Ну и до кучи - в случае ошибки переименования желательно выводить соответствующий отчет в ком.строке.

На данный момент код обрабатывает только текущий документ. Код оформлен функцией, чтобы можно было его загрузить в *.mnl или acad*doc.lsp и организовать его самовызов.

Сам код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
;; ver. 0.1

(vl-load-com)

(defun rename-copypaste (/ adoc name pref res_name err)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq pref "kpblc_")
  ;; тот самый префикс
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (setq name (vla-get-name blk_def)) (tblobjname "block" name) (wcmatch name "A$C*"))
      (if (vl-catch-all-error-p
            (setq err (vl-catch-all-apply
                        (function (lambda ()
                                    (vla-put-name
                                      blk_def
                                      (strcat (setq res_name (strcat pref name))
                                              "_"
                                              ;; И добавляем счетчик. Скорее всего, тут постоянно будет
                                              ;; только "0", но чем шут не чертит...
                                              (itoa ((lambda (/ res)
                                                       (setq res 0)
                                                       (vlax-for item (vla-get-blocks adoc)
                                                         (if (wcmatch (vla-get-name item) (strcat res_name "_*"))
                                                           (setq res (1+ res))
                                                           ) ;_ end of if
                                                         ) ;_ end of vlax-for
                                                       res
                                                       ) ;_ end of lambda
                                                     )
                                                    ) ;_ end of itoa
                                              ) ;_ end of strcat
                                      ) ;_ end of vla-put-name
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of vl-catch-all-error-p
        (princ (strcat "\nОшибка переименования блока " name " : " (vl-catch-all-error-message err)))
        ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

И ссылка на загрузку: rename-copypaste.lsp
Версия с командой rename-copypaste : rename-copypaste.lsp



Комментарии

Есть 8 коммент. к “Продолжая войну с буфером обмена…”
  1. Nikolay пишет:

    Алексей, спасибо за вашу работу. Можете подсказать как организовать работу функции, для запуска по команде из палитры, без набора (rename-copypaste)

  2. Кулик Алексей aka kpblc пишет:

    Для этого вместо

    1
    (defun rename-copypaste(

    достаточно использовать

    1
    (defun c:rename-copypaste(

    Я на Autodesk University 2017, когда читал по лиспу доклад, все это рассказывал. с - на английской раскладке. Двоеточие обязательно. Команду можно будет вызывать как rename-copypaste с ком.строки, палитры, меню - откуда угодно.

  3. Nikolay пишет:

    Исправил, все равно при запуске ^C^C^P(load "rename-copypaste");rename-copypaste; пишет неизвестная команда

    1
    2
    3
    4
    5
    6
    ;; ver. 0.1
    (defun C:rename-copypaste (/ adoc name pref res_name err)

    (vl-load-com)

      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  4. Кулик Алексей aka kpblc пишет:

    А если так: http://autolisp.ru/?attachment_id=3473

  5. Nikolay пишет:

    Все равно пишет ошибку

  6. Nikolay пишет:

    Все равно пишет ошибку, даже с новой версией.

  7. Кулик Алексей aka kpblc пишет:

    Ну чудес-то не бывает!

    Как забирать коды с сайта - описал в спойлере на страничке http://autolisp.ru/lisp_source_catalogue/ (сейчас специально дополнил именно для текущего случая)

    Если вручную загрузить lsp в AutoCAD - команда работает?

  8. Nikolay пишет:

    Странно после перезагрузки компьютера все заработало. Еще раз спасибо за помощь.

Поделитесь своим мнением


Я не робот.