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

Вернуться   Форум 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.
Просмотров: 1972296
 
Непрочитано 23.12.2013, 18:01
#2081
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(rtos (* (getdist) (getvar "dimscale")) 2 1)
Алексей, спасибо! Это работает - я получаю результат в кавычках. Но моя ошибка была как оказалось в другом: я перепутал умножение на деление, от этого получалось большое число, и автокад автоматически представлял его в экспоненциальном представлении.
Спасибо за ответ!
baaba вне форума  
 
Непрочитано 30.01.2014, 14:33
#2082
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Всем привет!
Добрые гуру лиспа, а просветите пожалуйста чайника, какими средствами достичь ускорения работы лиспа в автокаде?

Поясню - есть лисп, который:
1. в топографических планах ищет замкнутые горизонтали;
2. просчитывает точки вставки бергштрихов (полилинии, указывающие направление уклона рельефа);
3. создает из триангуляционной модели рельефа (в виде 3dFace) список с координатами и высотами вершин каждого треугольника.
4. ищет по текущим координатам точки вставки треугольник, которому эта точка принадлежит, и сравнивает высоты (находит уклон рельефа);
5. вставляет в точку вставки блок, разворачивает его и взрывает

Треугольников в чертеже может быть десятки тысяч, соответственно список тоже ооочень длинный. Количество анализируемых точек вставки - сотни.
Из команд автокада используется обращение к layer и insert, порядка 20 переменных.

Смущает скорость выполнения. Autocad Civil 2013, порядка 9000 треугольников 3D Face, 330 точек вставки - формирование списка - порядка 10 секунд, вставка блоков - около 10 минут.
Если треугольников уже десятки тысяч, то время возрастает до часа-полутора. При этом та же программа начисто подвешивает Land 2006 и из ступора он уже не выходит.

Как оптимизировать код, чтобы свести время к минимуму?
mankurt вне форума  
 
Непрочитано 30.01.2014, 15:04
1 | #2083
ShaggyDoc

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


Цитата:
Как оптимизировать код, чтобы свести время к минимуму?
Для этого надо смотреть код - как именно "просчитывает", "ищет", формирует и обрабатывает списки на алгоритмическом уровне.

И однозначно тормоз здесь
Цитата:
Из команд автокада используется обращение к layer и insert
Функции command и vl-cmdf работают во много раз медленнее, чем объектные методы. При каждом вызове анализируются все опции и только потом управление передается внутренним механизмам AutoCAD.
ShaggyDoc вне форума  
 
Непрочитано 30.01.2014, 20:40
#2084
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от mankurt Посмотреть сообщение
какими средствами достичь ускорения работы лиспа в автокаде?
давным давно я тестировал автолисп на скорость.
Сделал программку рисующую кривую Коха.. Кривая Коха это такая хитрая фигурка похожая на очень кривой штакетник которая может содержать от 4 до бесконечности линий.

Уж и не помню точно, программа отрисовывала больше миллиона линий, а может даже больше десятка миллионов. Фрактал растет в какой-то быстро возрастающей не линейной прогрессии названия которой я уже и не помню. В общем за несколько циклов количество линий во фрактале вырастает от 4 до миллиардов. Возможно даже моя программа отрисовывала и миллиард линий. Суть не в этом.

Рисовалась она тремя способами.

1 При помощи command. Я успел попить чайку, а фрактал продолжал расти когда я его уже выпил и сходил покурить. Что-то около получаса заняло.
2. При помощи entmake дело пошло быстрее, но не намного.
3. При помощи объектной модели (vla-функций) я лицезрел конечный результат не вылезая из за компьютера, не пил чай и не курил. А потом задал такое количество циклов роста фрактала (вроде даже попросил нарисовать бесконечный фрактал), что через 5 минут получил сообщение о недостатке памяти. В командную строку вылезло какое-то сообщение об ошибке номер 000005 c буквой "С" то-ли спереди то-ли сзади.

Вывод: хочешь скорости? Выбирай объектную модель.
mmax вне форума  
 
Непрочитано 30.01.2014, 22:29
1 | #2085
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Основные тормоза не в методах рисования (хотя конечно командными пользоваться не стоит не только из-за соображений скорости), а в алгоритмах - как бы Вы не рисовали примитивы скорость измениться линейно (ну допустим в 10 раз) - что не так-то страшно (секунда или 10 разница конечно есть но не критичная - в крайнем случае можно "железом" нивилировать), а вот если беда с математикой типа идет "ненужная" обработка каждого к каждому, без оптимизации, хеширования и пр, то как быстро не выполняй итерацию - их количество, при неправильном алгоритме зачастую растет в геометрической прогрессии и тогда никакой "линейный" разгон не поможет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.01.2014, 23:13
#2086
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


В вопросе скорости можно вообще не париться. Я вот тут прикинул. Если на формате а1 нарисовать около 1500 линий толщиной 0.5мм, то мы получим черный прямоугольник. Кто нибудь может похвастаться чертежом с более 2000 примитивов?
Автолисп с легкостью обработает десятки тысяч данных самым неоптимизированным в мире кодом. Кто нибудь может похвастаться чертежом с сотнями тысяч примитивов? На современной технике автолисп и сотнями тысяч не подавится. У кого мильён линий в чертеже?....
mmax вне форума  
 
Непрочитано 31.01.2014, 02:05
#2087
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Ну тогда покажите мне код который прокладывает самый кротчайший маршрут проходящий хотя-бы через 100 произвольных точек.
з.ы. - всего-то 100 отрезков нарисовать...
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 31.01.2014 в 02:11.
Дима_ вне форума  
 
Непрочитано 31.01.2014, 08:10
#2088
ShaggyDoc

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


Цитата:
В вопросе скорости можно вообще не париться
Во многих случаях да. Особенно во всяких интерактивных "рисованиях" - типа нарисовать балку. Но рано или поздно возникают задачи с очень большими вычислениями - когда счет времени на сутки идет. Вот здесь решающую роль играют алгоритмы и методы рисования. Кстати, и об утечках памяти надо заботиться, иначе постепенно начинает подключаться дисковая память. Да заодно не забывать и про ловушки ошибок.
ShaggyDoc вне форума  
 
Непрочитано 31.01.2014, 12:53
#2089
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Спасибо! Попробую поизучать и переписать программу объектными методами, а потом выложу код, может укажет кто на несовершенства алгоритма...
mankurt вне форума  
 
Непрочитано 31.01.2014, 13:27
#2090
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mmax Посмотреть сообщение
хочешь скорости? Выбирай объектную модель.
Необязательно: http://autolisp.ru/2009/09/22/programming-style/ + http://autolisp.ru/2009/09/20/execution-speed-check/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.01.2014, 14:18
#2091
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Добрый день! Подскажите пожалуйста чайнику!
Вопрос касается расширенных данных.
Почему этот код работает
Код:
[Выделить все]
 (setq layer0 (entget (tblobjname "LAYER" "Слой1")))
                  (setq x_date (list (list -3 (list "AcAecLayerStandard" (cons 1000 "") (cons 1000 "слой1")) (list "AcCmTransparency" (cons 1071 0)))))
	    (setq layer0 (append layer0 x_date))
	    (entmod layer0)
а вот этот не работает
Код:
[Выделить все]
 (setq layer0 (entget (tblobjname "LAYER" "Слой1") '("*")))
                  (setq x_date (list (list -3 (list "AcAecLayerStandard" (cons 1000 "") (cons 1000 "слой1")) (list "AcCmTransparency" (cons 1071 0)))))
	    (setq layer0 (append layer0 x_date))
	    (entmod layer0)
почему в последнем случае идет объединение dxf кода -3, а в первом замена?
Заранее спасибо!
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 31.01.2014, 14:39
#2092
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Почему может не работать подобная конструкция? По замыслу в переменной Obj должны записаться 3d face в слое Триангуляция, выбранные в области, ограниченной окном (координаты считаются).
Error пишет: ActiveX Server returned the error: unknown name: Select; error:
An error has occurred inside the *error* functionAutoCAD variable setting
rejected: "osmode" nil

Код:
[Выделить все]
 
(defun C:kak ( / )
   (begin_activex)
   (setq TrLayer "ИИ_ТРИАНГУЛЯЦИЯ_025")
   (setq coord_point (getpoint "Выберите точку"))
     (setq coord_point1 (polar coord_point (/ (* 3 pi) 4) 30)
	   coord_point2 (polar coord_point (/ (* 7 pi) 4) 30)	   
	   );

     (setq coord_point1
	    (vlax-make-variant
	       (vlax-safearray-fill ; заполнение созданного безопасного массива
                    (vlax-make-safearray vlax-vbString '(0 . 2)  ; создание безопасного массива с 3-мя элементами
		    )
		     coord_point1
	       )
	    )
     );setq

      (setq coord_point2
	    (vlax-make-variant
	       (vlax-safearray-fill ; заполнение созданного безопасного массива
                    (vlax-make-safearray vlax-vbString '(0 . 2)  ; создание безопасного массива с 3-мя элементами
		    )
		     coord_point2
	       )
	    )
     );setq
     
     (setq Obj (vla-select model_space acSelectionSetWindow coord_point1 coord_point2
                (vlax-safearray-fill
		    (vlax-make-safearray vlax-vbInteger '(0 . 1)
                     ) '(0 8)
		 )
                (vlax-safearray-fill
		    (vlax-make-safearray vlax-vbVariant '(0 . 1)
                     ) '("3DFACE" "ИИ_ТРИАНГУЛЯЦИЯ_025")
		 )
       
              )
      )
  
);defun


;****************************************************************
; подготовка к работе с ActiveX
;****************************************************************
(defun begin_activex ( / )
  (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 begin_activex
mankurt вне форума  
 
Непрочитано 31.01.2014, 15:04
1 | #2093
Кулик Алексей aka kpblc
Moderator

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


А что, в coord_point1 на момент вызова (setq coord_point1 (vlax-make-safearray ... хранятся строки? Это раз.
Второе. То же самое - с coord_point2
Дальше даже не стал смотреть. Советую пройтись по шагам (часть пояснений есть здесь: http://autolisp.ru/2009/09/12/vlide-misc-02/ ) и посмотреть, на каком месте спотык.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.01.2014, 18:10
#2094
mankurt

геодезист
 
Регистрация: 25.10.2011
Москва
Сообщений: 45


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что, в coord_point1 на момент вызова (setq coord_point1 (vlax-make-safearray ... хранятся строки? Это раз.
Второе. То же самое - с coord_point2
Дальше даже не стал смотреть. Советую пройтись по шагам (часть пояснений есть здесь: http://autolisp.ru/2009/09/12/vlide-misc-02/ ) и посмотреть, на каком месте спотык.
Ок, вставил для coord_point1 и coord_point2 тип vlax-vbDouble, в результате формируются два варианта с типом safe-array, содержащие координаты точек.
Теперь прога стопорится на (выделено жирным):

Код:
[Выделить все]
(setq Obj (vla-select model_space acSelectionSetWindow coord_point1 coord_point2
                (vlax-safearray-fill
		    (vlax-make-safearray vlax-vbInteger '(0 . 1)
                     ) '(0 8)
		 )
                (vlax-safearray-fill
		    (vlax-make-safearray vlax-vbVariant '(0 . 1)
                     ) '("3DFACE" "ИИ_ТРИАНГУЛЯЦИЯ_025")
		 )
       
              )
      )[/lisp]
Запутался, если честно, с этим типами.. Из описания vla-select способом acSelectionSetWindow:
- коды фильтров - безопасный массив целых чисел в виде варианта - с этим понятно, задаем тип vbInteger
- значения фильтров - безопасный массив типа вариант в виде варианта. - то есть надо присваивать тип vlax-vbvariant, так?
Но '("3DFACE" "ИИ_ТРИАНГУЛЯЦИЯ_025") в виде варианта не воспринимается. То есть надо еще сделать из этого списка вариант? На каком этапе это надо делать, внутри самой vlax-make-safearray?
mankurt вне форума  
 
Непрочитано 31.01.2014, 20:01
#2095
Кулик Алексей aka kpblc
Moderator

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


http://www.afralisp.net/visual-lisp/...ction-sets.php
поиск - великая штука!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.02.2014, 19:29
#2096
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от mankurt Посмотреть сообщение
Почему может не работать подобная конструкция?
Перемудрил вот и не работает, помимо замечаний kpblcа неправильно организована функция *error*, в которой системной переменной osmode присваивается значение не инициализированной переменной.
gomer вне форума  
 
Непрочитано 10.02.2014, 13:04
#2097
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Решил попробовать себя в Lisp и накатать программку которая давно назревала в наших проектных массах. По большей части изобретение велосипеда, но я для учебных целей. Итак мне нужно рисовать рамки с половиной бокового штампа в пространстве модели и автоматом создавать видовой экран в пространстве листа для него. Все это вешаю на несколько кнопок: +1 лист, +5 листов, -1 лист - 5 листов. Листы всегда формата А3. Вновь создаваемые листы всегда на строго отведенном месте в пространстве модели начиная от координаты 0.0 вниз по 5 листов в ряд. Создавать листы из блоков думаю не стоит... потому как всегда найдутся те кто захочет удалить кнопкой Del, расчленить блок и т.д. А для чертежа нужен независимый счетчик листов (возможно с их описанием) для того чтобы добавить/удалить лист. И тут я подумал про простую группировку объектов (group). Удалить получится только все объекты входящие в группу, а разгруппировать уверен не сможет никто кто у нас работает, в силу того, что даже не знает о такой фишке как группировка.
Хотелось бы комментариев специалистов на уровне постановки задачи, чтоб не биться в стену за зря
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 10.02.2014, 14:30
#2098
Кулик Алексей aka kpblc
Moderator

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


Ctrl+H (насколько я помню) - и удаление объекта из группы выполняется легко и непринужденно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.02.2014, 15:07
#2099
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Алексей, я же написал что уверен, что у нас не додумаются Народ у нас настолько"неграмотен" в AutoCAD, что я уже просто молчу. Уверен что из 60 человек про группировку слышало максимум 3 человека. Более 10 лет весь отдел работает только в пространстве модели и эта программка будет первым шагом к переходу к пространству листа.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 10.02.2014, 15:10
#2100
Кулик Алексей aka kpblc
Moderator

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


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