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

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

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

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

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

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

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

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

Всем заранее благодарен.
Просмотров: 79693
 
Непрочитано 27.02.2006, 22:05
#81
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Тогда, перед всеми извиняюсь, что на favorite навел напраслину, а vk заставил лезть на сайт и проверять...
Елпанов Евгений вне форума  
 
Непрочитано 28.02.2006, 00:43
#82
vk

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


Цитата:
Сообщение от favorite
Вот и изучай Lisp по инету. Где, я спрашиваю у них кавычка и пробел?
К сожалению, далеко не все что выложено в инете, не содержит ошибок и опечаток. Однако, в хелп кому то трудно заглянуть, чтоб посмотреть правильный синтаксис....
vk вне форума  
 
Автор темы   Непрочитано 28.02.2006, 19:54
#83
mmax

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


Цитата:
Сообщение от vk
Пробовал сделать по Вашей методике. Написал вот такой код
Код:
[Выделить все]
(setq a 22 b 6 c 7 d 8)

(if (or
      (= a 5)
      (= b 6)
      (= c 7)
      (= d 8)
    )
  (princ "\nДействие 1 \"все условия верны\"")
  (princ "\nДействие 2 \"хотя бы одно условие из всех условий не верно\"")
)
Загрузил из консоли. Пишет
Цитата:
_$

Действие 1 "все условия верны"
; 2 forms loaded from #<editor "<Untitled-0> loading...">
_$
Уважаемый mmax, подскажите в чем дело?
Действительно,

навреное я устал и меня начало глючить.
Пойду посплю
mmax вне форума  
 
Непрочитано 02.03.2006, 21:54
#84
favorite

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


Помогите.
Разбирая работу со списками не могу понять как, если у меня в блоке есть текст и еще ряд примитивов как уневерсально, добраться до них.
  • (setq a (ssget))
    (sslength a) ; "Определяет количество примитивов в наборе "
    (setq w (ssname a 0)) ;Вытаскивает n элемент из набора если в наборе несколько элементов
    (terpri)

    (setq r (entget w)) ; Вытаскивает список для выбранного элемента
- В списке несколько примитивов как их вытащить по очереди ?
favorite вне форума  
 
Непрочитано 02.03.2006, 22:15
#85
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>favorite

"Классические" варианты такие:

Код:
[Выделить все]
(setq Count 0) ; присвоить счётчику начальное значение
(repeat(sslength a) ; повторить по количеству элементов в наборе
  (setq Entity(nth Count a)) ; получить из набора очередной примитив

  ;тут любые действия с очередным примитивом

  (setq Count(1+ Count)) ; увеличить счётчик на 1
  ); end repeat
или

Код:
[Выделить все]
(setq Count 0)
(while(<(sslength a)Count) ;пока счётчик меньше длинны набора
  (setq Entity(nth Count a))

  ;;тут любые действия с очередным примитивом

  (setq Count(1+ Count))
  ); end while
Однако хочется отметить что LISP это язык обработки списков и на практике набор чаще преобразовывают в список, поскольку для обработки списков существует большое количество быстрых функций.

Зачем (terpri) вставил Она служит только для перевода строк при выводе текста.
{Smirnoff} вне форума  
 
Непрочитано 02.03.2006, 22:42
#86
favorite

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


Наверное я плохо объяснил что мне надо в результате работы моей программы получается
((-1 . <Entity name: 7e202b40>) (0 . "INSERT") (330 . <Entity name: 7e3d3cf8>) (5 . "28D8") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "Ïðèìèòèâ") (10 23785.8 22829.1 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Фактически мне нужно не перебрать все объекты, а найти имена примитивов в списке <Entity name: 7e3d3cf8>) , чтобы потом функцией
ssget развернуть его и затем подправить.

Задача:
У меня в блоке текст и я хочу до него добраться.
favorite вне форума  
 
Непрочитано 02.03.2006, 23:42
#87
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Задача:
У меня в блоке текст и я хочу до него добраться.
Вот теперь задача сформулирована правильно, она совсем "из другой оперы" и не имеет практически никакого отношения к представленному вами коду.

Описание блока (Block) - находится в таблице "BLOCK" (есть такая форма хранения информации в чертеже). В сам чертёж вставляются только "отражения" этой информации (Block Reference). К примеру найдём в таблице "BLOCK" описание блока с названием "My_Block":
Код:
[Выделить все]
(setq bl(tblsearch "BLOCK" "My_Block"))
Код:
[Выделить все]
((0 . "BLOCK") (2 . "My_Block") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Entity name: 
7ef57ef8>))
Теперь найдём первый примитив в описании блока. Для этого надо выделить данные точечной пары с кодом -2:
Код:
[Выделить все]
 (setq Ent(cdr(assoc -2 bl)))
Для проверки каждого примитива на тип и другие свойства естественно:
Код:
Код:
[Выделить все]
((-1 . <Entity name: 7ef57ef8>) (0 . "LINE") (330 . <Entity name: 7ef57ee0>) (5 
. "97") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 -2.86742 
-3.49823 0.0) (11 3.29162 4.01575 0.0) (210 0.0 0.0 1.0))
Для получения следующего примитива существует функция ENTNEXT. Для перебора всех примитивов в блоке надо сделать цикл с условием "пока существует следующий примитив" (это человеческим языком).
Код:
[Выделить все]
(setq Ent(cdr(assoc -2 bl))); получение первого примитива
(while Ent ; пока есть очередной примитив
  (setq Ent(entnext Ent)); получить следующий примитив
(if Ent ; если примитив получен

; ваши действия

); end if  
); end while
Хочу вам также сказать что аналогичные операции проще делать "объектным" (VisualLISP) методом, где всё называется своими именами. Т. е. для получния допустим цвета объекта применяется функция vla-get-color, слоя vla-get-layer и т. д. Но советую пройти школу "обычного" LISP (AutoLISP) до конца, иначе будете слегка "недоделанным".
{Smirnoff} вне форума  
 
Непрочитано 02.03.2006, 23:52
#88
favorite

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


Огромное спасибо, очень помогли. А то сижу уже несколько дней и никак понять не могу.
Скажите а функцию entnext c ssget использовать нельзя? я правильно понял.
favorite вне форума  
 
Непрочитано 03.03.2006, 00:14
#89
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Скажите а функцию entnext c ssget использовать нельзя? я правильно понял.
Функция ENTNEXT возвращает метки примитивов в том порядке, в котором они находятся в базе данных чертежа или в описании блока, а функция SSGET формирует набор по определённым признакам (см. дополнительные параметры).
Классический пример использования функции ENTNEXT (кроме перебора примитивов в блоке) это сбор объектов после расчленения блоков, мультилиний, размеров (тоже кстати блок). Общий алгоритм такой:
Код:
[Выделить все]
(setq lent(entlast)); получаем поледний неудалённый примитив
(command "_.explode" "My_Block" "") ;"взорвали" блок
Далее идет сбор примитивов появившихся после расчленения блока, начиная от (entnext lent) и до поледнего. Обычно они собираются в новый набор созданный функцией SSADD или просто обрабатываются в вышеприведенном примере цикла.
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 00:25
#90
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Кстати если вы более мение прилично читаете по английски (а это просто необходимо для самотоятельного изучения) лучший сайт для обучения AutoLISP это www.afralisp.co.za . Также для получения бесчисленного количества примеров по любой функции, просто заходите на www.google.com и набираете эту функцию в строке поиска. Особенно хороши японские и корейские сайты . Я не шучу, там народ тоже "копает", причём независимо от нас и англоязычных парней. Есть еще один "заповедник" программирования в Autocad www.theswamp.org , там очень сильный контенгент. Хотя думаю что этого сайта и www.autocad.ru впринципе достаточно.
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 01:46
#91
vk

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


Цитата:
Сообщение от {Smirnoff}
Классический пример использования функции ENTNEXT (кроме перебора примитивов в блоке) это сбор объектов после расчленения блоков, мультилиний, размеров (тоже кстати блок)...
Осколки после взрыва можно собрать (ssget "_P") , кажется проще.
vk вне форума  
 
Непрочитано 03.03.2006, 08:06
#92
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Осколки после взрыва можно собрать (ssget "_P") , кажется проще.
В общем то да, но в этом случае требуется проверка - а получилось ли взорвать? Иначе можно получть совсем не тот набор.
Да и не всегда нужен набор, иногда нужно просто обработать что-то по одному примитиву. Так что и то и другое хорошо в своём случае
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 08:12
#93
Кулик Алексей aka kpblc
Moderator

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


Если надо добраться до элементов описания блока (без взрывания), можно попробовать такое:
Код:
[Выделить все]
(defun _kpblc-block-get-content	(block-name / adoc res)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (tblobjname "block" block-name)
    (vlax-for item (vla-item (vla-get-blocks adoc) block-name)
      (setq res (append res (list item)))
      ) ;_ end of vlax-for
    ) ;_ end of if
  res
  ) ;_ end of defun
Вернет список vla-указателей на примитивы, входящие в блок либо nil, если имя запрашиваемого блока не содержится в чертеже.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2006, 09:37
#94
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>kpblc
Да это просто прорыв в программировании!

Шучу, не обижайся. Тут просто ребята пока элементарные вопросы задают, не нужОн им пока Visual (сугубо личное мнение).
{Smirnoff} вне форума  
 
Непрочитано 03.03.2006, 09:51
#95
Кулик Алексей aka kpblc
Moderator

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


> {Smirnoff} : Шутку понял
Просто мне, например, оказалось проще работать через vla-функции - вот и пропагандирую их где ни попадя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2006, 10:36
#96
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
> {Smirnoff} : Шутку понял
Просто мне, например, оказалось проще работать через vla-функции - вот и пропагандирую их где ни попадя
Вот и посылай таким умнык книжки - ОК, инфу об умных книжках - на чвою голову...
Лентяй вне форума  
 
Непрочитано 03.03.2006, 10:55
#97
Кулик Алексей aka kpblc
Moderator

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


Лентяй, Лентяй... Я ж отлично помню всех, кто мне помогал. Если перечислять начну, я ж работать не буду дня два, не меньше!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2006, 18:29
#98
mmax

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


Господа, подскажите, как сохранить в переменной имена всех слоев текущего рисунка для передачи их в раскрывающийся список диалогового окна DCL, где пользователю предлагается выбрать один из имеющихся слоев.

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

Проблема эта вызвана тем, что я не могу угадать какой слой использует пользователь для рисования допустим осевых линий, поэтому я решил предоставить пользователю выбрать самому выбрать слой для того или иного типа линий.
mmax вне форума  
 
Непрочитано 03.03.2006, 19:10
#99
Apelsinov

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


например так можно получить список слоев:
Код:
[Выделить все]
(defun test (/ layers_lst)
  (vlax-for i
	      (vla-get-layers
		(vla-get-ActiveDocument (vlax-get-acad-object))
	      )
    (setq layers_lst (cons (vla-get-name i) layers_lst))
  )
  (reverse layers_lst)
)
;;;(test)
Apelsinov вне форума  
 
Непрочитано 03.03.2006, 20:15
#100
favorite

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


Цитата:
Сообщение от kpblc
Если надо добраться до элементов описания блока (без взрывания), можно попробовать такое:
Код:
[Выделить все]
(defun _kpblc-block-get-content	(block-name / adoc res)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (tblobjname "block" block-name)
    (vlax-for item (vla-item (vla-get-blocks adoc) block-name)
      (setq res (append res (list item)))
      ) ;_ end of vlax-for
    ) ;_ end of if
  res
  ) ;_ end of defun
Вернет список vla-указателей на примитивы, входящие в блок либо nil, если имя запрашиваемого блока не содержится в чертеже.
ДА......!!!!! Это очень сложно для меня даже понять о чем реч идет не могу . :cry:

Подскажите пытаюсь текст в блоке заменить что-то не получается скажите где я не прав.

Код:
[Выделить все]
(setq a (tblsearch "Block" "RRR"))
(setq b (cdr(assoc -2 a)))
(setq Bsp1 (entget b))
(setq OLD (cdr(assoc 1 Bsp1)))
(setq New (subst "ПРОБА" old BSp1))
(entupd a)
favorite вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)