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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тип consp, почему не срабатывает SUBST

Тип consp, почему не срабатывает SUBST

Ответ
Поиск в этой теме
Непрочитано 01.09.2011, 13:25 #1
Тип consp, почему не срабатывает SUBST
Kostinok
 
Инженер-электрик
 
Калининград
Регистрация: 13.10.2007
Сообщений: 151

Здравствуйте,

примитивный код
Код:
[Выделить все]
 
(setq lst1 (cons 41 -100.0))
(setq a (car lst1) b (cdr lst1))
      (subst (* -1.0 b) b lst1)
Помогите разобраться, в чем ошибка?
Просмотров: 3306
 
Непрочитано 01.09.2011, 13:42
1 | #2
gomer

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


не путайте список и точечную пару
Код:
[Выделить все]
 (setq lst1 (cons 41 -100.0))
(setq lst1 (cons (setq b (* -1.0 (cdr lst1)) a (car lst1)) b))
gomer вне форума  
 
Автор темы   Непрочитано 01.09.2011, 13:46
#3
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Понятно, спасибо,
тип consp - это что такое? И где про это почитать, а то так часто всякие ошибки с типами данных...

А именно заменить в точечной паре нельзя, это в части кода
Код:
[Выделить все]
 

   (foreach item (mapcar '(lambda (a) (entget a)) enm)
;;;        enm - список имен примитивов
;;;        (progn
;;;        (setq ins (vl-remove-if-not '(lambda (a) (member (car a) '(41 42 43))) item)
;;;              sclst (mapcar '(lambda (a) (if (minusp (cdr a)) (* -1 a) a)) ins))
        (entmod
          (setq ins (mapcar '(lambda (lst / a b)
                           (progn (setq a (car lst)
                                        b (cdr lst)
                                  ) ;_ end of setq
                                  (if (and (member a '(41 42 43)) (minusp b))
                                    (subst (* -1 b) b lst)
                                  lst) ;_ end of if
                           ) ;_ end of progn
                         ) ;_ end of lambda
                        item
                )) ;_ end of mapcar
        ) ;_ end of entmod
      ) ;_ end of foreach

Хочу в блоках убрать "отзеркаливание", надо, что бы в точечных парах 40, 41, 42 второй элемент всегда положительным был, вот и хотел заменить

Последний раз редактировалось Kostinok, 01.09.2011 в 13:53.
Kostinok вне форума  
 
Непрочитано 01.09.2011, 13:54
#4
gomer

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


это неверный список...

Цитата:
Сообщение от Kostinok Посмотреть сообщение
тип consp - это что такое? И где про это почитать, а то так часто всякие ошибки с типами данных...
Терпите и учитесь... справка вам в помощь
вот еще примеры неверных данных
(itoa t)
(atoi 0)

А вот функция для "чтения/записи" примитивов
Код:
[Выделить все]
 (defun dxf (asc ent)
;;; (dxf '(1 . "hello") (car (entsel)))
  (if (listp asc)
    ((lambda (k s)
       (entmod
	 (subst
	   (cons k s)
	   (cons k (dxf k ent))
	   (entget ent)
	 )
       )
     )
      (car asc)
      (cdr asc)
    )
    (cond
      ((eq 'ENAME (type ent)) (dxf asc (entget ent)))
      ;; ((eq 'VLA-OBJECT (type ent)) (dxf asc (vlax-vla-object->ename ent)))
      ((listp ent) (cdr (assoc asc ent)))
    )
  )
)

Последний раз редактировалось gomer, 01.09.2011 в 14:15.
gomer вне форума  
 
Автор темы   Непрочитано 01.09.2011, 15:20
#5
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


gomer,


Очень красиво работает!!!!

Отличная функция, обязательно надо сохранить в библиотеке, т.е. если (dxf '1 'ENAME) - тогда чтение, а если (dxf '(1 . "hello") 'ENAME), тогда запись. Ну просто супер!!! Спасибо!!! Может и в библиотеку DWG ее добавить надо, уж больно хороша)

Последний раз редактировалось Kostinok, 01.09.2011 в 15:44.
Kostinok вне форума  
 
Непрочитано 01.09.2011, 15:58
#6
gomer

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


стоп... чет я намудрил...

Код:
[Выделить все]
 (defun dxf (asc ent)
;;; (dxf '(1 . "hello") (car (entsel)))
;;; acs - число (режим чтения) либо точечная пара - режим записи (dxf-код . значение)
  (cond
    ((eq 'ENAME (type ent)) (dxf asc (entget ent))) ; рекурсивно преобразуем примитив в cписок entget
    ;; ((eq 'VLA-OBJECT (type ent)) (dxf asc (vlax-vla-object->ename ent))); то же в два захода с прыжком на строчку выше
    ((listp ent) ; ну наконец-то к делу...
     (if (listp asc) ; режим записи
       (entmod (subst asc (cons (car asc) (dxf (car asc) ent)) ent)) ; преобразовываем примитив
       ;; режим чтения, здесь тоже нужна проверка типа asc,
       ;; но если понимать что делаешь, то необяpательно
      (if (numberp asc) (cdr (assoc asc ent)))
     )
    )
  )
)

Последний раз редактировалось gomer, 01.09.2011 в 16:58.
gomer вне форума  
 
Непрочитано 01.09.2011, 16:11
#7
Дима_

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


2GomerOfftop: у тебя лишний аргумент s объявленный в 9 строке - (cons k s) - лишнее действие - это всегда asc
p.s. я бы тут вобще лямбду не ставил т.к. проще, короче и быстрее добавить один (car asc) нежели объявлять лямбду
т.е. (subst asc (cons (car asc) (dfx (car asc) ent))ent)
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 01.09.2011 в 16:21.
Дима_ вне форума  
 
Автор темы   Непрочитано 01.09.2011, 16:16
#8
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


gomer,
Только немного с первым кодом разобрался, как он изменился....
Вроде немного начинает "доходить", но что бы самому такое написать... ух тренироваться надо.
А задумка красивая, это сколько можно всего поизменять одной только этой функцией, супер!

Предлагаю gomer выложить функцию в раздел "Готовые функции" с замечаниями Дима_, будет красивый, небольшой код, только (subst asc (cons (car asc) (dxf (car asc) ent))ent) - переставил буквы.

Последний раз редактировалось Kostinok, 01.09.2011 в 16:29.
Kostinok вне форума  
 
Непрочитано 01.09.2011, 16:39
#9
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
лишний аргумент s объявленный в 9 строке - (cons k s) - лишнее действие - это всегда asc
согласен... поправил...
gomer вне форума  
 
Автор темы   Непрочитано 01.09.2011, 16:44
#10
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


gomer,

(entmod ... ) забыл
Kostinok вне форума  
 
Непрочитано 01.09.2011, 16:45
#11
gomer

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


за вами не успеешь
поправил + добавил проверку asc в режиме чтения

Последний раз редактировалось gomer, 01.09.2011 в 16:58.
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тип consp, почему не срабатывает SUBST

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Максимальная ошибка в узле 50797 по направлению 2: 0.387%. Kastrulkin Расчетные программы 11 06.12.2011 15:35
ориенитация текста размера при смене UCS baaba AutoCAD 12 17.03.2011 13:33
Непонятки со связями bezo Расчетные программы 8 06.06.2010 12:34
Почему срабатывает "табличный" реактор при сохранении рисунка. Дима_ Программирование 23 21.05.2010 21:24
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16