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

Вернуться   Форум 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.
Просмотров: 1965818
 
Непрочитано 18.10.2016, 18:35
#3101
Сергей812


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


В общем, нестыковка с Полещуком получается по наборам. Простенький lisp

Код:
[Выделить все]
 (defun Set_SSGet ( / )
  (setq lSet (ssget "_X"))
  (princ (strcat "\nЭлементов в наборе: " (itoa (sslength lSet))))
  (princ "\n")	
  (princ lSet)	
  ;(setq lSet nil)
  (princ)
)

(defun c:Test_SS ( / )
  (repeat 10000 (Set_SSGet))
)
Переменную lSet убрал из локальных вообще - все равно создает 10000 наборов с разными ссылками/именами, и не чихает. Естественно, на чертеже должен быть хотя бы один примитив. Или если одной и тоже переменной присваивать новый набор - то старый автоматически закрывается?
Сергей812 вне форума  
 
Непрочитано 18.10.2016, 21:59
#3102
Кулик Алексей aka kpblc
Moderator

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


Похоже на то. Насколько я помню, AutoCAD поддерживает до 255 уникальных наборов. Надо искать, а у меня сейчас голова уже не варит - змерз аки Маугли.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2016, 07:59
1 | #3103
VVA

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
сразу же два примечания к коду:
И третье. Штриховки могут быть на заблокированном слое
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если нужно, например, только с пространства модели получить - то в фильтр добавляем (67 . 0).
Если нужно в текущем пространстве (что логично при использовании command), то можно к фильтру ssget добавить (cons 410 (getvar "CTAB"))

Код:
[Выделить все]
(defun c:test1 (/ e i s)
  (vl-load-com)
  (if (setq s (ssget "_x" (list (cons 0 "HATCH")(cons 410 (getvar "CTAB")))))
    (progn
      (setq i -1)
      (while (and
               (< (setq i (1+ i))(sslength s)) ;_цикл по примитивам в наборе
               (setq e	(ssname s i))          ;_достаем примитив из набора
               (vlax-write-enabled-p (vlax-ename->vla-object e)) ;_проверяем на возможность
                                                                 ;_модификации объекта
               )
        (command "_-HATCHEDIT" e "_DR" "_H")
      )
    )
    (alert "Штриховок не обнаружено")
  )
  (princ "\nОбработано ")(princ i)(princ " штриховок") 
  (princ)
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 20.10.2016, 10:34
#3104
kurstep


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


Цитата:
Сообщение от quazi Посмотреть сообщение
Добрый день!
Помогите пожалуйста, нужно все штриховки в чертеже поместить за их собственные контуры.
LISPа не знаю, вот мои попытки:
Предварительно выделяю одну штриховку и выполняю
Код:
[Выделить все]
 (command "_-HATCHEDIT" "DR" "H")
становится как надо.
Вот еще нашел код, выбирающий все штриховки, может пригодится:
Код:
[Выделить все]
 (sssetfirst nil (ssget "_x" '((0 . "HATCH"))))
я делаю так
Код:
[Выделить все]
  (defun c:шт ()
   (sssetfirst nil (ssget "_x" '((0 . "HATCH"))))
(command "ПОРЯДОК" "А")
)
kurstep вне форума  
 
Непрочитано 20.10.2016, 11:15
#3105
Кулик Алексей aka kpblc
Moderator

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


kurstep, твоя команда не сработает на английской версии AutoCAD. Да и вообще работать будет только на русской.

----- добавлено через 49 сек. -----
И как она сработает, если штриховки будут еще и на заблокированных слоях, или в пространствах листов - тоже неизвестно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2016, 14:23
#3106
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И как она сработает, если штриховки будут еще и на заблокированных слоях, или в пространствах листов - тоже неизвестн
Как это неизвестно? в этом случае как раз все понятно: что сможет обработает и выдаст предупреждение, что "столько то объектов на заблокированном слое".
Хотя... Если ничего не путаю, "ПОРЯДОК" (DRAWORDER), обработает и заблокированные слои
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 20.10.2016, 14:36
#3107
Кулик Алексей aka kpblc
Moderator

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


Vladimir_Sergeevich, если я не ошибаюсь, команда обрабатывает только текущее пространство. А ты тут приказываешь обработать и неактивные пространства.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2016, 15:50
#3108
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Это тогда вопрос, что сможет подцепить sssetfirst...
Выделить то выделяет, но "Не находятся в текущем пространстве: 93."
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 20.10.2016, 23:54
#3109
Inferi


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


Всем привет, почему не работает конструкция типа:
Код:
[Выделить все]
 (foreach units '("кг" "кВт" "м")
(vl-string-search units "N=0,55кВт")
)
Inferi вне форума  
 
Непрочитано 21.10.2016, 00:18
#3110
gomer

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


Цитата:
Сообщение от Inferi Посмотреть сообщение
почему не работает конструкция
потому что нет метров в киловаттах
gomer вне форума  
 
Непрочитано 21.10.2016, 06:54
#3111
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Inferi, а на основании чего получен вывод, что не работает? работает: на первом проходе даст nil, на втором 6, на третьем снова nil.
Ну и на выходе foreach выдает:
Цитата:
Сообщение от gomer Посмотреть сообщение
потому что нет метров в киловаттах
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 21.10.2016, 08:46
#3112
VVA

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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
работает: на первом проходе даст nil, на втором 6, на третьем снова nil.
Демонстрация слов Vladimir_Sergeevich,
Код:
[Выделить все]
(mapcar (function(lambda(x)(vl-string-search x "N=0,55кВт"))) '("кг" "кВт" "м"))
Цитата:
$ (mapcar (function(lambda(x)(vl-string-search x "N=0,55кВт"))) '("кг" "кВт" "м"))
(nil 6 nil)
_$
Если нужно проверить, есть ли что-либо из списка '("кг" "кВт" "м")) в строке, то можно применить такую конструкцию
Код:
[Выделить все]
(apply 'or (mapcar (function(lambda(x)(vl-string-search x "N=0,55кВт"))) '("кг" "кВт" "м")))
Возвращает T или NIL
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.10.2016, 11:34
#3113
Neo


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


подскажите как вывести на экран обновляемое "окно" с текстом.
текст собираю, как конкатенацию текстов выбранных мышкой. хочу чтобы на экране, в процессе работы, отображался результирующий текст.
Это может быть или обновляемое окно или мтекст с привязкой к координатам экрана, а не чертежа.
если не с помощью лиспа, то в каком направлении искать?
Neo вне форума  
 
Непрочитано 28.10.2016, 11:50
#3114
Сергей812


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


Цитата:
Сообщение от Neo Посмотреть сообщение
подскажите как вывести на экран обновляемое "окно" с текстом.
текст собираю, как конкатенацию текстов выбранных мышкой. хочу чтобы на экране, в процессе работы, отображался результирующий текст.
Это может быть или обновляемое окно или мтекст с привязкой к координатам экрана, а не чертежа.
если не с помощью лиспа, то в каком направлении искать?
а чем вас вывод в комстроку не устраивает?
Сергей812 вне форума  
 
Непрочитано 28.10.2016, 12:00
#3115
frostmourn


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


Neo, попробуйте тут посмотреть, как сделано- http://lee-mac.com/text2mtext.html
frostmourn вне форума  
 
Непрочитано 31.10.2016, 10:25
#3116
Neo


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


спасибо frostmourn. посмотрел, вроде даже понял как привязать текст к координатам мыши. мне бы, привязаться к кордиаминам угла видимой части экрана. пока нашел, что команда "STATUS" выдает Display shows.
пока и сделал вывод в командную строку. хочу выводить одновременно текущий и предыдущий обработанные тексты. в комстроке получается сильно загружено

Последний раз редактировалось Neo, 31.10.2016 в 10:33.
Neo вне форума  
 
Непрочитано 31.10.2016, 12:00
1 | #3117
frostmourn


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


Цитата:
Сообщение от Neo Посмотреть сообщение
мне бы, привязаться к кордиаминам угла видимой части экрана.
Это проще. Здесь http://forum.dwg.ru/showpost.php?p=905056&postcount=6 функция _get-viewctr-size.
frostmourn вне форума  
 
Автор темы   Непрочитано 02.11.2016, 16:37
#3118
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Имею блок панели и рамки маркера (смотри вложение).
Сам блок маркера не содержит атрибутов. Это скорее рамка вокруг атрибута самого блока панели.
Намерен написать команду для быстрого выравнивания блока маркера по положению и ширине атрибута при его вставке.

Предполагаемый алгоритм:
1. Получить координаты атрибута и вставить соответственно маркер.
2. Вычислить угол наклона атрибута в зависимости от угла поворота блока и угла параметра атрибута.
3. Получить ширину текста атрибута и назначить динамическую ширину блока маркера соответственно.

С первыми двумя пунктами проблем не должно возникнуть.
А вот как получить ширину атрибута не знаю.
В зависимости от значения полей внутри атрибута ширина будет каждый раз разная.

Идеи?
Вложения
Тип файла: dwg
DWG 2010
Align tag to attribute.dwg (138.8 Кб, 13 просмотров)
Red Nova вне форума  
 
Непрочитано 02.11.2016, 18:06
#3119
VVA

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


Red Nova,
Цитата:
Сообщение от Red Nova Посмотреть сообщение
А вот как получить ширину атрибута не знаю.
В этой теме рассматривали варианты
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.11.2016, 20:15
#3120
Inferi


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


Всем привет! Есть список координат '((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4)). Как вернуть (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4), то есть как бы раскрыть внешние скобки? Была идея:
Код:
[Выделить все]
 (mapcar 'princ '((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4)))
Но потом понял что mapcar возвращает все тот же список.
Inferi вне форума  
Ответ
Вернуться   Форум 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