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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DCL. Неверно сформированный список на входе.

DCL. Неверно сформированный список на входе.

Ответ
Поиск в этой теме
Непрочитано 04.06.2013, 02:58 #1
DCL. Неверно сформированный список на входе.
Kirill_Ja
 
Мурманск
Регистрация: 28.07.2008
Сообщений: 208

Когда задаю разным компонентам действия через (action_tile)
AutoCad ругаицца на "неверно сформированный список на входе".

Когда проверяю код, не могу найти ошибки (скорее всего потому, что ее там нет).
Более того, когда проверяю код утилитой проверки в редакторе, ему все резко начинает нравиться.

Код я прилагаю.



(action_tile "move_to" (strcat
"(setq blks (mapcar (function (lambda (x)
(nth x kodes_unsel)
))"
"(TG_str_to_list_num (get_tile \"kodes_list\"))))"

"(done_dialog 2)"

))



Есть какие-то особые требования к коду для события?
Может, найдете ошибку в коде?
Код до элемента проверил на предмет скобок и работоспособности. Если не нажимать кнопку, все работает.
Просмотров: 4098
 
Непрочитано 04.06.2013, 03:13
#2
Кулик Алексей aka kpblc
Moderator

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


А если обойтись без установки blks?
P.S. или показывай побольше кода. Сильно подозреваю, что задачку можно решить попроще и поизящнее )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.06.2013, 06:47
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Не надо мудрить в описании кода события - непременно ошибешься. Всё, что там написано, вынести в отдельную локальную функцию и обращаться к ней. Эту функцию можно проверить и отладить.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 04.06.2013, 10:23
#4
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Вот побольше кусманчик:



Код:
[Выделить все]
 (tg_list_refresh "kodes_list" (setq kodes_unsel (acad_strlsort kodes_unsel)))
  
(defun tg_refresh_onimport_points_dialog ( / dialog_id
					     unknown_bl
					     dialog_res
					     kodes_sel
					     kodes_unsel
					     blks
					     contin
					     onimport_names
					     onimport_name
					     onimport_data
					     dialog_num
					  )

(tg_refresh_x-record "tg_Onimport" t)

(if (< (setq dialog_id (load_dialog "tg_dialogs.dcl")) 0)
  	(progn (alert "Не удается найти файл диалога tg_dialogs.dcl")(exit)))
(if (not (new_dialog "tg_refresh_points" dialog_id))
  (progn (alert "Диалог tg_refresh_points не может быть открыт") (exit)))

(setq onimport_names (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= (car x) 3))) (TG_X-record_list "TG_Onimport"))))
(setq unknown_bl (mapcar (function (lambda (x / z)

				  (if (not (member
					     (if (null (setq z (tg_get_attr "KOD" x))) (setq z "nil") z)
					     kodes_unsel))
					(setq kodes_unsel (append kodes_unsel (list z)))
				    )
				  (list (cons nil x) (cons z (cdr (assoc 5 (entget x)))))
				     ))


		   (tg_find_unknown_points)))

(if (null unknown_bl) (progn (alert "Не найдено зарегистрированых блоков не принадлежащих событию импорта") (exit)))


(tg_list_refresh "kodes_list" (setq kodes_unsel (acad_strlsort kodes_unsel)))
  
(action_tile "move_to"   (strcat
			   	"(setq blks (mapcar (function (lambda (x)
							(nth x kodes_unsel)
							))"
					"(TG_str_to_list_num (get_tile \"kodes_list\"))))"

					"(done_dialog 2)"
			
  			))

(action_tile "move_out" "(setq blks (mapcar (function (lambda (x)
						(nth x kodes_sel)
					))(TG_str_to_list_num (get_tile \"kodes_sel_list\"))))
					(done_dialog 4)
			")

(action_tile "move_all_to" "(done_dialog 3)")
(action_tile "move_all_out" "(done_dialog 5)")
(action_tile "accept" "	(if 	(and (/= (setq onimport_name (get_tile \"onimport\")))
				(not (member onimport_name onimport_names ))  )
					(done_dialog 1)
					(alert \"Имя события импорта должно быть непустым уникальным\")
				)")

(while (and (<= 1 (setq dialog_res (start_dialog))) (null contin))


(cond
((= dialog_res 1) (progn

		    	(TG_X-record_save "TG_Onimport" onimport_name

				(mapcar (function (lambda (p) (cons 300 p)))
				  (mapcar (function (lambda (x)
						    (car (vl-remove-if 'null (mapcar (function (lambda (y / z)

								(if (setq z (assoc y x)) (cdr z))

									)) kodes_sel)))
				    
						    )) unknown_bl )))

			
			(if (null kodes_unsel)(setq contin t))
		    
		    ) )
((= dialog_res 2) (progn (setq kodes_sel (append kodes_sel blk))
			       (mapcar (function (lambda (x)
					(setq kodes_unsel (vl-remove x kodes_unsel))
			       ))  blk )))
((= dialog_res 4) (progn (setq kodes_unsel (append kodes_unsel blk))
			       (mapcar (function (lambda (x)
					(setq kodes_sel (vl-remove x kodes_sel))
			       ))  blk )))
((= dialog_res 3) (setq kodes_sel (append kodes_sel kodes_unsel) kodes_unsel nil))
((= dialog_res 5) (setq kodes_unsel (append kodes_unsel kodes_sel) kodes_sel nil))
);end cond
(unload_dialog dialog_id)
  
(if (< (setq dialog_id (load_dialog "tg_dialogs.dcl")) 0)
  	(progn (alert "Не удается найти файл диалога tg_dialogs.dcl")(exit)))
(if (not (new_dialog "tg_refresh_points" dialog_id))
  (progn (alert "Диалог tg_refresh_points не может быть открыт") (exit)))

(tg_list_refresh "kodes_list" (setq kodes_unsel (acad_strlsort kodes_unsel)))
(tg_list_refresh "kodes_sel_list" (setq kodes_sel (acad_strlsort kodes_sel)))



);end while

(unload_dialog dialog_id)  
       
);end defun


То, что у кнопок move_to и move_out разный код на событие - это нормально. Когда заработает на одной кнопке - приведу в соответствие по образу и подобию.



Код:
[Выделить все]
 tg_refresh_points		:dialog {label="Отнести точки к событию импорта"; width=80;

					:spacer	{height=1;}
					:row	{
						:column	{
							:spacer	{height=2;}
							:list_box { key="kodes_list"; height=20; width=25; multiple_select=true;}
							}
						:column	{
							:spacer	{height=4;}
							:button {label="->"; key="move_to"; fixed_width=true; alignment=right; is_bold=true;}
							:button {label=">>>"; key="move_all_to"; fixed_width=true; alignment=right; is_bold=true;}
							:button {label="<-"; key="move_out"; fixed_width=true; alignment=right; is_bold=true;}
							:button {label="<<<"; key="move_all_out"; fixed_width=true; alignment=right; is_bold=true;}
							:spacer	{height=4;}
							}
						:column	{
							:edit_box { key="onimport"; label="Событие импорта:";}
							:list_box { key="kodes_sel_list"; height=20; width=12; multiple_select=true;}
							}
						}
					:spacer {height=2;}
					ok_cancel;
					}


Основная суть - программка проверяет все-ли блоки отнесены к событиям импорта.
Сами события пишутся в словарь. В Х-записи записываются жесткие указатели на примитивы (код 5) через код 300.

Идея создать отдельную процедуру на событие импорта - отличная.
Kirill_Ja вне форума  
 
Непрочитано 04.06.2013, 12:02
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Идея создать отдельную процедуру на событие импорта - отличная.
Это безобразная идея. Нет в LISP никаких "процедур". Только функции. "Это вам не лезгинка, а твист!" (С).
А вот локальные функции для обработчиков делать надо - это значительно упрощает работу. Если писать в виде строки, да внутри которой могут быть еще строки - непременно запутаетесь. Об этом AutoCAD и сообщает.
ShaggyDoc вне форума  
 
Непрочитано 04.06.2013, 14:58
#6
gomer

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


Kirill_Ja, VLIDE пользоваться религия не позволяет?
gomer вне форума  
 
Автор темы   Непрочитано 04.06.2013, 19:46
#7
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Про терминологию понял. Исправлюсь)))
Про VLIDE не понял. Если имеется в виду встроенный в AutoCad редактор лиспа, то им и пользуюсь. И при чем тут моя религия?
А вообще, если я что-то делаю не так, говори прямо и без намеков, о жрец духов)))).
Kirill_Ja вне форума  
 
Непрочитано 04.06.2013, 20:53
#8
gomer

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


К тому, что в нем есть инструменты для отладки кода, позволяющие найти ошибку в нем, и не факт, что ) пропущена в коде, который вы выложили, а не где-то в другом месте . И если честно, то он похож больше на авгиевы конюшни, нежели на код. Чего стоит только
Цитата:
(/= (setq onimport_name (get_tile \"onimport\")))
gomer вне форума  
 
Автор темы   Непрочитано 04.06.2013, 23:28
#9
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Глядишь, через год я и сам так буду думать.
А для того, чтобы через год хвататься за голову и говорить, что код написан криво, мне надо разобраться почему он сейчас!!! не работает.

Если знаешь как лучше написать - поделись)))

То, что ты процитировал, исправил. И правда не очень хорошо написано.
Должно быть

Код:
[Выделить все]
 (/= \"\" (setq onimport_name (get_tile \"onimport\")))
Смысл в том, что поле "onimport" должно быть заполнено.

Последний раз редактировалось Kirill_Ja, 05.06.2013 в 00:40.
Kirill_Ja вне форума  
 
Непрочитано 05.06.2013, 00:53
#10
gomer

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


да, я понял.
Прислушайся к совету ShaggyDoc, тут мне нечего добавить. Еще раз перечитай Полещука и найди лишний кусок. Внимательно продумай логику и комментируй код. Никто в нем разбираться и тем более тестить не будет - это не реально. Если все слишком лупоглазо, воспользуйся методом переноса Алерта или вырежь все кишки и пришивай обратно по одной. Будь внимателен, отформатируй весь код или по частям, обычно влид при этом проверяет соответствие скобок.Разделяй и властвуй, но помни, диалоги созданы для сбора данных у пользователя, не более...
gomer вне форума  
 
Автор темы   Непрочитано 05.06.2013, 11:53
#11
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Спасибо тебе за напутствие, Жрец духов)))
Главное, есть с чего начать. Дальше, думаю, сам.
Kirill_Ja вне форума  
 
Непрочитано 05.06.2013, 15:48
#12
gomer

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


Попробуй скормить такое:

Код:
[Выделить все]
 (action_tile "move_to"
 (strcat
   "(progn (setq blks (mapcar (function (lambda (x) (nth x kodes_unsel)))"
   "(TG_str_to_list_num (get_tile \"kodes_list\"))))"
   "(done_dialog 2))"
  )
)
gomer вне форума  
 
Автор темы   Непрочитано 07.06.2013, 00:39
#13
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Не поверишь))))
Еще 6-о около 11-и. Написал почти то же. Заработало.

Код:
[Выделить все]
 (action_tile "move_to"   (strcat
			   	"(setq blks (mapcar (function (lambda (x)(nth x kodes_unsel)))"
				"(TG_str_to_list_num (get_tile \"kodes_list\"))))"
				"(done_dialog 2)"
				))
Перестало работать событие импорта на кнопку ОК. Ведет себя так как будто на кнопку не назначено вообще никакого события. (при пошаговом выполнении не "запрыгивает" в код события)

Код:
[Выделить все]
 (action_tile "accept" "	(if 	(and (/= \"\" (setq onimport_name (get_tile \"onimport\")))
				     (not (member onimport_name onimport_names ))  )
					(done_dialog 1)
					(alert \"Имя события импорта должно быть непустым уникальным\")
				)")
Проверил. "accept" я правильно написал.
Сразу скажу, что пишу не для того, чтобы кто-то разбирался в моем коде. Я сам могу. Просто надо с кем-то поделиться))))

Опять же вопрос возникает: то, что заработало и то, что не заработало по сути один и тот же код. Почему отличается результат?

Заработало в таком виде
Код:
[Выделить все]
 (action_tile "accept" (strcat
			"(if 	(and (/= \"\" (setq onimport_name (get_tile \"onimport\")))"
					"(not (member onimport_name onimport_names ))  )"
					"(done_dialog 1)"
					"(alert \"Имя события импорта должно быть непустым уникальным\"))"
			))
Я так понял, что в коде события нужно избегать символов конца строки. Хотя, у меня есть не один пример когда код работает с ними.
Источник ошибки не ясен, но решение найдено. Мне нравится. Ориентация на результат во плоти))))

Последний раз редактировалось Kirill_Ja, 07.06.2013 в 00:58.
Kirill_Ja вне форума  
 
Непрочитано 07.06.2013, 00:55
#14
gomer

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


Ты разгневал духов, сын мой
gomer вне форума  
 
Автор темы   Непрочитано 07.06.2013, 01:01
#15
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Offtop: Дальше может быть только оффтоп)))
Спасибо тебе, Жрец духов.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 08.06.2013, 03:55
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Источник ошибки не ясен
Источник ошибки очень простой. Строка должна содержать полный список. Поэтому строка вида "(...)(...)(...)" не годится, а строка "(progn (...)(...)(...))" годится.
Александр Ривилис вне форума  
 
Непрочитано 08.06.2013, 10:57
#17
Нефтепроводчик


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


А зачем strcat?
Разве так (action_tile "move_to" "(...) (...) (done_dialog 2)") не срабатывает?
Нефтепроводчик вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DCL. Неверно сформированный список на входе.

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена динамических блоков Serge_Y Программирование 82 04.04.2019 11:54
Неверно сформирован список на входе. Код внутри. Kirill_Ja Программирование 3 07.04.2013 21:38
"неверно сформированный список на входе" shartal Программирование 2 07.02.2012 19:06
Lisp показывает ошибку Плохо сформированный список на входе BBLainer LISP 20 27.04.2010 18:40
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47