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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подскажите, существуют ли практические руководства по Lisp?

Подскажите, существуют ли практические руководства по Lisp?

Ответ
Поиск в этой теме
Непрочитано 07.03.2006, 15:51 #1
Подскажите, существуют ли практические руководства по Lisp?
vn
 
Регистрация: 10.02.2006
Сообщений: 369

Недавно купил книгу. Полный сборник команд Lisp с их описанием.
Но на этом все и кончилось. Никаких примеров для начинающих.
Если кто знает, с чего начинать изучение Lisp медленно и шаг за шагом , подскажите пожалуйста.
Просмотров: 60771
 
Непрочитано 07.03.2006, 15:56
#2
Кулик Алексей aka kpblc
Moderator

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


Так а что конкретно надо сделать? Пока не будет реальной задачи, боюсь, изучить язык практически нереально.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.03.2006, 15:58
#3
Кочетков Андрей

Regular Java Developer
 
Регистрация: 03.02.2006
Сообщений: 4,638


Великолепный сайт по Лиспу:
http://www.afralisp.co.za/index.htm
Кочетков Андрей вне форума  
 
Автор темы   Непрочитано 07.03.2006, 16:36
#4
vn


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


Началось с того, что нужно было нарисовать в трехмерке змеевик для цистерны. Скачал программку Спираль называется и со скрипом изобразил змеевик. И тут обнаружил, что начало змеевика не совпадает ни с одной плоскостью мировой системы координат, да еще и развернуто на какой-то угол вдоль оси. Крутил , вертел пока не соединил змеевик с магистралью, и доращивал кусочки. Короче, употел. Это было два года назад. И тогда пришла мысль начинать учить Lisp самому. Но не тут то было. Ни книг, ни учебников, ни пособий. Говорят, во ВТУЗах уже есть какие-то методички, но я их не видел.
vn вне форума  
 
Автор темы   Непрочитано 07.03.2006, 16:58
#5
vn


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


Спасибо, Андрей Кочетков!
Сайт действительно великолепный!
Но и английский для работы с ним надо знать великолепно!
vn вне форума  
 
Непрочитано 07.03.2006, 17:32
#6
bernata


 
Регистрация: 22.09.2005
здесь могла быть ваша реклама
Сообщений: 1,235


Я постоянно использую в работе чужие ЛИСПы.
Из за отсутствия времени сам на пути изучения AutoLISP сделал только 3 первых шага:

1) Заказал книжку "Autocad: разработка приложений, настройка и адаптация" БХВ-Петербург, 2006 серия "В подлиннике"

2) Заглядываю на русский сайт - http://aco.ifmo.ru/~nadinet/html/alisp.phtml (кстати на сайте есть справочник команд LISP)

3) Скачал две главы из книги "Эффективная работа: AutoCAD 2005" Тику Ш. http://dwg.ru/forum/viewtopic.php?t=6353

Много вариантов перебрал (в том числе и сайты на английском),
но перечисленные источники мне показались более подходящими.имхо
bernata вне форума  
 
Непрочитано 11.01.2008, 13:23
#7
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Цитата:
2) Заглядываю на русский сайт - http://aco.ifmo.ru/~nadinet/html/alisp.phtml (кстати на сайте есть справочник команд LISP)
Вот на этом сайте есть такой пример:
(defun add10 (x)(+ 10 x); возвращает ADD10
Вот что выдаёт ком.стр. моего 2007-го:
Command: (defun add10 (x)(+ 10 x)
(_>
Вот это что? (_> Что он хочет?
Jerald вне форума  
 
Непрочитано 11.01.2008, 13:35
#8
Кулик Алексей aka kpblc
Moderator

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


Чтобы закрыли скобку.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2008, 17:10
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Руководства здесь Ссылки на LISP и не только
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 12.01.2008, 19:19
#10
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Что-то слишком много инфы.
Как же мне теперь этот весь клубок распутывать?
Jerald вне форума  
 
Непрочитано 12.01.2008, 21:52
#11
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Jerald Посмотреть сообщение
Что-то слишком много инфы.
Как же мне теперь этот весь клубок распутывать?
Постепенно А если серьезно, то ставится задача (желательно не очень сложная), и пытаешься ее решить. Если не получается - на форум за консультациями. Если получается, но есть подозрения, что "надо бы улучшить" - тоже на форум Я так начинал
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2008, 23:46
#12
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


У меня пока нет конкретной задачи. Просто нечаянно скачал на форуме книгу по Лиспу. Потом начал задавать вопросы по книге. А теперь не значю что и делать?
Jerald вне форума  
 
Непрочитано 13.01.2008, 08:07
#13
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от Jerald Посмотреть сообщение
У меня пока нет конкретной задачи. Просто нечаянно скачал на форуме книгу по Лиспу. Потом начал задавать вопросы по книге. А теперь не значю что и делать?
Закачать обратно. Пока не появится задача
ShaggyDoc вне форума  
 
Непрочитано 13.01.2008, 08:21
#14
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Цитата:
Просто нечаянно скачал на форуме книгу по Лиспу.
А я нечаянно скачал порнофильм. И теперь тоже не знаю, что делать.
Profan вне форума  
 
Непрочитано 13.01.2008, 08:25
#15
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Задача очень простая. Нужно создать ИИ.
Jerald вне форума  
 
Непрочитано 13.01.2008, 08:27
#16
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Цитата:
Сообщение от Profan Посмотреть сообщение
А я нечаянно скачал порнофильм. И теперь тоже не знаю, что делать.
Удалить!
Jerald вне форума  
 
Непрочитано 13.01.2008, 08:34
#17
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


С помощью Лиспа можно удалить файл. А можно ли с помощью Лиспа закачать файл в раздел Downoload Форума dwg.ru?
Profan вне форума  
 
Непрочитано 13.01.2008, 13:32
#18
Кулик Алексей aka kpblc
Moderator

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


Теоретически можно. Как на практике - не знаю. Но то, что e-mail отправить с использованием Outlook'a можно - это точно. Разбор был то ли на augi.com, то ли на theswamp.org - не помню.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2008, 14:01
#19
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Profan Посмотреть сообщение
С помощью Лиспа можно удалить файл. А можно ли с помощью Лиспа закачать файл в раздел Downoload Форума dwg.ru?
Закачать не пробовал, но пробовал скачивать архив - можно!
Елпанов Евгений вне форума  
 
Непрочитано 22.05.2008, 10:48
#20
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Простите, за глуппый вопрос:
Но с какой именно книги начать изучения лиспа?
Конкретная задача тут:
http://dwg.ru/f/showthread.php?t=20756
andery вне форума  
 
Непрочитано 26.05.2008, 11:06
#21
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Может кому интересно, ИМХО для начинающих то что надо:
http://aco.ifmo.ru/~nadinet/html/lec...ect_lsp.html#5
andery вне форума  
 
Непрочитано 30.05.2008, 08:31
#22
Рyslan


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


Если вам не трудно, напишите программку на Лиспе, я буду использовать ее как пособие. Заранее благодарен. Я тут диаметр конкретный поставил, но вообще хочу чтобы программа создавала отвод любого диаметра. ну как по госту
Вложения
Тип файла: doc отвод.doc (19.5 Кб, 188 просмотров)
Рyslan вне форума  
 
Непрочитано 30.05.2008, 09:53
#23
Кулик Алексей aka kpblc
Moderator

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


Смесь жуткая...
Код:
[Выделить все]
(defun test
       (path-radius tube-radius / ent adoc *error* profile profile_ext path)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (setq profile (entmakex (list (cons 0 "CIRCLE")
                                         (cons 10 '(0. 0. 0.))
                                         (cons 40 tube-radius)
                                         (cons 210 '(-1.0 0.0 0.0))
                                         ) ;_ end of list
                                   ) ;_ end of entmakex
                 ) ;_ end of setq
           (setq path (entmakex (list (cons 0 "ARC")
                                      (cons 10 (list 0. path-radius 0.))
                                      (cons 40 path-radius)
                                      (cons 50 (* pi 1.5))
                                      (cons 51 0.)
                                      (cons 210 '(0. 0. 1.))
                                      ) ;_ end of list
                                ) ;_ end of entmakex
                 ) ;_ end of setq
           ) ;_ end of and
    (progn
      (setq path        (vlax-ename->vla-object path)
            profile_ext (car (vlax-safearray->list
                               (vlax-variant-value
                                 (vla-addregion
                                   (vla-objectidtoobject adoc (vla-get-ownerid path))
                                   (vlax-make-variant
                                     (vlax-safearray-fill
                                       (vlax-make-safearray
                                         vlax-vbobject
                                         '(0 . 0)
                                         ) ;_ end of vlax-make-safearray
                                       (list (vlax-ename->vla-object profile))
                                       ) ;_ end of vlax-safearray-fill
                                     ) ;_ end of vlax-make-variant
                                   ) ;_ end of vla-addregion
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                             ) ;_ end of car
            ) ;_ end of setq
      (entdel profile)
      (vla-addextrudedsolidalongpath
        (vla-objectidtoobject adoc (vla-get-ownerid path))
        profile_ext
        path
        ) ;_ end of vla-AddExtrudedSolidAlongPath
      (vla-erase path)
      (vla-erase profile_ext)
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 10:13
#24
Рyslan


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


каким именем запускается?
Рyslan вне форума  
 
Непрочитано 30.05.2008, 10:36
#25
Кулик Алексей aka kpblc
Moderator

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


(test радиус_закругления_пути радиус_трубы)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 10:44
#26
Рyslan


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


не работает. покороче можно название сделать?
Command: (test path-radius tube-radius)
bad DXF group: (40)
Рyslan вне форума  
 
Непрочитано 30.05.2008, 10:50
#27
Кулик Алексей aka kpblc
Moderator

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


А значения кто будет задавать, Пушкин?
Код:
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 10:53
#28
Рyslan


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


ааа, бл, вот я баран
Рyslan вне форума  
 
Непрочитано 30.05.2008, 10:58
#29
Рyslan


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


неправильно программа у тебя рисует. вот смотри -пишу (test 75 57) соответственно 75 радиус дуги, 57 диаметр трубы. программа рисует отвод диаметром 100мм.
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:09
#30
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan,
Команда OTVOD
Код:
[Выделить все]
;;;Рисование отвода диаметром 57мм
;;;
;;;
;;;1. View-->Front
;;;2. Circle (0,0) r=57/2
;;;3. View-->SE Isometric
;;;4. UCS--> Поворот вокруг оси Y
;;;5. Arc (Start, End, Radius) (0,0; 75,75) r=75
;;;6. Extrude (Path)
;;;7. View-->SE Isometric
(defun C:OTVOD (
		/ ;_после слэша / идут локальные переменные
		Rad   ;_в этой переменной храним радиус
		Circl ;_в этой переменной храним имя примитива круга
		Arc   ;_в этой переменной храним имя примитива дуги
		)
  (initget 7)
  (setq rad (getdist "\nРадиус трубы:"))
  (command "_.View" "_Front")            ;_1. View-->Front
  (command "_.Circle" "0,0" (* 0.5 Rad) );_2. Circle (0,0) r=57/2
  (setq Circl (entlast))                 ;_ Запоминаем круг в переменной Circl
  (command "_.View" "_SE")               ;_3. View-->SE Isometric
  (command "_.UCS" "_New" "_Y" 90)       ;_ 4. UCS--> Поворот вокруг оси Y
  (command "_.ARC" "0,0" "_E" '(75 75) "_R" 75) ;;;5. Arc (Start, End, Radius) (0,0; 75,75) r=75
  (setq Arc (entlast))                 ;_ Запоминаем дугу в переменной Arc
  (command "_.Extrude" Circl "" "_Path" Arc) ;_6. Extrude (Path)
  (command "_.View" "_SE")               ;_7. View-->SE Isometric
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 30.05.2008, 11:14
#31
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


А я думаю, откуда 75 берется?
Код:
[Выделить все]
;;;Рисование отвода диаметром 57мм
;;;
;;;
;;;1. View-->Front
;;;2. Circle (0,0) r=57/2
;;;3. View-->SE Isometric
;;;4. UCS--> Поворот вокруг оси Y
;;;5. Arc (Start, End, Radius) (0,0; 75,75) r=75
;;;6. Extrude (Path)
;;;7. View-->SE Isometric
(defun C:OTVOD (
		/ ;_после слэша / идут локальные переменные
		Rad   ;_в этой переменной храним радиус
		Circl ;_в этой переменной храним имя примитива круга
		Arc   ;_в этой переменной храним имя примитива дуги
		Rdug  ;_ радиус дуги
		)
  (initget 7)
  (setq rad (getdist "\nРадиус трубы:"))
  (initget 7)
  (setq Rdug (getdist "\nРадиус дуги:"))
  (command "_.View" "_Front")            ;_1. View-->Front
  (command "_.Circle" "0,0" (* 0.5 Rad) );_2. Circle (0,0) r=57/2
  (setq Circl (entlast))                 ;_ Запоминаем круг в переменной Circl
  (command "_.View" "_SE")               ;_3. View-->SE Isometric
  (command "_.UCS" "_New" "_Y" 90)       ;_ 4. UCS--> Поворот вокруг оси Y
  (command "_.ARC" "0,0" "_E" (list Rdug Rdug) "_R" Rdug) ;;;5. Arc (Start, End, Radius) (0,0; 75,75) r=75
  (setq Arc (entlast))                 ;_ Запоминаем дугу в переменной Arc
  (command "_.Extrude" Circl "" "_Path" Arc) ;_6. Extrude (Path)
  (command "_.View" "_SE")               ;_7. View-->SE Isometric
  (princ) ;_Чистый выход
  )
Мысли вслух
Цитата:
Если вам не трудно, напишите программку на Лиспе, я буду использовать ее как пособие
Это #30 или 31
Цитата:
Если вам не трудно, напишите программку на Visual Лиспе, я буду использовать ее как пособие
Это 23
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 30.05.2008, 11:17
#32
Рyslan


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


Работает!!! Спасибо VVA!!! буду смотреть, разбираться
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:17
#33
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
неправильно программа у тебя рисует. вот смотри -пишу (test 75 57) соответственно 75 радиус дуги, 57 диаметр трубы. программа рисует отвод диаметром 100мм.
Да ну?? Только что проверил, все нормально вроде бы. На чертеже число 100 не обнаружил вообще никоим образом.
Правда, после VVA на мое "творчество" лучше не смотреть )
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 11:18
#34
Рyslan


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


75 из ГОСТа, а что не так?
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:19
#35
Рyslan


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


Леша, я написал (test 75 57) -нарисовала отвод с диаметром 100мм, чо мне врать то, рядом мой отвод нарисован -разницу видно ж. да и мерял я диаметр
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:20
#36
Кулик Алексей aka kpblc
Moderator

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


Ну ты говоришь, что диаметр 100 рисуется. Я специально проверил - диаметр 114, как и должно быть при радиусе 57.

Цитата:
Сообщение от Рyslan Посмотреть сообщение
Леша, я написал (test 75 57) -нарисовала отвод с диаметром 100мм, чо мне врать то, рядом мой отвод нарисован -разницу видно ж. да и мерял я диаметр
Ну тогда не знаю... Если бы использовались только командные методы, я б мог еще кивнуть на Osmode, но у меня-то их нет вообще.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 11:22
#37
Рyslan


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


А то что я не подчеркнул на каком лиспе программка нужна, каюсь. Я имел ввиду AutoLisp. Я честно говоря уже запутался. Читаю САПР как это делается, там ваще ж-а AutoLisp, VisualLisp, VBA, ActiveX, ObjectARX.
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:25
#38
Рyslan


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


по ГОСТу при диаметре 57 - радиус дуги -75мм. а , да, 114 получается когда делаешь (тест 75 57), но зачем мне так, если мне нужна дуга 75 и диаметр отвода должен быть 57
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:26
#39
Рyslan


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


я ж вроде писал r=57/2
Рyslan вне форума  
 
Непрочитано 30.05.2008, 11:32
#40
Кулик Алексей aka kpblc
Moderator

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


Извини, запутался. Исправленный вариант (хотя кому он теперь будет нужен?)
Код:
[Выделить все]
(defun test
       (path-radius tube-radius / ent adoc *error* profile profile_ext path)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (setq profile (entmakex (list (cons 0 "CIRCLE")
                                         (cons 10 '(0. 0. 0.))
                                         (cons 40 (/ tube-radius 2.))
;| Здесь задается диаметр трубы. Можешь хоть на сколько делить ) |;
                                         (cons 210 '(-1.0 0.0 0.0))
                                         ) ;_ end of list
                                   ) ;_ end of entmakex
                 ) ;_ end of setq
           (setq path (entmakex (list (cons 0 "ARC")
                                      (cons 10 (list 0. path-radius 0.))
                                      (cons 40 path-radius)
                                      (cons 50 (* pi 1.5))
                                      (cons 51 0.)
                                      (cons 210 '(0. 0. 1.))
                                      ) ;_ end of list
                                ) ;_ end of entmakex
                 ) ;_ end of setq
           ) ;_ end of and
    (progn
      (setq path        (vlax-ename->vla-object path)
            profile_ext (car (vlax-safearray->list
                               (vlax-variant-value
                                 (vla-addregion
                                   (vla-objectidtoobject adoc (vla-get-ownerid path))
                                   (vlax-make-variant
                                     (vlax-safearray-fill
                                       (vlax-make-safearray
                                         vlax-vbobject
                                         '(0 . 0)
                                         ) ;_ end of vlax-make-safearray
                                       (list (vlax-ename->vla-object profile))
                                       ) ;_ end of vlax-safearray-fill
                                     ) ;_ end of vlax-make-variant
                                   ) ;_ end of vla-addregion
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                             ) ;_ end of car
            ) ;_ end of setq
      (entdel profile)
      (vla-addextrudedsolidalongpath
        (vla-objectidtoobject adoc (vla-get-ownerid path))
        profile_ext
        path
        ) ;_ end of vla-AddExtrudedSolidAlongPath
      (vla-erase path)
      (vla-erase profile_ext)
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 11:42
#41
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Читаю САПР как это делается, там ваще ж-а AutoLisp, VisualLisp, VBA, ActiveX, ObjectARX.
AutoLisp = LISP (на этом форуме). AutoLisp - диалект языка ЛИСП, есть еще Common Lisp и т.п.
Расширение языка AutoLISP, использующее объектную модель Автокада или любого другого com сервера - Visual LISP
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.06.2008 в 10:30. Причина: Орфография
VVA на форуме  
 
Непрочитано 30.05.2008, 15:07
#42
Рyslan


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


Мдя, два разных способа. Если методом Command еще что-то понятно, то VL методом ваще темный лес
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:18
#43
Кулик Алексей aka kpblc
Moderator

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


Я ж говорил, что смесь жуткая
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.05.2008, 15:28
#44
Рyslan


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


да уж, без поллитры не разберешься
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:36
#45
Рyslan


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


VVA, ты вот в лиспе сверху вставил мой алгоритм, а перед ними точки с запятыми аж три штуки. эти записи тоже участвуют в программе? вот тут есть пункт (initget7). Это ссылка на пункт 7?
Рyslan вне форума  
 
Непрочитано 30.05.2008, 15:40
#46
Кулик Алексей aka kpblc
Moderator

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


См. форматирование, комментарии и описание функции (initget)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2008, 15:53 to VVA
#47
Рyslan


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


Привет! Я тут сегодня практикуюсь вот написал прогу, но не работает она. Не посмотришь, что я не правильно сделал. Делал по аналогии твоей программы Отвод

;;;Рисование концентрического перехода по ГОСТ
;;;1. View-->Front
;;;2. Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close"
;;;3. Revolve
;;;4. View-->SW Isometric
;;;R- радиус большой
;;;r- радиус маленький
;;;L- длина перехода

(defun C:PEREKHOD (Рисование концентрического перехода по ГОСТ)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close") ; Рисуем профиль перехода
(Command "_.Revolve" "Objects" "Enter" "X" "Y" "Enter") ; Поворачиваем профиль вокруг выбранной оси
(Command "_.View" "_SW")
(princ) ; Выход
)
Рyslan вне форума  
 
Непрочитано 31.05.2008, 17:04
#48
Рyslan


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


только укажи на ошибку, попробую сам исправить
Рyslan вне форума  
 
Непрочитано 31.05.2008, 17:53
#49
Рyslan


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


Вот это по-моему правильно, тока все равно не работает

;;;Рисование концентрического перехода по ГОСТ
;;;1. View-->Front
;;;2. Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close"
;;;3. Revolve
;;;4. View-->SW Isometric
;;;R- радиус большой
;;;r- радиус маленький
;;;L- длина перехода

(defun C:PEREKHOD (/R,r,L,Pline); Рисование концентрического перехода по ГОСТ
(initget7)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(initget7)
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(initget7)
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close") ; Рисуем профиль перехода
(setq Pline (entlast))
(Command "_.Revolve" "Pline" "Enter" "X" "Y" "Enter") ; Поворачиваем профиль вокруг выбранной оси
(Command "_.View" "_SW")
(princ) ; Выход
)
Рyslan вне форума  
 
Непрочитано 01.06.2008, 19:17
#50
Рyslan


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


не смотрите, тут все неправильно. единственно сегодня что получилось, так это трапецию сделал по точкам (профиль перехода), только мне так не нравится, аж 5 точек вводить надо. будем думать дальше как ввести только 2 диаметра и длину перехода.
Рyslan вне форума  
 
Непрочитано 01.06.2008, 23:00
#51
Рyslan


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


Вот это работает, но вводить столько точек запаришься!
(defun C:Profile (/
pt1
pt2
pt3
pt4
pt5
)
(setq pt1 (getpoint "\nПервая точка:")) ; Задаем первую точку профиля
(setq pt2 (getpoint "\nВторая точка:")) ; Задаем вторую точку профиля
(setq pt3 (getpoint "\nТретья точка:")) ; Задаем третью точку профиля
(setq pt4 (getpoint "\nЧетвертая точка:")) ; Задаем четвертую точку профиля
(setq pt5 (getpoint "\nПятая точка:")) ; Задаем пятую точку профиля
(Command "_.Pline" pt1 pt2 pt3 pt4 pt5)
(Command "close")
(princ)
)

А вот эта не хочет никак работать!
(defun C:PEREKHOD (/
R
r
L
)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.Pline" '(0 0) '(0 D) '(L d) '(L 0) '(0 0))
(Command "close")
(princ)
)
Пишет неизвестная команда С
Рyslan вне форума  
 
Непрочитано 02.06.2008, 08:52
#52
Рyslan


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


Алексей, ты тут? Почему последнняя программка не работает? Что не правильно? Подскажи, пожалуйста
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:06
#53
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Pyslan, если хочешь научиться программировать, придется много работать самому. Иначе все время будешь спрашивать про "три точки с запятыми" и удивляться - "Вот это по-моему правильно, тока все равно не работает ". Это обычное дело, когда автор думает, что "все правильно".

Вот пишешь "Читаю САПР как это делается, там ваще ж-а AutoLisp, VisualLisp, VBA, ActiveX, ObjectARX". Это про книгу "САПР на базе AutoCAD - как это делается"?

Если это так, то хоть название пиши правильно - а не "и так сойдет". Иначе "и так сойдет" будет и в програмах. А тыкать носом в каждую мелочь желающих мало будет.

Но книгу надо прочитать, и прочитать внимательно. Тема-то ветки про практические руководства, а не про то, как переход нарисовать. Это твое частное дело.

Если уж начал с элементов трубопроводов, прочитай главу 29. Там как раз эти задачи описаны, а в примерах кода прямо решены.
Например, листинг 29.15 - рисование вообще любого 2D-элемента (прямой участок, переход и т.п.). А в листинге 29.17 - рисование как раз концентричного перехода в 2D. В результате в меню конкретный переход с заданными размерами записывается очень просто:

Код:
[Выделить все]
 
(ru-pipe-draw-any (quote ru-pipe-reducer-concentr) (list 100.0 200.0 95.0)"Начало перехода" "Направление потока")
И здесь нет никакого ввода 5 точек, будет запрошено только начало и направление движения среды. Причем, при указании начала можно опционально привязаться к уже нарисованному элементу, не прицеливаясь. Да и ввод этих точек сделан надежно, а не просто через getpoint. Getpoint легко прервать нештатно и далее вся программа посыпется.

Можешь обернуть это в программу (команду), назвав ее, например

Код:
[Выделить все]
(defun C:ПЕРЕХОД_КОНЦЕНТР_100х200 ()
(ru-pipe-draw-any (quote ru-pipe-reducer-concentr) (list 100.0 200.0 95.0)"Начало перехода" "Направление потока") 
)
Только замучаешься таким программам имена давать - типоразмеров-то тьма. Поэтому в книге показано, как сделать, чтобы эти команды
просто отображались в иллюстрированном меню. В книге полно иллюстраций, в частности, рис. 29.13.

За 3D сразу лучше не браться. Научись сначала самое простое делать. Попытка просто сделать revolve наивна. Да и элементарной техники пока у тебя нет, даже в написании команд - отсюда и вопросы.

Читай упомянутую книгу - там все расписано. Особенно главу 10 - там самые основы.

Следуя принципам, изложенным в книге, можно и к 3D перейти. Сформировав библиотеку функций, в которым самым основным является ввод точек в пространстве и вычисление координат в пространстве, можно и 3D-переходы (и всё прочее) делать.

Концентрический 3D-переход на уровне меню может быть описан так:

Код:
[Выделить все]
 
(ru-3d-pipe-draw-any (quote ru-3d-pipe-reducer-concentr) (list 108.0 89.0 80.0 4.0) "Начало перехода" "Направление потока" 80.0)
Такой подход позволяет избежать нудного программирования однотипных изделий. Меню может редактировать "негр", и если ему понадобится
несуществующий переход 3000х50 длиной 6м, он может вписать

Код:
[Выделить все]
(ru-3d-pipe-draw-any (quote ru-3d-pipe-reducer-concentr) (list 3000.0 50.0 6000.0 4.0) "Начало перехода" "Направление потока" 6000.0)
и это тоже будет работать. А можно переход, манипулируя размерами, превратить во что-то иное, например в зонт.

От примера для 2D он отличается используемыми функциями. Например, ru-3d-pipe-draw-any делает твердотельную модель любого "трубоподобного" элемента, а ru-3d-pipe-reducer-concentr - конкретно перехода. Могу её и привести:

Код:
[Выделить все]
 
(defun ru-3d-pipe-reducer-concentr (start_pnt pnt_orient param_lst)
  (ru-3d-pipe-reducer-conc-draw
    start_pnt
    pnt_orient
    (list (nth 0 param_lst)
          (nth 1 param_lst)
          (nth 2 param_lst)
          (* 0.1 (nth 2 param_lst))
          (nth 3 param_lst)
    ) ;_ end of list
  ) ;_ end of ru-3d-pipe-reducer-conc-draw
  
) ;_ end of defun
(defun ru-3d-pipe-reducer-conc-draw (start_pnt   pnt_orient
                                     param_lst   /
                                     ang_draw    d_end
                                     d_start     ent_last
                                     l           l1
                                     old_layer   pnt1
                                     pnt11       pnt2
                                     pnt21       pnt3
                                     pnt31       pnt4
                                     pnt41       pnt_end
                                     pnt_end_reducer
                                     pnt_start_reducer
                                     region      s
                                     ss          vla-array solid
                                    )
  (setq
    d_start (ru-conv-millimeter-to-unit (nth 0 param_lst))
    ;; диаметр входа
    d_end   (ru-conv-millimeter-to-unit (nth 1 param_lst))
    ;; диаметр выхода
    l       (ru-conv-millimeter-to-unit (nth 2 param_lst))
    ;; длина общая
    l1      (ru-conv-millimeter-to-unit (nth 3 param_lst))
    ;; длина прямого участка
    s       (ru-conv-millimeter-to-unit (nth 4 param_lst))
            ;;ТОлщина стенки
  ) ;_ end of setq
  (setq d_start           (* d_start 0.5)
        d_end             (* d_end 0.5)
        pnt_start_reducer (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            l1
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
        ;; начало перехода - конец прямого
        pnt_end_reducer   (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            (- l l1 l1)
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
        pnt_end           (ru-3d-point-by-2-points-and-dist
                            start_pnt
                            pnt_orient
                            l
                          )   ; _ end of
                              ; ru-3d-point-by-2-points-and-dist
                          ;;конец патрубка фланца
  ) ;_ end of setq
  (setq old_layer (getvar "CLAYER"))
  (ru-layer-current (ru-3d-axes-layer-name old_layer))
  (ru-line-add start_pnt pnt_end 0 (ru-ltype-axes))
  (ru-layer-current old_layer)
  (setq
    ent_last (entlast)
    ang_draw (ru-geom-go-right (angle start_pnt pnt_orient))
    pnt1     (polar
               start_pnt
               ang_draw
               d_start
             ) ;_ end of polar
    pnt11    (polar
               start_pnt
               ang_draw
               (- d_start s)
             ) ;_ end of polar
    pnt2     (polar
               pnt_start_reducer
               ang_draw
               d_start
             ) ;_ end of polar
    pnt21    (polar
               pnt_start_reducer
               ang_draw
               (- d_start s)
             ) ;_ end of polar
    pnt3     (polar
               pnt_end_reducer
               ang_draw
               d_end
             ) ;_ end of polar
    pnt31    (polar
               pnt_end_reducer
               ang_draw
               (- d_end s)
             ) ;_ end of polar
    pnt4     (polar
               pnt_end
               ang_draw
               d_end
             ) ;_ end of polar
    pnt41    (polar
               pnt_end
               ang_draw
               (- d_end s)
             ) ;_ end of polar
  ) ;_ end of setq
  ;; Вернет точку, надо получить массив объектов
  (ru-line-add-multi
    (list pnt1 pnt2 pnt3 pnt4 pnt41 pnt31 pnt21 pnt11) ;_ end of list
    t
    (ru-lw-current)
    nil
  ) ;_ end of ru-line-add-multi
  (setq
    ss        (ru-ss-select-after-ent ent_last)
    vla-array (ru-ss-to-vla-array ss)
  ) ;_ end of setq
  (ru-3d-set-last start_pnt pnt_end)
  (if vla-array
    (progn
      (setq region (ru-obj-make-region-from-vla-array vla-array))
      (setq solid (vla-addrevolvedsolid
        (ru-obj-active-space)
        region
        (vlax-3d-point start_pnt)
        (vlax-3d-point
          (ru-3d-vector-by-2-points
            start_pnt
            pnt_orient
          ) ;_ end of ru-3d-vector-by-2-points
        ) ;_ end of vlax-3d-point
        (* pi 2.0)
      ) ;_ end of vla-AddRevolvedSolid
      )      
      (ru-obj-ent-ss-erase region)
      (ru-obj-ent-ss-erase ss)
    ) ;_ end of progn
  ) ;_ end of if
solid
) ;_ end of defun
Получится показанное на прилагаемом рисунке.
Это именно для примера, чтобы показать "как это делается". Внутри используется множество дополнительных библиотечных функций. Как их делать и зачем нужны - тоже в упомянутой книге.

Так как тема всё-таки про литературу, рекомендую обзавестись и книгой "AutoLISP и Visual LISP в среде AutoCAD" Петра Лоскутова и Николая Полещука. Это лучшее в настоящее время справочное пособие.
Миниатюры
Нажмите на изображение для увеличения
Название: 3d_perx_ks.jpg
Просмотров: 178
Размер:	3.0 Кб
ID:	7043  
ShaggyDoc вне форума  
 
Непрочитано 02.06.2008, 09:24
#54
Рyslan


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


спасибо конечно, за науку. я и не собираюсь дергать народ все время, только я про свой "шедевр" спрашивал (последний). А книга у меня есть. Вот скажи мне, зачем ты мне свой код написал? Я хочу чтобы прога вырисовывала переход как я его рисую. То есть профиль, потом повернуть и создать тело и все. Задавать всего три размера, 2 диаметра и длину. Вот ты говоришь что надо с простого начинать с 2D, а я что делаю!? Профиль перехода то двухмерный, это ж прост четырехугольник.
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:27
#55
Кулик Алексей aka kpblc
Moderator

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


Рyslan, найди отличия
Код:
[Выделить все]
(defun c:perekhod2 (/ r r l *error* _osmode)
  (defun *error* (msg)
    (if _osmode
      (setvar "osmode" _osmode)
      ) ;_ end of if
    (princ msg)
    (princ)
    ) ;_ end of defun

  (if (and (setq r (getdist "\nРадиус большой:"))
          ; Задаем большой радиус перехода
           (setq r (getdist "\nРадиус маленький:"))
          ; Задаем маленький радиус перехода
           (setq l (getdist "\nДлина перехода:")) ; Задаем длину перехода
           ) ;_ end of and
    (progn
      (setq _osmode (getvar "osmode"))
      (setvar "osmode" 0)
      (command "_.Pline"
               '(0. 0.)
               (list 0. d)
               (list l d)
               (list l 0.)
               '(0. 0.)
               "_close"
               ) ;_ end of command
      (setvar "osmode" _osmode)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 09:42
#56
Рyslan


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


Ладно, все ясно с вами, буду сам ипаться дальше
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:47
#57
Рyslan


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


кстати твоя прога вот что пишет- Really want to discard all changes to drawing? <N> после того как введешь размеры
Рyslan вне форума  
 
Непрочитано 02.06.2008, 09:56
#58
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
кстати твоя прога вот что пишет- Really want to discard all changes to drawing? <N> после того как введешь размеры
Попробуй заменить "_close" на "_c".
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 10:08
#59
Рyslan


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


теперь пишет неизвестная команда С. вот такая же фигня у меня вчера была, про что я писал. не хочет он замыкать полилинию командой close, и так писал "_C" тоже
Рyslan вне форума  
 
Непрочитано 02.06.2008, 10:10
#60
Рyslan


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


в посте 51 я об этом написал
Рyslan вне форума  
 
Непрочитано 02.06.2008, 10:13
#61
Кулик Алексей aka kpblc
Moderator

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


Ну я что, обманывать буду? Ты на какой раскладке _c вводил, не на русской ли случайно? Только что специально прогнал - код работает:
Код:
[Выделить все]
(defun c:perekhod3 (/ r r l *error* _osmode)
  (defun *error* (msg)
    (if _osmode
      (setvar "osmode" _osmode)
      ) ;_ end of if
    (princ msg)
    (princ)
    ) ;_ end of defun

  (if (and (setq r (getdist "\nРадиус большой:"))
          ; Задаем большой радиус перехода
           (setq r (getdist "\nРадиус маленький:"))
          ; Задаем маленький радиус перехода
           (setq l (getdist "\nДлина перехода:")) ; Задаем длину перехода
           ) ;_ end of and
    (progn
      (setq _osmode (getvar "osmode"))
      (setvar "osmode" 0)
      (command "_.Pline"
               '(0. 0.)
               (list 0. d)
               (list l d)
               (list l 0.)
               '(0. 0.)
               "_c"
               ) ;_ end of command
      (setvar "osmode" _osmode)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 10:58
#62
Рyslan


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


Я не вводил С вначале, просто стер из close lose. Щас ввел заново С на инглише. Такая же фигня. Не знаю почему так, еще раз повоторюсь что вчера дома у меня тож не работала close
Рyslan вне форума  
 
Непрочитано 02.06.2008, 10:59
#63
Кулик Алексей aka kpblc
Moderator

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


Тогда создавай полилинию через dxf Там подобных проблем обычно не бывает.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 11:00
#64
Рyslan


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


)))) и твой переход3 тоже не работает, тоже самое пишет- неизвестная команда С
Рyslan вне форума  
 
Непрочитано 02.06.2008, 11:02
#65
Рyslan


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


объяснить можешь почему так получается? через dxf? ты что! я ж тока учусь
Рyslan вне форума  
 
Непрочитано 02.06.2008, 11:09
#66
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


В программе perekhod3 (сообщение 61) переменная d не определена.
Profan вне форума  
 
Непрочитано 02.06.2008, 11:11
#67
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Profan Посмотреть сообщение
В программе perekhod3 (сообщение 61) переменная d не определена.
Точно! Блин, надо же было так облажаться...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 11:17
#68
Рyslan


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


да ладна бывает. у меня вон все не работает
Рyslan вне форума  
 
Непрочитано 02.06.2008, 13:32
#69
Рyslan


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


Алексей, так почему автокад не воспринимает "C"? не разобрался?
Рyslan вне форума  
 
Непрочитано 02.06.2008, 14:02
#70
Кулик Алексей aka kpblc
Moderator

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


Не-а, не до того. У меня в ADT до дури муторной работы, горит.
По-быстрому, создание примитива через DXF:
Код:
[Выделить все]
(defun c:go-throught (/ pt max_rad min_rad)
  (if (and (setq pt (cond
                      ((getpoint "\nНижняя левая точка отвода <(0. 0. 0.)> : "))
                      (t '(0. 0. 0.))
                      ) ;_ end of cond
                 ) ;_ end of setq
           (setq max_rad (getdist pt "\nБольшой радиус <Отмена> : "))
           (setq min_rad (getdist pt "\nМалый радиус <Отмена> : "))
           (setq len (getdist pt "\nДлина <Отмена> : "))
           ) ;_ end of and
    (entmakex ; напрямую создаем примитив
          ; подсовываем список, описывающий полилинию:
      (append ; соединяем списки
          ;Список общих данных
        '((0 . "LWPOLYLINE") ; Тип примитива
          (100 . "AcDbEntity") ; Указывать для полилинии обязательно
          (100 . "AcDbPolyline") ; То же
          (90 . 4) ; Количество вершин
          (70 . 1) ; Признак замкнутости. 0 - незамкнута; 1 - замкнута
          (43 . 0.) ; Постоянная ширина полилинии
          (38 . 0.) ; Elevation полилинии
          (39 . 0.) ; Thickness
          )
          ; Список вершин
        (mapcar
          '(lambda (x)
             (cons 10 x)
             ) ;_ end of lambda
          ;; Теперь вычисляем вершины для того, чтобы получилось нечто типа
          ;|
   ---
  /   \
  -----
|;
          (list pt ; первая вершина, левая нижняя
                (list (+ (car pt) max_rad) (cadr pt))
          ; вторая вершина, смещена по Ох влево на max_rad
                (list (+ (car pt) (/ (+ max_rad min_rad) 2.)) (+ (cadr pt) len))
          ; Третья вершина, смещена от начала по Оy на len, влево на сумму половин радиусов
                (list (+ (car pt) (/ (- max_rad min_rad) 2.)) (+ (cadr pt) len))
          ; Четвертая вершина, смещена от начала по Oy на len, влево на разницу половин радиусов
                ) ;_ end of list
          ) ;_ end of mapcar
        ) ;_ end of append
      ) ;_ end of entmakex
    ) ;_ end of if
  ) ;_ end of defun
Вроде как комментарии нарисовал.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 14:15
#71
Скулачёв А.

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
Вот это по-моему правильно, тока все равно не работает

;;;Рисование концентрического перехода по ГОСТ
;;;1. View-->Front
;;;2. Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close"
;;;3. Revolve
;;;4. View-->SW Isometric
;;;R- радиус большой
;;;r- радиус маленький
;;;L- длина перехода

(defun C:PEREKHOD (/R,r,L,Pline); Рисование концентрического перехода по ГОСТ
(initget7)
(setq R (getdist "\nРадиус большой:")) ; Задаем большой радиус перехода
(initget7)
(setq r (getdist "\nРадиус маленький:")) ; Задаем маленький радиус перехода
(initget7)
(setq L (getdist "\nДлина перехода:")) ; Задаем длину перехода
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" "0,R" "L,r" "L,0" "0,0" "_close") ; Рисуем профиль перехода
(setq Pline (entlast))
(Command "_.Revolve" "Pline" "Enter" "X" "Y" "Enter") ; Поворачиваем профиль вокруг выбранной оси
(Command "_.View" "_SW")
(princ) ; Выход
)
Код:
[Выделить все]
(defun C:q()
(initget 7)
(setq R1 (getdist "\nРадиус большой:"))
(setq r2 (getdist "\nРадиус маленький:"))
(setq L (getdist "\nДлина перехода:"))
(command "_.View" "_Front")
(command "_.Pline" (list 0 0) (list 0 R1) (list L r2) (list L 0) "c")
(setq Pline (entlast))
(command "_.Revolve" Pline "" "X" "")
(command "_.View" "_swiso")
(princ)
)
Я твой код немного сократил. У меня работает как часы, если выключить привязки. Я программирую 4 день после окончания курсов при МГТУ им. Баумана. Тебе тоже советую их окончить. Мне там за 4 дня дали столько информации, думаю самостоятельно год бы потратил на изучение.
__________________
Продумано до мелочей
Скулачёв А. вне форума  
 
Непрочитано 02.06.2008, 14:24
#72
Рyslan


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


Во! Работает, спасибо!!! До курсов в Бауманке мне не доехать, далековато. Конечно ты прав, когда тебе показывают, быстрее получается учиться.
Рyslan вне форума  
 
Непрочитано 02.06.2008, 14:29
#73
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,276
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Скулачёв А. Посмотреть сообщение
Я программирую 4 день после окончания курсов при МГТУ им. Баумана. Тебе тоже советую их окончить. Мне там за 4 дня дали столько информации, думаю самостоятельно год бы потратил на изучение.
А на курсах не говорили, что и для опций команд тоже следует использовать подчеркивание "_"? Кому незачет?
Александр Ривилис вне форума  
 
Непрочитано 02.06.2008, 14:35
#74
Скулачёв А.

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А на курсах не говорили, что и для опций команд тоже следует использовать подчеркивание "_"? Кому незачет?
Я знаю, что подчёркивание актуально только в локолизованом AutoCad, а у меня родной, и всем советую пользоваться родным, гемора меньше будет.
__________________
Продумано до мелочей
Скулачёв А. вне форума  
 
Непрочитано 02.06.2008, 14:38
#75
Рyslan


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


локализованный ето как? на англ. языке? у меня на инглише
Рyslan вне форума  
 
Непрочитано 02.06.2008, 14:41
#76
Скулачёв А.

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
локализованный ето как? на англ. языке? у меня на инглише
Локализваный - любой кроме инглиша (казахский, русский, украинский). Если кад не локализован, смело убирай все подчёркивания.
__________________
Продумано до мелочей
Скулачёв А. вне форума  
 
Непрочитано 02.06.2008, 14:45
#77
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,276
Отправить сообщение для Александр Ривилис с помощью Skype™


> Скулачёв А.
Ну раз сказал "А" (т.е. используешь подчеркивание в именах команд), то нужно говорить и "Б" (т.е. использовать и в именах опций, функциях initget, ssget и т.д.)
И кроме того на нелокализованном AutoCAD твоя программа просто не будет работать, т.е. она очень не универсальна. А это плохой стиль программирования.
Александр Ривилис вне форума  
 
Непрочитано 02.06.2008, 14:46
#78
Рyslan


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


ааа, ну значит у меня не локализованный.
Рyslan вне форума  
 
Непрочитано 02.06.2008, 14:48
#79
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Цитата:
Сообщение от Скулачёв А. Посмотреть сообщение
Я знаю, что подчёркивание актуально только в локолизованом AutoCad, а у меня родной, и всем советую пользоваться родным, гемора меньше будет.
Посоветуй еще заодно и английский язык выучить.
Profan вне форума  
 
Непрочитано 02.06.2008, 14:53
#80
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Скулачёв А. Посмотреть сообщение
Я знаю, что подчёркивание актуально только в локолизованом AutoCad, а у меня родной, и всем советую пользоваться родным, гемора меньше будет.
Ага, объясни это пяти десяткам коллег околопенсионного возраста.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2008, 14:57
#81
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,276
Отправить сообщение для Александр Ривилис с помощью Skype™


P.S.: Кстати ни казахской, ни украинской локализации не существует в природе. И слава Богу!
Александр Ривилис вне форума  
 
Непрочитано 02.06.2008, 15:05
#82
Рyslan


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


сплюнь, щас еще придумают. я язык не знаю совсем (казахский)
Рyslan вне форума  
 
Непрочитано 03.06.2008, 10:40
#83
Рyslan


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


Гуру, зацените, у меня получилось! Программка рисует тройники! Ураа!
(defun C:TROYNIK()
(initget 7)
(setq R1 (getdist "\nБольшой радиус:"))
(setq r2 (getdist "\nМалый радиус:"))
(setq L (getdist "\nДлина тройника:"))
(setq H (getdist "\nВысота тройника:"))
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" (list 0 R1) (list (* 2 L) R1) (list (* 2 L) 0) "C")
(setq Pline (entlast))
(Command "_.Revolve" Pline "" "X" "")
(command "_.UCS" "_New" (list L 0))
(Command "_.Pline" "0,0" (list 0 H) (list r2 H) (list r2 0) "C")
(setq Pline (entlast))
(Command "_.Revolve" Pline "" "Y" "")
(Command "_.Union" "ALL" "")
(command "_.UCS" "_World")
(Command "_.View" "_SWISO")
(princ)
)

Нормально, как считаете?
Рyslan вне форума  
 
Непрочитано 03.06.2008, 10:47
#84
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


В русской версии не работает.
Profan вне форума  
 
Непрочитано 03.06.2008, 10:53
#85
Рyslan


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


да? я о ней не подумал Сейчас подредактирую, у меня есть Автокад архитектура русский, там проверю
Рyslan вне форума  
 
Непрочитано 03.06.2008, 10:57
#86
Рyslan


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


странно, что-то я в архитектуре не вижу где загружаются лиспы
Рyslan вне форума  
 
Непрочитано 03.06.2008, 10:58
#87
Кулик Алексей aka kpblc
Moderator

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


Туда же: а что с привязками?
P.S. Загружаются точно так же, как и в обычный AutoCAD
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.06.2008, 11:01
#88
Рyslan


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


Вот, проверил, у меня работала
(defun C:TROYNIK()
(initget 7)
(setq R1 (getdist "\nБольшой радиус:"))
(setq r2 (getdist "\nМалый радиус:"))
(setq L (getdist "\nДлина тройника:"))
(setq H (getdist "\nВысота тройника:"))
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" (list 0 R1) (list (* 2 L) R1) (list (* 2 L) 0) "_C")
(setq Pline (entlast))
(Command "_.Revolve" Pline "" "X" "")
(command "_.UCS" "_New" (list L 0))
(Command "_.Pline" "0,0" (list 0 H) (list r2 H) (list r2 0) "_C")
(setq Pline (entlast))
(Command "_.Revolve" Pline "" "Y" "")
(Command "_.Union" "_ALL" "")
(command "_.UCS" "_World")
(Command "_.View" "_SWISO")
(princ)
)
Рyslan вне форума  
 
Непрочитано 03.06.2008, 11:02
#89
Рyslan


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


Да, привязки не работают. Не знаю почему. потом включаю вручную
Рyslan вне форума  
 
Непрочитано 03.06.2008, 11:06
#90
Рyslan


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


кстати, у меня они тоже сначала не работали. потом я включил все привязки, загрузил лисп, модель построилась и привязки тоже работали
Рyslan вне форума  
 
Непрочитано 03.06.2008, 11:07
#91
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Пару замечаний:
1. В command используй и команды и их опции на английском языке с префиксом _ (почитай начало http://dwg.ru/art/11)
Код:
[Выделить все]
(Command "_.Pline" "0,0" (list 0 R1) (list (* 2 L) R1) (list (* 2 L) 0) "_C")
2. Рано или поздно наступишь на грабли №1. При использовании командных способов создания примитивов при указании точек на отключаешь привязку (переменная OSMODE)
Возможны два варианта
2.1 Сброс и восстановление OSMODE
Код:
[Выделить все]
(defun C:TROYNIK()
(initget 7)
(setq R1 (getdist "\nБольшой радиус:"))
(setq r2 (getdist "\nМалый радиус:"))
(setq L (getdist "\nДлина тройника:"))
(setq H (getdist "\nВысота тройника:"))
(setq osm (getvar "OSMODE")) ;_запоминаем привязку
(setvar "OSMODE" 0)          ;_Обнуляем
;;; ...  
;;; ... Что-то чертим
;;; ...
(setvar "OSMODE" osm)          ;_Восстанавливаем
(princ)
)
2.2 Использовать при указании КАЖДОЙ точки временную привязку "_non"
Код:
[Выделить все]
(Command "_.Pline" "_none" "0,0" "_none" (list 0 R1) "_none" (list (* 2 L) R1) "_none" (list (* 2 L) 0) "_C")
По п. 2.1. можно не сбрасывать объектную привязку, а отключать ее

Библиотечные функции
Код:
[Выделить все]
;;;================================================================================
;;;Функция отключения режима объектной привязки
(defun disable_osmode ()
  ;;Alaspher
  ;;(setvar "osmode" (logior oldosm 16384))
  (if (and (< (getvar "OSMODE") 16000)
	   (/= (getvar "OSMODE") 0)
	   )
	  (setvar "OSMODE" (+ (getvar "OSMODE") 16384))
	))
;;;================================================================================
;;;Функция включения режима объектной привязки
(defun enable_osmode ()
  (if (> (getvar "OSMODE") 16000)
    (setvar "OSMODE" (- (getvar "OSMODE") 16384))
  ) ;_if
) ;_ End of defun
Сама команда
Код:
[Выделить все]
(defun C:TROYNIK()
(initget 7)
(setq R1 (getdist "\nБольшой радиус:"))
(setq r2 (getdist "\nМалый радиус:"))
(setq L (getdist "\nДлина тройника:"))
(setq H (getdist "\nВысота тройника:"))
(disable_osmode) ;_Отключаем
  ;; Что-то делаем
  (enable_osmode) ;_ Включаем
(princ)
)
3. Сразу учись не засорять Автокад. Делай переменные локальными.
Код:
[Выделить все]
(defun C:TROYNIK( / r1 r2 L H Pline)
PS Долго писал. Надеюсь не напрасно
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 03.06.2008, 11:12
#92
Рyslan


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


Спасибо VVA, Profan и Алексей! Учту на будущее
Рyslan вне форума  
 
Непрочитано 21.06.2008, 20:07
#93
Рyslan


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


Написал еще одну програмку, таким же методом как и предыдущие были, то есть ввод данных и дальше с помощью command какое-либо действие. Хотел спросить, как вы отладку программы делаете? Я через appload, постоянно свой лисп в акад гружу и смотрю что пишет. Еще вопрос, как вы считаете, командой command можно любую программку сделать? Или только такие простенькие как рисование перехода, отвода, тройника
Рyslan вне форума  
 
Непрочитано 23.06.2008, 01:04
#94
Кулик Алексей aka kpblc
Moderator

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


Честно скажу, (command) стараюсь не пользоваться чуть ли не по (уже) религиозным причинам. А так - в ком.строку, vlide, там открыть файл, установки точку останова ([F9]), и запускать А там пошаговое выполнение ([F8]) недалеко
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 06:19
#95
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от Рyslan Посмотреть сообщение
Написал еще одну програмку, таким же методом как и предыдущие были, то есть ввод данных и дальше с помощью command какое-либо действие. Хотел спросить, как вы отладку программы делаете? Я через appload, постоянно свой лисп в акад гружу и смотрю что пишет. Еще вопрос, как вы считаете, командой command можно любую программку сделать? Или только такие простенькие как рисование перехода, отвода, тройника
С помощью command любую программу сделать нельзя ("программку" можно). Рано или поздно столкнетесь с тем, на что никакой команды нет. Но программировать вполне возможно - может и на всю жизнь хватит. Только с умом, учитывая особенности command (правильное имя команд и опций,все точки в ПСК, влияние привязок и прочее).

По поводу отладки.

Файл программы, во время разработки, должен всегда быть в редакторе Visual LISP. Никакой appload к нему не надо. Там есть значок - загрузить файл в Автокад. Щелкаете, и текущая версия доступна. Можно загружать и отдельно выделенный блок - это чтобы проверить части программы. Здесь надо фантазировать - например, можно где-то в комментариях написать присваивание значений переменным, являющихся аргументами функции, а потом выполнять кусочки кода, отправляя из в Автокад. Результаты также выводятся в окно.

И, разумеется, то, про что Алексей написал - штатные средства отладки. Их надо только изучить.
ShaggyDoc вне форума  
 
Непрочитано 23.06.2008, 08:11
#96
Рyslan


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


Спасибо! Vlsual Lisp Editor я использую, правда редко еще. Менюшку еще не изучил, а так обычно вставляю туда лисп и кнопкой Check window проверяю. Ну а если лисп можно а акад прямо оттуда грузить то вообще красота, а то я запарился каждый раз его в автокад подругажть через аплоад.
Рyslan вне форума  
 
Непрочитано 23.06.2008, 08:20
#97
Кулик Алексей aka kpblc
Moderator

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


Тебе видео снять, как я "программирую" (если это можно программированием назвать) ?
Написание, отладка, пошаговое выполнение... Только задачку поставь
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 08:46
#98
Рyslan


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


я ж от этого не начну сразу программировать. Да я так, чисто от делать нечего, все равно не стану великим программистом Задачку говоришь, задачку можно. после обеда свой лисп принесу, постараюсь не забыть
Рyslan вне форума  
 
Непрочитано 23.06.2008, 10:57
#99
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
Код:
[Выделить все]
(defun C:TROYNIK()
(initget 7)
(setq R1 (getdist "\nБольшой радиус:"))
(setq r2 (getdist "\nМалый радиус:"))
(setq L (getdist "\nДлина тройника:"))
(setq H (getdist "\nВысота тройника:"))
(disable_osmode) ;_Отключаем
  ;; Что-то делаем
  (enable_osmode) ;_ Включаем
(princ)
)
Покритикую немного.

В предложенном варианте, перед началом выполнения действий, привязка выключается, а по окончании работы программы принудительно включается, что не есть хорошо. Правильно восстанавливать состояние среды на выходе таким, какое оно было до работы программы. Потому, если вообще отключать, всёж рекомендую связку:
Код:
[Выделить все]
(setq osm (getvar "OSMODE"))
(setvar "osmode" (logior osm 16384))
;;; ...  
;;; ... Что-то чертим
;;; ...
(setvar "OSMODE" osm)
Использование конструкции (logior osm 16384) позволяет не сильно переживать о восстановлении при завершении с ошибкой - пользователю достаточно нажать F3, что приемлемое неудобство.
Alaspher вне форума  
 
Непрочитано 23.06.2008, 11:11
#100
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
[/code]

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

Библиотечные функции
Код:
[Выделить все]
;;;================================================================================
;;;Функция отключения режима объектной привязки
(defun disable_osmode ()
  ;;Alaspher
  ;;(setvar "osmode" (logior oldosm 16384))
  (if (and (< (getvar "OSMODE") 16000)
       (/= (getvar "OSMODE") 0)
       )
      (setvar "OSMODE" (+ (getvar "OSMODE") 16384))
    ))
;;;================================================================================
;;;Функция включения режима объектной привязки
(defun enable_osmode ()
  (if (> (getvar "OSMODE") 16000)
    (setvar "OSMODE" (- (getvar "OSMODE") 16384))
  ) ;_if
) ;_ End of defun
Ещё немного критики.

Если делать отдельные переключалки, то конструкции:
Код:
[Выделить все]
(defun disable_osmode ()
 (setvar "osmode" (logior (getvar "osmode") 16384))
)
(defun enable_osmode ()
 (setvar "osmode" (boole 2 (getvar "osmode") 16384))
)
выглядят проще, а делают тоже самое. Или я упустил какие-то подводные камни?
Alaspher вне форума  
 
Непрочитано 23.06.2008, 12:47
#101
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Alaspher, Наверное все правильно. Я просто ими уже со времен 14 или 2000 Автокада не пользуюсь Это я достал из пыльного мешка для начинающих как один из вариантов решения.
Почему я оставил твой вариант закоментированным уже не помню. Наверное потому что сейчас делаю по другому.
Цитата:
выглядят проще, а делают тоже самое
Я всегда учился красивой оптимизации кода у тебя и у Эдуарда. Главное выглядит ли это проще для Руслана
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 23.06.2008 в 15:14. Причина: Орфография
VVA на форуме  
 
Непрочитано 23.06.2008, 14:21
#102
Рyslan


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


Леша, вот задача

(defun C:VALVE (/ D1 L D2 H1 D3 D4 Pline)
(initget 7)
(setq D1 (getdist "\Диаметр задвижки:"))
(setq L (getdist "\Длина задвижки:"))
(setq D2 (getdist "\Диаметр шпинделя:"))
(setq H1 (getdist "\Высота шпинделя:"))
(setq D3 (getdist "\Диаметр маховика:"))
(setq D4 (getdist "\Диаметр поперечного сечения маховика:"))
(Command "_.View" "_Front")
(Command "_.Pline" "0,0" (list 0 (* 0.5 D1)) (list (* 0.5 L) (* 0.25 D1)) (list L (* 0.5 D1)) (list L 0) "_C")
(setq Pline (entlast))
(Command "_.Revolve" Pline "" "X" "")
(command "_.UCS" "_New" (list (* 0.5 L) 0))
(command "_.UCS" "_X" -90)
(command "_.Cylinder" "0,0" (* 0.5 D2) H1)
(command "_.UCS" "_New" (list 0 0 H1))
(command "_.Torus" "0,0" (* 0.5 D3) D4)
(Command "_.Union" "_ALL" "")
(command "_.UCS" "_World")
(Command "_.View" "_SWISO")
(princ)
)

Здесь слишком много задавать размеров для задвижки. А можно сформировать таблицу значений, чтобы чтобы не вводить кучу значений а ввести одно, обозначение изделия. Допустим ЗКЛ2-50-16 (обозначение изделия) или обозначение типа, 30с41нж. И еще лучше чтобы по двум этим значениям. Ну как задачка?
Рyslan вне форума  
 
Непрочитано 23.06.2008, 14:24
#103
Кулик Алексей aka kpblc
Moderator

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


Перед тем, как кидаться "в бой", позволю себе немного побурчать
Есть неписаное правило - если запросов больше чем 2, крайне желательно делать диалог. Соответственно получается dcl. Вдобавок dcl с заполняемыми списками (перечислениями). Да вдобавок еще и согласованными - сильно подозреваю, что назначать числа "от балды" недопустимо. Через полчаса-час попробую сесть
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 14:28
#104
Рyslan


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


тебе материалы дать? Благовещенский каталог например? Про dcl еще не читал, пока выше command не прыгал
Рyslan вне форума  
 
Непрочитано 23.06.2008, 14:49
#105
Кулик Алексей aka kpblc
Moderator

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


Не, мне и без каталогов будет некисло Погоди, я свой код слегка добью до ума, за твою задачу возьмусь
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 14:53
#106
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


И вообще, если уж про задвижку, так не надо у нее ничего запрашивать. Есть изделие определенного Ду, Ру. У них всегда постоянная и известные размеры. Ну, может быть диаметр маховика чуть разный. Значит надо не размеры запрашивать, а выбирать изделие в целом.

А так как задвижка моделируется, то гораздо важнее ее положение в пространстве, например запросом точки начала, направления потока и направления шпинделя. Если всегда от точки 0, так это не програмирование. Начинать надо сразу методически правильно.

На рисунках пример выбора изделия и результат. Всё программирование множества задвижек сводится к вызову одной функции с разными аргументами.
Например:
Код:
[Выделить все]
 
(ru-3d-valve-gate-simple (ru-3d-pipe-flange-std-100-16) 230.0 523 200)
Здесь в аргументах изменяются основные размеры и параметры фланцев. Их (фланцы) тоже можно задать списком, но так как фланцы еще более стандартизированы, чем задвижки, то их данные зашиты в функцию, которую, если что, можно в единственном месте и поправить.
Миниатюры
Нажмите на изображение для увеличения
Название: xml_valves.jpg
Просмотров: 169
Размер:	45.1 Кб
ID:	7805  Нажмите на изображение для увеличения
Название: ru_gate_valve.jpg
Просмотров: 153
Размер:	42.0 Кб
ID:	7806  
ShaggyDoc вне форума  
 
Непрочитано 23.06.2008, 14:58
#107
Рyslan


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


Хитрюга Шэгги из системы RuCAD показал, конечно у вас там все круто. Ну я ж и говорил, что выбирать по двум значениям, типу и назаванию изделияю
Рyslan вне форума  
 
Непрочитано 23.06.2008, 16:44
#108
Кулик Алексей aka kpblc
Moderator

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


Ни секунды не умаляя ruCAD, все же позволю себе порастекаться мыслию по древу:
Сначала анализируем программу. Там получается несколько запросов (если оставлять их в ком.строке, а не выводить в диалог). Почему бы не написать отдельную функцию, заменяющую get*-функции? Обработать там сразу и нажатие пользователем Esc, и преобразования точек в мировую систему координат (буде такое понадобится), и initget там же прошпарить - в общем, выполнить аналог _ru-get. Это часть 1, сервисная. Займет больше всего времени.
Часть 2, отрисовка. Тут, казалось бы, все просто, ясно и отлажено. Погоди радоваться! Во-первых, насчет использования (command) уже говорилось. Бог с ним, в некоторых случаях ее можно оставить. Но давай "подумаем вперед". Эти же задвижки потом надо будет считать... То есть надо (как минимум) делать блок, внутрь блока "загонять" всю задвижку (кстати, не забудь - у тебя ни тип линии, ни вес, ни слой - ничего не меняется). А потом уже вставлять сам этот блок (как раз тот случай, когда от команды не уйти) в точку, указанную пользователем, с соответствующими углами поворота и т.п.
То есть в принципе код, если его делать "по уму", с нуля может занять несколько дней.
===
Поскольку задача изначально стояла не написать код, а показать некоторые возможности vlide, так и сделаем (и на этом закруглимся ):
===
P.S. Ох и огребу же я сейчас...
Вложения
Тип файла: rar vlide_works_2008-06-23[16.44.18].part1.rar (1.62 Мб, 339 просмотров)
Тип файла: rar vlide_works_2008-06-23[16.44.18].part2.rar (1.15 Мб, 266 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 17:23
#109
Рyslan


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


Спасибо!
Рyslan вне форума  
 
Непрочитано 23.06.2008, 17:26
#110
Рyslan


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


to ShaggyDoC
А сколько примерно будет стоить полная версия RuCAD? Да,я еще слышал что можно вам помогать в отрисовке чего-либо и за это получить RuCAD, так ли это?
Рyslan вне форума  
 
Непрочитано 23.06.2008, 20:34
#111
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Не знаю, насколько этот релиз уже актруален, но можно кое-что посмотреть здесь:
http://dwg.ru/search.php?zone=1&mod=2&sName=ruCAD
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 24.06.2008 в 00:46.
VVA на форуме  
 
Непрочитано 23.06.2008, 23:02
#112
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от Рyslan Посмотреть сообщение
to ShaggyDoC
А сколько примерно будет стоить полная версия RuCAD?
Откуда я знаю? Продавать-то уже не я буду. Во всяком случае всегда будет и бесплатная.

Что касается программирования.

Я ведь картинки показал не для рекламы. Интерфейс можно сделать всякий. Можно, например, в DCL. Разочка и хватит, вволю помучиться и для изучения.

А можно и вообще без интерфейса - пункты меню, а к каждому пункту - макрос, вызывающий функцию рисования, задвижки например. Наподобие той, что я привел.

А можно с опциями командной строки - в опции значение Ду, а все остальное уже зашито в программу. И запоминать и восстанавливать опции. Ведь если 100 раз за день надо задвижку нарисовать, так замучаетесь 100 раз отвечать на 6 вопросов, причем 90 раз одинаково.

Учиться надо от простого к сложному. Интересуют задвижки, например, так начните с простого обозначения "бабочкой". Там всего 4 точки, плюс "перекладина". Да и ее можно не рисовать, а сделать вентиль.

Вот и делайте сначала простую функцию рисования. Аргументами в нее можно передать поперечный размер, длину, точку начала и направление конца. Изменяя эти аргументы уже сможете рисовать арматуру и реальных размеров, и в виде условных знаков.

Затем осваиваете ввод точек. Не абы как, а безошибочно. Здесь много нюансов. Например, арматура обычно продолжает какой-то предыдущий элемент (патрубок с фланцем, например). Или врезается в трубу. Значит и точки надо хитро запрашивать, например с опцией наподобие Продолжить. То есть автоматически присоединяя точку начала к концу ранее нарисованного элемента. И продолжая изображение в том же направлении. Это второй этап изучения.

Еще дальше можно по желанию усложнять само изображение. Уже не просто "бантик", а "черт-те что и сбоку бантик". И делать это будет уже проще, если блок ввода точек отработан.

И только потом и к 3D переходить. Там одна геометрия на порядок усложняется. Нельзя ведь заставлять пользователя для каждой арматурины ПСК переносить в её начало. Но и в 3D сначала можно плоские изображения отработать, а уж потом перейти к телам.

И, разумеется. первым делом освоить Vlide. А в чем тогда программы-то писать, в Блокноте, что-ли?
ShaggyDoc вне форума  
 
Непрочитано 23.06.2008, 23:08
#113
Кулик Алексей aka kpblc
Moderator

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


Говорят, иногда пишут В Notepad++.
Сам иногда таким грешу
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2008, 01:54
#114
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Правильно восстанавливать состояние среды на выходе таким, какое оно было до работы программы.
С восстановлением системных переменных по окончанию работы программы я совершенно согласен, это обязательно.
Но! Что касается OSNAP предпочитаю оставлять те значения, которые пользователь назначил в программе в функциях get* и пр., поскольку он подсознательно запомнил это значение, и будет уверен, что и в дальнейшем это будет текущеее значение.
То есть начальное значение OSNAP, которое будет сохраняться при выходе из программы, будет равно текущему значению (после функции get*).
__________________
Лень - великий двигатель прогресса!
KAI вне форума  
 
Непрочитано 24.06.2008, 08:20
#115
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от KAI Посмотреть сообщение
Что касается OSNAP предпочитаю оставлять те значения, которые пользователь назначил в программе в функциях get* и пр...
То, что я говорил о восстановлении параметров среды, относится, в основном, к неинтерактивной части (наверное стоило сказать это более явно). На стадии ввода я вообще избегаю вмешательства в среду - никогда не угадаешь, каковы привычки пользователя. Так что - согласен.
Alaspher вне форума  
 
Непрочитано 24.06.2008, 08:36
#116
Рyslan


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


а я в блокноте и писал у Vlide меню вся английская, а я не такой большой знаток инглиша, ну теперь будем меню переводить тогда
Рyslan вне форума  
 
Непрочитано 24.06.2008, 08:38
#117
Рyslan


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


to VVA
А, это я уже скачал себе, там не все работает, но много чего есть.
Рyslan вне форума  
 
Непрочитано 24.06.2008, 09:58
#118
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Зачем в блокноте то? В крайнем случае в Notepad++ - там и подсветка есть, и пары можно отслеживать. В сторонних редакторах работали, пока не появился штатный редактор. Еще в R14 его не было.
ShaggyDoc вне форума  
 
Непрочитано 30.06.2008, 10:51
#119
Рyslan


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


А по языку DCL есть литература какая-нибудь?
Рyslan вне форума  
 
Непрочитано 30.06.2008, 13:22
#120
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Цитата:
Сообщение от Рyslan Посмотреть сообщение
А по языку DCL есть литература какая-нибудь?
http://levins.land.ru/index.html
Donhuan вне форума  
 
Непрочитано 30.01.2009, 11:08
#121
Рyslan


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


Всем привет! Подскажите как правильно ввести точку. Никак не могу понять. Лисп прилагаю

(defun C:OTV (/ D Rdug x1 y1)

(initget 7)

(setq P1 (getpoint '(list x1 y1) "\nНачальная точка:"))

(setq D (getdist "\nДиаметр отвода:"))
(setq Rdug (getdist "\nРадиус отвода:"))

(setq Rv (- Rdug (* 0.5 D)))
(setq Rn (+ Rdug (* 0.5 D)))


(setq P1 (list x1 y1))
(setq y2 (+ y1 (* 0.5 D)))
(setq y4 (- (* 0.5 D) y1))

(setq P2 (list x1 y2))
(setq P3 (list Rv (+ Rv (* 0.5 D))))
(setq P4 (list Rdug (+ Rv (* 0.5 D))))
(setq P5 (list Rn (+ R (* 0.5 D))))
(setq P6 (list x1 y4))

(command "_.Pline" P1 P2 P3 P4 P5 P6 "_cl")

(command "_.zoom" "_e")
(princ)
)
Рyslan вне форума  
 
Непрочитано 30.01.2009, 12:18
#122
Кулик Алексей aka kpblc
Moderator

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


Может, надо как-то так (особо в логику не вникал):
Код:
[Выделить все]
(defun C:OTV (/ D Rdug x1 y1 Rv Rn P1 y2 y4 P2 P3 P4 P5 P6 osmode)
  (initget 7)
  (setq P1   (getpoint "\nНачальная точка:")
        D    (getdist "\nДиаметр отвода:")
		Rdug (getdist "\nРадиус отвода:")
		Rv (- Rdug (* 0.5 D))
		Rn (+ Rdug (* 0.5 D))
		P1 (list x1 y1)
		y2 (+ y1 (* 0.5 D))
		y4 (- (* 0.5 D) y1)
		P2 (list x1 y2)
		P3 (list Rv (+ Rv (* 0.5 D)))
		P4 (list Rdug (+ Rv (* 0.5 D)))
		P5 (list Rn (+ R (* 0.5 D)))
		P6 (list x1 y4)
		osmode(getvar "osmode"))
  (setvar "osmode" 0)
  (command "_.Pline" P1 P2 P3 P4 P5 P6 "_cl")
  (setvar "osmode" osmode)
  (command "_.zoom" "_e")
  (princ)
  )
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.01.2009, 17:39
#123
Рyslan


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


Выдает ошибку, также как и мне в моем лиспе
; ошибка: неверный тип аргумента: numberp: nil
Рyslan вне форума  
 
Непрочитано 30.01.2009, 19:48
#124
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


А x1 и y1 кто будет инициализировать? Они nil, вот и ошибка
ShaggyDoc вне форума  
 
Непрочитано 31.01.2009, 11:14
#125
Рyslan


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


а я же ввел x1 y1, (setq P1 (getpoint '(list x1 y1) "\nНачальная точка:"))
неправильно?
Рyslan вне форума  
 
Непрочитано 31.01.2009, 11:40
#126
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от Рyslan Посмотреть сообщение
а я же ввел x1 y1, (setq P1 (getpoint '(list x1 y1) "\nНачальная точка:"))
неправильно?
Разумеется неправильно. Ты не "ввел", а пытаешься сформировать точку из несуществующих значений. Где-то в начале должны быть присвоены значения, наподобие:

(setq x1 100.0 y1 0.0)

И только потом как-то использовать.
ShaggyDoc вне форума  
 
Непрочитано 31.01.2009, 12:38
#127
Рyslan


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


А если я не знаю какими будут координаты? Нужно чтобы они были произвольными, указал точку на поле чертежа, вот и координаты точки P1(x1;y1). Вот я и хочу, указать начальную точку и потом с помощью quote вернуть значения x1;y1. А в твоем выражении (setq x1 100.0 y1 0.0) - 100.0 и 0.0 это координаты x1 и y1?
Рyslan вне форума  
 
Непрочитано 31.01.2009, 14:10
#128
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


(getpoint "запрос") возвращает кординаты указаной очки.
(getpoint '(x y z) "запрос") возвращает кординаты точки, рисует "резиновую" нить от указанной точки.
Donhuan вне форума  
 
Непрочитано 31.01.2009, 14:16
#129
Рyslan


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


(setq P1 (getpoint '(list x1 y1) "\nНачальная точка:")) так я так и делал.
Рyslan вне форума  
 
Непрочитано 31.01.2009, 15:01
#130
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


'(list x y) -> это '(list x y)
(list x y)-> '(x y)
Чувствуешь разницу?
Donhuan вне форума  
 
Непрочитано 31.01.2009, 15:45
#131
Рyslan


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


ввел вот так (setq P1 (getpoint '(x1 y1) "\nНачальная точка:"))
Автокад пишет - ; ошибка: неверный тип аргумента: 2D/3D точка: (X1 Y1)
Рyslan вне форума  
 
Непрочитано 31.01.2009, 16:38
#132
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Тебе ж писал ShaggyDoc, что переменые до использования должны быть определены.

Функция (getpoint) возвращает кординаты точки, например '(10 10 0), что ты будешь с ними делать зависит от тебя. Если ты имел в виду, что в x1 должна автоматом попасть координата x, а в y1 - y, то это не так.

Код:
[Выделить все]
((lambda (x) (setq x1 (car x)
                         y1 (cadr x)
                  )
  )
  (getpoint "\nInput point : ")
)
После этого в x1 y1 у тебя будут содержаться соответственно x и y введенной точки.

P.S. И вообще:
'(x1 y1)->'(x1 y1), чтобы получить точку надо определить x1 и y1, а затем использовать (list x1 y1). Знак '(...) запрещает вычисление стоящей за ним функции и эквивалентен (quote (...)), см. справку.
В свою очередь функция (list [] ...) формирует список из аргументов.

Последний раз редактировалось Donhuan, 31.01.2009 в 16:47.
Donhuan вне форума  
 
Непрочитано 31.01.2009, 17:47
#133
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, срочно садись за азбуку. Выделяешь getpoint и жмешь Ctrl+F1. И внимательно изучаешь описание функции.

Если тебе надо получить в переменную с именем P1 значение начальной точки, то надо (setq P1 (getpoint "\nНачальная точка: ")) - без всяких (list x1 y1). Если потом, на кой-то черт, понадобится разделить эту точку (список) на её ординаты, то сделаешь (setq x1 (car p1) y1 (cadr p1))

Но и этого (значений отдельных ординат) в твоей задаче вообще не надо. Любые точки от известной можно получить функцией polar.

Жми F1 почаще.
ShaggyDoc вне форума  
 
Непрочитано 31.01.2009, 20:49
#134
Рyslan


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


Пробовал я использовать Polar, ничерта не получается, в декартовых координатах проще посчитать. А этот Polar, насколько я понял расстояние между точками задает и угол между расстоянием и проекцией на ось икс. а где я возьму расстояние, тем более оно не точное. ну квадрат я так нарисовал, а дальше чота никак. Да есть у меня книженция, туда и смотрю. примеров маловато только
Рyslan вне форума  
 
Непрочитано 01.02.2009, 06:24
#135
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Пробовал я использовать Polar, ничерта не получается, в декартовых координатах проще посчитать
А у всех получается. Вот твой отвод (элементарнейший рисунок), он что - всегда в одном положении будет?

Ось трубы, к которой приделывается отвод, может быть направлена под любым углом. Сам отвод может быть направлен влево и вправо, вперед и назад. Может быть с разными центральными углами и с разными радиусами. Да и рисовать его надо полилинией с дугами.

Начинать надо на бумажке. Набросай эскиз - под углом, проставь номера точек и прикинь, как высчитать координаты всех точек, если известна координата начальной точки и направление трассы. А вот направление запрашивать надо обязательно. Потом выяснить - в какую сторону направить. Радиус и диаметр как раз спрашивать незачем - это могут быть аргументы функции рисования.
ShaggyDoc вне форума  
 
Непрочитано 01.02.2009, 09:33
#136
Рyslan


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


ты правильно все говоришь, я так и хочу сделать.
Рyslan вне форума  
 
Непрочитано 03.02.2009, 14:47
#137
Рyslan


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


ShaggyDoc, вроде разобрался с polar. Построил отвод в одном положении. А вот как его сориентировать? И потом, у меня там углы постоянные. Какая то зависимость наверное должна быть от начального угла привязки и углов отвода, хммм

(defun C:OTV (/ P1 P2 P3 P4 P5 P6 D Rdug)

(initget 7)

(setq P1 (getpoint "\nНачальная точка:"))


(setq D (getdist "\nДиаметр отвода:"))
(setq Rdug (getdist "\nРадиус отвода:"))



(setq Rv (- Rdug (* 0.5 D)))
(setq Rn (+ Rdug (* 0.5 D)))
(setq Dist1 (sqrt (* 2 Rv Rv)))
(setq Dist2 (sqrt (* 2 Rn Rn)))


(setq P2 (polar P1 (* 0.5 pi) (* 0.5 D)))
(setq P3 (polar P2 (* 0.25 pi) Dist1))
(setq P4 (polar P3 0 (* 0.5 D)))
(setq P5 (polar P4 0 (* 0.5 D)))
(setq P6 (polar P5 (* 1.25 pi) Dist2))



(Command "_.PLine" P1 P2 "_A" "_R" Rv P3 "_L" P5 "_A" "_R" Rn "_ANG" -90 P6 "_L" P1 "_A" "_R" Rdug P4 "" "_E")

(command "_.zoom" "_e")
(princ)
)
Рyslan вне форума  
 
Непрочитано 03.02.2009, 20:52
#138
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, вот я тебе сейчас книгу "САПР на базе AutoCAD - как это делается" буду индивидуально пересказывать?

У тебя ведь программа даже в первом приближении далека от рабочего вида, начиная с первой и заканчивая предпоследней строкой.

Может, всё-таки согласишься литературу почитать? Я конечно могу прямо сюда воткнуть рабочий код для рисования любых отводов. Вот в 2D:

Код:
[Выделить все]
(ru-pipe-draw-any (quote ru-pipe-turn-bend)(list 100.0 150.0 90.0) "Начало отвода" "Направление центрального угла")
Вот в 3D:

Код:
[Выделить все]
(ru-3d-pipe-turn-by-vertex-std  108.0 4.0 150.0 90.0)
Но у тебя же еще больше вопросов будет? Так что читай...
ShaggyDoc вне форума  
 
Непрочитано 05.02.2009, 13:18
#139
Рyslan


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


лучше б готовый код сюда воткнул, я б на месяц затих, разбирая его. а так даешь заголовок функции и мучайся с ним. кстати в книге тоже не особо много примеров...еееэээхххх
Рyslan вне форума  
 
Непрочитано 05.02.2009, 13:43
#140
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от Рyslan Посмотреть сообщение
лучше б готовый код сюда воткнул, я б на месяц затих, разбирая его. а так даешь заголовок функции и мучайся с ним. кстати в книге тоже не особо много примеров...еееэээхххх
Что, все 1662 исходника LISP уже изучил?
ShaggyDoc вне форума  
 
Непрочитано 05.02.2009, 14:40
#141
Рyslan


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


Рyslan вне форума  
 
Непрочитано 15.02.2009, 19:33
#142
Рyslan


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


Заметил на форуме ShaggyDoc

(defun C:OTV (/ ang P1 P2 P3 P4 P5 P6 D Rdug)

(initget 1)


(setq P1 (getpoint "\nНачальная точка:"))
(setq ang (getorient P1 "\nУкажите направление отвода:"))

(setq D (getdist "\nДиаметр отвода:"))
(setq Rdug (getdist "\nРадиус отвода:"))



(setq Rv (- Rdug (* 0.5 D)))
(setq Rn (+ Rdug (* 0.5 D)))
(setq Dist1 (sqrt (* 2 Rv Rv)))
(setq Dist2 (sqrt (* 2 Rn Rn)))


(setq P2 (polar P1 (+ ang (* 0.5 pi)) (* 0.5 D)))
(setq P3 (polar P2 (+ ang (* 0.25 pi)) Dist1))
(setq P4 (polar P3 ang (* 0.5 D)))
(setq P5 (polar P4 ang (* 0.5 D)))
(setq P6 (polar P5 (+ ang (* 1.25 pi)) Dist2))



(Command "_.PLine" P1 P2 "_A" "_R" Rv P3
"_L" P5 "_A" "_R" Rn "_ANG" -90 P6
"_L" P1 "_A" "_R" Rdug P4 ""
)


(princ)
)

Теперь отвод рисуется по любой оси. Вот как его покрутить вверх вниз? Из функции ввода данных я уже одну использовал, getorient. Осталась getangle.. пойдет? Чота у меня ничерта не получается, отупел совсем
Рyslan вне форума  
 
Непрочитано 16.02.2009, 07:29
#143
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, книжку-то ты не прочитал... Картинки только посмотрел. Иначе не делал бы подряд 4 незащищенных от ошибок GETxxx... Но это к слову.
Ты же за деревьями леса не видишь. Вот зачем спрашиваешь каждый раз диаметр и радиус? И в "бою" так же будешь, по 100 раз в час? Вынеси их в аргументы функции, не делай её "командой". Например, так:
Код:
[Выделить все]
(defun draw_turn (D Rdug /  )
;; Не надо спрашивать
.....

)
Да пусть эта функция не princ вернет (то есть ничего), а последнюю точку на оси отвода - к ней потом можно дальше прицепиться.

Теперь легче будет с геометрией. А что для геометрии отвода надо:

1. Начальная точка на оси трубы
2. Направление трубы - точка, а не угол.
3. В какую сторону (влево или вправо от направления) рисовать отвод.

Это можно или получить запросом еще одной точки или, более примитивно, нарисовать отвод в любую сторону, а потом спросить "Отзеркалить?" и, если надо, сделать MIRROR для отвода и его оси.

Для удобства надо отделить ввод данных от самого рисования. То есть расширить объявление функции рисования наподобие:
Код:
[Выделить все]
(defun draw_turn (D Rdug начальная_точка точка_на оси_трубы рисовать_влево / ....  )
....
)
Повторяю ещё раз:

Цитата:
Начинать надо на бумажке. Набросай эскиз - под углом, проставь номера точек и прикинь, как высчитать координаты всех точек, если известна координата начальной точки и направление трассы. А вот направление запрашивать надо обязательно. Потом выяснить - в какую сторону направить. Радиус и диаметр как раз спрашивать незачем - это могут быть аргументы функции рисования.
ShaggyDoc вне форума  
 
Непрочитано 16.02.2009, 08:42
#144
Рyslan


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


Спасибо. будем думать дальше. книгу я листаю
Рyslan вне форума  
 
Непрочитано 20.02.2009, 17:40
#145
Рyslan


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


Код:
[Выделить все]
(defun c:OTVOD (/ p1 p2 p3 p4 p5 p6 DN_otv)
(initget 7)
(setq DN_otv (getint (strcat "\nДиаметр отвода 50/65/80/100:")))

(cond
	((= DN_otv 50) (setq D 57 Rdug 75))
	((= DN_otv 65) (setq D 76 Rdug 100))
	((= DN_otv 80) (setq D 89 Rdug 120))
	((= DN_otv 100) (setq D 114 Rdug 150))
)

	(setq P1 (getpoint "\nНачальная точка:"))
	(setq ang (getorient P1 "\nУкажите направление отвода/Угол:")) 
	

  (setq Rv (- Rdug (* 0.5 D)))
  (setq Rn (+ Rdug (* 0.5 D)))
  (setq Dist1 (sqrt (* 2 Rv Rv)))
  (setq Dist2 (sqrt (* 2 Rn Rn)))


  (setq P2 (polar P1 (+ ang (* 0.5 pi)) (* 0.5 D)))
  (setq P3 (polar P2 (+ ang (* 0.25 pi)) Dist1))
  (setq P4 (polar P3 ang (* 0.5 D)))
  (setq P5 (polar P4 ang (* 0.5 D)))
  (setq P6 (polar P5 (+ ang (* 1.25 pi)) Dist2))

  (Command "_.PLine"	 P1	P2     "_A"   "_R"   Rv	    P3
	   "_L"	  P5	 "_A"	"_R"   Rn     "_ANG" -90    P6
	   "_L"	  P1	 "_A"	"_R"   Rdug   P4     ""	   
	  )

  
  (princ)
)

Shaggy_Doc, ну как? Вот как отзеркалить? после рисования ввести запрос на зеркало? Давай замечания свои, даже если ты уже говорил об этом. До меня пока дойдет ....еще осевую как-то надо сделать, вместо простой дуги, хмм

Последний раз редактировалось Кулик Алексей aka kpblc, 21.02.2009 в 11:11. Причина: Code не забывай
Рyslan вне форума  
 
Непрочитано 24.02.2009, 20:32
#146
Рyslan


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


Кулик Алексей aka kpblc, ну спасибо тебе. полдня никто не реагировал. периодически просматривал новую тему и на тебе, зашел ты и все удалил. Куча балбесов кучу тем создают про всякую муть... а тут в кои веки тему создал и на тебе...
Рyslan вне форума  
 
Непрочитано 24.02.2009, 20:38
#147
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, а программа в таком виде (то, что в закрытой ветке) не может правильно рисовать. Прилагаю картинку - черные отводы. Видишь, что получается? И это на пустом месте, а что будет, если ещё обстановка нарисована. Догадаешься, почему?

Ты тестируешь, чтобы доказать себе - "Ура! Заработало!". А надо в реальных условиях, и тогда оказывается, что не работает. Или работает, но не так.

Да и осевая линия тоненькая должна быть, и тип у нее свой должен быть. Мелочь, но радикально изменяет всё рисование

Вот попробуй нарисовать, как на второй картинке - красной. Нарисуй как-нибудь прямой участок, а от него построй скобу из своих отводов. Чтоб как на этой картинке.
Миниатюры
Нажмите на изображение для увеличения
Название: otvod_01.png
Просмотров: 154
Размер:	4.4 Кб
ID:	16541  Нажмите на изображение для увеличения
Название: otvod_02.png
Просмотров: 162
Размер:	2.1 Кб
ID:	16542  
ShaggyDoc вне форума  
 
Непрочитано 24.02.2009, 20:52
#148
Кулик Алексей aka kpblc
Moderator

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


Offtop: Рyslan, про "кучу балбесов" и прочую муть - пальцем покажи. Точнее, ссылки. В ПМ, чтобы не загрязнять тему.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2009, 21:20
#149
Рyslan


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


Прошу всех прощения за свое поведение. Злой был, никто в моей новой теме не ответил. Так всегда, сначала скажу сделаю, потом думаю..а зачем. Алексей, без обид. Shaggy_Doc, наверное лисп это не мое.
Рyslan вне форума  
 
Непрочитано 24.02.2009, 22:10
#150
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Shaggy_Doc, наверное лисп это не мое
Не отчаивайся раньше времени.

1. Почему рисует неправильно? Да ты не то, что в книжке - в этой ветке не прочитал, что при рисовании функцией command надо отключать привязки. А потом восстанавливать. Первая и самая распространенная ошибка.

2. Ты по-прежнему принципиально неверно ввод организуешь. Ну как пользователь может точно указать "направление отвода"? Как он поймет, что это такое? Отвод-то как раз изменяет направление трассы. А как ввести угол? Вот есть конец ранее нарисованной трубы, к середине торца можно привязать начальную точку, а дальше? Как ты укажешь "направление отвода", чтобы потом отвод правильно нарисовался "приварившись" к концу трубы?

3. А разве отводы только 90 градусов бывают? А 30, 45, 60, да и 180 может быть. А разве радиус только 1.5 Д? В данном варианте ты геометрию рассчитываешь под конкретный вариант, а она должна быть функцией от диаметра, центрального угла и радиуса. Тогда и все расчеты точек иначе будут.

4. Осевую линию, конечно надо отдельно делать, всегда тонкую (LWDEFAULT), а "края" - с текущим весом линии. Кстати, никакой гарантии нет, что во время рисования PLINE у неё не будет какая-то ненужная тебе физическая ширина. Значит надо и Width принудительно устанавливать.

5. А попробуй просто вручную нарисовать отвод полилинией - сначала в одну сторону, а потом в другую. Увидишь, что он вообще не нарисуется. Чтобы правильно рисовалась дуга отвода, её надо начинать не от угла, надо сделать маленькое плечико (например 1 ед) и только тогда можно дугу сделать по точкам. Плечики, конечно, на обеих концах, а это точки дополнительные.

Всё это должно решаться на этапе постановки задачи. Ты её сам себе ставишь, наверняка знаешь, как отводы рисуются, та подумай немного заранее. А код, кода всё понятно, проще всего написать. Это первый раз кажется сложно. Ты же освоил главную функцию для черчени - polar.
ShaggyDoc вне форума  
 
Непрочитано 24.02.2009, 22:50
#151
Кулик Алексей aka kpblc
Moderator

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


ShaggyDoc, по-моему, объектными средствами (да и через entmakex) можно создать любую полилинию. Я не работал с отводами, но вот, как вариант (точки жестко заданы, высчитывать их лениво):
Код:
[Выделить все]
(defun test1 (/ ang)
  (setq ang (/ pi 2.)
        ang (/ (sin (/ ang 4.)) (cos (/ ang 4.)))
        ) ;_ end of setq

     ;(  (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 1759.05 391.658) (40 . 0.0) (41 . 0.0) (42 . 0.598714) (10 1842.48 475.979) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 1806.86 475.979) (40 . 0.0) (41 . 0.0) (42 . -0.557142) (10 1755.3 421.639) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
  (entmakex (list
              '(0 . "LWPOLYLINE")
              '(100 . "AcDbEntity")
              '(100 . "AcDbPolyline")
              (cons 90 4) ; количество вершин
              '(70 . 1) ; признак замкнутости
              '(43 . 0.) ; постоянная ширина
              '(38 . 0.) ; elevation
              '(39 . 0.) ; thickness
              '(10 0. -10.)
              (cons 42 ang)
              '(10 50. 40.)
              '(42 . 0.)
              '(10 30. 40.)
              (cons 42 (- ang))
              '(10 0. 10.)
              '(42 . 0.)
              ) ;_ end of list
            ) ;_ end of entmakex
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2009, 06:55
#152
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
объектными средствами (да и через entmakex) можно создать любую полилинию
Конечно можно. А полилинию с дугами? Тоже можно, но геометрию надо совсем другую высчитывать. В данном случае использование command оправданно, особенно для изучения программирования. Человек может наглядно проверить, как это должно работать. Вот для построения дуги в command можно знать точки начала и конца дуги, они легко вычисляются и их легко передать. Центр даже не обязательно знать.

Инженеру command понятна, а вот DXF-коды - тёмный лес поначалу.

В AddArc(Center, Radius, StartAngle, EndAngle) - замучаешься эти углы вычислять, да еще с учётом ПСК.

А так, оно конешно, можно.
ShaggyDoc вне форума  
 
Непрочитано 25.02.2009, 07:26
#153
Рyslan


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


ShaggyDoc, Кулик Алексей aka kpblc спасибо за советы!
Рyslan вне форума  
 
Непрочитано 25.02.2009, 23:48
#154
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Вот для примера, как по минимуму можно это
решить если твой чертеж в миоровой системе
координат (без излишеств)
Тестировал только в A2008(en)

Код:
[Выделить все]
(vl-load-com)
(defun C:RR ()
(setvar "osmode" 514)
(initget 1)
(setq pt1 (getpoint "\nУказать точку, затем перпендикуляр от магистрали >>> "))
(setq liness (ssget "C" pt1 pt1)
      ename (ssname liness 0)
      )  
(setq pick nil)
(setq input 5)
(while (not (equal input 3))
(setq temp (grread T 4 4))
(redraw)
(setq input (car temp))
(setq pick (cadr temp))
(setq near  (vlax-curve-getclosestpointto ename pick )) 
(grdraw point near 4)
)
(redraw)
(setvar "lastpoint" pick)
(if (not (tblsearch "ltype" "Center"))
	   (command "-linetype" "_L" "Center" "" "")
	   )
(initget "50 65 80 100")
(setq dia (getreal "\nВведите диаметр (Right Click to choice)[50/65/80/100]: "))
(setq ang1  (angle  near pick)
      ang2  (- ang1 (/ pi 2))
      crp (polar pt1 ang2 (* dia 1.5))
      p1 (polar pt1 (+ ang2 pi) (/ dia 2))
      p2 (polar pt1 ang2 (/ dia 2))
      p3 (polar crp ang1 dia)
      p4 (polar crp ang1 (* dia 2))
      mp1 p1
      mp2 (polar crp ang1 (* dia 1.5))
      pn pt1
      pv (polar pt1 ang1 1000.)
      )
(setq ss (ssadd))
(command "._pline" "_non" p2 "_non" p1 "_a" "_d" (angtos ang1) "_non" p4
	   "_l" "_non" p3 "_a" "_d" (angtos (+ ang1 (/ pi 2))) "_non" p2 "cl")
(command "._pedit" (setq pl (entlast)) "_w" "5.000" "")
(command "._matchprop" en "_L" "")
(ssadd (entlast) ss)
(command "._arc" "C" "_non" crp "_non" mp2 "_non" mp1)	      
(command "._chprop" "_L" "" "_LT" "Center" "_S" "2.000" "")
(ssadd (entlast) ss)  
  (initget "Отразить Нет")
  (setq ans (getkword "\nИзменить положение? (Right Click to choice)[Отразить/Нет]"))
  (if (eq "Отразить" ans)
      (command "._mirror" ss "" "_non" pv "_non" pn "_Y")
    )
(princ)
)
~'J'~
Олег (jr.) вне форума  
 
Непрочитано 02.03.2009, 19:35
#155
Рyslan


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


(defun c:OTVOD (/ p1 p2 p3 p4 p5 p6 ang) при таком виде локальных переменных ввод данных появляется в командной строке
(defun c:OTVOD (centr_ang D Rdug / p1 p2 p3 p4 p5 p6 ang) при таком- нет
почему? вроде объявляю слева аргументы, справа локальные переменные...хмм и вообще, чем в автолиспе аргументы отличаются от переменных? насколько помню из математики x-аргумент или переменная, y-функция. еще про привязки хотел спросить, зачем их выключать? когда потом точку вводишь приходится снова привязку включать
Рyslan вне форума  
 
Непрочитано 02.03.2009, 19:46
#156
Кулик Алексей aka kpblc
Moderator

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


что и где появляется - вообще-то регулируется кодом, прописанным в функции.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.03.2009, 19:56
#157
Рyslan


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


ну не знаю, тебе может понятно, а мне непонятно, почему при одном задании лисп грузится в автокад и появляется ввод данных, а при другом задании автокад пишет- слишком мало аргументов
Рyslan вне форума  
 
Непрочитано 02.03.2009, 23:38
#158
Кулик Алексей aka kpblc
Moderator

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


Ок, расскажу как я сам понимаю. Возможно, это и неверно.
Есть в лиспе "нормальные функции", а есть "оформленные как команды" (с префиксом с:). Первые нормально воспринимают такое понятие, как аргументы. Вторые - не всегда. Если честно, я стараюсь не делать команд с аргументами вызова, хотя и видел корректно работающие коды команд с аргументами.
Теперь о вызове.
Если есть
Код:
[Выделить все]
(defun c:mycommand1() ;|<...>|;)
то mycommand1 вызывается с ком.строки как
Код:
[Выделить все]
Command: mycommand1
Если есть
Код:
[Выделить все]
(defun myfunc1() ;|<...>|;)
то вызываем соответственно как
Код:
[Выделить все]
Command: (myfunc1)
А вот теперь приступаем к аргументам:
Код:
[Выделить все]
(defun myfunc2 (arg1 arg2) ;|<...>|;)
будет вызываться только как
Код:
[Выделить все]
Command: (myfunc2 x y)
Естественно, что в х и в у хранятся какие-то значения.
Для варианта команды
Код:
[Выделить все]
(defun c:mycommand2(arg1 arg2) ;|<...>|;)
вызов, по идее, должен быть наподобие
Код:
[Выделить все]
Command: mycommand2 x y
Но! Пробел AutoCAD воспринимает как окончание ввода. Поэтому (опять же теоретически - я не проверял, сам понимаешь) вызов должен быть оформлен примерно как
Код:
[Выделить все]
Command: (c:mycommand2 x y)
Но я в этом не уверен.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2009, 07:00
#159
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Просто не надо никогда создавать C:-функции (псевдокоманды) с аргументами.

Цитата:
To use functions as AutoCAD commands, be sure they adhere to the following rules:

- The function name must use the form C:XXX (upper- or lowercase characters). The C: portion of the name must always be present; the XXX portion is a command name of your choice. C:XXX functions can be used to override built-in AutoCAD commands. (See Redefining AutoCAD Commands.)

- The function must be defined with no arguments. However, local variables are permitted and it is a good programming practice to use them.
ShaggyDoc вне форума  
 
Непрочитано 03.03.2009, 18:22
#160
Рyslan


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


Привет Алексей и Shaggy_Doc! Да, я читал что defun C: Отвод (), а можно defun Отвод (). Первый вариант удобен для создания кнопки, про второй не знаю, можно ли макрос для него создать. Vlide постоянно мне пишет- maloformed list on input, когда проверяю выделеный фрагмент тела функции с переменными и аргументами. Вчера зашел на сайт Толстобы Н, там прочел, что обычно maloformed list on input озночает, что скобки неправильно расставлены или не хватает. Скобки проверяю, вроде все правильно. Сегодня взял лисп чужой, где-то скачал до этого, так же проверил выделеный фрагмент тела функции с переменными- maloformed list on input. Ну вообщем сегодня весь день туда сюда тасовал и вроде заработало. Правда у меня все равно получается 4 ввода, 1) ввожу центральный угол 45/60/90 2)Ввожу диаметр отвода из списка 3) Начальная точка 4) Точка на оси трубы. Привязки поставил. Осевую на слой 0 не получается подгрузить из linetype, поэтому создал слой Center и после рисования меняю осевую. Shaggy_Doc, будешь опять ругаться Вправо влево не осуществил, не пойму каким макаром это ввести, еще не понимаю как осуществить после рисования отражение Mirror и чтобы еще и точка привязки осталась. Лисп в 2006 акаде англ работает. в 2008 руском нет
Код:
[Выделить все]
(defun c:OTV (/ p1 p2 p3 p4 p5 p6 centr_ang ang D Rdug Rv Rn Dist1 Dist2 Dist3)
(defun dtr (centr_ang)
	(* pi (/ centr_ang 180.0)
	)
(setq osm (getvar "OSMODE"))
(setvar "osmode" (logior osm 16384))

						
(initget 7)																	
(setq centr_ang (getaint (strcat "\nЦентральный угол отвода 45/60/90:")))
	(initget 7)
(setq D_nominal (getdist (strcat "\nУсловный диаметр отвода 40/50/65/80/100:")))			
(cond
	((= D_nominal 40 ) (setq D 45 Rdug 60))				
	((= D_nominal 50 ) (setq D 75 Rdug 75))
	((= D_nominal 65) (setq D 76 Rdug 100))
	((= D_nominal 80) (setq D 89 Rdug 120))
	((= D_nominal 100) (setq D 108 Rdug 150))
)
  				
  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))							
  (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))					
  (setq Dist2 (* 2 Rdug (sin (* 0.5 (dtr centr_ang)))))				
  (setq Dist3 (* 2 Rn (sin (* 0.5 (dtr centr_ang)))))					

	(setq P1 (getpoint "\nУкажите начальную точку отвода:"))	
	(setq ang (getorient P1 "\nУкажите точку на оси трубы:"))

  (setq P2 (polar P1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq P3 (polar P2 (+ ang (* 0.5 (dtr centr_ang))) Dist1))
  (setq P4 (polar P1 (+ ang (* 0.5 (dtr centr_ang))) Dist2))
  (setq P6 (polar P1 (+ ang (* 1.5 pi)) (* 0.5 D)))
  (setq P5 (polar P6 (+ ang (* 0.5 (dtr centr_ang))) Dist3))
  
  (Command "_.PLine" P6 P2 "_cl")
  (Command "_.Pline" P3 P5 "_cl")
  (Command "_.Arc" P2 "_E" P3 "_R" Rv "_cl")
  (Command "_.Arc" P6 "_E" P5 "_R" Rn "_cl")
  	 
  (Command "_.Arc" P1 "_E" P4 "_R" Rdug "_cl")
(setq Arc (entlast))
(Command "_.Change" Arc "" "_P" "_la" "Center" "" "")

(setvar "OSMODE" osm)

  
  (princ)								
)

Последний раз редактировалось Рyslan, 03.03.2009 в 18:32.
Рyslan вне форума  
 
Непрочитано 03.03.2009, 22:04
#161
Кулик Алексей aka kpblc
Moderator

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


Двойной клик мышой на открывающей (или закрывающей) скобке автоматом выделит весь кусок, заключенный в эти скобки (естественно, если это возможно). Вот его и надо проверять.
Кстати, не maloformed, по-моему, а mailformed.
Теперь о вызовах и прочей лабуде. Оформляется всего одна функция, что-то наподобие
Код:
[Выделить все]
(defun draw-pipe-tap(angle-center diameter rdug) ;||;)
а в макросах прописываешь что-то типа
Код:
[Выделить все]
^C^C(draw-pipe-tap 30 160 20)
А если захочется, чтобы по пробелу или Enter'у повторялось выполнение, то
Код:
[Выделить все]
^C^C(defun c:mydr() (draw-pipe-tap 30 160 20));mydr;
^C^C(defun c:mydr() (draw-pipe-tap 45 160 20));mydr;
Естественно, что макросы представлены в последнем коде для разных кнопок. Единственное - тебе надо будет гарантировать загрузку твоего лиспа.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2009, 18:02
#162
Рyslan


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


Алексей, привет! Есть вопрос. Важно месторасположение функции пересчета углов из градусов в радианы в теле кода программы?
Код:
[Выделить все]
(defun dtr (centr_ang)
	(* pi (/ centr_ang 180.0)
	)
Еще вопрос, функция antof делает то же самое что и вышенаписанная?
Рyslan вне форума  
 
Непрочитано 14.03.2009, 18:15
#163
Кулик Алексей aka kpblc
Moderator

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


Теоретически местоположение функции не важно, по-моему. Но лично я предпочитаю функции описывать до первого их применения (уж не помню, откуда эта рекомендация вылезла).
Н.Н.Полещук, "AutoLISP и VisualLISP в среде AutoCAD" (с некоторыми купюрами):
Цитата:
angtof: Преобразовывает строку, представляющую значение угла в различных форматах, в вещественное число, являющееся величиной угла в радианах
Код:
[Выделить все]
(angtof <строка> [<представление>])
Строка - строковое представление преобразовываемого угла.
Представление - целое число. Соответствует значениям AUNITS. Если пропущено, принимается текущее значение AUNITS:
0 - градусы
1 - градусы, минуты, секунды
2 - грады
3 - радианы
4 - топографические единицы
Примеры:
Код:
[Выделить все]
(angtof "22" 0) ; 0.383972 (перевод из градусов в радианы)
(angtof "72.48g" 2) ; 1.13851
(angtof "7d13'20\"" 1) ; 0.126052
angtof:
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2009, 18:26
#164
Рyslan


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


справка по функции antof у меня есть просто хотел узнать, эти две функции делают одно и тоже или нет
Рyslan вне форума  
 
Непрочитано 14.03.2009, 18:39
#165
Кулик Алексей aka kpblc
Moderator

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


Ну, если ты будешь передавать корректную строку, то, наверное, можно и ее использовать. Вопрос в скорости выполнения (я - не тестировал, скажу сразу).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2009, 19:05
#166
Рyslan


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


Код:
[Выделить все]
(setq Dist1 (* 2 Rv (sin (* 0.5 (angtof "centr_ang")))))
Код:
[Выделить все]
 (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))
Когда использую dtr - постоянно выходит сообщение неправильно сформированный список на входе (лисп не начинает работать). Когда использую angtof - После ввода второй точки -Укажите точку на оси трубы:; ошибка: неверный тип аргумента: numberp:
nil
Может не из-за этих функций конечно не работает...честно говоря Vlide не особо помогает выявить ошибки. Пишет то да се, а пальцем ткнуть где неправильно не умеет
Рyslan вне форума  
 
Непрочитано 14.03.2009, 20:13
#167
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, С чего это ты переменную centr_ang берешь в кавычки?
Код:
[Выделить все]
(setq Dist1 (* 2 Rv (sin (* 0.5 (angtof "centr_ang")))))
В переменной centr_ang должна быть строка. Думаю что
Цитата:
неправильно сформированный список на входе
из той же оперы. Покажи что и как у тебя заносится в centr_ang
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 14.03.2009, 20:20
#168
Рyslan


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


VVA
Код:
[Выделить все]
(defun c:otvod (/ P1 P2 P3 P4 P5 P6)

(setq osm (getvar "OSMODE"))
(setvar "osmode" (logior osm 16384))
						
	(initget 7)																	
(setq centr_ang (getint (strcat "\nЦентральный угол отвода 45/60/90:")))
    

	(initget 7)
(setq D_nom (getdist (strcat "\nУсловный диаметр отвода 40/50/65/80/100:")))			
(cond
	((= D_nom 40 ) (setq D 45 Rdug 60))				
	((= D_nom 50 ) (setq D 57 Rdug 75))
	((= D_nom 65) (setq D 76 Rdug 100))
	((= D_nom 80) (setq D 89 Rdug 120))
	((= D_nom 100) (setq D 108 Rdug 150))
)
  
 (initget 7)
	(setq P1 (getpoint "\nУкажите начальную точку отвода:"))
(initget 7)
	(setq ang (getorient P1 "\nУкажите точку на оси трубы:"))
	
				
  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))

  (setq Dist1 (* 2 Rv (sin (* 0.5 (angtof "centr_ang")))))					
  (setq Dist2 (* 2 Rdug (sin (* 0.5 (angtof "centr_ang")))))				
  (setq Dist3 (* 2 Rn (sin (* 0.5 (angtof "centr_ang")))))					



  (setq P2 (polar P1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq P3 (polar P2 (+ ang (* 0.5 (angtof "centr_ang"))) Dist1))
  (setq P4 (polar P1 (+ ang (* 0.5 (angtof "centr_ang"))) Dist2))
  (setq P6 (polar P1 (+ ang (* 1.5 pi)) (* 0.5 D)))
  (setq P5 (polar P6 (+ ang (* 0.5 (angtof "centr_ang"))) Dist3))
  
  
  

  (Command "_.PLine" P6 P2 "_cl")
  (Command "_.Pline" P3 P5 "_cl")
  (Command "_.Arc" P2 "_E" P3 "_R" Rv "_cl")
  (Command "_.Arc" P6 "_E" P5 "_R" Rn "_cl")
  	 
  (Command "_.Arc" P1 "_E" P4 "_R" Rdug "_cl")
(setq Arc (entlast))
(Command "_.Change" Arc "" "_P" "_la" "Center" "" "")

(setvar "OSMODE" osm)

  
  (princ)								
)
до antof у меня было (defun dtr (centr_ang)
(* pi (/ centr_ang 180.0)
)
ну и соответсвтенно (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))
Рyslan вне форума  
 
Непрочитано 17.03.2009, 21:23
#169
Рyslan


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


странно, на работе лисп работает, дома нет
Рyslan вне форума  
 
Непрочитано 18.03.2009, 13:49
#170
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Что ты этим хотел сделать
(Command "_.Arc" P2 "_E" P3 "_R" Rv "_cl")
(Command "_.Change" Arc "" "_P" "_la" "Center" "" "")

Цитата:
(Command "_.Arc" ;_Вызвали команду ARC
P2 ;_Что ты этим хотел сделать
"_E" ;_Что ты этим хотел сделать
P3 ;_Что ты этим хотел сделать
"_R" ;_Что ты этим хотел сделать
Rv ;_Что ты этим хотел сделать
"_cl" ;_Что ты этим хотел сделать
)
Вместо ;_Что ты этим хотел сделать дай ответ
Точно так же распиши про _CHANGE
Ответишь - подправлю код.
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 18.03.2009, 17:25
#171
Рyslan


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


Код:
[Выделить все]
(defun C:OTV (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 centr_ang Rdug D D_nom)
	
(defun dtr (centr_ang)			
    (* pi (/ centr_ang 180.0))
)

	(setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))


	(initget 7)																	
		(setq centr_ang (getint (strcat "\nЦентральный угол отвода 45/60/90:")))
	(initget 7)

		(setq D_nom (getdist (strcat "\nДиаметр отвода 40/50/65/80/100/125/150/200/250/300:")))
(cond

	((= D_nom 40) (setq D 45 Rdug 60))
	((= D_nom 50) (setq D 57 Rdug 75))
	((= D_nom 65) (setq D 76 Rdug 100))
	((= D_nom 80) (setq D 89 Rdug 120))
	((= D_nom 100) (setq D 108 Rdug 150))
	((= D_nom 125) (setq D 133 Rdug 190))
	((= D_nom 150) (setq D 159 Rdug 225))
	((= D_nom 200) (setq D 219 Rdug 300))
	((= D_nom 250) (setq D 273 Rdug 375))
	((= D_nom 300) (setq D 325 Rdug 450))
)

  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))							
  (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))					
  (setq Dist2 (* 2 Rdug (sin (* 0.5 (dtr centr_ang)))))				
  (setq Dist3 (* 2 Rn (sin (* 0.5 (dtr centr_ang)))))	
				

	(initget 7)  
  		(setq pt1 (getpoint "\nУкажите начальную точку отвода:"))
	(initget 7)
		(setq ang (getorient pt1 "\nУкажите точку на оси трубы:"))

  (setq pt2 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq pt3 (polar pt2 (+ ang (* 0.5 (dtr centr_ang))) Dist1))
  (setq pt4 (polar pt1 (+ ang (* 0.5 (dtr centr_ang))) Dist2))
  (setq pt6 (polar pt1 (+ ang (* 1.5 pi)) (* 0.5 D))) 
  (setq pt5 (polar pt6 (+ ang (* 0.5 (dtr centr_ang))) Dist3))
  
  (setq pt7 (polar pt1 (+ ang pi) 5))
  (setq pt8 (polar pt4 (+ ang (dtr centr_ang)) 5))
  
(Command "_.Pline" pt1 pt7 "")
  
(Command "_.PLine" pt6 pt2 "")
(Command "_.Pline" pt3 pt5 "")
(Command "_.Arc" pt2 "_E" pt3 "_R" Rv "")
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn "")	 
(Command "_.Arc" pt1 "_E" pt4 "_R" Rdug "")
  
(setq Arc (entlast))
(Command "_.Change" Arc "" "_P" "_la" "Center" "" "")
  
(Command "_.Pline" pt4 pt8 "")
  
(Command "_.Mirror")
  
(setvar "OSMODE" osm)
  
(princ)
)
Этот код у меня работает. (Command "_.Arc" pt2 "_E" pt3 "_R" Rv "") - этим я рисую внутреннюю часть отвода. (Command "_.Change" Arc "" "_P" "_la" "Center" "" "")- этим хочу осевую получить, хотелось бы на 0 слой, но не знаю как вытащить штрихпунктирную линию. Концовка кода как-то не так получается, вроде есть запрос на зеркало в ком строке, но нужно вручную выбирать все объекты для отражения. Еще бы хотелось, чтобы после отрисовки был запрос на повтор. Прилагаю картинку
Миниатюры
Нажмите на изображение для увеличения
Название: Отвод.jpg
Просмотров: 119
Размер:	64.2 Кб
ID:	17560  
Рyslan вне форума  
 
Непрочитано 18.03.2009, 18:55
#172
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Я хочу увидеть описение ПОШАГОВЫХ действий
Типа
Цитата:
(Command "_.Arc" ;_Запустили команду ARC
pt2 ;_Точка начала дуги
"_E" ;_Опция END (конечна точка)
pt3;_конечная точка дуги
"_R" ;_Опция радиус
Rv ;_Задали радиус
"" ;_КАКОГО ... ЖМЕМ ENTER?
)
У тебя в этих командах ошибки. Я хочу чтобы ты их нашел м понял как пользоваться command
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 18.03.2009, 20:45
#173
Рyslan


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


VVA жму enter по аналогии с обычным рисованием. это лишнее? без enter почему то код не работает. может всетаки оставить кавычки?

Последний раз редактировалось Рyslan, 18.03.2009 в 20:58.
Рyslan вне форума  
 
Непрочитано 18.03.2009, 21:15
#174
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Разве рисуя дугу руками после указания радиуса ты жмешь Enter? (Enter которым ты подтверждаешь ввод радиуса в командной строке не считать)
Что здесь не работает?
Код:
[Выделить все]
(setq pt2 '(0 0 0))
(setq pt3 '(10 0 0))
(setq Rv 10)
(Command "_.Arc" ;_Запустили команду ARC
pt2 ;_Точка начала дуги
"_E" ;_Опция END (конечна точка)
pt3;_конечная точка дуги
"_R" ;_Опция радиус
Rv ;_Задали радиус
)
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 19.03.2009, 11:14
#175
Рyslan


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


убрал кавычки, все работает. разобрался с осевой. ну а как остальные мои вопросы?
Рyslan вне форума  
 
Непрочитано 19.03.2009, 11:49
#176
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Молодца
Код:
[Выделить все]
(defun c:otvod (/ P1 P2 P3 P4 P5 P6)
(setq osm (getvar "OSMODE"))
(setvar "osmode" (logior osm 16384))
(initget 7 "45 60 90") ;_ Делаем опции
(setq centr_ang (getangle "\nЦентральный угол отвода [45/60/90]:")) ;_getangle запрашивает сразу угол
(initget 7 "45 50 65 80 100") ;_ Делаем опции
(setq D_nom (getkword  "\nУсловный диаметр отвода [40/50/65/80/100]:"));_getkword ограничивает запрос вариантов отводов
(setq D_nom (atoi D_nom))  
(cond
	((= D_nom 40 ) (setq D 45 Rdug 60))				
	((= D_nom 50 ) (setq D 57 Rdug 75))
	((= D_nom 65) (setq D 76 Rdug 100))
	((= D_nom 80) (setq D 89 Rdug 120))
	((= D_nom 100) (setq D 108 Rdug 150))
	(t  (setq D 108 Rdug 150))
)
  
 (initget 7)
	(setq P1 (getpoint "\nУкажите начальную точку отвода:"))
(initget 7)
	(setq ang (getorient P1 "\nУкажите точку на оси трубы:"))
	
				
  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))

  (setq Dist1 (* 2 Rv (sin (* 0.5 centr_ang)))) ;;;Было (angtof "centr_ang")
  (setq Dist2 (* 2 Rdug (sin (* 0.5 centr_ang))));;; Найди разницу
  (setq Dist3 (* 2 Rn (sin (* 0.5 centr_ang)))) ;;;

  (setq P2 (polar P1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq P3 (polar P2 (+ ang (* 0.5 centr_ang)) Dist1))
  (setq P4 (polar P1 (+ ang (* 0.5 centr_ang)) Dist2))
  (setq P6 (polar P1 (+ ang (* 1.5 pi)) (* 0.5 D)))
  (setq P5 (polar P6 (+ ang (* 0.5 centr_ang)) Dist3))
  
  (Command "_.PLine" P6 P2 "_cl")
  (Command "_.Pline" P3 P5 "_cl")
  (Command "_.Arc" P2 "_E" P3 "_R" Rv )
  (Command "_.Arc" P6 "_E" P5 "_R" Rn )
  	 
  (Command "_.Arc" P1 "_E" P4 "_R" Rdug ) ;_С этим ты разобрался
(setq Arc (entlast))
(if (null(tblsearch "layer" "Center"));_Проверяем ниличие слоя и создаем его при отсутствии
  (command "_.-LAYER" "_N" "Center"))
(Command "_.Change" Arc "" "_P" "_la" "Center" "") ;_С этим ты разобрался
(setvar "OSMODE" osm)
(princ)								
)
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 19.03.2009, 17:36
#177
Рyslan


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


VVA,спасибо! Посмотри теперь мой код, работает. Вот только в конце Mirror не знаю как приспособить, отвод отрисовывается, потом зеракало передается в комстроку, запрашивается выделение объектов, можно все выделить и отзеркалить...но как то не особо красиво. Еще в моем коде плечики в 5 мм отрисовываются, для привязки. Они у меня рисуются отдельно от осевой (пробовал через Pline и дальше используя опции дуги, не получилось).
Код:
[Выделить все]
(defun C:OTV (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 centr_ang Rdug D D_nom)
	
(defun dtr (centr_ang)			
    (* pi (/ centr_ang 180.0))
)

	(setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))


	(initget 7)																	
		(setq centr_ang (getint (strcat "\nЦентральный угол отвода 45/60/90:")))
	(initget 7)

		(setq D_nom (getdist (strcat "\nДиаметр отвода 40/50/65/80/100/125/150/200/250/300:")))
(cond

	((= D_nom 40) (setq D 45 Rdug 60))
	((= D_nom 50) (setq D 57 Rdug 75))
	((= D_nom 65) (setq D 76 Rdug 100))
	((= D_nom 80) (setq D 89 Rdug 120))
	((= D_nom 100) (setq D 108 Rdug 150))
	((= D_nom 125) (setq D 133 Rdug 190))
	((= D_nom 150) (setq D 159 Rdug 225))
	((= D_nom 200) (setq D 219 Rdug 300))
	((= D_nom 250) (setq D 273 Rdug 375))
	((= D_nom 300) (setq D 325 Rdug 450))
)

  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))							
  (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))					
  (setq Dist2 (* 2 Rdug (sin (* 0.5 (dtr centr_ang)))))				
  (setq Dist3 (* 2 Rn (sin (* 0.5 (dtr centr_ang)))))	
				

	(initget 7)  
  		(setq pt1 (getpoint "\nУкажите начальную точку отвода:"))
	(initget 7)
		(setq ang (getorient pt1 "\nУкажите точку на оси трубы:"))

  (setq pt2 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq pt3 (polar pt2 (+ ang (* 0.5 (dtr centr_ang))) Dist1))
  (setq pt4 (polar pt1 (+ ang (* 0.5 (dtr centr_ang))) Dist2))
  (setq pt6 (polar pt1 (+ ang (* 1.5 pi)) (* 0.5 D))) 
  (setq pt5 (polar pt6 (+ ang (* 0.5 (dtr centr_ang))) Dist3))
  
  (setq pt7 (polar pt1 (+ ang pi) 5))
  (setq pt8 (polar pt4 (+ ang (dtr centr_ang)) 5))
  
(Command "_.Pline" pt7 pt1 "")
(Command "_.Arc" pt1 "_E" pt4 "_R" Rdug)
(setq Arc (entlast))
(Command "_.Change" Arc "" "_p" "_lt" "ACAD_ISO04W100" "")
(Command "_.Pline" pt4 pt8 "") 
(Command "_.PLine" pt6 pt2 "")
(Command "_.Pline" pt3 pt5 "")
(Command "_.Arc" pt2 "_E" pt3 "_R" Rv)
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)	 

  
(Command "_.Mirror")
  
(setvar "OSMODE" osm)
  
(princ)
)
Буду твой код изучать, спасибо! Я тут установил себе прокат Кондрата В. Красиво сделано. Захотелось себе аналогичное сделать. Трубы, фланцы, переходы, отводы, тройники, задвижки-все в диалоговом окне. Код для трубы уже сделал (наверное не очень правильный, но работает). Неплохая штука была бы для технологов.

Последний раз редактировалось Рyslan, 19.03.2009 в 17:50.
Рyslan вне форума  
 
Непрочитано 21.03.2009, 08:53
#178
Рyslan


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


как создать повтор кода, без повторного ввода информации? как осуществить выбор всех примитивов в коде?
Рyslan вне форума  
 
Непрочитано 21.03.2009, 09:01
#179
Кулик Алексей aka kpblc
Moderator

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


Рyslan, ты вопросы задай по-человечески
Что значит "повтор кода"? И "выбор всех примитивов" - это ты про (ssget "_X") или еще про что-то?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2009, 09:31
#180
Рyslan


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


Привет. Повтор кода- ну вот загрузил программу, ввел данные, она отрисовала что-то....потом хотелось бы как в Акаде, нажал пробел и повтор команды, еще пробел повтор данных и отрисовка опять того же. ssget "X" я пробовал, выделяет все объекты в рисунке, а мне нужно только то что программа нарисовала (например для Mirror ну не получается у меня отзеркалить)
Рyslan вне форума  
 
Непрочитано 21.03.2009, 09:51
#181
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Собирай по мере отрисовки примитивы в набор
Код:
[Выделить все]
(setq ss nil ss (ssadd)) ;_Создаем пустой набор
(Command "_.Pline" pt7 pt1 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt1 "_E" pt4 "_R" Rdug)
(setq Arc (entlast))
(Command "_.Change" Arc "" "_p" "_lt" "ACAD_ISO04W100" "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Pline" pt4 pt8 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.PLine" pt6 pt2 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Pline" pt3 pt5 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt2 "_E" pt3 "_R" Rv)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный притив в набор
(Command "_.Mirror" SS "" pause pause "_N")
На будущее, чтобы не наступить в конце концов на грабли №1 (OSMODE)
При отрисовке командными методати перед указанием точки временно отключай привязку с помощью опции "_non"
Вместо
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)
Нужно
(Command "_.Arc" "_non" pt6 "_E" "_non" pt5 "_R" Rn)
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 21.03.2009, 10:15
#182
Рyslan


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


VVA а ведь вначале мы отключаем все привязки. разве обязательно добавлять non?
(setq pt9 (polar pt1 (+ ang 0) 5)) -->добавил точку, для зеркала--> (Command "_.Mirror" SS "" pt1 pt9) -->сразу сама выбирает ось отражения, остается только выбрать Да\Нет VVA а pause pause что делает? для выхода из программы в комстроку?

Последний раз редактировалось Рyslan, 21.03.2009 в 10:39.
Рyslan вне форума  
 
Непрочитано 21.03.2009, 11:00
#183
Кулик Алексей aka kpblc
Moderator

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


1. Оформляй вызов как (defun c:мойкод() <...>), тогда его можно будет повторно вызвать на выполнение как обычную команду.
2. Либо перед выполнением mirror запоминай последний примитив через (entlast), либо используй (vla-mirror) или что-то такого типа. Сейчас заняться не могу, - уезжаю.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2009, 11:26
#184
Рyslan


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


Повторный вызов команды работает, только вот данные опять нужно вводить. А если тоже самое нужно нарисовать...хотя маловероятно что за отводом будет следовать такой же отвод. Наверное это лишнее будет. Хватит и просто повтора команды
Рyslan вне форума  
 
Непрочитано 21.03.2009, 11:29
#185
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Рyslan Посмотреть сообщение
VVA а ведь вначале мы отключаем все привязки. разве обязательно добавлять non?
Если обрабатываешь OSMODE то не нужно.
Цитата:
(setq pt9 (polar pt1 (+ ang 0) 5)) -->добавил точку, для зеркала--> (Command "_.Mirror" SS "" pt1 pt9) -->сразу сама выбирает ось отражения, остается только выбрать Да\Нет
Правильнее (Command "_.Mirror" SS "" pt1 pt9 pause)
Цитата:
VVA а pause pause что делает? для выхода из программы в комстроку?
Приостанавливает выполнение команды и ждет действия пользователя на текущий запрос.
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 21.03.2009, 12:28
#186
Рyslan


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


VVA, спасибо!
Рyslan вне форума  
 
Непрочитано 25.03.2009, 17:23
#187
Рyslan


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


Всем привет! Есть вопрос. При рисовании вправо ортогонально, программа не работает. Автокад пишет- Укажите направление: <Орто вкл>
Значение должно быть положительным и ненулевым.
Как от этого избавиться? Еще вопрос, функция cond только одно условие выполняет?

((= D_nom 80) (= d_nom 65) (setq D1 89 D2 76 L 80 H 70))
два диаметра D1 и D2 возьмет?

Последний раз редактировалось Рyslan, 25.03.2009 в 17:30.
Рyslan вне форума  
 
Непрочитано 25.03.2009, 21:05
#188
Кулик Алексей aka kpblc
Moderator

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


Избавиться? По идее надо код перелопачивать. Начинается самое интересное
cond "возьмет", если ты сравнивать будешь корректно. Функция and где?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.03.2009, 21:30
#189
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Автокад пишет- Укажите направление: <Орто вкл>
Значение должно быть положительным и ненулевым
См. ключи initget перед запросом
Цитата:
Еще вопрос, функция cond только одно условие выполняет?
Да. Но если нужно проверить несколько значений, то можно воспользоваться логическими операторами OR или AND или их сочетанием.
Код:
[Выделить все]
((or (= D_nom 80) (= d_nom 65)) (setq D1 89 D2 76 L 80 H 70))
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 28.03.2009, 16:41
#190
Рyslan


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


Код:
[Выделить все]
(cond
((= D_nom 80) and (= d_nom 80) (setq D1 89 D2 76 L 80 H 70))
((= D_nom 80) and (= d_nom 65) (setq D1 89 D2 76 L 80 H 70))
)
VVA, Алексей, вот так правильно? Только не работает ни черта.
вычисляется только первое выражение. VVA, поменял (initget 7) на (initget 1) - теперь все работает, спасибо за подсказку.
Рyslan вне форума  
 
Непрочитано 28.03.2009, 17:18
#191
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, "Это же вам не лезгинка, а твист!" (С) Это не бейсик, а LISP.

and - это функция, и надо вызывать функцию and:
Код:
[Выделить все]
(and (= D_nom 80)  
       (= d_nom 80)
)
VVA ведь показал в #189 функцию or, а ты захотел and. Так же и надо писать - в виде вызова функции and.

Но D_nom и d_nom для LISP - это одна и та же переменная. К регистру он нечувствителен. Сравнения бессмысленные. Думай над логикой. Правильно называй переменные.
ShaggyDoc вне форума  
 
Непрочитано 28.03.2009, 20:15
#192
Рyslan


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


Верно про Бэйсик подметили Кстати, была мысль про регистр. Попробую еще.

Код:
[Выделить все]
(cond
((and (= Dim_bol 40) (= Dim_mal 40)) (setq D1 45 D2 45 L 40 H 40))
((and (= Dim_bol 50) (= Dim_mal 40)) (setq D1 57 D2 45 L 50 H 45))
((and (= Dim_bol 65) (= Dim_mal 50)) (setq D1 76 D2 57 L 65 H 60))
((and (= Dim_bol 65) (= Dim_mal 40)) (setq D1 76 D2 45 L 65 H 60))
)
Вот теперь вроде как работает. А с OR - вычислял некорректно. Спасибо VVA, Shaggy_Doc

Последний раз редактировалось Рyslan, 28.03.2009 в 21:25.
Рyslan вне форума  
 
Непрочитано 03.04.2009, 18:06
#193
Рyslan


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


---

Последний раз редактировалось Рyslan, 04.04.2009 в 22:41.
Рyslan вне форума  
 
Непрочитано 06.04.2009, 11:25
#194
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Это один из примеров построения отвода трубопровода в "Классическом" AutoLisp-е. В данном примере ПСК привязывается к торцу трубы и вычисление координат точек значительно упрощается. Отзеркаливание в данном случае не требуется.

С уважением, Евгений Дегтярев.


Код:
[Выделить все]
(defun C:OTV (/ p1 p2 p3 p4 p5 p6 cen pp1 pp2 centr_ang D Rdug Rv Rn D_nominal)
  (setq osm (getvar "OSMODE"))
  (setvar "osmode" 0)
  (setq centr_ang (getint "\nЦентральный угол отвода 45/60/90:"))
  (setq centr_ang (* pi (/ centr_ang 180.0)))
  (setq D_nominal (getint "\nУсловный диаметр отвода 40/50/65/80/100:"))
  (cond
    ((= D_nominal 40)
     (setq D 45
    Rdug 60
     )
    )
    ((= D_nominal 50)
     (setq D 75
    Rdug 75
     )
    )
    ((= D_nominal 65)
     (setq D 76
    Rdug 100
     )
    )
    ((= D_nominal 80)
     (setq D 89
    Rdug 120
     )
    )
    ((= D_nominal 100)
     (setq D 108
    Rdug 150
     )
    )
  )
  (setq Rv (- Rdug (* 0.5 D)))
  (setq Rn (+ Rdug (* 0.5 D)))
  (setvar "osmode" 32)
  (setq P1 (getpoint "\nУкажите начальную точку отвода:"))
  (setvar "osmode" 512)
  (setq pp1
  (getpoint P1
     "\nУкажите точку на торце трубы в направлении отвода:"
  )
  )
  (setvar "osmode" 0)
  (setq pp2
  (getpoint P1
     "\nУкажите точку в направлении трубопровода:"
  )
  )
  (command "_ucs" "_3" p1 pp1 pp2)
  (setq p1 '(0 0 0))
  (setq cen (polar p1 0.0 Rdug))
  (setq p2 (polar p1 0.0 (* 0.5 D)))
  (setq p4 (polar p1 pi (* 0.5 D)))
  (setq p3 (polar cen (- pi centr_ang) Rv))
  (setq p5 (polar cen (- pi centr_ang) Rn))
  (setq p6 (polar cen (- pi centr_ang) Rdug))
  (Command "_line" P4 P2 "")
  (Command "_line" P3 P5 "")
  (Command "_Arc" P3 "_ce" cen p2)
  (Command "_Arc" P5 "_ce" cen P4)
  (Command "_Arc" P6 "_ce" cen P1)
  (setvar "OSMODE" osm)
  (command "_ucs" "_w")
  (princ)
)

Последний раз редактировалось E-degtyarev, 06.04.2009 в 11:34.
E-degtyarev вне форума  
 
Непрочитано 06.04.2009, 21:16
#195
Рyslan


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


Евгений Дегтярев.; ошибка: неверно сформирванный список на входе
Рyslan вне форума  
 
Непрочитано 06.04.2009, 22:13
#196
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Рyslan, Аккуратней скопируй код из #194. У меня работает
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 06.04.2009, 22:41
#197
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
ПСК привязывается к торцу трубы и вычисление координат точек значительно упрощается
Точки прекрасно высчитываются в любой ПСК ("машина-то железная"), не надо пытаться упрощать вычисления "дерганием" Автокада н по делу.

Не надо приучаться переносить ПСК программно, да ещё на таких детских задачах. Это дорога для множества ошибок в будущем.
ShaggyDoc вне форума  
 
Непрочитано 07.04.2009, 09:06
#198
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Уважаемый ShaggyDoc.
Буду Вам очень признателен, если вы продемонстрируете, как в данной ситуации выполнить вычисление координат точек в мировой ПСК, чтобы
получить полный аналог по функционалу моего лиспа.

Евгений Дегтярев.
E-degtyarev вне форума  
 
Непрочитано 07.04.2009, 10:00
#199
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Сообщение от E-degtyarev Посмотреть сообщение
Уважаемый ShaggyDoc.
Буду Вам очень признателен, если вы продемонстрируете, как в данной ситуации выполнить вычисление координат точек в мировой ПСК, чтобы
получить полный аналог по функционалу моего лиспа.

Евгений Дегтярев.
Разбираться нет времени. Но для чего ПСК переносите? Чтобы при вызове polar задать "нулевую" точку и "нулевой" угол. А что мешает указать реальную точку (координаты известны)

Код:
[Выделить все]
(setq cen (polar p1 (angle p1 pp1) Rdug))
Здесь p1 не '(0 0 0), а полученная в
Код:
[Выделить все]
(setq P1 (getpoint "\nУкажите начальную точку отвода:"))
И так далее. И МСК здесь совершенно не при чем. Вы же рисуете функцией command, а точки получаете через getpoint - всё в текущей ПСК.

А вот последнее (command "_ucs" "_w") не надо вообще делать. До рисования могла быть установлена не мировая ПСК, а ту вдруг принудительный непрошеный возврат. В крайнем случае - (command "_ucs" "_p")

Точки в МСК надо передавать при рисовании объектными методами. Тогда надо использовать функцию trans.

И, очень редко, при построении 3Д-моделей, может действительно потребоваться временный перенос ПСК, но делать его надо чрезвычайно осторожно.
ShaggyDoc вне форума  
 
Непрочитано 07.04.2009, 11:31
#200
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


E-degtyarev, + ShaggyDoc, Если все же решился что-то делать с ПСК, то отслеживай и изменяй на 0 значение переменной UCSFOLLOW, а то можно получить хороший rock'n'roll на экране
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 07.04.2009, 12:12
#201
Рyslan


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


а мне мои лиспы нравятся
Код:
[Выделить все]
;;; Программа отрисовки крутоизогнутых отводов по ГОСТ 17375-2001


(defun C:OTV (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 centr_ang Rdug D D_nom)
	
(defun dtr (centr_ang)			
    (* pi (/ centr_ang 180.0))
)

	(setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))


	(initget 1)																	
		(setq centr_ang (getint (strcat "\nЦентральный угол отвода 45/60/90:")))
	(initget 1)

		(setq D_nom (getdist (strcat "\nДиаметр отвода 40/50/65/80/100/125/150/200/250/300:")))
(cond

	((= D_nom 40) (setq D 45 Rdug 60))
	((= D_nom 50) (setq D 57 Rdug 75))
	((= D_nom 65) (setq D 76 Rdug 100))
	((= D_nom 80) (setq D 89 Rdug 120))
	((= D_nom 100) (setq D 108 Rdug 150))
	((= D_nom 125) (setq D 133 Rdug 190))
	((= D_nom 150) (setq D 159 Rdug 225))
	((= D_nom 200) (setq D 219 Rdug 300))
	((= D_nom 250) (setq D 273 Rdug 375))
	((= D_nom 300) (setq D 325 Rdug 450))
)

  (setq Rv (- Rdug (* 0.5 D)))							
  (setq Rn (+ Rdug (* 0.5 D)))							
  (setq Dist1 (* 2 Rv (sin (* 0.5 (dtr centr_ang)))))					
  (setq Dist2 (* 2 Rdug (sin (* 0.5 (dtr centr_ang)))))				
  (setq Dist3 (* 2 Rn (sin (* 0.5 (dtr centr_ang)))))	
				

	(initget 1)  
  		(setq pt1 (getpoint "\nУкажите начальную точку отвода:"))
	(initget 1)
		(setq ang (getorient pt1 "\nУкажите точку на оси трубы:"))

  (setq pt2 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D)))			
  (setq pt3 (polar pt2 (+ ang (* 0.5 (dtr centr_ang))) Dist1))
  (setq pt4 (polar pt1 (+ ang (* 0.5 (dtr centr_ang))) Dist2))
  (setq pt6 (polar pt1 (+ ang (* 1.5 pi)) (* 0.5 D))) 
  (setq pt5 (polar pt6 (+ ang (* 0.5 (dtr centr_ang))) Dist3))
  
  (setq pt7 (polar pt1 (+ ang pi) 5))
  (setq pt8 (polar pt4 (+ ang (dtr centr_ang)) 5))
  (setq pt9 (polar pt1 (+ ang 0) 5))
(setq ss nil ss (ssadd)) ;_Создаем пустой набор	

(Command "_.Pline" pt7 pt1 "_A" "_R" Rdug pt4 "_L" pt8 "")
(setq Pline (entlast))
(Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
(Command "_.PLine" pt6 pt2 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
(Command "_.Arc" pt2 "_E" pt3 "_R" Rv)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
(Command "_.Pline" pt3 pt5 "")
(ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
(Command "_.Arc" pt6 "_E" pt5 "_R" Rn)
(ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Mirror" SS "" pt1 pt9 pause)
(setvar "OSMODE" osm)
  
(princ)	
)
Код:
[Выделить все]
;;; Программа отрисовки тройников по ГОСТ 17376-2001
;;; Пример условного обозначения: Тройник 325х273 ГОСТ 17376-2001

(defun C:tee (/ pt0 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt15 D_bol D_mal L H)
  (setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))

	(initget 1)
  		(setq D_bol (getint (strcat "\nВыберите диаметр 40/50/65/80/100/125/150/200/250/300/350/400: ")))
  
	(initget 1)
  		(setq D_mal (getint (strcat "\nВыберите диаметр 40/50/65/80/100/125/150/200/250/300/350/400: ")))

	
 (cond

	((and (= D_bol 40) (= D_mal 40)) (setq D1 45 D2 45 L 40 H 40))

	((and (= D_bol 50) (= D_mal 50)) (setq D1 57 D2 57 L 50 H 45))
	((and (= D_bol 50) (= D_mal 40)) (setq D1 57 D2 45 L 50 H 45))

	((and (= D_bol 65) (= D_mal 65)) (setq D1 76 D2 76 L 65 H 60))
	((and (= D_bol 65) (= D_mal 50)) (setq D1 76 D2 57 L 65 H 60))
	((and (= D_bol 65) (= D_mal 40)) (setq D1 76 D2 45 L 65 H 60))

	((and (= D_bol 80) (= D_mal 80)) (setq D1 89 D2 89 L 80 H 70))
	((and (= D_bol 80) (= D_mal 65)) (setq D1 89 D2 76 L 80 H 70))
	((and (= D_bol 80) (= D_mal 50)) (setq D1 89 D2 57 L 80 H 70))

	((and (= D_bol 100) (= D_mal 100)) (setq D1 108 D2 108 L 100 H 80))
	((and (= D_bol 100) (= D_mal 80)) (setq D1 108 D2 89 L 100 H 80))
	((and (= D_bol 100) (= D_mal 65)) (setq D1 108 D2 76 L 100 H 80))

	((and (= D_bol 125) (= D_mal 125)) (setq D1 133 D2 133 L 110 H 95))
	((and (= D_bol 125) (= D_mal 100)) (setq D1 133 D2 108 L 110 H 95))
	((and (= D_bol 125) (= D_mal 80)) (setq D1 133 D2 89 L 110 H 95))

	(and ((= D_bol 150) (= D_mal 125)) (setq D1 159 D2 133 L 130 H 110))
	(and ((= D_bol 150) (= D_mal 100)) (setq D1 159 D2 108 L 130 H 110))
	(and ((= D_bol 150) (= D_mal 80)) (setq D1 159 D2 89 L 130 H 110))

	((and (= D_bol 200) (= D_mal 150)) (setq D1 219 D2 159 L 160 H 140))
	((and (= D_bol 200) (= D_mal 125)) (setq D1 219 D2 133 L 160 H 140))
	((and (= D_bol 200) (= D_mal 100)) (setq D1 219 D2 108 L 160 H 140))

	((and (= D_bol 250) (= D_mal 200)) (setq D1 273 D2 219 L 190 H 175))
	((and (= D_bol 250) (= D_mal 150)) (setq D1 273 D2 159 L 190 H 175))
	((and (= D_bol 250) (= D_mal 125)) (setq D1 273 D2 133 L 190 H 175))
	
	((and (= D_bol 300) (= D_mal 250)) (setq D1 325 D2 273 L 220 H 200))
	((and (= D_bol 300) (= D_mal 200)) (setq D1 325 D2 219 L 220 H 200))
	((and (= D_bol 300) (= D_mal 150)) (setq D1 325 D2 159 L 220 H 200))

	((and (= D_bol 350) (= D_mal 300)) (setq D1 377 D2 325 L 240 H 225))
	((and (= D_bol 350) (= D_mal 250)) (setq D1 377 D2 273 L 240 H 225))
	((and (= D_bol 350) (= D_mal 200)) (setq D1 377 D2 219 L 240 H 225))
	
	((and (= D_bol 400) (= D_mal 350)) (setq D1 426 D2 377 L 270 H 250))
	((and (= D_bol 400) (= D_mal 300)) (setq D1 426 D2 325 L 270 H 250))
	((and (= D_bol 400) (= D_mal 250)) (setq D1 426 D2 273 L 270 H 250))
	
)

	(initget 1)
		(setq pt1 (getpoint "\nУкажите начальную точку:"))
  	(initget 1)
		(setq ang (getorient pt1 "\nУкажите направление:"))
  
(setq Dist1 (- L (* 0.5 D2)))
(setq Dist2 (- H (* 0.5 D1)))
  (setq pt0 (polar pt1 (+ ang pi) 5))
  (setq pt2 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D1)))
  (setq pt3 (polar pt2 (+ ang 0) Dist1))
  (setq pt4 (polar pt3 (+ ang (* 0.5 pi)) Dist2))
  (setq pt5 (polar pt4 (+ ang 0) (* 0.5 D2)))
(setq pt6 (polar pt5 (+ ang (* 0.5 pi)) 5))
  (setq pt7 (polar pt4 (+ ang 0) D2))
  (setq pt8 (polar pt7 (+ ang (* 1.5 pi)) Dist2))
  (setq pt9 (polar pt8 (+ ang 0) Dist1))
  (setq pt10 (polar pt9 (+ ang (* 1.5 pi)) (* 0.5 D1)))
  (setq pt11 (polar pt10 (+ ang 0) 5))
  (setq pt12 (polar pt9 (+ ang (* 1.5 pi)) D1))
  (setq pt13 (polar pt5 (+ ang (* 1.5 pi)) H))
  (setq pt14 (polar pt12 (+ ang pi) (* 2 L)))
  (setq pt15 (polar pt1 (+ ang 0) 5))
  (setq ss nil ss (ssadd)) ;_Создаем пустой набор
  (Command "_.Pline" pt0 pt11 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt6 pt13 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Change" SS "" "_p" "_lt" "ACAD_ISO04W100" "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt1 pt2 pt3 pt4 pt7 pt8 pt9 pt12 pt14 "_c")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
 
  (Command "_.Mirror" SS "" pt1 pt15 pause)
  (setvar "OSMODE" osm)
  
(princ)
)
Код:
[Выделить все]
(defun C:truba (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 D L)

	(setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))
	(initget 1)
		(setq D (getdist "\nУкажите диаметр трубы: "))
	(initget 1)
		(setq L (getdist "\nУкажите длину трубы: "))
	(initget 1)
		(setq pt1 (getpoint "\nНачальная точка: "))
	(initget 1)
		(setq ang (getorient pt1 "\nНаправление трубы: "))
	

  (setq pt2 (polar pt1 (+ ang 0) L))
  (setq pt3 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D)))
  (setq pt4 (polar pt2 (+ ang (* 0.5 pi)) (* 0.5 D)))
  (setq pt5 (polar pt1 (+ ang pi) 5))
  (setq pt6 (polar pt2 (+ ang 0) 5))
  (setq pt7 (polar pt1 (+ ang (* 1.5 pi)) (* 0.5 D)))
  (setq pt8 (polar pt2 (+ ang (* 1.5 pi)) (* 0.5 D)))
  (Command "_.Pline" pt5 pt6 "")
  (setq Pline (entlast))
  (Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
   (Command "_.Pline" pt1 pt3 pt4 pt2 pt8 pt7 "_c")

  (setvar "OSMODE" osm)
  
(princ)
)
Код:
[Выделить все]
;;; Программа отрисовки условного изображения клиновой задвижки
;;; Все размеры соответствуют каталогу Благовещенского арматурного завода за февраль 2007 года

(defun C:valve (/ pt0 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt18 pt19 pt20 pt21 pt22 PN Dy D Dn Dm L bfl bv H H1 Dsht ang)
  (setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))

	(initget 1 "16 25 40 63 160")
		(setq PN (getint (strcat "\nВыберите условное давление задвижки [16/25/40/63/160/]: ")))
		
  	(initget 1 "50 80 100 110 125 150 200 250")
  		(setq Dy (getkword (strcat "\nВыберите условный диаметр задвижки [50/80/100/110/125/150/200/250]: ")))
  		(setq Dy (atoi Dy))
(cond


;;; Задвижка клиновая ЗКЛ2 PN 16 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

    	((and (= PN 16) (= Dy 50)) (setq D 160 Dn 58 Dm 76 L 180 bfl 13 bv 14 H 325 H1 425 H4 45 Dsht 240))
	((and (= PN 16) (= Dy 80)) (setq D 195 Dn 90 Dm 110 L 210 bfl 17 bv 17 H 450 H1 550 H4 50 Dsht 240))
	((and (= PN 16) (= Dy 100)) (setq D 215 Dn 110 Dm 130 L 230 bfl 17 bv 17 H 450 H1 550 H4 50 Dsht 240))
	((and (= PN 16) (= Dy 110)) (setq D 215 Dn 110 Dm 130 L 229 bfl 17 bv 17 H 534 H1 654 H4 50 Dsht 320))
	((and (= PN 16) (= Dy 125)) (setq D 245 Dn 135 Dm 156 L 255 bfl 19 bv 19 H 550 H1 685 H4 57 Dsht 400))
	((and (= PN 16) (= Dy 150)) (setq D 280 Dn 161 Dm 180 L 280 bfl 19 bv 21 H 575 H1 710 H4 57 Dsht 400))
	((and (= PN 16) (= Dy 200)) (setq D 335 Dn 222 Dm 240 L 330 bfl 21 bv 23 H 860 H1 1082 H4 58 Dsht 400))
	((and (= PN 16) (= Dy 250)) (setq D 405 Dn 278 Dm 292 L 330 bfl 23 bv 27 H 1054 H1 1343 H4 65 Dsht 400))

;;; Задвижка клиновая ЗКЛ2 PN 25 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 25) (= Dy 50)) (setq D 100 Dn 58 Dm 76 L 216 bfl 17 bv 17 H 345 H1 425 H4 45 Dsht 240))
	((and (= PN 25) (= Dy 80)) (setq D 195 Dn 90 Dm 110 L 283 bfl 19 bv 19 H 445 H1 540 H4 52 Dsht 320))
	((and (= PN 25) (= Dy 100)) (setq D 230 Dn 110 Dm 132 L 305 bfl 21 bv 21 H 534 H1 654 H4 45 Dsht 320))
	((and (= PN 25) (= Dy 150)) (setq D 300 Dn 161 Dm 186 L 403 bfl 25 bv 27 H 755 H1 925 H4 68 Dsht 400))
	((and (= PN 25) (= Dy 200)) (setq D 360 Dn 222 Dm 245 L 400 bfl 27 bv 31 H 860 H1 1082 H4 75 Dsht 400))
	((and (= PN 25) (= Dy 250)) (setq D 425 Dn 278 Dm 300 L 450 bfl 29 bv 33 H 1048 H1 1338 H4 75 Dsht 540))

;;; Задвижка клиновая ЗКЛ2 PN 40 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 40) (= Dy 50)) (setq D 160 Dn 58 Dm 76 L 216 bfl 17 bv 17 H 345 H1 425 H4 45 Dsht 240))
	((and (= PN 40) (= Dy 80)) (setq D 195 Dn 90 Dm 112 L 283 bfl 21 bv 19 H 448 H1 540 H4 55 Dsht 320))
	((and (= PN 40) (= Dy 100)) (setq D 230 Dn 110 Dm 138 L 350 bfl 23 bv 21 H 465 H1 566 H4 65 Dsht 320))
	((and (= PN 40) (= Dy 110)) (setq D 230 Dn 110 Dm 130 L 305 bfl 23 bv 21 H 534 H1 654 H4 65 Dsht 320))
	
	((and (= PN 40) (= Dy 150)) (setq D 300 Dn 161 Dm 186 L 403 bfl 27 bv 27 H 755 H1 925 H4 68 Dsht 400))
	((and (= PN 40) (= Dy 200)) (setq D 375 Dn 222 Dm 250 L 419 bfl 35 bv 35 H 865 H1 1080 H4 85 Dsht 400))
	((and (= PN 40) (= Dy 250)) (setq D 445 Dn 278 Dm 310 L 457 bfl 39 bv 39 H 865 H1 1343 H4 65 Dsht 560))

;;; Задвижка клиновая ЗКЛ2 PN 63 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 63) (= Dy 50)) (setq D 175 Dn 58 Dm 86 L 270 bfl 23 bv 23 H 425 H1 500 H4 67 Dsht 320))
	((and (= PN 63) (= Dy 80)) (setq D 210 Dn 90 Dm 120 L 321 bfl 27 bv 27 H 450 H1 545 H4 72 Dsht 400))
	((and (= PN 63) (= Dy 100)) (setq D 250 Dn 110 Dm 140 L 359 bfl 29 bv 29 H 611 H1 736 H4 77 Dsht 400))
	((and (= PN 63) (= Dy 150)) (setq D 340 Dn 161 Dm 206 L 447 bfl 35 bv 35 H 612 H1 765 H4 105 Dsht 400))
	((and (= PN 63) (= Dy 200)) (setq D 405 Dn 222 Dm 264 L 536 bfl 41 bv 41 H 864 H1 1081 H4 110 Dsht 600))

;;; Задвижка клиновая ЗКЛ2 PN 160 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 160) (= Dy 50)) (setq D 195 Dn 58 Dm 86 L 300 bfl 27 bv 27 H 515 H1 590 H4 75 Dsht 400))
	((and (= PN 160) (= Dy 80)) (setq D 230 Dn 90 Dm 124 L 390 bfl 33 bv 33 H 550 H1 640 H4 90 Dsht 400))
	((and (= PN 160) (= Dy 100)) (setq D 265 Dn 110 Dm 146 L 450 bfl 37 bv 37 H 540 H1 630 H4 100 Dsht 400))
	((and (= PN 160) (= Dy 150)) (setq D 350 Dn 161 Dm 214 L 559 bfl 47 bv 47 H 700 H1 845 H4 130 Dsht 600))
	((and (= PN 160) (= Dy 200)) (setq D 430 Dn 222 Dm 276 L 660 bfl 57 bv 57 H 1069 H1 1628 H4 145 Dsht 930))
	
      )

     (initget 1)
     (setq pt1 (getpoint "\nУкажите начальную точку: "))
     (initget 1)
     (setq ang (getorient pt1 "\nУкажите точку на оси трубы: "))

     ;;; Задаем координаты точек
     (setq Dist1 (- H4 bfl))
     (setq Dist2 (+ H4 (* 0.5 L)))
     (setq Dist3 (+ (* 2 H4) L))

     (setq pt0 (polar pt1 (+ ang pi) 5))
     (setq pt2 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 Dn)))
     (setq pt3 (polar pt1 (+ ang 0) Dist1))
     (setq pt4 (polar pt3 (+ ang (* 0.5 pi)) (* 0.5 Dm)))
     (setq pt5 (polar pt3 (+ ang (* 0.5 pi)) (* 0.5 D)))
     (setq pt6 (polar pt5 (+ ang 0) bfl))
     (setq pt7 (polar pt6 (+ ang 0) bv))
     (setq pt8 (polar pt1 (+ ang 0) Dist2))
     (setq pt9 (polar pt8 (+ ang (* 0.5 pi)) H))
     (setq pt10 (polar pt8 (+ ang (* 0.5 pi)) H1))
     (setq pt11 (polar pt9 (+ ang pi) (* 0.5 Dsht)))
     (setq pt12 (polar pt1 (+ ang 0) Dist3))
     (setq pt13 (polar pt12 (+ ang 0) 5))
     (setq pt14 (polar pt1 (+ ang 0) 5))
     (setq pt18 (polar pt7 (+ ang (* 1.5 pi)) D))
     (setq pt19 (polar pt6 (+ ang (* 1.5 pi)) D))
     (setq pt20 (polar pt5 (+ ang (* 1.5 pi)) D))
     (setq pt21 (polar pt4 (+ ang (* 1.5 pi)) Dm))
     (setq pt22 (polar pt2 (+ ang (* 1.5 pi)) Dn))

     (setq ss nil ss (ssadd)) ;_Создаем пустой набор
  (Command "_.Pline" pt1 pt2 pt4 pt5 pt7 pt8 pt18 pt20 pt21 pt22 "_c")
    (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt6 pt19 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt4 pt21 "")
   (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt6 pt19 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt7 pt18 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt6 pt9 pt11 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Mirror" SS "" pt8 pt10 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt8 pt10 "")
    (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
 
  (Command "_.Pline" pt0 pt13 "")
  (setq Pline (entlast))
  (Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Mirror" SS "" pt1 pt14 pause)
       (setvar "OSMODE" osm)
  
(princ)
)
Код:
[Выделить все]
;;; Программа отрисовки условного изображения клиновой задвижки сбоку
;;; Все размеры соответствуют каталогу Благовещенского арматурного завода за февраль 2007 года

(defun C:test (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 D Dn Dm Dsht H H1)
  (setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))
(initget 1 "16 25 40 63 160")
		(setq PN (getint (strcat "\nВыберите условное давление задвижки [16/25/40/63/160/]: ")))
		
  	(initget 1 "50 80 100 110 125 150 200 250")
  		(setq Dy (getkword (strcat "\nВыберите условный диаметр задвижки [50/80/100/110/125/150/200/250]: ")))
  		(setq Dy (atoi Dy))
  (cond


;;; Задвижка клиновая ЗКЛ2 PN 16 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

    	((and (= PN 16) (= Dy 50)) (setq D 160 Dn 58 Dm 76 L 180 bfl 13 bv 14 H 325 H1 425 H4 45 Dsht 240))
	((and (= PN 16) (= Dy 80)) (setq D 195 Dn 90 Dm 110 L 210 bfl 17 bv 17 H 450 H1 550 H4 50 Dsht 240))
	((and (= PN 16) (= Dy 100)) (setq D 215 Dn 110 Dm 130 L 230 bfl 17 bv 17 H 450 H1 550 H4 50 Dsht 240))
	((and (= PN 16) (= Dy 110)) (setq D 215 Dn 110 Dm 130 L 229 bfl 17 bv 17 H 534 H1 654 H4 50 Dsht 320))
	((and (= PN 16) (= Dy 125)) (setq D 245 Dn 135 Dm 156 L 255 bfl 19 bv 19 H 550 H1 685 H4 57 Dsht 400))
	((and (= PN 16) (= Dy 150)) (setq D 280 Dn 161 Dm 180 L 280 bfl 19 bv 21 H 575 H1 710 H4 57 Dsht 400))
	((and (= PN 16) (= Dy 200)) (setq D 335 Dn 222 Dm 240 L 330 bfl 21 bv 23 H 860 H1 1082 H4 58 Dsht 400))
	((and (= PN 16) (= Dy 250)) (setq D 405 Dn 278 Dm 292 L 330 bfl 23 bv 27 H 1054 H1 1343 H4 65 Dsht 400))

;;; Задвижка клиновая ЗКЛ2 PN 25 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 25) (= Dy 50)) (setq D 100 Dn 58 Dm 76 L 216 bfl 17 bv 17 H 345 H1 425 H4 45 Dsht 240))
	((and (= PN 25) (= Dy 80)) (setq D 195 Dn 90 Dm 110 L 283 bfl 19 bv 19 H 445 H1 540 H4 52 Dsht 320))
	((and (= PN 25) (= Dy 100)) (setq D 230 Dn 110 Dm 132 L 305 bfl 21 bv 21 H 534 H1 654 H4 45 Dsht 320))
	((and (= PN 25) (= Dy 150)) (setq D 300 Dn 161 Dm 186 L 403 bfl 25 bv 27 H 755 H1 925 H4 68 Dsht 400))
	((and (= PN 25) (= Dy 200)) (setq D 360 Dn 222 Dm 245 L 400 bfl 27 bv 31 H 860 H1 1082 H4 75 Dsht 400))
	((and (= PN 25) (= Dy 250)) (setq D 425 Dn 278 Dm 300 L 450 bfl 29 bv 33 H 1048 H1 1338 H4 75 Dsht 540))

;;; Задвижка клиновая ЗКЛ2 PN 40 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 40) (= Dy 50)) (setq D 160 Dn 58 Dm 76 L 216 bfl 17 bv 17 H 345 H1 425 H4 45 Dsht 240))
	((and (= PN 40) (= Dy 80)) (setq D 195 Dn 90 Dm 112 L 283 bfl 21 bv 19 H 448 H1 540 H4 55 Dsht 320))
	((and (= PN 40) (= Dy 100)) (setq D 230 Dn 110 Dm 138 L 350 bfl 23 bv 21 H 465 H1 566 H4 65 Dsht 320))
	((and (= PN 40) (= Dy 110)) (setq D 230 Dn 110 Dm 130 L 305 bfl 23 bv 21 H 534 H1 654 H4 65 Dsht 320))
	
	((and (= PN 40) (= Dy 150)) (setq D 300 Dn 161 Dm 186 L 403 bfl 27 bv 27 H 755 H1 925 H4 68 Dsht 400))
	((and (= PN 40) (= Dy 200)) (setq D 375 Dn 222 Dm 250 L 419 bfl 35 bv 35 H 865 H1 1080 H4 85 Dsht 400))
	((and (= PN 40) (= Dy 250)) (setq D 445 Dn 278 Dm 310 L 457 bfl 39 bv 39 H 865 H1 1343 H4 65 Dsht 560))

;;; Задвижка клиновая ЗКЛ2 PN 63 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 63) (= Dy 50)) (setq D 175 Dn 58 Dm 86 L 270 bfl 23 bv 23 H 425 H1 500 H4 67 Dsht 320))
	((and (= PN 63) (= Dy 80)) (setq D 210 Dn 90 Dm 120 L 321 bfl 27 bv 27 H 450 H1 545 H4 72 Dsht 400))
	((and (= PN 63) (= Dy 100)) (setq D 250 Dn 110 Dm 140 L 359 bfl 29 bv 29 H 611 H1 736 H4 77 Dsht 400))
	((and (= PN 63) (= Dy 150)) (setq D 340 Dn 161 Dm 206 L 447 bfl 35 bv 35 H 612 H1 765 H4 105 Dsht 400))
	((and (= PN 63) (= Dy 200)) (setq D 405 Dn 222 Dm 264 L 536 bfl 41 bv 41 H 864 H1 1081 H4 110 Dsht 600))

;;; Задвижка клиновая ЗКЛ2 PN 160 кг/см2. Строительные длины по ГОСТ 3706-83. Присоединительные размеры по ГОСТ 12815-80, исполнение 1

	((and (= PN 160) (= Dy 50)) (setq D 195 Dn 58 Dm 86 L 300 bfl 27 bv 27 H 515 H1 590 H4 75 Dsht 400))
	((and (= PN 160) (= Dy 80)) (setq D 230 Dn 90 Dm 124 L 390 bfl 33 bv 33 H 550 H1 640 H4 90 Dsht 400))
	((and (= PN 160) (= Dy 100)) (setq D 265 Dn 110 Dm 146 L 450 bfl 37 bv 37 H 540 H1 630 H4 100 Dsht 400))
	((and (= PN 160) (= Dy 150)) (setq D 350 Dn 161 Dm 214 L 559 bfl 47 bv 47 H 700 H1 845 H4 130 Dsht 600))
	((and (= PN 160) (= Dy 200)) (setq D 430 Dn 222 Dm 276 L 660 bfl 57 bv 57 H 1069 H1 1628 H4 145 Dsht 930))
	)
  (initget 1)
     (setq pt1 (getpoint "\nТочка вставки: "))

  (setq pt2 (polar pt1 (* 0.5 pi) (* 0.5 D)))
  (setq pt3 (polar pt1 (* 0.5 pi) H))
  (setq pt4 (polar pt1 (* 0.5 pi) H1))
  (setq pt5 (polar pt3 pi (* 0.5 Dsht)))
  (setq pt6 (polar pt5 0 Dsht))
  (setq pt7 (polar pt1 pi (+ 5 (* 0.5 D))))
  (setq pt8 (polar pt1 0 (+ 5 (* 0.5 D))))
  (setq pt9 (polar pt1 (* 1.5 pi) (+ 5 (* 0.5 D))))
  (setq pt10 (polar pt1 pi (* 0.5 D)))
  (setq pt11 (polar pt1 0 (* 0.5 D)))
  (setq ss nil ss (ssadd)) ;_Создаем пустой набор
  (Command "_Circle" pt1 "_D" Dn)
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_Circle" pt1 "_D" Dm)
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_Circle" pt1 "_D" D)
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt2 pt4 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt5 pt6 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt7 pt8 "")
  (setq Pline (entlast))
  (Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt2 pt9 "")
  (setq Pline (entlast))
  (Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_.Pline" pt10 pt3 pt11 "")
  (ssadd (entlast) SS) ;_Добавляем последний отрисованный примитив в набор
  (Command "_Rotate" SS "" pt1 pause)
         (setvar "OSMODE" osm)
  
(princ)
)
Код:
[Выделить все]
;;;Программа условной отрисовки переходов по ГОСТ 17378-2001

(defun C:pipe (/ pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 D_bol D_mal D2 L ang)

	(setq osm (getvar "OSMODE"))
	(setvar "osmode" (logior osm 16384))
	(initget 1)
  	(setq D_bol (getint (strcat "\nВыберите диаметр 20/25/40/50/65/80/100/125/150/200/250/300/350/400: ")))
  
	(initget 1)
  	(setq D_mal (getint (strcat "\nВыберите диаметр 20/25/40/50/65/80/100/125/150/200/250/300/350/400: ")))

(cond

	((and (= D_bol 40) (= D_mal 25)) (setq D1 45 D2 32 L 30))
	((and (= D_bol 40) (= D_mal 20)) (setq D1 45 D2 25 L 30))

	((and (= D_bol 50) (= D_mal 40)) (setq D1 57 D2 45 L 60))
	((and (= D_bol 50) (= D_mal 32)) (setq D1 57 D2 38 L 45))
	((and (= D_bol 50) (= D_mal 25)) (setq D1 57 D2 32 L 45))
	((and (= D_bol 50) (= D_mal 20)) (setq D1 57 D2 25 L 45))

	((and (= D_bol 65) (= D_mal 50)) (setq D1 76 D2 57 L 70))
	((and (= D_bol 65) (= D_mal 40)) (setq D1 76 D2 45 L 70))
	((and (= D_bol 65) (= D_mal 32)) (setq D1 76 D2 38 L 55))

	((and (= D_bol 80) (= D_mal 65)) (setq D1 89 D2 76 L 75))
	((and (= D_bol 80) (= D_mal 50)) (setq D1 89 D2 57 L 75))
	((and (= D_bol 80) (= D_mal 40)) (setq D1 89 D2 45 L 75))

	((and (= D_bol 100) (= D_mal 80)) (setq D1 108 D2 89 L 80))
	((and (= D_bol 100) (= D_mal 65)) (setq D1 108 D2 76 L 80))
	((and (= D_bol 100) (= D_mal 50)) (setq D1 108 D2 57 L 80))

	((and (= D_bol 125) (= D_mal 100)) (setq D1 133 D2 108 L 100))
	((and (= D_bol 125) (= D_mal 80)) (setq D1 133 D2 89 L 100))
	((and (= D_bol 125) (= D_mal 65)) (setq D1 133 D2 76 L 100))
	((and (= D_bol 125) (= D_mal 50)) (setq D1 133 D2 57 L 100))
	
	((and (= D_bol 150) (= D_mal 125)) (setq D1 159 D2 133 L 130))
	((and (= D_bol 150) (= D_mal 100)) (setq D1 159 D2 108 L 130))
	((and (= D_bol 150) (= D_mal 80)) (setq D1 159 D2 89 L 130))
	((and (= D_bol 150) (= D_mal 65)) (setq D1 159 D2 76 L 75))
	((and (= D_bol 150) (= D_mal 50)) (setq D1 159 D2 57 L 75))

	((and (= D_bol 200) (= D_mal 150)) (setq D1 219 D2 159 L 140))
	((and (= D_bol 200) (= D_mal 125)) (setq D1 219 D2 133 L 140))
	((and (= D_bol 200) (= D_mal 100)) (setq D1 219 D2 108 L 95))
	((and (= D_bol 200) (= D_mal 80)) (setq D1 219 D2 89 L 95))
	((and (= D_bol 200) (= D_mal 65)) (setq D1 219 D2 76 L 95))
	((and (= D_bol 200) (= D_mal 50)) (setq D1 219 D2 57 L 95))

	((and (= D_bol 250) (= D_mal 200)) (setq D1 273 D2 219 L 180))
	((and (= D_bol 250) (= D_mal 150)) (setq D1 273 D2 159 L 180))
	((and (= D_bol 250) (= D_mal 125)) (setq D1 273 D2 133 L 140))
	((and (= D_bol 250) (= D_mal 100)) (setq D1 273 D2 108 L 140))
	
	((and (= D_bol 300) (= D_mal 250)) (setq D1 325 D2 273 L 180))
	((and (= D_bol 300) (= D_mal 200)) (setq D1 325 D2 219 L 180))
	((and (= D_bol 300) (= D_mal 150)) (setq D1 325 D2 159 L 140))
	((and (= D_bol 300) (= D_mal 125)) (setq D1 325 D2 133 L 140))
	((and (= D_bol 300) (= D_mal 100)) (setq D1 325 D2 108 L 140))

	((and (= D_bol 350) (= D_mal 300)) (setq D1 377 D2 325 L 220))
	((and (= D_bol 350) (= D_mal 250)) (setq D1 377 D2 273 L 220))
	((and (= D_bol 350) (= D_mal 200)) (setq D1 377 D2 219 L 220))
	((and (= D_bol 350) (= D_mal 150)) (setq D1 377 D2 159 L 220))
	
	((and (= D_bol 400) (= D_mal 350)) (setq D1 426 D2 377 L 220))
	((and (= D_bol 400) (= D_mal 300)) (setq D1 426 D2 325 L 220))
	((and (= D_bol 400) (= D_mal 250)) (setq D1 426 D2 273 L 220))
	((and (= D_bol 400) (= D_mal 150)) (setq D1 426 D2 159 L 220))

	((and (= D_bol 500) (= D_mal 400)) (setq D1 530 D2 426 L 300))
	((and (= D_bol 500) (= D_mal 350)) (setq D1 530 D2 377 L 300))
	
)

	(initget 1)
		(setq pt1 (getpoint "\nНачальная точка перехода:"))
	(initget 1)
		(setq ang (getorient pt1 "\nНаправление перехода:"))
  

  (setq pt2 (polar pt1 (+ ang 0) L))
  (setq pt3 (polar pt1 (+ ang (* 0.5 pi)) (* 0.5 D1)))
  (setq pt4 (polar pt2 (+ ang (* 0.5 pi)) (* 0.5 D2)))
  (setq pt5 (polar pt1 (+ ang pi) 5))
  (setq pt6 (polar pt2 (+ ang 0) 5))
  (setq pt7 (polar pt1 (+ ang (* 1.5 pi)) (* 0.5 D1)))
  (setq pt8 (polar pt2 (+ ang (* 1.5 pi)) (* 0.5 D2)))
  (setq pt9 (polar pt1 (+ ang 0) (* 0.5 L)))
 

  (Command "_.Pline" pt5 pt6 "")
  (setq Pline (entlast))
  (Command "_.Change" Pline "" "_p" "_lt" "ACAD_ISO04W100" "")
   (Command "_.Pline" pt1 pt3 pt4 pt2 pt8 pt7 "_c")


  (setvar "OSMODE" osm)
  
(princ)
)

Последний раз редактировалось Рyslan, 07.04.2009 в 12:24.
Рyslan вне форума  
 
Непрочитано 07.04.2009, 22:53
#202
Кулик Алексей aka kpblc
Moderator

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


В команде tee есть ошибка (сам ищи). И в pipe тоже.
P.S. Я бы делал совершенно не так, если честно. Данные - в отдельный ini- или xml-файл; предварительное чтение данных оттуда; динамическое формирование запросов в ком.строке или dcl-диалога; по максимуму обработку ошибок ввода (нажатия Esc); вставку готовых частей как блоков ну и так далее.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.04.2009, 12:04
#203
Рyslan


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


Привет Алексей! Да, сегодня как раз в tee и напоролся на ошибку, там у диаметров 150 скобки лишние. Про трубу, тоже какой то косяк был. буду смотреть. Если честно. щас рисую обвязку, много в лиспах начинает не нравится. Над ними еще работать и работать
Рyslan вне форума  
 
Непрочитано 08.04.2009, 12:42
#204
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
Над ними еще работать и работать
работать, работать, работать, работать. А потом всё исправлять.

Пока ты только сам с программой работаешь - ошибок не видишь. Потому что делаешь всё правильно, как надо. А ты дай программу "обезьяне с гранатой", и если она у нее будет работать, то в первом приближении (версия 0.1) может считаться сделанной. Потом доводка до версии 1.0.
ShaggyDoc вне форума  
 
Непрочитано 08.04.2009, 12:49
#205
Кулик Алексей aka kpblc
Moderator

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


Проблема в том, что зачастую "обезяной с гранатой" приходится быть самому программисту
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.04.2009, 13:47
#206
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Значит надо делать "всё не так". Озвереть.

Спрашивают "Выбери диаметр", а ты жмешь ESC, Enter, тычешь мышкой в меню.

Спрашивают "Направление перехода", а ты не там, где всегда указываешь, а в противоположном месте.

То включишь привязки, то отключишь. То ПСК изменишь. То перспективный вид сделаешь.
ShaggyDoc вне форума  
 
Непрочитано 08.04.2009, 14:09
#207
Кулик Алексей aka kpblc
Moderator

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


Offtop: По моему личному опыту (подсчет очень приблизительный):
время на постановку задачи (полностью проработанное ТЗ) - 15%
время на написание кода - 5%
время на отладку и отлов всяких ситуевин - 80%.
Короче, все веселье впереди А когда понадобится код расширять - то тут вместо 80% пойдет уже 90%; вместо 5% - 7%.
- Почему Землю Господь создал за 6 дней?
- А ему не надо было беспокоиться о совместимости с предыдущими версиями
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.04.2009, 14:51
#208
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


И еще 200% на написание документации. "Да больше" (С)
ShaggyDoc вне форума  
 
Непрочитано 08.04.2009, 18:25
#209
Рyslan


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


даа, жуть. сегодня весь день рисовал обвязку. постоянно пользовался своими лиспами. 5 мм кусочек оси, то рисует, то нет. если рисовать на уже существующей оси, то не работает отражение. пишет, точки оси отражения не должны совпадать.
Рyslan вне форума  
 
Непрочитано 14.04.2009, 12:21
#210
Рyslan


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


всем привет! а как блок создать программно? с помощью Command это возможно?
Рyslan вне форума  
 
Непрочитано 14.04.2009, 12:53
#211
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Можно. Команда _-BLOCK
__________________
Как использовать код на Лиспе читаем здесь
VVA на форуме  
 
Непрочитано 15.04.2009, 18:06
#212
Рyslan


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


не получается. кстати тут подумал, как имя задвижке присвоить, ведь на каждое давление и диаметр свое имя блока должно быть
Рyslan вне форума  
 
Непрочитано 15.04.2009, 19:39
#213
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Цитата:
ведь на каждое давление и диаметр свое имя блока должно быть
С чего бы? Имя должно быть у изображения, но не обязательно на каждый параметр.

Одного условного изображения "бабочкой" достаточно на все виды задвижек. Если изображение детальное, реалистичное, да ещё в 3D - тогда может быть. Ну и делай блок с именем, например "30с76нж_100-64" или еще как-то. С учётом, что в чужом чертеже может быть такой же блок, но с другим ихображением.
ShaggyDoc вне форума  
 
Непрочитано 15.04.2009, 19:57
#214
Рyslan


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


а если я буду использовать две задвижки PN16 DN50 и PN25 DN80, например? а в лиспе у меня 1 имя прописано на блок. они не подерутся?
Рyslan вне форума  
 
Непрочитано 16.04.2009, 06:03
#215
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Чего они драться будут? Как это "имя прописано на блок"? Нарисовано, что-ли, как на настоящей задвижке? Тогда делай много блоков, если это "нарисовано" зачем-то нужно.

Сначала определись, какие именно блоки хочешь иметь - условные или реальные изображения. И вообще почитай - что такое блоки.
ShaggyDoc вне форума  
 
Непрочитано 16.04.2009, 18:35
#216
Рyslan


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
е.
P.S. Я бы делал совершенно не так, если честно. Данные - в отдельный ini- или xml-файл; предварительное чтение данных оттуда; динамическое формирование запросов в ком.строке или dcl-диалога; по максимуму обработку ошибок ввода (нажатия Esc); вставку готовых частей как блоков ну и так далее.
ShaggyDoc - вот для чего мне блоки. Чтобы отрисованная лиспом изображение (переход, задвижка и так далее) в чертеже была единым целым, то есть блоком
Рyslan вне форума  
 
Непрочитано 16.04.2009, 20:07
#217
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Рyslan, для чего блоки - всем понятно. Это не вопрос. Можно блоки, можно программы использовать. Можно изображения, нарисованные программно, превращать в блоки автоматически. "Единое целое" - это не обязательно блок. Это может быть и группа.

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

Блок условного обозначения задвижки можно сделать единичным и вставлять его и в схемы, и в "трехлинейные" чертежи. Но если надо реалистичное изображение, с реальной длиной и высотой шпинделя, то уже единичным блоком не обойтись - длина и высота у задвижек разных диаметров непропорционально соотносятся. Придется делать на все диаметры. А если надо ещё чтобы визуально различались стальные и чугунные задвижки, то придется делать блоки задвижек и разных диаметров, и разных моделей.

Вот почему я советую определиться какие именно блоки хочешь иметь.
ShaggyDoc вне форума  
 
Непрочитано 16.04.2009, 20:27
#218
Рyslan


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


я просто хочу, чтобы после рисования чего-либо моим лиспом, изображение было единым целым. "Можно изображения, нарисованные программно, превращать в блоки автоматически" вот это хочу

Последний раз редактировалось Рyslan, 16.04.2009 в 20:32.
Рyslan вне форума  
 
Непрочитано 17.04.2009, 06:56
#219
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,107


Ну так превращай. Потом будешь спрашивать как "разпревратить".

Можно и командой. Только помести созданные примитивы на слой 0. Да другие свойства дай ByBlock. Но не у всех примитивов, а с умом. Например, у отвода вес осевой линии целесообразно сделать Lwdefault, а у кромок - ByBlock. Цвет всех примитивов сделать ByBlock.

Да правильно точку вставки назначить. Да правильно, до включения в блок, примитивы разместить. Да включить куда-то блок в файл. Да сделать, чтобы во время рисования определение блока внедрилось в текущий чертеж. Да как-то позаботиться о выборе блоков (желательно визуальном) или "вычислении" их имен.

Делов-то. "Уж если я чего задумал - выпью обязательно" (С).
ShaggyDoc вне форума  
 
Непрочитано 17.04.2009, 18:15
#220
Рyslan


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


мдаа, делов-то....
Рyslan вне форума  
 
Непрочитано 17.04.2009, 20:42
#221
Кулик Алексей aka kpblc
Moderator

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


Лично я остерегаюсь использовать LwDefault где бы то ни было... Слишком высока вероятность, что найдется местный кулибин, который установит значение в 211 системной переменной и все построения накроются медным тазом. Дырявым.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.04.2009, 12:38
#222
Рyslan


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


До LwDefault еще блоки как-то сделать нужно. Кстати у нас в институте цветозависимая печать.
Рyslan вне форума  
 
Непрочитано 19.04.2009, 20:57
#223
Кулик Алексей aka kpblc
Moderator

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


Есть 3 варианта.
1. Отрисовывать, постоянно добавляя примитивы в SelectionSet, а затем через комаду _.-block преобразовать отрисованные примитивы в блок.
2. Через entmakex создать начало описания блока; через entmakex, например, создавать примитивы; не забыть создать описание "окончания" блока. См.в справке описание BLOCK.
3. Использовать ActiveX-методы создания блока и добавлять примитивы "прямо в описание блока".
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.04.2009, 21:56
#224
Рyslan


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


по первому варианту пытаюсь сделать. пока не получается
Рyslan вне форума  
 
Непрочитано 20.04.2009, 22:48
#225
Кулик Алексей aka kpblc
Moderator

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


Я (если честно) предпочитаю именно последний
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума