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

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

Момент инерции

Ответ
Поиск в этой теме
Непрочитано 10.01.2006, 06:20 #1
Момент инерции
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,837

Здравствуйте. С праздниками!
Есть в автокаде такая замечательная команда - massprop, считает характеристики регионов и объёмов. Можно-ли как-то программно вытащить их в переменную(ые)? К примеру в команде area площадь и периметр записываются в переменные соответственно AREA и PERIMETER - очень удобно. (в massprop и эти не работают). То-же по команде LIST. :?:
Просмотров: 7306
 
Непрочитано 10.01.2006, 08:59
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй такое (сделано по максимуму, если что надо добавить / исключить, сообщи):
Код:
[Выделить все]
(defun _kpblc-get-region (/ ent res)
  (vl-load-com)
  (if (and (setq ent (entsel))
           (= (cdr (assoc 0 (entget (car ent)))) "REGION")
           ) ;_ end of and
    (setq ent (vlax-ename->vla-object (car ent))
          res (list
                (cons "area" (vla-get-area ent))
                (cons
                  "centroid"
                  (vlax-safearray->list (vlax-variant-value (vla-get-centroid ent)))
                  ) ;_ end of cons
                (cons "moment"
                      (vlax-safearray->list
                        (vlax-variant-value (vla-get-momentofinertia ent))
                        ) ;_ end of vlax-safearray->list
                      ) ;_ end of cons
                (cons "perimeter" (vla-get-perimeter ent))
                (cons "principal_moment"
                      (vlax-safearray->list
                        (vlax-variant-value (vla-get-principalmoments ent))
                        ) ;_ end of vlax-safearray->list
                      ) ;_ end of cons
                (cons "prod_inert" (vla-get-productofinertia ent))
                (cons "rad_gyration"
                      (vlax-safearray->list
                        (vlax-variant-value (vla-get-radiiofgyration ent))
                        ) ;_ end of vlax-safearray->list
                      ) ;_ end of cons
                ) ;_ end of list
          ) ;_ end of setq
    ) ;_ end of if
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.01.2006, 11:30
#3
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


to kpblc
Отлично! Спасибо.
Только можно еще и Bounding box выдать?
Что такое vla-get-area? Я не нашел такой функции и нигде не объявлена.
Krieger вне форума  
 
Непрочитано 10.01.2006, 11:35
#4
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun _kpblc-get-region (/ ent res minp maxp)
  (vl-load-com)
  (if (and (setq ent (entsel))
           (= (cdr (assoc 0 (entget (car ent)))) "REGION")
           ) ;_ end of and
    (progn
      (setq ent (vlax-ename->vla-object (car ent))
            res (list
                  (cons "area" (vla-get-area ent))
                  (cons
                    "centroid"
                    (vlax-safearray->list
                      (vlax-variant-value (vla-get-centroid ent))
                      ) ;_ end of vlax-safearray->list
                    ) ;_ end of cons
                  (cons "moment"
                        (vlax-safearray->list
                          (vlax-variant-value (vla-get-momentofinertia ent))
                          ) ;_ end of vlax-safearray->list
                        ) ;_ end of cons
                  (cons "perimeter" (vla-get-perimeter ent))
                  (cons "principal_moment"
                        (vlax-safearray->list
                          (vlax-variant-value (vla-get-principalmoments ent))
                          ) ;_ end of vlax-safearray->list
                        ) ;_ end of cons
                  (cons "prod_inert" (vla-get-productofinertia ent))
                  (cons "rad_gyration"
                        (vlax-safearray->list
                          (vlax-variant-value (vla-get-radiiofgyration ent))
                          ) ;_ end of vlax-safearray->list
                        ) ;_ end of cons
                  ) ;_ end of list
            ) ;_ end of setq
      (vla-getboundingbox ent 'minp 'maxp)
      (setq res (append res
                        (list (cons "minp" (vlax-safearray->list minp))
                              (cons "maxp" (vlax-safearray->list maxp))
                              ) ;_ end of list
                        ) ;_ end of append
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
Тут добавлено minp и maxp - соотвественно минимальная и максимальная точки бокса.
Насчет всего остального: (vlax-get-property ent 'area) и (vla-get-area ent) одно и то же. Свойства и методы можно посмотреть через (vlax-dump-object ent). Соответсвтенно для области (она же регион) вываливается примерно следующее:
Код:
[Выделить все]
(vlax-dump-Object (vlax-ename->vla-object (car (entsel))) t)
; IAcadRegion: AutoCAD Region Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00b9b5e4>
;   Area (RO) = 154914.0
;   Centroid (RO) = (854.925 459.552)
;   Document (RO) = #<VLA-OBJECT IAcadDocument 01120cd0>
;   Handle (RO) = "104"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 059ace14>
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   MomentOfInertia (RO) = (3.54201e+010 1.14994e+011)
;   Normal (RO) = (0.0 0.0 1.0)
;   ObjectID (RO) = 2130153632
;   ObjectName (RO) = "AcDbRegion"
;   OwnerID (RO) = 2130066680
;   Perimeter (RO) = 1605.28
;   PlotStyleName = "ByLayer"
;   PrincipalDirections (RO) = (0.521942 -0.852981 0.852981 0.521942)
;   PrincipalMoments (RO) = (1.20737e+009 3.26441e+009)
;   ProductOfInertia (RO) = 6.17789e+010
;   RadiiOfGyration (RO) = (478.167 861.573)
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 059ae010>
;   Visible = -1
; Methods supported:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Boolean (2)
;   Copy ()
;   Delete ()
;   Explode ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
Т.е. используя (vlax-get-property) для объекта в форме, как повыше было, можно получить все что угодно, например, (vlax-get-property ent 'layer) вернет "0". (vla-get-layer ent) тоже вернет "0". Фактически просто более короткая запись того же самого.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.01.2006, 12:05
#5
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
(vlax-get-property ent 'area) и (vla-get-area ent) одно и то же
однако...
Все, дошло. Еще раз спасибо.
Krieger вне форума  
 
Непрочитано 10.01.2006, 18:20
#6
NIVa

инженер-конструктор
 
Регистрация: 08.09.2003
Москва
Сообщений: 108


Добрый вечер, господа!!!
В рамках этой тамы хотелось бы получить совет (ответ, указание и пр.) на:
1. Вот результат полученный после активизазии команды massprop для швеллера №12:
Для по ГОСТ 8240
Area: 1327.7713
Perimeter: 428.0991
Bounding box: X: -15.4000 -- 36.6000
Y: -60.0000 -- 60.0000
Centroid: X: 1.1744
Y: 0.0000
Moments of inertia: X: 3049355.2044
Y: 350540.9015
Product of inertia: XY: 0.0000
Radii of gyration: X: 47.9228
Y: 16.2483
Principal moments and X-Y directions about centroid:
I: 348709.6427 along [0.0000 -1.0000]
J: 3049355.2044 along [1.0000 0.0000]
или (вылавливал центр тяжести):
---------------- REGIONS ----------------

Area: 1327.7713
Perimeter: 428.0991
Bounding box: X: -16.5744 -- 35.4256
Y: -60.0000 -- 60.0000
Centroid: X: 0.0000
Y: 0.0000
Moments of inertia: X: 3049355.2044
Y: 348709.6427
Product of inertia: XY: 0.0000
Radii of gyration: X: 47.9228
Y: 16.2058
Principal moments and X-Y directions about centroid:
I: 348709.6427 along [0.0000 -1.0000]
J: 3049355.2044 along [1.0000 0.0000]
Здесь я сместил центр тяжести:
---------------- REGIONS ----------------

Area: 1327.7713
Perimeter: 428.0991
Bounding box: X: 33.4256 -- 85.4256
Y: -110.0000 -- 10.0000
Centroid: X: 50.0000
Y: -50.0000
Moments of inertia: X: 6368783.5350
Y: 3668136.9572
Product of inertia: XY: -3319427.8226
Radii of gyration: X: 69.2575
Y: 52.5607
Principal moments and X-Y directions about centroid:
I: 348709.6427 along [0.0000 -1.0000]
J: 3049355.2044 along [1.0000 0.0000]
Вопрос такого плана возможно ли написать такой лисп, в котором определение характеристик сечения проводилось только относительно нейтральной точки (оси или сentroidа) сечения?
И, с моей стороны, наверное, это верх наглости , чтобы в этом лиспе определялся момент инерции кручения только относительно нейтральной оси сечения??

Следующий вопрос, наверное к знатокам Лиры КС -
не смог прорисованное и сохраненное в dxf для 12 када сечение вскрыть в этой проге, не подскажете - где ошибка (может у меня?) и если у Вас вскроется не сохраните ли в Лировском формате?
[ATTACH]1136906436.dwg[/ATTACH]
NIVa вне форума  
 
Автор темы   Непрочитано 11.01.2006, 06:16
#7
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Моменты инерций - знаем (относительно глобальных осей), координаты центра тоже знаем. По приведенному выше коду можно их вытащить в переменные, а дальше по формулам параллельного переноса, например: Ixс =Ix0 - Yc*Yc * A.
Krieger вне форума  
 
Автор темы   Непрочитано 12.01.2006, 07:48
#8
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


to kpblc
Почему я не могу прочитать список функцией assoc?
Код:
[Выделить все]
(assoc 'centroid res)
выдаёт nil
Krieger вне форума  
 
Непрочитано 12.01.2006, 08:06
#9
Кулик Алексей aka kpblc
Moderator

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


> Krieger : попробуй (assoc "centroid" res). В списке с качестве первого элемента точечной пары используются строки. Можно, конечно, и числа засобачить, только не очень это удобно имхо...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.01.2006, 08:20
#10
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
(assoc "centroid" res)
Так я пробывал и на цифры переделывал, не получилось.
У тебя читает?
Krieger вне форума  
 
Непрочитано 12.01.2006, 08:29
#11
Кулик Алексей aka kpblc
Moderator

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


Да, не вопрос. Для приложенного файлика
Код:
[Выделить все]
(setq aa (_KPBLC-GET-REGION))
вернуло
Код:
[Выделить все]
_$ (assoc "centroid" aa)
("centroid" 802.042 522.271)
[ATTACH]1137043743.dwg[/ATTACH]
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.01.2006, 08:38
#12
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Блин. Врубился.
Я список через res пытался вызвать, а он объявлен в локальных переменных и после выполнения функции удаляется из памяти.
Krieger вне форума  
 
Автор темы   Непрочитано 09.02.2006, 11:55
#13
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


kpblc
А как точность увеличить?
Krieger вне форума  
 
Непрочитано 09.02.2006, 12:05
#14
Кулик Алексей aka kpblc
Moderator

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


Попробуй luprec побольше выставить
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.02.2006, 12:08
#15
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Пробовал, на massprop действует, а на твой функцию нет.
Krieger вне форума  
 
Непрочитано 09.02.2006, 12:23
#16
Кулик Алексей aka kpblc
Moderator

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


Ну можно попробовать сделать так - файлик приложить и посмотреть уже предметно. Возможно, проблема только в представлении...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.02.2006, 12:32
#17
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Причем тут файлик?
По inspect в visual lisp editor - там-же точная цифра выводится?
Krieger вне форума  
 
Непрочитано 04.11.2009, 16:52
#18
молодой человек


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


Здравствуйте!
Скажите, пожалуйста, а как найти момент инерции относительно осей X и Y? Вышеупомянутый лисп находит главные моменты инерции, которые для практического применения бесполезны. Или я чего-то не понимаю?
молодой человек вне форума  
 
Непрочитано 04.11.2009, 17:08
#19
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,285
Отправить сообщение для sbi с помощью Skype™


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Здравствуйте!
Скажите, пожалуйста, а как найти момент инерции относительно осей X и Y? Вышеупомянутый лисп находит главные моменты инерции, которые для практического применения бесполезны. Или я чего-то не понимаю?
Совешенно бесполезны! Вот найти бы главных! Нет, чтобы сказать в какой области главных искать. Сопротивление материалов наверное.
Это осевые - до сих пор почему-то используют, вот зачем не знаю.
__________________
С уважением sbi
sbi вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Момент инерции