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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > В чем ошибка: Неправильно организован цикл или (getkword)???

В чем ошибка: Неправильно организован цикл или (getkword)???

Ответ
Поиск в этой теме
Непрочитано 06.10.2008, 09:44 #1
В чем ошибка: Неправильно организован цикл или (getkword)???
Kostinok
 
Инженер-электрик
 
Калининград
Регистрация: 13.10.2007
Сообщений: 151

Здравствуйте, подскажите пожалуйста в чем ошибка, сам не могу понять. Попытался переделать функцию VVA NUM_Y – но ничего не получилось .

Код:
[Выделить все]
(defun C:NUM_Y ( / ss start i lst ed str )
  (vl-load-com)
  (and
  (setq start (getint "\nНачальный номер <выход>: "))
       (setq ss (ssget "_:L" '((0 . "*TEXT"))));; Набор текстовых примитивов
       (setq lst nil i '-1)
       (repeat (sslength ss)
	 (setq lst (cons (ssname ss (setq i (1+ i))) lst))
	 );; В lst список текстовых примитивов типа (<Entity name: 78d80fb0> ...)
       (setq lst (vl-sort lst '(lambda (e1 e2)
				 (> (caddr(assoc 10 (entget e1)))(caddr(assoc 10 (entget e2))))
				 )
			  )
	     );; Теперь этот список отсортирован по оси Y
  )
       (initget 1 "Добавить Нумеровать Вставить _Add Num Ins")
       (cond (= (getkword "\nВыберите операцию? [Добавить/Нумеровать/Вставить] <Добавить>: ") "Add")
	        (foreach e1 lst
		(setq ed (entget e1))
		(setq str (cdr(assoc 1 ed)));; Значение текстового примитива, к примеру "1"
		(setq ed (subst (cons 1 (strcat str "." (itoa start))); К значению добавлен стартовый номер
				(assoc 1 ed)
				ed)
		      )
		(entmod ed)
		(setq start (1+ start))
	      );;; end of progn
	     (= (getkword "\nВыберите операцию? [Добавить/Нумеровать/Вставить] <Добавить> : ") "Нумеровать")
	        (foreach e1 lst
		(setq ed (entget e1))
		(setq str (cdr(assoc 1 ed)));; Значение текстового примитива, к примеру "1"
		(setq ed (subst (cons 1 (itoa start)); Сам стартовый номер
				(assoc 1 ed)
				ed)
		      )
		(entmod ed)
		(setq start (1+ start))
		)
	     (= (getkword "\nВыберите операцию? [Добавить/Нумеровать/Вставить] <Добавить> : ") "Вставить")
	      (setq start (getstring T "Введите строку:"))
	      (foreach e1 lst
		(setq ed (entget e1))
		(setq str (cdr(assoc 1 ed)));; Значение текстового примитива, к примеру "1"
		(setq ed (subst (cons 1 (itoa start)); Выбраный текст
				(assoc 1 ed)
				ed)
		      )
		(entmod ed)
		)
	     );;; end of cond
       
  (princ)
  )
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Просмотров: 2895
 
Непрочитано 07.10.2008, 09:06
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Похоже (если я правильно понял заложеную логику), должно быть как-то так:
Код:
[Выделить все]
(vl-load-com)
(defun c:num_y (/ ss start i lst ed str kword)
 (and (setq start (getint "\nНачальный номер <выход>: "))
      (setq ss (ssget "_:L" '((0 . "*TEXT"))))
      ;; Набор текстовых примитивов
      (setq i -1)
      (repeat (sslength ss) (setq lst (cons (ssname ss (setq i (1+ i))) lst)))
      ;; В lst список текстовых примитивов типа (<Entity name: 78d80fb0> ...)
      (setq lst
            (vl-sort lst
                     '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2)))))
            )
      )
      ;; Теперь этот список отсортирован по оси Y
      (progn (initget "Добавить Нумеровать Вставить _Add Num Ins")
             (or (setq kword (getkword "\nВыберите операцию [Добавить/Нумеровать/Вставить] <Добавить>: "))
                 (setq kword "Add")
             )
      )
      (cond ((= kword "Add")
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 (strcat str "." (itoa start)))
                                        ; К значению добавлен стартовый номер
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
              (setq start (1+ start))
             )
            )
;;; end of progn
            ((= kword "Num")
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 (itoa start)) ; Сам стартовый номер
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
              (setq start (1+ start))
             )
            )
            ((= kword "Ins")
             (setq start (getstring t "Введите строку: "))
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 start) ; Выбраный текст
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
             )
            )
      )
;;; end of cond
 )
 (princ)
)

Последний раз редактировалось Alaspher, 07.10.2008 в 09:16.
Alaspher вне форума  
 
Автор темы   Непрочитано 08.10.2008, 09:48
#3
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Alaspher,
Спасибо большое!!! Теперь понятно, что в таких случаях делать. Вроде все просто, а сам бы не догадался, степень профессионализма…
Еще раз спасибо.
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 08.10.2008, 10:08
#4
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Не за что.

В программке, на мой взгляд, заложена некоторая неоптимальность - при сеё старте выдаётся запрос на начальный номер, потом выбор примитивов, но позже, при использовании опции "Вставить", выдаётся повторный запрос на ввод строки. Т.е., если пользователь чразу собирается "Вставлять", то он на превый вопрос должен ввести любую цифру, не имеющую никакого смысла. Лучше было-бы сделать так, что сначала происходил-бы выбор примитивов, затем, выбор вида действия, а затем, в зависимости от действия и делать запрос на ввод либо числа, либо строки.
Alaspher вне форума  
 
Автор темы   Непрочитано 09.10.2008, 07:39
#5
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Alaspher,
ДА, это так! ) Переделал сразу, только:
1. Это выбор действия;
2. Select objects:
3. Убрал переопределение номера, при вставке, т.е. просто (itoa start)
А можно и так:
Код:
[Выделить все]
(vl-load-com)
(defun c:num_y (/ ss start i lst ed str kword)
 (and (setq ss (ssget "_:L" '((0 . "*TEXT"))))
      ;; Набор текстовых примитивов
      (setq i -1)
      (repeat (sslength ss) (setq lst (cons (ssname ss (setq i (1+ i))) lst)))
      ;; В lst список текстовых примитивов типа (<Entity name: 78d80fb0> ...)
      (setq lst
            (vl-sort lst
                     '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2)))))
            )
      );; Теперь этот список отсортирован по оси Y
      (progn (initget "Добавить Нумеровать Вставить _Add Num Ins")
             (or (setq kword (getkword "\nВыберите операцию [Добавить/Нумеровать/Вставить] <Добавить>: "))
                 (setq kword "Add")
             )
      )
            (cond ((= kword "Add")
		   (progn (setq start (getint "\nНачальный номер <выход>: "))
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 (strcat str "." (itoa start)))
                                        ; К значению добавлен стартовый номер
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
              (setq start (1+ start))
             )
            );;; end of progn
		   )
            ((= kword "Num")
	     (progn (setq start (getint "\nНачальный номер <выход>: "))
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 (itoa start)) ; Сам стартовый номер
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
              (setq start (1+ start))
             )
            )
	     )
            ((= kword "Ins")
             (progn (setq start (getstring T "\nТекст для вставки <выход>: "))
             (foreach e1 lst
              (setq ed (entget e1))
              (setq str (cdr (assoc 1 ed)))
              ;; Значение текстового примитива, к примеру "1"
              (setq ed (subst (cons 1 start) ; Выбраный текст
                              (assoc 1 ed)
                              ed
                       )
              )
              (entmod ed)
             )
            )
      ))
;;; end of cond
 )
 (princ)
)
Пожалуйста, ЕЩЁ замечания. А то так хочеться научиться делать правильно.
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 09.10.2008, 08:02
#6
Кулик Алексей aka kpblc
Moderator

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


Первое, что лично мне бросается в глаза - нет отлова ошибок (в частности, нажатия пользователем Esc в любой момент).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.10.2008, 08:12
#7
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Kostinok
Если не придираться специально, то замечаний совсем немного, точнее одно серьёзное, но повторённое трижды и подчистка забытой мелочи после копипаста (изменения помечены красным, мои примечания - зелёным):
Код:
[Выделить все]
(vl-load-com)
(defun c:num_y (/ ss start i lst ed str kword)
 (and (setq ss (ssget "_:L" '((0 . "*TEXT"))))
      ;; Набор текстовых примитивов
      (setq i -1)
      (repeat (sslength ss) (setq lst (cons (ssname ss (setq i (1+ i))) lst)))
      ;; В lst список текстовых примитивов типа (<Entity name: 78d80fb0> ...)
      (setq lst
            (vl-sort lst
                     '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2)))))
            )
      )
      ;; Теперь этот список отсортирован по оси Y
      (progn (initget "Добавить Нумеровать Вставить _Add Num Ins")
             (or (setq kword (getkword "\nВыберите операцию [Добавить/Нумеровать/Вставить] <Добавить>: "))
                 (setq kword "Add")
             )
      )
      (cond ((= kword "Add")
             (and (setq start (getint "\nНачальный номер <выход>: "))
;; progn тут не нужен, а вот без and или if (в данном случае без разницы)
;; нажатие пользователем на Энтер приведёт не к выходу, а к сбою
                  (foreach e1 lst
                   (setq ed (entget e1))
                   (setq str (cdr (assoc 1 ed)))
                   ;; Значение текстового примитива, к примеру "1"
                   (setq ed (subst (cons 1 (strcat str "." (itoa start)))
                                        ; К значению добавлен стартовый номер
                                   (assoc 1 ed)
                                   ed
                            )
                   )
                   (entmod ed)
                   (setq start (1+ start))
                  )
             )
;;; end of progn
            )
            ((= kword "Num")
             (if (setq start (getint "\nНачальный номер <выход>: "))
;; аналогично предыдущему, но для примера не с end, а с if
              (foreach e1 lst
               (setq ed (entget e1))
               ;; (setq str (cdr (assoc 1 ed)))
;; не используется далее
               ;; Значение текстового примитива, к примеру "1"
               (setq ed (subst (cons 1 (itoa start)) ; Сам стартовый номер
                               (assoc 1 ed)
                               ed
                        )
               )
               (entmod ed)
               (setq start (1+ start))
              )
             )
            )
            ((= kword "Ins")
             (if (setq start (getstring t "\nТекст для вставки <выход>: "))
              (foreach e1 lst
               (setq ed (entget e1))
               ;; (setq str (cdr (assoc 1 ed)))
;; не используется далее
               ;; Значение текстового примитива, к примеру "1"
               (setq ed (subst (cons 1 start) ; Выбраный текст
                               (assoc 1 ed)
                               ed
                        )
               )
               (entmod ed)
              )
             )
            )
      )
;;; end of cond
 )
 (princ)
)
Есть ещё достаточно большая тема безопасного ввода данных, но она сильно превышает рамки разработки одной утилиты. В других темах форума она не раз обуждалась, это можно посмотреть отдельно.
Alaspher вне форума  
 
Автор темы   Непрочитано 12.10.2008, 12:15
#8
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Alaspher, Кулик Алексей aka kpblc, Простите за задерку с ответом. Немного попрактикуюсь и выложу более грамотный вариант. Если получиться... НО!, нашел очень сильное подспорье: "САПР на базе AutoCAD - как это делается"... Думаю разберусь.
Спасибо за комментарии и замечания.
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > В чем ошибка: Неправильно организован цикл или (getkword)???

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Чем пользоваться СП или СНиП свайные фундаменты? sanndima Основания и фундаменты 10 29.02.2008 20:37
ошибка текста или мое недопонимание? Дрюха Конструкции зданий и сооружений 7 16.10.2007 13:54
Ошибка в "нагрузках и воздействиях" или просто БРЕ Марьев Павел Прочее. Программное обеспечение 3 08.09.2006 17:21