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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > пытаюсь написать фильтр на LISP (помогите понять в чем ошибка)

пытаюсь написать фильтр на LISP (помогите понять в чем ошибка)

Ответ
Поиск в этой теме
Непрочитано 12.01.2011, 16:11
пытаюсь написать фильтр на LISP (помогите понять в чем ошибка)
Pontelimon
 
Регистрация: 16.11.2010
Сообщений: 89

Добрый день !

Я совсем недавно начал пытаться что-то сделать на Lisp так что прошу сильно не ругаться =)

Вот моя первый код, он должен выделять одно строчный текст, расположенный по оси Y < -75.

Код:
[Выделить все]
(defun vibor ( / )
  (setq nabor2 (ssadd))
  (setq nabor (ssget "_X" (list (cons 0 "TEXT") (cons 1 "*`.###"))))
  (if (null nabor)
      (progn
	(princ "\nНету подходящего текста. ")
	(princ)
      )
      (progn
	(setq i -1 kolichestvo_repeatov (sslength nabor))
	(repeat kolichestvo_repeatov
	  (setq i (1+ i))
	  (setq konkretniy_primitiv (entget (ssname nabor i)))
	  (setq koordinata_Y (caddr (assoc 10 konkretniy_primitiv)))
	  (if (koordinata_Y < -75)
	    (ssadd (konkretniy_primitiv) nabor2)
	    );end if
	    );end repeat
	  );end progn
    );end if
  (sssetfirst nil nabor2)
  (princ)
  );end defun
Но как Вы наверное уже догадались он не работает, почему ?

P.S. Очень прошу посмотреть что можно сделать именно в моем варианте решения данной задачи.
Просмотров: 14662
 
Непрочитано 17.01.2011, 16:30
1 | #21
Лиспер


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


Сначала вставляется файл, содержащий блок (command "_.-insert" FileName) (command)
Потом вставляешь уже сам блок "Профиль В".
P.S. На форуме есть тема, название, кажется, "На заметку программистам" - там были какие-то коды.
P.P.S.
Цитата:
Сообщение от Pontelimon Посмотреть сообщение
при вставке с палитры он у меня автоматически расчленяться
Посмотри настройки инструмента.
Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Как можно получить координаты точки вставки блока
DXF Reference в руки, 10 группа.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 18.01.2011, 09:37
1 | #22
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Лиспер Посмотреть сообщение
DXF Reference в руки, 10 группа.
Не всегда всё так просто...
Вложения
Тип файла: flv DXF 10 и 210.flv (4.28 Мб, 95 просмотров)
Тип файла: dwg
DWG 2004
Не всё так просто.dwg (141.2 Кб, 957 просмотров)
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 18.01.2011, 10:16
#23
Лиспер


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


Disney, вряд ли тут задействована немировая система координат будет И потом, trans никуда не делся
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 18.01.2011, 17:29
#24
Pontelimon


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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Сначала вставляется файл, содержащий блок (command "_.-insert" FileName) (command)
Потом вставляешь уже сам блок "Профиль В".
P.P.S.
Посмотри настройки инструмента.
Спасибо, получилось вставить блок по нужным координатам, но появилось несколько вопросов:

1. Когда я подгружаю файл содержащий нужный мне блок, он хочет его вставить на текущий чертеж, можно ли сделать так чтобы он только подгружал из него блоки без запроса вставки ?

2. Я что-то, не понял какого инструмента настройки смотреть ? я хочу чтобы они при вставке разбивались.

3. Можно ли избавиться от спама к командной строке, который сопровождает вставку блока ?
Pontelimon вне форума  
 
Непрочитано 18.01.2011, 18:17
1 | #25
Лиспер


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


1. Я ж написал самый простой вариант: (command "_.-insert" <FileName>) (command)
2. Настройки инструмента на ToolPalette, который у тебя выполняет вставку блока
3. Можно cmdecho -> 0; nomutt -> 1. Потом вернуть все обратно
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 19.01.2011, 14:34
#26
Pontelimon


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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
1. Я ж написал самый простой вариант: (command "_.-insert" <FileName>) (command)
2. Настройки инструмента на ToolPalette, который у тебя выполняет вставку блока
3. Можно cmdecho -> 0; nomutt -> 1. Потом вернуть все обратно
Спасибо ! Все получилось ! =)
Pontelimon вне форума  
 
Автор темы   Непрочитано 21.01.2011, 14:13
#27
Pontelimon


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


Поясните пожалуйста, почему в данном случае выдаётся ошибка:
"; ошибка: неверная функция: 190.0"
вот код:
Код:
[Выделить все]
 (setq listkoordY (list 190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0))
(setq listkoordY (list 'min listkoordY))
(setq minkoordY(eval listkoordY)) 
Все, вопрос снимаю, сам допер.

Код:
[Выделить все]
 (setq listkoordY (list 190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0))
(setq listkoordY (cons 'min listkoordY))
(setq minkoordY(eval listkoordY)) 

Последний раз редактировалось Pontelimon, 21.01.2011 в 15:50.
Pontelimon вне форума  
 
Непрочитано 21.01.2011, 17:00
1 | #28
Лиспер


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


А что, проще не получается?
Код:
[Выделить все]
 (setq listkoordY '(190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0))
(apply 'min listkoordY)
Или так:
Код:
[Выделить все]
 (setq minkoordY (apply 'min '(190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0)))
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 25.01.2011, 16:34
#29
Pontelimon


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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
А что, проще не получается?
Код:
[Выделить все]
 (setq listkoordY '(190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0))
(apply 'min listkoordY)
Или так:
Код:
[Выделить все]
 (setq minkoordY (apply 'min '(190.0 195.0 200.0 205.0 210.0 215.0 220.0 225.0 230.0)))
Да, так действительно проще, спасибо

Я столкнулся вот с такой проблемой:

Есть полилиния (рамка) вот ее 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 единиц ?
Pontelimon вне форума  
 
Непрочитано 25.01.2011, 17:39
1 | #30
Дима_

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


без проверки - как-то так:
(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.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.01.2011, 18:03
#31
Pontelimon


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
без проверки - как-то так:
(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)))
Использовал Ваш vla вариант, спасибо !!!
DXF не запустился.
Pontelimon вне форума  
 
Непрочитано 25.01.2011, 21:02
1 | #32
Дима_

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


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Использовал Ваш vla вариант, спасибо !!!
DXF не запустился.
там где выделенно DXF должен быть dxf код полилинии (типа того что вы писали) - как вариант (entget (entlast))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.01.2011, 11:45
1 | #33
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
DXF не запустился.
И не запустится. Нужно не entmode, а entmod
А так красивее
Код:
[Выделить все]
(and
(setq DXF (entget(car(entsel "\Выбери полилинию: "))))
(entmod(mapcar '(lambda (x)(if(= (car x) 10)(cons 10 (mapcar '- (cdr x) '(0 -10))) x)) DXF))
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.01.2011, 11:52
#34
Дима_

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


Цитата:
Сообщение от VVA Посмотреть сообщение
И не запустится. Нужно не entmode, а entmod
эх...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 27.01.2011, 13:14
#35
Pontelimon


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


Цитата:
Сообщение от VVA Посмотреть сообщение
И не запустится. Нужно не entmode, а entmod
А так красивее
Код:
[Выделить все]
(and
(setq DXF (entget(car(entsel "\Выбери полилинию: "))))
(entmod(mapcar '(lambda (x)(if(= (car x) 10)(cons 10 (mapcar '- (cdr x) '(0 -10))) x)) DXF))
)
А Вы бы не могли разъяснить поэтапно, как для дурака, как это работает ? =) И если не трудно применительно к такому вот примеру:

Есть полилиния :

((-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 ?
Pontelimon вне форума  
 
Непрочитано 27.01.2011, 13:44
1 | #36
Дима_

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


(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.
Дима_ вне форума  
 
Автор темы   Непрочитано 27.01.2011, 17:31
#37
Pontelimon


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
(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 ;обрабатываемый список кодов)))
Большое спасибо ! Стало на порядок понятней ! Но не понятно как в этом случае можно было бы различить несколько групп с кодом 10, т.е. допустим первую 10-ку нужно увеличить на 5 а вторую уменьшить 5?
Pontelimon вне форума  
 
Непрочитано 27.01.2011, 17:46
1 | #38
Дима_

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


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Но не понятно как в этом случае можно было бы различить несколько групп с кодом 10, т.е. допустим первую 10-ку нужно увеличить на 5 а вторую уменьшить 5?
Вариант 1 проще в понимании, но мне не нравится - ввести дополнительную переменную и считать ей какая сейчас координата - соответственно исправить проверку.
Вариант 2 - рекурсивный - написать самовызывающую функцию последовательно "обходящею список", с дополнительными аргументами (номера, четности и пр.) - несколько иная логика работы - но без проблем будет работать с многовложенными списками и пр. "неожиданостями".
p.s. - за активное применение второго метода иногда "сыплется" критика со стороны формучан.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 28.01.2011, 12:42
#39
Pontelimon


 
Регистрация: 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 налево, то направо. Где я ошибся ?
Pontelimon вне форума  
 
Непрочитано 28.01.2011, 13:33
1 | #40
Дима_

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


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
а если повторить все с первого действия то отрезок начинает просто перемещаться то на 0.5 налево, то направо. Где я ошибся ?
Это и есть одна из тех многочисленных "неожиданостей" которые всплывают при использовании "простого первого метода" - после entmod dno надо обновить - а то он производит изменения в соответствии с первыми (изначальными) параметрами. Если программа будет чуть посложней - иногда очень не просто не упустить, что сейчас у тебя в переменной.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > пытаюсь написать фильтр на LISP (помогите понять в чем ошибка)

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несоответствие результатов в Лире 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