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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП для Масштаба чертежа

ЛИСП для Масштаба чертежа

Ответ
Поиск в этой теме
Непрочитано 06.07.2007, 13:30 #1
ЛИСП для Масштаба чертежа
Таня.
 
Владивосток
Регистрация: 29.06.2007
Сообщений: 50

Пожалуйста, помогите решить простенькую задачку.
Оформляю программу печати чертежей для наших сотрудников. Практически все, что задается в "Параметрах" вывожу на единое окошечко. Споткнулась на "Масштабе".
В DCL сформировала выпадающий список: "вписать; 1:1; 1:2;…" и т.д.
Блок масштаба не работает. При работе программа выдает сообщение " неверный тип аргумента: (or stringp symbolp)"
Как правильно сформировать правильные аргументы? DCL:
  • mash:dialog {label = "Масштаб";
    :radio_column {label="";
    opup_list {label="";
    list="вписать\n1:1\n1:2\n2:1"; key="ms";}
    }
    ok_button;
    }
LISP
  • (defun C:mash ()
    (setq okno_print (load_dialog "Масштаб_вопрос.dcl")); Загрузка диалогового окна печати
    (if (not (new_dialog "mash" okno_print)) (exit)); Если нет файла dсl, то выход из программы
    ;блок определения коэффициента масштаба
    (action_tile "ms" "(setq mas (read $value))");читает значение масштаба
    (start_dialog)
    (unload_dialog okno_print)
    (if (= mas вписать)
    (setq mas 'вписать)
    (setq mas (vl-string->list mas);преобразует строку в список буквенно-цифровых знаков
    ms1 (car mas);извлекает из списка первое значение
    ms1 (vl-list->string ms1);преобразует код в строку
    ms1 (atof ms1)
    ms2 (cddr mas);извлекает из списка третье значение
    ms2 (vl-list->string ms2)
    ms2 (atof ms2)

    mas (/ ms1 ms2);вычисляет коэффициент масштаба
    );конец if
    )
    )
Просмотров: 7701
 
Непрочитано 06.07.2007, 14:48
#2
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Вместо строки
Код:
[Выделить все]
ms1 (vl-list->string ms1);преобразует код в строку
вставить
Код:
[Выделить все]
ms1 (vl-list->string (list ms1));преобразует код в строку
CB вне форума  
 
Непрочитано 06.07.2007, 14:59
#3
Zouss


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


у вас (или у меня ) переменная mas имеет не строковый тип, а целочисленный - номер выбранного пункта выпадающего списка
вот примернно то, что вы хотели получить
Код:
[Выделить все]
mash:dialog
{label
=
"Масштаб"				; 
:radio_column
{label=
""					; 
:popup_list
{label=
""					; 
key="ms";} 
}
ok_button				; 
}
Код:
[Выделить все]
(defun C:mash (/ okno_print llist mas p1 s1 s2)
  (vl-load-com)
  (setq okno_print (load_dialog "E:\\acad\\tmp.DCL"))
					; Загрузка диалогового окна печати 
  (if (not (new_dialog "mash" okno_print))
    (exit)
  )					; Если нет файла dсl, то выход из программы 
					;блок определения коэффициента масштаба
  (setq llist '("вписать" "1:1" "1:2" "2:1"))
  (start_list "ms")
  (mapcar 'add_list llist)
  (end_list)

  (action_tile "ms" "(setq mas (read $value))") ;читает значение масштаба 
  (start_dialog)
  (unload_dialog okno_print)
  (if (= mas 0)
    (setq mas 'вписать)
    (setq mas (nth mas llist)
	  p1  (vl-string-search ":" mas)
	  s1  (substr mas 1 p1)
	  s2  (substr mas (+ p1 2))
	  mas (/ (atof s1) (atof s2))
    ) ;_  setq
  ) ;_  if
  mas
) ;_  defun
Zouss вне форума  
 
Автор темы   Непрочитано 08.07.2007, 05:04
#4
Таня.


 
Регистрация: 29.06.2007
Владивосток
Сообщений: 50


Просто замечательный форум. Не только подсказали, но и программку написали. Класс!
Спасибо, вы меня здорово выручили.
То, что вместо желаемой строки, программа выдает порядковый номер, я еще смогла понять. А, что именно с ним можно и нужно делать – нет. :roll:
Еще один вопрос. Честно говоря, не поняла необходимость выделения символа ":" и замены его на "1". Урезала программу, оставила только:
s1 (substr mas 1)
s2 (substr mas 3)
Работает, однако (что и смущает). Можно обойтись и без переменной р1? :shock:
Таня. вне форума  
 
Непрочитано 08.07.2007, 07:27
#5
dextron3

проектировшик
 
Регистрация: 01.01.2007
СССР
Сообщений: 5,143


У меня вот что написал ЛИСП

Command: ; error: bad argument type: numberp: nil
__________________
инженер проектировшик с опттом программа авто гад образование высшие
dextron3 вне форума  
 
Автор темы   Непрочитано 08.07.2007, 11:56
#6
Таня.


 
Регистрация: 29.06.2007
Владивосток
Сообщений: 50


Цитата:
Сообщение от dextron3
У меня вот что написал ЛИСП
Command: ; error: bad argument type: numberp: nil
Скорее всего, что-то намудрили с вводом аргументов. Проверьте, правильно ли сформировали список. У меня программа работает идеально.
Таня. вне форума  
 
Непрочитано 08.07.2007, 16:38
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


1. Здесь все дело в функции nth - она выдает элемент списка по его порядковому номеру в списке, причем первый элемент списка с порядковым номером 0. Например (nth 2 llist) возратит "1:2".
2.При данном списке
Код:
[Выделить все]
(setq llist '("вписать" "1:1" "1:2" "2:1"))
переменная p1 не нужна, но а если вдруг понадобится масштаб "10:1"?
Так что ничего в программе менять не стоит...
CB вне форума  
 
Непрочитано 08.07.2007, 17:53
#8
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Забыл добавить
Цитата:
Урезала программу, оставила только:
s1 (substr mas 1)
s2 (substr mas 3)
Работает, однако (что и смущает). Можно обойтись и без переменной р1?
Работать не должна - нужно - s1 (substr mas 1 1), тогда можно обойтись без переменной p1 при данном списке...
CB вне форума  
 
Непрочитано 09.07.2007, 10:07
#9
Zouss


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


совершенно верно - p1 это позиция двоеточия в строке обозначающей выбранный масштаб, который может быть и 1:10 и 1:200, забавно еще то (vl-string-search и (substr по разному нумеруют символы в строке (substr начинает нумерацию с 1, в отличие от большинства других функций
Zouss вне форума  
 
Непрочитано 09.07.2007, 10:23 Re: ЛИСП для Масштаба чертежа
#10
T-Yoke

Артиллерист - вертолётчик. Дипломированный инженер-механик. Technologist
 
Регистрация: 29.11.2004
Где-то около Москвы
Сообщений: 16,527
Отправить сообщение для T-Yoke с помощью Skype™


Цитата:
Сообщение от Таня.
Пожалуйста, помогите решить простенькую задачку.
Оформляю программу печати чертежей для наших сотрудников...
А вообще, зачем вашим сотрудникам понадобилась такая программа, можете растолковать. Чем стандартные установки печати в автокаде не устраивают. Или вы не с автокадом работаете?
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I
T-Yoke вне форума  
 
Непрочитано 09.07.2007, 10:32
#11
Кулик Алексей aka kpblc
Moderator

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


Иииех, влезу-ка и я тож
Код:
[Выделить все]
(defun c:mash (/ okno_print llist mas p1 s1 s2)
  (vl-load-com)
  (setq okno_print (load_dialog "d:\\downloads\\dwg.ru\\таня\\main.DCL"))
  (if (not (new_dialog "mash" okno_print))
    (exit)
    ) ;_ end of if
  (setq llist (list (cons "вписать" 'вписать)
                    '("1:1" . 1.)
                    '("1:2" . 0.5)
                    '("2:1" . 2.)
                    ) ;_ end of list
        ) ;_ end of setq
  (start_list "ms")
  (mapcar 'add_list (mapcar 'car llist))
  (end_list)
  (action_tile "ms" "(setq mas (read $value))")
  (start_dialog)
  (unload_dialog okno_print)
  (cond
    ((or (not mas) (= mas 0)) (cdar llist))
    (t (cdr (nth mas llist)))
    ) ;_ end of cond
  ) ;_ end of defun
Работает? Я не проверял...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2007, 10:43
#12
Zouss


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


куда ж оно денется, ежели путь к окну диалога прописать правильный
Zouss вне форума  
 
Непрочитано 09.07.2007, 10:53
#13
Кулик Алексей aka kpblc
Moderator

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


> Zouss : я не про путь. Я про методику списка и выдачи конечного результата. По-моему, если в dcl сразу нажать Enter, то mas будет nil. Или нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2007, 12:18
#14
Zouss


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


нет - все корректно работает, спицияльно, прежде чем предыдущий пост залепить проверил
Zouss вне форума  
 
Непрочитано 09.07.2007, 12:31
#15
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Ну если пошли варианты, то можно еще проще
DCL
Код:
[Выделить все]
mash:dialog {label = "Масштаб"; 
:radio_column {label=""; 
:popup_list {label=""; 
list="вписать\n1:1\n1:2\n2:1"; key="ms";}
} 
ok_button; 
}
LISP
Код:
[Выделить все]
(defun C:mash ( /)
  (setq okno_print (load_dialog "Масштаб_вопрос.dcl"))
  (if (not (new_dialog "mash" okno_print))
    (exit)
  )
  (action_tile "ms" "(setq mas (cadr (assoc (read $value) '((0 Вписать) (1 1.) (2 0.5) (3 2.)))))")
  (start_dialog)
  (unload_dialog okno_print)
  (if (not mas) (setq mas 'вписать) mas)
)
CB вне форума  
 
Непрочитано 09.07.2007, 12:45
#16
Кулик Алексей aka kpblc
Moderator

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


При достаточно длинных списках такой подход не гуд - лучше делать через add_list (см.Полещука)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.07.2007, 12:12 Re: ЛИСП для Масштаба чертежа
#17
Таня.


 
Регистрация: 29.06.2007
Владивосток
Сообщений: 50


Цитата:
Сообщение от T-Yoke
А вообще, зачем вашим сотрудникам понадобилась такая программа, можете растолковать. Чем стандартные установки печати в автокаде не устраивают.
Мои сотрудницы – просто умницы. Автокад освоили в кратчайшие сроки и успешно в нем работают. Для меня же по сей день остается загадкой, почему нечто сложное далось им легко, а не легком, спотыкаются. Настройки печати приходится время от времени менять – то на принтере (А3, А2), то на плоттере печатаем. И для них это сложно. А я все необходимое - принтер, формат, масштаб - вывела на одно окошко. Все просто и ясно.
Таня. вне форума  
 
Непрочитано 10.07.2007, 13:07
#18
Zouss


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


и появился инструмент для стандартизации процесса печати
Zouss вне форума  
 
Непрочитано 10.07.2007, 13:44
#19
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от CB
Ну если пошли варианты, то можно еще проще
DCL
Код:
[Выделить все]
mash:dialog {label = "Масштаб"; 
:radio_column {label=""; 
:popup_list {label=""; 
list="вписать\n1:1\n1:2\n2:1"; key="ms";}
} 
ok_button; 
}
LISP
Код:
[Выделить все]
(defun C:mash ( /)
  (setq okno_print (load_dialog "Масштаб_вопрос.dcl"))
  (if (not (new_dialog "mash" okno_print))
    (exit)
  )
  (action_tile "ms" "(setq mas (cadr (assoc (read $value) '((0 Вписать) (1 1.) (2 0.5) (3 2.)))))")
  (start_dialog)
  (unload_dialog okno_print)
  (if (not mas) (setq mas 'вписать) mas)
)
radio_column я бы заменил на boxed_row
и обязательно значение масштаба в локальные
IMHO:

Код:
[Выделить все]
(defun C:mash ( / mas)...
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 10.07.2007, 15:39
#20
Таня.


 
Регистрация: 29.06.2007
Владивосток
Сообщений: 50


Цитата:
Сообщение от Zouss
и появился инструмент для стандартизации процесса печати
Ну, что тут поделаешь. Я же обещала им, что Автокад будет проще и интереснее кульмана… Приходится отвечать за свои слова.
Таня. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП для Масштаба чертежа

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