Hallo zusammen,
ich versuche gerade in Catia CAA eine funktion zu schreiben, welche über C# angesteuert werden kann und mehrere Faces zurück gibt.
In CAA habe ich die entsprechenden Faces als CATFace / CATSurface vorliegen.
Die C# Seite schaut für den Testcase so aus:
Code:
public static List<Face> Test(MECMOD.Face face, MECMOD.Part part) {
CustomPart caaPart = (CustomPart)part;
object[] faces = caaPart.TestFunction((Reference)face);
object firstFace = faces[0];
var typeObject1 = TypeDescriptor.GetClassName(firstFace); Face f = firstFace as MECMOD.Face; /// Null!
}
---------------- IDL
Code:
HRESULT TestFunction(out /*IDLRETVAL*/ CATSafeArrayVariant oArray);
---------------- CustomPart.h
Code:
HRESULT __stdcall TestFunction(CATSafeArrayVariant*& oArray);
---------------- CustomPart.cpp
Code:
HRESULT CustomPart::TestFunction(CATSafeArrayVariant*& oArray) {
HRESULT hr = CATReturnSuccess; // somecode
CATFace* cf = (CATFace*)fac; /// fac existiert aus vorhergehenden Schritten in CAA
CATSurface* csf = cf->GetSurface();
/// Frage: welches Interface muss dem CATSurface angezogen werden damit es ordnungsgemäß in das CATBaseDispatch array einfügt werden kann, und das objekt in der C# API zu einer Reference und dann zu Face gecastet werden kann?
/// Irgendwie müsste ich von CATFace/CATSurface zu einem Interface auf dem LateType CATRSurImpl kommen.
// Erstellen eines Rückgabe-Arrays um die Faces in die C# API zu überführen - im Beispiel nur ein Element
const CATBaseDispatch** arrayx = new const CATBaseDispatch * [1];
arrayx[0] = catiaBase2;
oArray = ::BuildSafeArrayVariant(arrayx, 1);
return hr;
}
Ich hänge hier schon seit geraumer Zeit und würde mich über jeden Pointer freuen. Auch wenn jemand einen anderen Weg kennt, wie ich ein CATFace irgendwie in die C# Api bekomme (so dass es dort als Face vorliegt). Bisher hatte ich nur den Weg über die UserSelection benutzt - sprich, der Selection wird in CAA das CATFace hinzugefügt, und die Selection wird dann in C# ausgelesen. Den Weg würde ich allerdings gerne ersetzen, da er sehr zeitintensiv ist.
Bisher habe ich erfolglos herumexperimentiert mit:
Code:
CATSurface_var spInputFaceSurface = csf;
CATIMmiUseBRepAccess* pBRepAccess = NULL;
hr = spInputFaceSurface->QueryInterface(IID_CATIMmiUseBRepAccess, (void**)&pBRepAccess);
CATIBRepAccess* pBRepAccessGeometry = NULL;
pBRepAccess->QueryInterface(IID_CATIBRepAccess, (void**)&pBRepAccessGeometry);CATBaseDispatch* dispatcherie = NULL;
pBRepAccessGeometry->QueryInterface(IID_CATBaseDispatch, (void**)&dispatcherie);
CATIAReference* dispatchRef = (CATIAReference*)pBRepAccessGeometry;
CATIABase* catiaBase = (CATIABase*) csf;
csf->QueryInterface(IID_CATIABase, (void**)&catiaBase);
CATIAReference* testRef2 = NULL;
::GetReferenceFromObject(catiaBase, testRef2);
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP