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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подсчтёт моментов инерции любых сечений в Акаде

Подсчтёт моментов инерции любых сечений в Акаде

Ответ
Поиск в этой теме
Непрочитано 15.04.2008, 13:09 #1
Подсчтёт моментов инерции любых сечений в Акаде
Witalij
 
AL-остекление, фасадка, оконка
 
Москва
Регистрация: 25.07.2007
Сообщений: 113

Нашёл лиспик для подсчёта мом-ов инерции, центра и главных осей.
Скрипт заточен под английский акад - я его перевёл, но он что-то странно считает.

Посмотрите плиз, правильно-ли я его переделал и, может быть, есть более удобные программы?

Оригинальный скрипт для английского акада:
Код:
[Выделить все]
(defun C:SQP ()
(setvar "CMDECHO" 0)
(setq nab (ssget))
(setq Iy 0.0
      Ix 0.0
      Ixy 0.0
      sq 0.0
      CentT  '(0.0 0.0))
(initget 0)
(setq stepP (getreal "\nStep for pattern:"))
;---------------------------------------------------
(repeat 2
   ;------------------------------------------------
   (setq nabxP (ssadd) 
         nabyP (ssadd)
         Sy 0.0
         Sy_y 0.0
         Sy_x 0.0
         Sx 0.0
         Sx_x 0.0
         Sx_y 0.0
         Iy_y 0.0
         Iy_x 0.0
         Ixy_x 0.0
         Ix_x 0.0
         Ix_y 0.0
         Ixy_y 0.0
         sqP 0.0)
   ;-----------------------------------------------
   (command "POINT" '(0.0 0.0 0.0))
   (setq nameS (entlast)
         name     nameS)
   (command "HATCH" "U" 0.0 stepP "N" nab "")
   (command "EXPLODE" (list (entlast) '(0.0 0.0 0.0)))
   (princ "\nTo create collection X...\n")
   (setq n 0)
   (while (setq name (entnext name))
          (ssadd name nabxP)
          (princ "\r")(princ (setq n (1+ n)))
   )
   (entdel nameS)
   ;------------------------------------------------
   (command "POINT" '(0.0 0.0 0.0))
   (setq nameS (entlast) 
         name     nameS)
   (command "HATCH" "U" 90.0 stepP "N" nab "")
   (command "EXPLODE" (list (entlast) '(0.0 0.0 0.0)))
   (princ "\nTo create collection Y...\n")
   (setq n 0)
   (while (setq name (entnext name))
          (ssadd name nabyP)
          (princ "\r")(princ (setq n (1+ n)))
   )
   (entdel nameS)
   ;-----------------------------------------------
   (setq n -1)
   (princ "\nCount statical moment Sx...\n")
   (repeat (sslength nabxP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabxP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqP (+ sqP (setq sqE (* longE stepP)))
                 yE  (cadr ptsE)
                 xE  (/ (+ (car ptsE) (car pteE)) 2)
                 Sx_x  (+ Sx_x (* sqE yE))
                 Sy_x  (+ Sy_x (* sqE xE))
           )
           (princ "\r")(princ n)
   )
   ;---------------------------------------------------
   (setq n -1)
   (princ "\nCount statical moment Sy...\n")
   (repeat (sslength nabyP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabyP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 xE  (car ptsE)
                 yE  (/ (+ (cadr ptsE) (cadr pteE)) 2)
                 Sy_y  (+ Sy_y (* sqE xE ))
                 Sx_y  (+ Sx_y (* sqE yE))
           )
           (princ "\r")(princ n)
   )
   ;----------------------------------------------------
   (command "POINT" (setq ptc (list
                                (setq ptx (/ (+ Sy_y Sy_x) 2 sqP))
                                (setq pty (/ (+ Sx_x Sx_y) 2 sqP)))))
   ;----------------------------------------------------
   (princ "\nCount Ix...\n")
   (setq n -1)
   (repeat (sslength nabxP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabxP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 yE  (- (cadr ptsE) pty)
                 xE  (- (/ (+ (car ptsE) (car pteE)) 2) ptx)
                 Iex (/ (* longE (expt stepP 3.0)) 12)
                 Iey (/ (* stepP (expt longE 3.0)) 12)
                 Ix_x  (+ Ix_x Iex (* sqE (expt yE 2)))
                 Iy_x  (+ Iy_x Iey (* sqE (expt xE 2)))
                 Ixy_x (+ Ixy_x (* sqE xE yE))
           )
           (princ "\r")(princ n)
   )
   ;--------------------------------------------------
   (princ "\nCount Iy...\n")
   (setq n -1)
   (repeat (sslength nabyP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabyP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 xE  (- (car ptsE) ptx)
                 yE  (- (/ (+ (cadr ptsE) (cadr pteE)) 2) pty)
                 Iey (/ (* longE (expt stepP 3.0)) 12)
                 Iex (/ (* stepP (expt longE 3.0)) 12)
                 Iy_y  (+ Iy_y Iey (* sqE (expt xE 2)))
                 Ix_y  (+ Ix_y Iex (* sqE (expt yE 2)))
                 Ixy_y (+ Ixy_y (* sqE xE yE))
           )
           (princ "\r")(princ n)
   )
   ;----------------------------------------------
   (setq Ix  (+ Ix  (/ (+ Ix_x Ix_y) 2))
         Iy  (+ Iy  (/ (+ Iy_y Iy_x) 2))
         Ixy (+ Ixy (/ (+ Ixy_y Ixy_x) 2))
         SQ  (+ SQ sqP)
         CentT (mapcar '+ CentT (trans ptc 1 0)))
(command "ERASE" nabxP nabyP "" 
         "UCS" "O" (list (/ stepP 2) (/ stepP 2)))
)
(command "UCS" "W")
(setvar "CMDECHO" 1)
(setq Ix (/ Ix 2)
      Iy (/ Iy 2)
      Ixy (/ Ixy 2)
      Ips (/ (+ Ix Iy) 2)
      Ipr (/ (- Ix Iy) 2)
      SQ (/ SQ 2)
      CentT (list (/ (car  CentT) 2)(/ (cadr CentT) 2))
      Imax (+ Ips (sqrt (+ (expt Ipr 2) (expt Ixy 2))))
      Imin (- Ips (sqrt (+ (expt Ipr 2) (expt Ixy 2))))
      Alfa (atan (- 0.0 (/ Ixy (- Imax (min Ix Iy))))))
(command "LINE" (polar CentT Alfa 100.0)
                   CentT 
                   (polar CentT (+ Alfa (/ pi 2)) 100.0) "")
 
   (princ "\n Ix = ")   (princ  Ix)
   (princ "\n Iy = ")   (princ  Iy)
   (princ "\n Ixy = ")  (princ  Ixy)
   (princ "\n Imax = ") (princ Imax)
   (princ "\n Imin = ") (princ Imin)
   (princ "\n S = ")    (princ SQ)
)
Мною правленый скрипт:
Код:
[Выделить все]
(defun C:SQP ()
(setvar "CMDECHO" 0)
(setq nab (ssget))
(setq Iy 0.0
      Ix 0.0
      Ixy 0.0
      sq 0.0
      CentT  '(0.0 0.0))
(initget 0)
(setq stepP (getreal "\nStep for pattern:"))
;---------------------------------------------------
(repeat 2
   ;------------------------------------------------
   (setq nabxP (ssadd) 
         nabyP (ssadd)
         Sy 0.0
         Sy_y 0.0
         Sy_x 0.0
         Sx 0.0
         Sx_x 0.0
         Sx_y 0.0
         Iy_y 0.0
         Iy_x 0.0
         Ixy_x 0.0
         Ix_x 0.0
         Ix_y 0.0
         Ixy_y 0.0
         sqP 0.0)
   ;-----------------------------------------------
   (command "_POINT" '(0.0 0.0 0.0))
   (setq nameS (entlast)
         name     nameS)
   (command "_HATCH" "_U" 0.0 stepP "Н" nab "")
   (command "_EXPLODE" (list (entlast) '(0.0 0.0 0.0)))
   (princ "\nTo create collection X...\n")
   (setq n 0)
   (while (setq name (entnext name))
          (ssadd name nabxP)
          (princ "\r")(princ (setq n (1+ n)))
   )
   (entdel nameS)
   ;------------------------------------------------
   (command "_POINT" '(0.0 0.0 0.0))
   (setq nameS (entlast) 
         name     nameS)
   (command "_HATCH" "_U" 90.0 stepP "Н" nab "")
   (command "_EXPLODE" (list (entlast) '(0.0 0.0 0.0)))
   (princ "\nTo create collection Y...\n")
   (setq n 0)
   (while (setq name (entnext name))
          (ssadd name nabyP)
          (princ "\r")(princ (setq n (1+ n)))
   )
   (entdel nameS)
   ;-----------------------------------------------
   (setq n -1)
   (princ "\nCount statical moment Sx...\n")
   (repeat (sslength nabxP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabxP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqP (+ sqP (setq sqE (* longE stepP)))
                 yE  (cadr ptsE)
                 xE  (/ (+ (car ptsE) (car pteE)) 2)
                 Sx_x  (+ Sx_x (* sqE yE))
                 Sy_x  (+ Sy_x (* sqE xE))
           )
           (princ "\r")(princ n)
   )
   ;---------------------------------------------------
   (setq n -1)
   (princ "\nCount statical moment Sy...\n")
   (repeat (sslength nabyP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabyP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 xE  (car ptsE)
                 yE  (/ (+ (cadr ptsE) (cadr pteE)) 2)
                 Sy_y  (+ Sy_y (* sqE xE ))
                 Sx_y  (+ Sx_y (* sqE yE))
           )
           (princ "\r")(princ n)
   )
   ;----------------------------------------------------
   (command "_POINT" (setq ptc (list
                                (setq ptx (/ (+ Sy_y Sy_x) 2 sqP))
                                (setq pty (/ (+ Sx_x Sx_y) 2 sqP)))))
   ;----------------------------------------------------
   (princ "\nCount Ix...\n")
   (setq n -1)
   (repeat (sslength nabxP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabxP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 yE  (- (cadr ptsE) pty)
                 xE  (- (/ (+ (car ptsE) (car pteE)) 2) ptx)
                 Iex (/ (* longE (expt stepP 3.0)) 12)
                 Iey (/ (* stepP (expt longE 3.0)) 12)
                 Ix_x  (+ Ix_x Iex (* sqE (expt yE 2)))
                 Iy_x  (+ Iy_x Iey (* sqE (expt xE 2)))
                 Ixy_x (+ Ixy_x (* sqE xE yE))
           )
           (princ "\r")(princ n)
   )
   ;--------------------------------------------------
   (princ "\nCount Iy...\n")
   (setq n -1)
   (repeat (sslength nabyP)
           (setq longE (distance 
                         (setq ptsE
                              (trans 
                              (cdr (assoc 10 
                                   (setq lst (entget 
                                             (setq nameE (ssname nabyP 
                                                         (setq n (1+ n)))))
                                   )
                                   )
                              ) nameE 1)
                         )
                         (setq pteE (trans (cdr (assoc 11 lst)) nameE 1)))
                 sqE (* longE stepP)
                 xE  (- (car ptsE) ptx)
                 yE  (- (/ (+ (cadr ptsE) (cadr pteE)) 2) pty)
                 Iey (/ (* longE (expt stepP 3.0)) 12)
                 Iex (/ (* stepP (expt longE 3.0)) 12)
                 Iy_y  (+ Iy_y Iey (* sqE (expt xE 2)))
                 Ix_y  (+ Ix_y Iex (* sqE (expt yE 2)))
                 Ixy_y (+ Ixy_y (* sqE xE yE))
           )
           (princ "\r")(princ n)
   )
   ;----------------------------------------------
   (setq Ix  (+ Ix  (/ (+ Ix_x Ix_y) 2))
         Iy  (+ Iy  (/ (+ Iy_y Iy_x) 2))
         Ixy (+ Ixy (/ (+ Ixy_y Ixy_x) 2))
         SQ  (+ SQ sqP)
         CentT (mapcar '+ CentT (trans ptc 1 0)))
(command "_ERASE" nabxP nabyP "" 
         "_UCS" "_O" (list (/ stepP 2) (/ stepP 2)))
)
(command "_UCS" "_W")
(setvar "CMDECHO" 1)
(setq Ix (/ Ix 2)
      Iy (/ Iy 2)
      Ixy (/ Ixy 2)
      Ips (/ (+ Ix Iy) 2)
      Ipr (/ (- Ix Iy) 2)
      SQ (/ SQ 2)
      CentT (list (/ (car  CentT) 2)(/ (cadr CentT) 2))
      Imax (+ Ips (sqrt (+ (expt Ipr 2) (expt Ixy 2))))
      Imin (- Ips (sqrt (+ (expt Ipr 2) (expt Ixy 2))))
      Alfa (atan (- 0.0 (/ Ixy (- Imax (min Ix Iy))))))
(command "_LINE" (polar CentT Alfa 100.0)
                   CentT 
                   (polar CentT (+ Alfa (/ pi 2)) 100.0) "")
 
   (princ "\n Ix = ")   (princ  Ix)
   (princ "\n Iy = ")   (princ  Iy)
   (princ "\n Ixy = ")  (princ  Ixy)
   (princ "\n Imax = ") (princ Imax)
   (princ "\n Imin = ") (princ Imin)
   (princ "\n S = ")    (princ SQ)
)
P.S.
Кто-нибудь знает, откуда вообще этот скрипт? Кто автор и т.д.?
__________________
Фасадку черчу...
Просмотров: 3349
 
Непрочитано 15.04.2008, 13:48
#2
Vavan Metallist


 
Регистрация: 30.01.2008
Україна, Львів
Сообщений: 6,057


АВТОКАД и без лиспов считает моменты инерции любых сечений.
Vavan Metallist вне форума  
 
Непрочитано 15.04.2008, 13:51
#3
Кулик Алексей aka kpblc
Moderator

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


При одном условии - если они сделаны областями (region). Или это вообще 3DSolid'ы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.04.2008, 13:52
#4
Witalij

AL-остекление, фасадка, оконка
 
Регистрация: 25.07.2007
Москва
Сообщений: 113
<phrase 1=


Цитата:
Сообщение от Vavan Metallist Посмотреть сообщение
АВТОКАД и без лиспов считает моменты инерции любых сечений.
Акад считает характ-ки сечений вроде тоько для солидов и регионов. к тому-же не рисует центральные оси. и считаетт момент инерции относительно координаты 0,0,0.
Неудобно это.

PS - Алексей, блин, раньше успел!
__________________
Фасадку черчу...
Witalij вне форума  
 
Непрочитано 15.04.2008, 13:52
#5
Vavan Metallist


 
Регистрация: 30.01.2008
Україна, Львів
Сообщений: 6,057


[quote=Кулик Алексей aka kpblc;232772]При одном условии - если они сделаны областями (region).

Точно!
Vavan Metallist вне форума  
 
Непрочитано 15.04.2008, 14:00
#6
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


В тексте lisp не стал разбираться, но вопрос такой: там перемещение центра тяжести (инерции) в 0 координат учтён? Иначе рез-ты будут не совсем верными.
Цитата:
Сообщение от Vavan Metallist Посмотреть сообщение
АВТОКАД и без лиспов считает моменты инерции любых сечений.
Вот-вот... Область/регион, далее массовые хар-ки, смотришь отклонение центра инерции, перемещаешь в 0 и ещё раз массовые характеристики.
__________________
Век живи, век учись - ...
Bull вне форума  
 
Автор темы   Непрочитано 15.04.2008, 14:05
#7
Witalij

AL-остекление, фасадка, оконка
 
Регистрация: 25.07.2007
Москва
Сообщений: 113
<phrase 1=


Цитата:
Сообщение от Bull Посмотреть сообщение
В тексте lisp не стал разбираться, но вопрос такой: там перемещение центра тяжести (инерции) в 0 координат учтён? Иначе рез-ты будут не совсем верными.
Вот-вот... Область/регион, далее массовые хар-ки, смотришь отклонение центра инерции, перемещаешь в 0 и ещё раз массовые характеристики.
Перенос ц.т. в 0 учтён.
Скриптик вообще работает весело - штрихует сечение, затем взрывает штриховку, и считает вроде-бы произведение длины каждой линии на растояние - короче. берёт "типа интеграл площадь*растояние" по всей фигуре

Жутко ломово передвигать начало координат туда-сюда, только чтобы взять момент инерции...( Да ещё и в регион превращать. У меня сечения обычто в дин.блоках. потому и лисп пользую. Раньше-то я регионами считал.

PS Скрипт часто оси симметричных сечений рисует несимметрично
__________________
Фасадку черчу...

Последний раз редактировалось Witalij, 15.04.2008 в 14:21.
Witalij вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подсчтёт моментов инерции любых сечений в Акаде

Опции темы Поиск в этой теме
Поиск в этой теме:

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