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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лиспа на раскладку арматуры.

Лиспа на раскладку арматуры.

Ответ
Поиск в этой теме
Непрочитано 16.02.2008, 20:53 #1
Лиспа на раскладку арматуры.
Neo_
 
матрица
 
Регистрация: 06.04.2006
Сообщений: 401

Есть ли у кого лиспа для того чтобы щелкнув на размер раскладки например 2550, в итоге получить вместо нее 12х200+150=2550
можно и без =2550, прото 12х200+150. Очень буду благодарен.
Просмотров: 3969
 
Непрочитано 16.02.2008, 21:25
#2
Fellini


 
Регистрация: 02.10.2003
Сообщений: 1,158


Вроде в "Строителе" Барабанщикова есть такая команда.

Последний раз редактировалось Fellini, 16.02.2008 в 22:01.
Fellini вне форума  
 
Непрочитано 16.02.2008, 22:23
#3
Дима_

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


Такой подойдет (запускать командой "ARM"):
(defun c:arm ( / a b obj size)
(setq obj (entget (car (entsel "Выберите размер"))))
(if (= (cdr (assoc 0 obj)) "DIMENSION")
(progn
(setq size (cdr (assoc 42 obj))
a (fix (/ size 200))
b (- size (* a 200))
)
(if (= b 0)
(setq size (strcat (rtos a) "*200=" (rtos size)))
(setq size (strcat (rtos a) "*200+" (rtos b) "=" (rtos size)))
);end if
(setq obj (subst (cons 1 size) (assoc 1 obj) obj))
(entmod obj)
);end progn
(alert "Это не размер")
);end if
);end

P.S. Исправленно чтобы при кратном 200 ноль не добавляло.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.02.2008 в 00:22.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.02.2008, 14:10
#4
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Дима огромный респект. А то я уж стал книгу по лиспу искать и изучать..
Neo_ вне форума  
 
Непрочитано 17.02.2008, 14:39
#5
MichaelBY


 
Регистрация: 09.12.2007
Минск
Сообщений: 22
<phrase 1= Отправить сообщение для MichaelBY с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Такой подойдет (запускать командой "ARM"):
(defun c:arm ( / a b obj size)
(setq obj (entget (car (entsel "Выберите размер"))))
(if (= (cdr (assoc 0 obj)) "DIMENSION")
(progn
(setq size (cdr (assoc 42 obj))
a (fix (/ size 200))
b (- size (* a 200))
)
(if (= b 0)
(setq size (strcat (rtos a) "*200=" (rtos size)))
(setq size (strcat (rtos a) "*200+" (rtos b) "=" (rtos size)))
);end if
(setq obj (subst (cons 1 size) (assoc 1 obj) obj))
(entmod obj)
);end progn
(alert "Это не размер")
);end if
);end

P.S. Исправленно чтобы при кратном 200 ноль не добавляло.
Большое спасибо. Полезная вещь. А можно ли сделать, чтоб основной шаг можно было указывать. Скажем указываем размер, а затем указываем шаг 100, 150, 200 (скажем любой).
MichaelBY вне форума  
 
Автор темы   Непрочитано 17.02.2008, 15:04
#6
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


А можно еще , чтобы округлялись цифры, а то если есть нетоность тогда выходит: 20х200+150,0254=4150,0254
Neo_ вне форума  
 
Непрочитано 17.02.2008, 15:40
#7
MichaelBY


 
Регистрация: 09.12.2007
Минск
Сообщений: 22
<phrase 1= Отправить сообщение для MichaelBY с помощью Skype™


Цитата:
Сообщение от Neo_ Посмотреть сообщение
А можно еще , чтобы округлялись цифры, а то если есть нетоность тогда выходит: 20х200+150,0254=4150,0254
Можно просто установить Format-Units-Procision значение 0
MichaelBY вне форума  
 
Автор темы   Непрочитано 17.02.2008, 15:54
#8
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Спасибо , попробую. Но это пол беды, как добавить условие, что "если остаток меньше 100, то нужно делать его больше 200, т.е. 1050 будет не 5х200+50=1050, а 4х200+250=1050, понимаете в некоторых случаях допускается 250, чем 50..., что нереально для раскладки..
как говорится "положи палец в рот, он всю руку отмахнет".
Neo_ вне форума  
 
Непрочитано 18.02.2008, 09:37
#9
VVA

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


Пробуй так
Код:
[Выделить все]
(defun c:arm ( / a b obj size step)
(if (null (setq step (getint "\nШаг раскладки < 200 >: ")))
  (setq step 200)
  )
(setq obj (entget (car (entsel "Выберите размер"))))
(if (and obj
  (= (cdr (assoc 0 obj)) "DIMENSION")
  )
(progn
(setq size (cdr (assoc 42 obj)))
(setq a (fix (/ size step))
      b (- size (* a step))
      )
(if (< b 100)  ;;;Проверка на остаток < 100
  (setq a (fix (/ (- size 200) step))
      b (- size (* a step))
      )
  )
(if (= b 0)
(setq size (strcat (rtos a 2 0) "*200=" (rtos size 2 0)))
(setq size (strcat (rtos a 2 0) "*200+" (rtos b 2 0) "=" (rtos size 2 0)))
);end if
(setq obj (subst (cons 1 size) (assoc 1 obj) obj))
(entmod obj)
);end progn
(alert "Это не размер")
);end if
);end
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.02.2008, 15:55
#10
Дима_

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


Я тут немного отлучался но VVA подправил - если все, то удачи.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.10.2010, 18:50
#11
Дрюха

Инженер-конструктор
 
Регистрация: 20.07.2007
Москва
Сообщений: 2,936


Наткнулся на данный lisp...
В силу того, что знания по lisp-программированию у меня нулевые, то прошу помощи и вот именно в чем:
1. при загрузке данного лиспа запрашивается шаг (ставить можно любой), но в размерах после ввода данных все равно стоит значение по умолчанию, то есть число 200. Возможно ли сделать так, чтобы отображался реальный шаг раскладки?
2. Всегда отображается остаток в строке, даже если число делится ровнехонько на задаваемый шаг раскладки ( к примеру, размер имеет значеие 6000. ставя шаг 300, получаем значение: 19х300+300=6000). Возможно ли сделать так, чтобы в случае целого деления остаток не выводился бы (то есть, записывалось все вот так: 20х300=6000)

Уважаемы программисты, если есть возможность, помогите. Заранее благодарю
Дрюха на форуме  
 
Непрочитано 04.10.2010, 19:15
#12
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Дрюха, поробуй

Код:
[Выделить все]
(defun c:arm ( / a b obj size step)
(if (null (setq step (getint "\nШаг раскладки < 200 >: ")))
  (setq step 200)
  )
(setq obj (entget (car (entsel "Выберите размер"))))
(if (and obj
  (= (cdr (assoc 0 obj)) "DIMENSION")
  )
(progn
(setq size (cdr (assoc 42 obj)))
(setq a (fix (/ size step))
      b (- size (* a step))
      )
(if (= b 0)
(setq size (strcat (rtos a 2 0) "*" (itoa step) "=" (rtos size 2 0)))
(setq size (strcat (rtos a 2 0) "*" (itoa step) "+" (rtos b 2 0) "=" (rtos size 2 0)))
);end if
(setq obj (subst (cons 1 size) (assoc 1 obj) obj))
(entmod obj)
);end progn
(alert "Это не размер")
);end if
);end
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 04.10.2010, 19:34
#13
Дрюха

Инженер-конструктор
 
Регистрация: 20.07.2007
Москва
Сообщений: 2,936


TararykovDG, спасибо, вроде все работает
а есть еще маленькая просьба.....а можно ли сделать так:
к примеру, у нас есть размер длиной 3050. Возможно ли сделать так, чтобы остаток, если он меньше цифры 100, то лисп выдавал бы следующее (шаг, к примеру, у нас 200): 14*200+250=3050?
Надеюсь, понятно объяснил. Грубо говоря, остаточный шаг должен быть не менее 100

Добавление 1: О, все, разобрался сам))) Добавил пару строк из лиспа VVA. Все нормальненько вроде. Спасибо большое
Добавление 2:а можно ли сделать не однократный выбор, а несколкьо размеров сразу? TararykovDG, надежда на ВАС

Последний раз редактировалось Дрюха, 04.10.2010 в 19:47. Причина: Сначала попросил сделать одно, а потом сам смог))) Выходит, что я-начинающий лисп-программист)))) А теперь еще вопрос сформировался
Дрюха на форуме  
 
Непрочитано 04.10.2010, 20:03
#14
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Дрюха Посмотреть сообщение
Добавление 1: О, все, разобрался сам))) Добавил пару строк из лиспа VVA. Все нормальненько вроде. Спасибо большое
Да уж, я как раз убрал из кода VVA, то что Вам было нужно


Цитата:
Сообщение от Дрюха Посмотреть сообщение
Добавление 2:а можно ли сделать не однократный выбор, а несколкьо размеров сразу? TararykovDG, надежда на ВАС
Можно
Код:
[Выделить все]
(defun c:arm ( / a b nbr lst obj size step)
(if (null (setq step (getint "\nШаг раскладки < 200 >: ")))
  (setq step 200)
  )
(setq nbr (ssget (list (cons 0 "DIMENSION"))))
(if (setq lst (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr)))))
  (foreach obj lst
    (setq size (cdr (assoc 42 obj)))
    (setq a (fix (/ size step))
          b (- size (* a step))
          )
    (if (< b 100)  ;;;Проверка на остаток < 100
      (setq a (fix (/ (- size 200) step))
          b (- size (* a step))
          )
      )
    (if (= b 0)
    (setq size (strcat (rtos a 2 0) "*" (itoa step) "=" (rtos size 2 0)))
    (setq size (strcat (rtos a 2 0) "*" (itoa step) "+" (rtos b 2 0) "=" (rtos size 2 0)))
    );end if
    (setq obj (subst (cons 1 size) (assoc 1 obj) obj))
    (entmod obj)
  )
)  
);end
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 04.10.2010, 20:19
#15
Дрюха

Инженер-конструктор
 
Регистрация: 20.07.2007
Москва
Сообщений: 2,936


TararykovDG, опять выдает добавочный шаг....Вероятно, это из-за этой "проверки на остаток"...То есть , размер 2000 раскладывает так: 9х200+200=2000.
Дрюха на форуме  
 
Непрочитано 04.10.2010, 20:54
#16
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Дрюха, а так
Код:
[Выделить все]
(defun c:arm ( / a b nbr lst obj size step)
(if (null (setq step (getint "\nШаг раскладки < 200 >: ")))
  (setq step 200)
  )
(setq nbr (ssget (list (cons 0 "DIMENSION"))))
(if (setq lst (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr)))))
  (foreach obj lst
    (setq size (cdr (assoc 42 obj)))
    (setq a (fix (/ size step))
          b (- size (* a step))
          )
    (if (and (< b 100) (> b 0)) 
      (setq a (fix (/ (- size step) step))
          b (- size (* a step))
          )
      )
    (if (= b 0)
    (setq size (strcat (rtos a 2 0) "*" (itoa step) "=" (rtos size 2 0)))
    (setq size (strcat (rtos a 2 0) "*" (itoa step) "+" (rtos b 2 0) "=" (rtos size 2 0)))
    );end if
    (setq obj (subst (cons 1 size) (assoc 1 obj) obj))
    (entmod obj)
  )
)  
);end
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 04.10.2010, 20:56
#17
Евгений Д.

PROrab
 
Регистрация: 11.10.2009
Stavropol
Сообщений: 360
<phrase 1=


объясните что это такое (лисп), как им пользоваться и в чём его преимущества.
Евгений Д. вне форума  
 
Непрочитано 04.10.2010, 21:01
#18
Дрюха

Инженер-конструктор
 
Регистрация: 20.07.2007
Москва
Сообщений: 2,936


TararykovDG , ОГРОМНОЕ Вам спасибо!! На первый взгляд все работает идеально! Если что-нибудь будет не так, то отпишусь. еще раз спасибо.
Offtop: С Вашего позволения заменю звездочки на крестики
Дрюха на форуме  
 
Непрочитано 05.10.2010, 08:25
#19
Do$

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


Цитата:
Сообщение от Евгений Д. Посмотреть сообщение
объясните что это такое (лисп), как им пользоваться и в чём его преимущества.
http://dwg.ru/art/8
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лиспа на раскладку арматуры.

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анкеровка арматуры A-III и А400 POMAH9IH Железобетонные конструкции 31 03.09.2014 09:40
Реально ли учесть физ. нелинейность в железобетонных конст. EUDGEN Расчетные программы 344 18.10.2013 15:19
Стыковка арматуры внахлестку (с накладками)в соотв с ДСТУ Almak Железобетонные конструкции 27 25.07.2012 20:32
стык арматуры внахлестку Black_Raven Железобетонные конструкции 15 04.08.2007 19:20
SCAD и размещение арматуры в сечении колонны EUDGEN SCAD 110 20.01.2006 14:14