Тема: LISP. Разрыв (обрыв, ...) строчки в указанной точке

;|====================================================
 Разрыв (обрыв, ...) строчки в указанной точке
 Программа Дениса Флюстикова "Str_Den"
 Макрос для кнопки: ^C^C^P(load "Str_Den");Str_Den
 Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun c:Str_Den (/ n a a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 OSMODE)
(setq a nil)
(while (/= (cdr (assoc 0 a)) "TEXT")
(setq a5 (car (entsel "\nВыберите текст:"))
      a (entget a5)))
(setq OSMODE (getvar "OSMODE")
      n '("l" "c" "r" "a" "m" "f")
      a7 (nth (cdr (assoc 72 a)) n )
      n '("" "b" "m" "t")
      n (nth (cdr (assoc 73 a)) n )
      a7 (strcat "_" n a7)
      a9 (cdr (assoc 50 a))
      a2 (cdr (assoc 10 a))
      a2 (trans a2 0 1))
(setvar "CMDECHO" 0)
(command "_.undo" "_g")
(if (> (rem OSMODE 128) 63)
(setvar "OSMODE" (- OSMODE 64)))
(initget 6 "Р У Н В П")
(if (not (vl-catch-all-error-p
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nточка Разрыва или вторую часть[Удалить/на Новую строку/Вставить в текст/Перенести]<В текст>:")))))
(progn
(setq a10 a3)
(if (null a3)(setq a10 "В"))
(if (= (type a3) 'LIST)
(setq a10 "Р")
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nУкажите точку разделения:"))))
(setvar "OSMODE" OSMODE)
(if (= (type a3) 'LIST)(progn
(setq a1 (cos (- (angle a2 a3) a9))
      a3 (* a1 (distance a2 a3))
      a4 (caadr (Textbox a))
      a6 a4
      a1 (cdr (assoc 1 a))
      n (strlen a1))
(if (and (< a3 a4)(> a3 0))(progn
(command "_.justifytext" a5 "" "_l"
     "_.copy" a5 "" a2 a2)
(setq a (entget a5))
(while (and (> a6 a3)(> n 0))
(setq a8 (substr a1 1 n)
      a8 (vl-string-right-trim " " a8)
      a8 (subst (cons 1 a8)(assoc 1 a) a)
      a6 (caadr (Textbox a8))
      n (1- n))
)
(entmod a8)
(setq a8 (substr a1 (+ 2 n)(strlen a1))
      a6 (subst (cons 1 a8)(assoc 1 a) a)
      a6 (- a4 (caadr (Textbox a6)))
      a1 (entlast)
      a (entget a1))
(if (= a10 "Н")
(setq a9 (- a9 (/ pi 2))
      a6 (cdr (assoc 40 a))
      a6 (* 5 (/ a6 3))))
(setq a2 (polar a2 a9 a6)
      a2 (trans a2 1 0)
      a (subst (cons 10 a2)(assoc 10 a) a))
(entmod (subst (cons 1 a8)(assoc 1 a) a))
(command "_.justifytext" a5 a1 "" a7)
(if (= a10 "П")
(vl-cmdf "_.move" a1 "" a2 pause)
(if (and (/= a10 "Р")(/= a10 "Н"))(progn
(command "_.erase" a1 "")
(if (= a10 "В")
(while a2
(if (vl-catch-all-error-p
(setq a5 (vl-catch-all-apply 'entsel
(list "\nВыберите текст:"))))
(setq a2 nil)
(if (= (type a5) 'LIST)(progn
(setq a (entget (car a5)))
(if (wcmatch (cdr (assoc 0 a)) "*TEXT")(progn
(setq a2 nil
      a4 (cdr (assoc 1 a))
      a6 (vl-string-left-trim " " a4)
      a7 (- (strlen a4) (strlen a6))
      a8 (vl-string-right-trim " " a8)
      a6 (strcat a8 " " a6))
(repeat a7
(setq a6 (strcat " " a6)))
(entmod (subst (cons 1 a6)(assoc 1 a) a))
)))))))))))
(princ "\nТочка за границами текста")
)))))
(setvar "OSMODE" OSMODE)
(command "_.undo" "_e")
(setvar "CMDECHO" 1)
(princ)
)

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

У меня пишет

; ошибка: неверный тип аргумента: lentityp nil

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Еще раз проверил работу программы, скопировав код в LISP-формат, вроде все OK. Уточни, когда появляется сообщение, до, после или во время диалога. Проблема на разных машинах, в файлах с разными настройками?

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

У меня на англицком автокаде работает. Везде, где русские буквы,
стоят вопросительные знаки, но основную функцию выполняет - делит текст.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> skkkk

> Victor
Погонял программу под разными версиями AutoCAD (рус., англ.), ошибок не обнаружил.
Программа работает только с однострочным текстом, и если выбрать многострочный и
нажать пробел, то появляется подобное соощение:
«    ; ошибка: неверный тип аргумента: lentityp nil    »
Этот моментик исправлю

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

;|====================================================
 Разрыв (обрыв, ...) строчки в указанной точке
 Программа Дениса Флюстикова "Str_Den" от 24.05.08:
 учтены коды подчеркивания и надчеркивания текста
 Макрос для кнопки: ^C^C^P(load "Str_Den");Str_Den
 Замечания и предложения по адресу fd-@mail.ru
====================================================|;
(defun c:Str_Den (/ n a a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 OSMODE)
(setq a nil)
(while (/= (cdr (assoc 0 a)) "TEXT")
(if (setq a5 (car (entsel "\nВыберите однострочный текст:")))
(setq a (entget a5)))
)
(setq OSMODE (getvar "OSMODE")
      n '("l" "c" "r" "a" "m" "f")
      a7 (nth (cdr (assoc 72 a)) n )
      n '("" "b" "m" "t")
      n (nth (cdr (assoc 73 a)) n )
      a7 (strcat "_" n a7)
      a9 (cdr (assoc 50 a))
      a2 (cdr (assoc 10 a))
      a2 (trans a2 0 1))
(setvar "CMDECHO" 0)
(command "_.undo" "_g")
(if (> (rem OSMODE 128) 63)
(setvar "OSMODE" (- OSMODE 64)))
(initget 6 "Р У Н В П")
(if (not (vl-catch-all-error-p
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nточка Разрыва или вторую часть[Удалить/на Новую строку/Вставить в текст/Перенести]<В текст>:")))))
(progn
(setq a10 a3)
(if (null a3)(setq a10 "В"))
(if (= (type a3) 'LIST)
(setq a10 "Р")
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nУкажите точку разделения:"))))
(setvar "OSMODE" OSMODE)
(if (= (type a3) 'LIST)(progn
(setq a1 (cos (- (angle a2 a3) a9))
      a3 (* a1 (distance a2 a3))
      a4 (caadr (Textbox a))
      a6 a4
      a1 (cdr (assoc 1 a))
      n (strlen a1))
(if (and (< a3 a4)(> a3 0))(progn
(vl-cmdf "_.justifytext" a5 "" "_l")
(vl-cmdf "_.copy" a5 "" a2 a2)
(setq a (entget a5)
      a11 a1)
(while (and (> a6 a3)(> n 0))
(setq a11 (substr a11 1 n)
      a11 (vl-string-right-trim " " a11)
      a8 (subst (cons 1 a11)(assoc 1 a) a)
      a6 (caadr (Textbox a8)))
(if (wcmatch a11 "*%%?")
(setq n (- n 3))
(if (wcmatch a11 "*\U+????")
(setq n (- n 7))
(if (wcmatch a11 "*%%###")
(setq n (- n 5))
(setq n (1- n)))))
)
(entmod a8)
(setq a6 "%%U"
      a8 1
      a11 (strcase a11))
(while (wcmatch a11 (strcat "*" a6 "*"))
(setq a6 (strcat a6 "*%%U")
      a8 (1+ a8)))
(if (= 0 (rem a8 2))
(setq a3 "%%U")
(setq a3 ""))
(setq a6 "%%O"
      a8 1)
(while (wcmatch a11 (strcat "*" a6 "*"))
(setq a6 (strcat a6 "*%%O")
      a8 (1+ a8)))
(if (= 0 (rem a8 2))
(setq a3 (strcat a3 "%%O")))
(setq a8 (substr a1 (1+ (strlen a11))(strlen a1))
      a8 (strcat a3 a8)
      a6 (subst (cons 1 a8)(assoc 1 a) a)
      a6 (- a4 (caadr (Textbox a6)))
      a1 (entlast)
      a (entget a1))
(if (= a10 "Н")
(setq a9 (- a9 (/ pi 2))
      a6 (cdr (assoc 40 a))
      a6 (* 5 (/ a6 3))))
(setq a2 (polar a2 a9 a6)
      a2 (trans a2 1 0)
      a (subst (cons 10 a2)(assoc 10 a) a)
      a2 (trans a2 0 1))
(entmod (subst (cons 1 a8)(assoc 1 a) a))
(vl-cmdf "_.justifytext" a5 a1 "" a7)
(if (= a10 "П")
(vl-cmdf "_.move" a1 "" a2 pause)
(if (and (/= a10 "Р")(/= a10 "Н"))(progn
(command "_.erase" a1 "")
(if (= a10 "В")
(while a2
(if (vl-catch-all-error-p
(setq a5 (vl-catch-all-apply 'entsel
(list "\nВыберите текст:"))))
(setq a2 nil)
(if (= (type a5) 'LIST)(progn
(setq a (entget (car a5)))
(if (wcmatch (cdr (assoc 0 a)) "*TEXT")(progn
(setq a2 nil
      a4 (cdr (assoc 1 a))
      a6 (vl-string-left-trim " " a4)
      a7 (- (strlen a4) (strlen a6))
      a8 (vl-string-right-trim " " a8)
      a6 (strcat a8 " " a6))
(repeat a7
(setq a6 (strcat " " a6)))
(entmod (subst (cons 1 a6)(assoc 1 a) a))
)))))))))))
(princ "\nТочка за границами текста")
)))))
(setvar "OSMODE" OSMODE)
(command "_.undo" "_e")
(setvar "CMDECHO" 1)
(princ)
)

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Отлично работает....Дай Бог Вам здоровья:)

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

А с многострочным также нельзя??? И чтоб еще и объединить потом?? В идеале вижу это так: есть мтекст...разрываем его в нужных местах....редактируем, причем, каждую часть разными лиспами, затем обратно соединяем в том виде, как он есть, хотя этот пункт и необязателен, можно сгруппировать на худой конец. Но в любом случае прога - супер

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Спасибо за программу! Часто приходится переносить часть текста на другую строчку. Раньше делала тупым копированием и дальнейшим удалением лишних частей в полученных строчках.
Теперь горя не знаю.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

А макрос работает только в модели! В листе не работает!!!
(хнык)

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Для указания места разрыва текста по точке на нижней границе, в коде вместо строчки:
      a6 (caadr (Textbox a8)))
вставте строчки:
      a6 (subst '(51 . 0)(assoc 51 a8) a8)
      a6 (caadr (Textbox a6)))
более удобно при работе с наклонным текстом.

> skkkk
Насчет многострочных текстов, то, похоже, здесь потребуется отдельная программа, поэтому лучше спросить на другой ветке форума, может, кто знает аналоги, или имеет проработки, а у меня в этом направлении планов нет.

> Малявка
Обычно пользуюсь программой в модели, да и в работе в листе проблем не замечал. Малявка, забрось мне в ящик этот DWG-файлик, попробую разобраться.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Денис Флюстиков
Не пойму, что случилось! Всё работает и в листе тоже! Может, перезагрузка помогла, какой-нибудь глюк в моем компе снесла? Не знаю.
Короче, спасибо. Чмоки тя в разные приятные места.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Малявка
Это лишнее, мне достаточно было узнать, что с помощью программы сделал человека не знающего горя :)
(> Малявка (2008-06-03 08:27:19))

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Денис Флюстиков
Сделал человека? И когда ж успел? Я че-й-то не заметила... ))
(типа прикол, не хотела обидеть, просто фраза получилась пошленько-смешная. Лучше бы "сделал человека счастливым". Или так: "сделал человека НЕ ЗНАЮЩИМ горя").

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

:S

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Нормальная штука.
Ненавязчиво предлагаю подсветить изначально выбранную строку для наглядности, для этого в начало вместо

(while (/= (cdr (assoc 0 a)) "TEXT")
(if (setq a5 (car (entsel "\nВыберите однострочный текст:")))
(setq a (entget a5)))
)

вставим

(while (/= (cdr (assoc 0 a)) "TEXT")
  (if (setq a5 (car (entsel "\nВыберите однострочный текст:")))
    (progn (redraw a5 3)(setq a (entget a5)))
  )
)

а в конце добавим

(vl-cmdf "_.regenall")

перед строкой (command "_.undo" "_e")
Автор не против?

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Денису
Флюстикову
Хотелось бы чтобы строка разделялась именно в указанной точке,а не как сейчас на пробел левее.
А то, напр. при опции на Новую строку,нижняя строка начинается с пробела и оказывается смещенной вправо на оный.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Kosarev
Спасибо, маленькая фенечка, а мне понравилось.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Kosarev
Спасибо, так лучше

> getr
Попробуй эту версию, то?

;|====================================================
 Разрыв (обрыв, ...) строчки в указанной точке
 Программа Дениса Флюстикова "Str_Den" от 04.06.08
 Макрос для кнопки:
 ^C^C^P(load "Str_Den");Str_Den
 Замечания и предложения по адресу fd-@mail.ru
 Большое спасибо Kosarev за помощь в доработке программы
====================================================|;
(defun c:Str_Den (/ n a a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 OSMODE)
(setq a nil)
(while (/= (cdr (assoc 0 a)) "TEXT")
(if (setq a5 (car (entsel "\nВыберите однострочный текст:")))
(progn (redraw a5 3)(setq a (entget a5)))
)
)
(setq OSMODE (getvar "OSMODE")
      n '("l" "c" "r" "a" "m" "f")
      a7 (nth (cdr (assoc 72 a)) n )
      n '("" "b" "m" "t")
      n (nth (cdr (assoc 73 a)) n )
      a7 (strcat "_" n a7)
      a9 (cdr (assoc 50 a))
      a2 (cdr (assoc 10 a))
      a2 (trans a2 0 1))
(setvar "CMDECHO" 0)
(command "_.undo" "_g")
(if (> (rem OSMODE 128) 63)
(setvar "OSMODE" (- OSMODE 64)))
(initget 6 "Р У Н В П")
(if (not (vl-catch-all-error-p
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nточка Разрыва или вторую часть[Удалить/на Новую строку/Вставить в текст/Перенести]<В текст>:")))))
(progn
(setq a10 a3)
(if (null a3)(setq a10 "В"))
(if (= (type a3) 'LIST)
(setq a10 "Р")
(setq a3 (vl-catch-all-apply 'getpoint
(list "\nУкажите точку разделения:"))))
(setvar "OSMODE" OSMODE)
(if (= (type a3) 'LIST)(progn
(setq a1 (cos (- (angle a2 a3) a9))
      a3 (* a1 (distance a2 a3))
      a4 (caadr (Textbox a))
      a6 a4
      a1 (cdr (assoc 1 a))
      n (strlen a1))
(if (and (< a3 a4)(> a3 0))(progn
(vl-cmdf "_.justifytext" a5 "" "_l")
(vl-cmdf "_.copy" a5 "" a2 a2)
(setq a (entget a5)
      a11 a1)
(while (and (> a6 a3)(> n 0))
(setq a11 (substr a11 1 n)
      a11 (vl-string-right-trim " " a11)
      a8 (subst (cons 1 a11)(assoc 1 a) a)
      a6 (subst '(51 . 0)(assoc 51 a8) a8)
      a6 (caadr (Textbox a6)))
(if (wcmatch a11 "*%%?")
(setq n (- n 3))
(if (wcmatch a11 "*\U+????")
(setq n (- n 7))
(if (wcmatch a11 "*%%###")
(setq n (- n 5))
(setq n (1- n)))))
)
(entmod a8)
(setq a6 "%%U"
      a8 1
      a11 (strcase a11))
(while (wcmatch a11 (strcat "*" a6 "*"))
(setq a6 (strcat a6 "*%%U")
      a8 (1+ a8)))
(if (= 0 (rem a8 2))
(setq a3 "%%U")
(setq a3 ""))
(setq a6 "%%O"
      a8 1)
(while (wcmatch a11 (strcat "*" a6 "*"))
(setq a6 (strcat a6 "*%%O")
      a8 (1+ a8)))
(if (= 0 (rem a8 2))
(setq a3 (strcat a3 "%%O")))
(setq a8 (substr a1 (1+ (strlen a11))(strlen a1))
      a8 (vl-string-left-trim " " a8)
      a8 (strcat a3 a8)
      a6 (subst (cons 1 a8)(assoc 1 a) a)
      a6 (- a4 (caadr (Textbox a6)))
      a1 (entlast)
      a (entget a1))
(if (= a10 "Н")
(setq a9 (- a9 (/ pi 2))
      a6 (cdr (assoc 40 a))
      a6 (* 5 (/ a6 3))))
(setq a2 (polar a2 a9 a6)
      a2 (trans a2 1 0)
      a (subst (cons 10 a2)(assoc 10 a) a)
      a2 (trans a2 0 1))
(entmod (subst (cons 1 a8)(assoc 1 a) a))
(vl-cmdf "_.justifytext" a5 a1 "" a7)
(if (= a10 "П")
(vl-cmdf "_.move" a1 "" a2 pause)
(if (and (/= a10 "Р")(/= a10 "Н"))(progn
(command "_.erase" a1 "")
(if (= a10 "В")
(while a2
(if (vl-catch-all-error-p
(setq a5 (vl-catch-all-apply 'entsel
(list "\nВыберите текст:"))))
(setq a2 nil)
(if (= (type a5) 'LIST)(progn
(setq a (entget (car a5)))
(if (wcmatch (cdr (assoc 0 a)) "*TEXT")(progn
(setq a2 nil
      a4 (cdr (assoc 1 a))
      a6 (vl-string-left-trim " " a4)
      a7 (- (strlen a4) (strlen a6))
      a8 (vl-string-right-trim " " a8))
(if (and (wcmatch a8 "*`-")(not (wcmatch a8 "*`-`-")))
(setq a8 (vl-string-right-trim "-" a8)
      a6 (strcat a8 a6))
(setq a6 (strcat a8 " " a6))
)
(repeat a7
(setq a6 (strcat " " a6)))
(entmod (subst (cons 1 a6)(assoc 1 a) a))
)))))))))))
(princ "\nТочка за границами текста")
)))))
(setvar "OSMODE" OSMODE)
(command "_.regenall"
     "_.undo" "_e")
(setvar "CMDECHO" 1)
(princ)
)

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Денис Флюстиков
Класс! Я в восхищении!
Я тоже так хочу!

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

СПАСИБО!Самое то.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Спасибо, Денис!
Мечтала об этом давно... руки так и не дошли! А тут Ваш подарок! : )

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Странно, что больше двух лет программа не имела отзывов (да и  кол-во просмотров темы не большой), и вдруг оказалось, что она востребована. Странно и было не понятно, как автору, это решение «узкой задачки» для себя, или нужно и другим. Странно.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

> Денис Флюстиков
Наверное, всему свое время. Главное, чтобы вовремя.

Re: LISP. Разрыв (обрыв, ...) строчки в указанной точке

Ну и специальный бонус для любителей "фишек"!
Вставьте нижеследующий блок в конце, перед строкой (command "_.regenall" "_.undo" "_e")

(if (= a10 "Р")(repeat 6
  (redraw a1 2)(command "_.delay" 50)(redraw a1 1)(command "_.delay" 50)
))

Теперь при разрыве строки некоторое время будет происходить волшебство с "оторванным" хвостом...