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

Selectelement3

Kompletní přehled příspěvků v tématu Selectelement3 řazený podle data jejich publikace na fóru.

UživatelPříspěvek
Pavel Krsek

Poslat zprávu | Profil
Datum: 30.7. 2012 | Zobrazeno: 10627x
Konfigurace CATIA:

Text dotazu:
Ahoj,
mam nasledujici cast scriptu:

Status = oSelection.SelectElement3(InputObjectType, "Select Body", _

True, CATMultiSelTriggWhenUserValidatesSelection, False)
For i = 1 To oSelection.Count
Set oBodyx = bodies1.Item(i)

MsgBox oBodyx.Name
Next

a mam prazdny part napr. ze 4 Bodies s nazvy PartBody, Body.1, Body.2, Body.3.
Po spusteni makra pres funkci SelectElement3 mam moznost vice Bodies, to provedu - oznacim Body.2 a Body.3 - ukoncim vyber a kontrolni MsgBox by mel vyhodit nazvy danych Bodies, ale vyhodi nazev 2 prvnich Bodies (tj. PartBody, Body.1)!!!
Tzn. makro pozna pocet vybranych Bodies, ale ignoruje specificky vyber, ale pocet Bodies si odpocita od PartBody dale.

Ma s tim nekdo zkusenost? Nebo je nekde chyby v mem scriptu?

Ing Jan Cinert

Poslat zprávu | Profil
[#3114] | Publikováno: 30.07. 2012 - 08:29
Máte chybu ve skriptu. Nemůžete použít bodies1.Item(i) - to je kolekce se všemi Body v partu (kterou ještě ke všemu máte zřejmě náhodou vytvořenou, jinak by to ani nefungovalo. Ve For cyklu musíte použít kolekci selekce, procházíte přeci vybrané feature a ne Body v Partu:

For i = 1 to oSelection.Count

MsgBox = oSelection.Item(i).Value.Name
Next
Pavel Krsek

Poslat zprávu | Profil
[#3115] | Publikováno: 30.07. 2012 - 08:38
Ja, ale potrebuji prochazet Body v Partu.
Uzivatel pres SelectElement oznaci zadouci Body v Partu a ty se pak dle dalsiho scriptu korektne prejmenuji.
Ing Jan Cinert

Poslat zprávu | Profil
[#3116] | Publikováno: 30.07. 2012 - 09:36
Mícháte jablka a hrušky dohromady. Chcete procházet to, co předtím vyberete - a je jedno jestli to jsou Body nebo něco jiného. Proto musíte procházet kolekci oSelection, která se vytvoří po výběru features uživatelem.
Pokud chcete procházet jen Body (nebo všechna Body), není důvod používat Selekci, jde to udělat jinak a efektivněji.

Vy ale berete index i z kolekce Selection (to je seznam všech vybraných features) ale pak berete objekty z kolekce bodies1 (to jsou asi ta Body v Partu). To ale přece nejde, počet prvků v Selekci může být vyšší než počet Body v bodies1 a hlavně je to programově totální šílenost.

Takže, chcete přejmenovat jen vybraná Body nebo všechna?
Pavel Krsek

Poslat zprávu | Profil
[#3117] | Publikováno: 30.07. 2012 - 09:42
V pripade, ktery jsem napsal, chci opravdu prejmenovat jen vybrana Body uzivatelem.
Pavel Krsek

Poslat zprávu | Profil
[#3118] | Publikováno: 30.07. 2012 - 10:12
Dekuji moc za rady.
Nahradil jsem tedy radek:

Set oBodyx = bodies1.Item(i)

radkem:

Set oBodyx = oSelection.Item(i).Value  


a jiz to funguje.

Tim jsem vyresil prvni problem v celem scriptu.
Druhy je ten, ze pokud uzivatel nechce prejmnovat jen vybrana Body, ale vsechny, tak nevim, jak oznacit jen Body "v rootu" viz. obr. (potrebuji oznacit jen PartBody, Body.2 a Body.3).
Pokud pouziji funkci search Bodies, tak dostanu samozrejmne kolekci vsech Body vcetne tech vlozenych pres boolovske operace.

Diky za radu


Přiložené obrázky:

Ing Jan Cinert

Poslat zprávu | Profil
[#3119] | Publikováno: 30.07. 2012 - 11:19
To je jednoduché, jsou v podstatě dvě cesty:

1. zapomeňte na selekci - kolekce root Body je ve vlastnosti Bodies partu

oRootBodies = oPart.Bodies
' pak
For i = 1 to oRootBodies.Count
' skript
Next


2. ověřte si, je-li body v Booleovské operaci - pokud ano, pak to nemůže být root Body
For i = 1 To oSelection.Count

If oBody.InBooleanOperation = True Then
' skript
End If
Next
Pavel Krsek

Poslat zprávu | Profil
[#3121] | Publikováno: 30.07. 2012 - 13:04
Diky moc,
uz to funguje.

Akorat na podminku "True" to nijak neregovalo tj. neokazalo napr. nazev Body, kterou jsou v boolovske operaci.
Pri podmince "False" to funguje tj.napr. ukaze nazev Body ktere jsou v zakladnim rootu.
Ing Jan Cinert

Poslat zprávu | Profil
[#3122] | Publikováno: 30.07. 2012 - 15:14
:-) Já mám sice v kódu true, ale předtím píšu, že pokud je Body v bool. operaci (true) pak nemůže být root Body - proto logicky musí být v podmínce false. Bylo to jen na ukázku, ale asi vás to zmátlo.
Břeťa Doležal

Poslat zprávu | Profil
[#3175] | Publikováno: 13.08. 2012 - 10:27

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)

Břeťa Doležal

Poslat zprávu | Profil
[#3176] | Publikováno: 13.08. 2012 - 12:17
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)

Ing Jan Cinert

Poslat zprávu | Profil
[#3178] | Publikováno: 13.08. 2012 - 14:36
Já to deklaruju takto:
Dim iFilter(0)

a pak např.
iFilter(0) = "Body"

a je to OK.

Mělo by to jít i podstrčit jako parametr té vaší funkci.


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.