|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Программка MassDen - помогите разобраться.
г. Гомель
Регистрация: 11.09.2004
Сообщений: 65
|
||
Просмотров: 4495
|
|
||||
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65
|
Но там, вроде бы я все описал как есть.
Я клонировал ЛИСП и DCL-файл, затем и там и там заменил MassDen на MassPlast, поменял аргументы (названия материалов в DCL-файле и плотность в ЛИСПе) Вот что получилось: ЛИСП ;^C^C^P(if (null c:MassPlast)(load "MassPlast")) MassPlast ;Масса пластмассовых деталей (defun C:MassPlast () (vl-load-com) (if (setq ENT (ssget '((0 . "3DSOLID")))) (if (setq ENT (vl-remove-if-not 'atom (mapcar 'cadr (ssnamex ENT)))) (if (findfile "MassPlast.dcl") (progn (setq DCL_ID (load_dialog "MassPlast.dcl")) (if (not (new_dialog "MassPlast" DCL_ID)) (exit) ) (setq mo_den "1") (setq vol (apply '+ (mapcar '(lambda (X) (vla-get-volume (vlax-ename->vla-object X))) ENT))) (setq vol (* 1e-006 vol)) (set_tile "vol" (strcat "Объем " (itoa (length ENT)) " дет.: "(rtos vol 2 3) " л")) (massa_fun1) (massa_fun) (action_tile "mo_den" "(setq mo_den $value)(massa_fun1)(massa_fun)") (action_tile "plt" "(setq plt $value)(massa_fun)") (action_tile "accept" "(done_dialog)(setq ok_button T)") (action_tile "cancel" "(done_dialog)(setq ok_button nil)") (start_dialog) ) (UNLOAD_DIALOG DCL_ID) ) )) (if (= ok_button T) (PROGN (setq obj (car (entsel "\nВыберите текст для редактирования:" )) data (entget obj)) (if (or (eq (cdr (assoc 0 data)) "TEXT")(eq (cdr (assoc 0 data)) "MTEXT")) (progn (setq text_obj (assoc 1 data) data (subst (cons '1 massa) text_obj data)) (entmod data) (entupd (cdar data)) (entupd obj) (redraw))))) (princ) ) (defun massa_fun1 () (setq flsize ' ("1,05" "0,91" "0,92" "0,95" "1,13" "1,35" "1,04" "1,20" "1,19" "1,25") plt (nth (atoi mo_den) flsize)) ) (defun massa_fun () (set_tile "plt" plt) (setq massa (* vol (atof (vl-string-subst "." "," plt)))) (if ( > massa 1) (setq massa (rtos massa 2 1)) (if ( > massa 0.1) (setq massa (rtos massa 2 2)) (if ( > massa 0.001) (setq massa (strcat (rtos (* massa 1000) 2 0) "г")) (setq massa (strcat (rtos (* massa 1000) 2 1) "г"))))) (setq massa (vl-string-subst "," "." massa)) (set_tile "massa" massa) ) (princ) DCL-файл MassPlast : dialog { label = "Масса пластмассовых деталей"; fixed_width = true; :text { key = "vol"; alignment = centered; } : popup_list{ key = "mo_den"; list = "Полистирол" "\nПолипропилен" "\nПолиэтилен ВД" "\nПолиэтилен НД" "\nПолиамид 6" "\nПолиамид 6 210КС" "\nСополимер АБС" "\nПоликарбонат" "\nДакрил 2М" "\nЭтрол"; edit_width = 25; value = 1; } :row { :text { label = "Плотность"; } :edit_box { key="plt"; edit_width=4; } :text { label = "г./куб.см."; } } :row { :text { label = "Масса "; } :edit_box { key="massa"; edit_width=5; } : ok_button { label="Текст";} } : cancel_button { label="Выход"; width = 30;} } Теперь, если я запускаю программу MassDen (исходный вариант) впервые, то все работает нормально: Но если запустил MassPlast, а затем снова MassDen, то плотность металла программа берет из MassPlast, т.е. к примеру плотность стали принимает 1,05 как у полистирола. И еще: добавить в програмуу можно только до 10 материалов, а мне нужно хотя бы 30-35 полимеров ввести. Как это сделать? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409
|
Я с точки зрения полного ламера в программировании диалоговых окон, так что прошу ногами по голове в прыжках не охаживать
![]() Если серьезно, то ИМХО надо переменные либо сделать локальными, либо - уникальные имена им дать. Да и с диалоговыми окнами, я так подозреваю, похожая история.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409
|
Намек понял.
Для варианта "уникальные имена": В коде, что повыше, надо либо заменить строку вида Код:
Код:
Код:
Для варианта "локальные переменные": В именование функции (defun...) заменить Код:
Код:
Насчет диалоговых окон у меня все на уровне тихого подозрения, не более - ну не работал я с ними, каюсь, виновен. И поведение переменных (если они там используются) соответственно предсказать не могу. Но, для гарантии, какой-то из выбранных методов и там бы использовал. Чтобы уж точно не было попыток переписать установленные значения.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409
|
Опять-таки, ИМХО.
Проверь (и, возможно, измени) строки вида Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |