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

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

Интересный глюк. Координаты в lispe зависит от zooma?

Ответ
Поиск в этой теме
Непрочитано 30.01.2006, 03:49 #1
Интересный глюк. Координаты в lispe зависит от zooma?
Stam
 
Минск
Регистрация: 22.11.2005
Сообщений: 63

Столкнулся с такой проблемой. Прога на лиспе делает небольшие расчеты, потом расставляет окружности но вычесленным координатам точек. Только расставляет эти точки каждый раз по разному. Если большой зум выставляет правильно, если маленький то вообще все в одну точку. Значения переменных всегда одинаковые. Что это может быть? Может нужно какую-нибудь строчку дописать?
Просмотров: 5298
 
Непрочитано 30.01.2006, 05:21
#2
Profan


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


На время выполнения программы отключить объектные привязки.
Profan вне форума  
 
Непрочитано 30.01.2006, 06:47
#3
Аshаs-ка

проектировсчик
 
Регистрация: 06.01.2006
Москва
Сообщений: 1,982


А в конце восстановить. Сатндартная операция.
Аshаs-ка вне форума  
 
Непрочитано 30.01.2006, 07:12
#4
bernata


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


Незнаю смогу ли помочь, но хотелось бы на код посмотреть.
Что за программа такая.
bernata вне форума  
 
Непрочитано 30.01.2006, 09:56
#5
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Цитата:
На время выполнения программы отключить объектные привязки.
95% за то, что после этого все будет работать нормально.
Pilot вне форума  
 
Автор темы   Непрочитано 30.01.2006, 12:47
#6
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


(defun c:hod ()
(setq t1 (getpoint "\nУкажите базовую станцию "))
(setq t2 (getpoint "\nУкажите ориентрируемую станцию "))
(setq ygol (angle t1 t2))
(setq n (getint "\nВведите количество точек"))
(setq i 0)
(while (< i n)
(setq nomer (getstring "\nВведите номер точки "))
(setq prologenie (getint "\nВведите горизонтальное проложение "))
(setq grad (getreal "\nВведите угол по ГК (градусы и минуты разделять клавишей Enter)"))
(setq gmin (getreal))
(setq h (getstring "\nВведите высоту точки "))
(setq GK (+ (/ gmin 60) grad ))
(setq GY (* (/ GK 180) pi))
(setq pk (polar t1 (- ygol GY) prologenie))
(setq pkn (list (+ (nth 0 pk) 2 ) (+ (nth 1 pk) 0.5 )))
(setq pkh (list (+ (nth 0 pk) 2 ) (- (nth 1 pk) 2.5 )))
(command "circle" pk 0.1)
(command "text" pkn 2.5 0.0 nomer)
(command "text" pkh 2.5 0.0 h)
(setq i (1+ i))
)
)

вот код. Прожка для геодезии. Может кто еще знает как код упрустить, просто знаний по липу вообще почти нету, первая моя програмка)
Stam вне форума  
 
Непрочитано 30.01.2006, 13:00
#7
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun c:hod (/ t1 t2 ygol n i nomer prologenie grad gmin h gk gy pk pkn pkh _osmode_)
  (if (and (setq t1 (getpoint "\nУкажите базовую станцию "))
	   (setq t2 (getpoint "\nУкажите ориентрируемую станцию "))
	   ) ;_ end of and
    (progn
      (setq ygol (angle t1 t2))
      (setq n (getint "\nВведите количество точек"))
      (setq i 0)
      (while (< i n)
	(setq nomer (getstring "\nВведите номер точки ")
	      prologenie (getint "\nВведите горизонтальное проложение ")
	      grad
	       (getreal
		 "\nВведите угол по ГК (градусы и минуты разделять клавишей Enter)"
		 ) ;_ end of getreal
	      gmin (getreal)
	      h (getstring "\nВведите высоту точки ")
	      gk (+ (/ gmin 60) grad)
	      gy (* (/ gk 180) pi)
	      pk (polar t1 (- ygol gy) prologenie)
	      pkn (list (+ (nth 0 pk) 2) (+ (nth 1 pk) 0.5))
	      pkh (list (+ (nth 0 pk) 2) (- (nth 1 pk) 2.5))
	      _osmode_ (getvar "osmode")
	      )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; вот тот кусок
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	(setvar "osmode" 0)
	(command "circle" pk 0.1)
	(command "text" pkn 2.5 0.0 nomer)
	(command "text" pkh 2.5 0.0 h)
	(setvar "osmode" _osmode_)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Возвращаем старое значение, т.к. прекращение может быть когда угодно.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	(setq i (1+ i))
	) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Чуток переработал, хотя на самом деле тут тьму переделывать надо...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2006, 13:16
#8
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


Отключения привязки работает. Спасибо за доработанный код. Буду работать над собой))
Stam вне форума  
 
Автор темы   Непрочитано 30.01.2006, 13:22
#9
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


а setq писать не обязательно? Лисп автоматически выполняет присваивание? В чем разница тогда между строками
(setq ygol (angle t1 t2))
gy (* (/ gk 180) pi)
Ведь и там и там пыполняется присваивание переменным значений
Stam вне форума  
 
Непрочитано 30.01.2006, 13:25
#10
Profan


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


Теперь понятно, что это не ГЛЮК. Вот так рождаются мифы...
Profan вне форума  
 
Непрочитано 30.01.2006, 13:27
#11
Кулик Алексей aka kpblc
Moderator

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


Ну тут наполовину привычка сработала. Кроме того, если дать несколько команд (setq), то они быстрее выполняются, если сделаны как я показал...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.01.2006, 13:44
#12
Кулик Алексей aka kpblc
Moderator

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


Гхм... В каком каде проверяешь? Русском или не совсем? В любом случае - мне оторвать дурную головенку, а тебе подправить все (command) на следующее:
(command "_.circle" pk 0.1)
(command "_.text" pkn 2.5 0.0 nomer)
(command "_.text" pkh 2.5 0.0 h)
Кроме того, посмотри, для текущего стиля текстового у тебя какая высота? В коде не отслеживается высота стиля! Так что надо по идее устанавливать высоту в 0.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2006, 14:01
#13
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


В стиле и проблема. Когда использую шаблон с моим стилем, то после запроса на координаты text сразу идет угол а не высота. У меня в шаблоне высота 5, и программа значение 2.5 устанавливает как угол, а не как высоту текста. Если загружать шаблон acad где стиль стандартный, то все работает. В коде можно как-нибудь это исправить, или стоит мой стиль текста установить высотой 2.5 и убрать это значение из кода?
Stam вне форума  
 
Непрочитано 30.01.2006, 14:07
#14
Кулик Алексей aka kpblc
Moderator

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


Тогда надо проверять высоту:
Код:
[Выделить все]
(defun c:hod (/	t1 t2 ygol n i nomer prologenie	grad gmin h gk gy pk pkn pkh
	      _osmode_)
  (if (and (setq t1 (getpoint "\nУкажите базовую станцию "))
	   (setq t2 (getpoint "\nУкажите ориентрируемую станцию "))
	   ) ;_ end of and
    (progn
      (setq ygol (angle t1 t2))
      (setq n (getint "\nВведите количество точек"))
      (setq i 0)
      (while (< i n)
	(setq nomer	 (getstring "\nВведите номер точки ")
	      prologenie (getint "\nВведите горизонтальное проложение ")
	      grad
			 (getreal
			   "\nВведите угол по ГК (градусы и минуты разделять клавишей Enter)"
			   ) ;_ end of getreal
	      gmin	 (getreal)
	      h		 (getstring "\nВведите высоту точки ")
	      gk	 (+ (/ gmin 60) grad)
	      gy	 (* (/ gk 180) pi)
	      pk	 (polar t1 (- ygol gy) prologenie)
	      pkn	 (list (+ (nth 0 pk) 2) (+ (nth 1 pk) 0.5))
	      pkh	 (list (+ (nth 0 pk) 2) (- (nth 1 pk) 2.5))
	      _osmode_	 (getvar "osmode")
	      ) ;_ end of setq
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; вот тот кусок
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	(setvar "osmode" 0)
	(command "_.circle" pk 0.1)
	(if (= (cdr
		 (assoc 40 (entget (tblobjname "style" (getvar "textstyle"))))
		 ) ;_ end of cdr
	       ) ;_ end of =
	  (progn
	    (command "_.text" pkn 2.5 0.0 nomer)
	    (command "_.text" pkh 2.5 0.0 h)
	    ) ;_ end of progn
	  (progn
	    (command "_.text" pkn 0.0 nomer)
	    (command "_.text" pkh 0.0 h)
	    ) ;_ end of progn
	  ) ;_ end of if
	(setvar "osmode" _osmode_)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Возвращаем старое значение, т.к. прекращение может быть когда угодно.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	(setq i (1+ i))
	) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2006, 14:17
#15
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


Kpblc спасибо! Очень помог) Существует программа аналогичная этой, только донные она берет из базы данных (txt файл создается VBA после рачета полевого журнала). В геодезии очень облегчает построение планов. Если ктонибудь занимается геодезией и его это интересует, обращайтесь. Думаю можно это дело довести до ума (но не с моими знаниями))))) Основа готова, нужно дорабатывать.
Всем спасибо!
Stam вне форума  
 
Непрочитано 30.01.2006, 14:24
#16
Кулик Алексей aka kpblc
Moderator

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


Дык ета... На autocad.ru сколько раз подобные задачи решались... там вся проблема на самом деле в обработке записей txt-файла, поскольку каждый пишет туда свое, да и в последующих пожеланиях - типа поставить текст, а в тексте то-то и то-то, да текст переместить туда-то...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.01.2006, 14:31
#17
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Несколько (command... можно тоже объединять под одной функцией. Примерно так:

Код:
[Выделить все]
(command "_.circle" pk 0.1
         "_.text" pkn 2.5 0.0 nomer
         "_.text" pkh 2.5 0.0 h
)
Pilot вне форума  
 
Непрочитано 30.01.2006, 14:37
#18
Кулик Алексей aka kpblc
Moderator

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


Можно. Я про это постоянно забываю - почему-то пока больше нравится работать через vla-add*. Интереснее получается, да ошибок поменьше
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2006, 14:51
#19
Stam


 
Регистрация: 22.11.2005
Минск
Сообщений: 63


Цитата:
Сообщение от kpblc
Дык ета... На autocad.ru сколько раз подобные задачи решались... там вся проблема на самом деле в обработке записей txt-файла, поскольку каждый пишет туда свое, да и в последующих пожеланиях - типа поставить текст, а в тексте то-то и то-то, да текст переместить туда-то...
На autocad.ru к сожалению не был. Зайду обязательно гляну. Но всеже существуют шаблоны полевых журналов, их в основном и придерживаются. Хотя каждый извращается по разному)) Моя программа скорее для учебный целей (хотел представить в качестве студенческой работы)). Проблемы с обработкой были, но вроде в конце концов обрабатывалось нормально. Больше проблем возникало с VBA нежели лиспом. Обработка всего журнала происходит в Excele. Почитаю форумы на autocad.ru думаю найду много чего полезного и хоть одну свою программу доведу до ума)))
Stam вне форума  
 
Непрочитано 30.01.2006, 14:54
#20
VVA

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


Цитата:
grad
(getreal
"\nВведите угол по ГК (градусы и минуты разделять клавишей Enter)"
) ;_ end of getreal
gmin (getreal)
h (getstring "\nВведите высоту точки ")
gk (+ (/ gmin 60) grad)
gy (* (/ gk 180) pi)
Нет необходимости отдельно вводить градусы и минуты. Формат 12d23'35" (подробнее _units) на запрос getangle позволяет вводить углы в градусах, минутах, секундах, а возвращает в радианах

Код:
[Выделить все]
(setq nomer    (getstring "\nВведите номер точки ") 
         prologenie (getint "\nВведите горизонтальное проложение ") 
         gy 
          (getangle 
            "\nВведите угол по ГК [формат 12d23'45\" ]: " 
            ) ;_ end of getreal 
         
         h       (getstring "\nВведите высоту точки ") 
;;;         gk    (+ (/ gmin 60) grad) 
;;;         gy    (* (/ gk 180) pi) 
         pk    (polar t1 (- ygol gy) prologenie) 
         pkn    (list (+ (nth 0 pk) 2) (+ (nth 1 pk) 0.5)) 
         pkh    (list (+ (nth 0 pk) 2) (- (nth 1 pk) 2.5)) 
         _osmode_    (getvar "osmode") 
         ) ;_ end of setq
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Интересный глюк. Координаты в lispe зависит от zooma?

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

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