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

Vb net Hole

UživatelPříspěvek
Pavel Krsek

Poslat zprávu | Profil
Datum: 16.12. 2015 | Zobrazeno: 10583x
Konfigurace CATIA:

Text dotazu:
Dobry den,
v catvba mi chodil script na tvorbu Hole, ale nyní ve vb.net mám problém s vlastností ButtomType

oHole.BottomType = catVHoleBottom

Otvor script udělá, ale s rovným dnem tj. daný řádek ignoruje. Nevíte někdo jak na to? Je v pořádku, že musím danou hodnotu deklarovat tj.:
Dim catVHoleBottom

Děkuji za radu.

Ing Jan Cinert

Poslat zprávu | Profil
[#5543] | Publikováno: 16.12. 2015 - 12:01
Typy děr a podobné jiné vlastnosti jsou tzv. enumerace. Ve VBA to stačí uvádět jen takhle jednoduše, v .NET se jen použije enumerace s daným typem. Mělo by ji to i napovědět, tj. po napsání názvu enmurace se za tečkou rozbalí jednotlivé typy.

V .NET je to pak takto:
oHole.BottomType = CatHoleBottomType.catVHoleBottom

Přiložené obrázky:

Pavel Krsek

Poslat zprávu | Profil
[#5544] | Publikováno: 16.12. 2015 - 12:26
Děkuji moc.
Už to chodí.
Pavel Krsek

Poslat zprávu | Profil
[#5556] | Publikováno: 06.01. 2016 - 09:53
Dobrý den,
ještě mám prosím problém s přiřazením reference k ButtomLimit - catUpToPlaneLimit. Ve VBA to chodilo přes příkaz:
oBottomLimit.LimitingElement = LimitFace
.
Ve vb.net mám script, kde vyskočí chyba na posledním řádku (nevím také, zda-li musím vytvářet referenci LimitFaceRef - ve VBA stačilo jen LimitFace):
Status = oSelection.SelectElement2(InputObjectType, "Select limit face", True)

If (Status = "Cancel") Then Exit Sub
Dim LimitFace = oSelection.Item(1).Value
oSelection.Clear()

oBrepDelka = Len(LimitFace.DisplayName)
oBrepKorekce = InStr(LimitFace.DisplayName, "(")
oBrepName = Microsoft.VisualBasic.Left(LimitFace.DisplayName, oBrepDelka - 1)
oBrepName = Microsoft.VisualBasic.Right(oBrepName, Len(oBrepName) - oBrepKorekce)
Dim LimitFaceRef = oPart.CreateReferenceFromBRepName(oBrepName, LimitFace.Parent)
'*****************************************************
Dim oHole
Dim oLimit
Dim oDiamater
Dim oVisProperty
oHole = oShapeFactory.AddNewHoleFromRefPoint(oVertex, FirstFace, 10)
oHole.Type = PARTITF.CatHoleType.catCounterboredHole
oHole.AnchorMode = catExtremPointHoleAnchor
oHole.BottomType = PARTITF.CatHoleBottomType.catTrimmedHoleBottom
oHole.ThreadingMode = PARTITF.CatHoleThreadingMode.catSmoothHoleThreading
oDiamater = oHole.Diameter
oDiamater.Value = oPrumerM
oDiamater = oHole.HeadDiameter
oDiamater.Value = oPrumerV

oLimit = oHole.BottomLimit
oLimit.LimitMode = PARTITF.CatLimitMode.catUpToPlaneLimit
oLimit.LimitingElement(LimitFaceRef)

Děkuji moc za radu.
Ing Jan Cinert

Poslat zprávu | Profil
[#5557] | Publikováno: 06.01. 2016 - 10:43
Tady bývá většinou problém s vytvořením reference přes CreateReferenceFromBrepName. Pokud nevybíráte plochy z jiného partu (v rámci sestavy), dá se použít přímo z výběru reference - místo Selection.Item().Value se použie ...Item().Reference. Pak to vrací přímo objekt reference.

Vytváření referencí přes funkce CreateReference... používán jen případě, že přitom nepoužívám výběr, tj. např. při použití existujících známých publikací apod. Pokud geometrii vybírá uživatel, lze použít výše uvedené.

V každém případě je dobré dopsat kousek kódu, kde si ověříte, že vytvořená reference je skutečně ta, kterou chcete. Ona se totiž často vytvoří bez chyby, ale nejde použít, resp. CATIA ji nezkousne.
Pavel Krsek

Poslat zprávu | Profil
[#5558] | Publikováno: 06.01. 2016 - 10:49
Děkuji za radu.
Zkusil jsem změnit na:
Dim LimitFace = oSelection.Item(1).Reference ............

oLimit.LimitingElement(LimitFace)

ale u posledního řádku dostanu hlášku viz. příloha.

Přiložené obrázky:

Ing Jan Cinert

Poslat zprávu | Profil
[#5559] | Publikováno: 06.01. 2016 - 11:54
V jakém jste kontextu? Jen v Partu nebo v sestavě? V partu by to mělo být OK....

Zkuste referenci použít s jinou funkcí, např. Offset. Když nebude fungovat, je špatně vytvořená. Jinak podle API je očekáván typ Reference.
Pavel Krsek

Poslat zprávu | Profil
[#5561] | Publikováno: 06.01. 2016 - 12:25
Jsem v part designu - part v samostatnem oknu. Reference je asi v pořádku. Zkusil jsem:
Dim Thickness = oShapeFactory.AddNewThickSurface(LimitFace, 1, 5, 5)

a thickness se provedl korektně.

K té referenci - já jsem něvěděl, že jde použít u oSelection.Item(1) hodnota Reference, tak jsem to složitě nahrazoval přes CreateReferenceFromBRepName.
Ing Jan Cinert

Poslat zprávu | Profil
[#5563] | Publikováno: 06.01. 2016 - 12:33
Zkuste změnit typ limitu na CATUpToSurfaceLimit. Když ani to nepomůže, zkuste si to manuálně a nahrát rekordérem a pak se do toho podívejte, třeba je tam nějaký zádrhel.

Jinak CreateReferenceFromBRepName se musí použít jen v sestavě, tam jiná možnost není.
Pavel Krsek

Poslat zprávu | Profil
[#5564] | Publikováno: 06.01. 2016 - 13:29
CATUpToSurfaceLimit take nefunguje - viz. stejná hláška Member not found.
Recorder jsem zkusil a hodnoty mám stejné - skoro stejný script, když pustím ve VBA, tak jde OK, ale tady ve vb.net to za nic neprojde? Je jedno, zda-li se napíše:
oLimit.LimitingElement = LimitFace

nebo
oLimit.LimitingElement(LimitFace)

?
Pavel Krsek

Poslat zprávu | Profil
[#5565] | Publikováno: 06.01. 2016 - 13:39
Zkusil jsem místo k ploše jako limit použít rovinu XY, viz.:
Dim originElements1 = oPart.OriginElements

Dim oPlane = originElements1.PlaneXY
Dim oRef = oPart.CreateReferenceFromObject(oPlane)

oLimit = oHole.BottomLimit
oLimit.LimitMode = PARTITF.CatLimitMode.catUpToPlaneLimit
oLimit.LimitingElement = oRef

ale pořád stejná hláška. Ach, jo.
Ing Jan Cinert

Poslat zprávu | Profil
[#5568] | Publikováno: 07.01. 2016 - 08:13
K předchozímu příspěvku:

oLimit.LimitingElement(LimitFace) je špatně, LimitingElement není metoda, ale vlastnost, proto vždy musí být přiřazení oLimit.LimitingElement = LimitFace
Ing Jan Cinert

Poslat zprávu | Profil
[#5569] | Publikováno: 07.01. 2016 - 08:18
Chyba byla v typu Limitu. V API je sice napsáno, že je vyžadovaná reference, ale ne jako typ, pouze jako vstup. Takže poprvé jste měl chybu v syntaxi - volal jste neexistující metodu, a podruhé jste už přiřazoval správně, ale špatný typ.

Takhle to funguje:

oDoc = CATIA.ActiveDocument

oSelection = oDoc.Selection

ReDim ObjSel(0)
ObjSel(0) = "Hole"

oSelection.SelectElement2(ObjSel, "dira", False)
oHole = oSelection.Item(1).Value

oSelection.Clear()

Dim oLimit As HybridShape
ObjSel(0) = "BiDimInfinite"

oSelection.SelectElement2(ObjSel, "face", False)
oLimit = oSelection.Item(1).Value

oHole.BottomLimit.LimitMode = CatLimitMode.catUpToSurfaceLimit
oHole.BottomLimit.LimitingElement = oLimit

oDoc.Part.Update()
Pavel Krsek

Poslat zprávu | Profil
[#5571] | Publikováno: 07.01. 2016 - 09:23
Děkuji.
Zatím mi to pořád nejde. Zkusil jsem udělat úplně nový projekt s vaším scriptem, ale mám problém s deklarací oLimit. Viz. hláška.
Jaké musím mít naiportované knihovny? Já mám nyní:
Imports INFITF

Imports MECMOD
Imports PARTITF

Přiložené obrázky:

Ing Jan Cinert

Poslat zprávu | Profil
[#5572] | Publikováno: 07.01. 2016 - 11:49
Klidně dejte oLimit jako Object, to půjde taky. Jinak typ HybridShape je jakýkoliv plocha nebo wireframe element, je v knihovne HybridShapeTypeLib, která je ale od R24 v seznamu COM referencí pod názvem začínajícím CATGsm...
Pavel Krsek

Poslat zprávu | Profil
[#5573] | Publikováno: 07.01. 2016 - 12:18
Pořád jsme bohužel na tom stejně. Typ je tedy object. Ve space je jeden part (v příloze) - pad ve kterém je Hole-Blind(neprůchozí) - spustím script (označím hole a pak označenou plochu jako limitu) a zase stejná hláška viz. začátek (na řádku ....=oLimit)(Member not found). Celý script v Console Aplication:
Imports INFITF

Imports MECMOD
Imports PARTITF
Module Module1
Dim oDoc
Dim CATIA As Application
Sub Main()
CATIA = GetObject(, "CATIA.Application")
oDoc = CATIA.ActiveDocument
Dim oSelection = oDoc.Selection
Dim ObjSel(0)
ObjSel(0) = "Hole"
oSelection.SelectElement2(ObjSel, "dira", False)
Dim oHole = oSelection.Item(1).Value
oSelection.Clear()
Dim oLimit As Object
Dim ObjSel2(0)
ObjSel2(0) = "BiDimInfinite"
oSelection.SelectElement2(ObjSel2, "face", True)
oLimit = oSelection.Item(1).Value
oHole.BottomLimit.LimitMode = CatLimitMode.catUpToPlaneLimit
oHole.BottomLimit.LimitingElement = oLimit
oDoc.Part.Update()
End Sub
End Module

Přiložené soubory:
Part619.CATPart

Ing Jan Cinert

Poslat zprávu | Profil
[#5575] | Publikováno: 07.01. 2016 - 13:56
Proč jste změnil LimitMode na catUpToPlane? Já tam měl catUpToSurface...

Jestli vybíráte plochu, tak je jasné, že to nemůže fungovat.

A zkuste oHole nadeklarovat jako typ Hole. Takhle si jen přebírá strukturu z objektu oSelection a to může být také problém. Podle chyby to vypadá, že daná vlastnost v objektu není - Member not found.

Všiml jsem si že nikde u deklarací neuvádíte typy a to je špatně.

Takže Dim oHole As Hole = ...
Pavel Krsek

Poslat zprávu | Profil
[#5576] | Publikováno: 08.01. 2016 - 06:19
Tak konečně. Problem byl opravdu jen v tom, že Hole neměl deklaraci.

Jinak LimitMode funguje jak s catUpToPlaneLimit tak s catUpToSurfaceLimit. Ve VBA ta tak taky bylo.

Mockrát děkuji.


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.