| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как программно редактировать размеры в формат N x Y = Z (5х200=1000)

LISP. Как программно редактировать размеры в формат N x Y = Z (5х200=1000)

Ответ
Поиск в этой теме
Непрочитано 06.09.2012, 14:15 #1
LISP. Как программно редактировать размеры в формат N x Y = Z (5х200=1000)
Sokolov_Art
 
Регистрация: 12.05.2010
Сообщений: 44

Задача:
Часть имеющихся на чертеже размеров необходимо изменить таким образом, чтобы в них было указано количество диапазонов, размер диапазона и суммарная длина. Пример того, что имеется и что нужно получить я приложил к сообщению.
Размер во вложенном файле выполнен с использованием поля, поле определяет значение размера (его величину), затем это значение делит на шаг (заданный мной заранее вручную, при редактировании поля).
За данным полем в размере текстом прописано "x 200 =" и далее идет сам размер, определяемый автоматически автокадом.
При перетаскивании грипса размер автоматически меняет количество шагов по 200 мм.
Данная модернизация очень помогает при создании арматурных чертежей.

Как бы я хотел чтобы работал LISP:
1. вводим приращение (шаг стержней: 100, 150, 200)
2. выделяем набор размеров
3. происходит определение ID объекта
4. добавляется в текст размера - поле, которое вычисляет отношение значения величины размера с определенным ID (размера, редактирование которого происходит в данный момент) к приращению введенному ранее.
5. далее вписывается символ "x" в текст размера
6. выводится текстом приращение введенное ранее
7. далее знак "="
8. Выводится значение величины размера (при этом хотелось бы чтобы это был элемент как у самого размера, а не "перевбитое", типа copy-paste из буфера значение)
9. Перейти к редактированию следующего размера с повторением всей цепочки

Пытался реализовать сам, но не хватает знания языка. Очень надеюсь на поддержку.

Вложения
Тип файла: dwg
DWG 2007
Пример.dwg (76.8 Кб, 1664 просмотров)


Последний раз редактировалось Sokolov_Art, 06.09.2012 в 14:58.
Просмотров: 4014
 
Непрочитано 06.09.2012, 15:10
#2
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


А нельзя ли всё это (образмеривание) делать при построении стержней?
Вот мой пример изображения свайного куста. Размеры проставлены программно по заданным в диалоге шагам
Миниатюры
Нажмите на изображение для увеличения
Название: Kust_Svai.JPG
Просмотров: 201
Размер:	35.3 Кб
ID:	86638  
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 06.09.2012, 15:19
#3
Sokolov_Art


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


Хотелось бы разделить эти операции...
Offtop: В идеале я вижу процесс проектирования ж/б изделий так:
Рисую 3D модель, делаю по ней в нужных местах сечения, сечения не модели, а специальные сечения-рисунки которые создаются дополнительно. На этих сечениях командой qdim (быстрый размер) создаю размерную цепь, повторяющиеся размеры программно (lisp-ом) заменяются на единый целый размер равный сумме в него входящих и имеющий начало в начале первого повторяющегося размера и конец в конце последнего повторяющегося размера, при этом в текстовой части размера вписывается количество шагов по 200 (к примеру) и итоговый размер.
Далее вручную (так как пока не вижу способов автоматизировать) проставляются позиции стержней и выполняется спецификация... Со спецификацией другой разговор.
Sokolov_Art вне форума  
 
Непрочитано 06.09.2012, 15:53
#4
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от Sokolov_Art Посмотреть сообщение
Хотелось бы разделить эти операции...
На самом деле это 1 (одна) операция: построение арматурной сетки.

Цитата:
Сообщение от Sokolov_Art Посмотреть сообщение
Рисую 3D модель, делаю по ней в нужных местах сечения, сечения не модели,......
А вот для этого наверное понадобится специализированное программное обеспечение, например, Revit Structure,
а не частный случай "перебивки" размеров.
И тогда возможно для оформления чертежа придётся написать соответствующую команду.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 06.09.2012, 15:58
#5
Sokolov_Art


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


Если вы не в состоянии мне помочь, то зачем в этой теме вообще что-то писать?
У меня конкретный вопрос и я знаю, что это вполне решаемо...
Sokolov_Art вне форума  
 
Непрочитано 10.09.2012, 12:18
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Я три раза прочитав описание алгоритма из первой части - ничего не понял, но судя по третей тебе надо объединить существуюшие размеры. В выходные, пока летел в самолете, (там интернета естественоо не было), чтоб не уснуть сделал по памяти - уж то или нет - не знаю, но боюсь сейчас подправлять если и смогу - то только совсем по мелочи, а с учетом
Цитата:
Сообщение от Sokolov_Art Посмотреть сообщение
Пытался реализовать сам, но не хватает знания языка.
то и карты в руки:
Код:
[Выделить все]
 (vl-load-com)
(defun c:size-join()
  ((lambda (cod dim-groups ss doc)
     (vla-startundomark doc)
     (mapcar
      '(lambda (grp)
         ((lambda (pt1 pt2 pt3 pt4 first obj-first)
            ((lambda (pt1-pt2)
               (vla-put-textprefix obj-first
                                   (strcat (rtos (length grp)) "X" (rtos(vla-get-measurement obj-first)) "="))
               (entmod (subst (cons 14 (cadr pt1-pt2)) (assoc 14 first)(subst (cons 13 (car pt1-pt2)) (assoc 13 first) first)))
               (mapcar 'entdel (cdr grp)))
             (car (vl-sort (mapcar 'list (list pt1 pt1 pt2 pt2) (list pt3 pt4 pt3 pt4))
                           '(lambda (a b) (> (apply 'distance a) (apply 'distance b)))))))
          (cod 13 (car grp))
          (cod 14 (car grp))
          (cod 13 (last grp))
          (cod 14 (last grp))
          (entget (car grp))
          (vlax-ename->vla-object (car grp))))
      (dim-groups () ss))
     (vla-endundomark doc))
   (lambda (x ent) (cdr (assoc x (entget ent))));cod
   (lambda (grp lst);dim-groups
     (if lst
         ((lambda (pt1 pt2)
            ((lambda (dist fn)
               ((lambda (next-ent)
                  (if next-ent (dim-groups (cons (car lst) grp) (cons next-ent (vl-remove next-ent (cdr lst))))
                      (if grp (cons (cons (car lst) grp) (dim-groups () (cdr lst)))
                          (dim-groups () (cdr lst)))))
                (car (vl-member-if
                      '(lambda (ent)
                         (and (equal dist (distance (cod 13 ent) (cod 14 ent)) 0.0001)
                              (or (fn pt1 pt2 (cod 13 ent) (cod 14 ent) dist)
                                  (fn pt1 pt2 (cod 14 ent) (cod 13 ent) dist)
                                  (fn pt2 pt1 (cod 13 ent) (cod 14 ent) dist)
                                  (fn pt2 pt1 (cod 14 ent) (cod 13 ent) dist))))
                      (cdr lst)))));next-ent
             (distance pt1 pt2);dist
             (lambda (pt1 pt2 pt3 pt4 dist);fn
               (and (equal pt2 pt3 0.0001)
                    (equal (polar pt1 (angle pt1 pt4) dist) pt2 0.0001)))))
          (cod 13 (car lst));pt1
          (cod 14 (car lst)))
         grp))
   (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "DIM*"))))));ss
   (vla-get-activedocument (vlax-get-acad-object))));doc
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.09.2012, 17:20
#7
Sokolov_Art


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


Спасибо огромное за отзывчивость и уделенное время!!!
Работает, почти, как надо!
Очень понравилось то, что проверяются ВСЕ выделенные размеры и складываются соседние (в самый раз)
У меня первоначально была такая же идея реализации, но при данном подходе размер нельзя редактировать, то есть результат деления записывается навсегда в поле размера и при перетаскивании размерной линии (изменении количества шагов) этот размер показывает всё то же значение. В этом есть маленькое неудобство.
Для решения данного неудобства (как вариант) нужно вставить текстовое поле в котором будет вычисляться отношение длины текущего размера к заданному приращению (200,150 или любое другое), тогда при изменении размера, он будет автоматически пересчитывать кол-во шагов.
Sokolov_Art вне форума  
 
Непрочитано 10.09.2012, 17:27
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Sokolov_Art Посмотреть сообщение
Для решения данного неудобства (как вариант) нужно вставить текстовое поле в котором будет вычисляться отношение длины текущего размера к заданному приращению
Ну с этим-то ты сам, я полагаю, справишься? (строки 9 - 10 - назначает префикс - получи objectid от obj-first - и вставляй в соответствующее поле).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.09.2012, 17:39
#9
Sokolov_Art


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


Попытаюсь!
Я большинство lisp-ов, найденных на форуме под себя корректировал...
Ещё раз спасибо за внимание!
Sokolov_Art вне форума  
 
Непрочитано 03.08.2013, 10:46
#10
dip

проектировщик
 
Регистрация: 25.05.2007
г. Чебоксары
Сообщений: 206
<phrase 1=


Цитата:
Сообщение от Sokolov_Art Посмотреть сообщение
Для решения данного неудобства (как вариант) нужно вставить текстовое поле в котором будет вычисляться отношение длины текущего размера к заданному приращению (200,150 или любое другое), тогда при изменении размера, он будет автоматически пересчитывать кол-во шагов.
Уменя в автокаде 2014 не работает. Команду набираю. Выходит выбер объекта. Выбираю и результата нет. Или я что-то не так делаю

Последний раз редактировалось dip, 03.08.2013 в 10:54.
dip вне форума  
 
Непрочитано 03.08.2013, 12:38
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Приведи лог ком. строки из файла примера поста #1.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 03.08.2013, 13:22
#12
dip

проектировщик
 
Регистрация: 25.05.2007
г. Чебоксары
Сообщений: 206
<phrase 1=


Дима_. Понял разобрался. Но мне не подходит это. А нельзя выделить размер "1000" например и он из него сделал "5х200=1000" или "10х100=1000" в зависимости от шага который вводится перед выбором объекта. И чтобы значение при увеличении размера, например до "1200", менялось колво шагов. Файл прилагаю
Вложения
Тип файла: dwg
DWG 2007
Пример 2.dwg (84.0 Кб, 1228 просмотров)
dip вне форума  
 
Непрочитано 03.08.2013, 13:36
#13
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Есть подозрение, что можно сделать динамический блок + атрибут + поле для этих целей.
P.S. А чем размер с полями из файла не устраивает?

Последний раз редактировалось Do$, 03.08.2013 в 13:44.
Do$ вне форума  
 
Непрочитано 03.08.2013, 14:18
#14
dip

проектировщик
 
Регистрация: 25.05.2007
г. Чебоксары
Сообщений: 206
<phrase 1=


Цитата:
Сообщение от Do$ Посмотреть сообщение
Есть подозрение, что можно сделать динамический блок + атрибут + поле для этих целей.
Можно конечно. Но очень много таких блоков будет. Ассоциативность блокам нельзя будет задавать. Думал лиспом можно сделать

Цитата:
Сообщение от Do$ Посмотреть сообщение
P.S. А чем размер с полями из файла не устраивает?
Не устраивает. Поля сбиваются
dip вне форума  
 
Непрочитано 12.02.2016, 11:02
#15
Миксер


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Код:
Переделайте пожалуйста кто нить код под 2015 акад!
Миксер вне форума  
 
Непрочитано 12.02.2016, 11:52
#16
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


в 2015 автокаде код из п.6 работает нормально.
похожая тема: http://forum.dwg.ru/showthread.php?t=103609

Последний раз редактировалось kacugu, 12.02.2016 в 13:57.
kacugu вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как программно редактировать размеры в формат N x Y = Z (5х200=1000)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Как программно создавать масштабы аннотаций? Кулик Алексей aka kpblc LISP 17 03.09.2021 13:07
LISP. Как задать ассоциативность для созданных размеров? Кулик Алексей aka kpblc LISP 2 17.07.2012 17:20
Как программно (на lisp) определить высоту текущего шрифта? detrah LISP 7 18.08.2011 10:05
LISP / AutoCAD2008 / Как программно снять выделение у примитивов, не используя sssetfirst TararykovDG LISP 7 14.01.2011 10:48
Как создать слой (программно - Lisp) NEDIS LISP 4 29.08.2010 20:36