Нужен LISP на "обычный" размер n х ШАГ= ПРОИЗВЕДЕНИЕ в Autocad 2016
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен LISP на "обычный" размер n х ШАГ= ПРОИЗВЕДЕНИЕ в Autocad 2016

Нужен LISP на "обычный" размер n х ШАГ= ПРОИЗВЕДЕНИЕ в Autocad 2016

Ответ
Поиск в этой теме
Непрочитано 24.07.2020, 12:42 #1
Нужен LISP на "обычный" размер n х ШАГ= ПРОИЗВЕДЕНИЕ в Autocad 2016
sergius7900
 
Регистрация: 09.04.2011
Сообщений: 45

Может кто сможет написать и поделиться Lisp по такой задаче (низкий поклон):

Есть размер в котором будет отображаться количество шагов , шаг и результат произведения - 20х200=4000
4000 - не перебитый размер и меняется при перемещении ручки
200 (шаг) - который можно менять на любое другое положительное число.

ЦЕЛЬ: сделать так что бы при изменении числа 4000 менялось количество шагов

к примеру было: 20х200=4000 перетащили ручку размера и величина размера теперь 4800 и автоматически выражение принимает вид 24х200=4800, а также
что бы можно было ещё и поменять величину 200(шаг) на например на 400 и автоматически выражение принимает вид 12х400=4800

P.S. Предполагаю, как вариант, что размер будет создаваться уже из под кнопки LISP для размера с заведомо запрограммированными действиями, описанные выше. Но может будет легче реализовать сие кликнув уже по готовому размеру (тогда можно редактировать ранее выполненные чертежи)
Просмотров: 10583
 
Непрочитано 24.07.2020, 13:15
#2
Maksim7enov


 
Регистрация: 25.05.2016
Сообщений: 112


Может легче сделать поле в текстовой части размера? Вставляем поле с формулой в текст размера и все.
Maksim7enov вне форума  
 
Непрочитано 24.07.2020, 13:53
1 | 1 #3
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Думаю, что тут нужно копать в сторону динамических блоков с полями. Непереопределенных размеров подобного формата в Автокаде я не припомню. Могу ошибаться, т.к. по роду деятельности они мне не нужны и я мог не углядеть.
По блоку - вот набросал прототип-концепт за пару минут в качестве примера.
Миниатюры
Нажмите на изображение для увеличения
Название: 2020-07-24 at 13-38-54.gif
Просмотров: 215
Размер:	1.46 Мб
ID:	228552  
Вложения
Тип файла: dwg
DWG 2010
Пример блока.dwg (95.8 Кб, 46 просмотров)
skkkk вне форума  
 
Непрочитано 24.07.2020, 14:03
1 | #4
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Maksim7enov, кстати, тоже вариант, что-то сразу не подумал, только менять шаг довольно трудоемко, или выводить его в отдельный текст со ссылкой поля на него.
В приложенном файле меняем содержимое красного текста на другое число и делаем _REGEN.
Если скопировать размер в паре со своим текстом, а не сам по себе, то эта пара начнет работать независимо.
Или вообще создать несколько разных размеров каждый со своим шагом.
Вложения
Тип файла: dwg
DWG 2010
Пример блока 2.dwg (81.0 Кб, 42 просмотров)
skkkk вне форума  
 
Непрочитано 24.07.2020, 14:10
1 | #5
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


sergius7900, этот вариант не подходит?
v.psk вне форума  
 
Непрочитано 24.07.2020, 14:44
| 1 #6
Maksim7enov


 
Регистрация: 25.05.2016
Сообщений: 112


Цитата:
Сообщение от skkkk Посмотреть сообщение
В приложенном файле меняем содержимое красного текста на другое число и делаем _REGEN.
Я думал надо было получить, что-то типо этого!
Тогда лучше через блок с атрибутами, там задавать шаг для растягивания размера. Если использовать лисп то при измерении размера придется постоянно вызывать его и исправлять размер. Я бы для таких целей использовал лучше блок!
Вложения
Тип файла: dwg
DWG 2013
Размер с полем.dwg (39.5 Кб, 47 просмотров)
Maksim7enov вне форума  
 
Непрочитано 24.07.2020, 14:47
#7
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


Maksim7enov, зато лисп сработает с любым количеством размеров, в том числе параллельных и уже существующих.
v.psk вне форума  
 
Непрочитано 24.07.2020, 14:54
#8
Maksim7enov


 
Регистрация: 25.05.2016
Сообщений: 112


Цитата:
Сообщение от v.psk Посмотреть сообщение
любым количеством размеров
Да, но стоит изменить размер после выполнения лиспа и все!
Maksim7enov вне форума  
 
Непрочитано 24.07.2020, 15:11
#9
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


Maksim7enov, ну это проблема еще раз запустить лисп... это не тяжело.
кроме того, предполагаю что эти размеры нужны скорее всего для полей дополнительного армирования итп...
тогда дополнительное удобство заключается в не кратной целому числу привязке поля, и выбранные в одну кучу размерные цепочки будут обрабатываться по разному - некратные целому размеры будут оставаться без изменений, кратные - переписываться.
если я угадал, и размерная цепочка нужна для доп армирования - проще тогда ее встроить в динамический блок доп. армирования
v.psk вне форума  
 
Непрочитано 24.07.2020, 15:21
#10
Maksim7enov


 
Регистрация: 25.05.2016
Сообщений: 112


Он же не работает с размерами у которых уже изменено текстовое поле.
Если изменять 1 раз и потом не менять размер, конечно с полями и не стоит возиться.
Того 3 варианта, кому какой приглянулся.
Maksim7enov вне форума  
 
Непрочитано 24.07.2020, 16:02
#11
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от v.psk Посмотреть сообщение
этот вариант не подходит?
v.psk, проверил лисп. При изменении уже обработанных размеров он их повторно не обрабатывает. Нужно сначала убирать лишние символы (кроме значения самого размера) - тогда работает. Это, конечно, нетрудно исправить. В целом да, хороший способ. Даже, пожалуй лучше блоков или размеров с полями. Потому что используется штатный функционал по-максимуму в том смысле, что можно использовать ассоциативность, строить размеры стандартно тоже удобнее, нежели возиться с блоками, полями, ибо с ними что-то можно легко напутать и т.д.
skkkk вне форума  
 
Непрочитано 24.07.2020, 16:07
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


можно вариант #2 с формулой сделать в виде лиспа с выбором точки выносной линии размера, которую тянуть, с назначением кратного коэффициента и переформатированием размерного текста с обновлением поля в формуле.
koMon вне форума  
 
Непрочитано 24.07.2020, 16:35
#13
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от koMon Посмотреть сообщение
вариант #2 с формулой сделать в виде лиспа с выбором точки выносной линии размера, которую тянуть, с назначением кратного коэффициента и переформатированием размерного текста с обновлением поля в формуле
На мой взгляд, оптимальнее подправить код по ссылке из #2, чтобы он сначала сносил переопределение, а затем обрабатывал по новой. Поля всё-таки довольно сильно загружают чертеж, если их много.
skkkk вне форума  
 
Непрочитано 24.07.2020, 16:36
#14
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


Цитата:
Сообщение от skkkk Посмотреть сообщение
. Это, конечно, нетрудно исправить.
Да, или лисп, или в свойствах размера удалить данные (для перебитых размеров в поле "текстовая строка"), тогда вернется вычисленное значение
v.psk вне форума  
 
Непрочитано 24.07.2020, 16:50
#15
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


skkkk, ну если только не перегружать! а так будешь постоянно думать какой размер обработал, а какой нет и потом если куда уйдёт...
koMon вне форума  
 
Непрочитано 24.07.2020, 17:12
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


koMon, я в таких случаях для контроля обычно добавляю в код изменение цвета обработанных примитивов.
Offtop: Вообще, прикольно у нас тут
Сами порешали всё за ТС'a, подобрали оптимальный вариант, уже чуть ли не к реализации вплотную подошли, а сейчас окажется какая-то ма-а-а-аленькая мелочь в ТЗ, которая перевернет всё с ног на голову
skkkk вне форума  
 
Автор темы   Непрочитано 24.07.2020, 17:57
#17
sergius7900


 
Регистрация: 09.04.2011
Сообщений: 45


Цитата:
Сообщение от v.psk Посмотреть сообщение
sergius7900, этот вариант не подходит?
Подхотит (только можно ещё напильником подработать, чуть)

Можно во 2-м приближении сделать так , что бы шаг можно было бы менять в уже "обработанном" размере LISP-ом

НАПРИМЕР:
4х400=1600 - (выражение обработано Вашим LISP-ом)

Захожу в редактор размера и меняю 400 на 200 (при этом чтобы связка 8х200=1600 оставалась рабочей!!! ) после редактирования. То есть чтобы я мог и в дальнейшем скопировать этот размер и использовать на другом фрагменте, перебивая ШАГ.

Последний раз редактировалось sergius7900, 27.07.2020 в 08:59.
sergius7900 вне форума  
 
Автор темы   Непрочитано 24.07.2020, 18:16
#18
sergius7900


 
Регистрация: 09.04.2011
Сообщений: 45


Цитата:
Сообщение от skkkk Посмотреть сообщение

DWG 2010 Пример блока 2.dwg (81.0 Кб, 3 просмотров)
к посту #4
Можно перебить на тип ПОВЁРНУТЫЙ РАЗМЕР (сам не смог), но имея на руках 2-3 варианта можно выбрать наилучший...

Lisp приложение если коллега (v.psk) допилит и Ваш (skkkk) дополненный вариант - будем посмотреть/испытывать.
Вложения
Тип файла: dwg
DWG 2010
Вот пример для чего размер.dwg (149.1 Кб, 39 просмотров)
sergius7900 вне форума  
 
Непрочитано 24.07.2020, 21:29
1 | #19
StupidDuck


 
Регистрация: 22.09.2017
Сообщений: 17


Код:
[Выделить все]
 (defun c:dim+spacing ( / spacing selection)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(initget 7)
(setq spacing (getint "\nВведите шаг:"))
(if (setq selection (ssget "_:A:L" '((0 . "DIMENSION"))))
(progn
(foreach x (mapcar (function vlax-ename->vla-object)
			  (vl-remove-if 'listp (mapcar 'cadr (ssnamex selection))))
(vla-put-TextOverride x
  (strcat 			      
	"%<\\AcExpr ("
  	"%<\\AcObjProp Object(%<\\_ObjId " (GET-OBJECTID-x86-x64 x) ">%).Measurement \\f \"%lu2%pr0\">%" "/"
	(itoa spacing)
				") \\f \"%lu2%pr0\">%" "x" (itoa spacing) "=<>")))
(vl-cmdf "_.UPDATEFIELD" selection "")
(princ "\nВсе нормуль...")
)
(princ "\n×Чтото не то...")
  )
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(princ)
)
GET-OBJECTID-x86-x64 нужно скачать на форуме

Последний раз редактировалось StupidDuck, 26.07.2020 в 20:18. Причина: (initget 7)
StupidDuck вне форума  
 
Непрочитано 24.07.2020, 21:44
#20
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


StupidDuck, спасибо, пока не проверить...
// если что, на всякий случай, лисп выше не мой, его написал ув. VVA.
v.psk вне форума  
 
Автор темы   Непрочитано 27.07.2020, 09:06
#21
sergius7900


 
Регистрация: 09.04.2011
Сообщений: 45


Цитата:
Сообщение от StupidDuck Посмотреть сообщение
GET-OBJECTID-x86-x64 нужно скачать на форуме
Не затруднит ли участников рабочей группы поделиться ссылкой ? (поиск по форуму не выдал результатов по запросу GET-OBJECTID)
sergius7900 вне форума  
 
Непрочитано 27.07.2020, 12:52
#22
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


https://forum.dwg.ru/showpost.php?p=566244&postcount=8
skkkk вне форума  
 
Непрочитано 27.07.2020, 14:25
#23
Dr.Smiley

Инженер-конструктор ПГС
 
Регистрация: 17.08.2011
Сообщений: 108


Код:
[Выделить все]
 (defun C:DimSSF (/ adoc ss shg fld str)
;;;Dim Step Size to Field
;;;VVA for dwg.ru
;;;http://forum.dwg.ru/showthread.php?t=103609
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  ) ;_ end of vla-startundomark
  (while (not (eq shg "Выход"))
    (if (not (numberp *DimSSF_SHG*))
      (initget 8 "Выход")
      (initget 6 "Выход")
    ) ;_ end of if
    (if (not (numberp *DimSSF_SHG*))
      (setq shg (getint "\nШаг [Выход]: "))
      (setq
        shg (getint
              (strcat "\nШаг [Выход] < " (itoa *DimSSF_SHG*) " >: ")
            ) ;_ end of getint
      ) ;_ end of setq
    ) ;_ end of if
    (if (null shg)
      (setq shg *DimSSF_SHG*)
    ) ;_ end of if
    (setq *DimSSF_SHG* shg)
    (if (not (eq shg "Выход"))
      (progn
        (while (= (type (setq ss (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssget "_:L" '((0 . "DIMENSION"))) ;_ end of ssget
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
               'pickset
            ) ;_ end of =
          (foreach en
                   (mapcar
                     (function vlax-ename->vla-object)
                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
                   ) ;_ end of mapcar
            (setq fld (strcat
                        "%<\\AcExpr ("
                        "%<\\AcObjProp Object(%<\\_ObjId "
                        (vl-princ-to-string
                          (Get-ObjectID-x86-x64 en)
                        ) ;_ vl-princ-to-string
                        ">%).Measurement \\f \"%lu2\">%"
                        "/"
                        (itoa shg)
                        ") \\f \"%lu2%pr0\">%"
                      ) ;_ strcat
            ) ;_ setq
            (setq str (strcat fld "x" (itoa shg) "=<>"))
            (vl-catch-all-apply
              (function
                (lambda ()
                  (vla-put-textoverride en str)
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
            (vl-cmdf "_updatefield" (vlax-vla-object->ename en) "")

          ) ;_ end of foreach
        ) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of while
  (vla-endundomark adoc)
  (princ)
) ;_ end of defun

;;--------------------------------------------------------
;; Функция получает строковое представление ObjectID
;; вне зависимости от того AutoCAD x86 или x64
;; Источник: "Field and objectid problem"

;;http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Field-and-objectid-problem/m-p/2478592/highlight/true#M276818
;; http://forum.dwg.ru/showthread.php?t=51822
;;--------------------------------------------------------
(defun Get-ObjectID-x86-x64 (obj / util)
  (setq util (vla-get-utility
               (vla-get-activedocument (vlax-get-acad-object))
             ) ;_ end of vla-get-Utility
  ) ;_ end of setq
  (if (= (type obj) 'ENAME)
    (setq obj (vlax-ename->vla-object obj))
  ) ;_ end of if
  (if (= (type obj) 'VLA-OBJECT)
    (if (> (vl-string-search "x64" (getvar "platform")) 0)
      (vlax-invoke-method
        util
        "GetObjectIdString"
        obj
        :vlax-false
      ) ;_ end of vlax-invoke-method
      (rtos (vla-get-objectid obj) 2 0)
    ) ;_ end of if
  ) ;_ end of if
) ;_ end of defun
Вот плагин написанный тем же уважаемым VVA, который на мой взгляд самодостаточен .
Единственное в нем есть проблемка одна, дважды команду на один и тот же размер (если вдруг нужно шаг поменять) лучше не использовать, а удалять и ставить новый размер.
после изменения размера, для смены количества шагов нужно регенерировать чертеж. Так же можно задавать неограниченное количество размеров под одну команду.
Вложения
Тип файла: lsp NхШаг.lsp (3.6 Кб, 50 просмотров)
Dr.Smiley вне форума  
 
Непрочитано 27.07.2020, 14:54
#24
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,323


Цитата:
Сообщение от Dr.Smiley Посмотреть сообщение
удалять и ставить новый размер
Зачем удалять? Выделить кучку размеров и очистить поле "текстовая строка", я писал выше...
v.psk вне форума  
 
Автор темы   Непрочитано 27.07.2020, 17:42
#25
sergius7900


 
Регистрация: 09.04.2011
Сообщений: 45


Можно сказать что цель достигнута.
Всем спасибо, как и обещал - Низкий поклон за помощь !
sergius7900 вне форума  
 
Непрочитано 24.09.2020, 08:15
#26
DMSskop


 
Регистрация: 23.01.2019
Сообщений: 132


Можно и в ручную установить для одного размера параметры поле со ссылкой на сам размер, что бы в нем все высчитывалось по нужной формуле. И копировать этот размер
DMSskop вне форума  
 
Непрочитано 10.05.2022, 18:03
#27
yaego


 
Регистрация: 12.10.2006
Сообщений: 44


А что нужно изменить в лиспе из поста 23, чтобы размер имел вид "ШАГ х n= ПРОИЗВЕДЕНИЕ"? Зачем, не спрашивайте. Традиция.
yaego вне форума  
 
Непрочитано 11.05.2022, 10:19
1 | #28
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от yaego Посмотреть сообщение
А что нужно изменить в лиспе из поста 23, чтобы размер имел вид "ШАГ х n= ПРОИЗВЕДЕНИЕ"? Зачем, не спрашивайте. Традиция.
Строка 056
Код:
[Выделить все]
(setq str (strcat (itoa shg)  "x" fld  "=<>"))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен LISP на "обычный" размер n х ШАГ= ПРОИЗВЕДЕНИЕ в Autocad 2016



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autocad 2019. Не работает справка по Visual LISP (Autocad 2019 Help: Developer Documentation) modest-bp AutoCAD 3 24.07.2020 00:02
Максимальный возможный размер экрана интерфейса AutoCAD Малюк AutoCAD 7 01.07.2019 14:26
Проблема создания связи таблиц в AutoCAD 2016 с MS Excel 2016 alterfiesta AutoCAD 15 27.06.2019 12:29
lisp из autocad 2004 некорректно выполняется в autocad 2008 sid_geo LISP 13 11.10.2012 11:20
Произведение нескольких чисел на чертеже? Нужен Lisp по типу sum.lsp UnAtom LISP 2 24.11.2010 20:18