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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1965800
 
Непрочитано 03.05.2018, 18:50
#3541
kurstep


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


Всем привет, подскажите пожалуйста... Мне надо разбить мультилинию и получить все образовавшиеся из нее объекты(отрезки). Вначале думал все просто решаемо :
Код:
[Выделить все]
 (vlax-safearray->list (vlax-variant-value (vla-explode MultiLine)))
Но в итоге так не работает...
Все хорошо разбивается таким способом:
Код:
[Выделить все]
   (setq nabor1 (ssget))
(vl-cmdf "_.explode" nabor1)
Но как в таком случает получить указатели на полученные объекты?... entlast возвращает только один объект, а у меня их много
kurstep вне форума  
 
Непрочитано 03.05.2018, 19:07
#3542
Сергей812


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


Цитата:
Сообщение от kurstep Посмотреть сообщение
entlast возвращает только один объект, а у меня их много
а если вызвать entlast и запомнить последний объект БД перед разбивкой, а потом пройтись после разбивки в цикле entnext от запомненного ранее объекта?
Сергей812 вне форума  
 
Непрочитано 03.05.2018, 19:14
#3543
kurstep


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а если вызвать entlast и запомнить последний объект БД перед разбивкой, а потом пройтись после разбивки в цикле entnext от запомненного ранее объекта?
В таком случае в моей программке entlast может выдать указатель на Мультилинию - так как пользователь перед разбиением может как раз создать мультилинию, и мне кажется в таком случае комп будет ругаться на бесконечный цикл
kurstep вне форума  
 
Непрочитано 03.05.2018, 19:27
1 | 1 #3544
Сергей812


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


Цитата:
Сообщение от kurstep Посмотреть сообщение
В таком случае в моей программке entlast может выдать указатель на Мультилинию - так как пользователь перед разбиением может как раз создать мультилинию, и мне кажется в таком случае комп будет ругаться на бесконечный цикл
entlast используется только для получения текущего последнего объекта в БД чертежа, а когда разобьете мультилинию, то акад создаст новые объекты и добавит их в БД чертежа. И они будут идти после объекта, полученного ранее entlast. Просто при первом вызове entnext нужно что-то принять в роли отправной точки, и это будет объект - полученный по entlast. Что это будет за объект - в данном случае вообще не играет роли. А потом в цикле будете получать объект за объектом, пока не вернет nil. Соответственно, в качестве аргумента entnext надо будет подставлять предыдущий найденный элемент - или действительно цикл подвесите.

Ну или как вариант - разбивайте на отдельном вспомогательном слое, а потом разом сгребете все объекты полученные.
Сергей812 вне форума  
 
Непрочитано 03.05.2018, 21:48
#3545
koMon


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


Цитата:
Сообщение от kurstep Посмотреть сообщение
Мне надо разбить мультилинию и получить все образовавшиеся из нее объекты(отрезки).
Можно так. Выбрать млинию, определить и запомнить её прямоугольные границы. Взорвать млинию, выбрать отрезки рамкой/секрамкой по запомненным ранеет границам млинии.
koMon вне форума  
 
Непрочитано 03.05.2018, 21:51
#3546
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Можно так. Выбрать млинию, определить и запомнить её прямоугольные границы. Взорвать млинию, выбрать отрезки рамкой/секрамкой по запомненным ранеет границам млинии.
а если попадутся в пределах контейнера "чужие" отрезки - то это уже их проблемы)
Сергей812 вне форума  
 
Непрочитано 03.05.2018, 22:49
#3547
koMon


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
это уже их проблемы)
пожалуй, это скорее неприятный нюанс

----- добавлено через ~20 мин. -----
но и его можно обойти, например, сделав предварительный набор по границам млинии, и если он будет не нулевой после удаления млинии, вычесть его из выделенных отрезков, после взрыва млинии.
koMon вне форума  
 
Непрочитано 03.05.2018, 23:34
#3548
Кулик Алексей aka kpblc
Moderator

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


Выбор по точкам будет работать только при одном условии - все точки, определяющие границы, видны на экране. Так охота тратить тьму времени на регенерацию чертежа?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.05.2018, 09:31
#3549
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так охота тратить тьму времени на регенерацию чертежа?
ну да, нужно будет определить попала ли млиния в экран, сделать зумаут в её границы если нет, выбрать всё и далее по пунктам, но сдаётся мне, что для юзера это это произойдёт практически незаметно если конечно это делать на vla.
koMon вне форума  
 
Непрочитано 04.05.2018, 09:38
#3550
Кулик Алексей aka kpblc
Moderator

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


Без проверок, насухую:
Код:
[Выделить все]
 (defun tt (/ ent lastent res)
(setq ent     (car (entsel "\nSelect MLINE : "))  lastent (entlast))
(command-s "_.explode" ent)
(while (setq lastent (entnext lastent)) (setq res (cons lastent res)))
(reverse res)
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.05.2018, 09:50
#3551
kurstep


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Без проверок, насухую:
Кулик Алексей aka kpblc спасибо, все вроде работает, Но почему-то выдается такое окно... Никогда мне такую ошибку комп не выдавал, это как так?
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 46
Размер:	25.0 Кб
ID:	201857  
kurstep вне форума  
 
Непрочитано 04.05.2018, 09:58
#3552
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Подскажите как масштабировать vla способом последний активный объект?
sdv79 вне форума  
 
Непрочитано 04.05.2018, 10:36
1 | 1 #3553
Кулик Алексей aka kpblc
Moderator

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


kurstep, сейчас прогнал код на ACAD2016 (отладку другой задачи приостановил) - работает корректно, ошибки ядра не выдает
sdv79, см. vla-scaleentity
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.05.2018, 11:23
#3554
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Алексей спасибо, заработало)
sdv79 вне форума  
 
Непрочитано 04.05.2018, 11:54
#3555
Кулик Алексей aka kpblc
Moderator

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


только сейчас сообразил - а (command-s "_.explode" ent) случайно не надо завершать пустой строкой? А то как-то я с командными методами не очень...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.05.2018, 15:38
#3556
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(reverse res)
наверно, если нужно получить просто список примитивов после разбития - то можно исключить?
Сергей812 вне форума  
 
Непрочитано 06.05.2018, 19:34
#3557
Кулик Алексей aka kpblc
Moderator

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


Ага, можно. Если действительно порядок не играет никакой роли.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.05.2018, 10:37
#3558
RrRR


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
только сейчас сообразил - а (command-s "_.explode" ent) случайно не надо завершать пустой строкой? А то как-то я с командными методами не очень...
Нее, не надо, работает и без завершения пустой строкой
RrRR вне форума  
 
Непрочитано 07.05.2018, 12:43
#3559
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


RrRR, Отслеживание объектов появившихся после pasteclip
Там две функции:
mip:mark - маркировка перед взрывом
mip:get-last-ss - возвращает ввиде набора вновь появившиеся объекты
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.05.2018, 10:48
#3560
RrRR


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


VVA, спасибо за ссылку!
А мой пост относился только к проверке лиспа Алексея #3550
RrRR вне форума  
Ответ
Вернуться   Форум 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