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

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

Массив лучей по заданной логической функции в lisp

Ответ
Поиск в этой теме
Непрочитано 27.11.2015, 14:53 #1
Массив лучей по заданной логической функции в lisp
Kototim
 
Техник-проектировщик
 
Москва
Регистрация: 08.12.2014
Сообщений: 16

Добрый день!
Прошу помощи в написании программы. Программирую первые раз, раньше читал учебники, смотрел видео, но без конкретной задачи, чую, что учиться нельзя. Задача глобальная, а это первый и мелкий инструмент.
Итак, задача:
Нужно разбить лучами под 90 градусов мнимый отрезок, заданный двумя точками. Расстояние между лучами должно быть 1000 мм, если остается остаток, то последние лучи формируются исходя из двух условий. Если остаток больше 500 мм, то дополнительно луч ставится в последнюю точку, если меньше 500 мм, то взаимствуется дополнительно 1000 мм из прошлого массива, после чего полученное расстояние делится на 2 и соответственно проставляются лучи уже на этом расстоянии.

Я это вижу так:
1) Я запрашиваю 2 точки р1 и р2 и возвращаю расстояние между ними = с1:

2)Выполняю команду создания луча под 90 градусов в точке р1

3) Далее присваиваю новые переменные
х1=с1/1000 ;
х2=округлениеВниз(х1); // количество отрезков в первом массиве
с2=1000*х2 // общая длина первого массива
с3=с1-с2 // длина остатка
задаются координаты точки р3 (точка в конце первого массива)

4) Далее следует логическая функция
IF(500>c3>0;
значение истина - выполнить команду 1
Присваивание новых переменных:
с4=с2-1000
c5=(c1-c4)/2
задаются координаты точки р4 (точка в конце первого массива)
(Массив луча с точки р1 вдоль отрезка р1-р4 с интервалом 1000 мм)
(Массив луча с точки р4 вдоль отрезка р4-р2 с интервалом c5 мм).

значение ложь - выполнить команду 2
(Массив луча с точки р1 вдоль отрезка р1-р2 с интервалом 1000 мм)
(Команда создания луча под 90 градусов в точке р3)

Конец.

Собственно не претендую на готовую программу, прошу посоветовать, какие команды мне здесь использовать, может что-то упросить. Я постараюсь сам всё написать, а если что-то не получится, то обращусь в этой теме.
Заранее спасибо за помощь!

Миниатюры
Нажмите на изображение для увеличения
Название: mTkkmNDxkE8.jpg
Просмотров: 45
Размер:	51.6 Кб
ID:	161195  

Просмотров: 2536
 
Непрочитано 27.11.2015, 15:03
#2
gomer

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


Не понял, ты все сделал, а мы тут причем? Переводи свой псевдокод на лисп, запускай и смотри что получится... если не получится, смотри что говорит автокад
gomer вне форума  
 
Автор темы   Непрочитано 27.11.2015, 15:37
#3
Kototim

Техник-проектировщик
 
Регистрация: 08.12.2014
Москва
Сообщений: 16


gomer: не могу понять, каким командами мне пользоваться при написании.
Пока программа выглядит так. В данный момент не могу понять, как округлить вниз полученное значение и как повернуть луч перпендикулярно, где взять имя примитива?.
Цитата:
(defun c:gr_n1 (/ p1 p2)
(setq p1 (getpoint "\n1:"))
(setq p2 (getpoint "\n2:"))
(command "_xline" p1 p2)
(command "_rotate" _xline p1 90)
(setq c1 (distance p1 p2 ))
(setq x1 (/ c1 1000))
(setq x2 (int x1))

Последний раз редактировалось Kototim, 27.11.2015 в 17:53.
Kototim вне форума  
 
Непрочитано 27.11.2015, 17:50
1 | #4
gomer

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


Цитата:
Сообщение от Kototim Посмотреть сообщение
Пока программа выглядит так.
любая программа строится следующим образом
1) Ввод данных;
2) Обработка данных;
3) Вывод результатов обработки данных.
Вот этой схемы и придерживайся
И пиши комментарии над каждой строчкой, это поможет тебе увидеть твою программу

Цитата:
Сообщение от Kototim Посмотреть сообщение
луч перпендикулярно.
прибавь pi/2 к углу между точками

Цитата:
Сообщение от Kototim Посмотреть сообщение
как округлить вниз полученное значение
(fix 2.5)
gomer вне форума  
 
Автор темы   Непрочитано 30.11.2015, 10:51
#5
Kototim

Техник-проектировщик
 
Регистрация: 08.12.2014
Москва
Сообщений: 16


Помогите пожалуйста с командой (command “_ARRAY” е “” “_R” n_row n_col –30 50)
Весь форум и интернет перерыл, не могу понять, что есть что в этом коде. е - имя примитива, а дальше?
Мне нужно перпендикулярно двум точкам установить заданное количество лучей. Луч задал, а как быть дальше, не понимаю. У меня есть длина отрезка, у меня есть шаг, у меня есть количество точек.

И ещё, можно ли задавать луч не по двум точкам, а по точке и углу? А то получается есть точка и нужно писать ещё одну строчку чтобы задать вторую для луча.

Спасибо.

Последний раз редактировалось Kototim, 30.11.2015 в 11:09.
Kototim вне форума  
 
Непрочитано 30.11.2015, 12:41
#6
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Цитата:
Сообщение от Kototim Посмотреть сообщение
а дальше?
Наберите в Autocad в командной строке _-array и сразу всё поймёте. Только если у вас локализованный autocad, то вместо "_R" будет "П".

Цитата:
Сообщение от Kototim Посмотреть сообщение
можно ли задавать луч не по двум точкам, а по точке и углу?
Попробуйте также в командной строке набрать "луч" или "_ray" - если автокад не предлагает других вариантов кроме указания точек, то нельзя.
kacugu вне форума  
 
Автор темы   Непрочитано 30.11.2015, 13:15
#7
Kototim

Техник-проектировщик
 
Регистрация: 08.12.2014
Москва
Сообщений: 16


Цитата:
Сообщение от kacugu Посмотреть сообщение
Наберите в Autocad в командной строке _-array и сразу всё поймёте. Только если у вас локализованный autocad, то вместо "_R" будет "П".
Спасибо, но всё равно немного не понимаю.

Получается n_row n_col количество строк и столбцов, _R это прямоугольный массив а вот -30 и 50 не понимаю. Подозреваю, что 50 это интервал, а -30 тогда что? Базовая точка отстающая на -30?
Миниатюры
Нажмите на изображение для увеличения
Название: двг.JPG
Просмотров: 126
Размер:	20.9 Кб
ID:	161317  
Kototim вне форума  
 
Непрочитано 30.11.2015, 13:31
1 | #8
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Постройте массив, используя _-array. Командная строка всё подскажет. Сначала выбираем объект, потом тип массива, задаём: число рядов, число столбцов, расстояние между рядами, расстояние между столбцами. Вуаля. Поэкспериментируйте, задав число рядов или столбцов, равным 1.
kacugu вне форума  
 
Автор темы   Непрочитано 30.11.2015, 16:10
#9
Kototim

Техник-проектировщик
 
Регистрация: 08.12.2014
Москва
Сообщений: 16


Спасибо, вроде разобрался, теперь возникла другая проблема. Как повернуть весь массив на заданный угол? Получается выделяется только последний элемент.
Цитата:
(command "_array" L1 "" "_R" 1 x3 1000 0)
(setq L2 (entlast))
(command "_rotate" L2 "" p1 (angle p1 p2))
Kototim вне форума  
 
Непрочитано 30.11.2015, 16:59
1 | #10
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


В голову приходит только создание набора - смотрите функцию ssget.
Но может есть и другие способы - я с лиспом, даже при наличии справочника, на "вы".
kacugu вне форума  
 
Автор темы   Непрочитано 30.11.2015, 17:22
#11
Kototim

Техник-проектировщик
 
Регистрация: 08.12.2014
Москва
Сообщений: 16


Пока что решил проблему через пользовательскую ПСК перед созданием массива, но вопрос остаётся открытым ибо требуется всё равно знать, как формировать группу примитивов и присваивать ей имя.

del.

Всем спасибо, разобрался. Программу дописал

Последний раз редактировалось Kototim, 01.12.2015 в 11:33. Причина: разобрался
Kototim вне форума  
 
Непрочитано 01.12.2015, 11:14
1 | #12
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Цитата:
Сообщение от Kototim Посмотреть сообщение
ак формировать группу примитивов и присваивать ей имя
http://forum.dwg.ru/showpost.php?p=270675&postcount=150 .Да и просто поизучайте тему - много полезного.
kacugu вне форума  
 
Непрочитано 04.12.2015, 10:02
#13
Wion

Инженер-проектировщик
 
Регистрация: 05.11.2014
Санкт-Петербург
Сообщений: 19


Код:
[Выделить все]
 (defun c:cutray	(/	pt1    pt2    de     dist   fixdst ang
		 count	re     end    perp   endline	   i
		 ms
		)
  (vl-load-com)
  (setq	de  1000
	end 500
  )
  (setq	pt1   (getpoint)
	pt2   (getpoint pt1)
	dist  (distance pt1 pt2)
	count (fix (/ dist de))
  )
  (if (> dist de)
    (progn
      (setq ang	   (angle pt1 pt2)
	    perp   (+ ang (* 0.5 pi))
	    fixdst (* count de)
	    i	   0
	    ms	   (vla-get-ModelSpace
		     (vla-get-ActiveDocument (vlax-get-acad-object))
		   )
	    pt2	   (polar pt1 perp 1)
      )
      (if (> (- dist fixdst) end)
	(setq endline (- dist fixdst))
	(setq endline (/ (+ de (- dist fixdst)) 2))
      )
      (vla-addRay ms (vlax-3d-point pt1) (vlax-3d-point pt2))
      (while (< i count)
	(setq pt1 (polar pt1 ang de)
	      pt2 (polar pt1 perp 1)
	)
	(vla-addRay ms (vlax-3d-point pt1) (vlax-3d-point pt2))
	(setq i (1+ i))
      )
      (if (> endline 0)
	(progn
	  (setq	pt1 (polar pt1 ang endline)
		pt2 (polar pt1 perp endline)
	  )
	  (vla-addRay ms (vlax-3d-point pt1) (vlax-3d-point pt2))
	)
      )
    )
  )
)
Wion вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Массив лучей по заданной логической функции в lisp

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP Как вернуться к выполнению предыдущей функции ? Raznouh LISP 24 23.01.2014 23:22
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок. Pastor LISP 16 17.11.2010 13:15
Аналог функции EVAL (LISP) в Exele kp+ LISP 11 01.04.2010 16:52