|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
Алексей, спасибо! Это работает - я получаю результат в кавычках. Но моя ошибка была как оказалось в другом: я перепутал умножение на деление, от этого получалось большое число, и автокад автоматически представлял его в экспоненциальном представлении.
Спасибо за ответ! |
||||
|
||||
геодезист Регистрация: 25.10.2011
Москва
Сообщений: 45
|
Всем привет!
Добрые гуру лиспа, а просветите пожалуйста чайника, какими средствами достичь ускорения работы лиспа в автокаде? Поясню - есть лисп, который: 1. в топографических планах ищет замкнутые горизонтали; 2. просчитывает точки вставки бергштрихов (полилинии, указывающие направление уклона рельефа); 3. создает из триангуляционной модели рельефа (в виде 3dFace) список с координатами и высотами вершин каждого треугольника. 4. ищет по текущим координатам точки вставки треугольник, которому эта точка принадлежит, и сравнивает высоты (находит уклон рельефа); 5. вставляет в точку вставки блок, разворачивает его и взрывает Треугольников в чертеже может быть десятки тысяч, соответственно список тоже ооочень длинный. Количество анализируемых точек вставки - сотни. Из команд автокада используется обращение к layer и insert, порядка 20 переменных. Смущает скорость выполнения. Autocad Civil 2013, порядка 9000 треугольников 3D Face, 330 точек вставки - формирование списка - порядка 10 секунд, вставка блоков - около 10 минут. Если треугольников уже десятки тысяч, то время возрастает до часа-полутора. При этом та же программа начисто подвешивает Land 2006 и из ступора он уже не выходит. Как оптимизировать код, чтобы свести время к минимуму? |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
И однозначно тормоз здесь Цитата:
|
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
давным давно я тестировал автолисп на скорость.
Сделал программку рисующую кривую Коха.. Кривая Коха это такая хитрая фигурка похожая на очень кривой штакетник которая может содержать от 4 до бесконечности линий. Уж и не помню точно, программа отрисовывала больше миллиона линий, а может даже больше десятка миллионов. Фрактал растет в какой-то быстро возрастающей не линейной прогрессии названия которой я уже и не помню. В общем за несколько циклов количество линий во фрактале вырастает от 4 до миллиардов. Возможно даже моя программа отрисовывала и миллиард линий. Суть не в этом. Рисовалась она тремя способами. 1 При помощи command. Я успел попить чайку, а фрактал продолжал расти когда я его уже выпил и сходил покурить. Что-то около получаса заняло. 2. При помощи entmake дело пошло быстрее, но не намного. 3. При помощи объектной модели (vla-функций) я лицезрел конечный результат не вылезая из за компьютера, не пил чай и не курил. А потом задал такое количество циклов роста фрактала (вроде даже попросил нарисовать бесконечный фрактал), что через 5 минут получил сообщение о недостатке памяти. В командную строку вылезло какое-то сообщение об ошибке номер 000005 c буквой "С" то-ли спереди то-ли сзади. Вывод: хочешь скорости? Выбирай объектную модель. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Основные тормоза не в методах рисования (хотя конечно командными пользоваться не стоит не только из-за соображений скорости), а в алгоритмах - как бы Вы не рисовали примитивы скорость измениться линейно (ну допустим в 10 раз) - что не так-то страшно (секунда или 10 разница конечно есть но не критичная - в крайнем случае можно "железом" нивилировать), а вот если беда с математикой типа идет "ненужная" обработка каждого к каждому, без оптимизации, хеширования и пр, то как быстро не выполняй итерацию - их количество, при неправильном алгоритме зачастую растет в геометрической прогрессии и тогда никакой "линейный" разгон не поможет.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
В вопросе скорости можно вообще не париться. Я вот тут прикинул. Если на формате а1 нарисовать около 1500 линий толщиной 0.5мм, то мы получим черный прямоугольник. Кто нибудь может похвастаться чертежом с более 2000 примитивов?
Автолисп с легкостью обработает десятки тысяч данных самым неоптимизированным в мире кодом. Кто нибудь может похвастаться чертежом с сотнями тысяч примитивов? На современной технике автолисп и сотнями тысяч не подавится. У кого мильён линий в чертеже?.... |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Ну тогда покажите мне код который прокладывает самый кротчайший маршрут проходящий хотя-бы через 100 произвольных точек.
з.ы. - всего-то 100 отрезков нарисовать...
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 31.01.2014 в 02:11. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835
|
Необязательно: http://autolisp.ru/2009/09/22/programming-style/ + http://autolisp.ru/2009/09/20/execution-speed-check/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
автоматизация и организация черчения Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135
|
Добрый день! Подскажите пожалуйста чайнику!
Вопрос касается расширенных данных. Почему этот код работает Код:
Код:
Заранее спасибо!
__________________
слесарь САПР |
|||
|
||||
геодезист Регистрация: 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 Код:
|
|||
|
||||
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-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
геодезист Регистрация: 25.10.2011
Москва
Сообщений: 45
|
Цитата:
Теперь прога стопорится на (выделено жирным): Код:
- коды фильтров - безопасный массив целых чисел в виде варианта - с этим понятно, задаем тип vbInteger - значения фильтров - безопасный массив типа вариант в виде варианта. - то есть надо присваивать тип vlax-vbvariant, так? Но '("3DFACE" "ИИ_ТРИАНГУЛЯЦИЯ_025") в виде варианта не воспринимается. То есть надо еще сделать из этого списка вариант? На каком этапе это надо делать, внутри самой vlax-make-safearray? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
|
|||
|
||||
Решил попробовать себя в Lisp и накатать программку которая давно назревала в наших проектных массах. По большей части изобретение велосипеда, но я для учебных целей. Итак мне нужно рисовать рамки с половиной бокового штампа в пространстве модели и автоматом создавать видовой экран в пространстве листа для него. Все это вешаю на несколько кнопок: +1 лист, +5 листов, -1 лист - 5 листов. Листы всегда формата А3. Вновь создаваемые листы всегда на строго отведенном месте в пространстве модели начиная от координаты 0.0 вниз по 5 листов в ряд. Создавать листы из блоков думаю не стоит... потому как всегда найдутся те кто захочет удалить кнопкой Del, расчленить блок и т.д. А для чертежа нужен независимый счетчик листов (возможно с их описанием) для того чтобы добавить/удалить лист. И тут я подумал про простую группировку объектов (group). Удалить получится только все объекты входящие в группу, а разгруппировать уверен не сможет никто кто у нас работает, в силу того, что даже не знает о такой фишке как группировка.
Хотелось бы комментариев специалистов на уровне постановки задачи, чтоб не биться в стену за зря
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835
|
Ctrl+H (насколько я помню) - и удаление объекта из группы выполняется легко и непринужденно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Алексей, я же написал что уверен, что у нас не додумаются Народ у нас настолько"неграмотен" в AutoCAD, что я уже просто молчу. Уверен что из 60 человек про группировку слышало максимум 3 человека. Более 10 лет весь отдел работает только в пространстве модели и эта программка будет первым шагом к переходу к пространству листа.
__________________
Поезд который устал от ржавого здравомыслия рельсов... |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835
|
Блажен кто верует - ему тепло...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |