|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
пытаюсь написать фильтр на LISP (помогите понять в чем ошибка)
Регистрация: 16.11.2010
Сообщений: 89
|
||
Просмотров: 15553
|
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Цитата:
Например: 125.889 или 1.089 2Дима_ Спасибо, буду внимательней =) Подправил эту ошибку, выдаёт: ; ошибка: излишние cdrs в точесной паре на входе Последний раз редактировалось Pontelimon, 12.01.2011 в 16:35. |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Может так
Код:
__________________
cadtools |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
|
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Выделил красным
Код:
__________________
cadtools |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Цитата:
Код:
__________________
cadtools |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Всем спасибо, забыл что можно через запятую просто перечислить ... и не проверял написание т.к. LISP не выдавал ошибку.
Я тут написал написал продолжение своей первой програмки, причем оно даже работает(!). Смысл его в том что она получив набор из первой части начинает его округлять до сотых, я видел тут на форуме есть уже готовые решения с округлением, но я не всё там понимаю, поэтому решил попробовать написать самостоятельно. Вот это произведение: Код:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
После замечаний и советов может получиться
Цитата:
![]()
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Я тут еще прикинул небольшой код, который должен опускать по оси Y некоторые цифры, но я никак не пойму, почему он опускает только 3 цифры ?!
Код: Код:
Последний раз редактировалось Pontelimon, 14.01.2011 в 22:26. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Подозреваю, что дело в выравнивании текста...
http://autolisp.ru/2010/04/06/text-and-attrib-entities/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Тут возникло еще пару вопросов:
Как можно на лиспе вставить блок который находиться у меня на закладке Палитра в точку с координатами 0,0 ? Так же при вставке с палитры он у меня автоматически расчленяться. Сам блок находиться в файле: D:\%CADRootDir%\Палитры\Specificacia.dwg Называется: Профиль В Как можно получить координаты точки вставки блока ? (хочу их использовать в фильтре) |
|||
![]() |
|
||||
Регистрация: 11.10.2010
Сообщений: 979
|
Сначала вставляется файл, содержащий блок (command "_.-insert" FileName) (command)
Потом вставляешь уже сам блок "Профиль В". P.S. На форуме есть тема, название, кажется, "На заметку программистам" - там были какие-то коды. P.P.S. Посмотри настройки инструмента. DXF Reference в руки, 10 группа.
__________________
(/= RegDate StartReadDate) |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Цитата:
1. Когда я подгружаю файл содержащий нужный мне блок, он хочет его вставить на текущий чертеж, можно ли сделать так чтобы он только подгружал из него блоки без запроса вставки ? 2. Я что-то, не понял какого инструмента настройки смотреть ? я хочу чтобы они при вставке разбивались. 3. Можно ли избавиться от спама к командной строке, который сопровождает вставку блока ? |
|||
![]() |
|
||||
Регистрация: 11.10.2010
Сообщений: 979
|
1. Я ж написал самый простой вариант: (command "_.-insert" <FileName>) (command)
2. Настройки инструмента на ToolPalette, который у тебя выполняет вставку блока 3. Можно cmdecho -> 0; nomutt -> 1. Потом вернуть все обратно
__________________
(/= RegDate StartReadDate) |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
|
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Да, так действительно проще, спасибо
![]() Я столкнулся вот с такой проблемой: Есть полилиния (рамка) вот ее DXF: ((-1 . <Имя объекта: 7ec57e30>) (0 . "LWPOLYLINE") (330 . <Имя объекта: 7ef90cf8>) (5 . "C06") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.5) (38 . 0.0) (39 . 0.0) (10 -110.0 -130.0) (40 . 0.5) (41 . 0.5) (42 . 0.0) (10 -110.0 280.0) (40 . 0.5) (41 . 0.5) (42 . 0.0) (10 337.0 280.0) (40 . 0.5) (41 . 0.5) (42 . 0.0) (10 337.0 -130.0) (40 . 0.5) (41 . 0.5) (42 . 0.0) (210 0.0 0.0 1.0)) В ней аж 4 группы с 10-кой, как мне ее опустить по Y на 10 единиц ? |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
без проверки - как-то так:
(entmode (mapcar '(lambda (x) (if (= (car x) 10) (cons 10 (cons (cadr x) (cons (-(caddr x) 10) (cdddr x)))) x)) DXF)) но ихмо - в данном случае "надежней" vla: (vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point '(0 10 0)) (vlax-3d-point '(0 0 0)))
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 25.01.2011 в 17:44. |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Цитата:
DXF не запустился. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
там где выделенно DXF должен быть dxf код полилинии (типа того что вы писали) - как вариант (entget (entlast))
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
И не запустится. Нужно не entmode, а entmod
А так красивее Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
А Вы бы не могли разъяснить поэтапно, как для дурака, как это работает ? =) И если не трудно применительно к такому вот примеру:
Есть полилиния : ((-1 . <Имя объекта: 7e909850>) (0 . "LWPOLYLINE") (330 . <Имя объекта: 7ef90cf8>) (5 . "4B12") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 26.2914 84.5212) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 27.5839 84.5212) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0)) Как мне изменить все ее Х координаты на свои переменные X1 и X2 ? |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
(and ; это альтернатива проверки условия (if) если первый опрератор (setq...) вернет nil то следуящея команда выполняться не будет
(setq DXF (entget(car(entsel "\Выбери полилинию: ")))) ;присваивает значению DXF список dxf кодов выбранного примитива (entmod ;преобразовать примитив (mapcar ;вернуть обработанные следующей функцией все элементы списка (dxf) '(lambda (x);функция принимающая на входе 1 аргумент - ассоциативную пару (список, либо cons-пара где первый элемент является кодом остальной части списка) (if(= (car x) 10);если код пары = 10 (координата) (cons 10 (mapcar '- (cdr x) '(0 -10))); создать ассоативный список с кодом 10 (координата) и координатой меньше начальной по оси X на 0, по оси Y на 10 (ноль, так-же, можно поменять на любое число (в т.ч. и отрицательное) - для изменения координаты Х) x));в противном случае (не код 10) - вернуть полученное значение без изменений DXF ;обрабатываемый список кодов)))
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 27.01.2011 в 13:50. |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Цитата:
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Вариант 2 - рекурсивный - написать самовызывающую функцию последовательно "обходящею список", с дополнительными аргументами (номера, четности и пр.) - несколько иная логика работы - но без проблем будет работать с многовложенными списками и пр. "неожиданостями". p.s. - за активное применение второго метода иногда "сыплется" критика со стороны формучан.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Ну второй вариант мне пока по определению явно не доступен. Поэтому я остановлю свой выбор на 1-ом, вот я немного модифицировал код под свои нужды, предоставленный как пример, VVA.
(entmod (mapcar '(lambda (x) (if(and (= (car x) 10) (= minkoordX (cadr x))) (cons 10 (mapcar '+ (cdr x) '(0.5 0))) x)) dno)) (entmod (mapcar '(lambda (x1) (if(and (= (car x1) 10) (= (+ minkoordX 4) (cadr x1))) (cons 10 (mapcar '- (cdr x1) '(0.5 0))) x1)) dno)) В итоге первым действием все как и было мной задумано отрезок полилинии(слева) укорачивается на 0.5, а вот вторым действием вместо укорачивания почему-то отрезок просто перемещаться налево на 0.5, а если повторить все с первого действия то отрезок начинает просто перемещаться то на 0.5 налево, то направо. Где я ошибся ? |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Это и есть одна из тех многочисленных "неожиданостей" которые всплывают при использовании "простого первого метода" - после entmod dno надо обновить - а то он производит изменения в соответствии с первыми (изначальными) параметрами. Если программа будет чуть посложней - иногда очень не просто не упустить, что сейчас у тебя в переменной.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Ну как тебе сказать, всегда чего-то можно улучшить. Можно последовательные setq в один объеденить - можно append на cons поменять - но это мелочи - надо научится думать "по лисповски" вот тебе пример - скажу сразу, я его накатал только для того чтоб ты "мысль" ухватил - сам бы написал изначально по другому - в этом коде много "лишних" операций, но с моей точки зрения может подвести тебя к "правильной" логике:
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Цитата:
Опять с рекурсией?
__________________
Почему все вдруг становятся умными, когда уже не надо? |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Ну попробуй сам - "прошагивай" по набору - с одним аргументом - (самой мальенькой координатой).
p.s. с практической точки зрения конечно имеет смысл сохранить список из набора, (да и функцию я бы естественно делал получающую список на входе), но если мы рассматриваем эту задачу в отдельности, то это лишняя операция - попробуй "вытягивать нужное" сразу из него (набора). В вышеуказанной функции мы "пробегаем" по списку 7+количество полученных элементов раз (он правда 2 раза уменьшается) - уверяю достаточно 1-го.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 29.01.2011 в 10:56. |
|||
![]() |
|
||||
Попробовал, сократил пару "пробегов", но получилась фигня какая-то
![]() Код:
test1 - функция Pontelimon #41 test2 - функция Дима_ #42 test3 - моя #45 1 полилиния Цитата:
Цитата:
Цитата:
![]()
__________________
Почему все вдруг становятся умными, когда уже не надо? |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
1. По поводу скорости - чем никогда не славился лисп - так это скоростью работы. Он хорош скоростью разработки (если писать на нем в лисп стиле). Почему я приемуществнно (везде где возможно) использую лямбды с рекурсиями - мне это дает широчайшие возможности по корректировке кода - в моей практике (лисп и не только) постоянно корректируется ТЗ - если программа написанна в строго функциональном стиле - переправить ее в 5 раз проще и быстрее чем императивную - функции ни как не зависимы - "подводных камней" совместимости данных нет - написал один раз функцию и забыл - работать будет вн зависимости из какого места (состояния) программы ты ее вызвал.
2. Любую рекурсивную функцию можно "развернуть" в цикл - она станет на 2-5% быстрей, но потерят "изменяемость" (хорошие лисп трансляторы делают это автоматом), но написать с нуля такую-же развернутую функцию вряд-ли получится (разная логика) - хотим мы того или нет - алгоритм в деталях будет разный в зависмости от стиля. 3. Ты сейчас "закрутил" в рекурсию логику итеративной программы - потому и результат "не ахти" (получил худшие качества с обоих методов) - забудь мою (и понтелимоновскую) версию попробуй написать с нуля - не оглядываясь на логику той программы - если уже "совсем не как" - могу "свой" вариант "накалякать" (мне это не сложно) - но если хочешь действительно осознать попробуй все таки сам - подскажу лишь, что все действие делается за 1 прогон. з.ы. выйгрыш в скорости в рекурсивной программе - может быть только из-за более удачной реализации алгоритма (с моей точки зрения это достаточно часто).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Сдаюсь, выкладывай.
ни чего страшного, всему своё время, когда-то я вообще больше года смотрел на описание функций работы со списками(типа mapcar, apply, ...), но так и не понимал, что они делают и как работают, потом почти столько же времени смотрел как их применяют в своих кодах другие, а однажды наконец и я стал ими пользоваться, это оказалось на столько удобно, что я радовался как ребёнок.
__________________
Почему все вдруг становятся умными, когда уже не надо? Последний раз редактировалось Disney, 30.01.2011 в 06:39. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Для "критиков" не читавших предварительные посты повторю:
Цитата:
Код:
p.p.s - глюк оформления кода в 8 строке - нет там певрой ";" - просто <
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 30.01.2011 в 11:59. |
|||
![]() |
|
||||
Ну тут всё просто, логическая функция сравнения < при первом проходе не выдаст ошибку если бы даже оба аргумента были nil, зато нам не придёться проверять все последующие проходы min-value на nil
Теперь вопросы:
Всё очень даже не плохо:
Пока видео делал, Do$ уже любезно ответил, но раз сделал выложу.
__________________
Почему все вдруг становятся умными, когда уже не надо? |
||||
![]() |
|
||||
"Да это то понятно..."
Например вот: Код:
ну и анализ быстродействия, хотя Дима_ уверяет, что это не показатель. Не скомпилированный LSP Код:
Код:
__________________
Почему все вдруг становятся умными, когда уже не надо? Последний раз редактировалось Disney, 31.01.2011 в 07:42. |
||||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
Спасибо за видео, все очень доходчиво объяснено.
Я бы хотел уточнить еще 1 свою функцию(срабатывает 9 раз из 10), хотелось бы добиться 100% работоспособности, есть такой вот код : Код:
А должен он удлинить полилинию налево по оси Х на 0.5 |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Цитата:
Код:
__________________
cadtools |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Посмотрел файл. Дело вот в чем, при проверке
Код:
Нужно сравнивать так Код:
__________________
cadtools |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Ну если написать вручную (= 662.0 662.0) то они конечну будут равны, а вот если числа получаются в результате вычислений, то не всегда
Код:
Код:
__________________
cadtools |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
1. см. # 46-1 + если попробывать чуть-чуть изменить Т.З. - например проверять "действительные координаты" (trans ...), и подумать насколько изменится программа в #42 и #48. в #48 в "любой" точке программы доступны все необходиммые данные, что не скажешь про 42 (там где мы отделяем значение по х - уже ничего не доступно о том откуда она взялась). mapcar - чудесная функция, но в передаваемой процедуре доступен только один элемент списка(ов) (причем в "явном виде" неизвестно какой первый?, последний? и пр), что уж говорить если "вдруг понадобится" переделывать с учетом расстояний от предыдущей точки... 2. По мне дефун это (setq(lambda ...)) - прочем setq - это тоже своего рода "глабальная" лямбда - если функция используется в одном месте, то зачем засорять имена, и уж тем более не вижу смысла "дефунить" временные переменные (пожалуй за эксключением *error* - да и то он устарел). 3. Я бы написал как в #48, но функцию min-x использовал бы по аналогии с #42 - (mapcar 'cadr (vl-remove...)) - т.к. все равно "читать весь" dxf - проще mapcar'ом, но в тоже время в его лямбде - все данные доступны.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 01.02.2011 в 19:35. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Забудь - это функция для запроса у пользователя, как доставать примитивы из описания блока - поищи по форуму не раз обсуждалось.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
А этот "примитив" часом не атрибут?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.11.2010
Сообщений: 89
|
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Несоответствие результатов в Лире | s.vas | Лира / Лира-САПР | 19 | 11.11.2009 07:31 |
Пожалуста помогите правельно написать формулу для Schedule- спецификации | tighineanur | Вертикальные решения на базе AutoCAD | 6 | 24.02.2009 11:24 |
Помощь по Лире | Серега М | Лира / Лира-САПР | 52 | 28.05.2007 02:47 |
Не могу понять в чем ошибка... | DY | Программирование | 5 | 21.02.2007 17:35 |