Тема: LISP. Масштабирование узлов с размерами в пространстве модели.

;**************** overdimscale.lsp ********************************
;     Масштабирование в пространстве модели образмеренных
;     объектов с сохранением величины размера.
;     Автор Владимир Громов.
;
(defun C:OVERDIMSCALE ( / tn tk ss1 ss ssn1 n pp pp1 ssn dim text skl)
(princ "\n Выбор объектов.")
(setq tn (getpoint "\ Первый угол рамки: "))
(setq tk (getcorner tn "\n Второй угол рамки: "))
(vl-cmdf "_.UNDO" "_be")
(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))
           (cond
           ((= (cdr (assoc 0 pp1)) "DIMENSION") (ssadd pp ss)
           ))
           (setq n (+ n 1))
         ) ; repeat
    (if ss
        (progn
        (setq ssn (sslength ss) n 0)
        (repeat ssn
                (setq dim (ssname ss n))
                (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)
                (setq n (+ n 1))
        ) ; repeat
        (princ "\n Перезаписано ") (princ ssn) (princ " размеров.")
        ) ; progn
    ) ; if
    (initget 6)
    (setq skl (getreal "\n Масштаб (Enter-Отказ): "))
              (if skl
                  (progn
                  (princ "\n Базовая точка: ")
                  (command "_scale" ss1 "" pause skl)
                  ) ; progn
              ) ; if
    ) ; progn
    (princ "\n Ничего не выбрано.")
) ; if
(vl-cmdf "_.UNDO" "_e")
(princ)
)

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

А я думал, что в этой программе меняется Scale factor из Measurement scale. Прием который заложен в алгоритм этой программы весьма неоднозначен....

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

Если код сохранен в файле overdimscale.lsp, то макрос для кнопки или пункта меню может выглядеть так:

^C^C^P(if (not C:OVERDIMSCALE) (load "overdimscale")) OVERDIMSCALE

> Иvanoff
Да, это искусственная программа. Действительно, если измерить увеличенный (уменьшенный) объект, то значение будет отличаться от проставленного размера. Так вот это и есть основная проблема отображения объектов с разными масштабами в пространстве модели. Однако ко мне обращались конструкторы именно с таким вопросом - как изменить масштаб узла без изменения величины размеров, если сами размеры ассоциативные? Про пространство бумаги и слушать не хотят. Надеюсь только, что увеличенный узел будет служить только для иллюстрации и работать с ним не будут.
Это пробный камень. Может, всплывут еще подобные программы с другим подходом.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Это понятно. А почему нельзя применить изменение Scale factor из Measurement scale в обратной линейной зависимости от Scale. Может эту зависимость невозможно инициализировать средствами LISP? Может какие то параметры Dimension недоступны? Я бы пошел по этому пути. А вписывать значения в Text override как то рисковано. На мой взгляд, конечно.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Народ в ветке https://www.caduser.ru/forum/topic28316.html волнуется относительно какой то программы. Не эта ли случаем?

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

Ну, и пусть волнуется. Людей, работающих преимущественно в пространстве модели, на этом форуме кот наплакал, остальным наплевать на эту программу.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Я не плевал, не плевал.... Такая или примерно такая программа есть в MDT. Но так как мы практически все работаем в AutoCAD, я повторяю свой старый вопрос.

" А почему нельзя применить изменение Scale factor из Measurement scale в обратной линейной зависимости от Scale. Может эту зависимость невозможно инициализировать средствами LISP? Может какие то параметры Dimension недоступны? Я бы пошел по этому пути. А вписывать значения в Text override как то рисковано. На мой взгляд, конечно.

Если бы получилось по такому алгоритму, тогда я бы встал в очередь за этой программой :)

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Иvanoff
Этот ваш вопрос я не понимаю.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
А что не понимаете? Я не знаю как обьяснить телеграфным стилем форума.... Ну словом, когда берете кусок чертежа, копируете и масшабируете. Размеры , если попадают в этот масшабируемую область сохраняют свои значения за счет изменения Scale factor из Measurement scale в обратной линейной зависимости. В ADT такая штука есть. Правда с большим комфортом выполнена.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Иvanoff
Ну, так я и расчитывал, что мою программу именно так и будут использовать: копировать кусок чертежа (узел) и уже его масштабировать.
То, что вы предлагаете, уже предлагалось - использовать переменную DIMLFAC. Можно, конечно, смаштабировать только объекты, потом проставлять размеры с новым размерным стилем, в котором DIMLFAC пропорционално изменена. Но если размеры уже проставлены? Возможно, не составит большого труда написать и программу с использованием изменяемой DIMLFAC, возможно, такие программы существуют и, может, кто-нибудь даст ссылку. Но меня в любом случае смущает неустранимое противоречие между расстоянием, определенным командой "Дист" ("Dist") и расстоянием, определенным командой образмеривания в случае с отмасштабированным объектом.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
:) Вот теперь я в растерянности. Надо подумать. Но размерные стили я конечно знаю. У меня с десяток таких стилей хранимых в шаблоне...Надо осмыслить это все...

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

Чаще ошибки при рааботе в модели случаются кода забываеш переключить размерный стиль. Есть програмы для проверки соответствия стиля размера масштабу изображения но это тоже не гарант.
Вообще редко (практически никогда) не приходилось мастабировать уже образмеренный объект. Мне думается что было бы полезно если б при масштабировании переключался и размерный стиль. И еще полезно иметь макрос кпия+мастаб.
Р.С.
Мы работаем только в модели и чувствуем себя вполне конфортно.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Замерзла тема окончательно. Впрочем, это раздел "Готовые программы". Может так и должно быть. Но тем не менее, я спрошу лично Владимира Громова насколько возможна вероятность замены средствами LISP  Scale factor в сущности Dimension? Не не перепутайте с размерным стилем.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Иvanoff
А по-русски можно это расписать?

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Не смогу. Я никогда не пользовался локализованными версиями. Кроме итальянскими AutoCAD 97 LT и AutoCAD 2000. Да и то по необходимости и постарался побыстрее от них избавится. У меня только на английском языке.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир Громов
Но почему-то при повторном вызове функции(и при выборе тех же примитивов)текст размеров увеличивается во вновь заданном масштабе "skl". Почему - не понимаю. Так задумано?

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

2Владимир Громов, спасибо за полезную программу.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> Владимир
Громов (2006-07-07 12:26:30
Прога к месту. Только назвать ее "уменьшение обьекта". Тем, кто оформляет КД в модели. Это когда  вставляете куски разработки в форматки. По алгоритму: выделить обьект-уменьшить и т. д. Но было бы прекрасно, если бы этот обьект при поледующих манипуляциях размеры не менял. То есть на поле модели будет оригинал и его уменшенная копия  в своиствах которой было бы  знчение коеффициента изменения. В Deltacade  это реализовано но не полностью.

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

;Масштабирование узлов
(defun C:OVER4( / A1 dims imx i ssdd skl point enm ed ed0 enm0 A11 imx1 i1 enm1 ttt1 ed1)
(setq os1(getvar"osmode"))
(setvar "menuecho"0)(setvar "cmdecho"0)(setvar "osmode"0)
(setq A1 NIL)(setq dims(getvar "DIMSCALE"))
(command"zoom""e")(setq A1(ssget "_x" ))(setq imx(sslength A1) i 0)
(while(< i imx)
    (prin1 (1+ i))(terpri)(setq enm(ssname A1 i)ed(entget enm))
    (if (=  (cdr(assoc 0 ed))"MTEXT")(command"_explode" enm)  )
    (setq i(1+ i))
);while
(princ "\n Выбор объектов...")
(setq A1(ssget))(setq imx(sslength A1) i 0)(setq ssdd(ssadd))
  (while(< i imx)
    (prin1 (1+ i))(terpri)(setq enm(ssname A1 i)ed(entget enm))
(COND   
    (    (equal(cdr(assoc 0 ed))"DIMENSION")
(command "_copy" enm "" (list 0 0) (list 0 0))
(setq ed0(entget(entlast))) (setq enm0 (cdr(assoc -1 ed0)))
(command "_explode" enm)
(setq A11(ssget "p"))(setq imx1(sslength A11) i1 0)
(while(< i1 imx1);while_1
(setq enm1(ssname A11 i1)ed1(entget enm1))
(cond
   ( (equal(cdr(assoc 0 ed1))"MTEXT")(setq ttt1(cdr(assoc 1 ed1)))
     (command"_dimedit""_n" ttt1 enm0 "")
    );текст
);cond
(setq i1(1+ i1))
);while_1
(setq ssdd(ssadd enm0 ssdd))
(command "_erase"A11 "")
    );cond_DIMENSION
);COND
(setq ssdd(ssadd enm ssdd))
    (setq i(1+ i))
);while
(initget 15)
(setq point(getpoint "\n Базовая точка: "))(princ point)
(setq skl (getreal "\n Введите масштаб (Enter-Отказ): "))
(if skl(command "_scale"  ssdd "" point skl)(prin1))
;/////////////////////////////////////////////////
;Изменение высоты текста на 2.5 мм
(setq dims(* dims 2.5))
(setq len(sslength a1))(setq ind 0)
(setq name(ssname a1 ind))
(while(< ind len)
  (setq name(ssname a1 ind))
  (if(=(cdr(assoc 0(entget name)))"TEXT")
  (progn
             (setq a2(cdr(assoc 40(entget name))))
;;;        (command"_change" name "" "" "" "" dims "" "")
(command"_change" name "" "" "" "" dims "" (command))
  ));if_progn_TEXT
  (setq ind(+ ind 1))
);while
;//////////////////////////////////////////////////
(setvar"osmode"os1)
;;;(prin1)
);end

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

> SRAIBIKUS
Мне некогда сейчас писать код, поэтому только критика (надеюсь, не обидишься).
1. Нет обработчика ошибок.
2. Нет варианта обработки заблокированных либо замороженных слоев.
3. Нет варианта "отката".

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

Раз уж вылезла старая тема наверх, пришлось прочитать, прежде чем сообразил... Что касается несоответствия измерения и Dist. Надо как-то показать, что деталь не классическая в смысле масштаба. Что если всем ее элементам придать Hyperlink с нужными разъяснительными словами? Типа, Простите, меня некорректно смасштабировали

(изменено: Yuriy, 14 октября 2009г. 09:11:37)

Re: LISP. Масштабирование узлов с размерами в пространстве модели.

Vova пишет:

Что касается несоответствия измерения и Dist. Надо как-то показать, что деталь не классическая в смысле масштаба.

Для размеров у которых значение не соответствует  измеренной величине можно задать слой с другим цветом.
Но если это не сделать сразу, то потом отфильтровать подобные размеры будет гораздо сложнее.

Возможно ли как то быстро отфильтровать все размеры у которых значение не соответствует измеренной величине  :?: