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

Вернуться   Форум 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.
Просмотров: 2048537
 
Непрочитано 05.07.2024, 14:57
#4641
Ingpro


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


А можно изменить код, чтобы поменять регистр на нижний? Или добавить возможность выбора регистра...
Команда tcase (Uppercase и Lowercase) в кодах не используется? А что вместо неё?
Ingpro вне форума  
 
Непрочитано 05.07.2024, 15:16
1 | #4642
Кулик Алексей aka kpblc
Moderator

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


А поискать справку по strcase - нихьть?
https://www.progesoft.com/products/p...ctions/strcase
https://www.lee-mac.com/textcasefunctions.html
И тому подобное
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.07.2024, 15:28
#4643
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А поискать справку по strcase - нихьть?
хьть, спасибо!
Ingpro вне форума  
 
Непрочитано 05.07.2024, 15:40
#4644
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Ingpro Посмотреть сообщение
А как это конкретно в коде прописать?
Ну в описании локальной функции *error* надо просто прописать строчку с возвращением запомненной в начале кода системной переменной. Эта функция запустится в случае ошибки и сделает всё, что в ней прописано.
Цитата:
Сообщение от Ingpro Посмотреть сообщение
Т. е. достаточно добавить *error*, и больше ничего не менять в коде?
Да, именно так.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Уже проще через vl-catch-* работать, если припрет.
Удобное это семейство, но ведь тоже на каждое "узкое место" их ненапасёшься.
Расскажи, пожалуйста, Алексей, как часто и в принципе - в каких местах рекомендуешь вставлять vl-catch-*? Интерактивный ввод? Вычисления, в которых изначально возможны ошибки? Так ведь можно прийти к тому, что чуть ли не каждую строку станет надо обернуть в это вээлкэтч)
skkkk вне форума  
 
Непрочитано 05.07.2024, 15:51
#4645
Кулик Алексей aka kpblc
Moderator

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


Ну, лично у меня нет однозначных рекомендаций. В текущих реалиях обычно ставлю когда у пользователя что-то запрашиваю (эта ж зараза в любой момент может Esc нажать), ну и основную команду тоже оборачиваю. Так-то у vl-catch-* есть ограничение - не больше, кажется, 9 уровней вложенности. Так что приходится изгаляться
P.S. Если с этими обертками переборщить, то скорость работы кода может кратно упасть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.07.2024, 02:51
#4646
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну, лично у меня нет однозначных рекомендаций.
Ну как это - "нет"?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В текущих реалиях обычно ставлю когда у пользователя что-то запрашиваю
Я ж и говорю: "Интерактивный ввод", подразумевая, что это зараза)
А вот почему-то до сих пор не догадался основную функцию в неё обернуть вместо *error*)
Надо будет попробовать это сделать
skkkk вне форума  
 
Непрочитано 25.07.2024, 14:55
#4647
Сет


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


Подскажите, как программно настроить межстрочный интервал мультитекста в мультивыноске? В моем примере он установлен автоматически и равен 416,67 и выноска отображается криво (слева). Если его поменять хотя бы на 417 - выноска становится нормальная (справа)



----- добавлено через ~7 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
Подскажите, как программно настроить межстрочный интервал мультитекста в мультивыноске? В моем примере он установлен автоматически и равен 416,67 и выноска отображается криво (слева). Если его поменять хотя бы на 417 - выноска становится нормальная (справа)
Сам уже нашел - vla-put-TextLineSpacingDistance. Однако это не помогло привести выноску в нормальный вид, она все равно выглядит как вариант слева. Причем таким образом выноска выглядит только если я в качестве содержимого устанавливаю ссылку на поле. С обычным текстом выноска отображается нормально. Эта выноска создана с помощью лиспа. Из-за чего выноска получается кривой, если ее содержимое - это ссылка на поле?

----- добавлено через ~17 мин. -----
Любое изменение межстрочного интервала в свойствах уже созданной выноски - приводит ее к нормальному виду. А вот программно почему-то отображается не так как надо. Если же выноска без ссылки на поле - программно отображается нормально.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 126
Размер:	17.5 Кб
ID:	263929  
Сет вне форума  
 
Непрочитано 25.07.2024, 15:58
#4648
Сет


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


Еще немного поковырялся. Выноска приходит в норму при изменении почти любых параметров мультитекста через панель свойств. А проблема кажется в том, что когда выноска формируется программно - я с помощью функции vla-GetBoundingBox определяю длину мультитекста для своих нужд. Но судя по всему в этот момент программа думает, что верхний текст - это "####" - поле до регенерации. И исходя из этого формирует мультивыноску. Но реальный текст "2" - поэтому выноска выглядит криво. Как с этой проблемой справиться? vla-regen перед vla-GetBoundingBox не помогает, это всего лишь позволяет при вставке выноски получить значение поля. Без vla-regen значение будет "####".
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 115
Размер:	5.1 Кб
ID:	263931  
Сет вне форума  
 
Непрочитано 25.07.2024, 17:28
#4649
Сет


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


Удалось сделать выноску нормального вида применив в конце лиспа функцию vla-put-TextJustify. Не проверял, но наверное многие функции изменения параметров мультитекста дали бы такой же результат, хотя вот изменение интервала между линиями (vla-put-TextLineSpacingDistance) не сработало.
Сет вне форума  
 
Непрочитано 25.07.2024, 20:30
2 | 1 #4650
Кулик Алексей aka kpblc
Moderator

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


А vla-update не сработает?
----
Offtop: Оставлю себе на память - сообщение №40 000...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2024, 22:06
#4651
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А vla-update не сработает?
Нет.
Сет вне форума  
 
Непрочитано 26.07.2024, 12:50
#4652
Сет


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


Продолжаю ковыряться с выноской с полем. Образовалась новая проблема. Если поле изменено, то текст смещается относительно полки. Почти любое редактирование выноски через панель свойств приводит ее в норму. Это происходит из-за выравнивания текста выноски по центру. Если выравнивание стоит по умолчанию (влево), то выноска и при изменении поля сразу после регенерации выглядит нормально, то есть текст поля автоматом подстраивается под полку.

Возможное решение - отследить событие изменение содержимого поля и произвести формальное форматирование текста, чтобы он нормально соориентировался относительно полки.

Можно ли повесить на мультивыноску с полем реактор, который будет отслеживать изменение содержимого поля? Я попробовал vlr-object-reactor с отслеживанием события :vlr-objectModified - оно не срабатывает при изменении содержимого поля после регенерации.
Сет вне форума  
 
Непрочитано 26.07.2024, 14:04
#4653
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Попробуй после изменения стереть и обратно восстановить выноску.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 26.07.2024, 14:35
#4654
Кулик Алексей aka kpblc
Moderator

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


А если попробовать выполнить обновление поля? Принудительно, программно (ну, на крайний случай - командой)?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.07.2024, 15:22
#4655
Сет


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Попробуй после изменения стереть и обратно восстановить выноску.
Восстановить как? Undo? Это не срабатывает.

Вообще нужен способ, который позволяет автоматически, условно скажем "обновить" выноску с полем, после того как выполнена регенерация. Как я вижу тут бы помог реактор, который бы выявил изменение содержимого выноски и в обработчике реактора я бы, например, включил Скрытие заднего плана и тут же выключил. Такие действия через панель свойств приводят выноску в норму. Вопрос в том, какой именно реактор здесь надо использовать? Кажется удобнее всего объектный реактор, но у меня не получилось через :vlr-objectModified. Этот реактор срабатывает, если двигать вершины выноски или вручную менять ее содержимое, но при обновлении поля через регенерацию - не срабатывает.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если попробовать выполнить обновление поля? Принудительно, программно (ну, на крайний случай - командой)?
Пробовал _updatefield - не помогает.
Сет вне форума  
 
Непрочитано 26.07.2024, 17:51
#4656
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Восстановить как? Undo? Это не срабатывает.
Нет - (entdel ...) 2 раза.

Что-то давно у меня подобное было с "кривым отображением".
Только таким способом и выкручивался. Может быть - и здесь
поможет.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 26.07.2024, 17:53
#4657
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Сет, может, в этой теме найдётся решение?
skkkk вне форума  
 
Непрочитано 26.07.2024, 20:27
#4658
Сет


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


Прикрутил вот такой костыль к мультивыноскам. Создал командный реактор (cs_regen_reactor) и обработчик события :vlr-commandEnded (cs_regen). После выполнения регенерации выбираю все мультивыноски чертежа и центрирую содержимое мультитекста. Этот подход, конечно, некрасивый, но он работает - выноски с полями после регенерации выглядят нормально.

Код:
[Выделить все]
 (defun c:cs_create_reactor ( / )
    (setq cs_regen_reactor (vlr-command-reactor " " (list '(:vlr-commandEnded . cs_regen))))
) ; defun

(defun cs_regen (reac cname / ss n i item m)
    (if (member (car cname) (list "РЕГЕН" "REGEN" "_regen" "ВСЕРЕГЕН" "REGENALL" "_regenall"))
	(progn
	    (setq ss (ssget "_X" '((0 . "MULTILEADER"))))
	    (setq n (sslength ss))
	    (setq i 0)
	    (while (< i n)
		(setq item (ssname ss i))		
		(setq m (vlax-ename->vla-object item))
		(if (= (vla-get-ContentType m) acMTextContent) (vla-put-TextJustify m acAttachmentPointMiddleCenter))
		(setq i (1+ i))
	    ) ; while
	    (setq ss nil)	     
	) ; progn
    ) ; if
    (princ (strcat "\nКоманда " (car cname) ". Обработано " (itoa n) " мультивыносок."))
    (princ)	
) ; defun
----- добавлено через ~2 мин. -----
Но теперь в командной строке при выполнении других команд появляется мусор Вот, например, после добавления в чертеж отрезка.
Цитата:
Команда: _line
Первая точка:
Следующая точка или [оТменить]:
Следующая точка или [оТменить]:
; ошибка: неверный тип аргумента: fixnump: nil

Последний раз редактировалось Сет, 26.07.2024 в 20:32.
Сет вне форума  
 
Непрочитано 26.07.2024, 20:43
#4659
Кулик Алексей aka kpblc
Moderator

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


1. Тебе никто не помешает несколько раз зарегистрировать реактор - в текущих реалиях.
2. Кто мешает все же проверять - что болтается в наборе?
3. Не отслеживаешь заблокированные и замороженные слои.
4. ... Обрабатывать реактором вообще все - ИМХО ну так себе затея. Я бы подумал, что и как сделать, чтоб мультивыноска изначально строилась "нормально".
Опять же дамп, проверки, изменения и теде. И, может быть, все сработает на реакторе окончания команды вставки мультивыноски.
ЗЫ В реактор имя команды, насколько я помню, всегда приходит на английском языке. Могу ошибаться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.07.2024, 21:01
#4660
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тебе никто не помешает несколько раз зарегистрировать реактор - в текущих реалиях.
Я пока тестирую, в будущем планировал делать проверку на существование реактора.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кто мешает все же проверять - что болтается в наборе?
Да. Подправил код, добавил некоторые проверки, наверное еще не все.

Код:
[Выделить все]
 (defun cs_regen (reac cname / ss n i item m)
    (if (and
	    (member (car cname) (list "РЕГЕН" "REGEN" "_regen" "ВСЕРЕГЕН" "REGENALL" "_regenall"))
	    (setq ss (ssget "_X" '((0 . "MULTILEADER"))))
	) ; and
	(progn
	    (setq n (sslength ss))
	    (setq i 0)
	     (while (< i n)
		(setq item (ssname ss i))		
		(setq m (vlax-ename->vla-object item))
		(if (= (vla-get-ContentType m) acMTextContent) (vla-put-TextJustify m acAttachmentPointMiddleCenter))
		(setq i (1+ i))
	    ) ; while
	    (setq ss nil)
	    (princ (strcat "\nКоманда " (car cname) ". Обработано " (itoa n) " мультивыносок."))
	) ; progn
    ) ; if
    (princ)	
) ; defun

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не отслеживаешь заблокированные и замороженные слои.
Пока да, надо подумать об этом тоже.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Обрабатывать реактором вообще все - ИМХО ну так себе затея. Я бы подумал, что и как сделать, чтоб мультивыноска изначально строилась "нормально".
Согласен. Грубый костыль, но как побороть выноску не придумал.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В реактор имя команды, насколько я помню, всегда приходит на английском языке. Могу ошибаться.
Да, на английском. По крайней мере в моем случае. REGEN и REGENALL.
Сет вне форума  
Ответ
Вернуться   Форум 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