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

Вернуться   Форум 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.
Просмотров: 1973326
 
Непрочитано 04.03.2011, 13:04
#1341
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Доброе время суток!

Прошу помощи:

что надо "скормить" функции
(command "-refedit" <объект>)

нужно подставить указатель на динблок, но ename

Код:
[Выделить все]
(setq ent (car (entsel)))
(vl-cmdf "-REFEDIT" ent "_o" "_o" "_a" "_n")
не принимает:

Код:
[Выделить все]
Команда: (vl-cmdf "-REFEDIT" ent ent "_o" "_o" "_a" "_n")
-REFEDIT Выберите вхождение:   Ссылка не найдена.
Выберите вхождение:   Ссылка не найдена.
Выберите вхождение: _o
 
*Неверный выбор*
Требуется один объект.
Выберите вхождение: _o
 
*Неверный выбор*
Требуется один объект.
Выберите вхождение: _a
 
*Неверный выбор*
Требуется один объект.
Выберите вхождение: _n
 
*Неверный выбор*
Требуется один объект.
nil
Выберите вхождение: *Прервано*
Что можно сделать?

А без refedit не сделать контекстного редактирования блока и преобразование динблока в блок. Если вручную выделять блок (по совету Супермакса) - то все Ок, но это не то, нужно автоматом разбивать.
Функции типа U2B и тп пробовал - не подходят.
Frigate вне форума  
 
Непрочитано 04.03.2011, 13:16
#1342
Лиспер


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


Контекстное редактирование блока - зачем под это дело программу ваять? Что-то одно - либо редактирование полностью ручное, либо полностью программное.
Преобразование дин.блока в обычный блок - а это-то зачем? Я реально не понимаю конечной цели...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 04.03.2011, 13:45
#1343
Дима_

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


"Накрутил" с refedit'ом AutoDesk что-то но выход есть:
Код:
[Выделить все]
(sssetfirst nil (ssadd (car (entsel))))
(vl-cmdf "_refedit"...)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.03.2011, 14:09
#1344
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Лиспер,

это нужно, чтобы сильно замороченные блоки разбивать, почему-то у меня и знакомого они не разбиваются программно, как у VVA:

http://forum.dwg.ru/showthread.php?p...d=1#post711939

Код:
[Выделить все]
(defun C:test (/ ;blk_ref attr_list)
        )
  (setq
    blk_ref (vlax-ename->vla-object (car (entsel "\nВыбери блок: ")))
    ) ;_ end of setq
  
  (setq attr_list (vlax-safearray->list
      (vlax-variant-value (vla-GetAttributes blk_ref))
      ) ;_ end of vlax-safearray->list
 ) ;_ end of setq
  
  (mapcar
    (function
      (lambda (x / txt)
 (setq txt (vla-get-textstring x))
 (vla-put-textstring x "")
 (vla-put-textstring x txt)
 ) ;_ end of lambda
      ) ;_ end of function
    attr_list
    ) ;_ end of mapcar
  
  (setq ent (vlax-vla-object->ename blk_ref))
  (sssetfirst nil (ssadd ent))
  (vl-cmdf "-REFEDIT" "_o" "_o" "_a" "_n")
  (vl-cmdf "_REFCLOSE" "_s")
  
  
  (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) ;_ end of vla-regen
  
  ) ;_ end of defun
теперь осталось только кусок проги дописать, чтобы после explode содержимое текстов было идентично значению атрибутов до explode. Но это уже не сложно должно быть.

Дима_,

большое спасибо :-)

Интересный ход!

Да уж, автодеск - еще тот перец )))

Последнее время при углубленном изучении автокада все чаще попадаются глюки - как например опции к той же команде _refedit - на русском автокад "не понимает", только оригинальные опции надо вводить
Frigate вне форума  
 
Непрочитано 04.03.2011, 14:33
#1345
Дима_

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Последнее время при углубленном изучении автокада все чаще попадаются глюки
Если "слезешь" с командных методов - глюков станет в разы меньше.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.03.2011, 14:58
#1346
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
к той же команде _refedit - на русском автокад "не понимает", только оригинальные опции надо вводить
Так это элементарное правило, относящееся ко всем командам - имена команд и опций только оригинальные, с префиксом "_". Для имен команд еще лучше префикс "_."
ShaggyDoc вне форума  
 
Непрочитано 04.03.2011, 15:41
#1347
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Frigate Посмотреть сообщение
почему-то у меня и знакомого они не разбиваются программно, как у VVA:
Ответил в теме
Цитата:
Сообщение от Frigate Посмотреть сообщение
как например опции к той же команде _refedit - на русском автокад "не понимает", только оригинальные опции надо вводить
Читать как минимум 1-й абзац
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.03.2011, 09:19
#1348
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


VVA,

я об опциях понимаю, что их надо на англ. писать, просто в руссифицированном автокаде с переведенными командами всегда можно было вводить опции и по русски - не в программе, а непосредственно при черчении, а с некоторыми командами, типа refedit (или ССЫЛРЕД) этого нельзя - не до конца переведена команда.

ДИМА,

благодаря VVA удалось обойтись без командных методов. Вместо refedit заменил масштаб по Z на 1.001 - и вставка блока утрачивает динамику (как проекция динблока). А все остальное - дело техники.

Последний раз редактировалось Frigate, 05.03.2011 в 09:32.
Frigate вне форума  
 
Непрочитано 11.03.2011, 15:19
#1349
gnostic


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


Всем крепкого здравия! Спасибо Вам всем за форум.
Но к делу:
Если стандартными средствами вызвать окошко свойств такого примитива как box,то там черным по белому(при стандартных цветовых настройках :-)) можно узнать его Length Width и Heigth. Пробую получить те же параметры с помощью кода:
Код:
[Выделить все]
 (setq dxf_CBOICTBA (entget(car(entsel))))
- ничего подобного, даже близко! Если, конечно, не принимать во внимание длиннющий хвост, увы недоступной, но присутствующей информации.
Тот же запрос, но вид сбоку:
Код:
[Выделить все]
 (setq bokc (car (entsel)))
(vl-load-com)
(vlax-dump-object (vlax-ename->vla-object bokc))
- уже теплее, но все равно, без танцев с бубном получит прямой результат ниЗЯЯЯЯЯ :-(
Вопрос к клубу Знатоков - мож кто знает заветных три слова? - Поделитесь пожалуйста!
P.S. "Иди на - не педлагать!" - Unknown command

Последний раз редактировалось gnostic, 11.03.2011 в 15:35.
gnostic вне форума  
 
Непрочитано 13.03.2011, 11:29
1 | #1350
Дима_

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


Посмотри сюда
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.03.2011, 14:06
#1351
gnostic


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


Блииин! Я так признателен и мне так стыдно за то что не удосужился поискать на форуме!
Спасибо огромнейшее!
И еще раз извините за разгильдяйский подход к поиску ответа на вопрос.
Те 8 строк из #10 поста -просто волшебство!


Честно искал по форуму, но пока все еще у разбитого корыта.
Исходные условия - куча примитивов "разбросанных" на группе слоев (скажем dt[ 1-20])
Хочу создать набор только из тех, что лежат на слоях из требуемого диапазона индексов, например dt3-dt7.
Царапаю код:
Код:
[Выделить все]
 (setq nabor (ssget "_X" '((8 . "dt[3-7]"))))
(vl-cmdf "erase" nabor "")
(ластик просто для наглядности).
Все в шоколоде! Но... стоит слегка изменить значение фильтра :
Код:
[Выделить все]
 (setq nabor (ssget "_X" '((8 . "dt[3-10]"))))
(vl-cmdf "erase" nabor "")
И начинаешь вспоминать все богатсво великого и могучего.
Поделитесь пожалуйста, своими замечаниями по этому поводу.

Последний раз редактировалось gnostic, 13.03.2011 в 14:50.
gnostic вне форума  
 
Непрочитано 13.03.2011, 22:49
#1352
Кулик Алексей aka kpblc
Moderator

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


Замени (ssget "_X" '((8 . "dt[3-10]"))) на нечто типа (ssget "_X" '((8 . "dt[3-9],dt10")))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2011, 00:21
#1353
gnostic


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


Не, ну так не честно жеже!
Но тем не менее - спасибо.
gnostic вне форума  
 
Непрочитано 14.03.2011, 00:42
#1354
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от gnostic Посмотреть сообщение
Не, ну так не честно жеже!
учите матчасть, все честно...
gomer вне форума  
 
Непрочитано 14.03.2011, 01:10
#1355
gnostic


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


Не сочтите за труд - ткните носом.
(Спустя пару минут)
В силу того, что очень не люблю неоднозначность, решил уточнить некоторые моменты.
Перевести на LISP схему создания фильтра, от которого он (LISP) не срыгнет - как бы в вопросах не числится!
Если есть какие то основополагающие моменты (даже из школьного курса математики), о которых я не догадываюсь(говорю честно), то буду очень признателен за то что обратите на них внимание. А так, по принципу :
"Вы, товарищ студент, дурак! - А Я мост Патона строил!"
либо
"Не плюйте рядом с членом Масонской ложи!" по меньшей мере, на этом ресурсе выглядит комично.

Последний раз редактировалось gnostic, 14.03.2011 в 01:37.
gnostic вне форума  
 
Непрочитано 14.03.2011, 01:32
#1356
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от gnostic Посмотреть сообщение
Не сочтите за труд - ткните носом
Цитата:
Сообщение от gnostic Посмотреть сообщение
(setq nabor (ssget "_X" '((8 . "dt[3-10]"))))
строка - это последовательность символов, 9 это 1 символ, 10 - это уже 2... такая конструкция работать "правильно" по определению не будет...
gomer вне форума  
 
Непрочитано 14.03.2011, 01:51
#1357
gnostic


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



Признаться, никогда бы в жизни не додумался!
Очень очень Вам благодарен! Спасибо!
gnostic вне форума  
 
Непрочитано 14.03.2011, 15:19
#1358
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Доброго времени суток!

Столкнулась с такой вот непоняткой:

Код:
[Выделить все]
 
(setq selection (ssget '((-4 . "<OR")(0 . "polyline")(0 . "lwpolyline")(-4 . "OR>") ))); end setq
(setq sel_length(sslength selection))
 (setq spisok_dlin2 (ssnamex selection));;получили список, элемнты которого в свою очередь - списки
     (setq s1 (length (ssnamex selection)))
Так вот, при пошаговой отладке выяснилось что длина списка s1 и "длина" набора sel_length не совпадают. Выбираю прямоугольником в пространстве модели 3 полилинии, sel_length=3, s1 = 4.

Господа, не сочтите за труд, помогите -откуда может появляеться лишний элемент списка?
Aminka вне форума  
 
Непрочитано 14.03.2011, 15:36
#1359
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Aminka Посмотреть сообщение
Так вот, при пошаговой отладке выяснилось что длина списка s1 и "длина" набора sel_length не совпадают. Выбираю прямоугольником в пространстве модели 3 полилинии, sel_length=3, s1 = 4.
Код:
[Выделить все]
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex selection)))
Цитата:
Смотришь в книгу... видишь...
gomer вне форума  
 
Непрочитано 14.03.2011, 15:39
#1360
Лиспер


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


<...> Удалено, показано более удачное решение.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
Ответ
Вернуться   Форум 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