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

Вернуться   Форум 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.
Просмотров: 2048454
 
Непрочитано 11.06.2024, 14:22
#4581
Кулик Алексей aka kpblc
Moderator

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


Т.е. конструкция типа (ssget "_+.:S:L:E" '((0 . "INSERT")(2 . "АБВ")) не катит в принципе? )
Сейчас не у акада, проверить корректность синтаксиса не могу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.06.2024, 14:23
#4582
Сергей812


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


Цитата:
Сообщение от Сет Посмотреть сообщение
но подумал может есть какой-то фильтр выбора по типу ssget.
делаете отдельный файл с функциями выбора примитивов и нужными фильтрациями. И эти функции возвращают значение или nil в случае отказа пользователя от выбора. Код будет гораздо читабельный основной.

Кстати, отказ пользователя от выбора в entsel вроде через генерацию ошибки идет - т.е. и это нужно тоже обработать.

----- добавлено через ~6 мин. -----
прикольно, только возвращает набор и не работает с динблоками, и отказ пользователя все равно обрабатывать надо
Сергей812 вне форума  
 
Непрочитано 11.06.2024, 14:46
#4583
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
прикольно, только возвращает набор и не работает с динблоками, и отказ пользователя все равно обрабатывать надо
Ессно ) Вариантов решения чуть больше чем сопутствующих вопросов )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.06.2024, 15:25
#4584
Сергей812


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


слепил функцию на .Net: выбирает блок ABC (может быть и динамическим) - возвращает либо вставку блока, либо null при отказе пользователя от выбора

Код:
[Выделить все]
 
private BlockReference GetBlockWithName(string aName)
        {
            if (string.IsNullOrEmpty(aName)) throw new ArgumentException("Не задано имя блока!");
            Document lDoc = Application.DocumentManager.MdiActiveDocument;
            Database lDb = lDoc.Database;
            Editor lEd = lDoc.Editor;
            PromptEntityOptions lPEO = new PromptEntityOptions("\nВыберите блок:");
            lPEO.SetRejectMessage("\nНужно выбирать блок");
            lPEO.AddAllowedClass(typeof(BlockReference), false);
            BlockReference lOutput = null;
            do
            {
                PromptEntityResult lPER = lEd.GetEntity(lPEO);
                if (lPER.Status != PromptStatus.OK) break;
                using (Transaction lTr = lDb.TransactionManager.StartTransaction())
                {
                    BlockReference lBR = lTr.GetObject(lPER.ObjectId, OpenMode.ForRead) as BlockReference;
                    string lName = (lTr.GetObject(lBR.IsDynamicBlock ? 
                        lBR.DynamicBlockTableRecord : lBR.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord).Name;
                    lOutput = lName.Equals(aName) ? lBR : null;
                    if (lOutput == null) lEd.WriteMessage("\nНадо выбирать блок с именем [ {0} ]!\n", aName);
                    lTr.Commit();
                }
            } while (lOutput == null);
            return lOutput;
        }


если кто сделает на лиспе аналог, выложите, плиз - сравнить по объему кода
Сергей812 вне форума  
 
Непрочитано 11.06.2024, 16:05
1 | #4585
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
слепил функцию на .Net: выбирает блок ABC (может быть и динамическим) - возвращает либо вставку блока, либо null при отказе пользователя от выбора

Код:
[Выделить все]
 
private BlockReference GetBlockWithName(string aName)
        {
            if (string.IsNullOrEmpty(aName)) throw new ArgumentException("Не задано имя блока!");
            Document lDoc = Application.DocumentManager.MdiActiveDocument;
            Database lDb = lDoc.Database;
            Editor lEd = lDoc.Editor;
            PromptEntityOptions lPEO = new PromptEntityOptions("\nВыберите блок:");
            lPEO.SetRejectMessage("\nНужно выбирать блок");
            lPEO.AddAllowedClass(typeof(BlockReference), false);
            BlockReference lOutput = null;
            do
            {
                PromptEntityResult lPER = lEd.GetEntity(lPEO);
                if (lPER.Status != PromptStatus.OK) break;
                using (Transaction lTr = lDb.TransactionManager.StartTransaction())
                {
                    BlockReference lBR = lTr.GetObject(lPER.ObjectId, OpenMode.ForRead) as BlockReference;
                    string lName = (lTr.GetObject(lBR.IsDynamicBlock ? 
                        lBR.DynamicBlockTableRecord : lBR.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord).Name;
                    lOutput = lName.Equals(aName) ? lBR : null;
                    if (lOutput == null) lEd.WriteMessage("\nНадо выбирать блок с именем [ {0} ]!\n", aName);
                    lTr.Commit();
                }
            } while (lOutput == null);
            return lOutput;
        }


если кто сделает на лиспе аналог, выложите, плиз - сравнить по объему кода
Код:
[Выделить все]
 (vl-load-com)

(defun _select-block-with-name (name / ent ref_name)
  ;; name - имя блока. nil -> "*"
  ;; Возвращает vla-указатель на вхождение или nil
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel (strcat "\nSelect block with name \"" name "\" <Cancel> : ")))
                                  )
                                )
                              )
                    )
              )
              'ename
           )
           (= (cdr (assoc 0 (entget ent))) "INSERT")
           (setq name (cond ((name) (strcase name))
                            (t "*")
                      )
           )
           (setq ent (vlax-ename->vla-object ent))
           (setq ref_name (cond ((vlax-property-available-p ent 'effectivename)  (vla-get-effectivename ent))
                                ((vlax-property-available-p ent 'name) (vla-get-name))
                          )
           )
           (wcmatch (strcase ref_name) name)
      )
    ent
  )
)
----- добавлено через 44 сек. -----
Как один из оооочень многих вариантов

----- добавлено через ~1 мин. -----
P.S. Код не проверял, некогда
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.06.2024, 16:36
#4586
Сергей812


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


в принципе, сравнимы объемы кода - в лиспе скрытые транзакции, работа по умолчанию с активным документом - код покомпактнее немного.
Сергей812 вне форума  
 
Непрочитано 11.06.2024, 18:31
#4587
Кулик Алексей aka kpblc
Moderator

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


У тебя выбор закольцован, у меня - нет
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.06.2024, 19:33
#4588
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У тебя выбор закольцован, у меня - нет
т.е. в случае выбора блока с другим именем тоже вернет nil, как и в случае отказа пользователя от выбора?
Сергей812 вне форума  
 
Непрочитано 11.06.2024, 19:49
#4589
Кулик Алексей aka kpblc
Moderator

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


Угу. Код писал на бегу так что сорян
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.06.2024, 14:30
1 | #4590
skkkk


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если кто сделает на лиспе аналог, выложите, плиз - сравнить по объему кода
У меня вот, что вышло
Код:
[Выделить все]
 (defun sel_block_by_name (blcname / blc)
(vl-load-com)
	(while 
		(or 
			(null blc)
			(/= (cdr (assoc 0 (entget blc))) "INSERT")
			(and
				(/= (cdr (assoc 2 (entget blc))) blcname)
				(/= (vla-get-EffectiveName (vlax-ename->vla-object blc)) blcname)
			)
		)
		(setq blc (car (entsel (strcat "\nУкажите блок с именем " blcname " <Отмена>"))))
		(if (= (getvar "ERRNO") 52)
			(progn 
				(setq blc T)
				(princ "\nОтменено")
				(princ)
			)
			(princ)
		)
	)
	blc
)
----- добавлено через 49 сек. -----
Вызывать так:
Код:
[Выделить все]
(SEL_BLOCK_BY_NAME "ABC")

Последний раз редактировалось skkkk, 12.06.2024 в 15:40.
skkkk вне форума  
 
Непрочитано 12.06.2024, 15:32
1 | #4591
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


переменная blc всегда будет иметь начальное значение nil при вызове функции, строка с присвоением ей nil не нужна.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 12.06.2024, 15:40
#4592
skkkk


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


Цитата:
Сообщение от koMon Посмотреть сообщение
переменная blc всегда будет иметь начальное значение nil при вызове функции
Ну я что-то так привык делать после какой-то коллизии, вроде. На случай, если переменная с таким именем вдруг существует глобально. Проверил сейчас - даже если глобально существует, то внутрь функции она не "попадает". Понял, спасибо, koMon)

P.S.: При этом, после выполнения функции назначенная глобально одноимённая переменная так и осталась, какой была.
skkkk вне форума  
 
Непрочитано 12.06.2024, 16:40
#4593
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
При этом, после выполнения функции назначенная глобально одноимённая переменная так и осталась, какой была.
Ессно - ибо область видимости
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.06.2024, 17:15
#4594
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
переменная blc всегда будет иметь начальное значение nil при вызове функции, строка с присвоением ей nil не нужна.
В том же шарпе требует обязательную начальную инициализацию локальной переменной перед первым присваиванием ее значения другой переменной - иначе выдает ошибку.
А в лиспе, как понимаю, из-за динамической типизации уже изначально уже есть значение переменной - трактуемое как nil по умолчанию.
Сергей812 вне форума  
 
Непрочитано 12.06.2024, 18:19
#4595
skkkk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ессно - ибо область видимости
Видимо, коллизию словил в один из раз, когда забыл объявить переменную в локальных.
skkkk вне форума  
 
Непрочитано 12.06.2024, 22:37
#4596
Сет


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


Сделал программку, которая подключает расширенные данные к объекту. Вроде бы код рабочий и она в 95% случаев работает так, как и ожидалось, но иногда расширенные данные по какой-то причине к объекту не подключаются. Не смог понять закономерность ошибки, чтобы понять что ее вызывает. Программка, конечно, получилась не самая простая, да и я не специалист по лиспу, так что есть вероятность, что просто я где-то начудил в коде, но возникает мысля, что с самими расширенными данными что-то не то. Подскажите, есть ли какая-то особенность расширенных данных, что они не всегда присоединяются к объекту? Или если такое происходит, то дело 100% в моем коде? Код не выкладываю, он довольно громоздкий, сложновато наверное будет в нем сходу понять в чем дело.
Сет вне форума  
 
Непрочитано 13.06.2024, 00:00
#4597
Сергей812


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


может пытаетесь совместить в XData идентификатор типа данных и сами данные другого типа вследствие пресловутой динамической типизации лиспа, например.

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
Проверил сейчас - даже если глобально существует, то внутрь функции она не "попадает"
а как обратиться к глобальной переменной, если в функции объявлена локальная с тем же именем?
Сергей812 вне форума  
 
Непрочитано 13.06.2024, 05:53
#4598
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а как обратиться к глобальной переменной, если в функции объявлена локальная с тем же именем?
Обозначить её в качестве параметра функции?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 13.06.2024, 08:34
#4599
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Сделал программку, которая подключает расширенные данные к объекту. Вроде бы код рабочий и она в 95% случаев работает так, как и ожидалось, но иногда расширенные данные по какой-то причине к объекту не подключаются. Не смог понять закономерность ошибки, чтобы понять что ее вызывает. Программка, конечно, получилась не самая простая, да и я не специалист по лиспу, так что есть вероятность, что просто я где-то начудил в коде, но возникает мысля, что с самими расширенными данными что-то не то. Подскажите, есть ли какая-то особенность расширенных данных, что они не всегда присоединяются к объекту? Или если такое происходит, то дело 100% в моем коде? Код не выкладываю, он довольно громоздкий, сложновато наверное будет в нем сходу понять в чем дело.
Ограничение на объем расширенных данных не превышено случайно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.06.2024, 09:25
#4600
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Обозначить её в качестве параметра функции?
А разрешит лисп объявить в одной функции и аргумент, и локальную переменную с одинаковыми именами? Не говоря уже о том, как задавать значение глобальной переменной.

Просто как написали выше
Цитата:
Сообщение от skkkk Посмотреть сообщение
На случай, если переменная с таким именем вдруг существует глобально. Проверил сейчас - даже если глобально существует, то внутрь функции она не "попадает".
я понимаю так - что если объявлена локальная переменная в функции, по имени совпадающая с глобальной - то лисп вместо ошибки будет по тихому обращаться к локальной переменной вместо глобальной. И тогда это великолепный способ для программиста "выстрелить себе в ногу" - думая, что он (программист) работает с глобальной переменной, по факту на выходе из функции остаться со старым значением глобальной переменной.

Последний раз редактировалось Сергей812, 13.06.2024 в 09:51.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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