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: 10907x
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....

Ing Jan Cinert

Poslat zprávu | Profil
[#7296] | Publikováno: 11.03. 2026 - 16:34
Zdravím, já to šel podobně a výsledek není tak pomalý. Postup byl asi takhle:

1. Vytvořím tangent extract
2. Vyberu všechny face na solidu
3. Měřím vzdálenost extract - každá face

tím dostanu všechny face, které jsou v extractu, ale bohužel i ty, které se ho jen dotýkají, takže dále

4. na každé face vytvořím bod (on surface s nějakým direction, když se nevytvoří, otočím směr)
5. pak změřím vzdálenost bodu na ploše od extractu - když je 0, plocha na 100% přísluší extractu a jde do výběru.

V podstatě jen jeden průchod, ale všemi plochami na solidu.

Mám to implementované v toolu na barvení ploch, byl to kdysi požadavek zákazníka.
Zkoušel jsem teď na příkladu: solid ca 760 plošek, výběr byl na 270 tangentních, trvalo to ca 1minutu 30 vteřin.

A tohle také dokáže zvýšit rychlost :-)

' vypnuti synchronizece vyberu pro zvyseni vykonu

CATIA.HSOSynchronized = True


Btw, na tuhle funkcionalitu čekám roky...jde to u draftu, shellu, thicknessu, Joinu...tak proboha proč to není ve výběru jen tak.


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.