Каталог программ для проектирования
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™

Red Nova вне форума Вставить имя

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1174329
 
Непрочитано 20.02.2017, 08:37
#3261
I_g_o_r


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


Доброе утро!

Алексей, спасибо за статью. Постараюсь запомнить. А теперь для "особо одаренных" (для меня). Как мне это поможет с вышеуказанным кодом? Код не работает с последним созданным/скопированным блоком в чертеже. Попробуй прогнать его на блоке который прикреплен - выдает ошибку, но если этот блок скопировать или создать еще один, то на первом блоке все будет работать, а на новом - нет!! Вот, собственно в чем вопрос. Пробовал повторять это на двух разных компах - результат тот же.

Последний раз редактировалось I_g_o_r, 20.02.2017 в 20:16.
I_g_o_r вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.02.2017, 10:30
| 1 #3262
kurstep


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


Romazn, мне кажется в вашем случае могут помочь просто гиперcсылки, вроде их можно прикрепить к строке таблицы и добавить нужный файл, Поищите в гугле "гиперссылки автокад"
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.02.2017, 18:46
#3263
George_D


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


Добрый день, ищу решение проблемы: есть созданная методом Autolisp таблица в файле dwg, пытаюсь родной командой "-TABLEEXPORT" экспортировать ее в csv. формат , но у некоторых ячеек при экспорте слетает формат ячеек ( вместо текстовый-числовой). Связанно ли это с стилем таблиц Автокада, либо может быть c Excel?

Код:
[Выделить все]
 (setq aas (car(entsel)))
  (command  "_TABLEEXPORT" aas)
Вложения
Тип файла: rar table_to_exp.rar (55.9 Кб, 6 просмотров)
George_D вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.02.2017, 07:15
#3264
Romazn


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


kurstep, Я знаю про гиперссылки. Дело в том, что, как я говорил, архив огромный, отредактировать каждый лист спецификации, вставив гиперссылку, нет ни возможности ни желания. Именно поэтому я и хочу сделать так, что бы программа "анализировала" именно текст и искала файл.
Romazn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.02.2017, 09:41
#3265
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 3,795


Romazn, спецификация в чем хоть? Сделайте нормальное вложение, а не ссылку куда-то на гугл-диск)

Цитата:
Сообщение от Romazn Посмотреть сообщение
Дело в том, что, как я говорил, архив огромный, отредактировать каждый лист спецификации, вставив гиперссылку, нет ни возможности ни желания. Именно поэтому я и хочу сделать так, что бы программа "анализировала" именно текст и искала файл.
Если хотите какой то реакции на ходу - вешайтесь на реакторы/обработчики событий. Либо парсить текст в спецификациях и при наличии по сгенерированному в процессе парсинга имени файла вставлять гиперссылки. И прогнать архив через эту программу.
Сергей812 на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.02.2017, 22:55
#3266
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Народ, подскажите, а то я уже всю голову сломал. Должна получиться программа, "реставрирующая" взорванную полилинию (ну, или хотя бы её очертания) из отдельных отрезков. Вот код:

Код:
[Выделить все]
 
(setq new_set(ssget))					;создание набора
(setq new_set_qua(sslength new_set))			;количество элементов в наборе

(setq n 0)						;счётчик примитивов в первоначальном наборе
(setq i 0)						;счётчик отрезков в наборе

(setq dots_set (list 0 0 0))				;создание списка точек полилинии

(while (< n new_set_qua)
  (setq name_obj(ssname new_set n))			;извлечение примитива из набора по порядковому номеру
  (setq chars_obj(entget name_obj))			;извлчечение списка характеристик примитива
  (setq type_obj(cdr(assoc 0 chars_obj)))		;извлечение типа примитива из списка
  
  	(if (= type_obj "LINE")
	  (progn
	    (setq dot_start(cdr(assoc 10 chars_obj)))		;извлечение координат первой точки отрезка
	    (setq dot_end(cdr(assoc 11 chars_obj)))		;извлечение координат второй точки отрезка
	    (setq dots_set(list dots_set dot_start dot_end))	;добавляет к списку точек полилинии точки отрезка	
  	    (setq i (+ i 1))
	  )	;конец progn
	)	;конец if
  (setq n (+ n 1))
)		;конец while

(setq dots_set (cdr dots_set))

(apply 'vl-cmdf (append (list "_.PLINE" (car dots_set) "_W" 0 0) (cdr dots_set) '("")))
Проблема в этой строчке:
Код:
[Выделить все]
 (setq dots_set(list dots_set dot_start dot_end))
То есть так оно не работает. И вроде бы даже понятно, почему.

Но как тогда по-другому сформировать циклом список списков с координатами точек полилинии?
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.02.2017, 23:28
#3267
Кулик Алексей aka kpblc
Moderator

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


А почему не использовать append или cons?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.02.2017, 00:12
#3268
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А почему не использовать append или cons?
У cons функционал в данном случае аналогичен list. Если брать append, то да, список формируется (но не список списков, а обычный линейный). И проблема в том, что _.Pline его как-то по-своему воспринимает и рисует что-то совсем не то. Если же вручную создать список по типу ((1 1 0) (2 2 0) (3 3 0)), то полилиния выстраивается корректно.

Если же, действительно, брать append, то на выходе из цикла будем иметь список вида (1 1 0 2 2 0 3 3 0), из которого нужно будет получить список списков... Тоже та ещё задачка.
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.02.2017, 10:53
1 | 1 #3269
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 
(defun test1 (/ selset)
  (if (setq selset (ssget '((0 . "LINE"))))
    (foreach ent ((lambda (/ tab item)
                    (repeat (setq tab  nil
                                  item (sslength selset)
                                  ) ;_ end setq
                      (setq tab (cons (ssname selset (setq item (1- item))) tab))
                      ) ;_ end of repeat
                    ) ;_ end of lambda
                  )
      (setq ent (entget ent)
            res (cons (cons (cdr (assoc 10 ent)) (list (cdr (assoc 11 ent)))) res)
            ) ;_ end of setq
      ) ;_ end of foreach
    ) ;_ end of if
  res
  ) ;_ end of defun

(defun test2 (/ selset)
  (if (setq selset (ssget '((0 . "LINE"))))
    (apply (function append)
           (mapcar (function (lambda (ent) (setq ent (entget ent)) (list (cdr (assoc 10 ent)) (cdr (assoc 11 ent)))))
                   ((lambda (/ tab item)
                      (repeat (setq tab  nil
                                    item (sslength selset)
                                    ) ;_ end setq
                        (setq tab (cons (ssname selset (setq item (1- item))) tab))
                        ) ;_ end of repeat
                      ) ;_ end of lambda
                    )
                   ) ;_ end of mapcar
           ) ;_ end of apply
    ) ;_ end of if
  ) ;_ end of defun

(defun test3 (/ selset)
  (if (setq selset (ssget '((0 . "*LINE"))))
    (apply (function append)
           (mapcar (function
                     (lambda (ent)
                       (mapcar (function cdr)
                               (vl-remove-if-not (function (lambda (x) (member (car x) '(10 11)))) (entget ent))
                               ) ;_ end of mapcar
                       ) ;_ end of lambda
                     ) ;_ end of function
                   ((lambda (/ tab item)
                      (repeat (setq tab  nil
                                    item (sslength selset)
                                    ) ;_ end setq
                        (setq tab (cons (ssname selset (setq item (1- item))) tab))
                        ) ;_ end of repeat
                      ) ;_ end of lambda
                    )
                   ) ;_ end of mapcar
           ) ;_ end of apply
    ) ;_ end of if
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.02.2017, 15:21
#3270
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Работает! Спасибо, дружище!! Теперь полилиния рисуется по точкам. Немного причудливо, ну да это ерунда. Сейчас сделаю сортировку - и оно должно залетать.


UPD. Никакая сортировка тут не понадобилась. Я просто поменял местами 10 и 11 dxf код. Со взорванной полилинией работает идеально. Хотя, конечно, из произвольных отрезков линию не соберёт.

Код:
[Выделить все]
 
;;;;
;;;;Реставрация очертания взорванной полилинии из её отрезков
;;;;


;;;;Рисование полилинии
(defun c:PL_RES (/ dots_set)
	(setq dots_set (kpblc_list))
	(apply 'vl-cmdf (append (list "_.PLINE" (car dots_set) "_W" 0 0) (cdr dots_set) '("")))
) ;_ end of defun  


;;;;Получение списка координат начала и конца отрезков
(defun kpblc_list (/ selset)
  (if (setq selset (ssget '((0 . "LINE"))))
    (apply (function append)
           (mapcar (function (lambda (ent) (setq ent (entget ent)) (list (cdr (assoc 11 ent)) (cdr (assoc 10 ent)))))
                   ((lambda (/ tab item)
                      (repeat (setq tab  nil
                                    item (sslength selset)
                                    ) ;_ end setq
                        (setq tab (cons (ssname selset (setq item (1- item))) tab))
                        ) ;_ end of repeat
                      ) ;_ end of lambda
                    )
                   ) ;_ end of mapcar
           ) ;_ end of apply
    ) ;_ end of if
  ) ;_ end of defun
UPD2 Чтобы уменьшить количество вершин, нужно использовать команду ПРОПОЛКА ПОЛИЛИНИИ (встроена в акад). В код её вписывать не стал, потому что допуски у всех могут быть разные. У меня 8 км водопровода нормально собралось с допуском 0,01 (то бишь 1 см). Но это у меня.

Последний раз редактировалось Enik, 24.02.2017 в 15:38.
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.02.2017, 19:18
#3271
Кулик Алексей aka kpblc
Moderator

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


Есть пара моментов:
1. Насчет "прополки полилинии" не уверен, что она встроена.
2. После получения координат можно (и, скорее всего, нужно) удалять дубликаты
3. Полилинию наверняка проще и быстрее будет создавать через entmake или vla.
4. И, наконец, последнее: грабли, здрасьте!
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.02.2017, 22:03
#3272
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть пара моментов:
1. Насчет "прополки полилинии" не уверен, что она встроена.
2. После получения координат можно (и, скорее всего, нужно) удалять дубликаты
3. Полилинию наверняка проще и быстрее будет создавать через entmake или vla.
4. И, наконец, последнее: грабли, здрасьте!
1. Поищу исходный код этой команды. Если найду - вставлю.
2. Тут проблема не только в этом... См. ниже.
3. Мне, чайнику, разницы не видно Может, и проще. Всё равно пока что не умею.
4. Ого, а вот за это спасибо! Добавил включение/отключение привязки в код. Разницы не заметил, правда, ну да пускай будет, раз оно так правильнее.

А теперь о главном. Штирлиц никогда не был так близок к провалу:

В общем, контур-то полилиния отображает верно. Но при попытке манипуляции с ней возникли проблемы. Команда ПОДОБИЕ выдаёт какую-то дикую ... хрень. Стал разбираться. Выяснилось, что в некоторых местах полилиния начерчена взад-назад, как ручкой по одному месту. Скорее всего, до взрыва там была не одна полилиния, а несколько, начерченные одна поверх другой. В общем, буду разбираться.
Планирую сделать следующее:
а) удалить все совпадающие вершины
б) сделать запрос на крайнюю точку будущей линии
в) отсортировать список, чтобы в нём последовательно стояли точки, находящиеся друг от друга на минимальном удалении. Мда... со школы помню: сколько элементов в списке, столько и будет итераций в цикле сортировки. В моём случае - 2500 отрезков, 5000 точек. Что ж, придётся компу повисеть минуту-другую. Друг вариантов пока не вижу.
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.02.2017, 00:24
#3273
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Enik Посмотреть сообщение
Друг вариантов пока не вижу.
Команда _.pedit и ее опции.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 03.03.2017, 00:03
#3274
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


Доброго. Непонятка с vla-endundomark vla-startundomark. Вроде в других кодах работает а тут нет. Команда создает по точкам выбранных полилиний блоки. Но при undo удаление созданных блоков происходит по очереди а не гурьбой. Подскажите плиз что не так. Файл примера и используемые функции от ЛиМака во вложении.

Код:
[Выделить все]
 (defun c:BMP_PolylinePT (/ *error* adoc sset ename i j var val PointLst PointLstLength ScaleFactor obj
		pt1 pt2 blkangle blklength obj vlaobj PTtype PTComment alpha flipmarker almostclodedpolylinemarker)

  (defun *error* ( msg )
    ;(if ucschanged (command-s "_.ucs" "_prev"))
    (mapcar 'setvar var val)
    (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
                 (princ (strcat "\nError: " msg))))

  (vl-load-com)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) ;_ end of vla-startundomark
  
  (setq var '(cmdecho attreq clayer cecolor celtype osmode) 
        val  (mapcar 'getvar var))
  (setvar "celtype" "ByLayer")
  (setvar "cmdecho" 0)
  (setvar "attreq" 0)
  (setvar "OSMODE" 0)
  (command "cecolor" "BYLAYER")
  (command "clayer" "BMP-Plan Profile")
  (if (= (getvar "INSUNITS") 4)
    (setq ScaleFactor 25.4)
    (setq ScaleFactor 1))
  (setq sset (ssget '((0 . "LWPOLYLINE"))))
  (setq PTtype (getstring T "Enter Petimeter Trim Type Number PT-: "))
  (setq PTtype (strcat "PT-" PTtype))
  (setq PTComment (getstring T "Enter Petimeter Trim Comment: "))

  (setq j (sslength sset))
(while
  (>= j 0)
  
  (setq ename (vlax-ename->vla-object (ssname sset (setq j (1- j)))))
  (setq PointLst (vlax-safearray->list
		    (vlax-variant-value
		      (vla-get-coordinates ename))))
  (setq PointLstLength (length PointLst))
  (setq almostclodedpolylinemarker 0)
  (if
    (and
      (= (car PointLst) (nth (- PointLstLength 2) PointLst))
      (= (cadr PointLst) (nth (- PointLstLength 1) PointLst))
      )
    (setq PointLst (reverse (cdr (cdr (reverse PointLst))))
	  almostclodedpolylinemarker 1)
    )
  (setq i 0)

  (if
    (or
      (eq (vla-get-closed ename) :vlax-true)
      (= almostclodedpolylinemarker 1)
      )
    (setq PointLstLength (length PointLst))
    (setq PointLstLength (- (length PointLst) 2))
    );if

;'(0.0 0.0 100.0 0.0 100.0 50.0 0.0 50.0)

  (while (< i PointLstLength)
    (setq pt1 (list (nth i PointLst) (nth (+ i 1) PointLst)))
    (setq pt2
	(if
	   (or
	     (eq (vla-get-closed ename) :vlax-true)
	     (= almostclodedpolylinemarker 1)
	     )
	   (if
	     (= i (- PointLstLength 2))
	     (list (car PointLst) (cadr PointLst))
	     (list (nth (+ i 2) PointLst) (nth (+ i 3) PointLst))
	     )
	  (list (nth (+ i 2) PointLst) (nth (+ i 3) PointLst))
	   )
         );setq
    (setq blklength (distance pt1 pt2))
    (setq blkangle (angle pt1 pt2))
    
    (setq alpha (angle pt1 pt2))
    (setq flipmarker 0)
    (if
      (and (>= alpha (d2r 135)) (<= alpha (d2r 271)))
      (setq flipmarker 1)
      )

    (if
      (= flipmarker 0)
      (command "_.-insert" "BMP Plan PT" pt1 1.000001 0 0)
      (command "_.-insert" "BMP Plan PT" pt2 1.000001 0 0)
      )
    
    (setq obj (entlast))
    (setq vlaobj (vlax-ename->vla-object obj))
    (LM:setdynpropvalue vlaobj "Length" blklength)

    (if
      (= flipmarker 0)
      (LM:setdynpropvalue vlaobj "Angle1" blkangle)
      (progn
	(LM:setdynpropvalue vlaobj "Angle1" (+ blkangle (d2r 180)))
	(LM:toggleflipstate vlaobj))
      )
    
    (if
      (not (wcmatch PTtype "PT-"))
      (LM:vl-setattributevalue vlaobj "TYPE" PTtype)
      )
    (if
      (not (wcmatch PTComment ""))
      (LM:vl-setattributevalue vlaobj "COMMENT" PTComment)
      )
    (cond
      ((and (> blklength (* 60 ScaleFactor)) (< blklength (* 300 ScaleFactor)))
       (LM:SetVisibilityState vlaobj "Short Tag"))
      ((< blklength (* 60 ScaleFactor))
       (LM:SetVisibilityState vlaobj "No Tag"))
      )
    (setq i (+ i 2))
    );while
  
);while
  
  (*error* nil)
  (vla-endundomark adoc) ;;; undomark bottom mark
  (princ)
 )
Вложения
Тип файла: dwg
DWG 2013
sample blk.dwg (220.2 Кб, 2 просмотров)
Тип файла: lsp Lee Mac Attribute Functions.lsp (4.6 Кб, 3 просмотров)
Тип файла: lsp Lee Mac Dynamic Block Functions.lsp (5.7 Кб, 3 просмотров)
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.03.2017, 05:15
#3275
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,101


Red Nova, это потому что ты ставишь метку отмены после того, как искусственно прерываешь ход выполнения своей программы функцией *error*. Фактически, до строк 124-125 код у тебя не доходит никогда и ни при каких условиях.
Я вижу, ты понимаешь, что искусственный вызов ошибки очень удобен: не нужно два раза повторять одни и те же куски кода для возврата системы в первозданное состояние - она в него вернется и в случае непредвиденной ошибки. Меня этому (в том числе) в свое время научил gomer, подвергнув жесткой критике один из моих кодов, за что ему пребольшое спасибо.
Понимать - понимаешь, а про метку почему-то забыл
Вставь ее в тело *error*.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 03.03.2017, 06:07
#3276
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,952
Отправить сообщение для Red Nova с помощью Skype™


skkkk - Спасибо. Ох и нубас же я
__________________
Блог
Red Nova вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.03.2017, 13:45
#3277
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Доброго времени года!

Вот тут нашёл код для сортировки списка точек от LeeMac:

Код:
[Выделить все]
 (defun sort ( lst / _sort a b d e l p )
  (defun _sort ( a b )
    (if a (cons a (_sort (car (setq b (vl-sort b '(lambda ( c d ) (< (distance a c) (distance a d)))))) (cdr b))))
  )
  (setq l (cdr lst)
        d (distance (setq p (car lst)) (car l))
  )
  (while (setq a (car l))
    (foreach b (setq l (cdr l))
      (if (< d (setq e (distance a b))) (setq p a d e))
    )
  )
  (_sort p (vl-remove p lst))
)
При попытке сортировки он выдаёт ошибку:
Цитата:
неверный элемент в списке аргументов: 2.23835e+006
Сам для себя делаю вывод, что программа не переваривает вещественные числа с плавающей точкой.
Как быть? Координаты неизбежно нужно округлять? Или есть ещё варианты? Потому что округлять не хотелось бы. Это как-то... неправильно что-ли.
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.03.2017, 14:07
#3278
Кулик Алексей aka kpblc
Moderator

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


Ты как вызываешь код?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.03.2017, 14:14
#3279
Enik

ГИП
 
Регистрация: 07.06.2015
Сообщений: 772


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты как вызываешь код?
Формирование списка и сортировка - через вызов функций

Код:
[Выделить все]
 (setq dots_set (kpblc_list))
(setq dots_set (sortentlist (dots_set)))
У функции сортировки ведь есть параметр, который нужно передать. Или ... ?
Enik вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 03.03.2017, 14:38
#3280
Кулик Алексей aka kpblc
Moderator

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


Что за kpblc_list? Что за sortenlist?
Есть разница между вызовом sort:
(sort '((0. 0. 0.) (10. -10. 0.) (20. 20. 0)))
(sort '(0. 0. 0. 10. -10. 0. 20. 20. 0))
Первый сработает, второй (естественно) выдаст ошибку.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 256 07.08.2017 11:53
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


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