Тема: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

Может кто- нибудь написать или есть готовая программа для выравнивания однострочных текстов по горизонтали? Спасибо.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для 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

Довольно корявенькая программа, но текст выравнивает.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир Громов
Сейчас буду проверять. У меня вот какая этическая проблема возникла. Нашел программу в Интернете. Задумано хорошо.
Но, работает с ошибками. Писал автору. Не отвечает. Выложить на форуме для правки не решаюсь. Программа как раз по этой теме. Что делать?

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир
Громов
Выравнивает, то что надо.
Но:
1. Выравнивает по вертикали. Правда, мне это тоже надо.
2. Можно сделать так, что бы выравнивать не по левому крайнему тексту, а по указанному пользователем ?

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир Громов
Программа работает!
Пожалуста не приймите за критику написанное ниже.
Почему Вы всегда выбираете объекты одной рамкой?
Ведь первым объектом к которому будет осуществлятся привязка неизвестно какой. И выбор объектов только одной рамкой ограничивает выбор примитивов пользователя.
Предлагаю заменить в начале кода строки

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
вечером (дома) выложу программу которая вам нужна,  выравнивает по осям и с привязками хоть куда, относительно указанной точки. Сверимся?

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Forma
Тут я немного промахнулся. Поскольку смещение строк происходит по горизонтали, я и написал про выравнивание по горизонтали. Как-то это надо подправить. Я думаю, что эту программу я скопирую в другую тему, а для этой темы у меня в разработке аналогичная программа. Можно попробовать сделать выравнивание по тексту, указанному пользователем, но это не сразу. Только надо иметь в виду, что выравнивание текста (Justify) конкретной строки меняет координаты точки вставки. Анализ этого у меня не производится, считается, что все строки выравнены влево, что, вообщем-то, естественно для однострочного текста, IMHO.
Сейчас прочитал сообщение ZZZ, согласен с замечаниями. Моя программа, так сказать, отладочный вариант. Вижу, что никто товарищу Forma не хочет помочь, ну и решил дать пробный вариант. Но если у вас есть возможность привести лучший вариант программы, я буду только рад, думаю, что и товарищ Forma тоже. Возможно и мне пригодится такая программа, даже уверен в этом.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> ZZZ
Вообще-то я подумал и хочу вот что сказать. Если в рисунке есть несколько столбцов текста, то выбрав их все (а ваш вариант позволяет это), можно разрушить компоновку текста на листе. Поэтому у меня и выбирается однозначно только одна колонка текста. Именно такие и были соображения при выборе текста рамкой. А всякие другие примитивы отсеиваются и вертикальный текст тоже.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

Владимир Громов пишет:

Только надо иметь в виду, что выравнивание текста (Justify) конкретной строки меняет координаты точки вставки.

А вот с этим надо быть внимательным. Потому как и в AutoCAD это выполняется неоднозначно. Уже наступал на эти "грабли".
И похоже не я один.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир Громов
Только один столбец или одна строка. Не усложняйте. А то запутаться не долго. Обратите внимание на мой пост выше.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> ZZZ
А, заодно, если не трудно, повторите Ваши рекомендации по ускорению AutoCAD.
Администратор вырезал по Вашей же просьбе (недоуменно). Мы же не рыбалке общались.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Forma
Как рыбак рыбаку Вам по таким вопросам сюда:
https://www.caduser.ru/forum/forum2.html
Но всеравно подскажу. Если Вы пользуетесь пространствами листа то в опциях на вкладке System в поле Layout Regen Options выберите Cache model tab and last layout. А также на вкладке Display уменьшите значения Display resolutions.
У меня к Вам большая просьба - пишите замечания только по теме.
А также у меня создаётся впечатления, что Мы (форумчане) сейчас работаем на какуюто иностраную фирму или на когото. Так как мы какбы выполняем план, примерно по проге в день.  Forma мы не конвеер для программ. Это лично моё мнение, скажите держать его при себе.
Теперь по теме:

> Владимир Громов
При способе предложенном мною, пользователь может добавлять и удалять из набора примитимвы, а также выбор позволяет выбирать и вашим методом (рамкой). Азы: выбор рамки слева на право - только то что точно внутри, с право на лево - внутри и пересекает рамку.
Также а если я хочу отформатировать только первые строки предложений, я их и выбираю кликая на них. Удаляется примитив из набора кликаньем или рамкой с нажатым шифтом.
А также для однострочных текстов точка вставки всегда находистя по коду 10, а точка выравнивания текста плавает. Но если вы уже начали выравнивать текст то используйте стандартную команду акада _justifytext она оставляет текст на старом месте.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> ZZZ
Ну, я ведь написал, что программа корявенькая. Однако, я все равно сторонник жесткого выбора рамкой только нужного текста, IMHO. Азы известны, спасибо.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> ZZZ
А дым отечества уже не сладок?
Не обидно за отчизну? Вы бы посмотрели как работают там. Надо не по одной задаче в день, по 5 готовых программ из закромов.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Forma
Ну так вперед! Скрипты + DIESEL + LISP + ObjARX (в порядке возрастания сложности). Соображалка тоже понадобится.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Forma
Нужно и на своей работе работать, вроде не безработные, и в первую очередь свою работу делать здесь(хлебушка то хочется).
Присоеденяюсь к kpblc. Учится никогда не поздно, раз надо по пять программ в день.
Давайте лучше не бросатся лозунгами, а работать, мы здесь, а Вы там.
Мы по мере возможности и желания, будем Вам помогать подымать целину.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

Еще один маленький момент. Тут очень немногие стараются написать программу / функцию / макрос, выполняющие одну-единственную задачу в единственных условиях. Поэтому (и только поэтому) некоторые задачи решать неинтересно и (или) некогда - слишком уникальный случай, проще сделать руками.
Подход, который использует Forma, может, и не плох. Но не для меня уже, например. Чем делать 5 программ в день, я лучше вычислю, чем они одинаковы, и напишу одну - универсальную, и буду ее вызывать с разными параметрами.
Все, если честно, я устал доказывать очевидное. Будет желание и возможность - может, и буду что подсказывать.
Напоследок - пожелание. Программирование требует системного подхода. Нахрапом тут, как правило, не получается. А если получается, то такое, что лучше бы и не было.
В остальном прощаюсь с Forma и желаю ему быть чуть менее требовательным к другим (никто никому ничего не должен) и чуть поболее жестким к себе.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> kpblc
Взаимно. И тоже удовольствим прощаюсь.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

посмотрите сюда
https://www.caduser.ru/forum/topic20074.html

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

;****************** 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

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

Макрос неправильный, должен быть такой:

^C^C^P(if (not C:ALH_TEXT) (load "alh_text") ALH_TEXT

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир Громов
Не хочет все равно работать. Выравнивание по вертикали работает. А, эта нет.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Forma
Протокол запуска можно посмотреть?

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

Вариант программы с произвольным выборов объектов:

;****************** 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 РУС.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

И на 2006 ENG. Работает.

Re: Программа+макрос на кнопку "Выравнивание однострочных текстов по горизонтали" для AutoCAD 2006

> Владимир Громов
Отключайте привязки