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

Вернуться   Форум 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.
Просмотров: 2054936
 
Автор темы   Старый 25.02.2009, 15:58
#581
Red Nova

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


kpblc,
Цитата:
Сначала добавляешь таблицу, задавая ей количество строк и столбцов
Можно элементарный пример?
__________________
Блог
Red Nova вне форума  
 
Старый 25.02.2009, 17:09
#582
Дима_

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
kpblc,
Можно элементарный пример?
Да штож такое: Red Nova - ведь должен уже лучше Крыса lisp знать.

Код:
[Выделить все]
(vl-load-com)
(defun maketable (pt nr nc rh cw)
(vla-addtable 
	(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Modelspace)
	(vlax-3d-point pt)
	nr nc rh cw
);end of addtable
);end of maketable
Запускать (maketable точка_вставки количество_сток количество_колнок высота_строки ширина_колонки)
например (maketable (getpoint) 5 5 5 5)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Старый 25.02.2009, 17:36
#583
VVA

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


Red Nova, Примеры у тебя есть. Смотри vrc, в частности пост #5. Нужное выделил красным
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 25.02.2009, 22:38
#584
Кулик Алексей aka kpblc
Moderator

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


> ShaggyDoc: а кому обещали, что будет легко? Естественно, что нюансов немеряно (а если еще и учитывать нововведения 2008-й версии в области авторазбиения таблиц, то можно с непривычки вообще рехнуться).
> Red Nova: А вообще-то лучше всего создавать свой стиль табличный, с ним и играться, не надеясь вообще ни на что Кстати, "простых" примеров у меня как-то не получилось "накопить".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Старый 27.02.2009, 11:07
#585
Red Nova

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


Спасибо за ответы
Дима_,
Цитата:
Да штож такое: Red Nova - ведь должен уже лучше Крыса lisp знать.
А я вечный студент.
All
Успехи пока нулевые. В хелпе отсутствует информация по vla-addtable и его структуру я не понимаю.
От VVA пример больно сложный. Там все vla функции о которых я не имею понятия. А вообще можно без vla функций обойтись?
В примере от Димы мало настроек, и пока что кажется что создать таблицу с требуемой мне структурой (ведомость расхода стали по ГОСТ) будет весьма сложно. В приложенном файле есть пример такой таблицы (правда в файле она из линий и мтекстов)
Вложения
Тип файла: dwg
DWG 2004
Пример таблицы.dwg (53.9 Кб, 5059 просмотров)
__________________
Блог
Red Nova вне форума  
 
Старый 27.02.2009, 12:01
#586
Кулик Алексей aka kpblc
Moderator

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


Red Nova, лично мне для начала работы очень сильно помогла статья на http://www.cad.dp.ua/stats/vla_doc.php
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 27.02.2009, 12:02
#587
Дима_

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


1. Синтакис всех vla- функций находиться в хелпе по VB, там же есть инструкция по переводу синтаксиса VB в VL, да и где-то на форуме она есть на русском языке.
2. Если без vla, то либо командными методами, либо через DXF, в первом надо слишком много учесть, во втором слишком много изучить, лично мне DXF больше нравиться (позволяет во сремя создания сразу задать все параметры), но для таблиц, областей и 3Д объектов - гемор. И тут приходят на помощь готовые решения на VLA (VBA). Так что если нужны таблицы пора начинать изучать VL.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Старый 28.02.2009, 11:54
#588
Red Nova

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


kpblc, Спасибо, статья очень полезная. В общем понял как при помощи VLA- создавать и модифицировать таблицы, даже получается.

Теперь пытаюсь подготовить нужную информацию для последующего заполнения таблицы. Есть несколько как всегда примитивных вопроса, на этот раз про работу со списками.

1. Как создать пустой список?
2. Как проверить при помощи wcmatch пуст ли он?
3. Как от элемента списка оставить только последнюю букву?
имею "Арматура d= 8", нужно оставить только "8"
4. Как сосчитать количество элементов списка?
__________________
Блог

Последний раз редактировалось Red Nova, 28.02.2009 в 15:06.
Red Nova вне форума  
 
Старый 28.02.2009, 15:27
#589
Кулик Алексей aka kpblc
Moderator

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


1. А зачем его создавать? Инициализируй любую переменную - вот тебе и пустой список.
2. С помощью wcmatch проверяется не список, а строка
3. См. subst
4. См. length
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Старый 28.02.2009, 19:55
#590
Red Nova

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


Спасибо.
Кое что уже получается. Уже рисуется таблица
Код:
[Выделить все]
 (defun C:ttable (/)
  
  
(setq klass '("Арматура АС1" ("ГОСТ 5781-82" ("Арматура d= 8" "4.0") ("Арматура d= 10" "0.6") ("Арматура d= 16" "0.6") ("Арматура d= 20" "0.6"))))
(setq count_Ac1 4)
(setq weight_Ac1 5.8)
  
  
(vla-addtable (lib:get-active-space)
                      (vlax-3d-point (getpoint))
                      7
                      (+ count_Ac1 3)
                      8 ;_высота строки
                      15 ;_ширина столбца
                    )
  (setq mytable (vlax-EName->vla-Object (entlast)))
  (vla-SetText mytable 0 0 "Ведомость расхода стали")
  (vla-SetText mytable 1 0 "Марка элемента")
  (vla-MergeCells mytable 1 5 0 0)
  (vla-SetText mytable 1 1 "Изделия арматурные")
  (vla-MergeCells mytable 1 1 1 (+ count_Ac1 2))
  (vla-SetText mytable 2 1 "Арматура класса")
  (vla-MergeCells mytable 2 2 1 (+ count_Ac1 1))
  (vla-SetText mytable 3 1 "Аc1")
  (vla-MergeCells mytable 3 3 1 (+ count_Ac1 1))
  (vla-SetText mytable 4 1 "ГОСТ 19903-74")
  (vla-MergeCells mytable 4 4 1 (+ count_Ac1 1))
  (setq count_Ac1_realtime 0)
  ;(vla-SetText mytable 5 1 "d= 6")
  ;(vla-SetText mytable 5 2 "d= 8")
  ;(vla-SetText mytable 5 3 "d= 10")
  (mapcar '(lambda(line)
	   (setq count_Ac1_realtime (+ 1 count_Ac1_realtime))
	   (vla-SetText mytable 5 count_Ac1_realtime (car line))
	   (vla-SetText mytable 6 count_Ac1_realtime (car (cdr line) ))
          );_end of lambda
          (cdr (cadr klass))
  )
  (vla-SetText mytable 5 (+ count_Ac1 1) "Итого")
  (vla-SetText mytable 6 (+ count_Ac1 1) weight_Ac1)
  (vla-SetText mytable 2 (+ count_Ac1 2) "Всего")
  (vla-MergeCells mytable 2 5 (+ count_Ac1 2) (+ count_Ac1 2))
  (vla-SetRowHeight mytable 1 8)
  (vla-SetColumnWidth mytable 0 40)
  
  )
Только вот с subst и с substr у меня ничего не выходит.

Вот тут
Код:
[Выделить все]
(vla-SetText mytable 5 count_Ac1_realtime (car line))
Нужно поменять результат “Арматура d= х” на "%%c х"
Прошу подсказать как.
Вложения
Тип файла: dwg
DWG 2004
Пример.dwg (71.9 Кб, 5057 просмотров)
__________________
Блог

Последний раз редактировалось Red Nova, 28.02.2009 в 20:00.
Red Nova вне форума  
 
Старый 28.02.2009, 20:20
#591
VVA

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


Как вариант можно так
Код:
[Выделить все]
(vl-load-com)
(setq txt "Арматура d= 18")
(setq txt (vl-string-trim " \t\n" txt)) ;_На всякий случай удаляем незначащие пробелы
(setq len (strlen txt)) ;_Длина строки (Идем с конца)
(while (and (> len 0) ;_Не дошли до начала
	    (member (substr txt len 1) ;_Текущий символ цифра
		    '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
	    )
  (setq len (1- len)) ;_Смотрим предыдущий символ
  )
(setq num (substr txt (1+ len)))
(setq num (strcat "%%d" num))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 02.03.2009, 10:12
#592
Дима_

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


Немного не по теме вопроса -
Код:
[Выделить все]
(setq mytable (vlax-EName->vla-Object (entlast)))
ихмо лишнее действие т.к.
Код:
[Выделить все]
(vla-addtable...)
возращает vb-object созданной таблицы.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Старый 02.03.2009, 10:29
#593
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


тоже немного не потеме, ИМХО такие таблицы надо создавать, как блок с атрибутами, и атрибуты можно менять програмно.
Holon вне форума  
 
Автор темы   Старый 02.03.2009, 22:13
#594
Red Nova

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


VVA,
Спасибо. Правда пока что не интегрировал в свой код, но это успеется.
Дима_,
Согласен. Ты еще в моих кодах много лишнего увидишь.
Holon, Мне бы пока с таблицами разобраться. К стати, оказывается с помощью vla их можно очень легко редактировать.

В общем пока продолжаю писать код преобразования спецификации с ведомость расхода стали, скора ждите новых вопросов.

Ну вот и вопрос.
Почему не заработала элементарная функция чтения содержимого текста или атрибута?

Код:
[Выделить все]
(defun izd (/)
(setq ename1 (ssget))
(setq vlaobject1
(vlax-ename->vla-object ename1))
(setq izdelie (vla-get-TextString vlaobject1))
(princ izdelie)
)
__________________
Блог

Последний раз редактировалось Red Nova, 02.03.2009 в 23:08.
Red Nova вне форума  
 
Старый 03.03.2009, 00:52
#595
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


ssget возвращает набор, а не ename
Код:
[Выделить все]
(setq  l_vla_obj 
  (mapcar 'vlax-ename->vla-object
     (vl-remove-if 'listp (mapcar (function cadr)
        (ssnamex (ssget))))))
Donhuan вне форума  
 
Старый 03.03.2009, 01:16
#596
Кулик Алексей aka kpblc
Moderator

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


Добавлю: см. в библиотеке функций _dwgru-conv-pickset-to-list : http://forum.dwg.ru/showpost.php?p=188342&postcount=21
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 03.03.2009, 10:36
#597
VVA

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


Red Nova,
1. Не факт, что в ssget будет блок. Это я к тому, что ssget нужно делать с фильтром
Код:
[Выделить все]
;;;Запоминаем в ss набор только блоков
(setq ss (ssget '((0 . "INSERT"))))
2. Не факт, что у блока будут атрибуты. Это тоже легко проверить с помощью фильтра ssget
Код:
[Выделить все]
;;;Запоминаем в ss набор только блоки c атрибутами
(setq ss (ssget '((0 . "INSERT")(66 . 1))))
3. Могут выбрать объект на заблокированном слое. Тогда попытки модифицировать его приведут к ошибке. Примитивы на заблокированных слоях легко отсечь опцией ssget
Код:
[Выделить все]
(setq ss (ssget "_:L" '((0 . "INSERT")(66 . 1))))
Итого в преременной ss имеем набор только блоков, с атрибутами на незаблокированных слоях
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Старый 03.03.2009, 14:05
#598
Red Nova

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


Donhuan, kpblc,
Пока чтоне понял что там к чему. Опять не вышло
Код:
[Выделить все]
(defun izd (/)
(setq l_vla_obj 
  (mapcar 'vlax-ename->vla-object
     (vl-remove-if 'listp (mapcar (function cadr)
        (ssnamex (ssget))))))
(setq izdelie (vla-get-TextString l_vla_obj))
(princ izdelie)
)
VVA, Согласен, тогда я так думаю что включить в фильтр текст и мтекст можно так
Код:
[Выделить все]
(setq ss (ssget "_:L" '((0 . "INSERT")(66 . 1)) (0 . "text")(0 . "mtext")))
__________________
Блог

Последний раз редактировалось Red Nova, 03.03.2009 в 14:11.
Red Nova вне форума  
 
Старый 03.03.2009, 15:09
#599
VVA

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


1. Red Nova, Ты отладчиком посмотри что у тебя в l_vla_obj?
2. У табя там список а ты пытаешься взять у списка свойство TextString
3. У блока НЕТ свойства TextString, оно есть у Атрибута, а Атрибут это один из элементов БЛОКА, поэтому чтобы добраться до Атрибута, нужно поковырять блок еще немного.
4. Фильтр ssget неверен. Нужно добавлять логические группы (-4 . "<OR"),
(-4 . "<AND") и т.д.
Еще про атрибуты
http://forum.dwg.ru/showthread.php?t=14230
http://www.caduser.ru/forum/index.ph...D=23&TID=35337
http://www.caduser.ru/forum/index.ph...#message243276
http://www.caduser.ru/forum/index.ph...#message148413
http://www.caduser.ru/forum/index.ph...5&FORUM_ID=23&
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Старый 03.03.2009, 20:21
#600
Red Nova

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


l_vla_obj возвращяет к примеру
(#<VLA-OBJECT IAcadMText 0bdabf24>)
Что это такое, и что с этим делать?
Поковырялся в лиспах от VVA, но бестолку, там стока всего, мне не понять...
По ссылкам тоже больно сложные лиспы, там даже ssget не используется. Мне нужно просто прочитать содержимое текста или атрибута.
ssget возвращает <Selection set: 51>
Что это? Ничего не ясно.
Можно разжевать плиз?
Как же все-таки извлечь содержимое из текста? (атрибут на время оставим)
Добавлено
1. Предположим получил в результате работы некого кода
(1 . "содержание_текста")
что это? Список или нет? Как с этим работать, и оставить только искомое содержание?
2. Почему Из списка
Цитата:
((-1 . <Entity name: 7ef03578>) (0 . "MTEXT") (330 . <Entity name: 7ef01cf8>) (5 . "20F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (48 . 100.0) (100 . "AcDbMText") (10 2872.1 1792.73 0.0) (40 . 500.0) ... )
assoc выдает (1 . "содержание_текста").
Может многоточие в конце означает что я просто не вижу всего, если это так, то как увидеть все содержимое в watch window
__________________
Блог

Последний раз редактировалось Red Nova, 03.03.2009 в 23:01.
Red Nova вне форума  
Ответ
Вернуться   Форум 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