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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > "(entmake (list..." не работает в нанокаде.

"(entmake (list..." не работает в нанокаде.

Ответ
Поиск в этой теме
Непрочитано 27.03.2024, 10:14 #1
"(entmake (list..." не работает в нанокаде.
peshkoff
 
Юбутово@Москва
Регистрация: 11.06.2014
Сообщений: 88

Хотел создать слой таким образом.
Выдает ошибку, "ошибка: недопустимая функция: LIST", никак не могу вычислить из-за чего.
(Без LIST сделать получается, но нельзя имя и цвет ввести как переменные)

Взял просто элементарнейшую функцию отсюда:
https://forum.dwg.ru/showthread.php?t=27499

Код:
[Выделить все]
 (setq r (getreal " ВВЕДИТЕ РАДИУС: "))
(entmake (list '(0 . "CIRCLE")
'(10 200.0 0.0 0.0)
(cons 40 r)
'(8 . "1")))
не работает у меня...
что не так?

Миниатюры
Нажмите на изображение для увеличения
Название: err.png
Просмотров: 7
Размер:	4.0 Кб
ID:	262338  

Просмотров: 1180
 
Непрочитано 27.03.2024, 10:19
#2
Кулик Алексей aka kpblc
Moderator

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


nc 23.1 - все работает корректно. Другой вопрос, что вместо getreal стоило бы запрашивать getdist, но это некритично.

----- добавлено через ~1 мин. -----
Код:
[Выделить все]
 
(setq rad (getdist "\nEnter radius : "))
(entmake (list '(0 . "CIRCLE") '(10 0. 0. 0.) (cons 40 rad) '(8 . "123")))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2024, 10:49
#3
peshkoff


 
Регистрация: 11.06.2014
Юбутово@Москва
Сообщений: 88


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
nc 23.1 - все работает корректно. Другой вопрос, что вместо getreal стоило бы запрашивать getdist, но это некритично.

----- добавлено через ~1 мин. -----
Код:
[Выделить все]
 
(setq rad (getdist "\nEnter radius : "))
(entmake (list '(0 . "CIRCLE") '(10 0. 0. 0.) (cons 40 rad) '(8 . "123")))

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

теперь круг рисуется, слой не создается.
а потом и круг не рисуется...
слой создаю (пытаюсь) так:
Код:
[Выделить все]
 		(entmake (list '(0 . "LAYER")
			'(100 . "AcDbSymbolTableRecord")
			'(100 . "AcDbLayerTableRecord") 
			'(2 . "nnnn11")
			'(70 . 0)
			'(62 . 200)))

походу мой LIST ломает че то?
нана 22

---------------
все удалил, перезагрузил нану, оставил только эти две функции, все работает.
по ходу мой модуль че-то ломает.
Миниатюры
Нажмите на изображение для увеличения
Название: err2.png
Просмотров: 17
Размер:	18.5 Кб
ID:	262339  

Последний раз редактировалось peshkoff, 27.03.2024 в 10:55.
peshkoff вне форума  
 
Непрочитано 27.03.2024, 11:02
#4
Кулик Алексей aka kpblc
Moderator

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


Что за VN-COLORTOLAYER-PAIR ? Может, этот модуль чего-то крашит?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2024, 11:28
#5
peshkoff


 
Регистрация: 11.06.2014
Юбутово@Москва
Сообщений: 88


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Что за VN-COLORTOLAYER-PAIR ? Может, этот модуль чего-то крашит?
это и есть модуль, что в разработке
кааароче.
видимо, с начала придется
Есть задача: перенести объекты с назначенным (не ByLayer) цветом со слоя 0 на слой с именем = цвету
с помощью (vl-load-com) получилось вроде, но потом решил без него обойтись, оперируя парами.
подучиться...

(да и вообще(vl-load-com) это какой-то верхний уровень, стоит его использовать на простых задачах? почему-то мне кажется за ним будут грузиться куча модулей, все это будет занимать в памяти...
или не стоит запариваться?)

в общем модуль, после которого ничего не работает вот (переменные с именем и цветом слоя пока не присваиваются, все константы):
Код:
[Выделить все]
 
;;; Выбираем объекты и присваиваем слой = цвету
;;;
(defun c:vn-colortolayer-pair (/ selset item layer color)

  (if (not (setq selset (ssget "_I" '((8 . "0") (-4 . ">=") (62 . 1)))))
    (setq selset (ssget '((8 . "0") (-4 . ">=") (62 . 1))))
    ) ;_ end of if

	; Пока набор есть и он > 0
  (while (and selset
	      (> (sslength selset) 0)
	      ) ;_ end of and 
	(setq item (ssname selset 0))			; item в позиции 0
	(setq list (entget (ssname selset 0)))		; получение списка свойств
	(ssdel item selset)				; убираем item из набора
	(setq color (cdr (assoc 62 list)))		; вычисляем цвет, пара 62
	(setq aa 200)
	(princ "\nColor: ")
	(princ color)
;	(princ "\nList: ")
;	(princ list)
	(setq list (subst (cons 62 256) (assoc 62 list) list))	; подменяем в паре 62 цвет "ПоСлою"
	(entmod list)						; обновление примитива
;	(princ "\nNewList: ")
;	(princ list)
	; Проверяем наличие слоя с названием = цвету
        (if
        (not (tblsearch "layer" (itoa color)))

		; True: создаем слой с названием = цвету
        	(progn
		(princ "\nПытаемся создать слой")
		(princ)
		(entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") 
		'(2 . "nnnn123")
		'(70 . 0)
		'(62 . 200)))

		(princ "\nСлоя не было, создан")
;          	(setq layer (vla-add (vla-get-layers acdoc) (itoa color)))
;          	(vla-put-color layer color)
        	) ; end of progn  

		; False: слой не создаем, устанавливаем текущим
		(progn
		(princ "\nСлой уже создан, устанавливаем в текущий")
		(princ)
        	(setq layer (vla-item (vla-get-layers acdoc) (itoa color)))
		) ; end of progn
        	) ; end of if

	;(command "layer" "m" (itoa color) "c" (itoa color) "" "")
	;(vla-put-layer item (vla-get-name layer))
    ) ;_ end of while

  (princ)
  ) ;_ end of defun


----

написал сюда код и прочитал.
list объявлена как переменная и еще и не закрыта

Последний раз редактировалось peshkoff, 27.03.2024 в 11:35.
peshkoff вне форума  
 
Непрочитано 27.03.2024, 12:12
#6
Кулик Алексей aka kpblc
Moderator

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


Совет - поставь виртуалку хоть с Win7 и с любым ACAD внутри нее, там и пиши код. Заодно проверяй видимость переменных, форматируй и вот это все. А уже созданные lsp - подгружать в наник.
Будет проще и быстрее.

----- добавлено через 15 сек. -----
Вариант нумер два - поставить VSCode + AutoLISP Extension для него

----- добавлено через ~17 мин. -----
Откровенно говоря, в коде какой-то жуткий микс из ename- и vla-подходов (vla-, кстати, работать не будут без vl-load-com).
ИМХО пара вариантов:
Код:
[Выделить все]
 (defun c:vn-colortolayer-ename (/ fun_conv-selset-to-ename selset color elist name) 

  (defun fun_conv-selset-to-ename (selset / tab item) 
    (cond 
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat 
         (setq tab  nil
               item (sslength selset)
         )
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
       )
      )
    )
  )

  (if 
    (= 
      (type 
        (setq selset (vl-catch-all-apply 
                       (function 
                         (lambda () 
                           (ssget '((8 . "0") (-4 . ">=") (62 . 1)))
                         )
                       )
                     )
        )
      )
      'pickset
    )
    (progn 
      (foreach ent (fun_conv-selset-to-ename selset) 
        (setq color (cdr (assoc 62 (entget ent))))
        (if (not (tblsearch "layer" (itoa color))) 
          (entmake 
            (list '(0 . "LAYER") 
                  '(100 . "AcDbSymbolTableRecord")
                  '(100 . "AcDbLayerTableRecord")
                  (cons 2 
                        (setq name                            1
                              (strcat "LayerColorEname" (itoa color))
                        )
                  )
                  '(70 . 0)
                  (cons 62 color)
            )
          )
          (setq elist (entget ent))
          (entmod 
            (subst 
              (cons 8 name)
            )
            (subst (cons 62 256) (assoc 62 elist) elist)
            elist
          )
        )
      )
    )
  )
  (princ)
)
И через vla:
Код:
[Выделить все]
 (vl-load-com)
(defun c:vn-colortolayer-vla (/ fun_conv-selset-to-ename selset adoc color name layer) 
  (defun fun_conv-selset-to-ename (selset / tab item) 
    (cond 
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat 
         (setq tab  nil
               item (sslength selset)
         )
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
       )
      )
    )
  )

  (if 
    (= 
      (type 
        (setq selset (vl-catch-all-apply 
                       (function 
                         (lambda () 
                           (ssget '((8 . "0") (-4 . ">=") (62 . 1)))
                         )
                       )
                     )
        )
      )
      'pickset
    )
    (progn 
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (foreach ent (mapcar (function vlax-ename->vla-object) (fun_conv-selset-to-ename selset)) 
        (setq color (vla-get-color ent)
              name  (strcat "LayerColorVla" (itoa color))
        )
        ;; Вариант работал в ACAD, будет ли работать в NC - без понятия
        (setq layer (vla-add (vla-get-layers adoc) name))
        (vla-put-color layer color)
        (vla-put-color ent "ByLayer")
        (vla-put-layer ent name)
      )
      (vla-endundomark adoc)
    )
  )
  (princ)
)
Код не проверял от слова совсем
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.03.2024, 13:22
#7
peshkoff


 
Регистрация: 11.06.2014
Юбутово@Москва
Сообщений: 88


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
жуткий микс из ename- и vla-подходов
так я вырезаю vla.
хочу без него попробовать. с vla я решил задачу

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
;; Вариант работал в ACAD, будет ли работать в NC - без понятия
да, как раз так и работает, с vla никаких проблем.
peshkoff вне форума  
 
Непрочитано 27.03.2024, 14:27
#8
Кулик Алексей aka kpblc
Moderator

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
(GRREAD) и привязка Ева Программирование 17 18.12.2009 09:10
обработка списка luser Программирование 14 28.11.2009 22:21
Не работает команда DonVik Программирование 1 31.07.2008 17:25
Не работает скрипт kpblc-vlr.LSP в английском 2006-м акаде Witalij LISP 8 24.06.2008 11:37