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

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

Пытаюсь лисп написать.

Ответ
Поиск в этой теме
Непрочитано 06.02.2011, 20:31 #1
Пытаюсь лисп написать.
yudjinSS
 
Регистрация: 30.12.2009
Сообщений: 25

Всем привет. От нечего делать решил написать лисп, функции которого излагать очень долго (пробовал не помещается). Проблема такова: вводим число от 1 до 18, затем указываем 2 точки (определяем расстояние, это я научился), и в зависимости от числа и расстояния необходимо присвоить переменным определенные словесные значения. И при этом лисп нужно зациклить, и например, при вводе числа 19 сделать выход. Функция cond работает только 1 раз, (т.е. нельзя сделать "cond в condе"). Есть некий список слов, при вводе чила (1-18) часть из них отсеивается, а при получении расстояния между точками переменной присваиваются соответствующие этому расстоянию слова. Если не понятно написал, извиняюсь.
Просмотров: 2909
 
Непрочитано 06.02.2011, 20:40
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


можно и без cond обойтись, нужно просто привести указанное расстояние к числам от "1 до 18"
gomer вне форума  
 
Непрочитано 07.02.2011, 06:31
#3
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от yudjinSS Посмотреть сообщение
Если не понятно написал, извиняюсь.
Конечно не понятно , попробуй ещё раз объяснить
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 07.02.2011, 14:20
1 | #4
VVA

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


Цитата:
Сообщение от yudjinSS Посмотреть сообщение
т.е. нельзя сделать "cond в condе")
Сделай cond в while
Код:
[Выделить все]
 
(defun C:TEST ()
  (initget 6)
  (while (and
           (setq num (getint "\nВведите число (1 - 18) <выход> : "))
           (< num 19)
           (setq pt1 (getpoint "\n1-я точка <выход> : "))
           (setq pt2 (getpoint pt1 "\n2-я точка <выход> : "))
           (setq dist (distance pt1 pt2))
           )
    ;;; У нас есть число в num и расстояние в dist
   (cond
     ((and 
          (= num 1)
          (> dist 6)
         )
      ;;;Что-то деляем когда num=1 и dist> 6
      )
     ;;; ... остальные условия cond
     (t nil)
     )
    (initget 6)
    );_while
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 09.02.2011 в 09:32.
VVA вне форума  
 
Автор темы   Непрочитано 08.02.2011, 21:18
#5
yudjinSS


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


Извиняюсь. Да действительно не понятно написал. Этот лисп нужен для составления спецификация и ведомостей сборных перемычек. Т.е. вводя число от 1 до 18 мы выбираем исполнение перемычки (у меня их получилось именно 18), а вводя расстояние мышкой на плане с проемами мы получаем ширину проема и каждому диапазону проемов соответсвует своя перемычка.

Вот как это выглядит для перемычек для перегородок (120 мм)

Код:
[Выделить все]
 (princ "Укажите первую точку проема")
 (setq aa (getpoint))
 (terpri)

(princ "Укажите вторую точку проема")
 (setq ab (getpoint))
 (terpri)

 (setq aax (car aa))
 (setq aay (cadr aa))

 (setq abx (car ab))
 (setq aby (cadr ab))


 (setq ax (- aax abx))
 (setq ay (- aay aby))

 (setq axs (* ax ax))
 (setq ays (* ay ay))
 
 

(setq a (sqrt(+ axs ays)))

(princ "Ширина проема")
(print a)
(terpri)

 
(setq a1 

(cond

    ((< a 800) "2ПБ 10-1")

    ((< 801 a 900) "2ПБ 11-1")

    ((< 901 a 1100) "2ПБ 13-1")

    ((< 1101 a 1300) "2ПБ 15-1")

    ((< 1201 a 1400) "2ПБ 16-2")

    ((< 1401 a 1500) "2ПБ 17-2")

    ((< 1501 a 1600) "2ПБ 18-2")

    ((< 1601 a 1700) "2ПБ 19-3")

    ((< 1701 a 2100) "2ПБ 22-3")

    ((< 2101 a 2300) "2ПБ 25-3")

    ((< 2101 a 2300) "2ПБ 26-4")

    ((< 2301 a 2700) "2ПБ 29-4")

    ((> a 2701) "нужна монолитная перемычка")

  )
Когда я разберусь как можно задавать исполнение перемычки, думаю делом техники будет сделать так что бы лисп вставлял в чертеж динамический блок (в указанную точку) который будет содержать в своих параметрах инфу о перемычке (ее "состав" и отметку). А затем эти параметры можно будет извлечь в таблицы ведомости и спецификации. У нас в конторе почему то ни у кого не получается сделать чертежи с перемычками без ошибок с первого раза. Я думаю такой лисп будет крайне нам полезен.

Последний раз редактировалось yudjinSS, 08.02.2011 в 21:28.
yudjinSS вне форума  
 
Непрочитано 08.02.2011, 21:47
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Парочка вопросов:
1. можно сам дин.блок перемычки посмотреть? Как он реализован?
2. В файле, где планируется выполнять лисп, уже есть описание этого блока или его надо откуда-то импортировать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.02.2011, 21:43
#7
yudjinSS


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


Блок с перемычкой покажу в ближайшее время. Он на работе остался. Он содержит в себе атрибуты о составе и отметке перемычки, а графически представляет из себя заштрихованный прямоугольник. Вы мне лучше подскажите как этот лисп написать. Выбрал исполнение, указал 2 точки, получил, данные, выбрал исполнение указал 2 точки, получил данные и т.д. до бесконечности; выбрал "выйти" - вышел. У меня не получается зациклить все это дело. Было бы в языке автолисп функция go to как например в фортране. Выбрал исполнение №9 "if a=9 go to 6" например. Просматриваю коды лиспов где реализована подобная схема, но у меня это в мозгу не вмещается пока, слишком сложные. Наверняка можно как то это попроще сделать.
yudjinSS вне форума  
 
Непрочитано 09.02.2011, 23:57
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Я предполагал другое решение, если честно: команда запускается на выполнение, пользователь указывает первую и вторую точки, в первую точку устанавливается блок перемычки (естественно, с поворотом на нужный угол), которому сразу и назначается соответствующее исполнение, а также (по возможности) заполняются атрибуты...
А так можно погонять нечто типа
Код:
[Выделить все]
 (defun test (/ var pt1 pt2)
  (if (= (type (setq var (vl-catch-all-apply
                           (function
                             (lambda ()
                               (initget 6)
                               (getint "\nВведите исполнение 1 .. 18 <Отмена> : ")
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'int
         ) ;_ end of =
    (while (and (= (type (setq pt1 (vl-catch-all-apply
                                     (function
                                       (lambda ()
                                         (getpoint "\nПервая точка проема <Отмена> : ")
                                         ) ;_ end of lambda
                                       ) ;_ end of function
                                     ) ;_ end of vl-catch-all-apply
                               ) ;_ end of setq
                         ) ;_ end of type
                   'list
                   ) ;_ end of =
                (= (type (setq pt2 (vl-catch-all-apply
                                     (function
                                       (lambda ()
                                         (getpoint pt1 "\nВторая точка проема <Отмена> : ")
                                         ) ;_ end of lambda
                                       ) ;_ end of function
                                     ) ;_ end of vl-catch-all-apply
                               ) ;_ end of setq
                         ) ;_ end of type
                   'list
                   ) ;_ end of =
                ) ;_ end of and
      ;; И здесь уже вставка блока. Но мне сам подход не нравится...
     ) ;_ end of while
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.02.2011, 00:27
#9
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


(while
(setq aa (getpoint"\nУкажите первую точку проема или пустой ввод для выхода"))
(setq ab (getpoint aa "\nУкажите вторую точку проема"))

while - будет исполнять цикл до тех пор, пока аргумент этой функции будет истинным. В вашем случае пока будет указываться первая точка aa

Не очень понятно, как вы описали аргумент функции cond
В коде, при указании 2-ух точек вы можете получить нецелочисленное значение, допустим 800.5

Далее. Не обязательно перемычка должна быть монолитной.
Может и металлический профиль быть (уголок например)

Я думаю также в программе необходимо дать пользователю возможность определения типа перемычки. Несущая или ненесущая
Сортировать можно по последним числам в маркировке.
При значении 27-37 (несущая)
Обязательно проверять минимальное опирание на стену.
Павлюкас вне форума  
 
Автор темы   Непрочитано 10.02.2011, 22:00
#10
yudjinSS


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


Кулик Алексей. Спасибо за помощь, но я имел в виду немного другое. Зациклить необходимо немного пораньше до ввода исполнения перемычки. Исполнение перемычки - это ее состав, т.е. несущая или ненесущая, из каких брусковых перемычек буде состоять. Выбираешь исполнение перемычки, тем самым ты говоришь, что она будет для стены такой-то толщины, состоять из таких то брусковых перемычек. См вложенный файл. Каждой брусковой перемычки соответствует максимальный пролет который она может перекрыть. А вот ее марка определяется шириной проема, как в показаном мной ранее коде, для определенного диапазона проемов подходит 1 данная а не какая либо другая перемычка. Как сделать так что бы если выбрал исполнение №2 лисп переходил к назначению значению переменной а1 вот так
(setq a1

(cond

((< a 800) "2ПБ 10-1")

((< 801 a 900) "2ПБ 11-1")

((< 901 a 1100) "2ПБ 13-1")

((< 1101 a 1300) "2ПБ 15-1")

((< 1201 a 1400) "2ПБ 16-2")

((< 1401 a 1500) "2ПБ 17-2")

((< 1501 a 1600) "2ПБ 18-2")

((< 1601 a 1700) "2ПБ 19-3")

((< 1701 a 2100) "2ПБ 22-3")

((< 2101 a 2300) "2ПБ 25-3")

((< 2101 a 2300) "2ПБ 26-4")

((< 2301 a 2700) "2ПБ 29-4")

((> a 2701) "нужна монолитная перемычка")

)


а при вводе назначении а1 числа 1 аналогично подбирал перемычку 1ПБ?
Вложения
Тип файла: pdf перем.pdf (20.4 Кб, 83 просмотров)

Последний раз редактировалось yudjinSS, 10.02.2011 в 23:03.
yudjinSS вне форума  
 
Непрочитано 11.02.2011, 00:35
#11
Juss_00

Инженер
 
Регистрация: 11.12.2007
Москва
Сообщений: 295


Вечер Добрый )

Мы с yudjinSS как раз начинали обсуждать как сделать такой лисп/блок.
Я сделал такой (см вложение) блок. Позволяет за несколько этапов нарисовать и сделать спецификацию с эскизами. Но надо смотреть в спецификацию и постоянно держать в уме опирание.

Подскажите плиз пару вещей тож.
1) на сколько реально сделать через Вижел лисп. (Окно с активаторами по колличеству входящих в состав перемычки элементов, после активации внизу открывается менюшка в которой выбираем тип перемычек пб1-пб9 плюс монолит уголок утеплитель) Подтверждение. Указываем 2 точки и после этого лисп прогоняет полученный пролет по заданным типам перемычкек и вставляет с соблюдением опирания. В результате в чертеже получаем данный или похожий блок стоящий как надо (с равным опиранием отцентрованный) и в свойствах его Лук апы выбраны по результатам подбора.
(я как то так вижу это но мне кажется оч сложным.

Так же если не затруднит дайте ссылку где можно узнать про Lisp
1) как получать/устанавливать свойства объектов обычных и свойства Дин блоков.
2) Текст и мтекст получать его содержимое.
3) Как лиспом запомнить выбранные объекты и повторно их выбирать.
Вложения
Тип файла: dwg
DWG 2007
Блок перемычек.dwg (109.7 Кб, 433 просмотров)
__________________
Live as though tomorrow you will die,
Study as though you will live eternally.
Juss_00 вне форума  
 
Непрочитано 13.02.2011, 17:10
#12
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


yudjinSS
На мой взгляд вы не совсем верно описываете алгоритм задачи.
Во-первых вариантов исполнения не 18, а намного намного больше.
Тощина стены может варьироваться. Причём не обязательно под кирпичную кладку (120, 250,380,510 и т.д.)
Далее величина проёма допустим 850 не гарантирует выбор перемычки
2ПБ 11-1. Данную перемычку можно положить и на проём 700.
Есть ограничение по минимальному опиранию. Максимальное же опирание зависит исключительно от того, какой тип реакций возникает в местах опирания перемычки на стену. Главное избегать жёсткой заделки. (Изгибающего момента). Опирание может быть хоть полметра.

А если стена от 380 мм и выше, то добавляются и стандартные плитные перемычки (ПП).
Павлюкас вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Пытаюсь лисп написать.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пытаюсь написать фильтр на LISP (помогите понять в чем ошибка) Pontelimon LISP 67 10.02.2011 11:11
Офисная перегородка. Хочу написать Лисп, рисующий вид сбоку. welldone LISP 12 30.09.2008 17:14
Лисп: моментальное редактирование цифр в предложениях dextron3 LISP 12 27.09.2008 09:33
Лисп для копирования данных нескольких мтекстов по принципу расположения. Red Nova LISP 14 18.06.2008 22:08
КАК написать Лисп (2) Simbol LISP 8 15.05.2006 08:55