Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 147
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Старый 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2054782
 
Старый 11.04.2016, 20:30
1 | #2921
Кулик Алексей aka kpblc
Moderator

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


Во-первых, не путай BlockDefinition и BlockReference. Во-вторых, твою задачу легче решать через обычный lisp, без применения ActiveX. ПРимерно так:
Код:
[Выделить все]
 (defun test (/ ss)
  (if (= (type (setq ss (vl-catch-all-apply (function (lambda () (ssget '((0 . "INSERT")))))))) 'pickset)
    (vl-sort ((lambda (/ tab item)
                (repeat (setq tab  nil
                              item (sslength ss)
                              ) ;_ end setq
                  (setq tab (cons (ssname ss (setq item (1- item))) tab))
                  ) ;_ end repeat
                ) ;_ end of LAMBDA
              )
             (function (lambda (a b) (< (caddr (assoc 10 (entget a))) (caddr (assoc 10 (entget b))))))
             ) ;_ end of vl-sort
    ) ;_ end of if
  ) ;_ end of defun
Код писал "насухую", без проверок.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 13.04.2016, 10:07
#2922
Neo


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


как получить имя блока через его атрибут?
выбираю на экране атрибут: (car (nentsel "\nSelect block:")), далее хочу получить значение другого атрибута ("tag") этого блока.
спасибо
Neo вне форума  
 
Старый 13.04.2016, 10:42
#2923
Кулик Алексей aka kpblc
Moderator

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


Может, проще будет сначала все же вхождение блока получить?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 13.04.2016, 10:44
#2924
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


В возвращаемом списке (nentsel) один из элементов как раз - объект блока.
Прошу прощения, был неправ (с учетом следующего поста) - совершенно позабыл.

Последний раз редактировалось skkkk, 15.04.2016 в 00:16.
skkkk вне форума  
 
Старый 13.04.2016, 10:55
1 | #2925
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Цитата:
В возвращаемом списке (nentsel) один из элементов как раз - объект блока.
Неправда ваша (если выбирать именно атрибут, а не блок). Если выбирать атрибут, то нужно раскручивать вопрос с именами как-то так:
Код:
[Выделить все]
 (vlax-vla-object->ename 
(vla-ObjectIDtoObject(vla-get-ActiveDocument(vlax-get-acad-object))
(vla-get-OwnerID(vlax-ename->vla-object(car (nentsel "\nSelect block:"))))))
P_S вне форума  
 
Старый 13.04.2016, 11:02
#2926
Neo


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


идея такая, что мышкой указываю на атрибут, а в отчет (электрические схемы подключения ) будет уходить "tag"+"указанный атрибут". два выбора мышкой не хочу, т.к. возможно ошибиться. пока решил, для всех блоков, создать ассоциативный список всех Handle атрибутов и самого блока, а там искать по Handle

Цитата:
В возвращаемом списке (nentsel) один из элементов как раз - объект блока.
да. а мне бы получить сам блок, для считывания его других атрибутов

UPD: to P_S OwnerID подходит лучше, спасибо

Последний раз редактировалось Neo, 13.04.2016 в 11:19.
Neo вне форума  
 
Старый 13.04.2016, 11:23
#2927
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Neo Посмотреть сообщение
идея такая, что мышкой указываю на атрибут, а в отчет (электрические схемы подключения ) будет уходить "tag"+"указанный атрибут". два выбора мышкой не хочу, т.к. возможно ошибиться. пока решил, для всех блоков, создать ассоциативный список всех Handle атрибутов и самого блока, а там искать по Handle
При создании блоков должна быть проработана структура атрибутов, чтобы потом оттуда получать данные, не тыкая в каждый блок в отдельности, имхо.
Сергей812 вне форума  
 
Старый 13.04.2016, 11:41
#2928
Neo


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
При создании блоков должна быть проработана структура атрибутов, чтобы потом оттуда получать данные, не тыкая в каждый блок в отдельности, имхо.
тут идея создать отчет в последовательности указанной пользователем
Neo вне форума  
 
Старый 13.04.2016, 11:57
#2929
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Neo Посмотреть сообщение
тут идея создать отчет в последовательности указанной пользователем
Тогда опять же - при унифицированной системе атрибутов достаточно выбирать блоки, а уже макрос - в зависимости от его назначения - выдергивает нужные значения. И вероятность человеческого фактора меньше - это надо вообще мимо блока промахнуться в целом)
Сергей812 вне форума  
 
Старый 13.04.2016, 22:45
#2930
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Я некоторые атрибуты делаю скрытыми и храню в них какие-то данные, связанные с конкретным экземпляром блока. Например атрибут "ДЛИНА", где записывается какое-то число. Чтобы извлечь это значение я получаю атрибуты блока, прохожусь по ним в цикле и если таг очередного атрибута "ДЛИНА" - считываю его значение. Немного напрягает такой способ своей нерациональностью. Было бы гораздо проще, если бы вот это числовое значение извлекалось по какому-то ключу или заранее определенному индексу. Можно ли цеплять к блокам такие данные?
Сет вне форума  
 
Старый 13.04.2016, 23:33
1 | #2931
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Расширенные данные?
Сергей812 вне форума  
 
Старый 13.04.2016, 23:34
#2932
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Расширенные данные?
Ну я не знаю, потому и спрашиваю. Поясните простым примером.
Сет вне форума  
 
Старый 13.04.2016, 23:40
#2933
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


так поищите в инете.. lisp работа с расширенными данными. А еще словари есть
Сергей812 вне форума  
 
Старый 14.04.2016, 13:41
#2934
George_D


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


Добрый день, список представляет собой следующий вид ( (сила ( координаты точки приложения) (сила ( координаты точки приложения) и тд. ......). Не получается отсортировать его по возрастанию суммы координат (x+y) точек приложения.
Т.е. Из такого списка ((5.5 (3000.0 3000.0 0.0)) (10.0 (4500.0 3000.0 0.0)) (7.6 (1500.0 3000.0 0.0))) должен получиться ((7.6 (1500.0 3000.0 0.0)) (5.5 (3000.0 3000.0 0.0)) (10.0 (4500.0 3000.0 0.0)))

Пробую

Код:
[Выделить все]
 (setq list_tochek_sil ( list ( list  5.5 ( list 3000.0 3000.0 0.0)) ( list 10.0 ( list 4500.0 3000.0 0.0)) (list 7.6 (list 1500.0 3000.0 0.0))) )
(vl-sort  list_tochek_sil (function ( lambda ( e1 e2) (>
   (+(nth 0 (nth 0 (cdr e1))) (nth 1 (nth 0 e1))))
   (+(nth 0 (nth 0 (cdr e2))) (nth 1 (nth 0 (cdr e2))))				     
		)))
не выходит . Подскажите , пожалуйста, как это сделать?
George_D вне форума  
 
Старый 14.04.2016, 13:48
#2935
Neo


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


to Сет : да и я тоже так делаю. В принципе у меня в блоках атрибутов не так и много, и пройтись циклом по каждому много времени не займет, но согласен, что рационально как-то. А если "ДЛИНА" будет не в атрибуте, то как её задавать на чертеже?
Neo вне форума  
 
Старый 14.04.2016, 13:49
#2936
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun test (/ list_tochek_sil)
  (setq list_tochek_sil
         (list (list 5.5 (list 3000.0 3000.0 0.0))
               (list 10.0 (list 4500.0 3000.0 0.0))
               (list 7.6 (list 1500.0 3000.0 0.0))
               ) ;_ end of list
        ) ;_ end of setq
  (vl-sort list_tochek_sil (function (lambda (a b) (> (apply '+ (cadr a)) (apply '+ (cadr b))))))
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 14.04.2016, 13:54
#2937
George_D


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


Спасибо
George_D вне форума  
 
Старый 14.04.2016, 18:27
#2938
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Neo Посмотреть сообщение
А если "ДЛИНА" будет не в атрибуте, то как её задавать на чертеже?
Как задавать - способов много. У меня, например, блок строки спецификации включает в себя различные данные, формируемые на стадии создания этой самой строки спецификации. Затем эти невизуальные данные используются для групповых спецификаций и прочего. Проходить циклом по каждому атрибуту и сравнивать каждый атрибут с требуемым именем в поисках нужного - довольно корявое решение. Тут даже дело не в затратах машинного времени (в данном случае это не критично), а, я бы сказал, в эстетике программирования Тупой перебор выглядит весьма топорно.
Сет вне форума  
 
Старый 15.04.2016, 10:37
#2939
Neo


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


Цитата:
Сообщение от Сет Посмотреть сообщение
Проходить циклом по каждому атрибуту и сравнивать каждый атрибут с требуемым именем в поисках нужного - довольно корявое решение.
как я понял, в vlisp нету хеш-таблиц, и assoc тоже работает перебором, правильно?
Neo вне форума  
 
Старый 19.04.2016, 22:14
#2940
Дима_

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


Цитата:
Сообщение от Neo Посмотреть сообщение
как я понял, в vlisp нету хеш-таблиц, и assoc тоже работает перебором, правильно?
Да правильно, я где-то здесь (может даже и в этой теме) выкладывал реализацию словарей (Map) на основе двоичных деревьев.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46