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

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

Макрос и текст

Ответ
Поиск в этой теме
Непрочитано 03.02.2004, 07:54 #1
Макрос и текст
plaz
 
Проектирование обустройства нефтяных месторождений
 
Самара
Регистрация: 28.08.2003
Сообщений: 352

Как написать макрос, чтобы по нажатию кнопки изменялась высота и widh factor выделенного текста :?:
Просмотров: 11497
 
Непрочитано 03.02.2004, 09:24
#2
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


не знаю как в макросе , а в лиспе это написать не сложно, только уточните на сколько должны увеличиваться параметры.
Apelsinov вне форума  
 
Автор темы   Непрочитано 03.02.2004, 10:59
#3
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


нет, хочу именно марос, чтобы создать по аналогии кучу кнопоки в зависимости от ситуации использовать их. Лисп вешь хорошая, но для таких мелких вещей предпочитаю его не использовать.
Задача такая: есть текст с высотой 3.5, по ситуации надо задать ему высоту 5 или 4.5, тоже самое с шириной
plaz вне форума  
 
Непрочитано 03.02.2004, 15:20
#4
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Программу можно написать на Лиспе, а высоту и ширину передавать из макроса в программу либо как параметр функции, либо как ответ на запрос функции (getreal). Таким образом, программа получается одна, а кнопки можно плодить... по желанию.
vk вне форума  
 
Автор темы   Непрочитано 03.02.2004, 15:37
#5
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Как обычно вечный спор между Lisp и макросами. Любите вы все универсализировать.
Вроде такая простая задачка
Ладно буду ждать Vov'у, уж он то меня поймет [sm2011]
plaz вне форума  
 
Непрочитано 04.02.2004, 04:42
#6
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Вечного спора пока нет - почти нет специалистов по макросам. Да и вряд ли будет, потому что LISP сильнее. Но у макросов есть неоспоримое преимущество: он быстро становится понятным, а сделанная своими руками программа ближе к сердцу, чем чужая, даже наворочанная.
Давай, Plaz, на твоем вопросе сделаем ликбез для всех. Сначала надо найти идею. В данном случая проблему решит команда _Change. Проиграйте на клавиатуре действия по изменению высоты однострочного текста, сделав его 5 единиц, записывая каждый шаг на бумагу. Вместо Enter пишите точку с запятой <;>. Вместо клика мышкой ставьте обратную косую черту <\>. Затем создайте новую панель инструментов и в ней кнопку. Всю последовательность впечатайте в поле Macro associated with this button диалогового окна Customize, без пробелов. Начало будет таким: ^C^C_Change; (^C означает нажатие на Esc, то есть отчистка командной строки). Продолжите действия на клавиаруре, заодно исследуя команду Change. Добавляйте знаки в окно Customize. A результат выносите сюда.
Vova вне форума  
 
Непрочитано 04.02.2004, 05:55
#7
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


>>vova
Владимир! Комманда _CHANGE работает только с однострочным текстом как ты и отметил, причем ширину не изменить, а на MTEXT и вовсе "заикается", думаю что VK прав, это задачка для лиспа, как он тут присоветовал. И на любимые кнопочки привесить очень даже удобно, а еще лучше на PULDOWN MENU.
Startrek вне форума  
 
Автор темы   Непрочитано 04.02.2004, 08:57
#8
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


2 Vova
Идею то я нашел, не знаю как ее реализовать, не хватает знаний команд Акада.
Change действительно может поменять только высоту текста, и то при условии, что стиль данного текста не фиксирует высоту

RuHelp:
  • Change

    Изменение положения и других свойств текста.

    Новая точка вставки текста <не изменять>:

    Текст перемещается в соответствии с указанным новым положением. Если в ответ нажать ENTER, положение текста остается без изменения.

    Новый текстовый стиль <текущий>:

    Если текст обладает фиксированной высотой, следующий запрос опускается.

    Новая высота <текущая>:

    Новый угол поворота <текущий>:

    Новый текст <текущий>:

    AutoCAD подсвечивает следующий объект и начинает выдавать запросы для него.

Единственным , не лисповским, способом решения вижу создание дополнительных текстовых стилей и соответствующая их подмена
plaz вне форума  
 
Непрочитано 04.02.2004, 12:36
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


А как же проверить, существует ли уже такой стиль текста или нет? Имею в виду, без Лиспа? Ведь если не проверять, то можно и напортить....
vk вне форума  
 
Автор темы   Непрочитано 04.02.2004, 14:18
#10
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Я не хочу создать кнопку на все случаи жизни, она мне понадобится макс. на месяц. В той работе которую я выполняю используется только один текстовый стиль. Я надеялся что можно с помощью командной строки (т.е. макрос) изменить некоторое парамтры окна Properties, и я уверен что можно только надо знать соотвествующие команды.
Будем искать
plaz вне форума  
 
Непрочитано 04.02.2004, 19:12
#11
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


>>plaz
Покопайтесь в переменных :roll:
Startrek вне форума  
 
Непрочитано 05.02.2004, 04:56
#12
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


1. Эта задача решается несложным макросом: любому однострочному тексту независимо от высоты, заданной в текстовом стиле и мтексту можно поменять высоту одним кликом мышки. Startrek и Plaz правы в том, что команда Change очень ограничена - ее можно использовать только для однострочного текста, причем если высота в его текстовом стиле равна 0. Но для упражнения с написанием первого учебного макроса годится. Жду макроса, потому что там можно использовать интересный прием, который впоследствии мы применим к универсальному макросу для любого текста. Попробуйте догадаться также, какую бы команду применить для этого будущего макроса.
2. По поводу Width я думаю, что Plaz переусердствовал. Нечастая операция не требует автоматизации.
3. Я уже провел одну тему - "Найти решение" в форме загадок и ответов, мне показалось так веселее,чем сразу выдать решение. Если такая форма не коробит, можно продолжить в таком стиле. Ваше мнение?
Vova вне форума  
 
Автор темы   Непрочитано 05.02.2004, 07:54
#13
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Цитата:
Сообщение от Vova
По поводу Width я думаю, что Plaz переусердствовал. Нечастая операция не требует автоматизации.
Ну это как посмотреть :!: Нечастая в течении всего года, она может оказаться очень востребована в те два дня, когда начинается выпуск новой ревизии :?

Цитата:
Сообщение от Vova
Я уже провел одну тему - "Найти решение" в форме загадок и ответов, мне показалось так веселее,чем сразу выдать решение. Если такая форма не коробит, можно продолжить в таком стиле. Ваше мнение?
Веселей то оно веселей, только вот начальству не смешно, да и жене моей ,когда поздно возвращаюсь
[sm1205]

По поводу макроса для замены высоты текста если пользоваться командой change и вашими рекомендациями:
^C^C-ch;;;;5;;;
plaz вне форума  
 
Непрочитано 05.02.2004, 14:20
#14
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


У меня это не работает. Потому что не заложено указание объекта деля изменения (\). Попробуй так
*^C^C_change;\;;;;5;;;
А прием, про который я говорил, это звездочка в начале, позволяющая менять об-екты один за другим.
Когда я начинал с макросами, тоже домой поздно приходил, да и сейчас надо разбираться, как бы ответить здесь получше. В частности, нашел команду для твоего случя в ...меню Express. Позвони жене, что сегодня в последний раз задержишься и построишь окончательный макрос сам.
Параметр WITH это ширина текста при той-же высоте. Применяется, например, в заголовках, чтобы растянуть строку или в аналогичных случаях. Я ее растягивать не пробовал, поищи в Express подходящую команду, если позарез надо и Properties не спасают. А искать надо так: открой Help от Express и поищи на букву "Т"
Vova вне форума  
 
Автор темы   Непрочитано 05.02.2004, 15:35
#15
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Цитата:
Сообщение от Vova
У меня это не работает. Потому что не заложено указание объекта деля изменения (\). Попробуй так
*^C^C_change;\;;;;5;;;
Привычка сначала выделять, а потом применять команду

Цитата:
Сообщение от Vova
А прием, про который я говорил, это звездочка в начале, позволяющая менять об-екты один за другим.
[sm200]

Цитата:
Сообщение от Vova
нашел команду для твоего случя в ...меню Express.
Я про нее тоже знаю Textfit. Ссылается на лисп textfit.lsp
Вот только понять не могу где здесь фишка? Где происходит подмена width?

Код:
[Выделить все]
(defun c:textfit (/ ename textent newend tmp start newpt val ltc_% ss txtsz)
 
  (acet-error-init
    (list
        (list  "cmdecho"    0
               "snapang"    0
              "limcheck"    0
              "orthomode"  1
        )
        T     ;flag. True means use undo for error clean up.
     ) ;list
  );acet-error-init
 
;;;End Error control
 
  (if (not (and
              (setq ss (ssget "_i"))
              (= (sslength ss) 1)
              (setq ename (ssname ss 0)
              )
           )
      )
    (setq ename  (car (entsel "\nSelect Text to stretch or shrink:" )))
  )
 
 
  (cond
    ((not (setq textent (if ename (entget ename))))
      (princ "\nNo object selected!")
    )
    ((/= (acet-dxf 0 textent) "TEXT")
      (princ "\nSelected object is not Text!")
    )
    ((acet-layer-locked (acet-dxf 8 textent))
      (princ "\nSelected object is on a locked layer!")
    )
    (t
      (setq txtsz (textbox textent))
      (setq newend (distance
                      (list
                        (caadr txtsz) ;upper right x coord
                        (cadar txtsz) ;lower left y coord
                      )
                      (car txtsz) ;; ll xyz
                   );distance
      );setq
      ;set snap along text entity
      (setvar "snapang"
        (angtof (angtos (acet-dxf 50 textent) 0 8) 0 )
      )
      (initget 0 "Start _Start")
      (setq
        tmp (getpoint (acet-dxf 10 textent) "\nSpecify end point or [Start point]: ")
      )
      (setvar "snapang" 0)
      (cond
        ((= (type tmp) 'STR) ;;new starting point to be selected
          (setq start (getpoint "\nSpecify new starting point: "))
          (if start
            (progn
              (acet-ucs-cmd (list "_E" (acet-dxf -1 textent)))
              (setvar "orthomode" 1)
              (setq newpt
                (if start
                  (getpoint (trans start 0 1) " ending point: ")
                  nil
                ) ;if
              ) ;setq
              (if newpt
                (setq newpt (trans newpt 1 0))
              )
              (setvar "orthomode" 0)
              (acet-ucs-cmd (list "_p"))
            ) ;progn
          ) if
        )
        ((not (null tmp))    ;;new ending point selected
          (setq start (acet-dxf 10 textent)
                newpt tmp)
        )
        (t  (setq start nil
                  newpt nil)
        )
      ) ;cond
      (if (and start newpt)
        (progn
          (setq val (assoc 41 textent) ;;current width factor
                val (if val (cdr val) 1.0)
                ltc_% (* (/ (distance start newpt) newend) val)
                textent (subst (cons 41 ltc_%)
                               (assoc 41 textent)
                               textent)
                textent (subst (cons 10 start)
                               (assoc 10 textent)
                               textent)
                textent (subst (cons 11 newpt)
                               (assoc 11 textent)
                               textent)
          ) ;setq
          (entmod textent)
          (entupd (acet-dxf -1 textent))
        )
      )  ;;end of points check
    )
  ) ;cond
  (acet-error-restore)
  (princ)
) ;end defun
plaz вне форума  
 
Непрочитано 05.02.2004, 17:07
#16
VK как гость


 
Сообщений: n/a


Не могу авторизоваться....

>plaz
Фишка с шириной символов вот в этом фрагменте:
Код:
[Выделить все]
textent (subst (cons 41 ltc_%) 
                               (assoc 41 textent) 
                               textent)
Далее идут изменения начальной и конечной точек текста
Код:
[Выделить все]
textent (subst (cons 10 start) 
                               (assoc 10 textent) 
                               textent) 
                textent (subst (cons 11 newpt) 
                               (assoc 11 textent) 
                               textent)
И наконец обновление примитива TEXT
Код:
[Выделить все]
(entmod textent) 
          (entupd (acet-dxf -1 textent))
 
 
Непрочитано 06.02.2004, 06:45
#17
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Plaz> Для изменения высоты текста я имел в виду другую команду: TSCALE. Сама, по названию (Scale это масштаб) просится в корзинку, а никто не догадался. Команда TEXTFIT используется только для изменения ширины-это твоя вторая хотелка.
*^C^C_select;single;\tscale;p;;e;h;5
Это для изменения высоты любого текста, включая атрибуты блока. Конечная высота 5 единиц (можно поменять)
ВНИМАНИЕ!!! при прямом копировании отсюда в окно Customize могут возникнуть нежелательние значки вроде ^М. Сотрите, если будет так.
^C^C_select;single;\tscale;p;;e;h;5;copy;p;;@;@;e;p;;textfit;l;s
Это комбинация для одновременного изменения высоты и ширины. Требует 3 клика: указать объект, начало и конец новой ширины. Ограничение-не меняет ширину Mtext.
Vova вне форума  
 
Автор темы   Непрочитано 06.02.2004, 10:33
#18
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Цитата:
Сообщение от Vova
Для изменения высоты текста я имел в виду другую команду: TSCALE.
Так это же 2004 Express, а я работаю с 2000-ым, там такой команды нет

Цитата:
Сообщение от Vova
Команда TEXTFIT используется только для изменения ширины-это твоя вторая хотелка.
Это моя первая хотелка

В конечном итоге должен согласится с vk и Startrek, дело пахнет лиспом. Я предполагал, что возможно при помощи командной строки задавать строго определенное значение ширины текста, а не такое какое получится (Textfit). Не вышло . Хотя еще не вечер, будем рыть дальше [sm2006]
plaz вне форума  
 
Непрочитано 06.02.2004, 10:40
#19
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от plaz
В конечном итоге должен согласится с vk и Startrek, дело пахнет лиспом.
За та четыре дня, что вы здесь обсуждаете этот вопрос, давно бы уже lisp'ик написали...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 06.02.2004, 13:37
#20
plaz

Проектирование обустройства нефтяных месторождений
 
Регистрация: 28.08.2003
Самара
Сообщений: 352


Мы не ищем простых путей. Дело принципа :!:
plaz вне форума  
 
Непрочитано 06.02.2004, 16:39
#21
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от plaz
Мы не ищем простых путей. Дело принципа :!:
Прекрасно вас понимаю. Сам иногда такой...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 06.02.2004, 17:35
#22
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Макросы - прекрасная и очень наглядная штука с нешуточными возможностями.
Но они обладают одним очень неприятным свойством, сводящим все их достоинства на нет: при повторе энтером повторяется не весь макрос, а только команда, на которой он построен.
Из-за этого их (макросов) область применения ограничивается нечастыми действиями. Если же нужны постоянные повторы - без лиспа не обойтись. Или же нужно непрерывно гонять мышку к соответствующей кнопке на тулбаре.
Второе органичение кроется даже не в макросах как таковых, а в структуре файла acad.pgp. Если бы алиасы там можно было прописывать в виде макросов, то цены бы не было и тем и другим. (Но все это уже для любителей работать с клавы).
Резюмируя, можно утверждать, что для производительной работы нужно писать лиспы. Вдобавок, они еще и гибче.
Все это имхо, ессно.
Pilot вне форума  
 
Непрочитано 06.02.2004, 17:52
#23
Андрей С.

Архитектор
 
Регистрация: 25.08.2003
Москва
Сообщений: 307


>Pilot
Есть способ обойти такое неудобство, как невозможность вызова макроса энтером. Ставим перед ним *, и он со всеми опциями повторяется в цикле, пока не нажмем Esc. Причем работает и для макросов, где задействована более чем одна команда. Давным-давно, в Акаде версии этак 10-й, в стандартном меню многие команды с опциями были так "зациклены". От этого постепенно отказались ради особенностей виндового интерфейса (во время действия команды недоступны раскрывающиеся списки, ну, вроде слоев или цветов). Но до сих пор все это работает. Я, например, этим вовсю пользуюсь. Пример:
*^C^C_select _auto \_COPY _p;;0,0 0,0 _rotate _p;;^M;
работает как Rotate+Copy. Много раз.
ЗЫ. Если народ об этом забыл, может, напомнить в теме про тюнинг?
ЗЗЫ. Интересно, Vova не забыл об этом в книжке написать?
Андрей С. вне форума  
 
Непрочитано 08.02.2004, 03:03
#24
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Plaz> трудную задачку ты задал для макроса, со многими ограничениями: в чертежах как будто специально подобран неправильный по ширине текстовой стиль, и почему-то фиксированная высота в стилях стоит, хотя нулевая удобней... и автокад старый, и пути трудные тебе милей. Наверное, специально, чтобы было что исправлять при ограниченных возможностях. Я сдаюсь.
Pilot> Уже в 2000 появилось контекстное меню на правой кнопке, первый пункт которого вызывает макрос любой длины. Это меню было одним из крупных новшеств 2000, ускоряющих работу независимо от наличия макросов. В 14-м для повтора надо было вторично нажать на кнопку, но даже так значительно ускоряется черчение. Я начинал в 97-LT. Помог бы ты мне своими лиспами? Про алиасы не понял, видимо, имеется в виду, что длинному макросу не присвоить сокращения, но его можно посадить на горячие клавиши. По ЛИСПам. Сколько ч-к из 100 пользователей могут похвастаться знанием лиспа? 1 или 2. Это трудный язык. Есть ли хорошие книги для самостоятельного изучения? Говорят, что нет. Только настырный человек может научиться сам. Так что макросы это неплохая замена, и через них можно двигаться дальше, к лиспу и др.
Андрей С> Звездочка применяется, если подряд , без остановки, надо сделать повторяющиеся действия. Это не всегда возможно. Например, второй макрос в моем сообщении от 6 фев. Иногда от звездочки автокад зацикливается в кольцо, в книге дан пример. Твой макрос поворачивает объекты на том месте, где они находятся, оставляя копии. Часто ли это надо? Сделай из этого чтобы копия переносилась на новое место и уже там поворачивалась. Очень удобно в практике. И освоишь интересный прием, без которого не получится. В книжке, конечно, есть. A у тебя книжки почему-то нет, хотя макрос имеется
Vova вне форума  
 
Непрочитано 09.02.2004, 09:44
#25
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


2 Vova
Повтор макроса из контекстного меню - я не знал об этом! Просто пользуюсь этим меню крайне редко.
Но утверждаю: Быстрее и удобнее повторить макрос, ткнув в ту же кнопку, на которой он висит. Кому как, конечно.

Насчет алиасов ты понял меня правильно - длинный (да и короткий) макрос не садится на клавиатурное сокращение. Да, это можно сделать по горячим клавишам. Но большинство горячих подразумевают использование двух клавиш одновременно (типа Ctrl+еще_что_нибудь). Требуется "растяжка" кисти руки. Дискомфорт.
Поэтому я навесил что-либо только на функциональные клавиши. (Единственно, мне не удалось переопределить F1 - хэлп выскакивает с завидным упорством.)
Также легко переопределяются цифровые клавиши на keypad - но это только для тех, кто не использует там цифровой ввод.
Pilot вне форума  
 
Непрочитано 09.02.2004, 12:35
#26
Андрей С.

Архитектор
 
Регистрация: 25.08.2003
Москва
Сообщений: 307


2 Vova
Мне именно такой макрос нужен и удобен, это не баг, а фича:-), я его (и другие для своих задач) пользовал задолго до книги. Просто большинство моих приблуд лучше функционируют в виде лиспов, хотя и макросами "не брезгую".
А насчет того, что Лисп трудный язык и нет хороших книжек, ты, по-моему, погорячился. Легче многих других и книги есть. Его не обязательно осваивать сразу и в полном объеме. Начать можно с простейшего. Да, согласен, для LT это не проходит. Да, макросы писать проще. Так никто же и не говорит, что макросы-это плохо... Кому что...
А книга просто еще не попадалась в продаже....
Андрей С. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос и текст