Тема: LISP. Преобразование размера для последующего его масштабирования

В программе выполняется запись значения размера в "Текстовую строку" ("Text override"). После этого размер можно как угодно масштабировать. При этом не меняется значение размера, высота размерного текста, размеры стрелок и др. размерные величины. Проверялась на линейных размерах.

;**************** overdim.lsp ********************************
;       Преобразование размера для последующего
;       его масштабирования.
;       Автор Владимир Громов.
;
(defun C:OVERDIM ( / dim text)
(setq dim (car (entsel "\n Выберите ассоциативный размер: ")))
(if (and dim (= (cdr (assoc 0 (entget dim))) "DIMENSION"))
    (progn
    (setq dim (entget dim))
    (setq text (cdr (assoc 42 dim)))
    (setq text (rtos text))
    (setq dim (subst (cons 1 text) (assoc 1 dim) dim))
    (entmod dim)
    (princ "\n Готово.")
    ) ;progn
    (princ "\n Ничего не выбрано или объект не размер.")
) ;if
(princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C(if (not C:OVERDIM) (load "overdim")) OVERDIM

Re: LISP. Преобразование размера для последующего его масштабирования

> Владимир Громов
Так, что насчет программок типа вставить в поле "Текстовую строку" ("Text override") текста например:"Фаска <> x 45%%d" и подобных.
p.s. Прошу прощения за возможный кросс- постинг.

Re: LISP. Преобразование размера для последующего его масштабирования

Мне очень неудобно, однако "все было...":
http://dwg.ru/forum/viewtopic.php?t=6282

Re: LISP. Преобразование размера для последующего его масштабирования

> kpblc
Ага. Спасибо. Но там дискуссия профи. Напиши, если не затруднит, маленькую типовую программку. Законченую. Что бы любой пользователь ,не думая, смог пристроить ее на свой AutoCAD.

Re: LISP. Преобразование размера для последующего его масштабирования

> Forma
Нет уж, а то потом опять окажется, что уже "все было". В этом году, в этом веке, в прошлом веке, не на этом форуме, так на другом, пятом, десятом. Почему-то kpblc не счел нужным дать ссылку в теме
https://www.caduser.ru/forum/topic25857.html
а теперь ему неудобно. Мне тоже неудобно. Ну и ликвидировать эту тему к такой-то матери - я не обижусь.

Re: LISP. Преобразование размера для последующего его масштабирования

> kpblc

> Владимир Громов
Что то не так пошло. Это я наверное виноват.

Re: LISP. Преобразование размера для последующего его масштабирования

> Forma
Я скажу, что не так. В упомянутой теме я дал намеренно простенькое решение для PL. Подождал, не даст ли кто-нибудь более совершенное решение? Желающих нет, хотя PL напрямую обратился ко мне и к kpblc. Я ждал, что kpblc как-то откликнется. Нет. Тогда я слегка доделал свою программу и поместил сюда, надеясь на то, что уже здесь могут появиться другие решения, ведь та тема постепенно уйдет из поля зрения. А теперь оказывается, что зря я это сделал, решение уже предлагалось, просто мне надо было перерыть другие форумы, а не выпендриваться со своей убогой программой. Так что вы, Forma, здесь ни причем.

Re: LISP. Преобразование размера для последующего его масштабирования

> Владимир Громов
Я думаю, что тоже виноват, потому что влез в уже готовую программу в разделе "Готовые программы" с своими просьбами. Но мы ранее в одной из веток уже немного пообщались по этому вопросу. И поэтому я подумал, что можно и дальше поработать с полем "Text override" в примитиве dimension. Раздел, конечно, не подходящий. Т.к здесь уже готовые программы. Но у меня другой возможности нет, по причинам известным Вам. А программу хочется иметь. Надоело уже поле это вручную заполнять. А тут такой случай подвернулся. :)

Re: LISP. Преобразование размера для последующего его масштабирования

> Владимир Громов
Я не посчитал нужным, а просто не понял вообще темы. Там же изначально разговор шел про _.explode, я так понял, и дальше читать я не стал, тем более - программы показывать.
Бога ради, не обижайся! Честно говоря, не думал, что такое (как я полагал, достаточно невинное) замечание может вызвать такую реакцию.
В любом случа прошу прощения. За все.

Re: LISP. Преобразование размера для последующего его масштабирования

Зачем расчленять или изменять значение размера в
override , когда можно выйти из положения изменением переменной dimlfac. И масштабируйте сколько угодно.

(defun es_scaledimension (/ allobj basepoint scalefactor)
  (if
    (and
      (not (prompt "\n Select objects for scale:"))
      (setq allobj (ssget))
      (setq basepoint (getpoint "\n Pick base point:"))
      (setq scalefactor (getreal "\n Scale factor:"))
    )
     (progn
       (mapcar
     '(lambda (x)
        (vla-scaleentity x (vlax-3d-point basepoint) scalefactor)
      )
     (setq allobj (mapcar 'vlax-ename->vla-object
                  (vl-remove-if
                'listp
                (mapcar    'cadr
                    (ssnamex allobj)
                )
                  )
              )
     )
       )
       (mapcar
     '(lambda (z)
        (if
          (vlax-property-available-p z 'LinearScaleFactor)
           (progn
         (vla-put-LinearScaleFactor
           z
           (* (/ 1.000 scalefactor) (vla-get-LinearScaleFactor z))
         )
         (vla-update z)
           )
        )
      )
     (vl-remove-if-not
       '(lambda (y)
          (wcmatch (vla-get-objectname y) "*imens*")
        )
       allobj
     )
       )
     )
  )
  (princ)
)

Re: LISP. Преобразование размера для последующего его масштабирования

> Эдуард
Сомневаюсь я, что dimlfac - это выход из положения, потому что ее каждый раз надо менять на конкретное число для новых размеров. А для старых? А вот в отношении "Text override"... Вот здесь:
https://www.caduser.ru/forum/topic25857.html
в конце приведена программка, которая не связана с масштабированием, но сама по себе интересна, IMHO.
Ваша программа тоже интересна, я ее принял для себя, только русифицировал запросы в командной строке.

Re: LISP. Преобразование размера для последующего его масштабирования

> Владимир Громов
Я не меняю dimlfac для размерного стиля , а
меняю значение этой переменной для конкретного размера.
При "оверрайде" или расчленении размера , он перестает быть размером.

(изменено: Владимир Громов, 18 декабря 2010г. 09:54:29)

Re: LISP. Преобразование размера для последующего его масштабирования

> Эдуард
Дело хозяйское. Хозяйское дело.

Re: LISP. Преобразование размера для последующего его масштабирования

А вот никто не задавался следующим вопросом: при масштабировании у нас размерные линии "отходят" не по-ГОСТ'у друг от друга. Т.е. положено между ними 8 мм, а при увеличении, соответственно, больше. Как сделать это масштабирование корректным ? Прошу прощения за немного бестолковый вопрос.

Re: LISP. Преобразование размера для последующего его масштабирования

> Эдуард
Интересная мысль. Даже очень. Я сам сейчас ломаю голову, как мне оформить чертежи тонколистовых крупногабаритных деталей. Что бы и "овцы были целы и волки сыты".... Есть один мутный момент. А именно, получается, что масштабировать деталь и размеры нужно одновременно. И не дай Бог где то нарушить это условие. А т.к. деталей под сотню, а размеров соответственно под тысячу, то ошибка не исключена. И как это все проконтролировать. Грозит потерей контроля в процессе проектирования. Так? Или я ошибаюсь.

Re: LISP. Преобразование размера для последующего его масштабирования

Все верно : и эта, и др. проблемы, типа "окружности осевых линий д.б. постоянны = 8 мм и притянуты к концам осевых линий и т.п."

(изменено: Александр Неважно, 4 января 2010г. 23:15:27)

Re: LISP. Преобразование размера для последующего его масштабирования

Спасибо! То что нужно! Только можно ли как-нибудь модифицировать код Overdim чтобы можно было секущей рамкой выбирать несколько размеров?
И чтобы размер сам округлялся автоматически до целых?

Re: LISP. Преобразование размера для последующего его масштабирования

Вариант для нескольких размеров:

;**************** overdim_0.lsp ********************************
;       Преобразование размеров для последующего
;       их масштабирования.
;       Автор Владимир Громов aka Profan
;
(defun C:OVERDIM_0 ( / ss len n dim text)
(vl-cmdf "_.UNDO" "_be")
(princ "\n Выберите ассоциативные размеры: ")
(setq ss (ssget))
(if ss 
    (progn
    (setq len (sslength ss))
    (setq n 0)
    (repeat len
            (setq dim (entget (ssname ss n)))
            (if (= (cdr (assoc 0 dim)) "DIMENSION")
                (progn
                (setq text (cdr (assoc 42 dim)))
                (setq text (rtos text 2 0))
                (setq dim (subst (cons 1 text) (assoc 1 dim) dim))
                (entmod dim)
                ) ;progn
                (princ "\n Объект не размер.")
            ) ;if
            (setq n (1+ n))
    ) ;repeat
    ) ;progn
    (princ "\n Ничего не выбрано.")
) ;if
(vl-cmdf "_.UNDO" "_e")
(princ)
)

Макрос на кнопку:

^C^C(if (not C:OVERDIM_0) (load "overdim_0")) OVERDIM_0

Re: LISP. Преобразование размера для последующего его масштабирования

Продублирую здесь свое СПАСИБО! Владимир, Вы мне очень помогли!