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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программка MassDen - помогите разобраться.

Программка MassDen - помогите разобраться.

Ответ
Поиск в этой теме
Непрочитано 14.07.2005, 21:44 #1
Программка MassDen - помогите разобраться.
Cnapmak
 
г. Гомель
Регистрация: 11.09.2004
Сообщений: 65

В разделе Dowload я выложил программку "MassDen Определение объема и массы 3D тела" - http://dwg.ru/dwl/index.php?id=303 , а в комментарии - проблеммки с которыми пришлось столкнуться.
Думаю, что ничего сложного, но я в этом деле близок к барану
Помогите, пожалуйста.
Просмотров: 4495
 
Непрочитано 14.07.2005, 22:32
#2
Askerovich

Askerovich.com
 
Регистрация: 03.12.2004
Киев
Сообщений: 462
Отправить сообщение для Askerovich с помощью Skype™


Цитата:
проблеммки с которыми пришлось столкнуться.
думаю стоит описать проблемы с которыми ты столкнулся
Цитата:
я в этом деле близок к барану
зачем же так занижать свое самомнение?
Askerovich вне форума  
 
Автор темы   Непрочитано 15.07.2005, 10:52
#3
Cnapmak


 
Регистрация: 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 полимеров ввести. Как это сделать?
Cnapmak вне форума  
 
Непрочитано 15.07.2005, 11:47
#4
Кулик Алексей aka kpblc
Moderator

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


Я с точки зрения полного ламера в программировании диалоговых окон, так что прошу ногами по голове в прыжках не охаживать
Если серьезно, то ИМХО надо переменные либо сделать локальными, либо - уникальные имена им дать. Да и с диалоговыми окнами, я так подозреваю, похожая история.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.07.2005, 20:33
#5
Cnapmak


 
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65


Цитата:
Сообщение от kpblc
надо переменные либо сделать локальными, либо - уникальные имена им дать. Да и с диалоговыми окнами, я так подозреваю, похожая история.
Спасибо за подсказку, но для меня это примерно то же, если я начну Вам объяснять проблему ориентации стекловолокна в среде ПБТ при одноточечном впрыске.
Cnapmak вне форума  
 
Непрочитано 18.07.2005, 08:12
#6
Кулик Алексей aka kpblc
Moderator

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


Намек понял.
Для варианта "уникальные имена":
В коде, что повыше, надо либо заменить строку вида
Код:
[Выделить все]
(setq mo_den "1")
на нечто напоминающее
Код:
[Выделить все]
(setq mass-plast-mo_den "1")
для пластмасс,
Код:
[Выделить все]
(setq mass-steel-mo_den "1")
для сталей и т.п. В таком случае имена переменных не будут повторяться и не будет попыток переназначения и чтения имеющихся значений. ИМХО самый простой способ, вдобавок в данном случае обладающий (?) преимуществом: при повторном обращении к данной функции в текущей сессии када будет произведено чтение уже записанных переменных.
Для варианта "локальные переменные":
В именование функции (defun...) заменить
Код:
[Выделить все]
(defun C:MassPlast ()
на
Код:
[Выделить все]
(defun C:MassPlast ( / ent dcl_id mo_den vol)
и т.д., т.е. в скобках после символа "/" перечислить все используемые переменные. В таком случае при выходе из функции их значения будут обнуляться.
Насчет диалоговых окон у меня все на уровне тихого подозрения, не более - ну не работал я с ними, каюсь, виновен. И поведение переменных (если они там используются) соответственно предсказать не могу. Но, для гарантии, какой-то из выбранных методов и там бы использовал. Чтобы уж точно не было попыток переписать установленные значения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.07.2005, 01:16
#7
Cnapmak


 
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65


Спасибо - попробую. А почему эта программка не принимает больше 10 наименований материалов?
Cnapmak вне форума  
 
Непрочитано 19.07.2005, 09:42
#8
Кулик Алексей aka kpblc
Moderator

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


Опять-таки, ИМХО.
Проверь (и, возможно, измени) строки вида
Код:
[Выделить все]
(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
Если изменить fldsize на нечто вида
Код:
[Выделить все]
' ("1,05" "0,91" "0,92" "0,95" "1,13" "1,35" "1,04" "1,20" "1,19" "1,25" [b]"1,35" "1,5" "1,7" "1,9" "2"[/b])
Т.е. изменить размер списка? По-моему, это единственное место, где прямо указывается количество чего бы то ни было, равное 10.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.07.2005, 22:14
#9
Cnapmak


 
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65


Спасибо. Но пока я ничего не делал. Нашел автора программы. Послал ему письмо с этой ссылкой - может заскочит, поможет разобраться.
Cnapmak вне форума  
 
Автор темы   Непрочитано 24.07.2005, 15:09
#10
Cnapmak


 
Регистрация: 11.09.2004
г. Гомель
Сообщений: 65


Ну вот и все что требовалось - Денис переработал прогу, за что ему огромное спасибо - новую версию я выложил.
Cnapmak вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программка MassDen - помогите разобраться.