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

Výběr, označení ploch na mrtvém solidu

UživatelPříspěvek
Pavel Francák

Poslat zprávu | Profil
Datum: 30.11. 2013 | Zobrazeno: 10848x
Konfigurace CATIA: V5 R19

Text dotazu:
Mohl by mi někdo poradit zda existuje způsob jak vybrat plochy na „mrtvém“ solidu které jsou k sobě tangentně napojeny , co nejjednodušším způsobem, do ted to dělám přes Ctrl + oklikání všech ploch (potřebuji to k jejich následnému obarvení).

Přiložené obrázky:

Ing Jan Cinert

Poslat zprávu | Profil
[#4292] | Publikováno: 01.12. 2013 - 11:04
Dobrý den,

nedávno jsem řešil přesně to samé. Hledal jsem i na zahraničních fórech a nic kloudného, jak by to šlo přímo nenašel. Přitom by to mělo být úplně snadné, tangentní výběr používá hned několik funkcí (thickness, draft, extract). Pokud neexistuje nějaká nedokumentovaná syntaxe pro dotaz search, tak to opravdu asi nejde. A bohužel to nevypadá lépe ani ve vyšších release V5 (ve V6 jsem to nezkoušel).

Nakonec jsem to vyřešil makrem, které se opírá o extract a následné měření vzdáleností face na solidu od tohoto extractu, resp. bodu který se na extractu vytváří. Funguje to spolehlivě, ale s rostoucí velikostí modelu uměrně narůstá čas potřebný k identifikaci příslušnosti plochy k tangentnímu extractu. Takže uživatel pak nemusí s Ctrl oklikávat každou plochu (zvlášť pokud jsou hodně malé segmenty), ale chvilku to trvá.

Pavel Francák

Poslat zprávu | Profil
[#4297] | Publikováno: 01.12. 2013 - 15:43
Díky za tip, já na makra moc nejsem ale předám zkušenějšímu kolegovi.
Ing Jan Cinert

Poslat zprávu | Profil
[#4299] | Publikováno: 01.12. 2013 - 18:27
A nechcete si rovnou vyzkoušet makro Color Standard, které kromě obarvení ploch podle barevného standardu umí i výběr podle tangentní návaznosti? Licence na zkoušku zdarma na 21 dnů.
Břeťa Doležal

Poslat zprávu | Profil
[#4305] | Publikováno: 05.12. 2013 - 08:48
@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.
Ing Jan Cinert

Poslat zprávu | Profil
[#4306] | Publikováno: 05.12. 2013 - 09:17
Kolekce faces není nikde, ale jde to takhle:
oSelection.Add(solid)

oSelection.Search(".face, sel")

primitivní, ale velice účinné...
Pavel Zálešák

Poslat zprávu | Profil
[#5506] | Publikováno: 03.12. 2015 - 10:34
Dobrý den,

tečný výběr ploch objemu je tedy možný pouze pomocí makra. Když navážu na toto téma, a zeptám se jestli je možné vybrat podobným způsobem všechny plochy objemu pro obarvení? Někdy, zejména při kopírování objemů s linkou je někdy v barvách chaos a není možné barvy ani resetovat, ani nijak jednoduše vybírat...

Díky, Pavel.
Břeťa Doležal

Poslat zprávu | Profil
[#7293] | Publikováno: 24.02. 2026 - 13:34
Potřebuji vybrat tečné plochy na Solidu, tak se vracím k tomuto tématu:
Když vyberu přes SelectElement2 plošku na Solidu a následně přetypuji objekt ze Selection na Face. Tak nevím jak následně položku převést na Reference.
Názve Face. get_Name() je "Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf14:());Add.1_ResultOUT;Z0;G10403)"

CreateReferenceFromObject a CreateReferenceFromGeometry mi nefungují.

refPloska = dil.CreateReferenceFromName(ploska.get_Name());
funguje, ale asi jen na oko.

Tady to následně zkolabuje
extractTecPlocha = hsFactory.AddNewExtract(refPloska);


když dám záznam makra, tak se Reference tvoří následovně:
Set reference1 = part1.CreateReferenceFromBRepName("RSur:(Face:(Brp:(Pad.1;2);None:();Cf14:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR29)", add1)


Musí se opravdu Reference tvořit přes CreateReferenceFromBRepName?

Jaký je nej postup ze selekce plošky na solidu získat použitelnou referenci?
Dá se vždycky počítat s tím, že řetěz:

"Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf14:());Add.1_ResultOUT;Z0;G10403)"

Mohu vždy rozbít na "RSur:(Face:(Brp:(Pad.1;2);None:();Cf14:());" a připojit "WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR29)" ? Co značí CXR29 a kde dohledám?

Z názvu selekce za středníkem "Add.1" bude vždy příslušný vhodný tvar?, který si musím následně vytěžit do příslušného tvarového objektu?

Dim add1 As Add
Set add1 = shapes1.Item("Add.1")


Břeťa Doležal

Poslat zprávu | Profil
[#7294] | Publikováno: 24.02. 2026 - 13:52
Tak nakonec s touto tvorbou reference mi to začalo šlapat. Jen obyčejné přetypování bez CreateReferenceFrom...
Reference refPloska = (Reference)ploska;
Břeťa Doležal

Poslat zprávu | Profil
[#7295] | Publikováno: 03.03. 2026 - 08:46
Podařilo se mi dopracovat se k pomalému řešení. Bych měl dotaz na případnou optimalizaci. Nejprve relativně rychle vyfiltruji plošky, které mají nulovou vzdálenost od Extractu. Následně jedu druhý filtr, ale zde narážím. Pokud mám tečnou plochu třeba z 500 plošek, tak mi potom makro běží přes hodinu. Beru plošky z Extractu a již předfiltrované na Solidu. Jedu následně tyto smyčky:


For (int j = 0; j < facesOnExtractCount; j++)
{
CATIA.set_StatusBar("Macro progress second Loop " + j.ToString() + " out of " + facesOnExtractCount.ToString());
int i = 0;
bool identical = false;

While (i < facesFirstFilteringResult.Count && !identical)
{
try
{
Reference referFaceOrig = facesFirstFilteringResult[i];
Measurable measFaceOrig = spa.GetMeasurable(referFaceOrig);
Reference referExtractFace = facesOnExtract[j];
Measurable measExtractFace = spa.GetMeasurable(referExtractFace);
If (measFaceOrig.Area == measExtractFace.Area)
{
double distance = measFaceOrig.GetMinimumDistance(referExtractFace);
If (distance == 0)
{
object[] oCOG = new object[3];
object[] eCOG = new object[3];
measFaceOrig.GetCOG(oCOG);
measExtractFace.GetCOG(eCOG);
If (((double)oCOG[0] == (double)eCOG[0]) && ((double)oCOG[1] == (double)eCOG[1]) && ((double)oCOG[2] == (double)eCOG[2]))
{
facesToColor.Add(referFaceOrig);
facesFirstFilteringResult.RemoveAt(i);
identical = true;
}
}
}
}
catch
{
MessageBox.Show("Něco se podělalo při druhém filtrování", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
i++;
}
}


Neměl by někdo rychlejší a efektivnější způsob na filtrování plošek? Můj kód sice jede, ale dost pomalu...než projede cca 500x500x(~500/2) měření při 500ploškách.
By DS mohl tu selekci plošek na Solidu také implementovat do CATIA, když už mají kód pro výběr ploch v rámci Extractu....



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.