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
Základy Catia
Ke stažení
Doporučujeme
Pracovní příležitosti
Reklama a kampaně
O fóru
Vznik a historie
Statistiky
Přehledy
Hledat na fóru
Nápověda

Seznam příspěvků uživatele

V tabulce jsou všechny příspěvky uživatele Břeťa Doležal (dolezalb) řazené podle témat. Kliknutím na název téma se zobrazíte celou diskusi.

TémaZaloženoOdpověď
Barvení dílů v sestavě 7.6. 2022 Problém nalezen a odstraněn. Používal jsem špatný objekt do selekce. Použil jsem PartDocument.Product, s tím že jsem si myslel, že je to to samé jako Product z kolekce Products, ale to není to samé. Děkuji za rady. Ano ten poslední parametr je 0 nebo 1, už jsem ze zoufalství zkoušel ledas co.
 
Použití podmínky maxima materiálu 31.7. 2019 K tomuto tématu doporučuji ISO 2692 - Geometrical product specifications (GPS) — Geometrical tolerancing — Maximum material requirement (MMR), least material requirement (LMR) and reciprocity requirement (RPR). Snad napomůže.
 
Rozvin sestavy 13.2. 2019 @2) Pokud potřebuji na výkrese folded a unfolded, nebo jen unfolded a v 3D folded, tak je třeba mít v modelu oba typy body. Copy -> Paste Special Unfolded nebo jak to je v sheetmetalu..... Jak následně dostat na výkres konkrétní body poradí tento článek:
http://www.catia-forum.cz/articles/?article_id=188

@1) Z jednoho příkladu těžko vymýšlet, jak nejlépe stavět model......
 
Catia V5 -nahledy 1.11. 2018 CATIA V5-6R2016 -R26- + Win 10 ->> náhledy fungují
 
Těžiště v PartBody 30.8. 2018 Pokud říznete těleso v těžišti, tak to neznamená, že dostanete poloviční hmotnosti. Zafunguje pouze u krychle, koule, apod... Pokud chytíte těleso v těžišti, tak nebude mít snahu se otáčet (statický moment = 0). Představte si činku, kde máte na jedné straně 1kg a na druhé straně 2kg. Těžiště padne někde mezi činky a když to říznete, tak stále bude jedna strana 1kg a druhá strana 2kg - viz. připojený soubor s 3kilovou činkou.

Výpočet v CATIA sedí, samozřejmě je možné, že mohou asi nastat anomálie a nepřesnosti, pokud půjde o nějaký ten "špek".
Těžiště v PartBody 29.8. 2018 :-)

https://cs.wikipedia.org/wiki/T%C4%9B%C5%BEi%C5%A1t%C4%9B

tento obrázek mluví za vše:
https://cs.wikipedia.org/wiki/T%C4%9B%C5%BEi%C5%A1t%C4%9B#/media/File:Teziste2.png
 
VB.Net detekovanie viacerých Catí 13.8. 2018 linky co se nepřenesli:
https://stackoverflow.com/questions/13807102/find-all-open-excel-workbooks
http://www.pinvoke.net/default.aspx/oleacc.AccessibleObjectFromWindow


VB.Net detekovanie viacerých Catí 13.8. 2018 Získat jednotlivé instance programu CATIA by mělo jít přes WinAPI. Osobně zatím jen zjišťuji na začátku běhu makra, kolikrát je spuštěn process a vyžaduji od uživatele, aby měl puštěnou jen jedenkráte.


'kolik běží procesů Catie
locProc = Process.GetProcessesByName("CNEXT")
If locProc.Count > 1 Then 'pokud běží více CATII najednou, nutno ošetřit


Už několik měsíců (možná i let) se chystám vrhnout na tuto ukázku kódu, jak získat všechny Excely:
https://stackoverflow.com/questions/13807102/find-all-open-excel-workbooks
a případně přepracovat pro CATIAi.

Fce AccessibleObjectFromWindow by měla být opravdu schopna předat object z okna, pokud je přístupný. A přístupný by měl být, protože k němu přistupujeme.
http://www.pinvoke.net/default.aspx/oleacc.AccessibleObjectFromWindow
 
Změna fontu u Dimension 26.3. 2018 Jen nápad, ale nevím zda jde, asi ne jinak byste se neptal :-)):
1/ Posbírat si prefixy, suffixy, tolerancea vše možné, co potřebuji zachovat do nějaké kolekce.
2/ Vybrat všechny kóty
3/ spustit "Copy Object Format" - command, popř. Win API.
4/ vybrat vzorovou kótu
5/ navrátit parametry kót z kolekce
obdobně u textů....

Nikdy jsem se na toto nevrhl, páč poloha je třeba také rovnat, takže jsem vždy zůstal u ruční práce - vše vybrat změnit font a parametry + vše ručně porovnat.
 
Parametrická rovnica krivky 20.12. 2017 Výpočet bodu na evolventě je v tomto modelu:
http://www.catia-forum.cz/download/file_detail.php?file_id=28&err=i_logged
Ev. napoví DIN 3960., jinak na netu hledat výpočet evolventy.
 
Vytvorenie vymazaneho popisu pohladu vo vykrese 25.10. 2017 V kontextové menu na pohledu (pravé tlačítko na myši) -> Name view object -> Add View Name
 
Rekurzivní procházení sestavy a obarvování jednotlivých dílů 7.9. 2017 Také používám Selekci, je to i v příkladech k API, kde řeší stejný problém. Nešlo by na místo barvy definovat třeba hodnotu parametru, nebo něco takového? Možná by bylo rychlejší, ale s tak velikými sestavami nedělám, takže netuším.

Předpokládám, že máš použito:

CATIA.RefreshDisplay = False 'začátek

rekurzivní procházení sestavy

CATIA.RefreshDisplay = True 'konec


někdy urychlí i tyto přepínače:

CATIA.Interactive = True / False
CATIA.Visibility = True / False
 
Parametr na čtení hodnot / výpočet 3.8. 2017 Možný zápis je:
sqrt(a **2+b **2), ev. (a **2+b **2)**(1/2), viz. příloha.

z nápovědy:
Arithmetic operators
+ Addition operator (also concatenates strings)
- Subtraction operator
* Multiplication operator
/ Division operator
( ) Parentheses (used to group operands in expressions)
= Assignment operator
** Exponentiation operator

Logical Operators
and Logical conjunction on two expressions
or Logical disjunction on two expressions

Comparison Operators
<> Not equal to
== Equal to
>= Greater or equal to
<= Less than or equal to
< Less than
> Greater than
 
Aktuální datum a jméno designera do výkresu 23.11. 2017 Pokud se nepodaří pomocí funkce Format, tak je možno si složit řetezec bez funkce. Myslím, že jde použít:


Dim Datum As DateTime
Dim rok, mesic, den As Integer

rok = Datum.Year
mesic = Datum.Month
den = DateTime.Day

vyslednystring = rok.ToString & "-" & mesic.ToString & "-" & den.ToString

ale fci Format běžně používám bez problémů

msgText = msgText & Format(DateTime.Now, "dd MMMM yyyy")
Aktuální datum a jméno designera do výkresu 21.7. 2017 Zas tak jednoduché to programování není :-) Z čeho by pak programátoři byli živi? :-) Zkus to postupně. Nejprve si makro nahraj a potom jej zkus dopsat, tak aby něco dělalo automaticky opakovaně.
drwAutor As DrawingText
je pouze deklarace proměnné, následně je ještě nutno spojit s objektem v Catii. Jinak stejně jako uváděl Jan C. doporučuji importovat přes parametry a následně až attribute link. Psal jsem přímou možnost cesty (né celý program) a přes parametry je to jinak.
Aktuální datum a jméno designera do výkresu 21.7. 2017 Napsat makro na vyplnění USERNAME a DATE je otázkou několika desítek minut, pokud nebudete řešit všechny detaily toho co může nastat - spuštění makra mimo CATDrawing, více sheetů, verze Catie, apod......
Pokud budete chtít i stabilitu od makra a třeba i postihnout více listů a více druhů rámečků, apod... tak musíte řešit šiřší kontext a zde už to bude spíše několik hodin, protože je třeba si i minimálně vyjasnit zadání s tím, co všechno očekáváte od makra.
Pokud se do toho budete chtít dát sám, tak to není zas až tak složité a za pomoci tohoto fóra byste to asi dal i dohromady. Zásadní jsou asi tyto věci

'uživatel:
Set wshNet = CreateObject("WScript.Network")
strUzivatel = wshNet.UserName
'datum pomocí funkce
mujdatum = Date
'a už jde jen o to nasypat údaje Do CATIE:
drwAutor, drwDate As DrawingText
drwAutor.Text = strUzivatel
drwDate.Text = mujdatum


Myslím si, že ukecat vedoucí, vzít si do firmy na týden brigádníka co umí VBA by nemuselo být tak těžké. Ev. si zaplatit makro od externisty (DPP) a následně si jej už jen samostatně udržovat. Pokud je makro již hotové, tak jej pochopit a obstarávat už není zas tak těžké. Většinou jde jen o to poupravit Reference při změnách Releasu Catie a změnách šablony výkresu. Ev. se poptejte, kolik by za to vedoucí byli ochotni dát a třeba Vám někdo tady na fóru makro do nějaké částky udělá. Za mě dostat jedním tlačítkem jméno uživatele a datum do výkresu je úspora cca 20sec. To je údaj, který se dá přepočíst na roční úsporu.
Aktuální datum a jméno designera do výkresu 20.7. 2017 Někdy pomůže GetEnvVariableValue() z řetězcových operací.

V mém případě např.: GetEnvVariableValue("USER_HOME") dá cestu do dokumentů, pokud bývá stejná, tak by se dal uživatel z cesty dostat.

Ale spíš bych řešil přes makro než takto krkolomně, abych případně vepisoval i vícero informací najednou.

Většinou se toto řeší přes PLM systémy (spojení parametrů-attributů v PLM s parametry v CATII). Pro menší firmy bez PLM je asi nej použít makro. Makro by byl vstupní formulář s nějakými vstupními textboxy, comboboxy a tlačítko na nasypání dat do Catie a případné další vychytávku (tisk *.pdf po schálení, apod...)
 
RANGE parametru 14.2. 2017 @Jan: Bez licence KWA/KWE asi Check přes API do CATPartu nedostanu, že? Neexistuje nějaký fígl?
 
Konvexno-konkávne ozubenie 1.12. 2016 @ Peter, Bohužel z Vašich příspěvků nejsem schopen model postavit. Jak jsem již psal, zuby tohoto typu neznám. Neznám význam počítaných rozměru x*, y* a phi* a jak se k nim dostalo, tak nevím jak nastavit znaménka. Nicméně ukázka toho jak je možno za pomoci law vyzískat body na profilu je připojena. Něco to dělá, ale určitě né správně. Je třeba ještě opravit a dodělat. Toto je opravdu jen ukázka jak asi na ty body. Body profilu by byly koncové body úseček Line.1 a Line.2.
Konvexno-konkávne ozubenie 25.11. 2016 Uživatel odpovídá na příspěvek #6014:
Ve vašich rovnicích popisujících konvexně-konkávní profil zubu (pokud to je popis profilu zubu a nebo to popisuje bod záběru...?) bude zřejmě úhel "alfa" tím parametrem "t". A k získání profilu bude zapotřebí vypočítat několik bodů pro různé úhly "alfa". Takže bude zapotřebí vytvořit dva law, kde vstupem bude "alfa" a výstup z law bude dávat hodnty "x*" a "y*". Pro detailnější pomoc by bylo zapotřebí vědět více z teorie ozubení tohoto typu zubu. Dle obrázku, možná opravdu jen stačí dopočítat středy oblouků Skh a Skd a je to. Jak už předeslal Jan C., jestli jsou zuby pouze kruhové oblouky, což nemohu potvrdit ani vyvrátit, páč tyto zuby jsem nikdy nepoužil, tak nebude law ani potřeba.
 
Vlozenie materialu do TitleBlocku pomocou makra 3.8. 2016 ve Visual Basicu, získávám materiál z Body takto:

Public Function MaterialOfBody(ByVal iBody As Body) As String

Dim locMaterial As Material = Nothing
Dim locMatManager As MaterialManager

locMatManager = CType(iBody.GetItem("CATMatManagerVBExt"), MaterialManager)
locMatManager.GetMaterialOnBody(iBody, locMaterial)
If locMaterial Is Nothing Then
Return ("NONE")
Else
Return (locMaterial.Name)
End If
End Function


následně tuto informaci zpracovat a předat tam, kam je třeba
 
Převod dat do nižší verze 19.7. 2016 Buď vytáhnout ze zálohy a nebo je možnost získat mrtvolu přes Step, popř. přes Tools->Utility..->DownwardCompatibility. Již se řešilo mnohokrát.
 
VB2010 přechod z CATIA 32bit na 64bit 10.2. 2016 Mohu mít dotaz ke slovu obfuskuji. Co tím míníte? Je tím míněná úprava kódu aby nešlo dekompilovat?
Pokud obfuskuji znamená něco jiného, tak se ještě ptám: Jak případně chráníte zdrojový kód? Jde toto provést přímo ve Visual Studiu? Existují nějaké freeware nástroje, které zabrání dekompilaci?
VB2010 přechod z CATIA 32bit na 64bit 1.12. 2015 Možná dobré téma pro článek, jak si usnadnit život s knihovnami - minimálně pro mě programátora amatéra.
VB2010 přechod z CATIA 32bit na 64bit 1.12. 2015 Registrace nebyla problém, cnext.exe /regserver znám již velmi dobře. Problém byl jinde, nešlo zachytit tu běžící Catii. V registrech mi úplně chyběli Catiovské třídy (Catia.Application) v umístění HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Porovnával jsem si to na více stanicích. Vytváří definici těchto tříd, také příkaz cnext.exe /regserver. Nakonec jsme zkusili odinstalovat Catii a znovu instalovat. Jenže neproběhla už ani instalace. Takže komplet přeinstalace i se systémem, už na to měla stanice nárok po těch 3-4letech...
Tvorba těch sad interop dll je provedena tak, že jste si připojil všechny knihovny z Catie a ty se přenesli do adresáře k makru (standardně adresář \release\)? Potom si odkazujete na tyto dll a né na COM objekty? Není následně komplikované volání funkcí jako např. u Win API, že musím deklarovat funkci <DllImport, apod...?
VB2010 přechod z CATIA 32bit na 64bit 1.12. 2015 Pátrám a asi to vypadá, že je nakopnutá instalace CATIE a že je třeba někde doplnit do Windowsu asi do registrů informaci o CATII. Nemáte někdo zkušenost co má být v registrech abych našel objekt CATIA.Application?

Koukám do HKEY_LOCAL_MACHINE\SOFTWARE\Classes a zde najdu Excel.Application, PowerPoint.Application, ale CATIA.Applciation nikde. Může být toto problém?

Ještě v rámci instalace mám nově R22 64bit a následně jsme prováděli cnext.exe / regserver v adresáři R19.
 
Vb.net versus Catvba 24.11. 2015 používám VS2010:
Při lazená programu vidím Locals, viz. obr.
Dá se krokovat za pomoci F8 také od začátku.
 
Vb.net 2 catie 24.11. 2015 Toto už jsem také mnohokrát řešil, ale nikdy nedořešil, páč makra dělám jen zřídka a nejsem programátor. Vždy mě to dovedlo k programování na úrovni Windows, tj. Win API, kde se importují různé procedury a funkce z user32.dll, kernel32.dll, apod... a tam už moje znalosti končí. Spíš je to možná i lenost. Nechce se mi pracně hledat a vyhledávat, co která funkce dělá. Pokud dělám makro, tak jen hlídám počet procesů CNEXT. V případě vícero CATII, řeknu uživateli MsgBox-em, aby si pustil pouze jednu CATII. Líbilo by se mi pokud bych byl schopen z kolekce procesů se dostat na object CATIE, ale i zde je to asi složité, co jsem hledal zdrojové kódy a moc to nepobírám. Z těch API dokáži pouze zobrazit okna aplikací, ale jak přímo zachytit příslušnou CATII, nevím :-(


'kolik běží procesů Catie
locProc = Process.GetProcessesByName("CNEXT")
If locProc.Count > 1 Then 'pokud běží více CATII najednou, nutno ošetřit


 
Dokumenty navázané na CATDrawing 1.12. 2015 Na sceně z výkresu GetPartNumber neexistuje vůbec. A na scéně ze sestavy zkusím, až pořeším problémy spojené s přechodem na 64bitovou CATII.
Dokumenty navázané na CATDrawing 24.11. 2015 Scene.GetPartNumber mi nefunguje :-(. V dokumentaci jsem to také viděl, tak nevím...
 
Sheetmetal design - vytvoření chlopně v prostřiženém otvoru 6.11. 2015 nakreslil bych bez otvoru a bez chlopně -> unfold -> výsek -> fold -> ohyb na chlopni
 
vytvoření textu pomocí Makra 13.9. 2016 A pokud to potřebuji opačně pro CATII, tak následovně.

CATBarva = CLng(255L + (256L * b) + (256L * 256L * g) + (256L * 256L * 256L * r))
hranice = CLng((2 ^ 32 / 2) - 1)

If CATBarva > hranice Then
CATBarva = CATBarva - CLng(256 ^ 4)
End If
dt.TextProperties.Color = CInt(CATBarva)
vytvoření textu pomocí Makra 13.9. 2016 Už to mám:
zde je rozklíčování, pro mnohé z Vás asi žádné překvapení:

CATBarva = dt.GetParameterOnSubString(CatTextProperty.catColor, 0, 0)
If CATBarva > 0 Then
r = CInt((CATBarva \ (256 * 256 * 256)) Mod 256)
g = CInt((CATBarva \ (256 * 256)) Mod 256)
b = CInt((CATBarva \ 256) Mod 256)
Else
CATBarva = CLng(256 ^ 4) + CATBarva
r = CInt((CATBarva \ (256 * 256 * 256)) Mod 256)
g = CInt((CATBarva \ (256 * 256)) Mod 256)
b = CInt((CATBarva \ 256) Mod 256)
End If
.Color = Color.FromArgb(r, g, b)

vytvoření textu pomocí Makra 12.9. 2016 Nevíte někdo, jak je barva zakódována do long integeru? Jak mohu z long integeru dostat jednotlivé složky, R,G,B,A?


MyText.SetParameterOnSubString catColor, 0, 0, redCol 'Encoded RGBA color within long integer (R=255 G=0 B=0 A=255)


Při pokusování to vypadá, že pokud je Red nejmenší, tak je to klasika, např. R=10 (0A),G=110 (6E),B=210 (D2) -> Long Int = 175035135 (0A:6E:D2:FF). Pokud je ale Red vyšší než ostatní, tak se objevuje záporné číslo. Možná to bude 256^3 - klasika. Nechápu kdo toto vymýšlel a proč....
 
Přebarvení označení detailu 17.8. 2015 Myslím, že se perou user settings s globálním nastavením a nebo nastavením pro dané prostředí. Stejně jako se např. v nastavení definují různé typy čar a tlouštěk, tak obdobně se definujíí i jiné attributy zobrazení. Mohlo by být tímto.

Mj. na Windchillu taky jedeme
 
Podmínkování kuželu v sestavě 12.5. 2015 uhel = arcsin ( 2^(1/2) * sin (uhel kuzele) )
14.216 = arcsin( 1.414213562 * sin (10))
Podmínkování kuželu v sestavě 12.5. 2015 uhel = arcsin ( 2^(-1/2) * sin (uhel kuzele) )
14.216 = arcsin( 1.414213562 * sin (10))
Podmínkování kuželu v sestavě 12.5. 2015 Je to těch 14.216°, souhlasí.v R19 připojeno
Podmínkování kuželu v sestavě 12.5. 2015 předchozí příspěvek je špatně, tak jednoduché to opravdu není
Podmínkování kuželu v sestavě 12.5. 2015 popř. si udělejte draft pod úhlem kuželovitosti a máte i plochu totožnou s prizmem. Na matematický výpočet je zapotřebí vypočítat průsečík elipsy (kuželosečka) s rovinou prizmatu.
Podmínkování kuželu v sestavě 12.5. 2015 potvrzuji, jsou to kuželosečky
 
Procházení sestavy i CPP linků 21.4. 2015 Nevím zda je vše OK, ale zde je můj výsledek, který mi zatím funguje na procházení Solid linků v Partu. Je třeba mít všechny Party na desku Loaded, jinak nerozpozná SourceElement. Asi není vše ošetřeno, ale to už si poradíte. ;-)


''' <summary>
''' Rekurzivní funkce pro procházení dílu CATPartu
''' </summary>
''' <param name="iPart">Definuje Product který se má projít</param>
''' <param name="iAssyLevel">Aktuální úroveň Productu v sestavě</param>
''' <param name="iParty">
''' Kolekce vyzískaných Partu
''' Přidává se cls_SubComponent Do kolekce iPodprodukty
''' </param>
''' <remarks>
''' Prozkoumá iPart Do hloubky a případné nalezené další Párty přidá Do kolekce iParty
''' Příklad:
''' Dim Pole As System.Collections.Generic.List(Of cls_SubComponent)
''' PartCPPExplorer (Part, Level, Pole)
''' </remarks>
Public Sub PartCPPExplorer(ByVal iPart As Part, ByVal iAssyLevel As Integer, ByVal iParty As System.Collections.Generic.List(Of cls_SubComponent))

Dim locSubKomp As New cls_SubComponent
Dim intAssyLevel As Integer = iAssyLevel
Dim locShapes As MECMOD.Shapes
Dim locSolid As MECMOD.Solid
Dim locSourceElem As INFITF.AnyObject
Dim locPart As Part
Dim blnIsCPP, blnIsIn As Boolean
Dim locColParty As New System.Collections.Generic.List(Of Part)

intAssyLevel += 1
locColParty.Clear()
For Each iBody As Body In iPart.Bodies
locShapes = iBody.Shapes
For Each locfShape As Shape In locShapes
If Not IsNothing(locfShape) Then
If TypeName(locfShape) = "Solid" Then
blnIsCPP = False
'pokud je to Solid, tak mi ho dej mySp
locSolid = CType(locfShape, MECMOD.Solid)


Try 'zkus zjistit zdroj Solidu, né všechny Solidy jsou s linkem, některé jsou mrtvoly
locSourceElem = locSolid.SourceElement
'locSourceElem je Body -> parent je Bodies -> paret je Part
locPart = CType(locSourceElem.Parent.Parent, Part)

If Not ReferenceEquals(iPart, locPart) Then
blnIsCPP = True

blnIsIn = False
For Each locfPart As Part In locColParty 'procházení již zařazených dílů
If ReferenceEquals(locfPart, locPart) Then 'porovnání
blnIsIn = True 'pokud bude někdy shoda, tak přepni na TRUE
End If
Next locfPart

If Not blnIsIn Then 'pokud ještě není v seznamu, tak přidej díl
locColParty.Add(locPart)
End If
End If
Catch ex As Exception 'pokud vyhodí chybu, tak je solid mrtvola a né CPP link
blnIsCPP = False
Finally
End Try

End If
End If
Next locfShape
Next iBody


For Each locfPart As Part In locColParty
locSubKomp = StorePartInfo(locfPart, intAssyLevel, 0) 'dej Do třídy info o Partu
locSubKomp.CPPLinked = True
iParty.Add(locSubKomp) 'přidat na seznam
PartCPPExplorer(locfPart, intAssyLevel, iParty) 'Rekurzivní volání
Next locfPart

intAssyLevel -= 1
End Sub 'PartCPPExplorer
Procházení sestavy i CPP linků 15.4. 2015 Je Parent od kolekce Bodies, vždy Part?, pokud se jedná o základní Catii - Mechanical Design 2.
Procházení sestavy i CPP linků 15.4. 2015
Solid.SourceElement
bude možná řešením, každopádně to musím ještě ozkoušet a dám vědět. Při prvních pokusech jsem zapomněl, že mám v sestavě Solidy bez linku.
Procházení sestavy i CPP linků 15.4. 2015 Zatím jsem si vypsal všechny Solidy, ale SourceElement a SourceProduct jsem zatím nezprovoznil a ani nevím, zda by mi to mohlo dát co chci.


Dim locSubKomp As New cls_SubComponent
Dim strT1, strT2 As String
Dim mycount As Integer
Dim myShapes As Shapes
Dim myHybBod As HybridBodies
Dim myHybSha As HybridShapes
Dim mySolid As MECMOD.Solid


'mySolid.SourceElement
'mySolid.SourceProduct


myShapes = iBody.Shapes
mycount = myShapes.Count
strT1 = ""
strT2 = ""
For Each mySp As Shape In myShapes
If Not IsNothing(mySp) Then
strT1 = strT1 + mySp.Name + "-" + TypeName(mySp) + "|"
If TypeName(mySp) = "Solid" Then

mySolid = CType(mySp, MECMOD.Solid)
strT2 = strT2 + TypeName(mySolid.Parent)

'strT2 = mySolid.SourceElement.Name
'strT2 = strT2 + mySolid.SourceProduct.Parent.ToString

End If
End If
Next mySp

myShapes = Nothing




Spíš se bojím, že tudy cesta nevede a žo to bude spíš chtít řešení na úrovni dokumentů. Co umí Vaše makro IsolateExternals.exe (stahoval jsem, ale nefungovalo u mě)? Ještě zkusím hledat a pátrat. Asi by to mělo jít, protože snad všechny PLM systémy umí rozeznat CPP linky.
Procházení sestavy i CPP linků 14.4. 2015 Ev. je nějaká možnost vyexportovat stromovou strukturu z desku? Jsou nějaké vazby mezi CATPart a CATProduct dokumenty, které mám viditelné na desku?
 
SettingController pro nový Product popř. FindWindowExA z WinAPI 3.8. 2016 Díky Drbi. Tvoje aplikace vylistuje seznam oken, to bych ještě snad i zvládl. Já ještě chci následně získat objekt aplikace z handleru okna.

Nadějně vypadá tento zdrojový kód pro Excel, ale nevím jestli se tím dokážu prokousat. Win API neznám a vyhýbám se mu, jako čert kříži

První na čem končím je, že neznám tyto konstanty pro Catii, vypadá to jako nějaký klíč z registrů, ale jestli to je na všech počítačích stejné pro Catii, to nevím?:
Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Const OBJID_NATIVEOM As LongPtr = &HFFFFFFF0



Option Explicit

#If Win64 Then

Private Declare PtrSafe Function FindWindowEx Lib "user32" AliAs "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
Private Declare PtrSafe Function GetClassName Lib "user32" AliAs "GetClassNameA" (ByVal Hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As LongPtr) As LongPtr
Private Declare PtrSafe Function IIDFromString Lib "ole32" (ByVal lpsz As LongPtr, ByRef lpiid As UUID) As LongPtr
Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" (ByVal Hwnd As LongPtr, ByVal dwId As LongPtr, ByRef riid As UUID, ByRef ppvObject As Object) As LongPtr

#Else

Private Declare Function FindWindowEx Lib "user32" AliAs "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetClassName Lib "user32" AliAs "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef lpiid As UUID) As Long
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal hwnd As Long, ByVal dwId As Long, ByRef riid As UUID, ByRef ppvObject As Object) As Long

#End If

Type UUID 'GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Const OBJID_NATIVEOM As LongPtr = &HFFFFFFF0

' Run As enTry point of example
Public Sub Test()

Dim i As Long
Dim xlApps() As Application

If GetAllExcelInstances(xlApps) Then
For i = LBound(xlApps) To UBound(xlApps)
If xlApps(i).Workbooks(1).Name <> ThisWorkbook.Name Then
MsgBox(xlApps(i).Workbooks(1).Name)
End If
Next
End If

End Sub

' Actual Public facing Function to be called in other code
Public Function GetAllExcelInstances(xlApps() As Application) As Long

On Error GoTo MyErrorHandler

Dim n As Long
#If Win64 Then
Dim hWndMain As LongPtr
#Else
Dim hWndMain As Long
#End If
Dim app As Application

' Cater For 100 potential Excel instances, clearly could be better
ReDim xlApps(1 To 100)

hWndMain = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)

Do While hWndMain <> 0
app = GetExcelObjectFromHwnd(hWndMain)
If Not (app Is Nothing) Then
If n = 0 Then
n = n + 1
xlApps(n) = app
ElseIf checkHwnds(xlApps, app.Hwnd) Then
n = n + 1
xlApps(n) = app
End If
End If
hWndMain = FindWindowEx(0&, hWndMain, "XLMAIN", vbNullString)
Loop

If n Then
ReDim Preserve xlApps(1 To n)
GetAllExcelInstances = n
Else
Erase xlApps
End If

Exit Function

MyErrorHandler:
MsgBox "GetAllExcelInstances" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description

End Function

#If Win64 Then
Private Function checkHwnds(xlApps() As Application, Hwnd As LongPtr) As Boolean
#Else
Private Function checkHwnds(xlApps() As Application, Hwnd As Long) As Boolean
#End If

Dim i As Integer

For i = LBound(xlApps) To UBound(xlApps)
If xlApps(i).Hwnd = Hwnd Then
checkHwnds = False
Exit Function
End If
Next i

checkHwnds = True

End Function

#If Win64 Then
Private Function GetExcelObjectFromHwnd(ByVal hWndMain As LongPtr) As Application
#Else
Private Function GetExcelObjectFromHwnd(ByVal hWndMain As Long) As Application
#End If

On Error GoTo MyErrorHandler

#If Win64 Then
Dim hWndDesk As LongPtr
Dim Hwnd As LongPtr
#Else
Dim hWndDesk As Long
Dim Hwnd As Long
#End If
Dim strText As String
Dim lngRet As Long
Dim iid As UUID
Dim obj As Object

hWndDesk = FindWindowEx(hWndMain, 0&, "XLDESK", vbNullString)

If hWndDesk <> 0 Then

Hwnd = FindWindowEx(hWndDesk, 0, vbNullString, vbNullString)

Do While Hwnd <> 0

strText = String$(100, Chr$(0))
lngRet = CLng(GetClassName(Hwnd, strText, 100))

If Left$(strText, lngRet) = "EXCEL7" Then

Call IIDFromString(StrPtr(IID_IDispatch), iid)

If AccessibleObjectFromWindow(Hwnd, OBJID_NATIVEOM, iid, obj) = 0 Then 'S_OK

GetExcelObjectFromHwnd = obj.Application
Exit Function

End If

End If

Hwnd = FindWindowEx(hWndDesk, Hwnd, vbNullString, vbNullString)
Loop

On Error Resume Next

End If

Exit Function

MyErrorHandler:
MsgBox "GetExcelObjectFromHwnd" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description

End Function

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function FindWindowEx Lib "user32" AliAs _
"FindWindowExA" (ByVal hWnd1 As Long, ByVal
hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Function ExcelInstances() As Long
Dim hWndDesk As Long
Dim hWndXL As Long

'Get a handle to the desktop
hWndDesk = GetDesktopWindow

Do
'Get the Next Excel window
hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, _
"XLMAIN", vbNullString)

'If we got one, increment the count
If hWndXL > 0 Then
ExcelInstances = ExcelInstances + 1
End If

'Loop Until we've found them all
Loop Until hWndXL = 0
End Function



Chce to někoho zkušeného na Win API. Zkusím nejprve zprovoznit toto pro Excel a pak budu zkoušet pro Catii.
SettingController pro nový Product popř. FindWindowExA z WinAPI 27.5. 2015 Řešil někdy někdo, jak případně uživateli zajistit volbu se kterou Catií má makro spolupracovat?

myproc = Process.GetProcessesByName("CNEXT")

If myproc.Count > 1 Then

'!!!! pokud běží více CATII najednou, nutno ošetřit

End If


Jde nějak z procesu vyzískat object
 INFITF.Application 
?

Pokud běží vícero Catií najednou, jakou si makro vybere, pokud dám následující příkaz?
locCATApp = CType(GetObject(, "CATIA.Application"), INFITF.Application)

Je zde nějaké pravidlo? Čas spuštění, poslední aktivní....apod.
 
Závislá změna atributu activity kóty ve skice pomocí formule 30.5. 2014 Stačí napsat formuly pro aktivitu druhé kóty a zapsat výraz not (aktivita první kóty)
 
Nové icons 30.5. 2014 Jestli si vypomínám správně, tak přidat ikonu na trvalo, byl docela oříšek. Myslím, že soubor musel začínat I_xxxx.bmp a ještě se musel dát do adresáře k ostatním ikonám, tak aby ji měla Catie "při ruce". Následně šlo i vybrat ze seznamu ikon. Nejlepší je pojmenování se začátkem I_AA nebo I_0 ať je ikona v seznamu hned po ruce. Pro výběr ze seznamu je nutno startovat Catii až po nahrání ikon do adresáře.

Možná se musí ikona nahrát pouze do jednoho z těchto adresářů, ale vždy jsem dal ikony do všech těchto, protože jsem neanalyzoval, který je ten správný, ikonu jsem nahrál tak jak je všude stejnou.
cesty:
\catia\R18\intel_a\resources\graphic\icons\I_2DViewSectionCreate.bmp
\catia\R18\intel_a\resources\graphic\icons\normal\I_2DViewSectionCreate.bmp
\catia\R18\intel_a\resources\graphic\icons\small\I_2DViewSectionCreate.bmp

Velikost 24x24px myslím ani nebyla nutná, jen to potom udělá širší toolbar dle ikony a následně nejde klinout na výběr jiné ikony se seznamu v "Customize", protože ikona bude přes tlačítko. Ale možná tyto zádrhele jsou jen v R18, kterou jsem stále nucen používat.
 
Zobrazovanie specialnych symbolov v Catia Vykrese 23.4. 2014 Pokud si dáte mapu znaků ve Win, tak je vidět, že tento font nemá definovanou řeckou abecedu. Nejjednodušší je změnit typ písma (font) - např. Arial.
 
Copy -> Paste as Result (with Link) 21.2. 2014 Vyřešeno. Bylo to v modelu. Měl jsem na modelu logo a to bylo vytaženo k ploše + 1mm offset, kterou jsem získal před tvorbou loga vyextrahováním ploch modelu. Prý jsem udělal cyklení Solid-Plocha-Solid. Řešením bylo vytažení loga up to next + 1mm offset. Zkoušel jsem i plochu odizolovat, pad dát do samostatného Body, abych přerušil cyklení, ale ani to nepomohlo. Doposud jsem Pad k surface běžně používal bez problému, ale v tomto případě to neprošlo. Sice vyřešeno díky podpoře od Ididady, ale stále nevím co to vlastně přesně způsobuje. Ještě si vyzkouším nějaké jednoduché modely na toto chování a uvidím. Pokud zjistím, kde je skutečný problém, dám vědět.
 
Počet entit v ramci jednoho body 7.1. 2014 Nad tímto jsem jednou přemýšlel a asi bych na to šel, že bych si vycuc kolekci face a uděllal remove loop postupně na jednotlivých face. Po remove loop si projel zase kolekci face a porovnávat s výchozí. Nevím tedy jestli se ale nějak nezmění attributy face po remove loop, aby se dalo porovnávat a určit stjenou face v původní kolekci před remove loop. Jen podle počtu face by to nebylo košér. Zatím jsem to ale nepotřeboval, takže jsem to nezkoušel. Snad někdy....Ještě nevím zda je funkce remove loop podporována API. Honza C. bude mít určitě lepší řešení...
 
Výběr, označení ploch na mrtvém solidu 5.12. 2013 @Jan: Makro na výběr, funguje takto?
1. udělá se extrakt
2. prochází se jednotlivé plochy na solidu
3. měří se vzdálenosti -> určí plochy pod extraktem

Šlo by napsat kousek kódu, který prochází plochy jednotlivé plochy na Body (solidu). Zatím to nepotřebuji,ale mohlo by to být zajímavé. Ev. napsat jen kde v objektovém modelu najít kolekci ploch na Body. Předem díky.
 
Natočení křivky na Válec 6.11. 2013 Díky, GSO nemáme :o(.
Ale máme SMD (sheetmetal) a tam jsem si to zatočil, taky drží velikost na neutrálné rovině.
 
Kde zohnať program CATIA, keď nesom už študent študent a chcem sa to učiť 15.8. 2013 1) Koupit - to bude chtít několik statisíců.
2) Nechat se zaměstnat u firmy co jede na Catii
3) Najít si někoho dobře známého, co má v práci Catii na notebooku a může se připojovat do firemní sítě přes VPN pro licenci a bude ochoten ti notebook půjčit po odpolednách a víkendech.
4) Pokračovat ve studiu, ev. se dohodnout s nějakou školou co má licence na Catii a chodit k nim do učebny.
 
Aktuální verze prostředí pro ŠKODA 15.8. 2013 B2B portály, kde si jde stáhnout zákaznická prostředí pro Catii.
 
Problem pri konverzii zo STEP 5.8. 2013 Ještě bych zkusil za zoomovat do středu těch ploch a čar. Třeba tam ta geometrie je a toto jsou jen nějaké "nekonečné" plochy a čáry co by se dali odstranit.
 
zobrazení závitu 10.7. 2013 Pro zvýraznění závitu, pokud potřebuji, používám válcovou plochu (vnitřní závit - velký průměr, vnější závit - vnitřní průměr)
 
Jak vytvořit skořepinu z tohoto modelu 20.3. 2013 Když tam vidím tu plochu, tak bych zkusil příkaz "Thick Surface", ev. z objemu zkusit "Shell". Záleží jaká bude tloušťka a jesti dokáže pořešit křivosti, kde jsou příliš malé rádiusy - i když tady spíš bude problém s tím, že budou malé plošky zanikat, prorože bude plocha asi z malých trojúhelníkových plošek. Předpokládám, že jde o plochu z 3D skeneru. Pokud bude problém udělat thick surface , offset plochy, apod... tak potom by bylo asi lepší data ze skeneru si vzít ještě hrubší, ať nejsou plošky tak malé.
 
Poloviční řez 14.3. 2013 Použil bych Breakout View (Toolbar Views)
 
Prepojenie výkresu s Partom 13.3. 2013 Jak makrem, alespoň nástin?
 
Ořezání rovinou na základě objemu 8.3. 2013 Na přesně toto mám makro, kde vstupem jsou dva parametry (vzdálenost řezné roviny, druhý parametr je objem). Dále se musí definovat počáteční krok prvního z parametrů. Používám toto makro na řezání objemů a funguje i v sestavách, kdy např. potřebuji najít určitou polohu sestavy (např. minimální vzdálenost nějakého dílu od jiného).
Makro nedělá nic jiného než že inkrementuje první z parametrů, provede update a vyhodnotí druhý parametr a toto v cyklu, který je omezen přesností, jakou vyžaduji a omezuji si to i max. počtem kroků, páč někdy zadám špatně vstup. Makro pracuje s parametry a s hodnotovými constrainy.
Pokud hodláte makro komerčně používat, tak Vám mohu zaslat číslo účtu, kam je možno poukázat odměnu za toto makro.

A zde je již ono makro:



Option Explicit

Public oPart As Part
Public oSestava As Product
Public prmVstupniParam As KnowledgewareTypeLib.Parameter
Public prmVystupParam As KnowledgewareTypeLib.Parameter
Public dblZadanaHodnota As Double
Public dblKrok As Double
Public btePresnost As Byte
Public lngMaxPocIter As Long
Public strDokTyp As String
Public blnZadano As Boolean


Sub CATMain()
'Statistika používání makra:
Dim clsLog As New clsLogFile
clsLog.MakroLog ("Optimalizace")
clsLog.CloseFile
Set clsLog = Nothing

'Za&#232;átek samotného makra
Call InterfaceOptimalizace

Set oPart = Nothing
Set oSestava = Nothing
Set prmVstupniParam = Nothing
Set prmVystupParam = Nothing
End Sub


Sub InterfaceOptimalizace()

Dim MsgText As String
Dim MsgResponse As Long
Dim intOptimVysledek As Integer
blnZadano = False
strDokTyp = ""

Err.Clear
'Kontrola jestli je aktivní dokument Part nebo Product, jinak ukon&#232;i makro
On Error GoTo ErrHandler ' in Case when Desk is active document
If TypeName(CATIA.ActiveDocument) = "PartDocument" Then
'Aktivní dokument je Part, pokra&#232;uj
Set oPart = CATIA.ActiveDocument.Part
strDokTyp = "Part"
ElseIf TypeName(CATIA.ActiveDocument) = "ProductDocument" Then
'Aktivní dokument je Product, pokra&#232;uj
Set oSestava = CATIA.ActiveDocument.Product
strDokTyp = "Product"
Else
'Aktivní dokument není Part ani produkt, ukon&#232;i makro
MsgText = TypeName(CATIA.ActiveDocument) & " is unsupported document!" & vbCrLf
MsgText = MsgText & "CATPart or CATProduct hAs to be active."
MsgResponse = MsgBox(MsgText, vbExclamation)
Exit Sub
End If
Err.Clear
On Error GoTo 0
frmOptimEnter.Show

If blnZadano Then 'Pokud byli zadány vstupní parametry, optimalizuj
If strDokTyp = "Part" Then
'Pokud se jedna o Part spus&#157; OptimalizacniFce
intOptimVysledek = OptimalizacniFce(oPart, prmVstupniParam, prmVystupParam, _
dblKrok, dblZadanaHodnota, btePresnost, lngMaxPocIter)
ElseIf strDokTyp = "Product" Then
'Pokud se jedna o Product spus&#157; OptimalizacniFceProduct
intOptimVysledek = OptimalizacniFceProduct(oSestava, prmVstupniParam, prmVystupParam, _
dblKrok, dblZadanaHodnota, btePresnost, lngMaxPocIter)
Else
'N&#236;co není v po&#248;ádku
intOptimVysledek = -6
End If
CATIA.StatusBar = "Výsledek optimalizace: " & CStr(intOptimVysledek)
Else 'Nebyli zadány vstupní parametry, informuj o p&#248;erušení Makra - zav&#248;en formulá&#248;
CATIA.StatusBar = "Makro p&#248;erušeno"
End If

Exit Sub
ErrHandler:
' Pokud je n&#236;co divného s aktivním dokumentem informuj uživatele a konec
MsgText = "Unsupported document is active!" & vbCrLf
MsgText = MsgText & "CATPart or CATProduct hAs to be active."
MsgResponse = MsgBox(MsgText, vbExclamation)

End Sub


Function OptimalizacniFce(prtSoucast As Part, prmRidiciParametr As KnowledgewareTypeLib.Parameter, _
prmOptimalizovanyParametr As KnowledgewareTypeLib.Parameter, dblVstupniKrok As Double, _
dblCilovaHodnota As Double, Optional btePresnost As Byte = 3, Optional lngMaxPocetIteraci As Long = 5000) As Integer
'+----------------------------------------------------------------------------------+
'| Jmeno: »»»»» OptimalizacniFce ««««« |
'| Vstupni parametry: prtSoucast As Part |
'| prmRidiciParametr As KnowledgewareTypeLib.Parameter |
'| prmOptimalizovanyParametr As KnowledgewareTypeLib.Parameter |
'| dblVstupniKrok As Double |
'| dblCilovaHodnota As Double |
'| btePresnost As Byte |
'| lngMaxPocetIteraci As Long |
'| Vystupni hodnota: lngIterace = pocet iteraci k dosazeni cilove hodnoty |
'| -1 = nelze poupravit ani krok (max. 100x krat zjemnuje) |
'| -2 = prekrocen maximalni pocet iteracnich kroku |
'| (nekonverguje), ev. je nutno vice kroku |
'| -3 = chyba pri "update" soucasti |
'| -4 = neni co optimalizovat |
'| Autor funkce: Bretislav Dolezal®, +420-483354426 |
'+----------------------------------------------------------------------------------+

Dim dblDump As Double
Dim dblHodnotaPredIteraci, dblHodnotaPoIteraci As Double
Dim dblKrok, dblPresnost As Double
Dim blnUpravenyKrok As Boolean
Dim MsgResponse As Integer
Dim intItKrok, lngIterace As Integer
Dim dblPomocne1, dblPomocne2 As Double
Dim intZnamenko As Integer

dblDump = prmRidiciParametr.Value
dblPresnost = 10 ^ (-btePresnost)
dblKrok = dblVstupniKrok
dblHodnotaPredIteraci = prmOptimalizovanyParametr.Value
intItKrok = 1
lngIterace = 1
intZnamenko = 1
If dblCilovaHodnota < prmOptimalizovanyParametr.Value Then intZnamenko = -1

If Abs(dblCilovaHodnota - prmOptimalizovanyParametr.Value) > dblPresnost Then
' neni nahodou cilova hodnota stejna jako stavajici

Do 'smycka pro kontrolu a pripadnou upravu kroku
blnUpravenyKrok = False
prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok

On Error Resume Next
prtSoucast.Update

If Err.Number <> 0 Then
OptimalizacniFce = -3
prmRidiciParametr.Value = dblDump
prtSoucast.Update
Exit Function
End If
On Error GoTo 0

dblHodnotaPoIteraci = prmOptimalizovanyParametr.Value
prmRidiciParametr.Value = prmRidiciParametr.Value - dblKrok

dblPomocne1 = Abs(dblCilovaHodnota - dblHodnotaPredIteraci)
dblPomocne2 = Abs(dblHodnotaPoIteraci - dblHodnotaPredIteraci)
If dblPomocne1 < dblPomocne2 Then
If dblPomocne2 <> 0 And dblPomocne1 <> 0 Then 'kontrola pro zamezeni deleni nulou
dblKrok = dblKrok / (2 * dblPomocne2 / dblPomocne1)
End If
intItKrok = intItKrok + 1
If intItKrok > 100 Then
'chyba, vypadato na spatne podminky a nelze ani poupravit krokovani
OptimalizacniFce = -1
prmRidiciParametr.Value = dblDump
prtSoucast.Update
Exit Function
End If
blnUpravenyKrok = True
End If
Loop Until blnUpravenyKrok = False

Do 'iterace na cilovou hodnotu
Do

prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok
On Error Resume Next
prtSoucast.Update
If Err.Number <> 0 Then
OptimalizacniFce = -3
prmRidiciParametr.Value = dblDump
prtSoucast.Update
Exit Function
End If
On Error GoTo 0

dblHodnotaPoIteraci = prmOptimalizovanyParametr.Value
lngIterace = lngIterace + 1
CATIA.StatusBar = "Aktuální po&#232;et itera&#232;ních krok&#249;:" & CStr(lngIterace) & "; akt.cílová hodnota:" & prmOptimalizovanyParametr.ValueAsString

If lngIterace > lngMaxPocetIteraci Then
'prekrocen maximalni pocet iteraci
OptimalizacniFce = -2
prmRidiciParametr.Value = dblDump
prtSoucast.Update
Exit Function
End If

'zpomaleni
'Dim i, j As Long
'j = 0
'For i = 1 To 10000
' j = j + 1
' DoEvents
'Next i

Loop Until (intZnamenko * prmOptimalizovanyParametr.Value) >= (intZnamenko * dblCilovaHodnota)
prmRidiciParametr.Value = prmRidiciParametr.Value - dblKrok 'pokud p&#248;ekro&#232;eno, vra&#157; krok zp&#236;t a zmenši krok (**)
dblKrok = dblKrok / 10

Loop Until Abs(dblCilovaHodnota - prmOptimalizovanyParametr.Value) < dblPresnost

'úprava hodnoty na poslední hodnotu iterace, kv&#249;li p&#248;epo&#232;tu ve smy&#232;ce, viz (**) 5 &#248;ádk&#249; zp&#236;t
prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok * 10

On Error Resume Next
prtSoucast.Update

If Err.Number <> 0 Then
OptimalizacniFce = -3
prmRidiciParametr.Value = dblDump
prtSoucast.Update
Exit Function
End If
On Error GoTo 0

OptimalizacniFce = lngIterace

Else
OptimalizacniFce = -4
prmRidiciParametr.Value = dblDump
prtSoucast.Update
End If

End Function

Public Function OptimalizacniFceProduct(prdSestava As Product, prmRidiciParametr As KnowledgewareTypeLib.Parameter, _
prmOptimalizovanyParametr As KnowledgewareTypeLib.Parameter, dblVstupniKrok As Double, _
dblCilovaHodnota As Double, Optional btePresnost As Byte = 3, Optional lngMaxPocetIteraci As Long = 5000) As Integer
'+----------------------------------------------------------------------------------+
'| Jmeno: »»»»» OptimalizacniFceProduct ««««« |
'| Vstupni parametry: prdSestava As Product |
'| prmRidiciParametr As KnowledgewareTypeLib.Parameter |
'| prmOptimalizovanyParametr As KnowledgewareTypeLib.Parameter |
'| dblVstupniKrok As Double |
'| dblCilovaHodnota As Double |
'| btePresnost As Byte |
'| lngMaxPocetIteraci As Long |
'| Vystupni hodnota: lngIterace = pocet iteraci k dosazeni cilove hodnoty |
'| -1 = nelze poupravit ani krok (max. 100x krat zjemnuje) |
'| -2 = prekrocen maximalni pocet iteracnich kroku |
'| (nekonverguje), ev. je nutno vice kroku |
'| -3 = chyba pri "update" soucasti |
'| -4 = neni co optimalizovat |
'| Autor funkce: Bretislav Dolezal®, +420-483354426 |
'+----------------------------------------------------------------------------------+

Dim dblDump As Double
Dim dblHodnotaPredIteraci, dblHodnotaPoIteraci As Double
Dim dblKrok, dblPresnost As Double
Dim blnUpravenyKrok As Boolean
Dim MsgResponse As Integer
Dim intItKrok As Integer
Dim lngIterace As Long
Dim dblPomocne1, dblPomocne2 As Double
Dim intZnamenko As Integer

dblDump = prmRidiciParametr.Value
dblPresnost = 10 ^ (-btePresnost)
dblKrok = dblVstupniKrok
dblHodnotaPredIteraci = prmOptimalizovanyParametr.Value
intItKrok = 1
lngIterace = 1
intZnamenko = 1
If dblCilovaHodnota < prmOptimalizovanyParametr.Value Then intZnamenko = -1

If Abs(dblCilovaHodnota - prmOptimalizovanyParametr.Value) > dblPresnost Then
' neni nahodou cilova hodnota stejna jako stavajici

Do 'smycka pro kontrolu a pripadnou upravu kroku
blnUpravenyKrok = False
prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok

On Error Resume Next
prdSestava.Update
If Err.Number <> 0 Then
OptimalizacniFceProduct = -3
prmRidiciParametr.Value = dblDump
prdSestava.Update
Exit Function
End If
On Error GoTo 0

dblHodnotaPoIteraci = prmOptimalizovanyParametr.Value
prmRidiciParametr.Value = prmRidiciParametr.Value - dblKrok

dblPomocne1 = Abs(dblCilovaHodnota - dblHodnotaPredIteraci)
dblPomocne2 = Abs(dblHodnotaPoIteraci - dblHodnotaPredIteraci)
If dblPomocne1 < dblPomocne2 Then
If dblPomocne2 <> 0 And dblPomocne1 <> 0 Then 'kontrola pro zamezeni deleni nulou
dblKrok = dblKrok / (2 * dblPomocne2 / dblPomocne1)
End If
intItKrok = intItKrok + 1
If intItKrok > 100 Then
'chyba, vypadato na spatne podminky a nelze ani poupravit krokovani
OptimalizacniFceProduct = -1
prmRidiciParametr.Value = dblDump
prdSestava.Update
Exit Function
End If
blnUpravenyKrok = True
End If
Loop Until blnUpravenyKrok = False

Do 'iterace na cilovou hodnotu
Do
prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok
On Error Resume Next
prdSestava.Update
If Err.Number <> 0 Then
OptimalizacniFceProduct = -3
prmRidiciParametr.Value = dblDump
prdSestava.Update
Exit Function
End If
On Error GoTo 0

dblHodnotaPoIteraci = prmOptimalizovanyParametr.Value
lngIterace = lngIterace + 1
CATIA.StatusBar = "Aktuální po&#232;et itera&#232;ních krok&#249;:" & CStr(lngIterace) & "; akt.cílová hodnota:" & prmOptimalizovanyParametr.ValueAsString
If lngIterace > lngMaxPocetIteraci Then
'prekrocen maximalni pocet iteraci
OptimalizacniFceProduct = -2
prmRidiciParametr.Value = dblDump
prdSestava.Update
Exit Function
End If
Loop Until (intZnamenko * prmOptimalizovanyParametr.Value) >= (intZnamenko * dblCilovaHodnota)
prmRidiciParametr.Value = prmRidiciParametr.Value - dblKrok 'pokud p&#248;ekro&#232;eno, vra&#157; krok zp&#236;t a zmenši krok (**)
dblKrok = dblKrok / 10

Loop Until Abs(dblCilovaHodnota - prmOptimalizovanyParametr.Value) < dblPresnost

'úprava hodnoty na poslední hodnotu iterace, kv&#249;li p&#248;epo&#232;tu ve smy&#232;ce, viz (**) 5 &#248;ádk&#249; zp&#236;t
prmRidiciParametr.Value = prmRidiciParametr.Value + dblKrok * 10

On Error Resume Next
prdSestava.Update
If Err.Number <> 0 Then
OptimalizacniFceProduct = -3
prmRidiciParametr.Value = dblDump
prdSestava.Update
Exit Function
End If
On Error GoTo 0

OptimalizacniFceProduct = lngIterace

Else
OptimalizacniFceProduct = -4
prmRidiciParametr.Value = dblDump
prdSestava.Update

End If

End Function

Public Function VyberParametru(strZprava As String) As KnowledgewareTypeLib.Parameter

Const strFiltr As String = "Parameter, Constraint" 'co m&#249;že uživatel vybírat
Dim oSelekce As Object
Dim varTempArr As Variant
Dim vararrFiltr() As Variant
Dim strStatus As String
Dim i As Byte
Dim oParam As KnowledgewareTypeLib.Parameter

'p&#248;evod String na pole pro funkci SelectElement
varTempArr = Split(strFiltr, ",")
ReDim vararrFiltr(UBound(varTempArr))
For i = 0 To UBound(varTempArr)
vararrFiltr(i) = Trim(varTempArr(i))
Next i

strZprava = strZprava & " [ESC]=Strono"
Set oSelekce = CATIA.Application.ActiveDocument.Selection
oSelekce.Clear
CATIA.Application.Visible = True

strStatus = oSelekce.SelectElement3(vararrFiltr, strZprava, False, CATMultiSelTriggWhenSelPerf, False) 'CATMonoSel

'pro toto lepší parametr CATMonoSel na místo CATMultiSelTrigg.. nefunguje! Nevím pro&#232;....?
'jednodušší varianta:
'strStatus = oSelekce.SelectElement2(vararrFiltr, "Vyber parametr", False)

'Rozbor výsledk&#249; selekce:
Select Case strStatus
Case "Normal"
'i = oSelekce.Count2
'Jedna se o Constrain?
If TypeName(oSelekce.Item2(1).Value) = "Constraint" Then
If oSelekce.Item2(1).Value.Type = catCstTypeDistance Or _
oSelekce.Item2(1).Value.Type = catCstTypeLength Or _
oSelekce.Item2(1).Value.Type = catCstTypeAngle Or _
oSelekce.Item2(1).Value.Type = catCstTypePlanarAngle Or _
oSelekce.Item2(1).Value.Type = catCstTypeRadius Or _
oSelekce.Item2(1).Value.Type = catCstTypeMajorRadius Or _
oSelekce.Item2(1).Value.Type = catCstTypeMinorRadius Or _
oSelekce.Item2(1).Value.Type = catCstTypeChamfer Or _
oSelekce.Item2(1).Value.Type = catCstTypeChamferPerpEnd Or _
oSelekce.Item2(1).Value.Type = catCstTypeCylinderRadius Then
'Ov&#236;&#248;uje se, zda-li se jedná o constrain, kde se upravuje n&#236;jaká hodnota
Set oParam = oSelekce.Item2(1).Value.Dimension
If IsNumeric(oParam.Value) Then
Set VyberParametru = oParam 'Jedná se o vhodný constrain jakožto parametr. Funkce vrátí parametr
Else 'Constrain nemá &#232;íselnou hodnotu, Funkce vrátí objekt Nothing a vyvolá chybu
Set VyberParametru = Nothing
Err.Number = vbObjectError + 50
Err.Source = "Catia"
Err.Description = "Vybrán špatný constrain - nejedná se o &#232;íselnou hodnotu."
End If
Else 'Constrain není v seznamu použitelných typ&#249;, Funkce vrátí objekt Nothing a vyvolá chybu
Set VyberParametru = Nothing
Err.Number = vbObjectError + 50
Err.Source = "Catia"
Err.Description = "Vybrán špatný constraint - nejedná se o &#232;íselnou hodnotu."
End If
'Nejedná se o Constrain, ale o Parameter
Else
Set oParam = oSelekce.Item2(1).Value
If IsNumeric(oParam.Value) Then 'Jedná se o &#232;íselný parametr:
Set VyberParametru = oParam 'Funkce vrátí parametr
Else 'Nejedná-li se o &#232;íselný parametr:
Set VyberParametru = Nothing 'Funkce vrátí objekt Nothing a vyvolá chybu
Err.Number = vbObjectError + 50
Err.Source = "Catia"
Err.Description = "Vybrán špatný parametr - nejedná se o &#232;íselnou hodnotu."
End If
End If
Case "Undo" 'P&#248;i výb&#236;ru se použilo UnDo &#232;i ReDo - nemá smysl pro toto makro
Case "Redo"
Case "Cancel" '[Esc] - Storno
Set VyberParametru = Nothing 'Funkce vrátí objekt Nothing
Err.Number = vbObjectError + 50
Err.Source = "Catia"
Err.Description = "ESC - zrušena akce"
Case Else 'N&#236;co neur&#232;itého se p&#248;i výb&#236;ru pod&#236;lalo
Set VyberParametru = Nothing 'Funkce vrátí objekt Nothing
Err.Number = vbObjectError + 50
Err.Source = "Catia"
Err.Description = "N&#236;co špatn&#236; p&#248;i výb&#236;ru parametru"
End Select

'+---------------------------------------------------------------------------+
'| *** Pozn. typy parametru: *** |
'+---------------------------------------------------------------------------+
'| TypeName(Parameter) = "Length", "Angle", "StrParam", "BoolParam", |
'| "IntParam", "Dimension", "RealParam" |
'+---------------------------------------------------------------------------+

'Destruct object (not necessary, but sometime it helps):
Set oSelekce = Nothing
Set oParam = Nothing

End Function

 
Excel 2010 22.2. 2013 Z Office 2003 na 2007 jsem neměl žádný problém. Snad jen úprava dialogů na delší přípony *.xlsx, xlsm, apod... O Office 2010 si mohu zatím nechat pouze zdát. Fungoval klasický GetObject. Jen napojit nové reference.
 
Export dat z Excelu do vykresu 20.2. 2013 Uložit tabulku jako *.csv a tu potom příkazem "Table From CSV" vložit do výkresu. Tool bar: Annotations.
 
V5 Makro - Kusovník ve výkresu - diskuse k článku 22.2. 2013 Myslel jsem si. Děkuji za potvrzení, už jsem to jednou použil u makra pro Danu http://www.catia-forum.cz/forum/topic.php?topic_id=685, ale nevyužil jsem plně možnosti tohoto Gridu. Moc se mi líbí ten checkbox a to že tam půjde dávat ta tlačítka. To bude asi dost dobře použitelné. S .NET si občas pohraji, ale co se týče maker jsem začátečník amatér.
V5 Makro - Kusovník ve výkresu - diskuse k článku 22.2. 2013 Jakou komponentu používáte na formuláři pro rozpisku?
Myslím tento formulář:
http://www.catia-forum.cz/img/articles/img_65_bom_dialog_1.jpg
Díky Břeťa
 
Update výkresu 18.1. 2013 Nejedná se jen o izolovanou geometrii, která není generovaná z 3D? Zkusit to co neupdatuje smazat a potom na pohledu Restore Properties, Deleted
 
Eport Bodů do Exelu 8.1. 2013 Já jen změnil

Dim coords(2) As Integer 


na

Dim coords(2) As Variant 


a vše fungovalo bez problémů

Catia V5 R19 SP8 BN18, MS Office 2007
 
parametr na změnu boolean operace 18.12. 2012 Uživatel odpovídá na příspěvek #3541:


Jednoduchý příklad na zapínání a vypínání operace na základě parametru string připojen. Nevýhodou je, že se musí ohlídat stejné textové řetězce v parametru a následně v podmínce pro aktivitu true/false.
parametr na změnu boolean operace 10.12. 2012 Myslím si, že jednoduše v rámci update změna z Add na Remove nepůjde. Nebo také nevím jak.? Já bych udělal obojí Add i Remove a potom bych zapínal buď Add či Remove. Body mohou být stejné,s tím že uděláte z toho jednoho Body další kopii Body s linkem. Viz. přiložený soubor.
 
Kontrola správnosti Core and Cavity dutin 10.12. 2012 V sestavách: Menu: Tools ->Generate CATPart from CATProduct... následně vybrat z jaké sestavy, popř. podsestavy
Kontrola správnosti Core and Cavity dutin 7.12. 2012 Asi bych zkusil Generate CATPart from CTAProduct a potom bych odečítal v Part designu.
Zkusil jsem a šlo to - přiloženo.
 
Červené kóty po aktualizaci pohledu - DRAFTING 7.12. 2012 Kóty ztratily asociativitu. Nejsou již přichycené k dílu. Díl se asi změnil natolik, že se negenerují stejné entity, ke kterým byli kóty přiřazeny. Už bude nutno znovu nalinkovat kóty.
 
MULTI-PAD 20.11. 2012 Dá se udělat skoro vše:o) U tohoto spíš poradím používat Output profile. I když pokud se udělá dobře skica tak i multipad lze.
 
Export stromu ze sestavy 12.11. 2012 Dost podobný příspěvek:
http://www.catia-forum.cz/forum/topic.php?topic_id=685
 
DMU kinematics - naklápění 7.12. 2012 Kinematiku nepoužívám, ale nejednodušší by viděl: dát tam další CATPart, který má s těmi příčkami vazbu bod na přímce "Point Curve Joint".
 
makro na evolventne ozubeni 31.10. 2012 neni to primo makro, ale ozubene kolo to udela vcelku pohodlne: http://gtrebaol.free.fr/doc/catia/spur_gear.html
 
Cyklo-paloidne ozubene kolo 11.10. 2012 Pokud si to vybavuji dobře, jde o evolventní zakřivení zubu a stejná výška zubu. Kužele hlavové a patní mají vrchol jinde (na řezu jsou hrany kužele rovnoběžně) Asi bych vytvořit profil zubu (asi je i jedno, kde jestli na vnitřním nebo vnější straně kužele a potom si táhnout tento profil po evolventě). Tím vznikne bok zubu. To samé potom i pro druhý bok, dodělat základní kužele a plochy pospojovat a vytvořit zub, který následně jen nakopírovat kolem dokola.
 
PartNumber - jméno partu na disku 12.9. 2012 Uživatel odpovídá na příspěvek #3334:


Takze se to podarilo rozchodit? Jsem rad, pokud ano.
PartNumber - jméno partu na disku 27.8. 2012 Uživatel odpovídá na příspěvek #3246:


Ufff, tak to netuším, kde je chybička. Vypadá to, že částečně makro beželo a na něčem zkolabovalo. Nemám ošetřeno vše univerzálně. Možná používáte v sestavách něco co my ne. Jinak dokáže makro jít do jakéhokoliv levelu.

Je možné udělat třeba nějakou jednoduchou sestavu zkusit na ní makro a pokud to stále kolabuje, tak poskytnout tuto sestavu?

Klidně poskytnu i zdroj, ale je potom zapotřebí mít Visual Studio a potom si to zkompilovat.

A nebo rovnou, zde je zdroj: (na formuláři jsou tři tlačítka btnStart, btnVycistit, btnChangePN a DataGridView). Třebas někdo uvidí chybičku, která se u mě neprojeví.


Public Class frmOutputTable
Public Const strCaption As String = "Makro - Partname & FileName"
Public CATIA As INFITF.Application 'CATIA Application Object

Dim msgText As String
Dim msgResp As MsgBoxResult
Dim msgButtons As MsgBoxStyle
Dim colAssyLevel As New Collections.Generic.List(Of Integer)
Dim colPodprodukty As New Collections.Generic.List(Of Product)
Dim objProdukt As Product
Dim intMaxAssyLevel As Integer


Public Function JeKonec(ByVal istrMessage As String) As Boolean
'Vrátí True nebo False podle reakce uživatele

CATIA.StatusBar = istrMessage
istrMessage &= vbCrLf & "Chceš teď předčasně ukončit makro"
msgButtons = MsgBoxStyle.Question Or MsgBoxStyle.YesNo
msgResp = MsgBox(istrMessage, msgButtons, strCaption)
If msgResp = vbYes Then
Return (True)
Else
Return (False)
End If
CATIA.StatusBar = ""
End Function 'JeKonec

Public Function GetProdukt(ByVal iCATIA As INFITF.Application) As Product
'Vrátí objekt Product z aktivního dokumentu, případně otevře nový dokument.
'V případě, že není aktivní Product a makro bude přerušeno, Funkce vrátí Nothing
Dim Soubor As String
Dim objDocument As Document
Dim blnSestavaOtevrena As Boolean = False

Do
Try
objDocument = iCATIA.ActiveDocument 'Přiřazení aktivního dokumentu
If TypeName(objDocument) = "ProductDocument" Then 'Pokud je aktivním dokumentem setava tak ji předá a ukončí tuto funkci
Return (CType(objDocument.Product, Product))
Else
msgText = TypeName(objDocument) & " nemůže být použit pro toto makro" & vbCrLf 'Sice je něco v Catii, ale není to sestava "
msgText &= "
Sestava (CATProduct) musí být načtená a aktivní pro toto makro!"
If JeKonec(msgText) Then 'Chceš skončit tuto funkci
Return (Nothing) ' ANO konec funkce, vrací nothing
End If
End If

Catch ex As Exception
msgText = "
Sestava (CATProduct) musí být načtená a aktivní pro toto makro!"
If JeKonec(msgText) Then 'Chceš skončit tuto funkci
Return (Nothing) ' ANO konec funkce, vrací nothing
End If
End Try

'NE neukončí funkci a dále nabídne otevření sestavy
Do
msgText = "
Otevři sestavu (CATProduct), kterou chceš analyzovat"
iCATIA.StatusBar = msgText
Soubor = iCATIA.FileSelectionBox("
Oteřít CATProduct", "*.CATProduct", CatFileSelectionMode.CatFileSelectionModeOpen)

If String.IsNullOrEmpty(Soubor) Or Not (Soubor.Contains("
CATProduct")) Then
msgText = "
Otevřen špatný soubor. Musí být otevřen CATProduct!"
If JeKonec(msgText) Then 'Chceš skončit tuto funkci
Return (Nothing) ' ANO konec funkce, vrací nothing
End If
Else
Try
iCATIA.Documents.Open(Soubor)
blnSestavaOtevrena = True 'pokud se podaří otevřít dokument smyčka pro otvírání souboru bude ukončena
Catch ex As Exception
msgText = "
Sestavu nelze otevřít!"
If JeKonec(msgText) Then 'Chceš skončit tuto funkci
Return (Nothing) ' ANO konec funkce, vrací nothing
End If
End Try
End If
'NE tak znovu otevírej sestavu, smyčka

Loop Until blnSestavaOtevrena
Loop
End Function 'GetProdukt

''' summary
''' Rekurzivní funkce pro procházení sestavy
''' summary
''' param name=iProduktDefinuje Product který se má projítparam
''' param name=iAssyLevelAktuální úroveň Productu v sestavěparam
''' param name=iPodproduktyKolekce vyzískaných Produktuparam
''' remarks
''' Prozkoumá sestavu iProdukt Do hloubky a případné nalezené produkty přidá Do iPodprodukty
''' remarks
Public Sub ProduktExplorer(ByVal iProdukt As Product, ByVal iAssyLevel As Integer, ByVal iPodprodukty As Collections.Generic.List(Of Product))
Dim locProdukty As Products 'Kolekce produktů uvnitř produktu iProdukt
Dim locProdukt As Product 'Produkt z kolekce Produkty
Dim intAssyLevel As Integer = iAssyLevel

intAssyLevel += 1
locProdukty = iProdukt.Products
For Each locProdukt In locProdukty
iPodprodukty.Add(locProdukt)
colAssyLevel.Add(intAssyLevel)
ProduktExplorer(locProdukt, intAssyLevel, iPodprodukty) 'Rekurzivní volání
Next locProdukt
intAssyLevel -= 1
End Sub 'ProduktExplorer

''' summary
''' Určení nejnižší úrovně sestavy
''' summary
''' param name=iAssyLevelsKolekce iAssyLevels, ze kterých se má určit maximumparam
''' returnsMaximální level - nejnižší úroveň sestavyreturns
''' remarks
''' Projde kolekci a vyhledá nejvyšší vnoření v sestavě
''' remarks
Public Function GetMaxLevel(ByVal iAssyLevels As System.Collections.Generic.List(Of Integer)) As Integer
'Vrátí maximální level v seznamu subkomponent
Dim locMaxLevel As Integer = 0

For i As Integer = 0 To iAssyLevels.Count - 1
If iAssyLevels.Item(i) > locMaxLevel Then locMaxLevel = iAssyLevels.Item(i)
Next i
Return locMaxLevel
End Function 'GetMaxLevel

Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Dim locDocument As Document
Dim locProdukt As Product
Dim intLevel As Integer


Cursor.Current = Cursors.WaitCursor
CleanGrid()

'vytvoření objektu CATIA
Try
CATIA = CType(GetObject(, "
CATIA.Application"), INFITF.Application)
Exit Try
Catch ex As Exception
msgText = "
Catie nemůže být nalezena mezi běžícími procesy." & vbCrLf
msgText &= "
Zkontroluj zda máš spušťenou Catii a spusť makro ještě jednou" & vbCrLf
msgText &= "
Pokud ji máš spuštěnou, může být něco s makrem, volej +420-604600585" & vbCrLf
MsgBox(msgText, vbExclamation, strCaption)
Exit Sub
End Try

objProdukt = GetProdukt(CATIA)
If IsNothing(objProdukt) Then Exit Sub 'nebyla přiřazena sestava - ukonči tuto proceduru, popř. přidat odezvu Do formuláře

colPodprodukty.Add(objProdukt)
colAssyLevel.Add(1)

ProduktExplorer(objProdukt, 1, colPodprodukty)

intMaxAssyLevel = colAssyLevel.Max


'EXLSheet.Cells(1, 1) = "Struktura sestavy" & objProdukt.Name
'EXLSheet.get_Range(EXLSheet.Cells(1, 1), EXLSheet.Cells(1, intMaxAssyLevel + 1)).Merge()

Dim RowEntering(intMaxAssyLevel + 1) As String
MyGrid.Columns.Add("
AssyLevel", "Assy Level")

For i As Integer = 1 To intMaxAssyLevel
MyGrid.Columns.Add("
PN" & CStr(i) & "Level", "Part Number" & vbCrLf & CStr(i) & ".Assy Level")
Next i
MyGrid.Columns.Add("
FileName", "File Name")
MyGrid.Columns.Add("
Changes", "Proceeded Changes")


For i As Integer = 0 To colPodprodukty.Count() - 1

'světlé odstíny červená, zelená, modrá
' intRed = CInt(155 + (50 + colAssyLevel.Item(i) / intMaxAssyLevel) * (colAssyLevel.Item(i) Mod 3))
' intGreen = CInt(155 + (50 + colAssyLevel.Item(i) / intMaxAssyLevel) * ((colAssyLevel.Item(i) + 1) Mod 3))
' intBlue = CInt(155 + (50 + colAssyLevel.Item(i) / intMaxAssyLevel) * ((colAssyLevel.Item(i) + 2) Mod 3))

For j As Integer = 0 To RowEntering.Count - 1
RowEntering(j) = "
"
Next

locProdukt = colPodprodukty.Item(i)
locDocument = CType(locProdukt.ReferenceProduct.Parent, Document)
intLevel = colAssyLevel.Item(i)

RowEntering(0) = CStr(intLevel)
RowEntering(intLevel) = locProdukt.PartNumber
RowEntering(intMaxAssyLevel + 1) = locDocument.FullName

MyGrid.Rows.Add(RowEntering)

Next i

Cursor.Current = Cursors.Arrow
btnChangePN.Enabled = True

End Sub

Public Sub New()

' This call is required by the designer.
InitializeComponent()

' Add any initialization after the InitializeComponent() call.
Me.Text = strCaption
MyGrid.Top = 30
MyGrid.Height = Me.Height - 56
MyGrid.Left = 0
MyGrid.Width = Me.Width - 7
btnChangePN.Enabled = False

End Sub

Private Sub frmOutputTable_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
MyGrid.Top = 30
MyGrid.Height = Me.Height - 56
MyGrid.Left = 0
MyGrid.Width = Me.Width - 7

End Sub

Private Sub CleanGrid()
MyGrid.Rows.Clear()
MyGrid.Columns.Clear()

colAssyLevel.Clear()
colPodprodukty.Clear()
btnChangePN.Enabled = False

End Sub

Private Sub btnVycistit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVycistit.Click
CleanGrid()
End Sub


Private Sub btnChangePN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChangePN.Click
Dim locDocument As Document
Dim locProduct As Product
Dim PathCutted() As String
Dim OldNameCutted() As String
Dim strNewName, strOldPN As String
Dim strOldIndex As String


For i As Integer = 0 To colPodprodukty.Count() - 1
locProduct = colPodprodukty.Item(i)
locDocument = CType(locProduct.ReferenceProduct.Parent, Document)

strOldPN = locProduct.PartNumber
OldNameCutted = Split(locProduct.Name, "
.")
strOldIndex = OldNameCutted(OldNameCutted.Count() - 1)

strNewName = locDocument.FullName
PathCutted = Split(strNewName, "
\")
strNewName = PathCutted(PathCutted.Count() - 1)
If strNewName.Contains("
CATProduct") Then strNewName = strNewName.Remove(strNewName.Length - 11)
If strNewName.Contains("
CATPart") Then strNewName = strNewName.Remove(strNewName.Length - 8)

If Not strNewName = locProduct.PartNumber Then
locProduct.PartNumber = strNewName
locProduct.Name = strNewName & "
." & strOldIndex

MyGrid.Rows(i).Cells("
Changes").Value = "PN Change from: '" & strOldPN & "' to '" & strNewName & "'"

Dim MyStyle As New DataGridViewCellStyle()
MyStyle.ForeColor = Color.Red

MyGrid.Rows(i).Cells("
Changes").Style.ApplyStyle(MyStyle)

MyGrid.Rows(i).Cells(colAssyLevel(i)).Value = locProduct.PartNumber
End If




Next i
End Sub
End Class



PartNumber - jméno partu na disku 24.8. 2012 Makro na změnu PartNumber dle jména souboru. Vytvořeno ve VB2010 (exe soubor)
 
Monitor 23.11. 2017 Zkusím ještě k tomu tématu přidat další dotaz. Zvládá CATIA V5 i 4K rozlišení? Nemáte někdo zkušenosti s prací na 4K monitoru a grafickou kartou, která dá vyšší rozlišení. Zajímalo by mě jestli třeba na 32" či 43" monitoru mohu normálně fungovat s CATIA v 4K rozlišení?

Dále by mě ještě zajímalo, jestli CATIA nějako podporuje dotykové displeje? Zda mohu třeba na místo myši (či spacemouse) manipulovat a upravovat geometrii pomocí prstotlaku na monitor? Máte někdo zkušenost?
Líbilo by se mi třeba tvorba skicy, tažením prstu po obrazovce, s tím, že by třeba druhý prst doupřesňoval jaký typ geometrie použít. Jeden prst posun, dva prsty rotace, zoom jako na telefonech, apod.......

Pokud by bylo možno výše uvedené shlédnout u některého z místních prodejců-distributorů CATIA, tak mi prosím dejte vědět, rád bych to případně viděl na živo.
Monitor 24.8. 2012 2x 22" LCD zn.DELL: 1600x1200 (Catia) a 1280x1024 (ostatní) - 60Hz, občas poblikává, tak mě alespoň přinutí zamrkat. Oči občas zabolí, takže asi to není ideální.
 
Zistenie mena užívateľa 20.8. 2012 Další možnost:


Dim WSNet As Object
Dim Zprava As String

Set WSNet = CreateObject("WScript.Network")

Zprava = "Uživatel: " & WSNet.UserName & vbCrLf
Zprava = Zprava & "Počítač: " & WSNet.ComputerName & vbCrLf
MsgBox Zprava, vbExclamation, "Msg"
 
Několika násobný split plochy -> vrstevnice 23.8. 2012 Tak to API nepodporuje :o(. V manuálech nic a záznamník také nic. A jsem v ...
No nic, musím upravit výchozí plochu a změnit měřítko v jednom směru, takto to funguje. změní se výškové rozdíly z desítek mm na jednotky mm a bude.
Několika násobný split plochy -> vrstevnice 21.8. 2012 Nevíte někdo náhodou jak v API zapnout/vypnout volbu "Keep element in half space" u operace Split? Pokud řežu plochu s velikým výškovým rozdílem, tak není problém, zůstává jen jedna část, ale pokud jsou rozdíly pouze v setinách mm. Tak mi Catie nechává obě části plochy při řezu a pokud zapnu volbu Keep element in half space, tak to nechá jen jednu část, což potřebuji. Možná by to řešilo i nějaké přenastavení přesnosti pro výpočet, ale to už vůbec nevím jak ovlivnit....Díky za případnou radu.
Několika násobný split plochy -> vrstevnice 20.8. 2012 Díky za rady. Už se mi podařilo dodělat základ makra.
Multi domain byl bez komplikací, nechával po řezech vše, tudíž jsem to nemusel ani řešit. Na oplátku ještě kousek kódu na určení, zda jsou roviny rovnoběžné, pro případné zájemce:


Public Shared Function AreParalel(ByVal iPart As Part, ByVal iFirstPlane As Plane, ByVal iSecondPlane As Plane) As Boolean
Dim locSPAWB As SPATypeLib.SPAWorkbench
Dim locFirstReference, locSecondReference As Reference
Dim locMeasurable As SPATypeLib.Measurable
Dim dblAngle As Double

locFirstReference = iPart.CreateReferenceFromObject(iFirstPlane)
locSecondReference = iPart.CreateReferenceFromObject(iSecondPlane)
locSPAWB = iPart.Parent.GetWorkbench("SPAWorkbench") 'aktivování Space Analysis workbench
locMeasurable = locSPAWB.GetMeasurable(locFirstReference) 'definování 1.reference k měření (základna pro měření)
dblAngle = locMeasurable.GetAngleBetween(locSecondReference) 'měření úhlu mezi definovanou 2.reference a již definovanou 1.referencí

If dblAngle = 0 Then
Return (True)
Else
Return (False)
End If
End Function
Několika násobný split plochy -> vrstevnice 7.8. 2012 Uživatel odpovídá na příspěvek #3157:


Díky. V nápovědě pro .GetMinimumDistance mají .Measurable na místo .GetMeasurable.

Hurá, mám první krok pro určení horní a spodní roviny.

To jak budu rozhodovat o tom který split nechat a který ne bude asi také "sranda". Vypadá to že budu muset dočasně udělat oba s volbou 1 a -1 a potom se z měření rozhodnout. Pokud bude výsledkem více ploch, tak je budu chtít zachovat všechny. To by snad nemusel být problém, pokud bude možné makrem dát volbu "keep all".
Několika násobný split plochy -> vrstevnice 7.8. 2012 Nefunguje mi objSPAWorkbench.Measurable. Že prý objekt nepodporuje tuto vlastnost či metodu. Máte někdo zkušenosti?


'---- Begin resolution script For object : Sweep.1

Dim partDocument1 As PartDocument
Set partDocument1 = CATIA.ActiveDocument

Dim part1 As Part
Set part1 = partDocument1.Part

Dim hybridBodies1 As HybridBodies
Set hybridBodies1 = part1.HybridBodies

Dim hybridShapeFactory1 As HybridShapeFactory
Set hybridShapeFactory1 = part1.HybridShapeFactory

Dim hybridBody1 As HybridBody
Set hybridBody1 = hybridBodies1.Item("Geometrical Set.1")

Dim hybridShapes1 As HybridShapes
Set hybridShapes1 = hybridBody1.HybridShapes

Dim hybridShapeSweepExplicit1 As HybridShapeSweepExplicit
Set hybridShapeSweepExplicit1 = hybridShapes1.Item("Sweep.1")

Dim hybridShapePlaneOffset5 As HybridShapePlaneOffset
Set hybridShapePlaneOffset5 = hybridShapes1.Item("Plane.1")


Dim reference6 As Reference
Set reference6 = part1.CreateReferenceFromObject(hybridShapeSweepExplicit1)

Dim reference7 As Reference
Set reference7 = part1.CreateReferenceFromObject(hybridShapePlaneOffset5)

Dim objSPAWorkbench As Workbench
Set objSPAWorkbench = part1.Parent.GetWorkbench("SPAWorkbench")

Dim objMeasurable As Measurable
Set objMeasurable = objSPAWorkbench.Measurable(reference6)

Dim MinimumDistance As Double
MinimumDistance = TheMeasurable.GetMinimumDistance(reference7)

'Dim CompositeRef As Reference
'Set CompositeRef = reference6.ComposeWith(reference7)
'Dim TheMeasurable As Measurable
'Set TheMeasurable = objSPAWorkbench.Measurable(reference7)
'objSPAWorkbench.M
Dim hybridShapeSplit1 As HybridShapeSplit
Set hybridShapeSplit1 = hybridShapeFactory1.AddNewHybridSplit(reference6, reference7, 1)
hybridShapeFactory1.GSMVisibility reference6, 0
hybridBody1.AppendHybridShape hybridShapeSplit1
part1.InWorkObject = hybridShapeSplit1
part1.Update

'---- End resolution script
End Sub
 
Pozice těžiště Body v sestavě 6.8. 2012 Uživatel odpovídá na příspěvek #3144:


Tak zakopaný pes je v tom, že pokud provedu přetypování z Product na Part a potom zpět na Product z Part, tak ztrácím informace o poloze. Takže tady mám problém. Jinak zde je moje pidi funkcička na určení polohy objektu Product, kopie z Helpu:


Public Function ProductPosition(ByVal iProduct As Product) As Double()
'' x axis components
'iAxisComponentsArray(0) = 1.0
'iAxisComponentsArray(1) = 0
'iAxisComponentsArray(2) = 0.707
'' y axis components
'iAxisComponentsArray(3) = 0
'iAxisComponentsArray(4) = 0
'iAxisComponentsArray(5) = 0.707
'' z axis components
'iAxisComponentsArray(6) = 0
'iAxisComponentsArray(7) = -0.707
'iAxisComponentsArray(8) = 0.707
'' origin point coordinates
'iAxisComponentsArray(9) = 1.0
'iAxisComponentsArray(10) = 2.0
'iAxisComponentsArray(11) = 3.0

Dim dblAxisComp(11) As Double
Dim locAxisComponentsArray(11) As Object
iProduct.Position.GetComponents(locAxisComponentsArray)
For i As Integer = 0 To 11
dblAxisComp(i) = CType(locAxisComponentsArray(i), Double)
Next i
Return (dblAxisComp)
End Function 'ProductPosition

Pozice těžiště Body v sestavě 6.8. 2012 Uživatel odpovídá na příspěvek #3139:

Jak zjistit polohu Partu v sestavě?
Pozice těžiště Body v sestavě 6.8. 2012 Uživatel odpovídá na příspěvek #3137:

objekt Product není problém. Problém je, pokud mám objekt Inertia z Body a tento objekt Inertia mi dává polohu těžiště k nule Partu. Jde mi o to, jak zjistit polohu těžiště Body v souřadnému systému Sestavy? Ev. polohu těžiště Partu vzhledem k sestavě? Zatím umím určit inertia pouze z Productu a z Body a Inertia z Body je vzhledem k středu Partu :o(


Public Function GetProductInertia(ByVal iProdukt As Product) As Inertia
'If successful, this Function will Return an Inertia object of Product
'Otherwise, Nothing is returned (you should check the Return value)
'Function For Product measuring - from website: http://v5vb.wordpress.com/2010/10/27/measuring-mass-inertia/
'Mass, density, center of gravity, etc. can be obtained from Inertia object
Dim objInertia As Inertia

Try
objInertia = CType(iProdukt.ReferenceProduct.GetTechnologicalObject("Inertia"), Inertia)
Return (objInertia)
Catch ex As Exception
Return (Nothing)
End Try
End Function 'GetProductInertia

Public Function GetBodyInertiaMeasure(ByVal iPart As Part, ByVal iBody As Body) As Inertia
'If Function is successfully proceeded, this Function will Return an inertia object
'Otherwise, Nothing is returned (you should check the Return value)
'Function For body measuring - from website: http://v5vb.wordpress.com/2010/10/27/measuring-mass-inertia/
'Mass, density, center of gravity, etc. can be obtained from Inertia object
Dim objSPAWorkbench As SPAWorkbench
Dim objInertia As Inertia

Try
objSPAWorkbench = CType(iPart.Parent.GetWorkbench("SPAWorkbench"), SPAWorkbench)
objInertia = CType(objSPAWorkbench.Inertias.Add(iBody), Inertia)
Return (objInertia)
Catch ex As Exception
Return (Nothing)
End Try

End Function 'GetBodyInertiaMeasure


 
Selectelement3 13.8. 2012 Uživatel odpovídá na příspěvek #3175:


asi né ideální, ale zatím řeším takto:


Public Shared Function Selekce(ByVal iCATIA As INFITF.Application, ByVal strVyzva As String, ByVal strTypy As String) As Object

Dim oSelekce As INFITF.Selection
Dim objFilterArr() As Object
Dim strDocasne() As String
Dim strStatus As String
Dim intFiltrPocet As Integer

'Dim oParam As KnowledgewareTypeLib.Parameter

'převod String na pole pro funkci SelectElement
strDocasne = strTypy.Split(CChar(","))
For Each s As String In strDocasne
s.Trim()
Next s

intFiltrPocet = strDocasne.Length()

'pokud vstupní parametr strTypy je prazdný, tak nic nevracej, uživatel špatně používá funkci
If intFiltrPocet < 1 Then
Return (Nothing)
End If

ReDim objFilterArr(intFiltrPocet - 1)

For i As Integer = 0 To intFiltrPocet - 1
objFilterArr(i) = strDocasne(i)

Next i

strVyzva = strVyzva & " [ESC]=Strono"
oSelekce = iCATIA.Application.ActiveDocument.Selection
oSelekce.Clear()

iCATIA.Application.Visible = True

strStatus = oSelekce.SelectElement3(objFilterArr, strVyzva, False, INFITF.CATMultiSelectionMode.CATMultiSelTriggWhenSelPerf, False)

Selectelement3 13.8. 2012
Snažím se použít funkci SelectElement3 ve VB 2008, ale mám problém. Ve VB6 se použilo pole typu Variant pro první parametr iFilterType. Jaký se deklaruje typ ve VB2008? Intelisens nabízí System.Array, ale s tím to nechce projít.

SelectElement3( CATSafeArrayVariant iFilterType,
CATBSTR iMessage,
boolean iObjectSelectionBeforeCommandUsePossibility,
CATMultiSelectionMode iMultiSelectionMode,
boolean iTooltip) As CATBSTR


Public Shared Function Selekce(ByVal iCATIA As INFITF.Application, ByVal strVyzva As String, ByVal strTypy As String) As Object

Dim oSelekce As INFITF.Selection
Dim varStringArr As System.Array
Dim strStatus As String

varStringArr = strTypy.Split(CChar(","))

strVyzva = strVyzva & " [ESC]=Strono"
oSelekce = iCATIA.Application.ActiveDocument.Selection
oSelekce.Clear()

iCATIA.Application.Visible = True

strStatus = oSelekce.SelectElement3(varStringArr, strVyzva, False, INFITF.CATMultiSelectionMode.CATMultiSelTriggWhenSelPerf, False)

 
Combobox default value 17.7. 2012 tak jestli to je ve VB6, tak bych jeste zkusil:

Private Sub UserForm_Initialize()
ComboBox1.AddItem ("xy")
ComboBox1.AddItem ("yz")
ComboBox1.AddItem ("xz")
ComboBox1.Value = "xy"

End Sub
Combobox default value 17.7. 2012 Zkusil bych:
[PRE]ComboBox_Rovina.SelectedItem() = "xy"
 
Zacatek makra 20.7. 2012 Ověřování přes Selection se dá vyhnout následovně:


Err.Clear
'Kontrola jestli je aktivní dokument Part nebo Product, jinak ukonči makro
On Error GoTo ErrHandler ' V případě že Desk nebo nic je aktivní
If TypeName(CATIA.ActiveDocument) = "PartDocument" Then
'Aktivní dokument je Part, pokra&#232;uj
Set oPart = CATIA.ActiveDocument.Part
strDokTyp = "Part"
ElseIf TypeName(CATIA.ActiveDocument) = "ProductDocument" Then
'Aktivní dokument je Product, pokra&#232;uj
Set oSestava = CATIA.ActiveDocument.Product
strDokTyp = "Product"
Else
'Aktivní dokument není Part ani produkt, ukonči makro
MsgText = TypeName(CATIA.ActiveDocument) & " is unsupported document!" & vbCrLf
MsgText = MsgText & "CATPart or CATProduct hAs to be active."
MsgResponse = MsgBox(MsgText, vbExclamation)
Exit Sub
End If
Err.Clear
On Error GoTo 0


V případě zájmu, potom mohu poslat verzi i pro Visual Studio 2005
 
Vyjádření podmínky přímo v parametrech 8.6. 2012 add druhý dotaz: pokud by nevadil dá se i aktivovat/deaktivovat jednotlivé položky na místo show/noshow, viz. připojený příklad, kde můžete zkusit měnit parametr na 4mm a 6mm třebas
 
Spojitost mezi objekty Product a Document? 19.7. 2012 Zdravím ještě jednou k tomuto tématu. Potřeboval bych vyzjistit, jak v sestavě nějak bezpečně rozpoznat když mám seznam produktů, co je model z Catie V4. Part a Product rozeznat už umím, tím že přetypuji Product na Document a zněj už se ptám na typ. Ale přetypování z Productu na Document nefunguje u V4 modelu. Je nějaká vlastnost či funkce u Produktu co by mi řekla, že se jedná o V4 model. Minimálně mohu rozeznat podle jména, páč máme všechny V4 modely s počátečním prefixem, ale nezdá se mi to moc bezpečné a univerzální pro kohokoliv jiného mimo naší firmu.
Děkuji za případnou radu. Snad jsem to vysvětlil dostatečně


Public Sub ProduktExplorer(ByVal iProdukt As Product, ByVal iPodprodukty As System.Collections.Generic.List(Of cls_SubComponent))
'Prozkoumá sestavu iProdukt Do hloubky a případné nalezené produkty přidá Do ArrayListu iPodprodukty
'Příklad:
'Dim Pole As ArrayList
'ProduktExplorer (CATIA.ActiveDocument.Product, Pole)

Dim locProdukty As Products 'Kolekce produktů uvnitř produktu iProdukt
Dim locProdukt As Product 'Produkt z kolekce Produkty
Dim locDocument As Document
Dim locSubKomp As New cls_SubComponent
Dim locPart As Part

intAssyLevel += 1
locProdukty = iProdukt.Products
For Each locProdukt In locProdukty

locDocument = CType(locProdukt.ReferenceProduct.Parent, Document)
'pokud je V4 model tak neprovede přetypování a locDocument je referencí na předchozí úspěšné přetypování, nutno před tímto ověřit co je V4 model,
' ale jak zjistit je locProduct je V4 model


If TypeName(locDocument) = "PartDocument" Then
locPart = CType(locProdukt.ReferenceProduct.Parent.Part, Part)
locSubKomp = StorePartInfo(locPart, intAssyLevel)
iPodprodukty.Add(locSubKomp)
'ještě projít jednotlivá Body
For Each iBody As Body In locPart.Bodies
If iBody.InBooleanOperation = False Then
locSubKomp = StoreBodyInfo(locPart, iBody, intAssyLevel + 1)
iPodprodukty.Add(locSubKomp)
End If
Next
ElseIf TypeName(locDocument) = "ProductDocument" Then
locSubKomp = StoreProductInfo(locProdukt, intAssyLevel)

'If locDocument.FullName.Contains("model") Then 'TOTO ZATIM NEFUNGUJE NUTNO OPRAVIT !!!!!!!!!!!!!!!!
' locSubKomp.Type = cls_SubComponent.SubComponentType.Model
'End If
iPodprodukty.Add(locSubKomp)
Else
'dokument není ani Part ani Product, neznámý object
locSubKomp.Name = locDocument.FullName
locSubKomp.Type = cls_SubComponent.SubComponentType.Unknown
iPodprodukty.Add(locSubKomp)
End If
ProduktExplorer(locProdukt, iPodprodukty) 'Rekurzivní volání
Next locProdukt
intAssyLevel -= 1
End Sub 'ProduktExplorer

Spojitost mezi objekty Product a Document? 6.6. 2012 Špatně jsem se vyjádřil. U VS2010 Expres mi vadí, že nevidím v Locals na obsah Catiovských objektů při ladění. Ale jak jsem již psal...část programu si udělám v Catii VB6 a potom si to přenesu do VS. Dá se to přežít.
Spojitost mezi objekty Product a Document? 6.6. 2012 Už používám toto porovnání
Product.PartNumber = Document.Product.PartNumber


Můj problém je hlavně v tom, jak z Product objektu pro Part vyzískat referenci na ten objekt Part a následně s tím pracovat.

Toto by bylo ideální, ale nefunguje to.
Part = Product.ReferencedProduct.Part


Toto funguje, ale musím právě vyzjišťovávat který object Document odpovídá objektu Product.
Part = Document.Part



Hurá!!!
...už to asi mám z tvé rady, jen spojit více řádků... (doplnil jsem ještě .Parent.)

Part = Product.ReferenceProduct.Parent.Part 


Jinak .NET není problém. Už používám Visual Basic 2010Express, ale to až když mám doladěný základ pro Catii. VB 6 v Catii mi ukazuje strukturu objektů. VS2010 mi ukazuje jen že se jedná o COM instanci a nevidím struktůru objektu. Možná jen nevím jak to zapnout, ale spíš předpokládám, že to ani nejde. Každopádně veliké dík za radu.
 
Hmotnost samostatného Body 3.8. 2012 Uživatel odpovídá na příspěvek #113:


Odpověď na něco staršího, ale třeba to ještě pomůže. Nevím jestli to je ideální řešení, ale mně vyhovuje:
   

Public Function MaterialOfBody(ByVal iBody As Body) As String
'Vrátí název materiálu pro Body
Dim locMaterial As Material = Nothing
Dim locMatManager As MaterialManager
locMatManager = CType(iBody.GetItem("CATMatManagerVBExt"), MaterialManager)
locMatManager.GetMaterialOnBody(iBody, locMaterial)
If locMaterial Is Nothing Then
Return ("NONE")
Else
Return (locMaterial.Name)
End If
End Function 'MaterialOfBody


Když je materiál NONE, tak potom mi je jasné jak s tím dál naložit.