Тема: LISP. Очистка чертежа от пустого текста

Довольно часто после взрывания блоков командой burst остаётся невидимй и не выбираемый рамкой текст, содержащий пустую строку "" или пробелы " ". Иногда мне приходят чертежи с такими приколами. Замечаешь их когда делаеш показать весь чертёж или выбор всего. Эти текстовые объекты можно выделить поиском текста, а потом удалить.
Написаная ниже прога удаляет все пустые текстовые объекты.

;;;(c:z-clear-empty-text)
(defun c:z-clear-empty-text (/ ss)
  (setq ss (ssget "x" '((0 . "TEXT,MTEXT"))))
  (if ss
    (mapcar
      '(lambda (ent)
     (if (= (vl-string-trim " " (cdr (assoc 1 (entget ent)))) "")
       (entdel ent)
       ) ;_ if
     ) ;_ lambda
      (mapcar 'cadr (ssnamex ss))
      ) ;_ mapcar
    ) ;_ if
  (princ)
  ) ;_ defun

Вызов:
в командной строке z-clear-empty-text
в меню или на кнопках ^C^C_z-clear-empty-text

Re: LISP. Очистка чертежа от пустого текста

Может, добавить информацию о том, сколько найдено и сколько удалено таких объектов? А то все как-то бесшумно происходит.

Re: LISP. Очистка чертежа от пустого текста

> Владимир Громов
А зачем нужна эта информация?
Разве что для шума.

(defun c:z-clear-empty-text (/ ss count)
  (setq ss (ssget "x" '((0 . "TEXT,MTEXT"))))
  (setq count 0)
  (if ss
    (mapcar
      '(lambda (ent)
     (if (= (vl-string-trim " " (cdr (assoc 1 (entget ent)))) "")
       (progn
         (entdel ent)
         (setq count (1+ count))
         ) ;_ progn
       ) ;_ if
     ) ;_ lambda
      (mapcar 'cadr (ssnamex ss))
      ) ;_ mapcar
    ) ;_ if
  (princ (strcat " Удалено пустых текстов " (itoa count)))
  (princ)
  ) ;_ defun

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
Если программа долго работает, в AutoCAD традиционно в командной строке и левом крайнем знакоместе поочередно сменяются два символа. Эффект вращающегося крестика. В этой программе такого нет.  Возникает ощущение, что зависло все.

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
А нельзя    эти две программы обьединить?
"Очистка чертежа - взрывания блоков содежащих один объект" и "Очистка чертежа от пустого текста". И добавить "Purge". Через диалог Y/N.

Re: LISP. Очистка чертежа от пустого текста

> Forma
Эта прога работает отсилы пару секунд. Колёсико там не нужно.

> Forma
У меня эти проги и другие методы очистки объедененны в одну команду с вызовом диалогового окна выбора методов.
В даном случае в наборе есть такие способы очистки в такой последовательности:
1. Удаление невидимых объектов;
2. Стандартная очистка чертежа <Purge_All>;
3. Извлечение вложенных блоков из блоков;
4. Взрывание(burst) блоков с одним вложенным объектом;
5. Очистка от пустых блоков и текста;
6. Поиск и замена одинаковых блоков;
7. Шрифт стилей текста (system variable FONTALT);
8. Корректировка мультитекста;
9. Удаление наложений (Overkill - Express Tools 1-9);
10. На каждом шаге задействовать очистку чертежа;
11. Сохранить документ;
12. Закрыть документ после очистки;
Некоторые из подпрограм надо модернезировать в связи с их медленой работы, сыроваты но работают. Но в дальнейшем я и так подчищу и подготовлю некоторые подпрограммы под стандарт этого раздела и выложу. Но мне тяжеловато выложить на даный форум в связи с использование множества своих функций.
Прошу посмотреть вот сюда https://www.caduser.ru/forum/topic19207.html

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
1. "...Эта прога работает отсилы пару секунд. Колёсико там не нужно..."
У меня 10-20 секунд.
2. Относительно диалога. Согласен. Это дело вкуса.

Re: LISP. Очистка чертежа от пустого текста

> Forma
А у меня отсилы 2-е.
Добавил не колёсико, а проценты, чтобы интересней было.

(defun c:z-clear-empty-text (/ ss count i delete_count)
  (setq ss (ssget "x" '((0 . "TEXT,MTEXT"))))
  (setq i 0)
  (setq delete_count 0)
  (if (and ss (setq count (sslength ss)))
    (mapcar
      '(lambda (ent)
     (progn
       (if
         (and
           (= (vl-string-trim " " (cdr (assoc 1 (entget ent)))) "")
           (entdel ent)
           ) ;_ and
          (setq delete_count (1+ delete_count))
          ) ;_ if
       (setq i (1+ i))
       (setvar
         "modemacro"
         (strcat "Выполнено " (itoa (fix (/ (* i 100) count))) "%")
         ) ;_ setvar
       ) ;_ progn
     ) ;_ lambda
      (mapcar 'cadr (ssnamex ss))
      ) ;_ mapcar
    ) ;_ if
  (setvar "modemacro" "")
  (princ
    (strcat " Удалено пустых текстов " (itoa delete_count))
    ) ;_ princ
  (princ)
  ) ;_ defun

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
Есть проценты. Правда не в командной строке. Там, где они сейчас, шрифт тоненький, тоненький. Вряд ли кто то увидит. Да ладно. Работает программа. И хорошо.

Re: LISP. Очистка чертежа от пустого текста

> Forma
А у меня командная строка отключена, акад 2006.
На атлоне 1.7 обрабатывает примерно 5000 текстовых объектов за 1 сек, а в обыкновеном чертеже текстов обычно не более 4000.

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
30.000 текстов удалила за 5 сек
IP-IV 2.0 A2005 WindowsXP HE
~'O'~

Re: LISP. Очистка чертежа от пустого текста

> Олег(jr.)
Хоть удалило тексты те что надо?
А то я испугался. :)

Re: LISP. Очистка чертежа от пустого текста

> Олег(jr.)
Я в 5 мегабайтном файле удалил с помощью энтой проги 2 штуки. Вот интересно, откель 30.000 взялось?

Re: LISP. Очистка чертежа от пустого текста

> Forma
А предположить, что Олег просто создал их программой для проверки времени выполнения - слабо?

Re: LISP. Очистка чертежа от пустого текста

Я бы предложил эквивалентную по функциональности
программу, на основе всего двух функций ;).
Из достоинств:
- корректный откат;
- корректная обработка наличичия объектов
на заблокированных слоях (с выводом соответствующего сообщения);
- автоматическое использование языка в соответствии
с локализацией конкретной среды ;)
- воможность при минимальной корректировке кода включать
в шаблон выбора прочие невидимые символы;
- возможно более быстрая работа по сравнению с аналогами;
- короткий понятный код.

(defun c:erase-empty-text ()
    (vl-cmdf "_erase"  (ssget "_X"
  '((0 . "TEXT,MTEXT") (-4 . "<NOT") (1 . "*[~ ]*") (-4 . "NOT>"))) ""))

Re: LISP. Очистка чертежа от пустого текста

для AY.
Ваш алгорит действительно быстрее, но непонятно почему начинает ещё одна команда выполнятся...
Ком. строка после вашего алгоритма выглядит так:
Command: _erase-empty-text _erase
Select objects:   16000 found
Select objects:
Command: T
Что он ещё пытается сделать?
И ещё интересно почему такая разница в двух кодах для одной и той же задачи?
"- воможность при минимальной корректировке кода включать в шаблон выбора прочие невидимые символы;"
с этого места желательно по подробнее...

Re: LISP. Очистка чертежа от пустого текста

> ZZZ
А где эту мега-чистелку можно посмотреть?
Ссылка, которая в сообщении -там рассуждения, а кодов и прог нет или я не нашел...

Re: LISP. Очистка чертежа от пустого текста

> AY
А в другом чертеже алгоритм не работает.
Ком. строка:
Command: _erase-empty-text Application ERROR: Invalid type sent as command input
nil
Command:
Акад 2005 англ. + СПДС 2.5

Re: LISP. Очистка чертежа от пустого текста

> Roman-80
Я привел данный код, по большей части из интереса к его краткости. Но если хотите его реально использовать то вот подправленный вариант:

(defun c:erase-empty-text ()
    (vl-cmdf "_.erase"
             (cond ((ssget "_X"
'((0 . "TEXT,MTEXT") (-4 . "<NOT") (1 . "*[~\040]*") (-4 . "NOT>"))
                    )
                   )
                   (t "_non")
             )
             ""
    )
    (princ)
)

с этого места желательно по подробнее...

Если в коде вместо [~\040] вбить [~\040\011], то кроме текстов с пробелами и пустых будут удаляться будут еще и те, что содержат, также невидимый, знак табуляци.

А в другом чертеже алгоритм не работает

При отсутствие искомых текстов происходила вполне безобидная ошибка и программа прерывалась. В поледнем варианте я это исправил.

Re: LISP. Очистка чертежа от пустого текста

> Roman-80
Всё будет выкладыватся постепенно частями(уже два пункта выложенно), по мере доработки и модернизации.

> AY
Ваш вариант решения данной задачи гораздо лучше. Но жаль, что для вложенных в блоки текстов её применить нельзя. А так супер, я знал о таком подходе, но мне было очень лень, а жаль.
По поводу не печатаемых символов (табуляции или там переноса и т.д.). Исходя из пыта повторюсь, объекты с пустым текстом или пробелами создаются при взрывании блоков с пустыми атрибутами, и в атрибуты не практикуют записывать непечатаемые знаки.
ИМХО