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