dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

Red Nova вне форума Вставить имя

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


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


Цитата:
Сообщение от Wanted Посмотреть сообщение
Не помогло
Если выполнять P2, то возврат к привязкам должен осуществляться.
Если выполнять P5 с выходом из цикла по ошибке, то возврата не будет.
Если нужен такой цикл, для выполнения возврата, его нужно менять

----- добавлено через ~16 ч. -----
например цикл вызова P2 aka комманду P5 можно реализовать таким образом:

Код:
[Выделить все]
 (defun c:p5 (/)
	(while (= t (vl-catch-all-apply 'apply (list '(lambda (x) x) '(t))))
		(p2)
	)
)
но всё это будет выполняться корректно только пока где-то не случится выход по ошибке и поскольку на этот случай в коде ничего не предусмотрено, то привязки не вернутся опять.

всё-таки наверное не поможет…

Wanted, а что хоть делает это творение?

Последний раз редактировалось koMon, 27.03.2018 в 11:03.
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.03.2018, 00:05
#3502
Wanted


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Wanted, а что хоть делает это творение?
Проставляет размеры стен, с последующим удалением, сдвигом или сужением наложенных размеров (для тех. планов)

видео:
https://youtu.be/iPOS3xs0V50.

----- добавлено через ~5 мин. -----
И еще сразу вопрос, после использования лиспа, помимо потери привязок в последующем использовании на полилинии появляется ширина (не толшина линии), которую тоже каждый раз приходится выставлять на ноль. Тоже напрягает

----- добавлено через ~3 мин. -----
А если в коде поменять название P2 на Р5 это не поможет?

Последний раз редактировалось Wanted, 29.03.2018 в 00:19.
Wanted вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.03.2018, 09:07
#3503
koMon


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


Цитата:
Сообщение от Wanted Посмотреть сообщение
А если в коде поменять название P2 на Р5 это не поможет?
p5 вызывает циклически p2, изменение названия по сути ничего не изменит. можно вызывать одноразово p2 и тогда в случае корректного её завершения привязки должны вернуться, но если завершение будет некорректным, тогды увы. наверное нужно дописать фунцию ошибки, в которую это всё заложить.

Цитата:
Сообщение от Wanted Посмотреть сообщение
в последующем использовании на полилинии появляется ширина
ну тут всё-же лучше обратиться к автору…
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.03.2018, 13:31
#3504
Wanted


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


Спасибо, функция Р2 действительно возвращает привязки, но ширина остается. Нельзя ли найти строку в коде, которая присваивает полилинии ширину 35 мм. и кк-то поменять на 0? Мне эта ширина в принципе не нужна.

Все уже сам нашел. Всем спасибо, исправил код с минимумом правок.

Последний раз редактировалось Wanted, 29.03.2018 в 13:39.
Wanted вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 01.04.2018, 10:04
#3505
Alexll


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


Всем привет.
Потратил день на то что бы изменить параметр видимости у атрибута динамического блока.
Добрался до атрибута, как я понял за видимость отвечает 60й код.

Код:
[Выделить все]
	(if (assoc 60 x)			; проверяю, есть ли в наборе "х" 60й код
	(subst nil '(60 . 1) x))        ; если есть, то пытаюсь его удалить (заменой на nil)
Если вывести значение получаемое командой subst, то там действительно 60й код заменен на nil, но в самом атрибуте изменения не происходят.
Подскажите пожалуйста как внести изменения в атрибут?
Желательно средствами Lisp, а не vla и не командами командной строки
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 01.04.2018, 12:56
#3506
Кулик Алексей aka kpblc
Moderator

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


Я пользую нечто типа
Код:
[Выделить все]
 (defun _kpblc-ent-modify-autoregen (ent bit value ent_regen / ent_list old_dxf new_dxf layer_dxf70)
                                   ;|
*    Функция модификации указанного бита примитива
*    Параметры вызова:
  entity     примитив, полученный через (entsel), (entlast) etc
  bit        dxf-код, значение которого надо установить
  value      новое значение
  ent_regen  выполнять или нет регенерацию примитива сразу. t/ nil
*    Примеры вызова:
(_kpblc-ent-modify-autoregen (entlast) 8 "0" t)  ; перенести последний примитив на слой 0
(_kpblc-ent-modify-autoregen (entsel) 62 10 nil)  ; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*  примитив с модифицированным dxf-списком. Примитив перерисовывается в
* зависимости от значения ключа ext_regen
|;
  (if (not (and (or (= (strcase (cdr (assoc 0 (entget ent))) nil) "STYLE")
                    (= (strcase (cdr (assoc 0 (entget ent))) nil) "DIMSTYLE")
                    (= (strcase (cdr (assoc 0 (entget ent))) nil) "LAYER")
                    ) ;_ end of or 
                (= bit 100)
                ) ;_ end of and 
           ) ;_ end of not 
    (progn (setq ent_list (entget ent)
                 new_dxf  (cons bit
                                (if (and (= bit 62) (= (type value) 'str))
                                  (if (= (strcase value) "BYLAYER")
                                    256
                                    0
                                    ) ;_ end of if 
                                  value
                                  ) ;_ end of if 
                                ) ;_ end of cons 
                 ) ;_ end of setq 
           (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list))))
             (progn (entmod (if old_dxf
                              (subst new_dxf old_dxf ent_list)
                              (append ent_list (list new_dxf))
                              ) ;_ end of if 
                            ) ;_ end of entmod
                    (if ent_regen
                      (progn (entupd ent) (redraw ent))
                      ) ;_ end of if
                    ) ;_ end of progn 
             ) ;_ end of if 
           ) ;_ end of progn 
    ) ;_ end of if 
  ent
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 05:00
#3507
Alexll


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


Спасибо за пример. Но что то у меня с 1го класса сложно получается списывать ))). Сложно мне разбираться в чужих примерах, на пальцах проще.
С удалением dxf кода вроде разобрался. А как на счет добавления?
Когда я пытаюсь добавить с помощью такой конструкции:
Код:
[Выделить все]
 (entmod (list (cons 60 1) x))
Автокад пишет ошибку: "ошибка: неверная DXF-группа:". Полагаю что каждый dxf код должен стоять на своем месте, и не допускается установка когда в начало. Я правильно понимаю?
Если да, то что делать? разбивать dxf код посередине ,вставлять новую точечную пару туда, и соединять? Если да, то при помощи какой команды обычно идет разбиение?
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 08:12
#3508
Кулик Алексей aka kpblc
Moderator

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


Есть разница между list, cons и append. Проверни одно, второе, третье - и посмотри на результаты.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 15:18
#3509
Alexll


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


append - у меня почему то вообще не получилось использовать. Жалуется на неверный список.
list действительно как то не так формирует список. Он их не сливает, а разделяет скобками
а вот cons - создает список похожий на правду. И даже entmod не ругается. Но точечная пара не добавляется, и атрибут не исчезает.
Самый правильный вариант(вроде). Но все равно не отрабатывает
Код:
[Выделить все]
(entmod (cons (cons 60 1) x))
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 15:25
#3510
Кулик Алексей aka kpblc
Moderator

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


А обновлять примитив кто будет? entupd на что существует?

----- добавлено через ~1 мин. -----
Какие результаты будут у такого:
Код:
[Выделить все]
 (setq att (car (nentsel "\nВыбери скрываемый объект ")))
(_kpblc-ent-modify-autoregen att 60 1 t)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 16:15
#3511
Alexll


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


Для этого кода нужно какую то библиотеку подключать? ругается: ошибка: no function definition: _KPBLC-ENT-MODIFY-AUTOREGEN
Код:
[Выделить все]
 (setq att (car (nentsel "\nВыбери скрываемый объект ")))
(_kpblc-ent-modify-autoregen att 60 1 t)
Допустимо ли такое обновление? Или обязательно нудно по имени обновлять?
Код:
[Выделить все]
 (entupd (entmod (cons (cons 60 1) x)))
После обновления то же не работает. Да и я же смотрю, dxf код не поменялся. Точечная пара не появилась.

Пытаюсь еще как то так выйти из положения
Код:
[Выделить все]
 (entmod (subst '((8 . "Мой слой")(60 . 1)) '(8 . "Мой слой") x))
тут ему не нравится сдвоенная точечная пара '((8 . "Мой слой")(60 . 1))
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 16:25
#3512
AlexSheep


 
Регистрация: 08.09.2010
Москва
Сообщений: 26


Alexll,

Цитата:
Сообщение от Alexll Посмотреть сообщение
Для этого кода нужно какую то библиотеку подключать?
Загрузка файла Лисп
AlexSheep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 16:43
#3513
Кулик Алексей aka kpblc
Moderator

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


Alexll, код функции я приводил выше - бери, загружай, пользуй.
Прочитай справку, какие параметры понимает entupd.
И, кстати, "видимость" для слоя, кажется, особого смысла не имеет. Проще выключить.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 02.04.2018, 17:23
#3514
koMon


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


Цитата:
Сообщение от Alexll Посмотреть сообщение
Добрался до атрибута, как я понял за видимость отвечает 60й код.
А разве за видимость атрибута отвечает 60-я, а не 70-я группа?

Цитата:
Сообщение от Alexll Посмотреть сообщение
а не vla
а почему не vla? ведь можно ревлизовать гораздо проще.

Код:
[Выделить все]
 (setq Attribute_to_hide_dxf_List (entget (setq Attribute_to_hide (car (nentsel "\nPick an Attribute to hide: "))))
      Attribute_to_hide_dxf_List (subst (cons 70 1) (assoc 70 Attribute_to_hide_dxf_List) Attribute_to_hide_dxf_List)
)
(entmod Attribute_to_hide_dxf_List)
(entupd Attribute_to_hide)
Миниатюры
Нажмите на изображение для увеличения
Название: DXF_70.jpg
Просмотров: 16
Размер:	199.4 Кб
ID:	200845  

Последний раз редактировалось koMon, 02.04.2018 в 17:38.
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.04.2018, 04:30
#3515
Alexll


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Прочитай справку, какие параметры понимает entupd.
И, кстати, "видимость" для слоя, кажется, особого смысла не имеет. Проще выключить.
Справка всегда под рукой (entupd <ename>), только лисп для меня сложен. Все делаю методом тыка. Никогда не знаю как оно заработает.
А почему видимость слоя? я меняю видимость атрибута блока, то есть примитива.


Цитата:
Сообщение от koMon Посмотреть сообщение
а почему не vla? ведь можно ревлизовать гораздо проще.
vla совсем не понимаю. Но не отказываюсь. Несколько команд можно и применить.


Цитата:
Сообщение от koMon Посмотреть сообщение
А разве за видимость атрибута отвечает 60-я, а не 70-я группа?
т.к. знаниями не обладаю, занимаюсь исследованиями. Сравнил код со скрытым параметром и с не скрытым. 70й код в обоих случаях равен нулю.
dxf коды отличаются только отсутствием или наличием 60й точечной пары.
У той таблички есть продолжение? можно на нее целиком взглянуть. Как то искал dxf коды, так и не нашел.

атрибут виден, и скрыт:
Код:
[Выделить все]
 
((-1 . <Имя объекта: 7ffff86baf0>) (0 . ATTRIB) (330 . <Имя объекта: 7ffff86ba20>) (5 . 33847) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . Электроосвещение)          (100 . AcDbText) (10 53102.9 -26081.6 0.0) (40 . 2.5) (1 . Гр.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 . AcDbAttribute) (280 . 0) (2 . ГРУППА) (70 . 0) (73 . 0) (74 . 0) (280 . 1))
((-1 . <Имя объекта: 7ffff86baf0>) (0 . ATTRIB) (330 . <Имя объекта: 7ffff86ba20>) (5 . 33847) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . Электроосвещение) (60 . 1) (100 . AcDbText) (10 53102.9 -26081.6 0.0) (40 . 2.5) (1 . Гр.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 . AcDbAttribute) (280 . 0) (2 . ГРУППА) (70 . 0) (73 . 0) (74 . 0) (280 . 1))
Может дело в том, что я не просто примитив прячу, или слой. Я прячу атрибут динамического блока. И для того что бы прятать этот атрибут, есть специальная ручка.

Последний раз редактировалось Alexll, 03.04.2018 в 04:39.
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.04.2018, 11:18
#3516
kurstep


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


Здравствуйте, подскажите кто знает... мне надо совместить в одном коде команду "command" ("vl-cmdf") и затем после выполнения обычный код типа :

Код:
[Выделить все]
 (vl-cmdf "_AecConvertToTable")
 (setq table (vlax-ename->vla-object (entlast)))
........
(команда _AecConvertToTable - из Autocad Architecture - она преобразует таблицу ADT в обычную акад таблицу,)
Но в таком случае вначале выполняется весь код, пропуская команду command (компьютер будто ее пролетает, а выполняет уже в конце кода) - мне же обязательна нужен порядок, чтобы вначале разбилась таблица а потом выполнялся код, Как этого добится?
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.04.2018, 14:40
#3517
Кулик Алексей aka kpblc
Moderator

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


Версия AA?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.04.2018, 15:05
#3518
koMon


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


Цитата:
Сообщение от Alexll Посмотреть сообщение
Я прячу атрибут динамического блока. И для того что бы прятать этот атрибут, есть специальная ручка.
Если есть специальная ручка у чего-нибудь в блоке, то это уже не атрибут, а динамический параметр у динамического блока. DWG и что нужно спрятать нужно показать бы.
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.04.2018, 16:25
#3519
Alexll


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Если есть специальная ручка у чего-нибудь в блоке, то это уже не атрибут, а динамический параметр у динамического блока. DWG и что нужно спрятать нужно показать бы.
Там только одна ручка для скрытия (ГРУППА - Гр2)
Дело в том, что показать блок, уже удалось, манипулирую свойствами атрибута. Поэтому и продолжаю идти в том же направлении.
Боролся с cons - вроде победил ,вроде что то понял.
Но есть другие вопросы, может кто подскажет?
1. Возможно ли при помощи subst заменить одну точечную пару на две? что бы они вошли в список, как точечные пары, а не как подсписок?
2. При добавление точечной пары в примитив, необходимо ставить точечную пару в то место, где она обычно стоит, или можно добавить в начало?
Вложения
Тип файла: dwg
DWG 2013
динамический блок.dwg (36.7 Кб, 4 просмотров)
Alexll вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.04.2018, 16:26
#3520
kurstep


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Версия AA?
Версия AA - 2014rus
Ну я уже нашел выход, сделал так :
Код:
[Выделить все]
   (sssetfirst nil (ssget ))
  (setq pt0 nil)
(while (null pt0)
  (setq pt0 (getpoint "\nТочка левого верхнего угла таблицы: ")))

  
(vl-cmdf "_AecConvertToTable" pt0 )
 
 (setq table1 (vlax-ename->vla-object (entlast)))
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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

Быстрый переход

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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||