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

Вернуться   Форум 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. Очень прошу посмотреть что можно сделать именно в моем варианте решения данной задачи.
Просмотров: 15245
 
Автор темы   Непрочитано 31.01.2011, 13:04
#61
Pontelimon


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


хмм... действительно, спасибо, помогло. Но почему так ? почему в 1 случае они могут быть равны, а в другом нет ? я про (= 662.0 662.0) .
Pontelimon вне форума  
 
Непрочитано 31.01.2011, 13:32
1 | #62
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Ну если написать вручную (= 662.0 662.0) то они конечну будут равны, а вот если числа получаются в результате вычислений, то не всегда
Код:
[Выделить все]
 
_$ (= 12.0 12.0)
T ; равны
$ (setq a 12.000000000)
12.0
_$ (setq b 12.000001)
12.0
_$ a b
12.0
12.0
_$ (= a b)
nil ; не равны
Все дело в точности представления вещественных чисел. Вообще сравнивать вещественные числа с помощью (< > <= и т. д.) не корректно ни на каком языке программирования (во всяской случае известных мне). На лиспе можно использовать equal. Или можно сравнить разность с нулем
Код:
[Выделить все]
 
_$ (- a b)
-1.0e-006
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 01.02.2011, 05:37
#63
Дима_

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


Цитата:
Сообщение от Disney Посмотреть сообщение
Для чего мы сокращали количество проходов, если это ни привело ни к ускорению программы, ни к понятности кода для широких масс?
Чем lambda лучше defun?
Выложи наконец-то чисто свой код, который бы ты написал для себя безо всяких образовательных целей
Я блогаполучно "переместился" в Сибирь - с интернетом тут более менее порядок, но к разнице во времени пока еще не адаптировался, по существу:
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.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.02.2011, 17:08
#64
Pontelimon


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


Есть такая замечательная функция nentsel , с ее помощью я могу добраться до примитива, который сидит в блоке, но как ее применить к набору ?

Вобщем что-то вроде этого:

Код:
[Выделить все]
 (setq nabor_blokov (ssget ":L"(list (cons 0 "INSERT"))))
(setq primitiv (car(nentsel(ssname nabor_blokov 0))))
Нужно добраться как-то до примитива внутри блока ...
Pontelimon вне форума  
 
Непрочитано 09.02.2011, 17:15
#65
Дима_

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


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Есть такая замечательная функция nentsel , с ее помощью я могу добраться до примитива, который сидит в блоке, но как ее применить к набору ?
Забудь - это функция для запроса у пользователя, как доставать примитивы из описания блока - поищи по форуму не раз обсуждалось.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.02.2011, 23:59
#66
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Нужно добраться как-то до примитива внутри блока ...
А этот "примитив" часом не атрибут?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.02.2011, 11:00
#67
Pontelimon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А этот "примитив" часом не атрибут?
Не обычный блок внутри которого находиться 1 примитив (MTEXT) вот я хотел добраться до его значения.

В итоге я получил вот это:

Код:
[Выделить все]
 (cdr(assoc 1(entget(cdr(assoc -2(tblsearch "block"(cdr(assoc 2(entget(car(entsel)))))))))))
entsel это для наглядности, в итоге само имя блока через ssget конечно =)
Pontelimon вне форума  
 
Непрочитано 10.02.2011, 11:11
1 | #68
Лиспер


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


Можно и по-другому Для любого блока, для любого состава
Код:
[Выделить все]
 (vl-load-com)

(defun _dwgru-get-block-content (ent / lst)
                                ;|
*    Получение списка vla-указателей на состав блока
*    Параметры вызова:
	ent : указатель на блок. Возможные значения:
		vla- или ename-указатель на вхождение блока
		vla- или ename-указатель на описание блока
		строка имени блока
|;
  (cond
    ((and (= (type ent) 'str)
          (tblobjname "block" ent)
          ) ;_ end of and
     (_dwgru-get-block-content
       (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) ent)
       ) ;_ end of _dwgru-get-block-content
     )
    ((= (type ent) 'ename)
     (_dwgru-get-block-content (vlax-ename->vla-object ent))
     )
    ((and (= (type ent) 'vla-object)
          (= (vla-get-objectname ent) "AcDbBlockReference")
          ) ;_ end of and
     (_dwgru-get-block-content
       (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-name ent))
       ) ;_ end of _dwgru-get-block-content
     )
    ((and (= (type ent) 'vla-object)
          (= (vla-get-objectname ent) "AcDbBlockTableRecord")
          ) ;_ end of and
     (vlax-for item ent
       (setq lst (cons item lst))
       ) ;_ end of vlax-for
     (reverse lst)
     )
    ) ;_ end of cond
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
Ответ
Вернуться   Форум 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