Vítejte !   Přihlášení | Registrace
Hlavní menu
CATIA fórum.cz
Novinky
Seriál CATIA
Obecně o CAD
Novinky ze světa DS
Makra pro CATIA V5
Diskuse
Vytvořit téma
Koncepty
Seznam oblíbených
Soukromé zprávy
Pravidla
Live CHAT
VIP žádost
Základy Catia
Ke stažení
Doporučujeme
Pracovní příležitosti
Reklama a kampaně
O fóru
Nápověda

Inertia na Body nebo ploše

UživatelPříspěvek
Ing Jan Cinert

Poslat zprávu | Profil
Datum: 16.8. 2010 | Zobrazeno: 11028x
Konfigurace CATIA:

Text dotazu:
Zdravím programátory,
snažím se najít řešení tohoto problému. Potřeboval bych určit těžiště a hlavní osy (v Catii označené jako "principal axis") jednotlivých Body (ploch). Chtěl bych k tomu použít objekt Inertia, který má metody GetCOGPosition (těžiště) a GetPrincipalAxis (hlavní osy).
V CAA manuálu se píše, že Inertia se dá získat na každém objektu, kde to má smysl, ale ve skutečnosti to jde jen na Produktu, resp. Partu metodou GetTechnologicalObject s parametrem "Inertia".
To pak spočte proměnné celého Partu, tj. všech jeho Body - to je mi k ničemu.
Těžiště lze spočítat ještě pomocí Measure (libovolné Body či plocha), ale hlavní osy ne.
Přímo v Catii to funguje tak jak píšou, dá se změřit téměř cokoliv, ale v makru to nejde.
Nevěděl by někdo nějaký fígl, jak to obejít?

Ing Jan Cinert

Poslat zprávu | Profil
[#1036] | Publikováno: 19.08. 2010 - 01:04
Tak po dlouhém hledání jsem našel tip, jak to obelstít. Geometrie pro Inercii se nakopíruje do prázdného Partu, na něm se spočte Inercie a part se pak smaže. Trochu kódu navíc, ale funguje to celkem spolehlivě.
Jan Svoboda

Poslat zprávu | Profil
[#1100] | Publikováno: 08.09. 2010 - 08:54
Ahoj, tobě nejde makrem použít funkce Measure, nebo jsem to špatně pochopil?
Ing Jan Cinert

Poslat zprávu | Profil
[#1101] | Publikováno: 08.09. 2010 - 10:34
Jde, ale v Measure nejsou Principal axis udávající orientaci Bounding boxu, je tam jenom těžiště. A Inertia se zase vytváří z celého Partu, takže pro jedno konkrétní Body nebo plochu se to musí kopírovat do prázdného modelu. Hledal jsem i na cizích webech, tenhle způsob tam někdo uváděl jako jednu z možností jak to obejít.
Psal jsem makro právě pro vytvoření Bounding boxu - třemi způsoby. První způsob měl definované všechny osy (jak jsem psal v článku), druhý pouze jednu (třeba směr formování) a druhé dva se dopočetly automaticky tak, aby byl BB co nejmenší a třetí byl nejmenší možný - a na to jsem právě potřeboval ty Principal axis z Objektu Inertia.
Jan Svoboda

Poslat zprávu | Profil
[#1102] | Publikováno: 08.09. 2010 - 11:36
Mrkni na tohle... Včera jsem na to narazil, třeba to bude nějak užitečný.

 Set selection1 = activedoc.Selection

Dim InputObjectType(0)
InputObjectType(0) = "Body"

Status = selection1.SelectElement2(InputObjectType, "Wählen Sie den Körper aus", False)
If (Status = "Cancel") Then
MsgBox "Makro wurde abgebrochen", 16, makroname + " " + version
Exit Sub
Else

Set usersel = selection1.Item(1).Value

Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench")
Set Inertia1 = TheSPAWorkbench.Inertias.Add(usersel)

Dim Components1(8)
Inertia1.GetPrincipalAxes Components1

Set part1 = activedoc.Part

'Schwerpunkt
Set reference1 = part1.CreateReferenceFromObject(usersel)
Set Measurable1 = TheSPAWorkbench.GetMeasurable(reference1)
Dim Gcoord(2)
Measurable1.GetCOG Gcoord

Set hybridShapeFactory1 = part1.HybridShapeFactory
Set hybridBodies1 = part1.HybridBodies
Set hybridBody1 = hybridBodies1.Add
hybridBody1.Name = "Extremum_" + usersel.Name

Dim directions1(2)
Set directions1(0) = hybridShapeFactory1.AddNewDirectionByCoord(Components1(0), Components1(3), Components1(6))
Set directions1(1) = hybridShapeFactory1.AddNewDirectionByCoord(Components1(1), Components1(4), Components1(7))
Set directions1(2) = hybridShapeFactory1.AddNewDirectionByCoord(Components1(2),
Components1(5), Components1(8))
Ing Jan Cinert

Poslat zprávu | Profil
[#1103] | Publikováno: 08.09. 2010 - 11:59
Jo, to je přesně to co bych potřeboval (a funguje to), v CAA manuálu ale píšou tohle:

WARNING: this collection will be DEPRECATED in the next release. It is recommended to use the method GetTechnologicalObject("Inertia") on the product to analyze, to retrieve an Inertia object.

Takže v dalším releasu by to už nemuselo fungovat. A právě ta metoda GetTechnologicalObject je jenom u Productu a nedá se jí podstrčit samostatné Body nebo plocha, i když se tam píše, že se dá použít pro každý objekt, kde to má smysl. Snad to někdy časem opraví nebo aspoň nechají stávající stav.
Jan Svoboda

Poslat zprávu | Profil
[#1104] | Publikováno: 08.09. 2010 - 17:47
Hm, tak uvidime, já jsem to ani nezkoušel, jen jsem něco hledal a náhodou jsem narazil na tohle...


Uživatel nepřihlášen

Pro zobrazení obsahu stránky / provedení akce (vytvoření nového téma, napsání odpovědi do diskuse apod.) musíte být přihlášeni.