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

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

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

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

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

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

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

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

Всем заранее благодарен.
Просмотров: 79690
 
Непрочитано 27.03.2006, 17:17
#181
Zouss


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


информация то favorite комментарии from all
Код:
[Выделить все]
(setq f_line (repeat 7 (read-line file_id)))
атрибуты в блоке будут располагаться в порядке их создания, так что ловя третий атрибут надо быть сильно уверенным в том, что нужный нам именно третий. так что если блок с атрибутом создается не программно я бы искал по тегу (2 dxf группа)
Zouss вне форума  
 
Непрочитано 27.03.2006, 17:23
#182
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от favorite
Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.

Как из файла прочесть нужную строку командой read-line<...>
Я бы попробовал через DOSLib работать с ini-файлом - dos_setini и dos_getini соответственно. Это наверняка будет проще.

Цитата:
Сообщение от Zouss
информация то favorite комментарии from all
Код:
[Выделить все]
(setq f_line (repeat 7 (read-line file_id)))
атрибуты в блоке будут располагаться в порядке их создания, так что ловя третий атрибут надо быть сильно уверенным в том, что нужный нам именно третий. так что если блок с атрибутом создается не программно я бы искал по тегу (2 dxf группа)
Чуть-чуть не так, по-моему. Кажется, порядок запроса атрибутов задается при создании блока. По крайней мере, если щелкать на атрибутах последовательно, а не выбирать рамкой, то так и будет с точки зрения пользователя.
Я бы до значения атрибута добирался по его тэгу, честно говоря. Хотя и тут могут быть проблемы - а если тэги повторяются?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.03.2006, 18:48
#183
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.
Цитата:
Я бы попробовал через DOSLib работать с ini-файлом - dos_setini и dos_getini соответственно. Это наверняка будет проще.
>kpblc & favorite
Lisp язык списков, и функций работы со списками хватает практически для всех задач подобного класса.
И не надо лохматить бабушку!
Alan вне форума  
 
Непрочитано 27.03.2006, 19:04
#184
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от Alan
Lisp язык списков, и функций работы со списками хватает практически для всех задач подобного класса.
И не надо лохматить бабушку!
Во-во, создал списочек из строк файла, и добывай потом какой надо и обрабатывай как хошь. Для этого вот вам из копилки:
Код:
[Выделить все]
(defun APEL-FILE-READ (fname / str spis)
  (if (setq fname (open fname "r"))
    (progn
      (while (setq str (read-line fname))
	(setq spis (cons str spis))
      )
      (close fname)
      (reverse spis)
    )
  )
)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 27.03.2006, 19:08
#185
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Apelsinov Во-во, создал списочек из строк файла, и добывай потом какой надо и обрабатывай как хошь...
А если списочек чуть-чуть структурированный...
Alan вне форума  
 
Непрочитано 27.03.2006, 19:42
#186
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Help
У меня есть список
Позиция Количество
1 2
1 3
1 3
2 4
3 3
3 3
-
-
n 5

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


(cond (= 1....200 Позиция))
(setq Количество (1+ Количество))

не пройдет, так как необходимо каким-то образом менять имя
переменной.
Есть каке-то идеи. Как это можно реализовать?


ЧТо касается предыдущего вопроса.
Список действительно структурированный.
Поэтому я обощелся While и простым перебором строк.

Спасибо
favorite вне форума  
 
Непрочитано 27.03.2006, 20:49
#187
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от favorite
Help
У меня есть список
Позиция Количество
1 2
1 3
1 3
2 4
3 3
3 3
-
-
n 5

Как сделать чтобы у меня выбор проходил и ссумировалось количество по всем позициям, для каждой позиции отдельно.
.............
Есть каке-то идеи. Как это можно реализовать?
гхммм... Какая то странная у вас настроечная таблица :shock: (с) из Простоквашино
Что то ваш список не очень то на список похож... по крайней мере, на лисповский
Ну да ладно. Предположим, что это файл структурированый, c:\pos.txt .... Вот один из вариантов, не самый удачной, но все ж...
Код:
[Выделить все]
(defun test (/ f str lstsum)
  (setq f (open "c:\\pos.txt" "r"))
  
  (while (/= (setq str (read-line f)) "")
    (setq str (read (strcat "(" (vl-string-subst " . " " " str) ")")))
    (if (assoc (car str) lstsum)
      (setq lstsum
             (subst (cons (car str) (+ (cdr (assoc (car str) lstsum)) (cdr str)))
                    (assoc (car str) lstsum)
                    lstsum
             ) ;_  subst
      ) ;_  setq
      (setq lstsum (cons str lstsum))
    ) ;_  if
  ) ;_  while
  
  (close f)

  
  lstsum
) ;_  defun
Получаем что то вроде
Цитата:
_$ (test)
((3 . 21) (2 . 10) (1 . 19))
_$
vk вне форума  
 
Автор темы   Непрочитано 30.03.2006, 15:10
#188
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от mmax
Фланец готов полностью если не считать нажатие ЕSC во время указания точки.
И еще один БЭД не очень значительный.
Не буду приводить пока полностью всю программу суть проблемы можно извлечь отсюда:

Код:
[Выделить все]
(defun test (/ cpoint)

    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
Результат работы программы положительный вот только в Акаде 2006 в командной строке которая у курсора и в обычной строке при втором и теретьем вызове функции (test) функцией (repeat n (test)) выдается сообщение :

Код:
[Выделить все]
Can’ t  _reenter LISP ;это в обычной строке

Invalid point ; а это еще и в висячей у курсора
Укажите точку
В принципе, все то что предписывалось программе выполняется на 100% вот только Invalid point несколько портит картину своим присутствием. Как говорится результат получен да вот только осадок нехороший остался.
Почему вообще возникает такая проблема?
И почему точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.

Пробовал просто от балды

Код:
[Выделить все]
(defun test (/ cpoint)
  (setq testpoint (getpoint "testp"))
    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
здесь инвалидность давали только точке testpoint , а cpoint уже проходит без инвалидности.
Скажите как избавиться от инвалидности вообще.
И в конце концов удалось установить связь с инвалидностью и функцией VL-CMDF или COMMAND -- При повторном вызове функции TEST и вылазит это сообщение, в русской версии звучит так
Код:
[Выделить все]
Повторный вход в LISP невозможен.
Неверная точка
Что же всетаки делать ума не приложу.
mmax вне форума  
 
Непрочитано 30.03.2006, 16:02
#189
Кулик Алексей aka kpblc
Moderator

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


А если попробовать такое
Код:
[Выделить все]
(defun test (/ cpoint testpoint)
  (setq	testpoint (getpoint "testp : ")
	cpoint	  (getpoint "Click the point : ")
	) ;_ end of setq
  (if cpoint
    (command "_.circle" cpoint 20)
    ) ;_ end of if
  ) ;_ end of defun

(repeat 10 (test))
В английском 2005 пашет без вопросов
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.03.2006, 18:51
#190
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
Вот пример отрисовки через ActiveX, попробуйте это, врядли будут лишние шептанья:
Код:
[Выделить все]
(defun test (/ cpoint)
  (if (setq cpoint (getpoint "\nУкажите точку"))
    (APEL-DRAW-CIRCLE (trans cpoint 1 0) 19)
  )
)
;;;Отрисовка окружности
;;;point - точка (списком или вариантом)
;;;diam - диаметр (число)
(defun APEL-DRAW-CIRCLE	(point diam)
  (if (listp point)
    (setq point (vlax-3d-point point))
  )
  (APEL-CATCH-APPLY_NOMESS
    'vla-AddCircle
    (list
      (APEL-ACTIVE_SPACE)
      point
      (/ diam 2)
    )
  )
)
;Библиотечные
(defun APEL-CATCH-APPLY_NOMESS (func lst / msg_err)
  (if (null (VL-CATCH-ALL-ERROR-P (setq msg_err (VL-CATCH-ALL-APPLY func lst))))
    (cond (msg_err msg_err)(T))
  )
)
;;;Текущее пространство
(defun APEL-ACTIVE_SPACE ()
  (apply
    (if	(and (zerop (vla-get-activespace (APEL-ACTIVE_DOCUMENT)))
		    (APEL-TRUE_FALSE-T_NIL
		      (vla-get-mspace (APEL-ACTIVE_DOCUMENT))
		    )
	)
      'vla-get-paperspace
      'vla-get-modelspace
    )
    (list (APEL-ACTIVE_DOCUMENT))
  )
)
(defun APEL-ACTIVE_DOCUMENT ()
  (if (null *apel_active_document*)
    (setq *apel_active_document*
	   (vla-get-activedocument
	     (APEL-ACAD_APPLICATION)
	   )
    )
    *apel_active_document*
  )
)
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)
Самое тяжелое тут собрать все библиотечные - надеюсь, я ничего не забыл. :roll:

Alan
Цитата:
А если списочек чуть-чуть структурированный...
А пофигу, все равно все строчками читается, а вот их уже обрабатывать в зависимости от структуры....
__________________
apel.fas
Apelsinov вне форума  
 
Автор темы   Непрочитано 30.03.2006, 21:00
#191
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


А вообщето мне надо правильный многоугольник
окружность можно построить с помощью ENTMAKE тогда рычать не будет.
А вот многоугольник так просто с помощью ENTMAKE не построить, надо сначала найти координаты вершин. В отличии от команды POLIGON там нет центра описывающей окружности хотя есть количество вершин. :?
mmax вне форума  
 
Непрочитано 31.03.2006, 10:37
#192
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
Любой акадовский примитив можно вставить в текущее пространство лиспом, как известно тремя способами:
1. Через command (или лучше vl-cmdf)
2. Через entmake.
3. Методами ActiveX.
У каждого способа свои полюсы и минусы.
Не стоит путать КОММАНДЫ и ПРИМИТИВЫ. Нет примитива - МНОГОУГОЛЬНИК - есть примитив ПОЛИЛИНИЯ (и 3 ее разновидности).

То есть нарисовать многоугольник полилинией вы можете любым вышеперечисленным способом, однако для отрисовки 2-мя последними вам придется рассчитать координаты вершин.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 31.03.2006, 10:39
#193
Zouss


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


а че их рассчитывать то? попросим у пользователя (или у своей функции) координаты его центра и через (polar pt ang dist) все найдем
Zouss вне форума  
 
Непрочитано 31.03.2006, 10:47
#194
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Zouss
А вы думаете я говоря "расчитать" что имел ввиду? Это же.
Но вот что Вы там у пользователя запрашивать станете, и станете ли - это уже зависит от конкретных целей.
__________________
apel.fas
Apelsinov вне форума  
 
Автор темы   Непрочитано 01.04.2006, 14:09
#195
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
mmax
Любой акадовский примитив можно вставить в текущее пространство лиспом, как известно тремя способами:
1. Через command (или лучше vl-cmdf)
2. Через entmake.
3. Методами ActiveX.
У каждого способа свои полюсы и минусы.
Не стоит путать КОММАНДЫ и ПРИМИТИВЫ. Нет примитива - МНОГОУГОЛЬНИК - есть примитив ПОЛИЛИНИЯ (и 3 ее разновидности).

То есть нарисовать многоугольник полилинией вы можете любым вышеперечисленным способом, однако для отрисовки 2-мя последними вам придется рассчитать координаты вершин.
Мне сам многоугольник не нужен мне нужны координаты его вершин,
Но если пользоваться командами то насколько я заметил команды выполняются правильно, но выводят сообщения об ошибках причем не только в вышеперечисленном случае -- такие вещи могут напугать пользователя.
А если найти координаты другим способом, то соответственно команды не понадобятся вообще.
Нарисовать многоугольник с помощью (command или vl-cmdf "_poligon") а потом с помощью entget получить координаты -- это путь наименьшего сопротивления.
Ну и соответственно если я не хочу видеть сообщения об инвалидных объектах, то от командного сценария придется отказаться.
mmax вне форума  
 
Автор темы   Непрочитано 03.04.2006, 11:10
#196
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Ну ладно с глюками разобрались.

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

1. Фланец рисуется гденибудь, например на невидимом слое или слоях тк типы линий разные, полученные примитивы добавляются в набор, копируются с начальной точкой вставки, удаляются вместе со слоями, далее отдаем пользователю на растерзание команду вставки.

2. все тоже самое только из примитивов создаем блок, отдаем пользователю вставку блока, Если пользователь ткнул мышью, запоминаем точку вставки, и относительно точки вставки заново отрисовываем примитивы и удаляем блок.

??????????Я правильно мыслю???????????
mmax вне форума  
 
Непрочитано 03.04.2006, 11:22
#197
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Если пользователь ткнул мышью, запоминаем точку вставки, и относительно точки вставки заново отрисовываем примитивы и удаляем блок.

??????????Я правильно мыслю???????????
Проще взорвать блок, если конечно оно надо.
vk вне форума  
 
Непрочитано 03.04.2006, 11:35
#198
Кулик Алексей aka kpblc
Moderator

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


ИМХО: Купить "САПР на базе" - там решение есть. Я не очень его понял, втупую скопировал и все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.04.2006, 12:06
#199
Zouss


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


само красивше будет если сначала, в DCL то есть, будет картинка со схемкой фланца, где будет видно-понятно какой параметр для чего нужен
Потом создаем блок там где надо и натравливаем на него команду move - не надо ничего удалять и с перерисовкой на экране париться

точно так же можно поступить и с многоугольником - сначала запрашиваем у пользователя его центр и прочее, как в команде polygon; потом entmake его с использованием (polar pt ang dist), а потом rotate на него
Чтоб совсем обойтись без вызова (command... можно при запросе параметров отрисовывать многоугольник через grdraw, делая "визуальнее", но тогда у нас будет два почти одинаковых куска программы вычисляющих вершины многоугольника - один для (grdraw... другой для (entmake...

в общем тут главное не перемешивать, не чередовать куски кода разного назначения - сначала спросить все у пользователя все параметры объекта, потом создать его, потом помучить с расположением - и править удобно и вероятность необъяснимых ошибок меньше
Zouss вне форума  
 
Непрочитано 03.04.2006, 19:01
#200
aldt


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


Apelsinov Помогите:
сообщение apel-plot-format "не найден файл описания форматов, программа остановлена"
вопрос как создать "apel-plot-format.txt"
aldt вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

Опции темы Поиск в этой теме
Поиск в этой теме:

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