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

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

LISP для создания окна с разрезом стены и утеплителя.

Ответ
Поиск в этой теме
Непрочитано 26.05.2009, 10:20 #1
LISP для создания окна с разрезом стены и утеплителя.
Scorpio_1986
 
инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24

Код создания окна
Код:
[Выделить все]
; Создание окна
(defun dtr (a)
(* pi (/ a 180.0))
);_ end of defun
 
(defun sozdrazmer ()
(setq sp (getpoint "\nТочка вставки: "))
(setq ep (getpoint "\nШирина окна: "sp))
(setq tol (getdist "\nШирина стены: "sp))
(setq sh (distance sp ep))
(setq raspl (angle sp ep))
(setq raspl90 (+ raspl (dtr 90)))
(setq raspl180 (+ raspl (dtr 180)))
(setq aspl90 (- raspl (dtr 90)))
);_ end of defun
 
(defun sozdytipl ()
(command "_lweight" "0.18" "_color" "ByLayer"
"_pline"
(setq p (polar (polar sp raspl180 180) raspl90 120))
(polar p raspl90 130)
""
) ;_ end of command
(setq yt1 (entlast))
(command
"_pline"
(setq p (polar (polar sp raspl (+ sh 180)) raspl90 120))
(polar p raspl90 130)
""
) ;_ end of command
(setq yt2 (entlast))
);_ end of defun
 
(defun razytipl ()
(command "_trim"
yt1
yt2
""
"_F"
(setq p (polar (polar sp aspl90 1) raspl (/ sh 2)))
(polar p raspl90 (+ tol 2))
""
""
) ;_ end of command
);_ end of defun
 
(defun sozdsten ()
(command "_lweight" "0.4" "_color" "7" "_pline"
sp
(setq p (polar sp raspl90 120))
(setq p (polar p raspl180 60))
(setq tp (polar p raspl90 (- tol 120)))
""
"_pline"
(setq p (polar sp raspl sh))
(setq p (polar p raspl90 120))
(setq p (polar p raspl 60))
(polar p raspl90 (- tol 120))
""
) ;_ end of command
);_ end of defun
 
(defun sozdrazrez ()
(command "_trim"
(setq p (polar sp raspl90 60))
(polar p raspl sh)
""
"_F"
(setq p (polar (polar sp aspl90 1) raspl (/ sh 2)))
(polar p raspl90 (+ tol 2))
""
""
) ;_ end of command
);_ end of defun
 
(defun sozdokno ()
(command "_lweight" "0.2" "_color" "5" "_pline"
sp
(polar sp raspl sh)
""
"_pline"
(setq p (polar sp raspl90 120))
(polar p raspl sh)
""
"_pline"
(setq p (polar tp aspl90 (- tol 220)))
(polar p raspl (+ sh 120))
""
"_pline"
tp
(polar tp raspl (+ sh 120))
""
"_lweight" "ByLayer" "_color" "ByLayer"
) ;_ end of command
);_ end of defun
 
(defun C:OKNO ()
(sozdrazmer)
(setq sosmde (getvar "osmode"))
(setvar "osmode" sosmde)
(setvar "osmode" 0)
(sozdsten)
(sozdrazrez)
(sozdokno)
(setvar "osmode" sosmde)
);_ end of defun
 
(defun C:OKNO2 ()
(sozdrazmer)
(setq sosmde (getvar "osmode"))
(setvar "osmode" sosmde)
(setvar "osmode" 0)
(sozdytipl)
(razytipl)
(sozdsten)
(sozdrazrez)
(sozdokno)
(setvar "osmode" sosmde)
);_ end of defun
Я LISP изучаю только третий день и это моя первая работа поэтому возможно много ошибок, но она работает. Поэтому приму самую жесткую критику.

Последний раз редактировалось Scorpio_1986, 26.05.2009 в 13:24.
Просмотров: 5809
 
Непрочитано 26.05.2009, 10:27
#2
Кулик Алексей aka kpblc
Moderator

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


Ну раз примешь, тогда не обижайся
1. Ни одна переменная не внесена как локальная.
2. Нет обработчика ошибок
3. Насколько я помню, в некоторых случаях при достаточном удалении _.trim может работать некорректно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2009, 10:31
#3
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну раз примешь, тогда не обижайся
1. Ни одна переменная не внесена как локальная.
2. Нет обработчика ошибок
3. Насколько я помню, в некоторых случаях при достаточном удалении _.trim может работать некорректно.
Спасибо за критику! Но как я и говорил я только начинаю изучение LISP. и не знаю как внесте переменную как локальную, как создать обработчика ошибок, про трим я это понимаю но альтернативы еще не нашел Если можно примеры пожалуиста
Scorpio_1986 вне форума  
 
Непрочитано 26.05.2009, 12:02
#4
Alan

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


Цитата:
Сообщение от Scorpio_1986 Посмотреть сообщение
Спасибо за критику! Но как я и говорил я только начинаю изучение LISP. и не знаю как внесте переменную как локальную, как создать обработчика ошибок, про трим я это понимаю но альтернативы еще не нашел Если можно примеры пожалуиста
Посмотрите вот эту тему, http://forum.dwg.ru/showthread.php?t=22894 многие Ваши вопросы в ней обсуждались.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 26.05.2009, 13:23
#5
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Цитата:
Сообщение от Alan Посмотреть сообщение
Посмотрите вот эту тему, http://forum.dwg.ru/showthread.php?t=22894 многие Ваши вопросы в ней обсуждались.
Alan спасибо за ссылку, обязательно буду читать. Я конечно ожидал комментариев насчет моего кода, ну ладно буду разбираться сам.
А для чего нужна локальная переменная, а для чего аргумент, а когда пустым оставлять?

Последний раз редактировалось Scorpio_1986, 26.05.2009 в 13:40.
Scorpio_1986 вне форума  
 
Непрочитано 26.05.2009, 22:21
#6
Кулик Алексей aka kpblc
Moderator

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


Локальная переменная очищается после выхода из функции. Уничтожается, грубо говоря.
Пример "переделки" (кстати, у тебя в getpoint и getdist ошибки, ты в курсе?):
Код:
[Выделить все]
(defun c:okno (/ sosmde)
  (sozdrazmer)
  (setq sosmde (getvar "osmode"))
  (setvar "osmode" sosmde)
  (setvar "osmode" 0)
  (sozdsten)
  (sozdrazrez)
  (sozdokno)
  (setvar "osmode" sosmde)
  ) ;_ end of defun
P.S. Может, тему все же перенести в "Программирование"? Так как предполагается вторая часть по обучению, как я понимаю...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.05.2009, 08:24
#7
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Насчет getpoint и getdist ошибки заметил буквально вчера если я конечно те ошибки имею ввиду что и вы. Насчет перенесения я не против. Насчет локальной переменной я понял в чем суть, но в моем случаи для обьявления локальных переменных как я думаю надо обьединить на один лисп, насчет osmode при отмены опирации создания окна отключается привязки и что-бы это предотворотить я поставил (setvar "osmode" sosmde) до отключения привязок что-бы при отмене она включался, эти грабли наверное встречались и в других лиспах может есть другое решение
Scorpio_1986 вне форума  
 
Непрочитано 27.05.2009, 23:13
#8
Кулик Алексей aka kpblc
Moderator

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


Вариантов "обхода" туча.
1. Использовать локальный обработчик ошибок наподобие http://www.arcada.com.ua/forum/viewtopic.php?t=445
2. При рисовании командными методами использовать опцию "_none" перед указанием точек.
3. Не использовать командные методы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.05.2009, 08:13
#9
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
1. Использовать локальный обработчик ошибок наподобие http://www.arcada.com.ua/forum/viewtopic.php?t=445
Этот обработчик ошибок я видел но еще не полностью понимаю как она работает.
А отказаться от командных методов мне еще пока думаю рано.
Scorpio_1986 вне форума  
 
Автор темы   Непрочитано 30.06.2009, 14:13
#10
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Я пытался изучить лисп по теме: Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу), и пытался довести до ума свой лиспик. Но окончательно запутался что даже не могу понять в чем у меня ошибка. Помогите пожалуиста!!!
Код:
[Выделить все]
 
(defun dtr (a)
  (* pi (/ a 180.0))
)
     ; Создание окна
(defun C:OKNO (/      sp     ep     pt1    sh   tol  raspl raspl180
        ang    tp     ang180 yt1    yt2   p  st1 st2
        sosmde get_nil     lang   pt0
       )
  (defun *error* (msg)
    (princ msg)    ; Отменено пользователем
    (if sosmde
      (setvar "OSMODE" sosmde)
    )
  ) ;_ end of defun
  (setq get_nil t) ;_Устанавливаем флаг
  (while get_nil
    (setq sp (getpoint "\nТочка вставки (ENTER-Хватит): "))
    (setq pt0 (getvar "lastpoint"))
    (if (equal pt0 sp 0.000001)
      (progn
 (setq get_nil nil) ;_Сбрасываем флаг
 (setvar "osmode" sosmde)
      ) ;_ end of progn
      (progn
 (if (not sh)
   (progn
     (setq ep (getpoint "\nТочка определяющая ширину окна: " sp))
     (setq
       pt1 (getpoint "\nТочка определяющая ширину стены: " sp)
     )
     (setq sh (distance sp ep))
     (setq tol (distance sp pt1))
     (setq raspl (angle sp ep))
     (setq raspl180 (+ raspl (dtr 180)))
     (setq ang (angle sp pt1))
     (setq lang (- ang raspl))
     (setq tp (polar (polar sp ang tol) raspl 180 60))
     (setq ang180 (+ ang (dtr 180)))
   ) ;_end of progn
   (progn
     (setq ep (getpoint "\nНаправление окна: " sp))
     (setq raspl (angle sp ep))
     (setq raspl180 (+ raspl (dtr 180)))
     (setq ang (+ raspl lang))
     (setq tp (polar (polar sp ang tol) raspl 180 60))
     (setq ang180 (+ ang (dtr 180)))
   ) ;_end of progn
 ) ;_end of if
 (setq sosmde (getvar "osmode"))
 (setvar "osmode" 0)
 (command "_lweight"
   "0.18"
   "_color"
   "ByLayer"
   "_pline"
   (setq p (polar (polar sp ang 120) raspl180 180))
   (polar p ang 130)
   ""
 ) ;_ end of command
 (setq yt1 (entlast))
 (command
   "_pline"
   (setq p (polar p raspl (+ sh 360)))
   (polar p ang 130)
   ""
 ) ;_ end of command
 (setq yt2 (entlast))
 (command "_trim"
   yt1
   yt2
   ""
   "_F"
   (setq p (polar sp raspl (/ sh 2)))
   (polar p ang tol)
   ""
   ""
 ) ;_ end of command
 (command "_lweight"
   "0.4"
   "_color"
   "7"
   "_pline"
   sp
   (setq p (polar sp ang 120))
   (setq p (polar p raspl180 60))
   tp
   ""
 ) ;_ end of command
 (setq st1 (entlast))
 (command
   "_pline"
   (setq p (polar sp raspl sh))
   (setq p (polar p ang 120))
   (setq p (polar p raspl 60))
   (polar p ang (- tol 120))
   ""
 ) ;_ end of command
 (setq st2 (entlast))
 (command "_trim"
   st1
   st2
   ""
   "_F"
   (setq p (polar sp raspl (/ sh 2)))
   (setq p (polar p ang tol))
   ""
   ""
 ) ;_ end of command
 (command "_lweight"
   "0.2"
   "_color"
   "5"
   "_pline"
   sp
   (polar sp raspl sh)
   ""
   "_pline"
   (setq p (polar sp ang 120))
   (polar p raspl sh)
   ""
   "_pline"
   (setq p (polar tp ang180 (- tol 220)))
   (polar p raspl (+ sh 120))
   ""
   "_pline"
   tp
   (polar tp raspl (+ sh 120))
   ""
   "_lweight"
   "ByLayer"
   "_color"
   "ByLayer"
 ) ;_ end of command
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
)

Последний раз редактировалось Scorpio_1986, 30.06.2009 в 14:31.
Scorpio_1986 вне форума  
 
Непрочитано 30.06.2009, 14:51
#11
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


По крайней мере здесь точно

Код:
[Выделить все]
 
.............................................
(if (not sh)
(progn
(setq ep (getpoint "\nТочка определяющая ширину окна: " sp))
(setq
pt1 (getpoint "\nТочка определяющая ширину стены: " sp)
)
(setq sh (distance sp ep))
(setq tol (distance sp pt1))
(setq raspl (angle sp ep))
(setq raspl180 (+ raspl (dtr 180)))
(setq ang (angle sp pt1))
(setq lang (- ang raspl))
(setq tp (polar (polar sp ang tol) raspl 180 60))
(setq ang180 (+ ang (dtr 180)))
) ;_end of progn
(progn
(setq ep (getpoint "\nНаправление окна: " sp))
(setq raspl (angle sp ep))
(setq raspl180 (+ raspl (dtr 180)))
(setq ang (+ raspl lang))
(setq tp (polar (polar sp ang tol) raspl 180 60))
(setq ang180 (+ ang (dtr 180)))
) ;_end of progn
) ;_end of if
...........................................................
Ты бы поместил сюда картинку, что ты хочешь получить...
CB вне форума  
 
Автор темы   Непрочитано 30.06.2009, 15:43
#12
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Я хочу создать лисп для рисования окна с автоматическим разрезом утиплителя и стены, после вставки первого окна операция продолжается только с выбором точки вставки и угла поворота. CB, Makswell там и были ошибки спасибо, теперь работает довольно таки хорошо, но все еще требует доработки.

Спасибо Makswell за внесенные изменения!!! Хотелось бы еще избавиться от команды trim...

Код:
[Выделить все]
 
(defun dtr (a)
  (* pi (/ a 180.0))
)

                    ; Создание окна

(defun C:OKNO (/      sp     ep        pt1       sh      tol     raspl    raspl180
           ang    tp     ang180 yt1       yt2      p     st1    st2
           sosmde get_nil        lang   pt0
          )
(setq sosmde (getvar "osmode"))
  (defun *error* (msg)
    (princ msg)                ; Отменено пользователем
    (if    sosmde
      (setvar "OSMODE" sosmde)
    )
  ) ;_ end of defun

  (setq get_nil t) ;_Устанавливаем флаг
  (while get_nil
    (if sosmde (setvar "osmode" sosmde))
    (setq sp (getpoint "\nТочка вставки (ENTER-Хватит): "))
    (setq pt0 (getvar "lastpoint"))
    (if    (equal pt0 sp 0.000001)
      (progn
    (setq get_nil nil) ;_Сбрасываем флаг
    (setvar "osmode" sosmde)
      ) ;_ end of progn
      (progn
    (if (not sh)
      (progn
        (setvar "OSMODE" 512)
        (setq ep (getpoint "\nТочка определяющая ширину окна: " sp))
        (setvar "OSMODE" 128)
        (setq
          pt1 (getpoint "\nТочка определяющая ширину стены: " sp)
        )
        (setvar "osmode" 0)
        (setq sh (distance sp ep))
        (setq tol (distance sp pt1))
        (setq raspl (angle sp ep))
        (setq raspl180 (+ raspl (dtr 180)))
        (setq ang (angle sp pt1))
        (setq lang (- ang raspl))
        (setq tp (polar (polar sp ang tol) raspl180 60))
        (setq ang180 (+ ang (dtr 180)))
      ) ;_end of progn
      (progn
        (setvar "OSMODE" 512)
        (setq ep (getpoint "\nНаправление окна: " sp))
        (setvar "osmode" 0)
        (setq raspl (angle sp ep))
        (setq raspl180 (+ raspl (dtr 180)))
        (setq ang (+ raspl lang))
        (setq tp (polar (polar sp ang tol) raspl180 60))
        (setq ang180 (+ ang (dtr 180)))
      ) ;_end of progn
    ) ;_end of if
    ;;построение полилинии
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)    ;количество вершин
               (cons 62 256)    ;номер цвета (0 - поБлоку, 256 - поСлою)
               (cons 370 18)    ;вес полилинии, умноженный на 100 (0.18)
               ;;вершина 1
               (cons 10 (setq p (polar (polar sp ang 120) raspl180 180)))
               ;;вершина 2...
               (cons 10 (polar p ang 130))
               ;; и т.д....
         )
    )
    (setq yt1 (entlast))
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)
               (cons 62 256)
               (cons 370 18)
               (cons 10 (setq p (polar p raspl (+ sh 360))))
               (cons 10 (polar p ang 130))
         )
    )
    (setq yt2 (entlast))
    (command "_trim"
         yt1
         yt2
         ""
         "_F"
         (setq p (polar sp raspl (/ sh 2)))
         (polar p ang tol)
         ""
         ""
    ) ;_ end of command
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 4)
               (cons 62 7)
               (cons 370 40)
               (cons 10 sp)
               (cons 10 (setq p (polar sp ang 120)))
               (cons 10 (setq p (polar p raspl180 60)))
               (cons 10 tp)
         )
    )
    (setq st1 (entlast))
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 4)
               (cons 62 7)
               (cons 370 40)
               (cons 10 (setq p (polar sp raspl sh)))
               (cons 10 (setq p (polar p ang 120)))
               (cons 10 (setq p (polar p raspl 60)))
               (cons 10 (polar p ang (- tol 120)))
         )
    )
    (setq st2 (entlast))
    (command "_trim"
         st1
         st2
         ""
         "_F"
         (setq p (polar sp raspl (/ sh 2)))
         (setq p (polar p ang tol))
         ""
         ""
    ) ;_ end of command
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)
               (cons 62 5)
               (cons 370 20)
               (cons 10 sp)
               (cons 10 (polar sp raspl sh))
         )
    )
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)
               (cons 62 5)
               (cons 370 20)
               (cons 10 (setq p (polar sp ang 120)))
               (cons 10 (polar p raspl sh))
         )
    )
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)
               (cons 62 5)
               (cons 370 20)
               (cons 10 (setq p (polar tp ang180 (- tol 220))))
               (cons 10 (polar p raspl (+ sh 120)))
         )
    )
    (entmake (list (cons 0 "LWPOLYLINE")
               (cons 100 "AcDbEntity")
               (cons 100 "AcDbPolyline")
               (cons 90 2)
               (cons 62 5)
               (cons 370 20)
               (cons 10 tp)
               (cons 10 (polar tp raspl (+ sh 120)))
         )
    )
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
)
Миниатюры
Нажмите на изображение для увеличения
Название: Пример.jpg
Просмотров: 211
Размер:	17.8 Кб
ID:	23017  

Последний раз редактировалось Scorpio_1986, 01.07.2009 в 14:05.
Scorpio_1986 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP для создания окна с разрезом стены и утеплителя.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Нужен Lisp для работы с типами линий Gostushev LISP 12 06.07.2005 14:50