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

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

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

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

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


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


skkkk, благодарю!
Код:
[Выделить все]
 (open (getfiled "Выбрать файл для сохранения данных" (strcat (getvar "DWGPREFIX")(vl-filename-base (getvar "DWGNAME"))) "txt" 1) "a")
В такой конструкции не будет проблем?
Технически, в составе лиспа, работает корректно.
superkot007 вне форума  
 
Непрочитано 03.08.2019, 09:04
#3762
skkkk

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


Цитата:
Сообщение от superkot007 Посмотреть сообщение
В такой конструкции не будет проблем?
Не должно быть, вроде.
skkkk на форуме  
 
Непрочитано 04.08.2019, 21:30
#3763
Кулик Алексей aka kpblc
Moderator

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


Ну, не будет - если только в ответ на getfiled не нажать Esc
__________________

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


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


Подскажите, как программно изменить высоту рамки и установить выравнивание мультитекста?
Сет на форуме  
 
Непрочитано 13.08.2019, 18:51
#3765
Кулик Алексей aka kpblc
Moderator

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


Выравнивание: либо менять свойство AttachmentPoint, либо менять 71 группу в DXF. А что за "высота рамки"? Если блок - то соответствующие масштабы.
__________________

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


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что за "высота рамки"?
Мультитекст же вписывается в рамку. Мне нужно программно задать ее ширину, высоту и выравнивание. С шириной все просто, с выравниванием ты подсказал, а с высотой пока вопрос.
Сет на форуме  
 
Непрочитано 13.08.2019, 23:19
#3767
Сергей812


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


Цитата:
Сообщение от Сет Посмотреть сообщение
а с высотой пока вопрос.
вроде 45 группа задает отступ рамки от границы самого текста. А сама рамка никак не настраивается - видима, она рассматривается как контейнер для мультитекста, а не как отдельный элемент.
Сергей812 вне форума  
 
Непрочитано 14.08.2019, 15:40
#3768
Сет


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


Тогда как бы решить вот такую задачу. Смотри поясняющую картинку. Нужно программно задать ширину, высоту, содержимое и выравнивание мультитекста. В случае на картинке пользователь задает ширину зеленой рамки, высоту этой рамки, текст, указывает точку вставки (красный квадратик) и программно рисуется мультитекст по заданным параметрам. Прототип функции такой:

Код:
[Выделить все]
 
(vl-load-com)
(setq acad_application (vlax-get-acad-object))
(setq active_document (vla-get-ActiveDocument acad_application))
(setq model_space (vla-get-ModelSpace active_document))

(defun c:my_mtext (/) 
(setq width (atoi (getstring T "Введите ширину текста:")))
(setq height (atoi (getstring T "Введите высоту текста:"))) 
(setq text (atoi (getstring T "Введите текст:")))
(setq mtext (vla-AddMText model_space (vlax-3D-point (getpoint "\nУкажите точку вставки:")) width text))
) 
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 12
Размер:	1.6 Кб
ID:	216837  
Сет на форуме  
 
Непрочитано 18.08.2019, 18:58
#3769
jeka_me


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


Добрый день.
Прошу написать команду, к примеру "deltemp", при вызове которой, удалялось бы все с конкретного слоя "Temp". И пояснить используемые команды в программе.
Спасибо.
jeka_me вне форума  
 
Непрочитано 18.08.2019, 20:34
#3770
Кулик Алексей aka kpblc
Moderator

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


Все просто:
1. Проверить наличие слоя
2. Если слой есть, то разблокировать и разморозить
3. Пройтись по всем блокам (включая модель и пространства листов) и удалить в них примитивы, лежащие на слое

Скорее всего, будут проблемы с атрибутами и описаниями атрибутов, но это уже отдельная песня.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.08.2019, 22:54
#3771
jeka_me


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


Благодарю за быстрый ответ, но есть пару нюансов:
1. Алгоритм действительно не сложный и понятный, но с реализацией у меня проблема, хочу воспользоваться: "Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)".
2. Из блоков и листов удалять не надо.
jeka_me вне форума  
 
Непрочитано 19.08.2019, 00:13
1 | #3772
skkkk

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Все просто
Вспомнился Эйнштейн со своим "Вы думаете, что всё так просто? Все просто, но совсем не так!"
jeka_me, "научите" и "напишите" - это ведь два разных слова с далеким друг от друга смыслом. Ход хитрый, но кажется, его уже раскусили
Знаю, знаю, вместо того, чтобы ворчать тут, предложил бы что-то по делу.
Рекомендую попробовать из готового - тема на форуме "Подготовка подосновы". Там есть команда, которая удаляет слой вместе со всеми объектами на нем.
Правда, судя по описанию задачи, сам слой удалять не нужно. Тогда можно вот так (без проверки на блокировку/заморозку слоя, без удаления в блоках и на листах - удаляет в текущем пространстве, т.е. в данном случае - в модели):
Код:
[Выделить все]
 (defun C:deltemp ( / ss)
	(setq ss (ssget "_X" '((8 . "Temp"))))
	(if ss
		(vl-cmdf "_.ERASE" ss "")
		(princ "/nОбъекты не найдены")
	)
	(princ)
)
Код не проверял, но надеюсь, нигде не напортачил, так как особо и негде тут напортачить. В свете последних новостей не уверен, что будет работать на самых новых автокадах. Хотя должен бы.
skkkk на форуме  
 
Непрочитано 19.08.2019, 00:42
#3773
jeka_me


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


Всего 8 строк, а моей признательности нет границ)
Все работает именно так как я ожидал.
Хорошая мотивация для саморазвития, еще раз выражаю благодарность.
jeka_me вне форума  
 
Непрочитано 19.08.2019, 08:15
1 | #3774
Кулик Алексей aka kpblc
Moderator

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


А есть еще команда _.laydel, которая заодно и слой сносит...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.08.2019, 19:10
#3775
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,029


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А есть еще команда _.laydel, которая заодно и слой сносит...
Вооот и лисп уже не очень то и нужен. Сносим слой со всем содержимым и создаем его заново - макрос.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 29.08.2019, 20:26
#3776
superkot007


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


Добрый вечер!
Как разбить строку на части, например, по встречающимся "-"?
Исходные строки типа "AA.BBxCC.DD-EE-FF-GG-HH-12345-I-J-6.7 лист 98".

Попробовал следующее:
Код:
[Выделить все]
 ...
(setq PP0 (substr PP_ORIG (1+ (vl-string-search "лист" PP_ORIG))))
(setq PP1 (vl-string-right-trim PP0 PIPELINE_ORIG))
(setq PP2 (substr PP1 (1+ (vl-string-search "-" PP1))))
(setq PP3 (vl-string-right-trim PP2 PP1))
...
Столкнулся с тем, что код работает нестабильно.
С PP0 все нормально, в нее попадает "лист ...". А вот в переменную PP1 могут попадать как корректные значения (новая строка заканчивается цифрой/буквой) так и какие-то выкидыши (новая строка заканчивается "-", хотя до обрезки по "-" еще не подошли). Соответственно, дальнейшие разделения превращаются в кашу.
???
superkot007 вне форума  
 
Непрочитано 29.08.2019, 21:20
#3777
Сергей812


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


Как написан, так и работает) Есть исходная строка, ввести две локальных переменных - индексы начала (SSG) и конца сегмента (ESG).
Вначале SSG=1, ESG=индекс позиции первого разделителя (через поиск)-1. Получили через substr первый сегмент.
А потом SSG=ESG+1(после разделителя), и если SSG не вышло за пределы строки - ищем ESG как следующую позицию разделителя, при этом SSG-1 является позицией начала поиска для vl-string-search.
И так сдвигаемся по исходной строке, не надо никаких подрезок строк делать - наверняка там где-то и вылезают выкидыши ваши из-за несогласованности индексов позиций.

p.s. Если один символ в разделителе - то лучше vl-string-position использовать, наверно - она должна быстрее работать по идее.
Сергей812 вне форума  
 
Непрочитано 29.08.2019, 23:05
#3778
superkot007


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


Сергей812, спасибо за расписанный алгоритм)
Получилось примерно следующее:
Код:
[Выделить все]
 (setq SSG 1); - индекс начала сегмента
(setq ESG (vl-string-search "-" PIPELINE_ORIG); - индекс конца сегмента
(setq PIPELINE_UNIT (substr PIPELINE_ORIG SSG ESG)); - извлекаемая секция
(setq PIPELINE_NEXT (substr PIPELINE_ORIG (+ ESG 2))); - хвост без "-"
Выбрал более понятный (для себя) итерационный подход, где можно обойтись без SSG (всегда будет = 1).
Повторяя строки 2-4 нужное число раз, извлеченные фрагменты передаются в дальнейшую обработку.
superkot007 вне форума  
 
Непрочитано 29.08.2019, 23:13
#3779
Сергей812


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


Ну я стараюсь поменьше операций изменений строк делать, так как они самые ресурсоемкие)
Сергей812 вне форума  
 
Непрочитано 30.08.2019, 07:40
#3780
Кулик Алексей aka kpblc
Moderator

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


Один из многих вариантов с https://www.theswamp.org/index.php?topic=55402.new#new :
Код:
[Выделить все]
 (defun _peelstring (string del / str pos lst)
  ;; Tharwat - date: 07.Nov.2015        ;;
  (while (setq pos (vl-string-search del string 0))
    (setq str    (substr string 1 pos)
          string (substr string (+ pos (1+ (strlen del))))
    )
    (and str (/= str "") (setq lst (cons str lst)))
  )
  (and string (/= string "") (setq lst (cons string lst)))
  (reverse lst)
)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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