Re: Комплект полезных утилит из BricsCad в AutoCAD

kpblc пишет:

Если в радиусном (да и вообще в любом размере) в качестве TextOverride поставить нечто типа <>\XВторая строка то "Вторая строка" будет помещена "под" размерную линию.

У меня почему-то обе строки над размерной линией...

Re: Комплект полезных утилит из BricsCad в AutoCAD

Вот черт... В AutoCAD вторая строка съезжает вниз. В Brics'e - только если размер позиционируется посередине размерной (по вертикали).
Тогда не знаю :(

Re: Комплект полезных утилит из BricsCad в AutoCAD

Ну вот, уже опередили;)
Получил в Brics те же результаты, что и kpblc.
Но такое расположение текста не подходит. Будем копать дальше...

Re: Комплект полезных утилит из BricsCad в AutoCAD

> CB
Разобрался, почему не работал вариант с textbox.
В BricsCAD команда возвращает параметры только существующего d чертеже текстового объекта в отличие от Акада. Все решается временной вставкой текста, определением его длины командой textbox и последующим удалением временного объекта. Немножко громоздко, но работает.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Евгений пишет:

В BricsCAD команда возвращает параметры только существующего в чертеже текстового объекта в отличие от Акада.

А c какими тогда параметрами осуществляется вызов функции textbox в Brics'e? Там что, должно присутствовать имя примитива? Если да, то можно вместо временной вставки текста и его удалением использовать команду "cutclip"...

Re: Комплект полезных утилит из BricsCad в AutoCAD

> CB
Я сделал в таком варианте:

(command "_text" "_m" tce uz1f "0" txt1)
    (setq txt_1 (entlast))
    (setq tbox1 (car(cadr(textbox (entget txt_1)))))
    (entdel txt_1)
    (command "_text" "_m" tce uz2f "0" txt2)
    (setq txt_2 (entlast))
    (setq tbox2 (car(cadr(textbox (entget txt_2)))))
    (entdel txt_2)        
(setq llen (+ 2.0
    (apply 'max (list tbox1 tbox2))))

В итоге получаю нужное значение llen. Может не очень красиво, но работает.

Re: Комплект полезных утилит из BricsCad в AutoCAD

CB пишет:

можно вместо временной вставки текста и его удалением использовать команду "cutclip"...

А какой выигрыш дает конструкция с cutclip?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Чтобы выяснить нужно ли имя примитива для работы textbox'а в Brics'e, попробуй вложить в textbox минимальный список, используемый функцией (enmake) для создания текстового примитива.

(entmake
  (list    '(0 . "TEXT")
    '(7 . "Standard")
    '(40 . 5.0)
    (cons 1 "ТЕКСТ1")
    (cons 10 (cadr (grread 5)))
  )
)

Т.е так:

(textbox
  (list    '(0 . "TEXT")
    '(7 . "Standard")
    '(40 . 5.0)
    (cons 1 "ТЕКСТ1")
    (cons 10 (cadr (grread 5)))
  )
)

Если возвратится что-то типа ((0.0 -4.44089e-016 0.0) (18.7 5.0 0.0)), поочередно убирай группу 10, 7 и 0. Я думаю что ему нужна группа 40 (высота текста), а может и стиль?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
А вот так:

(setq te "Проверка")
(textbox (list (cons 1 te)))

?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Владимир Громов
В AutoCAd'e работает, в Brics'e - нет.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> CB
Извиняюсь за задержку с ответом - текучка как всегда :)
Попробовал проверку по твоему рецепту:
получилось что требуются группы 0 и 40.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Заработало в таком варианте:

(setq llen (+ 2.
    (apply 'max
     (mapcar '(lambda (x y)
          (setvar "textsize" x)
          (car (cadr (textbox
          (list
          '(0 . "TEXT")
          (cons 40 x)
          (cons 1 y)))))
        )
       (list uz1f uz2f)
       (list txt1 txt2)
     )
    )
           )
)

Спасибо СВ за наводку.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Владимир Громов

> kpblc
И вам тоже ;)

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
(setvar "textsize" x) - не нужно.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> CB
Сорри, согласен, осталось от старого варианта.
И осталась пока головная боль с динамикой при вставке выноски с текстом. Но, думаю, что и с этим удастся разобраться.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Вышел BricsCAD BonusTools 1.1.0016.
Скачать как всегда бесплатно можно по адресу
http://sabit.com.ua/apps.php
Хочу еще раз поблагодарить СВ, kpblca и Владимира Громова за советы и помощь в доработке
программ.
PS:

И осталась пока головная боль с динамикой при вставке выноски с текстом.

Пока этот вопрос решить в полной мере так и не удалось.
Пробовал вариант kpblc`a

(if (and (setq start_point (getpoint "\nНачало : "))
(setq end_point (getpoint start_point "\nКонец : ")))
(progn
;; Погнали основной код
)
(progn
;; Ошибка
)
)

Но видать квалификации не хватает, не заработало.
2 kpblc
Если есть возможность, дай ссылку или приведи какой-нибудь простой пример действующей аналогичной конструкции.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Примерно так, наверное. Только надо учесть возможный некорректный textbox (это для замены Leader'a)

(defun tmpcmd (/           pt_start    pt_end      str_1       str_2
               lead        txt_height  hor_line_len1           hor_line_len2
               fld         align
               )
  (if (and (setq pt_start (getpoint "\nНачало <Выход> : "))
           (setq pt_end (getpoint pt_start "\nОкончание <Выход> : "))
           (/= (setq str_1 (getstring t "\nВерхняя строка <Выход> : ")) "")
           (setq str_2 (getstring t "\nНижняя строка <Выход> : "))
           ) ;_ end of and
    (progn
      ;; Основной код работы
      (setq txt_height    (atof
                            (cond
                              ((getreal
                                 (strcat
                                   "\nВысота текста <"
                                   (rtos
                                     (cond
                                       ((equal
                                          0.
                                          (cdr (assoc
                                                 40
                                                 (entget
                                                   (tblobjname
                                                     "style"
                                                     (getvar "textstyle")
                                                     ) ;_ end of tblobjname
                                                   ) ;_ end of entget
                                                 ) ;_ end of assoc
                                               ) ;_ end of cdr
                                          1e-3
                                          ) ;_ end of equal
                                        2.5
                                        )
                                       ((not (equal (getvar "textsize") 0. 0.01))
                                        (getvar "textsize")
                                        )
                                       (t
                                        (cdr
                                          (assoc
                                            40
                                            (entget
                                              (tblobjname "style" (getvar "textstyle"))
                                              ) ;_ end of entget
                                            ) ;_ end of assoc
                                          ) ;_ end of cdr
                                        )
                                       ) ;_ end of cond
                                     ) ;_ end of rtos
                                   "> : "
                                   ) ;_ end of strcat
                                 ) ;_ end of getreal
                               )
                              (t
                               (rtos
                                 (cond
                                   ((equal
                                      0.
                                      (cdr
                                        (assoc
                                          40
                                          (entget
                                            (tblobjname "style" (getvar "textstyle"))
                                            ) ;_ end of entget
                                          ) ;_ end of assoc
                                        ) ;_ end of cdr
                                      1e-3
                                      ) ;_ end of equal
                                    2.5
                                    )
                                   ((not (equal (getvar "textsize") 0. 0.01))
                                    (getvar "textsize")
                                    )
                                   (t
                                    (cdr
                                      (assoc
                                        40
                                        (entget
                                          (tblobjname "style" (getvar "textstyle"))
                                          ) ;_ end of entget
                                        ) ;_ end of assoc
                                      ) ;_ end of cdr
                                    )
                                   ) ;_ end of cond
                                 ) ;_ end of rtos
                               )
                              ) ;_ end of cond
                            ) ;_ end of atof
            lead          (entmake (list (cons 0 "LINE")
                                         (cons 10 pt_start)
                                         (cons 11 pt_end)
                                         ) ;_ end of list
                                   ) ;_ end of entmake
            ;; Вычисляем "описывающие" прямоугольники вокруг текста
            hor_line_len1 (textbox (list (cons 0 "TEXT")
                                         (cons 40 txt_height)
                                         (cons 1 str_1)
                                         ) ;_ end of list
                                   ) ;_ end of textbox
            hor_line_len2 (textbox (list (cons 0 "TEXT")
                                         (cons 40 txt_height)
                                         (cons 1 str_2)
                                         ) ;_ end of list
                                   ) ;_ end of textbox
            ;; Здесь уже надо вычислять, в какую сторону будет идти
            ;; выравнивание текста. Попробуем? Принимаем, что для
            ;; выравнивания текста "вправо" align = t, для всего остального -
            ;; nil
            align         (<= (car pt_end) (car pt_start))
            ;; Длина горизонтальной линии "без увеличения"
            fld           (max (abs (- (caadr hor_line_len1) (caar hor_line_len1)))
                               (abs (- (caadr hor_line_len2) (caar hor_line_len2)))
                               ) ;_ end of max
            ) ;_ end of setq
      ;; Делаем собственно гор.линию:
      (entmake (list (cons 0 "LINE")
                     (cons 10 pt_end)
                     (cons 11
                           (list (if align
                                   (- (car pt_end) fld 1.)
                                   (+ (car pt_end) 1. fld)
                                   ) ;_ end of if
                                 (cadr pt_end)
                                 (caddr pt_end)
                                 ) ;_ end of list
                           ) ;_ end of cons
                     ) ;_ end of list
               ) ;_ end of entmake
      ;; А вот теперь уже собственно тексты
      (mapcar
        '(lambda (x / lst)
           (setq lst (list (cons 0 "TEXT")
                           (cons 1 (car x))
                           (cons 40 txt_height)
                           ;; Вот здесь фигня какая-то получается :(
                           (cons 72
                                 (if align
                                   2
                                   0
                                   ) ;_ end of if
                                 ) ;_ end of cons
                           (cons 10 (cdr x))
                           ) ;_ end of list
                 ) ;_ end of setq
           (if align
             (setq lst (append lst
                               (list (cons 11 (cdr x))
                                     ) ;_ end of list
                               ) ;_ end of append
                   ) ;_ end of setq
             ) ;_ end of if
           (entmake lst)
           ) ;_ end of lambda
        (list
          (cons str_1
                (list (car pt_end)
                      (+ (cadr pt_end) 0.5)
                      (caddr pt_end)
                      ) ;_ end of list
                ) ;_ end of cons
          (cons
            str_2
            (list
              (car pt_end)
              (-
                (+ (cadr pt_end) 0.5)
                (abs (- (nth 1 (car hor_line_len2)) (nth 1 (cadr hor_line_len2)))
                     ) ;_ end of abs
                ) ;_ end of -
              (caddr pt_end)
              ) ;_ end of list
            ) ;_ end of cons
          ) ;_ end of list
        ) ;_ end of mapcar
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

Обязательно проверь работоспособность, я особо не тестировал. Нет проверок на немировую систему координат, нет проверок на блокированность слоя; работа ведется с текущими установками (слой, тип и вес линии ну и т.п.)

Re: Комплект полезных утилит из BricsCad в AutoCAD

> kpblc
Сэнкс, буду разбираться.

Re: Комплект полезных утилит из BricsCad в AutoCAD

P.S. Фигня там в конечном варианте уже не получалась - коммент забыл потереть. Остальные рабочие :)

Re: Комплект полезных утилит из BricsCad в AutoCAD

Евгений пишет:

« И осталась пока головная боль с динамикой при вставке выноски с текстом. »
Пока этот вопрос решить в полной мере так и не удалось.

Извини, но я уже запутался от такого количества постов - про какую динамику идет речь? В какой функции? Может идет речь об этом?

Когда я писал о (grread), то имел в виду не ваш вопрос, а ту проблемку, которая возникла у меня при использовании этой функции в BricsCAD (зум и пан средней кнопкой (колесиком) мыши во время позиционирования полки выноски прерывает выполнение grread).

Re: Комплект полезных утилит из BricsCad в AutoCAD

> kpblc
Пробовал твой последний вариант. Но получается обычная отрисовка выноски с двумя строками текста .Причем нижняя смещалась вверх на первую строку. Но это из-за "+" при указании точки вставки нижней строки:

(+ (cadr pt_end) 0.5)

Тут я поменял на "-" - все встало на места.
Но временная отрисовка текста с полкой вслед за курсором при указании точки вставки не получается. :(

> CB
Да. Эту проблему решить пока не удается.
В последнем варианте пакета я уже вставил исправленное с твоей помощью определение размера полки (textbox).  А вот метод вставки полки с текстом пока оставил старый. Пока не удалось добиться того, как работает grread в Акаде. Там по мере выбора точки полка текстом следуют за курсором до указания точки вставки.
В Бриксе же все работает также, но стоит в процессе выбора точки вставки выполнить масштабирование или панорамирование колесиком мыши, как текст с полкой вставляется в ту точку, где в этот момент находился курсор, что не есть очень хорошо. Единственное, что смог сделать, поигравшись с аргументами grread, это после зума или пана нажать левую кнопку и продолжить позиционирование, а вставку фиксировать правой кнопкой. Но это не очень привычно для народа. Вот такая трабла...:(

Re: Комплект полезных утилит из BricsCad в AutoCAD

> kpblc
Как в принципе в двух словах должна работать функция tmpcmd. По логике вроде все понятно, но желаемый результат не получается. Чего-то я не так делаю...? Уже пробовал упрощать, сводить до банальной отрисовки выноски без текста - то же самое.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Я когда код писал, я ставил задачу в первую очередь получить вторую точку нормально. О динамической отрисовке, если честно, просто не думал :( Сорри

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Так это просто замечательно, если  Brics реагирует на среднюю кнопку мыши при (grread)! Этого я и добивался в ACAD'е (даже создавал тему http://dwg.ru/forum/viewtopic.php?t=8327). Была задумка, чтобы в момент нажатия средней кнопки динамическое изображение исчезало. Проверь, что возвращает функция (grread) при нажатии средней кнопки, зуммировании, когда возвращается значение (grread) при нажатии кнопки - сразу при нажатии или при после отпускания, что происходит при удержании кнопки?
В ACAD'е (grread) работает так

Command: (grread)
(3 (1419.12 136.719 0.0));левая кнопка
Command: (grread)
(11 0);правая кнопка

Re: Комплект полезных утилит из BricsCad в AutoCAD

> kpblc
Все равно сэнкс ;)
Будем терзать grread...

> CB
В том то и дело, что возврата никакого нет при нажатии средней кнопки, а программа на нее реагирует. Т.е. сама grread никак на эту кнопку внешне не реагирует, но при работе в динамической отрисовке вроде как то эту кнопку цепляет. Причем реакция такая же, как если бы нажал какую-нить клавишу на клавиатуре - но там есть возврат, а здесь нет.
При двойном щелчке средней кнопой дает

: (grread)
'.ZOOM(2.00000 39.0000)

Левая и правая, как и в твоем примере.

Command: (grread)
(3 (1419.12 136.719 0.0));левая кнопка
Command: (grread)
(11 0);правая кнопка