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

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

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

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

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

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<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 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос и текст

Размещение рекламы