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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1965720
 
Непрочитано 10.07.2018, 08:46
#3641
Кулик Алексей aka kpblc
Moderator

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


Ну, как один из вариантов: http://autolisp.ru/2018/07/02/some-lsp-to-one/ И потом полученный lsp уже загружать.
Хотя я использую совершенно другой подход, прекрасно описанный в "САПР на базе AutoCAD" (книжка, к сожалению, уже не продается)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.07.2018, 10:14
#3642
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну, как один из вариантов: http://autolisp.ru/2018/07/02/some-lsp-to-one/ И потом полученный lsp уже загружать.
Хотя я использую совершенно другой подход, прекрасно описанный в "САПР на базе AutoCAD" (книжка, к сожалению, уже не продается)
Исходник изучу, спасибо. А вот такую книгу мне наверно рано еще читать.
gnuvse вне форума  
 
Непрочитано 10.07.2018, 10:37
#3643
Сергей812


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


Цитата:
Сообщение от gnuvse Посмотреть сообщение
А вот такую книгу мне наверно рано еще читать.
эту книгу читать просто для общего развития. Сейчас предлагать с нуля делать приличный САПР на лиспе - не самый лучший выбор, имхо. Тогда просто выбора не было - лисп или ObjectARX.
Сергей812 вне форума  
 
Непрочитано 11.07.2018, 06:44
#3644
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от gnuvse Посмотреть сообщение
понаписал много функции для обработки символов, подскажите пожалуйста, как я их могу выделить в какую-то библиотеку?
Возможно я не прав и сейчас полетят камни, но для себя сделал так:
В каждой программе, вернее в каждом lsp файле, одной из первой строк висит (if (null *sad_lib_isLoaded) (load "_sad-fun-lib.lsp"))
И в конце библиотеки висит исполняемая строчка (setq *sad_lib_isLoaded t)
Таким образом, имею проверку, загружен ли файл, и если нет, то он загружается...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 11.07.2018 в 06:54.
Vladimir_Sergeevich вне форума  
 
Непрочитано 15.07.2018, 13:58
#3645
BithSachs


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


Мне нужно сохранить текущий чертеж в трех разных типах (2013, 2010, 2007), добавить в конце имени год и вернуться на исходный путь файла, путем его перезаписи

Код:
[Выделить все]
 (defun c:RESERV ( / start-name start-path 1styear 2styear 3styear)
	(setq start-name (getvar "dwgname")) (print start-name)
	(setq start-path (getvar "dwgprefix")) (print start-path)
		(setvar "FILEDIA" 0)
	(setq 1styear "2013" ) (print 1styear)
	(setq 2styear "2010" ) (print 2styear)
	(setq 3styear "2007" ) (print 3styear)	
	;1
	(command "_saveas" 1styear (strcat start-path start-name " " 1styear )  )
	;2
	(command "_saveas" 2styear (strcat start-path start-name " " 2styear )  )
	;3
	(command "_saveas" 3styear (strcat start-path start-name " " 3styear )  )
	;END 
	(command "_saveas" 1styear (strcat start-path start-name ) "Д")

		(setvar "FILEDIA" 1)
)
На первый заход все хорошо, но на следующие, когда файлы уже перезаписываются, возникают проблемы: функция прерывается из-за диалога о перезаписи, и все сбрасывается (Добавить везде в конце "Д" не помогает).
Походу нужно добавить условие, но как его запихнуть в command функцию я не знаю
BithSachs вне форума  
 
Непрочитано 15.07.2018, 14:14
1 | #3646
Сергей812


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


Сначала делаете три копии файла, а потом открываете и пересохраняете под нужной версией. А перед этим проверяете - есть ли уже данный файл и удаляете при необходимости. Это будет более надежно, имхо. Например, в .Net это все проще делается - просто делается временная копия БД и сохраняется под нужным именем и версией
Код:
[Выделить все]
using (Database lTempdb = db.Wblock())
{
lTempdb.SaveAs(%Имя файла%, %Версия файла%);
}
не затрагивая сам текущий чертеж. Есть ли подобная возможность в лиспе - не в курсе. Но явно не стоит использовать командные методы, если есть vla-SaveAs, например.
Сергей812 вне форума  
 
Непрочитано 15.07.2018, 18:07
#3647
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если есть vla-SaveAs
есть

Код:
[Выделить все]
 
(defun c:RESERV ()
    (setq acad_object (vlax-get-acad-object))
    (setq document_object (vla-get-ActiveDocument acad_object))
    (setq dwg_name (vla-get-name document_object))
    (setq dwg_path (vla-get-path document_object))	  
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2007") ac2007_dwg)
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2010") ac2010_dwg)
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2013") ac2013_dwg)
)
koMon вне форума  
 
Непрочитано 15.07.2018, 18:56
#3648
Сергей812


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


а вернуться обратно:
Цитата:
Сообщение от BithSachs Посмотреть сообщение
вернуться на исходный путь файла, путем его перезаписи
но мне не нравится - что к файлу последней версии путь идет через пересохранение "древнего" 2007 формата.
Сергей812 вне форума  
 
Непрочитано 15.07.2018, 21:37
#3649
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а вернуться обратно:
Код:
[Выделить все]
 (defun c:RESERV ()
    (setq acad_object (vlax-get-acad-object))
    (setq document_object (vla-get-ActiveDocument acad_object))
    (setq dwg_name (vla-get-name document_object))
    (setq dwg_path (vla-get-path document_object))	  
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2007") ac2007_dwg)
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2010") ac2010_dwg)
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name " 2013") ac2013_dwg)
    (vla-SaveAs document_object (strcat dwg_path "\\" dwg_name) ac2013_dwg)
)

Последний раз редактировалось koMon, 15.07.2018 в 21:45.
koMon вне форума  
 
Непрочитано 15.07.2018, 21:44
#3650
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
так никто никуда и не уходит, возвращаться некуда, версии сохраняются как копии.
если глянуть справку:
Цитата:
The full path and file name, or valid URL address, for the file. The active document takes on the new name.
Если получает новое имя, но и ту версию файла - под которым сохранялось. Иначе совсем нелогично - имя файла новое, а версия "старая".
Сергей812 вне форума  
 
Непрочитано 15.07.2018, 21:48
#3651
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


не успел) но был не прав
koMon вне форума  
 
Непрочитано 15.07.2018, 22:26
#3652
Сергей812


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


т.е. получается так:
1. Формируются полные имена файлов для более младших версий.
2. Пробуются удалить с помощью vl-file-delete. Если произошла ошибка удаления - то работа лиспа прекращается. Но тут возникает вопрос - как различить успешное удаление существующего файла, отсутствие файла и отсутствие доступа к файлу (т.е. кто-то успел его открыть в акаде, например). В справке вопрос отсутствующего файла проигнорирован - что возвращает в этом случае)
3. Если файлы младших версий успешно удалены, то сохраняет в текущей версии и далее по нисходящей.
4. Открывается снова исходный файл, подавляя диалоговые окна при необходимости. И после этого закрывается файл самой младшей версии. А тут тоже новый вопрос - лисп работает ведь в контексте документа и при открытии нового чертежа прервется выполнение?
Сергей812 вне форума  
 
Непрочитано 18.07.2018, 10:27
#3653
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 29


Создаю описание блока. В конце функции нужно его удалить. Подскажите, пожалуйста, как на лиспе проще всего реализовать удаление неиспользованного блока. Аналог PURGE, только не массовый, а штучный.
T.Bagdat вне форума  
 
Непрочитано 18.07.2018, 10:53
#3654
Кулик Алексей aka kpblc
Moderator

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


(vla-erase <vla-указатель на описание блока>)
Ну или
(entdel <ename-указатель на описание блока>)

Попробуй...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.07.2018, 11:48
#3655
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 29


(entdel <ename-указатель на описание блока>) возвращает nil, и описание остаётся в базе.
Это я пробовал первым делом.
А по поводу (vla-erase <vla-указатель на описание блока>) в книге Полещука несколько запутано. Написано, что этот метод работает для графических примитивов включённых в набор. И приведён пример с некоторыми предварительными действиями:
Цитата:
(setq obj (vla-get-ActiveSelectionSet actdoc))
;;; #<VLA-OBJECT IAcadSelectionSet 0bef85e4>
(vla-Clear obj)
(vla-SelectOnScreen obj)
(vla-Erase obj)
А как можно включить блок в набор, если это описание, а не вхождение?
T.Bagdat вне форума  
 
Непрочитано 18.07.2018, 11:53
1 | #3656
Кулик Алексей aka kpblc
Moderator

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


Тьфу, не vla-erase, а vla-delete!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.07.2018, 12:08
#3657
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 29


Ну вот как-то так получается:
Цитата:
Команда: (vla-delete (vlax-ename->vla-object (tblobjname "block" "proba")))
; ошибка: Ошибка Automation. Не может быть стерто тем, кто вызвал
----- добавлено через ~17 мин. -----
А, всё, нашёл решение. Спасибо за наводку.

(vla-delete (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))) "proba"))

http://www.cad.dp.ua/sovets/lisp-functions/purger.php

Последний раз редактировалось T.Bagdat, 18.07.2018 в 12:36.
T.Bagdat вне форума  
 
Автор темы   Непрочитано 30.07.2018, 15:38
#3658
Red Nova

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


Доброго.

Как разрешить ввод либо реального числа либо точки ? То есть совместить getpoint и getreal в одном?
Пока смог только с промежуточным использованием клавиши enter, а хочется по человечески.

Код:
[Выделить все]
 (setq pt2
	 (cond
	   ((getpoint "\nThe Radius Point (or Enter for Diameter):"))
	   ((getreal "\nEnter Diameter in inches:"))
	   )
	)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2018, 20:38
#3659
Maksim7enov


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Как разрешить ввод либо реального числа либо точки ?
Может getkword и в initget прописать ключи для выбора
Maksim7enov вне форума  
 
Непрочитано 01.08.2018, 12:48
1 | #3660
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Как разрешить ввод либо реального числа либо точки ? То есть совместить getpoint и getreal в одном?
а в чём цель? построить окружность? если это, то (getdist) может быть полезен, но по ходу только с радиусом и без точек
koMon вне форума  
Ответ
Вернуться   Форум 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