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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1566532
 
Непрочитано 16.09.2019, 21:26
#3821
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
superkot007, обе точки должны быть на экране в момент выбора. По-моему, только в последних версиях что-то на эту тему поправили.
Похоже, в 2020 не работает
Цитата:
Сообщение от skkkk Посмотреть сообщение
superkot007,
Код:
[Выделить все]
 (setq ss (ssget "_W" pt1 pt2))
(sssetfirst nil ss)
Никаких "подсветов" точек нет. В 2006, по Полещуку, был вроде подсвет, но проверить нет возможности.
superkot007 вне форума  
 
Непрочитано 17.09.2019, 08:13
#3822
Кулик Алексей aka kpblc
Moderator

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


Проверь длину набора - может, он у тебя пустой получается.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.09.2019, 13:20
#3823
Сет


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


Выражение (atof "1,23") возвращает "1.0", а выражение (atof "1.23") возвращает "1.23". Как правильно конвертировать строку в вещественное число, если в качестве разделителя используется запятая?
Сет на форуме  
 
Непрочитано 17.09.2019, 13:23
#3824
Кулик Алексей aka kpblc
Moderator

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


Заменить "," на ".". Например, через vl-string-translate
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.09.2019, 13:39
#3825
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Заменить "," на ".". Например, через vl-string-translate
А нет способа попроще преобразовывать вещественные с разделителем в виде запятой? Может быть какая-то глобальная установка, определяющая разделитель целой и дробной части. А так придется контролировать каждую строчку, которую преобразовываю.
Сет на форуме  
 
Непрочитано 17.09.2019, 13:49
#3826
Кулик Алексей aka kpblc
Moderator

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


В лиспе разделитель только точка, без вариантов. Потери на преобразование (ИМХО) минимальны.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.09.2019, 14:18
#3827
Сергей812


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


Цитата:
Сообщение от Сет Посмотреть сообщение
А нет способа попроще преобразовывать вещественные с разделителем в виде запятой? Может быть какая-то глобальная установка, определяющая разделитель целой и дробной части. А так придется контролировать каждую строчку, которую преобразовываю.
Напишите свою функцию преобразования на базе atof с контролем наличие запятой. Зачем однотипный код дублировать
Сергей812 вне форума  
 
Непрочитано 17.09.2019, 15:34
#3828
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,286


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Никаких "подсветов" точек нет. В 2006, по Полещуку, был вроде подсвет, но проверить нет возможности.
Похоже, толкуете о разных вещах: один про Фому, другой - про Ерёму. Алексей имеет в виду, что в момент программного выбора ssget'ом обе точки (pt1 и pt2) должны быть в пределах видимой части экрана. Обычно я в таких случаях делаю зум по двум точкам, выбор, затем возврат предыдущего вида. При несильно загруженном чертеже и "правильном" значении переменной VTENABLE пользователь этого даже не замечает.
Что значит, "подсветов точек" я не понял. Цель - выделить синими ручками (квадратами) точки в рамке, ограниченной точками pt1 и pt2, или же нужно визуальное отображение рамки выбора?
Нужны подробности.

Цитата:
Сообщение от Сет Посмотреть сообщение
А нет способа попроще преобразовывать вещественные с разделителем в виде запятой? Может быть какая-то глобальная установка, определяющая разделитель целой и дробной части. А так придется контролировать каждую строчку, которую преобразовываю.
Я, помнится, совершенно не контролировал строки на наличие запятой. Просто оборачивал atof в функцию замены символов в строке, и если запятая в строке имелась, она заменялась точкой, если же нет - возвращалась строка без изменений. Правда, не помню, какая это была функция: vl-string-translate или vl-string-subst.
skkkk вне форума  
 
Непрочитано 18.09.2019, 08:26
#3829
40in


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


Имеется мультивыноска с динамическим блоком. Подскажите пожалуйста, как программно получить значение атрибутов этого блока.
Пример мультивыноски с блоком:
Вложения
Тип файла: dwg
DWG 2004
тест.dwg (73.5 Кб, 6 просмотров)
40in вне форума  
 
Непрочитано 18.09.2019, 09:01
#3830
Кулик Алексей aka kpblc
Moderator

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


Конкретно здесь сработало:
Код:
[Выделить все]
 (setq lead (car (entsel)))
(mapcar (function cdr) (vl-remove-if-not (function (LAMBDA(x)(and (=(car x)330) (= (cdr(assoc 0 (entget (cdr x)))) "ATTDEF")))) (entget lead)))
Но я далеко не уверен, что это правильно
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2019, 09:57
#3831
40in


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


Спасибо! Только подскажите как получить значение атрибута. Я вижу только название атрибута.

(setq lead (car (entsel)))
(setq spis (mapcar (function cdr) (vl-remove-if-not (function (LAMBDA (x) (and (= (car x) 330) (= (cdr (assoc 0 (entget (cdr x)))) "ATTDEF")))) (entget lead))))
(setq att0 (entget (nth 0 spis)))

((-1 . <Имя объекта: -1de948>) (0 . "ATTDEF") (330 . <Имя объекта: -1df060>) (5 . "6948F") (100 . "AcDbEntity") (67 . 0) (8 . "0") (440 . 16777216) (100 . "AcDbText") (10 -0.26929 1.56192 0.0) (40 . 2.5) (1 . "") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "") (2 . "ПРЕПЯТСВИЕ") (70 . 0) (73 . 0) (74 . 0) (280 . 1))
40in вне форума  
 
Непрочитано 18.09.2019, 15:30
1 | #3832
Кулик Алексей aka kpblc
Moderator

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


Достаточно было немного подробнее посмотреть на результаты entget:
Код:
[Выделить все]
 (defun t1 (lead / elist)
;; (t1 (car (entsel)))
  (setq elist (entget lead))
  (mapcar (function (lambda (x) (cons (cdr (assoc 2 (entget (cdr x)))) (cdr (assoc 302 (member x elist))))))
          (vl-remove-if-not (function (lambda (x) (and (= (car x) 330) (= (cdr (assoc 0 (entget (cdr x)))) "ATTDEF"))))
                            elist
                            ) ;_ end of vl-remove-if-not
          ) ;_ end of mapcar
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2019, 17:07
#3833
40in


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


А и правда, все просто! И как это я сам не увидел, простофиля!...
Большое человеческое спасибо!
40in вне форума  
 
Непрочитано 20.09.2019, 00:40
#3834
superkot007


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Похоже, толкуете о разных вещах: один про Фому, другой - про Ерёму. Алексей имеет в виду, что в момент программного выбора ssget'ом обе точки (pt1 и pt2) должны быть в пределах видимой части экрана. Обычно я в таких случаях делаю зум по двум точкам, выбор, затем возврат предыдущего вида. При несильно загруженном чертеже и "правильном" значении переменной VTENABLE пользователь этого даже не замечает.
Что значит, "подсветов точек" я не понял. Цель - выделить синими ручками (квадратами) точки в рамке, ограниченной точками pt1 и pt2, или же нужно визуальное отображение рамки выбора?
Нужны подробности.
Да, по поводу зумирования недопонял, спасибо за разжевывание и одновременное решение по зуму))
В книге об этом не было сказано, там про "подсвечивание пунктиром примитивов из набора".
Тогда проверю в своем коде еще раз.

Если чертеж небольшой - проще, наверное, будет сразу весь его выводить в видимую часть экрана - как это сделать, не подскажите?
superkot007 вне форума  
 
Непрочитано 20.09.2019, 02:35
#3835
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,286


Видимо,
Код:
[Выделить все]
 (vla-ZoomAll (vlax-get-acad-object))
skkkk вне форума  
 
Автор темы   Непрочитано 30.09.2019, 17:27
#3836
Red Nova

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


Привет други.
Вот вам вопрос.
Имеется Excel файл с ценами на перечень продукции.
Цены периодически меняются, соответственно файл обновляется.
Требуется из лиспа заглянуть в Excel файл, найти строку с именем продукта, и для этой строки получить значения ячейки с ценой.
Нечто похожее на VLOOKUP, только работаем из лиспа.
Это реализуемо?

Добавлено.
Пример Excel файла прикрепляю.
В столбце А наименование продукта.
В столбце B цена.
Вложения
Тип файла: xlsx price list example for dwgru.xlsx (28.8 Кб, 4 просмотров)
__________________
Блог

Последний раз редактировалось Red Nova, 30.09.2019 в 17:53. Причина: Добавил пример
Red Nova вне форума  
 
Непрочитано 30.09.2019, 17:31
#3837
Сергей812


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Требуется из лиспа заглянуть в Excel файл, найти строку с именем продукта, и для этой строки получить значения ячейки с ценой.
Нечто похожее на VLOOKUP, только работаем из лиспа.
Одна цена на одно имя продукта?
Сергей812 вне форума  
 
Автор темы   Непрочитано 30.09.2019, 17:54
#3838
Red Nova

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Одна цена на одно имя продукта?
Все верно.
Обновил исходный пост, добавил пример файла с данными.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 30.09.2019, 18:06
#3839
Сергей812


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


все равно же будете открывать эксель и загружать в него файл (программно или вручную). Так пускай эксель и ищет: делаете скрытую строку над таблицей (чтобы не смущать заполняющих таблицу). В ячейку А1 заносите имя продукта, в ячейку B1 формулу: через функции ПОИСКПОЗ находите строку с данных продуктом, а затем через функцию ИНДЕКС подтягиваете значение цены. И все сводится к записи в ячейку А1 имени продукта, и забора значения цены из B1 ячейки (или B2 - какая там нужна). Чтение/запись в ячейку листа экселя на лиспе в инете 100% есть)
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 18:11
#3840
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,286


Red Nova, вот тут прога от Евгения Елпанова - считывает эксель-файл в список лисп. Выдернуть значение нужной ячейки из списка, думаю, не составит труда. Предполагаю, что с помощью assoc. Правда, код не проверял.
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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