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

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

Подскажите где ошибка в лиспе

Ответ
Поиск в этой теме
Непрочитано 27.01.2009, 23:38 #1
Подскажите где ошибка в лиспе
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 445

я пытаюсь сделать лисп который бы вставлял объекты из буфера в базовые точки выделенных объектов.но видимо где что то не учел. вот код

Код:
[Выделить все]
(defun c:Zod ()
(setq ss1 (ssget))
(setq number (sslength ss1))
(while number
(setq pt1 (list (cadr(assoc 10 (entget (ssname ss1 1)))) (caddr(assoc 10 (entget (ssname ss1 1))))))
(command "._pasteclip" pt1 )
(ssdel (ssname ss1 1) ss1)
(setq number (- number 1))
);end while
)
лисп не вставляет в базовую точку последнего объекта , и автокад выдает сообщение "; error: bad argument type: lentityp nil" , подскажите что не так

Последний раз редактировалось Кулик Алексей aka kpblc, 27.01.2009 в 23:46.
Просмотров: 3988
 
Непрочитано 28.01.2009, 00:38
#2
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Скорее всего ты выбираешь один объект, а в наборе нумерация начинается с нуля -> (ssname ss1 1) возвращает nil.
Учись пользоваться средствами отладки в vlisp.
Также надо учесь, что у разных объектов точечная пара (10 . ) имеет различное назначение и если это точка, то она может быть в разных системах кординат (WCS, OCS).
Donhuan вне форума  
 
Автор темы   Непрочитано 28.01.2009, 09:24
#3
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


Спасибо, исправил везде (ssname ss1 0) все отлично работает, у меня еще вопрос.а можно ли так сделать что бы ЛИСП вначале получил все базовые точки выделенных объектов, пронумеровав каждую точки pt1 , pt2, pt3.. и т.д., а потом уж вставлял перебирая все эти точки???
Composter вне форума  
 
Непрочитано 28.01.2009, 12:38
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


>Composter
Что ты имеешь в виду базовые точки выделенных объектов.
Какая базовая точка у линии, окружности, полилинии, блока ну и т.д.?
CB вне форума  
 
Автор темы   Непрочитано 28.01.2009, 12:46
#5
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


под базовой точкой я имел в виду то значение, которое выдает (assoc 10 (entget (ssname ss1 1))) , те точечная пара имющая номер 10 при выводе инфы entget.
Composter вне форума  
 
Непрочитано 28.01.2009, 13:08
#6
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Пример для линий.
Код:
[Выделить все]
(defun c:Zod ( / )
  (mapcar '(lambda (x) (command "._pasteclip" x))
	  (mapcar '(lambda (x) (trans (cdr (assoc 10 (entget x))) 0 1))
		  (vl-remove-if
		    'listp
		    (mapcar (function cadr)
			    (ssnamex (ssget '((0 . "LINE")))
			    ) ;_ end of ssnamex
		    ) ;_ end of mapcar
		  ) ;_ end of vl-remove-if
	  ) ;_ end of mapcar
  ) ;_ end of defun
  (princ)
) ;_ end of defun

;для корректной вставки копировать объекты в буфер требуется с базовой точкой "Copy with base point"
Повторяю: пара 10 у разных типов объектов имеет разное назначение, а если является точкой, то может быть в различных системах координат.
Donhuan вне форума  
 
Непрочитано 28.01.2009, 13:23
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Ну или так (для любых примитивов, имеющих 10 код dxf)
Код:
[Выделить все]
(defun c:Zod (/ ss1)
  (princ "\nВыбор элемента для буфера: ")
  (vl-cmdf "._copybase"
           (getpoint "\nБазовая точка: ")
           (ssget)
           ""
  ) ;_ end of vl-cmdf
  (princ "\nВыбор элементов для вставки: ")
  (if (setq ss1 (ssget))
    (mapcar
      '(lambda (pt)
         (vl-cmdf "._pasteclip" pt)
       ) ;_ end of lambda
      (apply
        'append
        (mapcar
          '(lambda (name)
             (mapcar
               'cdr
               (vl-remove-if-not
                 '(lambda (x) (= (car x) 10))
                 (entget name)
               ) ;_ end of vl-remove-if-not
             ) ;_ end of mapcar
           ) ;_ end of lambda
          (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
        ) ;_ end of mapcar
      ) ;_ end of apply
    ) ;_ end of mapcar
  ) ;_ end of if
  (princ)
) ;_ end of defun
CB вне форума  
 
Автор темы   Непрочитано 28.01.2009, 14:30
#8
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


спасибо за помощь, но мне это пока трудно воспринимать.попробую дома в обнимку с книжкой разобраться.
Composter вне форума  
 
Автор темы   Непрочитано 31.01.2009, 23:25
#9
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


я немного переделал свой лисп что бы вначале он считывал координаты и записывал их а потом всталялт объеты в ети точки но чего то там не пашет вот код

Код:
[Выделить все]
(defun c:Zod ()
(setq ss1 (ssget))
(setq number (sslength ss1) number2 (sslength ss1))

(while number
(set (read(strcat "pt" (itoa number)))  (cdr(assoc 10 (entget (ssname ss1 (1- number))))))
(ssdel (ssname ss1 (1- number)) ss1)
(setq number (1- number))
);end while

(while number2
(command "._pasteclip" !(read(strcat "pt" (itoa number2))) )
(setq number2 (1- number2))
);end while2
)
я так понимаю ошибка во втором цикле а именно !(read(strcat "pt" (itoa number2))) здесь как сделать так что бы выводилось не строка pt4 а значение этой точки????

Последний раз редактировалось Кулик Алексей aka kpblc, 31.01.2009 в 23:54.
Composter вне форума  
 
Непрочитано 31.01.2009, 23:55
#10
Кулик Алексей aka kpblc
Moderator

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


А что в коде делает символ "!"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.02.2009, 01:08
#11
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


ну это по ошибке добавил , когда проверял значения пременных.от наличия этого знака ничего не меняется ...
Composter вне форума  
 
Непрочитано 01.02.2009, 01:23
#12
Кулик Алексей aka kpblc
Moderator

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


Все здорово, одно "но": а что вставлять из буфера собираешься? Если в коде нет команды _.copyclip?
Если надо просто продублировать объекты, то для этого есть другие методы, без использования буфера обмена.
---
Добавлено: циклы (while number ) и (while number2 ) будут выполняться бесконечно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 01.02.2009 в 01:38.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.02.2009, 02:08
#13
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


пред выполнением команды, я копирую с базовой точкой нужные объекты.обычно текст, ингода блоки копирую.если существуют другие методы , то хотелось бы о них услышать.только если ето н сильно сложно, а то ето мой первый лисп.на счет циклов while я дуал что он будет выполнятся пока nuber не станет 0 .как будет что бы до нуля? может while (= number 0) ?так?и еще вопрос если я не правильно указал точку вставки то что бы отменить вставку например 50 объектов то нужно 50 раз нажать undo, как бы иак сделать что бы одним undo отменялась вся операция вставки?
Composter вне форума  
 
Непрочитано 01.02.2009, 14:39
#14
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Читай http://forum.dwg.ru/showthread.php?t=22894.
Donhuan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подскажите где ошибка в лиспе

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где приобрести спиртовый раствор фенолфталеина? SergL Прочее. Архитектура и строительство 18 18.06.2007 18:45
Подскажите где Express в Acad2002? и Plot stamp Acad 2000? ShuraN AutoCAD 4 14.01.2004 11:23
Мое меню не работает. Где ошибка? Pilot Программирование 3 25.12.2003 15:05
подскажите кто может где взять литературу по VBA for AutoCad er Программирование 2 28.10.2003 14:08
Подскажите, где найти lesson01.dwt - lesson10.dwt для r14 ? Георгий AutoCAD 1 13.10.2003 20:13