Тема: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006
Может кто- нибудь написать или есть готовая программа для выравнивания однострочных текстов по горизонтали? Спасибо.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → LISP → Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Может кто- нибудь написать или есть готовая программа для выравнивания однострочных текстов по горизонтали? Спасибо.
Программа выравнивания однострочных текстов по горизонтали. Шаблоном служит точка вставки самой "левой" строки текста.
;****************** alh_text ********************************************* ; align_hor_text Выравнивание однострочного текста по горизонтали. ; Шаблоном служит точка вставки самой "левой" строки. ; Автор Владимир Громов (defun C:ALH_TEXT ( / tn tk ss1 ss ssn1 pp pp1 n e two tws two_min twx twm) (setvar "cmdecho" 0) (princ "\n Выбор текстовых строк.") (setq tn (getpoint " Первый угол рамки: ")) (setq tk (getcorner tn "\n Второй угол рамки: ")) (setq ss1 (ssget "_W" tn tk)) (if ss1 (progn (setq ss (ssadd)) ;Создан пустой набор (setq ssn1 (sslength ss1) n 0) ;Количество примитивов (repeat ssn1 (setq pp (ssname ss1 n)) ;Имена примитивов (setq pp1 (entget pp)) ;Данные примитива с именем pp (cond ((and(= (cdr (assoc '0 pp1)) "TEXT") (= (cdr (assoc '50 pp1)) 0)) (ssadd pp ss) ;Набор ТЕКСТОВ )); cond (setq n (+ n 1)) ); repeat (setq ssn (sslength ss) n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cadr (assoc 10 (entget e)))) (setq tws (cons two tws)) (princ tws) (setq n (+ n 1)) ); repeat (setq two_min (apply 'min tws)) (princ two_min) (setq n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cdr (assoc 10 (entget e)))) (setq twx (- (car two) two_min)) (setq twm (list (- (car two) twx) (cadr two))) (command "_MOVE" e "" "_none" two "_none" twm) (setq n (+ n 1)) ); repeat ); progn (princ "\n Нет выбранных объектов. ") ); if (princ) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:ALH_TEXT) (load "alh_text") C:ALH_TEXT
Довольно корявенькая программа, но текст выравнивает.
> Владимир Громов
Сейчас буду проверять. У меня вот какая этическая проблема возникла. Нашел программу в Интернете. Задумано хорошо.
Но, работает с ошибками. Писал автору. Не отвечает. Выложить на форуме для правки не решаюсь. Программа как раз по этой теме. Что делать?
> Владимир
Громов
Выравнивает, то что надо.
Но:
1. Выравнивает по вертикали. Правда, мне это тоже надо.
2. Можно сделать так, что бы выравнивать не по левому крайнему тексту, а по указанному пользователем ?
> Владимир Громов
Программа работает!
Пожалуста не приймите за критику написанное ниже.
Почему Вы всегда выбираете объекты одной рамкой?
Ведь первым объектом к которому будет осуществлятся привязка неизвестно какой. И выбор объектов только одной рамкой ограничивает выбор примитивов пользователя.
Предлагаю заменить в начале кода строки
setq tn (getpoint " Первый угол рамки: ")) (setq tk (getcorner tn "\n Второй угол рамки: ")) (setq ss1 (ssget "_W" tn tk))
на
(setq ss (ssget '((0 . "TEXT")(50 . 0))))
Что позволит выкинуть из Вашей программы код на проверку типа примитива и угла поворота:
(setq ss (ssadd)) ;Создан пустой набор (setq ssn1 (sslength ss1) n 0) ;Количество примитивов (repeat ssn1 (setq pp (ssname ss1 n)) ;Имена примитивов (setq pp1 (entget pp)) ;Данные примитива с именем pp (cond ((and(= (cdr (assoc '0 pp1)) "TEXT") (= (cdr (assoc '50 pp1)) 0)) (ssadd pp ss) ;Набор ТЕКСТОВ )); cond (setq n (+ n 1)) ); repeat
А код:
(setq ssn (sslength ss) n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cadr (assoc 10 (entget e)))) (setq tws (cons two tws)) (princ tws) (setq n (+ n 1)) ); repeat (setq two_min (apply 'min tws)) (princ two_min) (setq n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cdr (assoc 10 (entget e)))) (setq twx (- (car two) two_min)) (setq twm (list (- (car two) twx) (cadr two))) (command "_MOVE" e "" "_none" two "_none" twm) (setq n (+ n 1)) ); repeat ); progn
сделать не используя команду _MOVE с включеными привязками. Тут много вариантов построение процеса например через while или mapcar, и при этом менять только 10 группу кода примитива.
> Forma
вечером (дома) выложу программу которая вам нужна, выравнивает по осям и с привязками хоть куда, относительно указанной точки. Сверимся?
> Forma
Тут я немного промахнулся. Поскольку смещение строк происходит по горизонтали, я и написал про выравнивание по горизонтали. Как-то это надо подправить. Я думаю, что эту программу я скопирую в другую тему, а для этой темы у меня в разработке аналогичная программа. Можно попробовать сделать выравнивание по тексту, указанному пользователем, но это не сразу. Только надо иметь в виду, что выравнивание текста (Justify) конкретной строки меняет координаты точки вставки. Анализ этого у меня не производится, считается, что все строки выравнены влево, что, вообщем-то, естественно для однострочного текста, IMHO.
Сейчас прочитал сообщение ZZZ, согласен с замечаниями. Моя программа, так сказать, отладочный вариант. Вижу, что никто товарищу Forma не хочет помочь, ну и решил дать пробный вариант. Но если у вас есть возможность привести лучший вариант программы, я буду только рад, думаю, что и товарищ Forma тоже. Возможно и мне пригодится такая программа, даже уверен в этом.
> ZZZ
Вообще-то я подумал и хочу вот что сказать. Если в рисунке есть несколько столбцов текста, то выбрав их все (а ваш вариант позволяет это), можно разрушить компоновку текста на листе. Поэтому у меня и выбирается однозначно только одна колонка текста. Именно такие и были соображения при выборе текста рамкой. А всякие другие примитивы отсеиваются и вертикальный текст тоже.
Только надо иметь в виду, что выравнивание текста (Justify) конкретной строки меняет координаты точки вставки.
А вот с этим надо быть внимательным. Потому как и в AutoCAD это выполняется неоднозначно. Уже наступал на эти "грабли".
И похоже не я один.
> Владимир Громов
Только один столбец или одна строка. Не усложняйте. А то запутаться не долго. Обратите внимание на мой пост выше.
> ZZZ
А, заодно, если не трудно, повторите Ваши рекомендации по ускорению AutoCAD.
Администратор вырезал по Вашей же просьбе (недоуменно). Мы же не рыбалке общались.
> Forma
Как рыбак рыбаку Вам по таким вопросам сюда:
https://www.caduser.ru/forum/forum2.html
Но всеравно подскажу. Если Вы пользуетесь пространствами листа то в опциях на вкладке System в поле Layout Regen Options выберите Cache model tab and last layout. А также на вкладке Display уменьшите значения Display resolutions.
У меня к Вам большая просьба - пишите замечания только по теме.
А также у меня создаётся впечатления, что Мы (форумчане) сейчас работаем на какуюто иностраную фирму или на когото. Так как мы какбы выполняем план, примерно по проге в день. Forma мы не конвеер для программ. Это лично моё мнение, скажите держать его при себе.
Теперь по теме:
> Владимир Громов
При способе предложенном мною, пользователь может добавлять и удалять из набора примитимвы, а также выбор позволяет выбирать и вашим методом (рамкой). Азы: выбор рамки слева на право - только то что точно внутри, с право на лево - внутри и пересекает рамку.
Также а если я хочу отформатировать только первые строки предложений, я их и выбираю кликая на них. Удаляется примитив из набора кликаньем или рамкой с нажатым шифтом.
А также для однострочных текстов точка вставки всегда находистя по коду 10, а точка выравнивания текста плавает. Но если вы уже начали выравнивать текст то используйте стандартную команду акада _justifytext она оставляет текст на старом месте.
> ZZZ
Ну, я ведь написал, что программа корявенькая. Однако, я все равно сторонник жесткого выбора рамкой только нужного текста, IMHO. Азы известны, спасибо.
> ZZZ
А дым отечества уже не сладок?
Не обидно за отчизну? Вы бы посмотрели как работают там. Надо не по одной задаче в день, по 5 готовых программ из закромов.
> Forma
Ну так вперед! Скрипты + DIESEL + LISP + ObjARX (в порядке возрастания сложности). Соображалка тоже понадобится.
> Forma
Нужно и на своей работе работать, вроде не безработные, и в первую очередь свою работу делать здесь(хлебушка то хочется).
Присоеденяюсь к kpblc. Учится никогда не поздно, раз надо по пять программ в день.
Давайте лучше не бросатся лозунгами, а работать, мы здесь, а Вы там.
Мы по мере возможности и желания, будем Вам помогать подымать целину.
Еще один маленький момент. Тут очень немногие стараются написать программу / функцию / макрос, выполняющие одну-единственную задачу в единственных условиях. Поэтому (и только поэтому) некоторые задачи решать неинтересно и (или) некогда - слишком уникальный случай, проще сделать руками.
Подход, который использует Forma, может, и не плох. Но не для меня уже, например. Чем делать 5 программ в день, я лучше вычислю, чем они одинаковы, и напишу одну - универсальную, и буду ее вызывать с разными параметрами.
Все, если честно, я устал доказывать очевидное. Будет желание и возможность - может, и буду что подсказывать.
Напоследок - пожелание. Программирование требует системного подхода. Нахрапом тут, как правило, не получается. А если получается, то такое, что лучше бы и не было.
В остальном прощаюсь с Forma и желаю ему быть чуть менее требовательным к другим (никто никому ничего не должен) и чуть поболее жестким к себе.
> kpblc
Взаимно. И тоже удовольствим прощаюсь.
посмотрите сюда
https://www.caduser.ru/forum/topic20074.html
;****************** alh_text ********************************************* ; align_hor_text Выравнивание однострочного текста по горизонтали. ; Шаблоном для выравнивания служит точка вставки ; указанной строки, но можно указать и любой ; другой объект, например, горизонтальный отрезок. ; Автор Владимир Громов ; (defun C:ALH_TEXT ( / tn tk ss1 ss ssn1 pp pp1 n e txtt txt twa two twm) (setq echo (getvar "cmdecho")) (setvar "cmdecho" 0) (princ "\n Выбор текстовых строк.") (setq tn (getpoint " Первый угол рамки: ")) (setq tk (getcorner tn "\n Второй угол рамки: ")) (setq ss1 (ssget "_W" tn tk)) (if ss1 (progn (setq ss (ssadd)) ;Создан пустой набор (setq ssn1 (sslength ss1) n 0) ;Количество примитивов (repeat ssn1 (setq pp (ssname ss1 n)) ;Имена примитивов (setq pp1 (entget pp)) ;Данные примитива с именем pp (cond ((and (= (cdr (assoc '0 pp1)) "TEXT") (equal (cdr (assoc '50 pp1)) 1.57 0.01)) (ssadd pp ss) ;Набор ТЕКСТОВ )); cond (setq n (+ n 1)) ); repeat (setq ssn (sslength ss) n 0) (setq txtt (entsel "\n Выберите строку-шаблон для выравнивания: ")) (setq txt (car txtt)) (setq twa (cdr (assoc 10 (entget txt)))) (setq n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cdr (assoc 10 (entget e)))) (setq twm (list (car two) (cadr twa))) (command "_MOVE" e "" "_none" two "_none" twm) (setq n (+ n 1)) ); repeat ); progn (princ "\n Нет выбранных объектов. ") ); if (setvar "cmdecho" echo) (princ) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:ALH_TEXT) (load "alh_text") ALO_TEXT
Макрос неправильный, должен быть такой:
^C^C^P(if (not C:ALH_TEXT) (load "alh_text") ALH_TEXT
> Владимир Громов
Не хочет все равно работать. Выравнивание по вертикали работает. А, эта нет.
> Forma
Протокол запуска можно посмотреть?
Вариант программы с произвольным выборов объектов:
;****************** alh_text ********************************************* ; align_hor_text Выравнивание однострочного текста по горизонтали. ; Шаблоном для выравнивания служит точка вставки ; указанной строки, но можно указать и любой ; другой объект, например, горизонтальный отрезок. ; Автор Владимир Громов ; (defun C:ALH_TEXT ( / tn tk ss1 ss ssn1 pp pp1 n e txtt txt twa two twm) (setq echo (getvar "cmdecho")) (setvar "cmdecho" 0) (princ "\n Выберите текстовые строки:") (setq ss1 (ssget)) (if ss1 (progn (setq ss (ssadd)) ;Создан пустой набор (setq ssn1 (sslength ss1) n 0) ;Количество примитивов (repeat ssn1 (setq pp (ssname ss1 n)) ;Имена примитивов (setq pp1 (entget pp)) ;Данные примитива с именем pp (cond ((and (= (cdr (assoc '0 pp1)) "TEXT") (equal (cdr (assoc '50 pp1)) 1.57 0.01)) (ssadd pp ss) ;Набор ТЕКСТОВ )); cond (setq n (+ n 1)) ); repeat (setq ssn (sslength ss) n 0) (setq txtt (entsel "\n Выберите строку-шаблон для выравнивания: ")) (setq txt (car txtt)) (setq twa (cdr (assoc 10 (entget txt)))) (setq n 0) (repeat ssn (setq e (ssname ss n)) (setq two (cdr (assoc 10 (entget e)))) (setq twm (list (car two) (cadr twa))) (command "_MOVE" e "" "_none" two "_none" twm) (setq n (+ n 1)) ); repeat ); progn (princ "\n Нет выбранных объектов. ") ); if (setvar "cmdecho" echo) (princ) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:ALH_TEXT) (load "alh_text") ALH_TEXT
Программа проверялась на AutoCAD 2005 РУС.
И на 2006 ENG. Работает.
> Владимир Громов
Отключайте привязки
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc