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

Вернуться   Форум 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.
Просмотров: 2048259
 
Непрочитано 27.01.2015, 08:18
1 | #2401
skkkk


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


Цитата:
Сообщение от mkung Посмотреть сообщение
не пойму как мне набор из SSGET превратить в "vla-SelectionSet"...
А почему бы сразу не создавать этот набор методами ActiveX? Но если уж так хочется "превращений" (может, там у ssget фильтр какой-нибудь незаурядный по плану) , то, наверное, как-то так:
Код:
[Выделить все]
 (setq ss (ssget))
(sssetfirst nil ss)
(setq vla-ss (vla-get-PickfirstSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))


Цитата:
Сообщение от Dima_90 Посмотреть сообщение
Прошу помощи в формировании размеров видового экрана.
Совершенно не понимаю, что означает эта строка
Цитата:
Сообщение от Dima_90 Посмотреть сообщение
((2 (0.42 0.0) (1.0 1.0)) (3 (0.0 0.0) (0.42 1.0)))
Либо туговато соображаю с утра, либо одно из двух. Что за цифры 2 и 3? Что за координаты? Координаты вершин четырехугольника неправильной формы? Видовой экран должен быть непрямоугольным? Трапецевидным? Тогда в него нужно "превращать" полилинию, если я ничего не путаю. Можно приложить файл dwg с изображением желаемого эффекта?
Offtop: Одни Гарри Поттеры, блин
skkkk вне форума  
 
Непрочитано 27.01.2015, 08:43
#2402
Dima_90


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


skkkk
Я имел в виду следующее.
В автокаде можно разделять экран на несколько видовых экранов (два вертикально, 3 вертикально, горизонтально) в модели. Но чтобы мне удобно поделить модель на 2 видовых экрана мне приходиться создавать их большое количество а потом пользуясь инструментом "объединить видовые экраны" создавать 2 видовых экрана со смещенным центром. Рассматривая учебник по написанию программного кода я обнаружил функцию (Vports) которая может показать значения координат видовых окон. А вот самому задать эти значения у меня не получается





Последний раз редактировалось Dima_90, 27.01.2015 в 08:52.
Dima_90 вне форума  
 
Непрочитано 27.01.2015, 10:20
#2403
ShaggyDoc

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


Цитата:
В автокаде можно разделять экран на несколько видовых экранов (два вертикально, 3 вертикально, горизонтально) в модели. Но чтобы мне удобно поделить модель на 2 видовых экрана мне приходиться создавать их большое количество а потом пользуясь инструментом "объединить видовые экраны" создавать 2 видовых экрана со смещенным центром.
Видовые экраны в пространстве модели - анахронизм. Когда-то (когда не было Layout) они были очень нужны - чтобы быстро переходить между видами на разные участки модели. При этом количество и расположение таких ВЭ было ограничено.

Но в этом уже давно нет нужды. Если множество Layout с любыми плавающими ВЭ. И нет никакой необходимости "создавать большое количество", а потом "объединять".

Подумайте об организации своей работы, а не об обработке списков.
ShaggyDoc вне форума  
 
Непрочитано 27.01.2015, 11:13
#2404
Dima_90


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


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

Может быть я не совсем понятно написал что же я хочу сделать, поэтому распишу подробно мой случай.
У меня стоит на рабочем месте 2 монитора разной диагонали и разрешения. Я при работе растягиваю окно Автокада на 2 монитора и делю пространство модели на пополам по вертикале. В моем случае получается что рабочая область находиться на одном мониторе, а вспомогательная область на другом.
НО т.к разрешение мониторов разное, то получается что автокад при делении на пополам (по пикселям) модель, не по полам делит изображения на два монитора (граница деления проходит на мониторе с большим разрешением).
Чтобы решить данную проблему я делю пространство модели на очень большое количество по вертикали, потом эти видовые экраны модели объединяю таким образом, что полоса деления модели по "полам" проходит между двумя физическими мониторами. Затем я сохраняю этот новый видовой экран модели и могу в данном файле в пару кликов его подгружать. Но в другой файл я не нашел как его импортировать. Из-за этого приходиться в каждом новом файле его создавать заново утомительным способом.
И вот недавно я нашел функцию Vports, которая если взять в скобочки, то даст размеры видовых экранов модели. Вот теперь я хочу создать несколько строчек программного кода который у функции (Vports) поменяет данные на те, которые я укажу. Потом это можно будет завязать на кнопку и делить экран под мои мониторы за один клик.

Моя проблема состоит в том, что у меня не получается в функцию Vports записать список моей информации.
Dima_90 вне форума  
 
Непрочитано 27.01.2015, 11:37
#2405
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Спасибо - работает.
Цитата:
Сообщение от skkkk Посмотреть сообщение
А почему бы сразу не создавать этот набор методами ActiveX?
Да я бы с радостью. И нашел уже vla-select, но что-то пока с safearray не въезжаю...
Задача вобщем-то примитивная - создать наборы объектов по существующим слоям и записать в отдельные файлы DWG.

Последний раз редактировалось mkung, 27.01.2015 в 14:42.
mkung вне форума  
 
Непрочитано 27.01.2015, 11:59
#2406
Сергей812


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


Цитата:
Сообщение от Dima_90 Посмотреть сообщение
Затем я сохраняю этот новый видовой экран модели и могу в данном файле в пару кликов его подгружать. Но в другой файл я не нашел как его импортировать. Из-за этого приходиться в каждом новом файле его создавать заново утомительным способом.
А разве нельзя запись в макрос (рекордер операций) последовательность действий и вызывать в новом файле?
Сергей812 вне форума  
 
Непрочитано 27.01.2015, 13:34
#2407
Dima_90


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


Сергей812
Записать макрос когда можно и мышкой и клавиатурой и лентой пользоваться не получается, т.к при повторении в новом файле макрос сбивается. Возможно получиться если вручную все прописывать, но это хлопотно и не универсально (на других ПК с другими мониторами его надо будет переписывать). А вот если как то получаться в эту функцию (Vports) мои значение задать то это будет намного проще. Может надо через ключи какие то, или переменные посреднические прописать. Подробнее о данной функции, чем в учебнике, страницы которого я выкладывал, информации нигде не нашел.
Dima_90 вне форума  
 
Непрочитано 27.01.2015, 17:01
#2408
skkkk


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


Цитата:
Сообщение от Dima_90 Посмотреть сообщение
можно разделять экран на несколько видовых экранов (два вертикально, 3 вертикально, горизонтально) в модели.
Точно, плохо соображал с утра. Даже не вспомнил о такой возможности.

ShaggyDoc, анахронизм анахронизмом, а до сих пор поддерживаются они еще Автодеском. Тут прочитал, что в 2015-й версии добавили к этим экранам возможность перемещать границы мышью. Об организации работы, конечно, думать надо, и очень основательно, но ведь можно найти и случаи, когда такая модель работы будет очень кстати.

Из спортивного интереса попробовал разобраться с этими VPORT'ами.
При настроенной на четыре видовых экрана модели получил конфигурацию видовых экранов модели:
Код:
[Выделить все]
(entget (tblobjname "VPORT" "*ACTIVE"))
и убрав read-only точечные пары, а также придумав новое имя, попробовал создать табличную запись такой же конфигурации в новом чертеже:
Код:
[Выделить все]
(entmakex '((0 . "VPORT") 
			(100 . "AcDbSymbolTableRecord") 
			(100 . "AcDbViewportTableRecord") 
			(2 . "USER-CONFIG") ; имя конфигурации 
			(70 . 0) 
			(10 0.5 0.0 0.0) 
			(11 1.0 0.5 0.0) 
			(12 2633.82 1499.32 0.0) 
			(13 0.0 0.0 0.0) 
			(14 10.0 10.0 0.0) 
			(15 10.0 10.0 0.0) 
			(16 0.0 0.0 1.0) 
			(17 0.0 0.0 0.0) 
			(40 . 2499.32) 
			(41 . 1.58323) 
			(42 . 50.0) 
			(43 . 0.0) 
			(44 . 0.0) 
			(50 . 0.0) 
			(51 . 0.0) 
			(71 . 0) 
			(72 . 1000) 
			(73 . 1)
			(74 . 3) 
			(75 . 0) 
			(76 . 1) 
			(77 . 0) 
			(78 . 0) 
			(281 . 0) 
			(65 . 1) 
			(110 0.0 0.0 0.0) 
			(111 1.0 0.0 0.0) 
			(112 0.0 1.0 0.0) 
			(79 . 0) 
			(146 . 0.0) 
			(60 . 3) 
			(61 . 5) 
			(292 . 1) 
			(282 . 1) 
			(141 . 0.0) 
			(142 . 0.0) 
			(63 . 250) 
			(421 . 3355443)
		   )
)
Теоретически, должно было бы сработать, но когда в команде _-VPORT пытаюсь восстановить данную конфигурацию ("USER-CONFIG"), то активным становится только правый нижний экран из четырех, причем остальные даже недоступны для активации и показывают лишь черный фон и больше ничего.
И вот что это? Глюк моего Автокада 2011 или еще какие-то точечные пары лишние в списке?

Цитата:
Сообщение от mkung Посмотреть сообщение
что-то пока с safearray не въезжаю...
Терпение и труд все перетрут. Информации полно. Насколько помню, у Полещука прям объекты слоя и выбираются в примерах к методу Select.
skkkk вне форума  
 
Непрочитано 28.01.2015, 02:19
#2409
Dima_90


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


skkkk
Я не силен в программировании, но читать немного умею программные коды. Помню в одном из случаев по каким то причинам так же не присваивались значения к функции, и в этом случае вводили переменную, прописывали что там могут быть целые числа, потом присваивали к переменной список точечных пар через оператор List, а уже потом получалось значения этой переменной применить к функции. Может в этом случае так же надо. Сам я пробовал подобное написать, но что то ничего не вышло.
Dima_90 вне форума  
 
Непрочитано 28.01.2015, 20:09
#2410
Forsy


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


День добрый граждане, большая просьба помочь с написанием макроса.Изо дня в день выполняю одни и те же действия,захотелось упростить себе работу.Итак на входе имеем файл,в котором имеется контур объекта,выполненный замкнутый полилинией,на вершинах которой расположены блоки,все блоки имеют одно имя,по сути одинаковые.Нужно сделать следующее: полилинию сделать красным цветом(что не сложно) а на вершинах проставить черные точки,ну или окружности заполненные черным цветом.Что делаю я-захожу в редактор блоков одного из блоков, заштриховываю черным цветом,сохраняю-в итоге все блоки черного цвета.
Макрос пока получается такого вида ^C^C-блокред bl_119
_hpname;SOLID;_bhatch
Но дальше пока ничего неполучается(.
Forsy вне форума  
 
Непрочитано 29.01.2015, 12:05
#2411
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


В вершинах полилинии расставляет штриховки солидом черного цвета на текущем слое непрерывным типом линии с весом 0.0
Выделяешь нужную полилинию, вызываешь макрос.
В '(40 . 1.3) вместо 1.3 поставь нужный тебе радиус.
Код:
[Выделить все]
 
(mapcar (function
          (lambda (e00)
            (and (eq 10 (car e00))
                 (entmake (append '((0 . "HATCH")
                                    (100 . "AcDbEntity")
                                    (62 . 250)
                                    (6 . "Continuous")
                                    (370 . 0)
                                    (100 . "AcDbHatch")
                                    (10 0.0 0.0 0.0)
                                    (210 0.0 0.0 1.0)
                                    (2 . "SOLID")
                                    (70 . 1)
                                    (71 . 0)
                                    (91 . 1)
                                    (92 . 1)
                                    (93 . 1)
                                    (72 . 2))
                                  (list (append e00 '(0.0)) '(40 . 1.3) '(50 . 0.0) (cons 51 (* 2 pi)))
                                  '((73 . 1)
                                    (97 . 0)
                                    (75 . 0)
                                    (76 . 1)
                                    (98 . 1)
                                    (10 0.0 0.0 0.0)
                                    (450 . 0)
                                    (451 . 0)
                                    (460 . 0.0)
                                    (461 . 0.0)
                                    (452 . 0)
                                    (462 . 1.0)
                                    (453 . 2)
                                    (463 . 0.0)
                                    (421 . 255)
                                    (463 . 1.0)
                                    (470 . "LINEAR")))))))
        ((eval (function (lambda (e00)
                           (if e00
                             (entmod (append (entget (ssname e00 0)) '((62 . 1)))))))) (cadr (ssgetfirst))))
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 29.01.2015, 13:44
#2412
Forsy


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


Цитата:
Сообщение от ciril Посмотреть сообщение
В вершинах полилинии расставляет штриховки солидом черного цвета на текущем слое непрерывным типом линии с весом 0.0
Выделяешь нужную полилинию, вызываешь макрос.
В '(40 . 1.3) вместо 1.3 поставь нужный тебе радиус.
Код:
[Выделить все]
 
(mapcar (function
          (lambda (e00)
            (and (eq 10 (car e00))
                 (entmake (append '((0 . "HATCH")
                                    (100 . "AcDbEntity")
                                    (62 . 250)
                                    (6 . "Continuous")
                                    (370 . 0)
                                    (100 . "AcDbHatch")
                                    (10 0.0 0.0 0.0)
                                    (210 0.0 0.0 1.0)
                                    (2 . "SOLID")
                                    (70 . 1)
                                    (71 . 0)
                                    (91 . 1)
                                    (92 . 1)
                                    (93 . 1)
                                    (72 . 2))
                                  (list (append e00 '(0.0)) '(40 . 1.3) '(50 . 0.0) (cons 51 (* 2 pi)))
                                  '((73 . 1)
                                    (97 . 0)
                                    (75 . 0)
                                    (76 . 1)
                                    (98 . 1)
                                    (10 0.0 0.0 0.0)
                                    (450 . 0)
                                    (451 . 0)
                                    (460 . 0.0)
                                    (461 . 0.0)
                                    (452 . 0)
                                    (462 . 1.0)
                                    (453 . 2)
                                    (463 . 0.0)
                                    (421 . 255)
                                    (463 . 1.0)
                                    (470 . "LINEAR")))))))
        ((eval (function (lambda (e00)
                           (if e00
                             (entmod (append (entget (ssname e00 0)) '((62 . 1)))))))) (cadr (ssgetfirst))))
Огромное спасибо за отклик,но автокад выдает следующее "ошибка: синтаксическая ошибка"P.S. акад 2009
Forsy вне форума  
 
Непрочитано 29.01.2015, 13:58
#2413
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Попробуй так:
Код:
[Выделить все]
 
(mapcar (function
            (lambda (e00)
                (and (eq 10 (car e00)) (entmake (append '((0 . "CIRCLE") (40 . 1.3)) (list (append e00 '(0.0))))))))
        ((eval (function (lambda (e00)
                             (if e00
                                 (entmod (append (entget (ssname e00 0)) '((62 . 1))))))))
            (cadr (ssgetfirst))))
Чертит окружности, если и с этим вариантом будет ошибка, то дело не в версии.
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 04.02.2015, 14:57
#2414
Eugene.ne.Eugene


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


добрый день! понадобилось мне из region сделать pline. А так как этих регионо у меня много (порядка 4000) - обычные способы, типа взорвать, или boundary создать - не вариант. Порывшись в интернете на зарубежном форуме нашел lisp для этого дела, вот только беда - он не поддерживает мультивыбора, т.е. опять же, надо все регионы выбирать по очереди. Помогите, пож, его переделать, если это вообще возможно

Код:
[Выделить все]
size=2>;;;===========================================

(defun c:reg2poly ( / ename old_cmdecho)
  
(if (setq ename (car (entsel)))
    (if (= (cdr (assoc 0 
(entget ename))) "REGION")
      
(progn
        (setq old_cmdecho (getvar 
'cmdecho))
        (setvar 'cmdecho 
0)
        (command "_.undo" 
"_begin")
        (command "_.explode" 
ename)
        (command "_.pedit" "_m" 
(ssget "_p") "" "_y" "_j" 0.0 "")
        
(command "_.undo" "_end")
        (setvar 
'cmdecho old_cmdecho)
      
)
      (prompt "\nThe selected object is not a 
region.")
    )
    (prompt 
"\nNothing selected.")
  )
  (princ)
)



size=2>;;;===========================================
Eugene.ne.Eugene вне форума  
 
Непрочитано 04.02.2015, 15:12
#2415
Сергей812


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


Найти пример перебора выделенных элементов (набора) на лиспе и скрестите)

Код:
[Выделить все]
 (defun c:reg2poly ( / ename old_cmdecho)
превратиться в
Код:
[Выделить все]
 (defun reg2poly ( ename /  old_cmdecho)
и убрать строчку
Код:
[Выделить все]
 (if (setq ename (car (entsel)))
и получаете функцию для обработки переданного в аргументе ename примитива, если он регион ( и сам лисп рабочий). Далее вызываете эту функции в команде, перебирающей выбранные примитивы.
Сергей812 вне форума  
 
Непрочитано 04.02.2015, 15:49
#2416
Eugene.ne.Eugene


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
превратиться в
в исходном коде, который я нашел было без "с:" но без него код не сработал. я добавил "с:" и хоть как то заработало
Если сделать как вы говорите снова перестает работать, пишет что не знает такой команды как reg2poly
Eugene.ne.Eugene вне форума  
 
Непрочитано 04.02.2015, 16:09
#2417
Кулик Алексей aka kpblc
Moderator

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


Ясно, разница между командами и функциями неочевидна, хотя VVA ее отлично описал: http://dwg.ru/pub/9
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.02.2015, 16:51
#2418
Сергей812


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


Offtop: Я лишь написал, как превратить команду в функцию с минимальными переделками, чтобы ее использовать в дальнейшем.
Сергей812 вне форума  
 
Непрочитано 09.02.2015, 13:18
#2419
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Подскажите, пожалуйста, как программно к файлу конфигурации печати ( например DWG To PDF.pc3) подключить файл описания принтера (например DWG To PDF New.pmp)?
Заранее благодарен.
mkung вне форума  
 
Непрочитано 09.02.2015, 15:24 Восстановление системных переменных
#2420
trushev


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


В функциях Кулик Алексея aka kpblc из темы "Проверка файла и dimpost" с autolisp.ru

(defun _lispru-error-sysvar-save-by-list (lst / res)
* Сохранение состояния системных переменных
(defun _lispru-error-sysvar-restore-by-list (lst)
* Восстановление состояния системных переменных.

не понял как они работают при сбойном завершении программы. Есть ли решение проблемы восстановления переменных в этом случае?
trushev вне форума  
Ответ
Вернуться   Форум 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