Анкерные системы Schöck Dorn
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,952
Отправить сообщение для 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.
Просмотров: 1148812
 
Непрочитано 25.06.2017, 11:07
#3361
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 127


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Если же сперва вставить блок в точку с нулевыми координатами в нужном размере, а затем использовать "._move"
а почему не "_change"?
ну и ActiveX:
Код:
[Выделить все]
 
(defun _vis_ins_blk ( asp blkName blkScal blkAngl / actdoc actspace bl)
;;; Вставка блока (динамическая)
;;; asp - vla-указатель на пространство документа
;;; blkName - имя блока - строковая (вхождение блока должно быть)
;;; blkScal - масштаб вставки - действительное
;;; blkAngl - угол поворота блока - действительное
        
  (princ "\nТочка вставки:")
  (vl-catch-all-error-p 
    (vl-catch-all-apply 
     '(lambda ()
        (while
          (= 5 (car (setq gr (grread 13 0))))
          (if bl (vla-erase bl))
          (setq bl 
                   (vla-InsertBlock asp
                     (vlax-3d-point (cadr gr))
                     blkName blkScal blkScal blkScal blkAngl
                   ) ;_ end vla-InsertBlock
          ) ;_ end setq
        ) ;_ end while
      ) ;_ end lambda
    ) ;_ end vl-catch-all-apply
  ) ;_ end vl-catch-all-error-p 
  (cond ((/= 3 (car gr))(vla-erase bl)(setq bl nil))(bl))
) ;_ end defun


(defun _vis_mins_blk ( adc blkName blkScal blkAngl / actdoc actspace bl)
;;; Множественная вставка блока (динамическая)
;;; asp - vla-указатель на пространство документа
;;; blkName - имя блока - строковая (вхождение блока должно быть)
;;; blkScal - масштаб вставки - действительное
;;; blkAngl - угол поворота блока - действительное
;;; Запуск: (_vis_mins_blk (vla-get-activedocument (vlax-get-acad-object)) "fire_smoke" 100 0)
        
  (setq asp    (if (= (vla-get-activespace adc) 1)
                 (vla-get-modelspace adc)
                 (vla-get-paperspace adc)
               ) ;_ end if
        bl_lst nil
  ) ;_ end setq
  (while
    (setq blk (_vis_ins_blk asp blkName blkScal blkAngl))
    (setq bl_lst (cons blk bl_lst))
  ) ;_ end while
  bl_lst
) ;_ end defun

Последний раз редактировалось roaa, 26.06.2017 в 20:12.
roaa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.06.2017, 22:13
#3362
Кулик Алексей aka kpblc
Moderator

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


Придется извращаться - запоминать последний примитив, выполнять команду, проверять соответствие и т.п. Ну или переходить на .net...
Сам был в шоке!
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2017, 00:16
#3363
Сергей812


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


А пробовали написать в Аутодеск - чем вызвано такое изменение поведения функции vl-cmdf ?
А для command у Полещука написано - что возвращаемое значение nil всегда.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2017, 01:15
#3364
skkkk

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
command у Полещука написано - что возвращаемое значение nil всегда
Это-то давно известно, Алексей просто напомнил. Я с самого начала освоения лиспа не понимал, зачем же она возвращает nil? Ну не возвращай ты ничего, верни какой-либо список параметров выполненной команды, имя команды в конце концов. А тут просто - выполнил команду, хоть всё и верно прошло, а в ответ - ЛОЖЬ! Где логика? Ладно, я с этим смирился, и даже использовал ее порой, бывали случаи, когда vl-cmdf не отрабатывал (конкретики сейчас не припомню - всегда старался уходить от командных методов). Но вот уж вообще чего не пойму: зачем трогать то, что работало и так? Заставляя при этом разрабов переписывать коды в языке, который прямо-таки и вопил на всех углах: "Я не завишу от версии!!!" Возможно были конфликты с какими-то из новшеств. Или же это было начало политики, провоцирующей всех постепенно
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
переходить на .net
Знать бы куда и кому писать. Никогда этого не делал, поскольку особо не верил в то, что меня услышат. Вместо этого усердно ваял костыли и искал обходные пути. Наверное, я "социальный овощ" по Бушману.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2017, 01:43
#3365
Сергей812


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


Ну они и про VBA пугали уже сколько лет - что откажутся от его поддержки. И тоже в пользу того же NET, ObjectARX - в конечном итоге еще джаву прилепили с какой то версии, оставив остальное)
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.06.2017, 16:41
1 | 1 #3366
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,836


Цитата:
Сообщение от roaa Посмотреть сообщение
а почему не "_change"?
ну и ActiveX:
Ну, один раз можно. Но гораздо полезнее множественная вставка блока. При этом блок должен постоянно висеть на курсоре, уже в нужном масштабе, возможно повернутым. Блок может иметь атрибуты, причем всех видов, а может и не иметь. И прерывать цикл как в штатных командах - пустым вводом. И чтобы при этом не вывалиться из основной программы.

Такая функция может применяться очень часто. Вообще идеально, чтобы была штатной, но....

Мы с Петром Лоскутовым (Alaspher) - соавтором Н.Н. Полещука по книге AutoLISP и Visual LISP в среде AutoCAD и подружились при совместной отработке этой функции лет 20 назад. Тогда был только Автолисп, не было замечательных vl-catch-xxx, никаких ActiveX.

Было много сложных вариантов. чтобы выполнить все условия. Более простой появился вместе с vl-cmdf, которая стала возвращать T или NIL. Но вот "никогда такого не было и опять".

Хорошо хоть могу послать уродов из AutoDesk в "индейскую избу"...
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.07.2017, 18:14
#3367
LcH


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


Может кто-нибудь откликнется на мой вопрос.
Можно из программы на Автолиспе получить информацию, есть ли в dwg объекты, к которым можно применить purge?
Т.е., хотелось бы не входить в диалог утилиты AutoCAD 'Проверить', не делать _purge, не делать (repeat 3 (vla-PurgeAll (vla-get-ActiveDocument (vlax-get-acad-object)))),
т.е. не чистить, а только получить информацию, требуется очистка dwg, или нет.
Для другой проверки - требуется _audit dwg, или нет, я сделала (написала - это будет громко сказано) небольшую функцию-команду, где использовала (vla-AuditInfo active_doc :vlax-False), и мне было достаточно нескольких последних результирующих строк протокола работы этой функции, чтобы сформировать сообщение разработчику dwg, о необходимости провести проверку внутренней структуры чертежа, исправить ошибки.
Сейчас мне требуется не чистить чертеж, а проверить, был ли чертеж очищен, желательно написать функцию - проверку.
Не подскажете, это возможно?
LcH вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 09:10
#3368
frostmourn


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


А результат в каком виде нужно получить? Насколько я понял (судя по vla-AuditInfo), достаточно вывода в комстроке?
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 10:26
#3369
Кулик Алексей aka kpblc
Moderator

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


Я бы поставил LOGFILEMODE, установил LOGFILEPATH, потом в ком.строке выполнил _.-purge, explodeallproxy, removeallproxy, _.audit и прочие вещи, следом - отмена действий. И после этого уже обрабатывать полученный log-файл.
Есть, конечно, другой вариант - проходить по всем соответствующим таблицам и на каждый элемент пытаться выполнить нечто типа:
Код:
[Выделить все]
 (entdel ent)
(if (not (entget ent))
    ;; Примитив удаляется. Делаем что надо в таком случае
 ) ;_ end of if
(entdel ent) ;; восстанавливаем примитив
Но работать будет ооочень долго, я думаю.
__________________

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


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


Добрый день!
Спасибо, что разместили мой вопрос и откликнулись.

"А результат в каком виде нужно получить? Насколько я понял (судя по vla-AuditInfo), достаточно вывода в комстроке?"

"Я бы поставил LOGFILEMODE, установил LOGFILEPATH, потом в ком.строке выполнил _.-purge, explodeallproxy, removeallproxy, _.audit и прочие вещи, следом - отмена действий. И после этого уже обрабатывать полученный log-файл."


В общем-то, по такой схеме у нас организованы три функции проверки.
Создаю каталог, используя вашу функцию создания каталога в
(strcat (vl-string-right-trim "\\" (getenv "APPDATA")) "\\LispRu\\Datas"), которую когда-то откуда-то у вас скопировала.
Переназначаю LOGFILEPATH, устанавливаю LOGFILEMODE, затем анализирую закрытый уже log файл, часть информации (коротко)
вывожу на экран и в текстовое окно Автокада. Потом, эти функции проверки удаляют проанализированные log
файлы из каталога (...\\LispRu\\Datas). Конечно, результаты всех проверок в сокращенном варианте можно записать в один
текстовый файл и отправить разработчику dwg. Это не вопрос, просто, пока не обязательно.
Проверка на наличие прокси-объектов пока не требуется, проверяем и настоятельно рекомендуем удалять только, так называемые,
AcDgnLS прокси-объекты, эта проверка есть и программы удаления тоже.

Моя проблема в том, что НЕ хочется мне делать _.purge, а следом - отмена действий, даже, если закрывать потом файлы без сохранения.
Пока не знаю как поступить.
LcH вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 17:18
#3371
frostmourn


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


Можно и не завершать _.purge. Попробуйте так:
Код:
[Выделить все]
 
(foreach x
		'("_b" "_d" "_la" "_lt" "_ma" "_mu" "_p" "_sh" "_st" "_m" "_t" "_v" "_r"
		; "_de" "_g" "_se" ; на всякий случай убрал опции, недоступные в 10-м акаде
		; "_z" "_e" "_o" ; и которые не спрашивают подтверждения
		)
	(setvar 'cmdecho 0)
	(vl-cmdf "_.-purge" x "*" "_y")
	(setvar 'cmdecho 1)
	(while (= (getvar 'cmdactive) 1) (vl-cmdf "_n"))
)
По некотором размышлении даже и так должно подойти. Наверное.
Код:
[Выделить все]
 
(vl-cmdf "_.-purge" "_a" "*" "_y")
(while (= (getvar 'cmdactive) 1) (vl-cmdf "_n"))

Последний раз редактировалось frostmourn, 27.07.2017 в 15:53.
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 17:41
#3372
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


Цитата:
Сообщение от frostmourn Посмотреть сообщение
Попробуйте так:
не нужно насиловать SyntaxHighlighter version 2.1.382 (June 24 2010)
и у ж тем более не рекомендуется насиловать автокад повторяющимися тедодвижениями
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 17:44
#3373
skkkk

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


LcH, во-первых, я бы не советовал учиться лиспу на таком примере. Сложноватым будет для новичка, полагаю. Может, попросить модераторов перенести этот вопрос в отдельную тему, тем более, что он вполне на это тянет.
Во-вторых, хотелось бы узнать, почему не подойдет вариант Алексея (_.-purge с последующим откатом)? Я почти уверен, что любая функция по такой проверке будет работать намного дольше. Не говоря уже о трудности в написании подобной функции. В самом деле, представьте, это же надо пробежаться по таблице блоков (в "базе чертежа"), проверить каждый на наличие в чертеже. Для полной уверенности надо убедиться, что этот блок не входит в какой-либо другой блок. То же самое придется провернуть и с таблицей слоев, типов линий, не забыв залезть в каждый блок и проверить их наличие там. Не говоря уже о проверке текстовых и прочих стилей. В общем, непростая это будет функция, весьма хлопотная в реализации, да еще и тормознутей некуда. Оно надо?
Встань передо мной такая задача, я бы пошел по пути, указанному Алексеем. В библиотеке DOSLIB есть функция, возвращающая содержимое командной строки. Я бы делал пурж (похоже, что для надежности надо все же три раза его сделать), а затем получал содержимое комстроки, "выцеплял" бы из него строки, начинающиеся на "Удаление..." и делал в них замену "Удаление" на "Неиспользуемый", что бы получился список строк вроде:
Код:
[Выделить все]
(list
	"Неиспользуемый блок \"_None\""
	"Неиспользуемый слой \"Слой1\""
	"Неиспользуемый размерный стиль \"Standard\""
)
Правда, замечал не раз, что иногда после хорошенькой чистки нельзя откатить изменения, в комстроке маячит "нечего отменять" и привет. Почему так бывает - ума не приложу. Помимо пуржа в очистке у меня еще сброс списка масштабов и аудит.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 17:50
#3374
Lavrentiy


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


Добрый день. Подскажите, пожалуйста, как можно выделить набор, который получился в результате копирования другого набора? Если по шагам: я выделил набор объектов командой "ssget", затем откопировал их с помощью команды "command "_copy"". Вот, можно-ли выделить программно этот новый набор?

Последний раз редактировалось Lavrentiy, 26.07.2017 в 17:57.
Lavrentiy вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 19:25
#3375
Сергей812


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


Цитата:
Сообщение от Lavrentiy Посмотреть сообщение
Добрый день. Подскажите, пожалуйста, как можно выделить набор, который получился в результате копирования другого набора? Если по шагам: я выделил набор объектов командой "ssget", затем откопировал их с помощью команды "command "_copy"". Вот, можно-ли выделить программно этот новый набор?
думаю, что надо отлавливать события добавления объекта в БД чертежа и собирать в набор/коллекцию/список. А перед копированием сбрасывать этот набор или какой-то флаг работы/блокировки. Тогда это будет отслеживать и копирование с других чертежей тоже.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 19:38
#3376
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Lavrentiy Посмотреть сообщение
Вот, можно-ли выделить программно этот новый набор?
Теоретически можно. КОмандный реактор, перед выполнением запоминаем последний примитив, после выполнения - через entnext получаем все, что было скопировано. Кстати, на форуме решения подобных задач были (если не ошибаюсь, львиную долю разрабатывал VVA).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 19:52
#3377
Сергей812


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


Пример, как решается схожая задача - получить идентификаторы всех объектов (ObjectId), вставленных через буфер обмена - от Александра Ривилиса на Net.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.07.2017, 23:45
#3378
macros55


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


привет друзьям, я нужна такая lisp, могли бы вы помочь мне, пожалуйстанапример drawing
macros55 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2017, 21:43
#3379
gnuvse


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


Здравствуйте.

Я новичок.

Специалисты, подскажите пожалуйста.

Как из однострочного текста получить содержимое при помощи программы на autolisp?

Т.е. есть текст "100", как мне в переменную получить этот текст.

Спасибо за помощь и ваше время.

PS. Я мог неправильно делать запрос в поиске, но ответ на свой вопрос я не нашел, прошу простить.
gnuvse вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.07.2017, 22:38
#3380
skkkk

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


Код:
[Выделить все]
(vl-load-com)
(setq txt (vla-get-TextString (vlax-ename->vla-object (car (entsel "\nУкажите текст: ")))))
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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


Размещение рекламы