Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  CATIA V5 Programmierung
  Face Objekt aus Referenz Objekt ziehen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min
  
KISTERS 3DViewStation: verbesserte Effizienz durch optimierte Bedienoberfläche, eine Pressemitteilung
Autor Thema:  Face Objekt aus Referenz Objekt ziehen (108 / mal gelesen)
user7
Mitglied



Sehen Sie sich das Profil von user7 an!   Senden Sie eine Private Message an user7  Schreiben Sie einen Gästebucheintrag für user7

Beiträge: 23
Registriert: 26.08.2022

erstellt am: 21. Mrz. 2025 09:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

ich würde gerne eine CAA Methode schreiben, die Faces zurückgibt. 

Zum Test habe ich eine Methode geschrieben welche ein Face als Referenz bekommt und dann einfach dieses Face wieder zurückgeben soll.
Der Umweg über Selection funktioniert - also das Face in CAA der Selection zuweisen und dann in C# wieder über die Selection abgreifen.
Es scheint mir allerdings, dass die Laufzeit dabei sehr lange ist und ich würde gerne auf den Umweg über Selection verzichten.

in CAA schaut meine Methode so aus:

Code:

HRESULT MyCustomPart::TestFunction(CATIAReference* iReferenceOfFace, CATSafeArrayVariant*& oArray) {
        HRESULT hr = CATReturnSuccess;

        CATBaseUnknown_var spBaseUnknownRef;
        ::GetObjectFromReference(iReferenceOfFace, spBaseUnknownRef);
        CATPathElement* pPathElement = new CATPathElement(spBaseUnknownRef);
        pPathElement->InitToLeafElement();

        CATBaseUnknown* pBaseUnknownGeometry2 = NULL;
        pBaseUnknownGeometry2 = pPathElement->FindElement(CATSurface::ClassId());

        CATSurface_var spInputFaceSurface = pBaseUnknownGeometry2;

        CATIMmiUseBRepAccess* pBRepAccess = NULL;
        hr = spInputFaceSurface->QueryInterface(IID_CATIMmiUseBRepAccess, (void**)&pBRepAccess);

        CATIBRepAccess* pBRepAccessGeometry = NULL;
        pBRepAccess->QueryInterface(IID_CATIBRepAccess, (void**)&pBRepAccessGeometry);

        CATIABase* catiaBase = NULL;
        pBRepAccessGeometry->QueryInterface(IID_CATIABase, (void**)&catiaBase);

        /// Rückgabe Array definieren
        const CATBaseDispatch** arrayx = new const CATBaseDispatch * [1];
        arrayx[0] = catiaBase;
        oArray = ::BuildSafeArrayVariant(arrayx, 1);
        return hr;
    }



in C#

Code:

Face nativeFace = <my face instance>;
var nameOfFace = nativeFace.get_Name(); /// "Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;25)));None:();Cf14:());Assemble.36_ResultOUT;Z0;G11402)"

object[] result = MyCustomPart.TestFunction((Reference)nativeFace); /// nativeFace is MecMod.Face instance
Reference refX = (Reference)result[0]; /// ComObject - Reference

Face castFace = refX as Face; /// null

var nameOfReference = refX.get_Name(); /// "CATIAReference77"
var DisplayNameOfReference = refX.DisplayName; /// "Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;25)));None:();Cf14:());Assemble.36_ResultOUT;Z0;G11402)"

CATBaseUnknown catBaseUk = (CATBaseUnknown)refX; /// ComObject - CATBaseUnknown


nativeFace kann zu Reference gecasted werden, refX kann jedoch nicht einfach in ein Face gecastet werden.
Kennt jemand einen möglichen Weg, wie ich ohne Selektion von dem Referenz-Objekt (das ja schon irgendwas mit dem Face zu tun haben muss, da DisplayName der gleiche ist wie der get_Name() von meinem Ausgangs-Face) auf ein natives Face Objekt kommen kann?

Ich habe schon versucht verschiedenes anderes aus CAA zurück zu schicken... bin aber bisher gescheitert. Ich erhoffe mir aus einem direkten Rückgabe-Objekt (ohne Selektion) einen Performance-Boost.


Was funktioniert hat ist folgendes:


Code:

HRESULT MyCustomPart::TestFunction(CATIAReference* iReferenceOfFace, CATSafeArrayVariant*& oArray) {
        HRESULT hr = CATReturnSuccess;

        const CATBaseDispatch** arrayx = new const CATBaseDispatch * [1];
        arrayx[0] = iReferenceOfFace; /// einfach das input-face in das output array drücken führt dazu, dass "object firstFace" zu einem MECMOD.Face gecastet werden kann.
        oArray = ::BuildSafeArrayVariant(arrayx, 1);

        return hr;
    }



d.h. es gibt wohl Probleme beim Erstellen einer korrekten Referenz ab CATSurface_var; in der Methode die ich eigentlich schreiben will habe ich keine Referenz, sondern "nur" ein CATFace oder CATSurface. Also müsste ich von dort aus wieder zu einer validen Referenz kommen, die im C# interface richtig interpretiert werden kann.

Ich würde mich über jeden Ansatz freuen - egal ob eine Methode wie ich über das CATBaseUnknown in C# wieder an das Face Objekt komme ohne eine Selektion zu benutzen, oder Tips wie ich von CATSurface an eine Referenz kommen könnte die man in C# wieder zu Face casten kann.

Vielen Dank vorab & Beste Grüße
Matthias

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

user7
Mitglied



Sehen Sie sich das Profil von user7 an!   Senden Sie eine Private Message an user7  Schreiben Sie einen Gästebucheintrag für user7

Beiträge: 23
Registriert: 26.08.2022

erstellt am: 21. Mrz. 2025 09:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Kleiner Nachtrag:

Code:

    HRESULT MyCustomPart::TestFunction(CATIAReference* iReferenceOfFace, CATSafeArrayVariant*& oArray) {
        HRESULT hr = CATReturnSuccess;

        CATBaseUnknown_var pppp = NULL_var;
        GetObjectFromReference(iReferenceOfFace, pppp); /// Konvertierung zu Objekt

        CATIAReference* referenceX221;
        GetReferenceFromObject(pppp, referenceX221); /// Konvertierung von Objekt zu Referenz


        const CATBaseDispatch** arrayx = new const CATBaseDispatch * [2];
        arrayx[0] = iReferenceOfFace; /// einfach das input-face in das output array drücken führt dazu, dass "object firstFace" zu einem MECMOD.Face gecastet werden kann.
        arrayx[1] = referenceX221; /// input-face welches zu objekt und wieder zurück zu Referenz transformiert wurde kann nicht mehr zu einem MECMOD.Face gecastet werden in C#.
        oArray = ::BuildSafeArrayVariant(arrayx, 2);

        return hr;
    }


Alleine die Konvertierung zu einem Objekt und zurück zur Referenz hat zur Folge, dass das Objekt in C# nicht mehr zu Face gecastet werden kann...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz