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

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

Слишком много аргументов

Ответ
Поиск в этой теме
Непрочитано 06.08.2006, 23:30 #1
Слишком много аргументов
Джек
 
Строительство
 
Нижний Новгород
Регистрация: 03.09.2003
Сообщений: 81

Всем привет
Вот решиол написать прожку вставка блока по двум запрашиваемым значениям, но что то не получается Появляется одна и та же фраза "Слишком много аргументов"
вот сам лисп

(defun c:t1 ();переход вид2

(if (null (setq a (vl-bb-ref 'diam1:a)))
(setq a "45")
);if

(initget "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")

(if (setq aa (getkword "\nВведите проходной диаметр тройника <"a">: "))
(setq a (atoi aa))
);if

;;*************************************************

(if (null (setq b (vl-bb-ref 'diam2:b)))
(setq b "45")
);if

(initget "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")

(if (setq bb (getkword "\nВведите проходной диаметр отвода тройника <"b">: "))
(setq b (atoi bb))
);if

(cond
((and( = a 45)( = b 45))
(command "_.insert" "t1-1" pause "1" "1" pause )
)
((and( = a 57)( = b 45))
(command "_.insert" "t3-1" pause "1" "1" pause )
)
((and( = a 57)( = b 57))
(command "_.insert" "t2-1" pause "1" "1" pause )
)
((and( = a 76)( = b 76))
(command "_.insert" "t4-1" pause "1" "1" pause )
)
((and( = a 76)( = b 45))

(command "_.insert" "t6-1" pause "1" "1" pause )
)
);конец конд

;;****************************

(vl-bb-set 'diam1:a a)
(vl-bb-set 'diam2:b b)

;;****************************

(princ)
)

Спасибо.
Просмотров: 7893
 
Непрочитано 07.08.2006, 00:09
#2
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Никогда не использовал COND, но мне кажется
(cond
((and( = a 45)( = b 45))
(command "_.insert" "t1-1" pause "1" "1" pause )
)

должно быть так

Код:
[Выделить все]
(cond 
(and( = a 45)( = b 45)
) ;and
(command "_.insert" "t1-1" pause "1" "1" pause ) 

(and( = a 76)( = b 76)
) ;and
(command "_.insert" "t4-1" pause "1" "1" pause ) 
);cond
перед and лишняя скобка и соответственно после command лишняя

((and( = a 45)( = b 45))
(command "_.insert" "t1-1" pause "1" "1" pause )
);это один аргумент
mmax вне форума  
 
Непрочитано 07.08.2006, 12:31
#3
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


С cond как раз всё верно. Ошибка в
Цитата:
(getkword "\nВведите проходной диаметр тройника <"a">: ")
должно быть:
(getkword (strcat"\nВведите проходной диаметр тройника <" a ">: "))
ытя вне форума  
 
Непрочитано 07.08.2006, 13:01
#4
Геннадий aka PG

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


Должно быть

(getkword (strcat"\nВведите проходной диаметр тройника <a>: "))

Кавычки у буковок a b тут не надо, если хоца тогда надо через слэш как то писать
__________________
С уважением,
Геннадий aka PG
Геннадий aka PG вне форума  
 
Непрочитано 07.08.2006, 14:08
#5
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


Если я правильно понял автора темы, то на месте a и b должно стоять текущее значение, поэтому стоят кавычки.
ытя вне форума  
 
Непрочитано 07.08.2006, 14:27
#6
Кулик Алексей aka kpblc
Moderator

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


Вот только интересно, зачем используется vl-bb-set функции, когда можно просто обойтись глобальными переменными?
Код:
[Выделить все]
(defun c:mt1 (/)
  (initget "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")
  (if (not (setq a (getkword (strcat "\nВведите проходной диаметр тройника <"
				     (if (not a)
				       "45"
				       (vl-princ-to-string a)
				       ) ;_ end of if
				     "> : "
				     ) ;_ end of strcat
			     ) ;_ end of GETKWORD
		 ) ;_ end of setq
	   ) ;_ end of not
    (setq a 45)
    ) ;_ end of if
  (initget "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")
  (if
    (not (setq
	   b (getkword (strcat "\nВведите проходной диаметр отвода тройника <"
			       (if (not b)
				 "45"
				 (vl-princ-to-string b)
				 ) ;_ end of if
			       ) ;_ end of strcat
		       ) ;_ end of GETKWORD
	   ) ;_ end of setq
	 ) ;_ end of not
     (setq b 45)
     ) ;_ end of if
  (cond
    ((and (= a 45) (= b 45))
     (command "_.insert" "t1-1" pause "1" "1" pause)
     )
    ((and (= a 57) (= b 45))
     (command "_.insert" "t3-1" pause "1" "1" pause)
     )
    ((and (= a 57) (= b 57))
     (command "_.insert" "t2-1" pause "1" "1" pause)
     )
    ((and (= a 76) (= b 76))
     (command "_.insert" "t4-1" pause "1" "1" pause)
     )
    ((and (= a 76) (= b 45))
     (command "_.insert" "t6-1" pause "1" "1" pause)
     )
    (t (princ "\nЭто сочетание не работает!"))
    ) ;_ end of cond
  (princ)
  ) ;_ end of defun
Поскольку не очень понимаю идеи, проверить работу не могу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2006, 15:36
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от kpblc
Вот только интересно, зачем используется vl-bb-set функции, когда можно просто обойтись глобальными переменными?
Значения глобальных переменных нельзя прочитать из другого чертежа.
vk вне форума  
 
Непрочитано 07.08.2006, 15:38
#8
Геннадий aka PG

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


Цитата:
Сообщение от ытя
Если я правильно понял автора темы, то на месте a и b должно стоять текущее значение, поэтому стоят кавычки.
Твоя правда, тока пустой ввод тогда должен работать наверное (ИМХО для удобства может еще сделать выбор из списка...)
__________________
С уважением,
Геннадий aka PG
Геннадий aka PG вне форума  
 
Непрочитано 07.08.2006, 15:42
#9
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от vk
Значения глобальных переменных нельзя прочитать из другого чертежа.
Это я знаю. Вопрос в необходимости такого хода.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2006, 15:54
#10
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от kpblc
Цитата:
Сообщение от vk
Значения глобальных переменных нельзя прочитать из другого чертежа.
Это я знаю. Вопрос в необходимости такого хода.
Открыто к примеру два-три-пять файлов (помещения, этажи и т.п.). Ведешь какую то линию (трубу или чего там еще...) в первом файле - вдруг пространство кончилось , переключаешся на второй файл - а настройки то у программы сохранились )
vk вне форума  
 
Непрочитано 07.08.2006, 16:00
#11
Кулик Алексей aka kpblc
Moderator

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


Ххе. В таком случае надо побеспокоиться об уникальности имен, как я понимаю. А то найдется такая сволочь, как я, свои данные туда засунет (вообще строки или списки, во весело будет!)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2006, 16:41
#12
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Значения глобальных переменных можно импортировать во все отрытые и открываемые в текущем сеансе рисунки функцией
vl-propagate
Эдуард вне форума  
 
Автор темы   Непрочитано 07.08.2006, 22:41
#13
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Цитата:
Сообщение от kpblc
Вот только интересно, зачем используется vl-bb-set функции, когда можно просто обойтись глобальными переменными?
Код:
[Выделить все]
(defun c:mt1 (/)
  (initget "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")
  (if (not (setq a (getkword (strcat "\nВведите проходной диаметр тройника <"
				     (if (not a)
				       "45"
				       (vl-princ-to-string a)
				       ) ;_ end of if
				     "> : "
				     ) ;_ end of strcat
			     ) ;_ end of GETKWORD
		 ) ;_ end of setq
	   ) ;_ end of not
    (setq a 45)
    ) ;_ end of if
  (initget "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420")
  (if
    (not (setq
	   b (getkword (strcat "\nВведите проходной диаметр отвода тройника <"
			       (if (not b)
				 "45"
				 (vl-princ-to-string b)
				 ) ;_ end of if
			       ) ;_ end of strcat
		       ) ;_ end of GETKWORD
	   ) ;_ end of setq
	 ) ;_ end of not
     (setq b 45)
     ) ;_ end of if
  (cond
    ((and (= a 45) (= b 45))
     (command "_.insert" "t1-1" pause "1" "1" pause)
     )
    ((and (= a 57) (= b 45))
     (command "_.insert" "t3-1" pause "1" "1" pause)
     )
    ((and (= a 57) (= b 57))
     (command "_.insert" "t2-1" pause "1" "1" pause)
     )
    ((and (= a 76) (= b 76))
     (command "_.insert" "t4-1" pause "1" "1" pause)
     )
    ((and (= a 76) (= b 45))
     (command "_.insert" "t6-1" pause "1" "1" pause)
     )
    (t (princ "\nЭто сочетание не работает!"))
    ) ;_ end of cond
  (princ)
  ) ;_ end of defun
Поскольку не очень понимаю идеи, проверить работу не могу.
Спасибо всем большое и kpblc в том числе - все работает!!!!!
Джек вне форума  
 
Автор темы   Непрочитано 09.08.2006, 21:13
#14
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Всем привет!!!
kpblc - а программа то не коректно радотает :-( , она не сохраняет последние введенные значения и блоки не ставит!!
Помогите пожалуйста!
Джек вне форума  
 
Непрочитано 10.08.2006, 09:16
#15
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun c:mt1 (/ loc:strcont loc:getvalue)

  (defun loc:strcont (str replacer new / res)
    (while (vl-string-search replacer str)
      (setq str (vl-string-subst new replacer str))
      ) ;_ end of while
    str
    ) ;_ end of defun

  (defun loc:getvalue (msg str def / res)
    (initget (strcat str " _ " str))
    (if	(not (setq res (getkword (strcat "\n"
					 (vl-string-trim " \n" msg)
					 " ["
					 (loc:strcont str " " (chr 47))
					 "] <"
					 (vl-princ-to-string def)
					 "> : "
					 ) ;_ end of strcat
				 ) ;_ end of getkword
		   ) ;_ end of setq
	     ) ;_ end of not
      (setq res def)
      ) ;_ end of if
    res
    ) ;_ end of defun

  (setq	inside_diam_main (atoi
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_main)
			       45
			       inside_diam_main
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	inside_diam_add	 (atoi
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_add)
			       45
			       inside_diam_add
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	) ;_ end of setq
  (cond
    ((and (= inside_diam_main 45) (= inside_diam_add 45))
     (command "_.insert" "t1-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 45))
     (command "_.insert" "t3-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 57))
     (command "_.insert" "t2-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 76))
     (command "_.insert" "t4-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 45))
     (command "_.insert" "t6-1" pause "1" "1" pause)
     )
    (t (princ "\nЭто сочетание не работает!"))
    ) ;_ end of cond
  (princ)
  ) ;_ end of defun
Специально проверил. Все работает.
1. Блоки должны лежать в путях поддержки када.
2. У тебя обрабатываются не все возможные варианты сочетаний внутреннего диаметра и диаметра отвода.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.08.2006, 12:20
#16
ShaggyDoc

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


Цитата:
У тебя обрабатываются не все возможные варианты сочетаний внутреннего диаметра и диаметра отвода.
И это верно, и вообще поход к структуре программы плохой.

1. Тройников может быть много, но сочетания - ограничены. Значит и выбираться должны не по отдельности два диаметра, а сразу тройник, как изделие. Например "57х45". Тем более, что предусмотрено использование блоков с заранее известными именами и номенклатурой, а не рисование тройников программно (что вообще-то гораздо "гибше", особенно если данные не зашиты в программу).

Сейчас требуется два ввода, да еще и не гарантированно правильных - может обнаружиться, что "это сочетание не предусмотрено". А откуда "тетка" знает, что предусмотрено, а что нет?

2. Как правило, надо нарисовать сразу несколько изделий. То есть программа должна быть зациклена на этапе после выбора типоразмера.

3. Как правило, применяются повторяющиеся изделия. Предыдущий выбранный типоразмер должен запоминаться, а при следующем запуске программы предлагаться по умолчанию. При этом должна выводиться информация о примененном типоразмере и сразу запрашиваться точка вставки. А изменение типоразмера в опции. Т.е. командная строка типа:

"Тройник 108х89. Точка вставки [Меню]<Выход>:

Здесь можно:

а) Сразу указать точку и нарисовать тройник 108х89.

б) Выбрать опцию Меню и там выбрать другой типоразмер. Выбранный типоразмер должен запомниться в подходящем месте для использования по умолчанию в следующий раз.

в) Нажать Enter и выйти без рисования, или когда надоест.

По такому же принципу надо делать и прочие детали (отводы, переходы и т.д.).

Про vl-propagate и vl-bb-set уж молчу - такие фокусы совершенно здесь не нужны. Как это "вдруг пространство кончилось?" Но если и предположить такой "коллапс вселенной", то настройки должны сохраняться вне любого документа и между сеансами. То есть в подходящем месте.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.08.2006, 13:49
#17
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Цитата:
Сообщение от kpblc
Код:
[Выделить все]
(defun c:mt1 (/ loc:strcont loc:getvalue)

  (defun loc:strcont (str replacer new / res)
    (while (vl-string-search replacer str)
      (setq str (vl-string-subst new replacer str))
      ) ;_ end of while
    str
    ) ;_ end of defun

  (defun loc:getvalue (msg str def / res)
    (initget (strcat str " _ " str))
    (if	(not (setq res (getkword (strcat "\n"
					 (vl-string-trim " \n" msg)
					 " ["
					 (loc:strcont str " " (chr 47))
					 "] <"
					 (vl-princ-to-string def)
					 "> : "
					 ) ;_ end of strcat
				 ) ;_ end of getkword
		   ) ;_ end of setq
	     ) ;_ end of not
      (setq res def)
      ) ;_ end of if
    res
    ) ;_ end of defun

  (setq	inside_diam_main (atoi
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_main)
			       45
			       inside_diam_main
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	inside_diam_add	 (atoi
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_add)
			       45
			       inside_diam_add
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	) ;_ end of setq
  (cond
    ((and (= inside_diam_main 45) (= inside_diam_add 45))
     (command "_.insert" "t1-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 45))
     (command "_.insert" "t3-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 57))
     (command "_.insert" "t2-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 76))
     (command "_.insert" "t4-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 45))
     (command "_.insert" "t6-1" pause "1" "1" pause)
     )
    (t (princ "\nЭто сочетание не работает!"))
    ) ;_ end of cond
  (princ)
  ) ;_ end of defun
Специально проверил. Все работает.
1. Блоки должны лежать в путях поддержки када.
2. У тебя обрабатываются не все возможные варианты сочетаний внутреннего диаметра и диаметра отвода.
Kpblc спасибо за лисп , но – данный код программы работает не корректно, т.к. при повторном вызове команды (программы) не дает возможность сделать пустой ввод. При пустом вводе программа выдает ошибку: «Введите проходной диаметр тройника
[45/57/76/89/108/133/159/219/273/325/377/426/530/720/1020/1420] <76> :
; ошибка: не верный тип аргумента: stringp 76».
Получается, пользователю требуется всегда вводить число (значение).
Можно сделать, так чтоб программа давала возможность делать «пустой ввод»?
:roll:
Джек вне форума  
 
Непрочитано 16.08.2006, 13:36
#18
Кулик Алексей aka kpblc
Moderator

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


Сорри, запутался
Код:
[Выделить все]
(defun c:mt1 (/ loc:strcont loc:getvalue)

  (defun loc:strcont (str replacer new / res)
    (while (vl-string-search replacer str)
      (setq str (vl-string-subst new replacer str))
      ) ;_ end of while
    str
    ) ;_ end of defun

  (defun loc:getvalue (msg str def / res)
    (initget (strcat str " _ " str))
    (if	(not (setq res (getkword (strcat "\n"
					 (vl-string-trim " \n" msg)
					 " ["
					 (loc:strcont str " " (chr 47))
					 "] <"
					 (vl-princ-to-string def)
					 "> : "
					 ) ;_ end of strcat
				 ) ;_ end of getkword
		   ) ;_ end of setq
	     ) ;_ end of not
      (setq res def)
      ) ;_ end of if
    res
    ) ;_ end of defun

  (setq	inside_diam_main (itoa
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_main)
			       45
			       inside_diam_main
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	inside_diam_add	 (itoa
			   (loc:getvalue
			     "Введите проходной диаметр тройника"
			     "25 45 57 76 89 108 133 159 219 273 325 377 426 530 720 1020 1420"
			     (if (not inside_diam_add)
			       45
			       inside_diam_add
			       ) ;_ end of if
			     ) ;_ end of loc:getvalue
			   ) ;_ end of rtos
	) ;_ end of setq
  (cond
    ((and (= inside_diam_main 45) (= inside_diam_add 45))
     (command "_.insert" "t1-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 45))
     (command "_.insert" "t3-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 57) (= inside_diam_add 57))
     (command "_.insert" "t2-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 76))
     (command "_.insert" "t4-1" pause "1" "1" pause)
     )
    ((and (= inside_diam_main 76) (= inside_diam_add 45))
     (command "_.insert" "t6-1" pause "1" "1" pause)
     )
    (t (princ "\nЭто сочетание не работает!"))
    ) ;_ end of cond
  (princ)
  ) ;_ end of defun
Так работает?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.08.2006, 14:45
#19
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Цитата:
Сообщение от kpblc
Так работает?
Привет всем!!!! И kpblc в том числе!!!!!! :wink:

Программа снова не работает
при вводе числа или в пустом вводе - пишет одно и тоже:

:ошибка, не верный тип аргумента: fixnump: "76"

:roll:
Джек вне форума  
 
Автор темы   Непрочитано 29.08.2006, 15:49
#20
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


kpblc - пропал! :-(, а вопрос так и не решен :-(
Джек вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Слишком много аргументов

Реклама i