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

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

Lisp. Как выбрать три последних не удаленных примитива на чертеже используя ent*

Ответ
Поиск в этой теме
Непрочитано 24.06.2012, 15:45 #1
Lisp. Как выбрать три последних не удаленных примитива на чертеже используя ent*
Yura Agafonov
 
Инженер.
 
Minsk
Регистрация: 04.05.2012
Сообщений: 95

Как выбрать три последних не удаленных примитива на чертеже используя ent*?
Просмотров: 3403
 
Непрочитано 24.06.2012, 15:52
#2
Дима_

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


Пробежать entnext'ом с самого начала, удалить и восстановить 3 entlast'а, если под чертежом подразумевается только модель - последние 3 элемента соответствующей коллекции.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 24.06.2012, 16:13
#3
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Сложновато. Студенты не поймут. Может есть более изящный способ?
Yura Agafonov вне форума  
 
Непрочитано 24.06.2012, 16:23
#4
Дима_

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


Запоминать при создании.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 24.06.2012, 16:31
#5
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


вот для лучшего понимания
Код:
[Выделить все]
     (command "_line"
	     pt0
	     (polar pt0 (angtof "90") SizeWindow)
	     ""
	     "_copy"
	     (entlast)
	     ""
	     pt0
	     (polar pt0 (angtof "0") (/ SizeWindow 2))
	     "_copy"
	     (entlast)
	     ""
	     pt0
	     (polar pt0 (angtof "0") (/ SizeWindow 2))
	     "_mirror"
	     ;необходимо выбрать три последнии линии для отзеркаливания
    )
Цитата:
Запоминать при создании.
хороший вариант
Yura Agafonov вне форума  
 
Непрочитано 24.06.2012, 16:39
#6
Дима_

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
Сложновато. Студенты не поймут. Может есть более изящный способ?
Вы им преподаете??
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 24.06.2012, 17:17
#7
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Цитата:
Вы им преподаете??
нет. попросил знакомый препод написать программу для лабораторной, которая бы демонстрировала работу функции command.

вот если интересно что у меня пока получается. программа рисует дом))) осталось исправить функцию DrawWindow чтобы она в режиме command отзеркаливала три линии. Что странно - каждый раз работает по разному, то все ок, то - линии куда то улетают. Не привык я в command рисовать(((

Код:
[Выделить все]
 
(defun c:lab1 ( / NumberOfFloors NumberOfWindows BasePoint SizeWindow StoreyHeight) 

  (setq	NumberOfFloors
	 (getint "\n 1) Введите количество этажей в вашем дома : ")
  )
  (setq	NumberOfWindows
	 (getint "\n 2) Введите количество окон на этаже : ")
  )
  (setq	BasePoint
	 (getpoint "\n 3) Укажите базовую точку : ")
  )

  (setq	SizeWindow   1200		;Размер окна, мм
	StoreyHeight 3300		;Высота этажа, мм
  )

  (setq BuildingHeight (* NumberOfFloors StoreyHeight))
  (setq BuildingWidth (+ (* NumberOfWindows SizeWindow 2) SizeWindow))
  
  (defun DrawWindow (pt0)
    (command "_line"
	     pt0
	     (polar pt0 (angtof "90") SizeWindow)
	     ""
	     "_copy"
	     (entlast)
	     ""
	     pt0
	     (polar pt0 (angtof "0") (/ SizeWindow 2))     
	     "_copy"
	     (entlast)
	     ""
	     pt0
	     (polar pt0 (angtof "0") (/ SizeWindow 2))
	     ""
					;"_mirror"
					;необходимо выбрать три последнии линии для отзеркаливания
    )
  )

  (defun DrawArrayWindows (pt0)
    (repeat NumberOfWindows
      (DrawWindow pt0)
      (setq pt0 (polar pt0 (angtof "0") (* 2 SizeWindow)))
    )
  )

  (command "_line"
	   BasePoint
	   (polar BasePoint (angtof "90") BuildingHeight)
	   ""
	   "_copy"
	   (entlast)
	   ""
	   BasePoint
	   (polar BasePoint (angtof "0") BuildingWidth)
	   ""
	   "_line"
	   BasePoint
	   (polar BasePoint (angtof "0") BuildingWidth)
	   ""
	   "_copy"
	   (entlast)
	   ""
	   BasePoint
	   (polar BasePoint (angtof "90") BuildingHeight)
  )

  (setq BasePoint (polar BasePoint (angtof "0") SizeWindow))
  (setq	BasePoint (polar BasePoint
			 (angtof "90")
			 (- (* SizeWindow 0.5) (* StoreyHeight 0.5))
		  )
  )

  (repeat NumberOfFloors
    (DrawArrayWindows BasePoint)
    (setq BasePoint (polar BasePoint (angtof "90") StoreyHeight))
  )
)

Последний раз редактировалось Yura Agafonov, 24.06.2012 в 17:24.
Yura Agafonov вне форума  
 
Непрочитано 24.06.2012, 17:30
#8
Дима_

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
нет. попросил знакомый препод написать программу для лабораторной, которая бы демонстрировала работу функции command... Что странно - каждый раз работает по разному, то все ок, то - линии куда то улетают. Не привык я в command рисовать(((
Да уж...
Ищи темы со словом привязка.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.06.2012, 17:53
#9
gomer

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
попросил знакомый препод написать программу для лабораторной, которая бы демонстрировала работу функции command.
Вот они откуда руки из ж... растут
Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
(angtof "0")
Это вообще веселуха...
ну и где определение локальной? pt0 Или
Цитата:
«Вы наверняка заметили, что код не компилируется»…
gomer вне форума  
 
Автор темы   Непрочитано 24.06.2012, 18:49
#10
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Цитата:
Цитата:
«Вы наверняка заметили, что код не компилируется»…
как так?
а как отзеркалить идей нет?
Цитата:
Сообщение от Yura Agafonov
(angtof "0")
Это вообще веселуха...
ну в качестве демонстрации работы функции...
Yura Agafonov вне форума  
 
Непрочитано 24.06.2012, 18:53
#11
VVA

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


Yura Agafonov,
Как пример
Код:
[Выделить все]
  (defun DrawWindow (pt0 / line1 line2 line3)
    (command "_line"
	     "_non" ;_Отключаем привязки на момент запроса точки
	     pt0
	     "_non" ;_Отключаем привязки на момент запроса точки
	     (polar pt0
		    (* 0.5 PI) ;_Я думаю студенты с числом ПИ знакомы
		    SizeWindow
		    )
	     "" ;_Это аналог клавиши Enter
    )
    (setq line1 (entlast)) ;_Запоминаем линию 1 в переменной
    (command  "_copy"
	     line1
	     ""
	     "_non" ;_Отключаем привязки на момент запроса точки 
	     pt0
             "_non" ;_Отключаем привязки на момент запроса точки	      
	     (polar pt0 0 (/ SizeWindow 2))
	      ""
	      )
    (setq line2 (entlast)) ;_Запоминаем линию 2 в переменной
    (command "_copy"
	     line2
	     ""
	     "_non" ;_Отключаем привязки на момент запроса точки
	     pt0
	     "_non" ;_Отключаем привязки на момент запроса точки
	     (polar pt0 0 (/ SizeWindow 2))
	     ""
	     )
    (setq line3 (entlast)) ;_Запоминаем линию 3 в переменной
    (command "_MIRROR" line1 line2 line3 ""
	     "_non" ;_Отключаем привязки на момент запроса точки
	     (getpoint "\n 1-я точка оси отзеркаливания: ")
    	     "_non" ;_Отключаем привязки на момент запроса точки
	     (getpoint (getvar "LASTPOINT") "\n 2-я точка оси отзеркаливания: ")
	     "_N" ;_Не удалять объекты
	     )
    )
Помимо простого запоминания в переменных можно запоминать отрисованные примитивы в списке / наборе. Но сейчас для студентов это не главное. Главное научить их понимать как всю последовательность того, что они рисуют "ручками" записать в комманд. Самое первое на что они наступят, а ты уже наступил
Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
каждый раз работает по разному, то все ок, то - линии куда то улетают
- это привязки или грабли №1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.06.2012, 19:31
#12
gomer

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
ну в качестве демонстрации работы функции...
вот так они и писать будут, как им расскажут, я вот только сейчас pt0 нашел, а она вообще не нужна по сути и две функции в функции тоже не нужны! Нарисовали окно, создали блок, применили массив, все
gomer вне форума  
 
Автор темы   Непрочитано 25.06.2012, 21:41
#13
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Цитата:
вот так они и писать будут, как им расскажут, я вот только сейчас pt0 нашел, а она вообще не нужна по сути и две функции в функции тоже не нужны! Нарисовали окно, создали блок, применили массив, все
создать блок и применить к нему массив, используя функцию command... ну не знаю, студенты не профильные, мне кажется это перегруз. Пускай лучше посмотрят как создавать и использовать функции, это более важные навыки.
Yura Agafonov вне форума  
 
Непрочитано 25.06.2012, 22:11
#14
gomer

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
создать блок и применить к нему массив, используя функцию command... ну не знаю, студенты не профильные, мне кажется это перегруз. Пускай лучше посмотрят как создавать и использовать функции, это более важные навыки.
ну и пускай неучами ходят, важнее не как, а зачем, то, что у вас, - это не пример создания функций, ибо что где куда сразу не разберешь, плюс к тому же последующий геморрой с палочками окон обеспечен, а блок создать не так уж сложно, да и еще, у вас 3 палочки, соответственно три переменных, а если палочек не 3, а тысяча? Ну и вопрос на засыпку: какие 3 функции отсутствуют у вас в коде?
gomer вне форума  
 
Автор темы   Непрочитано 25.06.2012, 22:36
#15
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Цитата:
Ну и вопрос на засыпку: какие 3 функции отсутствуют у вас в коде?
Если честно, то я сильно над этой программой не загонялся, руки писали - мозг отдыхал. Вот так это и происходит)))
Yura Agafonov вне форума  
 
Непрочитано 26.06.2012, 00:13
#16
gomer

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


Цитата:
Сообщение от Yura Agafonov Посмотреть сообщение
Если честно, то я сильно над этой программой не загонялся, руки писали - мозг отдыхал. Вот так это и происходит)))
ну, вот поэтому она и не работает, почему то-окна уходят под пол
gomer вне форума  
 
Автор темы   Непрочитано 27.06.2012, 00:57
#17
Yura Agafonov

Инженер.
 
Регистрация: 04.05.2012
Minsk
Сообщений: 95
Отправить сообщение для Yura Agafonov с помощью Skype™


Цитата:
ну, вот поэтому она и не работает, почему то-окна уходят под пол
было дело)))
Код:
[Выделить все]
 

(defun c:lab1 ()

  (setq	NumberOfFloors
	 (getint "\n 1) Введите количество этажей в вашем дома : ")
  )
  (setq	NumberOfWindows
	 (getint "\n 2) Введите количество окон на этаже : ")
  )
  (setq	BasePoint
	 (getpoint "\n 3) Укажите  : ")
  )


  (setq	SizeWindow   1200		;Размер окна, мм
	StoreyHeight 3300		;Высота этажа, мм
  )

  (setq BuildingHeight (* NumberOfFloors StoreyHeight))
  (setq BuildingWidth (+ (* NumberOfWindows SizeWindow 2) SizeWindow))

  (defun DrawWindow (pt0 / line1 line2 line3)
    (command "_line"
	     "_non"
	     pt0
	     "_non"
	     (polar pt0 (angtof "90") SizeWindow)
	     ""
    )
    (setq line1 (entlast))
    (command
      "_copy"
      line1
      ""
      "_non"
      pt0
      "_non"
      (polar pt0 (angtof "0") (/ SizeWindow 2))
      ""
    )
    (setq line2 (entlast))
    (command "_copy"
	     line2
	     ""
	     "_non"
	     pt0
	     "_non"
	     (polar pt0 (angtof "0") (/ SizeWindow 2))
	     ""
    )
    (setq line3 (entlast))
    (command "_MIRROR"
	     line1
	     line2
	     line3
	     ""
	     "_non"
	     pt0
	     "_non" 
	     (polar pt0 (/ pi 4) 1)
	     "_N" 
    )
  )




  (defun DrawArrayWindows (pt0)
    (repeat NumberOfWindows
      (DrawWindow pt0)
      (setq pt0 (polar pt0 (angtof "0") (* SizeWindow 2)))
    )
  )

  (command "_line"
	   "_non"
	   BasePoint
	   "_non"
	   (polar BasePoint (angtof "90") BuildingHeight)
	   ""
	   "_copy"
	   (entlast)
	   ""
	   "_non"
	   BasePoint
	   "_non"
	   (polar BasePoint (angtof "0") BuildingWidth)
	   ""
	   "_line"
	   "_non"
	   BasePoint
	   "_non"
	   (polar BasePoint (angtof "0") BuildingWidth)
	   ""
	   "_copy"
	   (entlast)
	   ""
	   "_non"
	   BasePoint
	   "_non"
	   (polar BasePoint (angtof "90") BuildingHeight)
  )

  (setq BasePoint (polar BasePoint (angtof "0") SizeWindow))

  (setq	BasePoint (polar BasePoint
			 (angtof "90")
			 (- (* StoreyHeight 0.5) (* SizeWindow 0.5))
		  )
  )

  (repeat NumberOfFloors
    (DrawArrayWindows BasePoint)
    (setq BasePoint (polar BasePoint (angtof "90") StoreyHeight))
  )
)


Yura Agafonov вне форума  
 
Непрочитано 27.06.2012, 01:25
#18
Дима_

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


Передайте всем студентам пламенный привет Offtop: и пожелание забыть этот код.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Как выбрать три последних не удаленных примитива на чертеже используя ent*