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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

Я начинаю заниматься программированием LISP (help)

Ответ
Поиск в этой теме
Непрочитано 19.02.2006, 20:00
Я начинаю заниматься программированием LISP (help)
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Гопода, я начал этим заниматься совсем недавно, буквально в этом месяце. И у меня уже есть грандиозные планы например: чтобы автокад рисовал какие нибудь стандартные детали сам (болты, гайки шурупы итд)

И соответственно у меня начали появляться вопросы на которые г-н Полещук НН в своих произведениях не смог ответить в полном объеме, значит мне понадобится чья нибудь еще помощь.

У меня уже были вопросы которые я задал здесь и получил исчерпывающие ответы. Но если я на кждый вопрос буду создавать отдельный топик, то количество топиков будет = кол-ву вопросов, а вопросов миллион -- администраторы и модераторы данного ресурса наверное понимают о чем я. Да и такое кол-во ссылок не влезет мой..........

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

Всем заранее благодарен.
Просмотров: 78337
 
Непрочитано 13.02.2009, 11:44
#281
Zouss


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


Offtop: как бы его удалить совсем?
Zouss вне форума  
 
Непрочитано 13.02.2009, 12:16
#282
Кулик Алексей aka kpblc
Moderator

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


Zouss, это ты про кого?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.02.2009, 12:32
#283
bridgeconst

проектирование
 
Регистрация: 29.11.2007
Москва
Сообщений: 311


Какое-то кидалово с этим квадратом. Расчитан на блондинок:
3. Найдите это число в таблице и символ, которому оно соответствует.
И все люди интуитивно указателем мышки пробегают мимо загаданного символа. Тут не трудно угадать.
Вот вы попробуйте просто загадать число и указателем вообще в поле знаков не шевелить - хрен чего этот квадрат угадает.
__________________
Обмениваю незнание на время.
bridgeconst вне форума  
 
Непрочитано 13.02.2009, 12:40
#284
Дима_

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


Цитата:
Сообщение от bridgeconst Посмотреть сообщение
Какое-то кидалово с этим квадратом. Расчитан на блондинок:
3. Найдите это число в таблице и символ, которому оно соответствует.
И все люди интуитивно указателем мышки пробегают мимо загаданного символа. Тут не трудно угадать.
Вот вы попробуйте просто загадать число и указателем вообще в поле знаков не шевелить - хрен чего этот квадрат угадает.
Принцип "угадывания" основом на элементарной математике, никакого отслеживания мышки там нет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.02.2009, 12:56
#285
bridgeconst

проектирование
 
Регистрация: 29.11.2007
Москва
Сообщений: 311


Похоже так. Чего я погорячился.
там определенная система.
__________________
Обмениваю незнание на время.

Последний раз редактировалось bridgeconst, 13.02.2009 в 13:04.
bridgeconst вне форума  
 
Непрочитано 20.02.2009, 09:40
#286
stas_org


 
Регистрация: 05.04.2007
Самара
Сообщений: 1,199


Код:
[Выделить все]
;Хитрая функция - преобразует строку в список, потом вставляет в сисок десятичную точку и
;возвращает опять строку
(defun elevation:koordinate (string / abs:str1)
  (setq str (vl-string->list string))
  (setq	y1 (nth 0 str)
	y2 (nth 1 str)
	y3 (nth 2 str)
	y4 (nth 3 str)
	y5 (nth 4 str)
	y6 (nth 5 str)
	y. 46
	y0 48
  )

  (if (= str1 0)			;проверка - нулевая отметка или нет
    (vl-list->string (list y0 y. y0 y0 y0))
    (if	(> str1 0)			;проверка - положительнa или отрицательнa отметкa
      (progn
	(if (< str1 10)
	  (vl-list->string (list y0 y. y0 y0 y1))
	  (if (< str1 100)
	    (vl-list->string (list y0 y. y0 y1 y2))
	    (if	(< str1 1000)
	      (vl-list->string (list y0 y. y1 y2 y3))
	      (if (< str1 10000)
		(vl-list->string (list y1 y. y2 y3 y4))
		(vl-list->string (list y1 y2 y. y3 y4 y5))
		)
	    )				;if 10
	  )				;if 1
	)				;if 0.1
      )					;progn
      (progn
	(setq abs:str1 (abs str1))
	(if (< abs:str1 10)
	  (vl-list->string (list y1 y0 y. y0 y0 y2))
	  (if (< abs:str1 100)
	    (vl-list->string (list y1 y0 y. y0 y2 y3))
	    (if	(< abs:str1 1000)
	      (vl-list->string (list y1 y0 y. y2 y3 y4))
	      (if (< abs:str1 10000)
		(vl-list->string (list y1 y2 y. y3 y4 y5))
		(vl-list->string (list y1 y2 y3 y. y4 y5 y6))
		)
	    )				;if 10
	  )				;if 1
	)				;if 0.1
      )					;progn
    )					;if +/-
  )					;if 0

)					;defun
      

(defun c:elevation (/	   plw	  str1	 str2	str3   pt1    pt2
		    pt3	   pt4	  pt5	 pt7	pt8    osm    dimscl
		    pt0	   pta	  ortho	 cmd1	blm    ang1   ang2
		    ptt	   let	  autosn tx	SF
		   )			;задание функции и определение переменных
  (initget 3)				;запрет пустого ввода
  (setq osm (getvar "OSMODE"))
  (setq autosn (getvar "autosnap"))
  (setq dimscl (getvar "dimscale"))
  (setq ortho (getvar "ORTHOMODE"))
  (setq	cmd1 (getvar "CMDECHO"))
  (setq plw (getvar "plinewid"))
  
  
  (setq pt1 (getpoint "\nТочка вставки отметки : "))
					;получение точки вставки

;;;  (setq str1 (/ (nth 1 pt1) 1000))	;получение из списка pt1 координаты у деленой на 1000
  (setq str1 (nth 1 pt1))
  (setq str2 (elevation:koordinate (rtos str1 2 3)))		;преобразование str1 в строковую константу децеметрическую (2) и с округлением до 3 цифр после запятой
  (setq str3 (strcat "+" str2))                ;слияние + и содержимого переменной                                        

  
  
  (setvar "cmdecho" 0)
  (setvar "OSMODE" 0)
  (setvar "ORTHOMODE" 1)
  
  (setq pt0 (getpoint pt1 "\nТочка направления по вертикали : "))
  (setq ang1 (angle pt1 pt0))
  (if (<= ang1 pi)
    (setq ang1 (/ pi 2))
    (setq ang1 (/ (* pi 3) 2))
  )
  (setq	pt0 (polar pt1 ang1 (* dimscl 10))
  )
  (command "line" pt1 pt0 "")
  (setq pta (getpoint pt0 "\nТочка направления по горизонтали : "))
  (setq ang2 (angle pt0 pta))
  (if (<= ang2 (/ pi 2))
    (setq ang2 0)
    (setq ang2 pi)
  )
  (command "erase" "last" "")
  (setvar "ORTHOMODE" ortho)
  (setq	pt2 (polar pt1 ang2 (* dimscl 10))
	pt3 (polar pt1 ang2 (* dimscl 5))
	pt4 (polar pt3 ang1 (* dimscl 6))
	pt5 (polar pt4 ang2 (* dimscl 15))
	ptt (polar pt4 ang2 (* dimscl 10))
  )
  (setq ss (ssadd))
  (command "pline"
	   pt1
	   "w"
	   (* dimscl 0.3)
	   (* dimscl 0.3)
	   pt2
	   ""
  )
  (setq s1 (entlast))
  (ssadd s1 ss)
  (command "line" pt3 pt4 "")
  (setq s2 (entlast))
  (ssadd s2 ss)
  (command "line" pt4 pt5 "")
  (setq s3 (entlast))
  (ssadd s3 ss)
  (if (= ang1 (/ pi 2))
    (setq pt7 (polar pt3 (/ pi 4) (* dimscl 4))
	  pt8 (polar pt3 (/ (* pi 3) 4) (* dimscl 4))
    )
    (setq pt7 (polar pt3 (/ (* pi 5) 4) (* dimscl 4))
	  pt8 (polar pt3 (/ (* pi 7) 4) (* dimscl 4))
    )
  )
  (setq ang1 (/ pi 2))
  (command "pline" pt3 pt7 "")
  (setq s4 (entlast))
  (ssadd s4 ss)
  (command "pline" pt3 pt8 "")
  (setq s5 (entlast))
  (ssadd s5 ss)
;;;---------------------текст-------------------------------------------------

  (if (> str1 0)
        (setq tx str3)
        (setq tx str2)
      )
  
  (setq otmetka (strcat "\nОтметка:<" tx "> "))
  (setq let (getstring otmetka))
  (if (= (strcase let) "")
    (command "text" "J" "bc" ptt (* dimscl  2.5) 0 tx)
    (command "text" "J" "bc" ptt (* dimscl  2.5) 0 let)
  )
  (setq s6 (entlast))
  (ssadd s6 ss)
  (command "_.-group" "create" "*" "ELEVATION" ss "")
					;------ заключительные операции (восстановление системных переменных ---------
  (setvar "CMDECHO" cmd1)
  (setvar "OSMODE" osm)
  (setvar "autosnap" autosn)
  (setvar "plinewid" plw)
  (princ)
)					;конец функции
;;------------> the end <--------------

Помогите пожалуйста сделать так, чтобы полученная отметка умножалась на значение переменной DIMLFAC.
stas_org вне форума  
 
Непрочитано 20.02.2009, 13:41
#287
Main Urod


 
Регистрация: 20.01.2009
Сообщений: 1,170


Есть вопрос по VLA объектам.

Пишу програмку, которая перебирает все примитивы чертежа отбирая нужные для работы. при нахождении нового нужного объекта я сохраняю его параметры (имя и идентификатор) в точечной паре. Пару добавляю в список для последующей работы только с нужными объектами:

Код:
[Выделить все]
 (setq s (entnext))
  (while (/= s nil)	
    (setq object_vla (vlax-ename->vla-object s))
    (setq object_vla_name (vla-get-ObjectName object_vla))
    (setq spis (append spis (list (cons object_vla_name object_vla))))
    (setq s (entnext s))
 )
Список нормальнео сохраняется в виде:

Код:
[Выделить все]
(AcDbLine . #<VLA-OBJECT IAcadLine 01f9a88c>)
(AcDbMText . #<VLA-OBJECT IAcadMText 10078154>) (AcDbBlockReference . #<VLA-OBJECT IAcadBlockReference 10253454>)
Однако при последующей попытке получить доступ к VLA объекту с помощью:

Код:
[Выделить все]
(princ "имя объекта: ")
(princ (nth 0 (nth 0 spis)))
(terpri)
(princ "адрес объекта: ")
(princ (nth 1 (nth 0 spis)))
(terpri)
получаю имя объекта (первый элемент точечной пары) и ошибку вместо идентификатора.

Я чтот о делаю не так, или после создания второго VLA объекта первый перестает существовать и его адрес становится недействительным?

Собственно проблему я уже решил, сохраняя не идентификатор VLA объекта а идентификатор примитива, но любопытство осталось...
Main Urod вне форума  
 
Непрочитано 20.02.2009, 13:50
#288
Кулик Алексей aka kpblc
Moderator

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


nth работает только со списками, а для точечных пар используй car и cdr
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2009, 14:09
#289
Main Urod


 
Регистрация: 20.01.2009
Сообщений: 1,170


Спасибо. Заработало.
Только непонятно, почему можно получить через nth первый элемент точечной пары...
Main Urod вне форума  
 
Непрочитано 20.02.2009, 14:20
#290
Кулик Алексей aka kpblc
Moderator

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


А ты проверни в vlide:
Код:
[Выделить все]
(listp '(1 2))
(listp '(3 . 4))
---
Добавлено:
Туда же...
Код:
[Выделить все]
(type '(1 2))
(type '(1 . 2))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2009, 19:20
#291
Дима_

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


Я бы посоветовал для более "лисповской" реалзаци данного алгоритма изучить функции ssget, mapcar, lambda. Думаю еще не раз пригодяться.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.02.2009, 08:49
#292
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А ты проверни в vlide:
Код:
[Выделить все]
(listp '(1 2))
(listp '(3 . 4))
---
Добавлено:
Туда же...
Код:
[Выделить все]
(type '(1 2))
(type '(1 . 2))
Вот, провернул...
Цитата:
_$ (listp '(1 2))
T
_$ (listp '(3 . 4))
T
_$ (type '(1 2))
LIST
_$ (type '(1 . 2))
LIST
Вообще-то разницы никакой.
Makswell вне форума  
 
Непрочитано 24.02.2009, 10:43
#293
VVA

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


Makswell, Наверное имелось ввиду
Код:
[Выделить все]
(listp (cdr '(1 2)))
(listp (cdr '(3 . 4)))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.02.2009, 11:18
#294
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Ага, понятно. Кстати, не раз сам на этом обжигался.
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

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