Тема: LISP. Отрисовка слова с прямоугольной рамкой.

;******** TRECT.LSP **************************************************
;         Программа вставки слова в рамке в произвольном месте.
;         Если используются шрифты Arial.ttf и Times New Roman.ttf,
;         то стили должны иметь имена "ARIAL" и "TIMES" соответственно.
;         Параметры подобраны опытным путем в предположении, что
;         первая буква заглавная.
;         Разработал Владимир Громов 2003 г.
;
(defun C:TRECT ( / hold ht tn text lt wr hr nr kr)
       (setvar "cmdecho" 0)
       (princ "\n Прежняя высота текста:  ")
       (setq hold (getvar "TEXTSIZE"))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста <" (rtos hold 2) ">: "))   ;
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq tn 0)
(while tn
       (setq tn (getpoint "\n Укажите ТОЧКУ (ENTER-Хватит): "))
     (if tn
       (progn
       (setq text (getstring T "\n Введите текст: "))
       (setq lt (strlen text))
       (if (or (/= (getvar "textstyle") "ARIAL") (/= (getvar "textstyle") "TIMES"))
       (setq wr (* ht lt 1.02) hr (* ht 1.7))
       )
       (if (or (= (getvar "textstyle") "ARIAL") (= (getvar "textstyle") "TIMES"))
       (setq wr (* ht lt 0.85) hr (* ht 1.7))
       )
       (setq nr (list (- (car tn) (/ wr 2)) (- (cadr tn) (/ hr 2))))
       (setq kr (list (+ (car tn) (/ wr 2)) (+ (cadr tn) (/ hr 2))))
       (command "_RECTANG" nr kr)
       (command "_TEXT" "_M" tn ht "0" text)
     ))
)
       (princ "\n Конец. ")
       (princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:TRECT) (load "trect")) TRECT

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
А привязки снять?

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Хотя это раздел для готовых программ, тем не менее пару пожеланий:
1) Текст можно отрисовать сразу, а затем прямоугольник.
2) Отрисовывать текст желательно в текущем стиле (или спросить какой стиль использовать)
3) Для отрисовки прямоугольника для вставленного текста использовать функцию (textbox), а затем уже на основе ее рисовать прямоугольних (возможно несколько увеличив его).
Это было бы универсальнее, красивее и не зависило от выбранного текстового стиля.
IMHO. smile

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Если уж начались замечания общего характера...
Владимир, Вы слишком спешите публиковать свои "готовые" программы. НЕ готовые они. Вы быстро напишете несколько сотен таких полезных программ, если уж вошли в азарт. Они разойдутся по миру, а Вам потом будет стыдно за них.
Пока они полны элементарных ошибок и недоделок. То про привязку забудете, то еще что. Например, текст лучше не рисовать через command - она зависит от настроек стиля. Будет в стиле фиксированная высота (а многие так и делают) и программа рухнет. Будет использован шрифт, с вертикальным расположением - и рухнет. Будут использоваться в качестве единиц не миллиметры - и все не так будет. Нажмут ESC при вводе - и рухнет. А если текст надо под углом? А если TIMES, но растянут? А если ARIAL, но сжат и с наклоном? А если...? А если...? Программист должен предвидеть все "если".
Не спешите! Формируйте библиотеку функций - отработанных и надежных. А уж из них чуть-чуть позже наделаете тьму действительно полезных, надежных, ГОТОВЫХ программ.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Согласен со всеми предыдущими ораторами, высказавшимися по поводу программы Владимира.
Однажды видел интересный вариант решения этой задачи
- создается размерный стиль с рамкой вокруг текста и подавленными выносными и размерной линиями.
- проставляется рамзмер, а вместо величины размера вводится нужный текст.
- размерный текст переносится в нужное место

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Писал одно, а теперь напишу другое. Конечно, я не профессионал в программировании, я проектировщик, до всего доходил своим умом и трудом, и не было ни помощи, ни Конференции. Да, я хотел выложить несколько своих программ, в надежде, что в той же теме другие дадут лучшие варианты, и такие прецеденты уже есть. Однако я вижу, что профессионалы не очень-то торопятся что-то здесь представлять и я догадываюсь, почему. Только мне все равно. Если мне не стыдно перед своими коллегами, которые используют мои программы и довольны, то с чего вы решили, что мне будет стыдно вообще перед кем-нибудь, включая ShaggyDoc?

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Идея! Выложите не программы, а перечень программ. Если не жалко, конечно. Люди посмотрят и выберут что им надо. А так никаких сил не хватит "шлифовать" и "полировать" все программы.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Может быть имеет смысл выкладывать программы на обсуждение в раздел програмирования, если есть сомнения в качестве и универсальности?
Если программа вылаженна на обсуждение и я увижу в ней какие либо недочеты, я обязательно оставлю свои пожелания или советы...
Кстати, я в разделе готовые программы оставлял свои мнения, но сейчас считаю что зря, дело в том, что готовые программы это готовые...
Автор считает - их незачем улучшать и в них нет ошибок.
Мое мнение - этот раздел для программ и их объяснений (Если есть желание указать на ошибки - опубликовывай свой вариант с пояснениями почему программа автора изменена и зачем)...

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Forma
Этот раздел только для отполированных программ (таких не много)...

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Я не хотел Вас ничем обидеть. Уверен, что и ShaggyDoc тоже. И совершенно согласен с Евгением Елпановым, что программу сначала нужно выложить на форум в разделе Программирование (может быть в ее теме поставить префикс - ТЕСТ., немного подождать - будут ли отзывы, замечания, пожелания, может быть полезные советы... И в соответствии с ними выкладывать уже "очищенный" (идеальных программ не бывает) вариант программы в Готовые программы.
Как Вам такая мысль?

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Название "Готовые программы" не моя выдумка. Если кто-то помнит, я предлагал название "Пользовательские программы", а это нечто другое. Готовые программы - это "Express Tools", это сам AutoCAD, в конце концов. Я предполагал, что этот подраздел будет служить местом обмена опытом пользователей, которые считают, что их программы работоспособны, и в тоже время копилкой этого опыта. Я предполагал, что профессиональные программисты смогут дать лучшие варианты программ, представленные в темах, а не разносить в пух и прах благие намерения. Если этот раздел превратится в трибуну профессионалов, то мне здесь делать нечего. Конечно, написать программку отрисовки текста - это не программирование "Progress Bar", но сколько проектировщиков-пользователей AutoCAD'а смогут сказать, что они могут это сделать? А когда у них еще и нет денег ни на "Maestro", ни на "Project Studio", ни на ADT или "Revit"...

Re: LISP. Отрисовка слова с прямоугольной рамкой.

Предлагаю обсуждение не касающееся этой конкретной программы перенести сюда:
https://www.caduser.ru/forum/topic19207.html

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> che
Зачем, объясните ради Бога, здесь привязки снимать? Что к чему тут может случайно привязаться? Разве не ясно, что для отрисовки текста, как правило, выбирается пустое место рисунка, и привязываться там не к чему? Или есть опасение, что отрисовываемый прямоугольник привяжется к точке вставки текста? Я не видел таких оболтусов, которые держат постоянно включенной привязку к точке вставки текста. А если вдруг что-то к чему привязалось, то кто или что мешает очень быстро нажать клавишу F3, которая у большинства пользователей выполняет стандартную функцию? Я сам часто использую отключение или программное переназначение привязок, но зачем же это возводить в догму?

> Александр Ривилис
А разве тут не видно, что текст отрисовывается текущим стилем? Где вы увидели у меня переключения стиля? То, что написано в шапке програмного кода - не что иное, как рекомендация пользователям давать имена текстовым стилям по именам шрифтов, а не использовать предлагаемые системой безинформыционные имена "Style1", "Style2" ("Стиль1", "Стиль2"). Насчет "textbox" несколько согласен, но это только другой способ, я использовал эмпирический способ, да ведь вы и сами говорите "(возможно несколько увеличив его)", т.е. допускаете элемент эмпирики.

> ShaggyDoc
Из того что вы наговорили, явно прозвучал только упрек в отношении привязок, на это замечание я ответил выше. Все остальное из области догадок. Вы что, не поняли, что выполняет эта конкретная простенькая программа? Зачем вы нагромождаете гипотетические обстоятельства?
Просто поражаюсь тому, что гиганты мысли совершенно не понимают, что нужно пользователю. Ему плевать на красоту и законченность кода и программу он будет искать по имени выполняемой операции, а не потому, использовался в программе ActiveX или не использовался. Я здесь задал конкретную тему: "Отрисовка слова в рамке" и предложил свой вариант программы, потому что она готовая, она работает и практически используется моими коллегами. Наверняка многие думали над подобной задачей и, конечно, есть другие, возможно, лучшие разработки - так вот и надо разместить их здесь, в этой теме, тогда ведь и я смогу воспользоваться лучшим вариантом. Вы никак не врубитесь, что тема важна для пользователя и конечный результат, а не упражнения в программировании.
Я сказал.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Скачал код, открыл пустой файл, запустил программку. Прямоугольник нарисовался нормально, текст привязался к левому нижнему углу прямоугольника, вместо текста получился "0", и текст повернулся примерно на 325 градусов. Может это связано с текствыми стилями, не знаю.
Ничего личного. Вы же даете мне замечания, я стараюсь их исправлять.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Прошу принимать как конструктивные предложения. Никакой критики. Никаких обид. Ок?
Буду цитировать, чтобы можно было сориентироваться. Погнали?

для отрисовки текста, как правило, выбирается пустое место рисунка, и привязываться там не к чему

Не човчем. Для строителей, если надо поставить, например, площадь помещения, рядом обязательно оказывается либо стена, либо окно, либо стена с окном и дверью. Если при имеющемся zoom'е эти объекты попадут в размер перекрестия, текст с его рамкой окажутся вообще непонятно где.
Привязки надо устанавливать на момент рисования как хочется, но потом-то верните все обратно! Я от СПДС 2.5 в свое время плевался во все стороны - она не восстанавливала osmode (лично у меня любимое значение 503, но есть люди, у которых стоит 33 и они горя не знают).

часто использую отключение или программное переназначение привязок, но зачем же это возводить в догму

Меня в свое время один человек хорошо научил: сел за чужую машину - твори что хошь, но чтобы после тебя все было на месте и так, как привык юзер. Юзеру работать, а не мне. И если ему после применения любой фенечки придется тратить хоть 1 минуту на восстановление, то фенечка будет либо доработана до нормального вида, либо выкинута.

Насчет "textbox" несколько согласен, но это только другой способ, я использовал эмпирический способ, да ведь вы и сами говорите "(возможно несколько увеличив его)", т.е. допускаете элемент эмпирики

textbox - не другой способ, а другой подход. Не больше и не меньше. Никакой эмпирики - расчеты делает (и должен делать) кад. Увеличение кода - опять не подгонка, а проверки состояния системы, различных вариантов переменных, запросы пользователю с предоставлением значений по умолчанию... В общем, обеспечение гарантированно одинакового поведения программы независимо от настроек AutoCAD.
Задача, может, и интересная, но мне сейчас некогда ею заниматься, увы, увы... Если достанет мозгов и времени, сделаю.
---
Если меня еще читают:
Пожелания к данной конкретной программе:
1. Восстанавливать состояние системных переменных на момент "до выполнения программы".
2. Не привязываться к текущему текстовому стилю и его настройкам. У меня, например, будет использован фонт simplex.shx, высота текстового стиля = 0 (т.е. высоту текста я задаю в процессе ввода dtext), коэффициент сжатия 0.7, угол наклона 15. Наименование стиля - "kpblc-Standard". Попробуйте предсказать поведение программы, пожалуйста.
---
P.S. Еще раз говорю - если будет время, выложу свой вариант для обсуждения, но не факт.
---
Все выше - ИМХО.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> che

> kpblc
Ну, ребята, все это ведь я знаю и ситуации всякие испытывал на собственной шкуре и шкуре коллег. И сразу же после замечания che готов был представить улучшенный вариант программы, но пока писал, здесь появились новые сообщения, от которых я озверел и окрысился. Вся штука в том, что профессионалы считают готовой программу, в код которой уже нельзя или нет смысла вносить изменения. Так для чего тогда выкладывать здесь этот код? Компилируй его в VLX, FAS, ARX или VBA и засылай на какой-нибудь файловый сервер, а здесь давай только ссылку. В то же время, мои программы достаточно просты, доступны для совершенствования и в тоже время работоспособны. Да пусть от них хоть камня на камне не останется, если их можно улучшить или представить другие варианты.
Все это IMHO, IMHO.

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
Согласен, уже писал по этому поводу комментарий:
https://www.caduser.ru/forum/topic19207.html

Re: LISP. Отрисовка слова с прямоугольной рамкой.

> Владимир Громов
С вами в корне не согласен!
Главное не уровень знаний и умений програмиста.
Иногда вижу программы реализованные исключительно через Command: но править их рука не поднимается - программы хорошо продуманны и непобоюсь этого слова выстраданны, а иногда попадаются программы для одного человека - т.е. они отлично работают только с его настройками акада или с его привычками (например выход только по "Esc"...)
Этот форум я использую как учебник и копилку знаний, мне, конечно, нужны программы для использования, но мне интересно учиться большему! Мне совершенно не интересны  VLX, FAS, ARX... Мне интересны исходники, алгоритмы, новые подходы и взгляды на решение задач.
Хороший алгоритм, при необходимости, я и сам смогу превратить в рабочую программу, тем более в компиляции VLX, FAS, для меня нет трудностей...
PS. А за идею создания ветки "Программирование :: Готовые программы" вам отдельное СПАСИБО!