API: GetCorresponding in der Abschnittsansicht

Hallo ihr alle

Ich suche nach einer Methode, um eine IFace2-Referenz im Kontext einer Querschnittsansicht zu verwenden, um die entsprechende IFace2-Referenz im Kontext der übergeordneten Ansicht (IView::GetBaseView) und im Kontext des Referenzdokuments (IView::ReferencedDocument) zu finden. Die IView::GetCorresponding(Entity)-Methoden sowie IModelDocExtention::GetCorresponding(Entity)2 geben NULL-Referenzen an mich zurück.

Option Explicit

Sub main()
    Dim app As SldWorks.SldWorks
    Dim doc As SldWorks.ModelDoc2
    Dim dwg As SldWorks.DrawingDoc
    Dim view As SldWorks.view
    Dim baseView As SldWorks.view
    Dim vHatches As Variant
    Dim vHatch As Variant
    Dim hatch As SldWorks.FaceHatch
    Dim vFaces As Variant
    Dim vFace As Variant
    Dim face As SldWorks.Face2
    Dim body As SldWorks.Body2
    
    Set app = Application.SldWorks
    If app Is Nothing Then Exit Sub
    Set doc = app.ActiveDoc
    If doc Is Nothing Then Exit Sub
    If Not doc.GetType = SwConst.swDocumentTypes_e.swDocDRAWING Then Exit Sub
    Set dwg = doc
    Set view = dwg.ActiveDrawingView
    If view Is Nothing Then Exit Sub
    Set baseView = view.GetBaseView
    If baseView Is Nothing Then Exit Sub
    vHatches = view.GetFaceHatches
    If IsEmpty(vHatches) Then Exit Sub
    For Each vHatch In vHatches
        Set hatch = vHatch
        If hatch Is Nothing Then GoTo Next_vHatch
        Set face = hatch.face
        If face Is Nothing Then GoTo Next_vHatch
        Set body = face.GetBody
        If body Is Nothing Then GoTo Next_vHatch
        vFaces = body.GetFaces
        If IsEmpty(vFaces) Then GoTo Next_vHatch
        For Each vFace In vFaces
            
            Set face = vFace
            If face Is Nothing Then GoTo Next_test
            Set face = baseView.GetCorrespondingEntity(face)
            If face Is Nothing Then GoTo Next_test
            ' Breakpoint: correspondance nulle, ce point ne sera jamais atteint '
            Set body = face.GetBody
            If body Is Nothing Then GoTo Next_test
            Debug.Print body.Name
            
Next_test:
            
            Set face = vFace
            If face Is Nothing Then GoTo Next_vFace
            Set face = view.ReferencedDocument.Extension.GetCorrespondingEntity2(face)
            If face Is Nothing Then GoTo Next_vFace
            ' Breakpoint: correspondance nulle, ce point ne sera jamais atteint '
            Set body = face.GetBody
            If body Is Nothing Then GoTo Next_vFace
            Debug.Print body.Name
            
Next_vFace:
        Next vFace
Next_vHatch:
    Next vHatch
End Sub

 

Im obigen Code beginne ich damit, die schraffierten Flächen abzurufen, die durch den Schnitt generiert werden. Dann bringe ich den Körper in Verbindung mit dieser schraffierten Seite. Zum Schluss teste ich die Übereinstimmung mit allen Flächen dieses Textkörpers in der übergeordneten Ansicht und im Referenzdokument, um zu sehen, ob ein Ergebnis gefunden wird.

Leider wurden keine Ergebnisse gefunden. Ein wenig Hilfe wäre willkommen.

Herzliche Grüße


getcorresponding.zip

Hallo

Ich habe GetFaceHatches noch nie verwendet und weiß nicht, was es zurückgeben soll, aber wenn ich hinzufüge :

            Dim swEnt As SldWorks.Entity
            Set swEnt = face
            swEnt.Select4 True, Nothing

nach:

            Set face = baseView.GetCorrespondingEntity(face)
            If face Is Nothing Then GoTo Next_test

Wenn Sie das Makro ausführen, während A-A Cut ausgewählt ist, wird die Fläche des Würfels auf der rechten Seite der Plan1-Ansicht ausgewählt, sodass GetCorrespondingEntity so aussieht , als würde etwas zurückgegeben werden.

3 „Gefällt mir“

Hallo Jerome,

Vielen Dank für Ihre Hilfe, ich werde weitere Tests durchführen und zurückkommen, um Ihnen zu sagen, was es ist.

Herzliche Grüße.

view.GetFaceHatches

Gibt die schraffierten Flächen zurück, die in der Schnittansicht erstellt wurden.

Was ich tun möchte, ist: Suchen Sie aus einer Entitätsreferenz im Kontext einer Schnittansicht die Entitätsreferenz im Kontext der übergeordneten Ansicht.

Ich weiß nicht warum, die View::GetCorrespondingEntity-Methode gibt eine Referenz ungleich Null für das erste Gesicht zurück, dann nichts für die anderen.

Ihre Lösung hat mein Problem also nicht gelöst.

Herzliche Grüße

Die schraffierte Seite existiert nur im Kontext der betrachteten Ansicht.

In Ihrem Fall handelt es sich um eine virtuelle und interne Fläche, die sich in der Mitte des Würfels befindet.

Verwenden Sie "vFaces = body. GetFaces" gibt die 6 äußeren Flächen  des Würfels zurück.

Der Vergleich jedes dieser 6 Gesichter mit dem virtuellen Gesicht sollte keine Ergebnisse liefern.

(Die Tatsache, dass es einen zurückgibt , ist ein Fehler, der entweder auf die Wiederverwendung von "face" in der Ein- und Ausgabe der GetResponding-Funktion zurückzuführen ist oder auf einen Fehler dieser Funktion selbst zurückzuführen ist.)

In jedem Fall: Die schraffierte Seite existiert in der Hauptansicht nicht.

1 „Gefällt mir“
La face hachurée n'existe que dans le contexte de la vue considérée.
Dans votre cas c'est une face virtuelle et interne qui serait au milieu du cube.

 Absolut, das ist der Grund, warum ich um die Übereinstimmung aller Körpergesichter jedes schraffierten Gesichts bitte:

vHatches = view.GetFaceHatches
For Each vHatch In vHatches
    Set hatch = vHatch
    Set face = hatch.face
    Set body = face.GetBody
    vFaces = body.GetFaces
    For Each vFace In vFaces
        Set face = vFace
        Set face = baseView.GetCorrespondingEntity(face)

Diese Flächen, die in der übergeordneten Ansicht eine Übereinstimmung aufweisen, geben keine Ergebnisse zurück.

 

Utiliser "vFaces = body.GetFaces" retourne les 6 faces externes du cube.
Comparer chacune de ces 6 faces à la face virtuelle ne devrait retourner aucun résultats.

Ich verstehe nicht, was du meinst, ich vergleiche keine Gesichter, ich bitte um die entsprechende Referenz in der übergeordneten Ansicht.

 

(Le fait que ca en retourne une, est une erreur soit due à la réutilisation de "face" en entrée et sortie de la fonction GetCorresponding ou une erreur de cette fonction elle-même )
Dans tous les cas: la face hachurée n'existe pas dans la vue principale.

Stimme voll und ganz zu.

Als ich das Makro las:

1- GetFaceHatches => gibt 3 schraffierte Flächen aus Ansicht A-A zurück

2- Für jede dieser Flächen: GetBody => gibt 1 Volumenkörper zurück (d. h.: 1 Würfel - insgesamt 3)

3- GetFaces => gibt alle Flächen des Körpers unabhängig von der Ansicht zurück (d.h.: die 6 Flächen des Würfels - insgesamt 18)

4- GetCorrespondingEntity => Ich bin mir nicht sicher, was das erreichen soll, denn wie bereits erwähnt, sind die 6 Flächen, die an Punkt 3 zurückgegeben werden, unabhängig von der Ansicht. Im besten Fall werden also die gleichen Gesichter vertauscht (d.h.: 6 Gesichter - insgesamt 18)

5- Wieder GetBody, gefolgt von Body. Name => der Name jedes Bandkörpers 6 mal geschrieben - insgesamt 3 Körper

 

Am Ende bin ich mir immer noch nicht sicher, was Sie vorhaben.

Nochmals vielen Dank für Ihre Hilfe.

1-OK für dich

2-OK für dich

3-In meinem Kopf wird jeder Körper (Volumen oder Oberfläche) von Kontext zu Kontext kopiert + modifiziert, zum Beispiel, wenn ich die Referenzen eines Körpers im Kontext einer Ansicht mit dem vergleiche, der ihm im 3D-Kontext entspricht (Baugruppe oder Teil, auf das die Ansicht verweist ), dann würde ich ein False erhalten, die Körper sind nicht die gleiche Body2-Instanz. Wenn Sie also ansichtsunabhängig sagen , erlaubt mir meine Erfahrung mit der API nicht, diese Aussage zu teilen. Meiner Meinung nach haben Körper in jedem Kontext einen eindeutigen Bezug (mit oder ohne ihre entsprechenden Gesichter), und dies hängt völlig von der Sichtweise ab. Ein weiteres Beispiel: In einer Schnittansicht kann ein Körper der übergeordneten Ansicht in zwei separate Körper unterteilt werden. Es kann sich daher nicht um dieselben Körperverweise handeln. Es besteht also ein Abhängigkeitsverhältnis zwischen Körpern und Ansichten.

4-Ich habe oft ModelDocExtention::GetCorrespondingEntity verwendet, um passende Gesichter aus dem Ansichtskontext zum 3D-Modellkontext zu finden. Ich war jedoch nie in der Lage, View::GetCorrespondingEntity zu verwenden, um passende Gesichter aus dem Kontext des 3D-Modells mit dem Kontext der Ansicht zu finden. Ich verstehe seinen idealen Anwendungsfall nicht ganz.

5-OK für dich, den Bodysuit. Name ist nur als Debuggen vorhanden, um zu wissen, um welchen Körper es sich handelt

Am Ende versuche ich:

Wählen Sie in einer aktiven Schnittansicht alle Körper in der übergeordneten Ansicht aus, die geschnitten wurden.

Ich stimme zu, dass es schwierig ist, die verschiedenen Körper und Kontexte zu verstehen.

Nach einigen Recherchen scheint es, dass die Körper in der Schnittansicht andere Körper als die Basisansicht sind (z. B. zeigt GetArea jeder Oberfläche, dass jeder Körper tatsächlich ein halber Würfel ist)

Ich weiß nicht, wie ich das mit dem Kern der Grundanschauung in Einklang bringen soll. Auf der anderen Seite gibt es einen Umweg, weil jeder Körper mindestens eine ungeschnittene Seite hat. Wir können also den Körper finden, indem wir die Eigenschaften jedes Gesichts speichern und sie mit denen jedes Gesichts in der Grundansicht vergleichen.

Das angehängte Makro wählt den/die geschnittenen Körper in der übergeordneten Ansicht aus (funktioniert mit A-A- oder B-B-Ansicht)


selectionne_corps_coupes.swp

Hallo Jérôme,

Ich gab mir Zeit, deine Antwort zu verarbeiten und verschiedene Dinge zu testen, bevor ich dir antwortete. Ihr geometrischer Ansatz (nächster Punkt, Oberflächenberechnung usw.) mag auf den ersten Blick unverhältnismäßig erscheinen, aber es scheint die ultimative Lösung zu sein, bei der die API keine offensichtlichere Lösung mehr zulässt. Vielen Dank für Ihre Zeit. Der Anwendungsbereich ist jedoch begrenzt und funktioniert in diesem Demoplan, aber seine Grenzen sind schnell zu spüren und erlauben es mir nicht, ihn in ein allgemeineres Entwicklungsprojekt zu integrieren (das hat nichts mit der Qualität Ihres Codes zu tun, um es klar zu sagen, sondern nur mit den Einschränkungen der geometrischen Methode).

Ich habe jedoch einige Fortschritte bei meinem Problem gemacht, ohne es zu lösen, teile ich diesen Code mit Ihnen:

Option Explicit

Sub main()
    
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swSelMgr As SldWorks.SelectionMgr
    Dim lSelCount As Long
    Dim lRefCount As Long
    Dim lSelIndex As Long
    Dim swSelType As SwConst.swSelectType_e
    Dim swSelDcpn As SldWorks.DrawingComponent
    Dim swSelFace As SldWorks.Face2
    Dim swRefModel As SldWorks.ModelDoc2
    Dim swRefFace As SldWorks.Face2
    Dim swRefBody As SldWorks.Body2
    Dim vRefIds() As String
    Dim lRefIndex As Long
    
    Dim vRefBody As Variant
    Dim sSelId As String
    
    Set swApp = Application.SldWorks
    If swApp Is Nothing Then GoTo Next_0
    
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then GoTo Next_0
    
    Set swSelMgr = swModel.SelectionManager
    If swSelMgr Is Nothing Then GoTo Next_0
    
    lSelCount = swSelMgr.GetSelectedObjectCount2(-1)
    If lSelCount = 0 Then GoTo Next_0
    
    lRefCount = 0
    
    For lSelIndex = 1 To lSelCount
        
        swSelType = swSelMgr.GetSelectedObjectType3(lSelIndex, -1)
        If swSelType <> swSelFACES Then GoTo Next_1
        
        Set swSelDcpn = swSelMgr.GetSelectedObjectsComponent4(lSelIndex, -1)
        If swSelDcpn Is Nothing Then GoTo Next_1
        
        Set swSelFace = swSelMgr.GetSelectedObject6(lSelIndex, -1)
        If swSelFace Is Nothing Then GoTo Next_1
        
        Set swRefModel = swSelDcpn.View.ReferencedDocument
        If swRefModel Is Nothing Then GoTo Next_1
        
        Set swRefFace = swRefModel.Extension.GetCorrespondingEntity2(swSelFace)
        If swRefFace Is Nothing Then GoTo Next_1
        
        Set swRefBody = swRefFace.GetBody
        If swRefBody Is Nothing Then GoTo Next_1
        
        If lRefCount = 0 Then
            ReDim vRefIds(lRefCount)
        Else
            ReDim Preserve vRefIds(lRefCount)
        End If
        
        vRefIds(lRefCount) = swRefBody.GetSelectionId
        lRefCount = lRefCount + 1
        
Next_1:
        
    Next lSelIndex
    
    If lRefCount < 2 Then GoTo Next_0
    
    For lRefIndex = 1 To lRefCount - 1
        If vRefIds(lRefIndex) = vRefIds(0) Then GoTo Next_2
        Debug.Print lRefCount & " selected faces are different body references"
        GoTo Next_0
Next_2:
    Next lRefIndex
    
    Debug.Print lRefCount & " selected faces are corresponding body references"
    
Next_0:
    
End Sub

 

Mit diesem Makro können Sie die Körperreferenzen der ausgewählten Flächen (2 oder mehr) zwischen verschiedenen Ansichten einer Zeichnung, einschließlich Schnittansichten, vergleichen.

Ich suche jetzt nach einer Möglichkeit, es mit den schraffierten Flächen einer aktiven Ansicht zu koppeln (nicht mit den ausgewählten Flächen).

Herzliche Grüße.

Ich fange an, dem Ziel ernsthaft näher zu kommen (erfordert Zuverlässigkeitstests), ich teile:

Option Explicit

Sub main()
    
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDocType As SwConst.swDocumentTypes_e
    Dim swDrawing As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim lFaceId As Long
    Dim vViewCpns As Variant
    Dim vViewCpn As Variant
    Dim swViewCpn As SldWorks.Component2
    Dim vViewFaces As Variant
    Dim vViewFace As Variant
    Dim swViewFace As SldWorks.Face2
    Dim swRefFace As SldWorks.Face2
    Dim cRefFaces As New Collection
    Dim vViewHatches As Variant
    Dim vViewHatch As Variant
    Dim swViewHatch As SldWorks.FaceHatch
    Dim swRefBody As SldWorks.Body2
    Dim sRefBodyId As String
    Dim cRefBodyIds As New Collection
    Dim swBaseView As SldWorks.View
    Dim vBaseViewCpns As Variant
    Dim vBaseViewCpn As Variant
    Dim swBaseViewCpn As SldWorks.Component2
    Dim vBaseViewFaces As Variant
    Dim vBaseViewFace As Variant
    Dim swBaseViewFace As SldWorks.Face2
    Dim vRefBodyId As Variant
    Dim swBaseViewEntity As SldWorks.Entity
    
    Set swApp = Application.SldWorks
    If swApp Is Nothing Then GoTo End_Sub
    
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then GoTo End_Sub
    
    swDocType = swModel.GetType
    If Not swDocType = swDocDRAWING Then GoTo End_Sub
    
    Set swDrawing = swModel
    If swDrawing Is Nothing Then GoTo End_Sub
    
    Set swView = swDrawing.ActiveDrawingView
    If swView Is Nothing Then GoTo End_Sub
    
    lFaceId = 1
    
    vViewCpns = swView.GetVisibleComponents
    If IsEmpty(vViewCpns) Then GoTo End_Sub
    
    For Each vViewCpn In vViewCpns
        
        Set swViewCpn = vViewCpn
        If swViewCpn Is Nothing Then GoTo Next_vViewCpn
        
        vViewFaces = swView.GetVisibleEntities2(swViewCpn, swViewEntityType_e.swViewEntityType_Face)
        If IsEmpty(vViewFaces) Then GoTo Next_vViewCpn
        
        For Each vViewFace In vViewFaces
            
            Set swViewFace = vViewFace
            If swViewFace Is Nothing Then GoTo Next_vViewFace
            
            Set swRefFace = swView.ReferencedDocument.Extension.GetCorrespondingEntity2(swViewFace)
            If swRefFace Is Nothing Then GoTo Next_vViewFace
            
            cRefFaces.Add swRefFace
            swRefFace.SetFaceId lFaceId
            lFaceId = lFaceId + 1
            
Next_vViewFace:
        Next vViewFace
        
Next_vViewCpn:
    Next vViewCpn
    
    vViewHatches = swView.GetFaceHatches
    If IsEmpty(vViewHatches) Then GoTo End_Sub
    
    For Each vViewHatch In vViewHatches
        
        Set swViewHatch = vViewHatch
        If swViewHatch Is Nothing Then GoTo Next_vViewHatch
        
        Set swViewFace = swViewHatch.Face
        If swViewFace Is Nothing Then GoTo Next_vViewHatch
        
        lFaceId = swViewFace.GetFaceId
        
        Set swRefFace = cRefFaces(lFaceId)
        If swRefFace Is Nothing Then GoTo Next_vViewHatch
        
        Set swRefBody = swRefFace.GetBody
        If swRefBody Is Nothing Then GoTo Next_vViewHatch
        
        sRefBodyId = swRefBody.GetSelectionId
        cRefBodyIds.Add sRefBodyId
        
Next_vViewHatch:
    Next vViewHatch
    
    swDrawing.ForceRebuild
    
    Set swBaseView = swView.GetBaseView
    If swBaseView Is Nothing Then GoTo End_Sub
    
    vBaseViewCpns = swBaseView.GetVisibleComponents
    If IsEmpty(vBaseViewCpns) Then GoTo End_Sub
    
    For Each vBaseViewCpn In vBaseViewCpns
        
        Set swBaseViewCpn = vBaseViewCpn
        If swBaseViewCpn Is Nothing Then GoTo Next_vBaseViewCpn
        
        vBaseViewFaces = swBaseView.GetVisibleEntities2(swBaseViewCpn, swViewEntityType_e.swViewEntityType_Face)
        If IsEmpty(vBaseViewFaces) Then GoTo Next_vBaseViewCpn
        
        For Each vBaseViewFace In vBaseViewFaces
            
            Set swBaseViewFace = vBaseViewFace
            If swBaseViewFace Is Nothing Then GoTo Next_vBaseViewFace
            
            Set swRefFace = swBaseView.ReferencedDocument.Extension.GetCorrespondingEntity2(swBaseViewFace)
            If swRefFace Is Nothing Then GoTo Next_vBaseViewFace
            
            Set swRefBody = swRefFace.GetBody
            If swRefBody Is Nothing Then GoTo Next_vBaseViewFace
            
            sRefBodyId = swRefBody.GetSelectionId
            
            For Each vRefBodyId In cRefBodyIds
                
                If Not sRefBodyId = vRefBodyId Then GoTo Next_vRefBodyId
                
                Set swBaseViewEntity = swBaseViewFace
                If swBaseViewEntity Is Nothing Then GoTo Next_vRefBodyId
                
                swBaseViewEntity.Select4 True, Nothing
                
Next_vRefBodyId:
            Next vRefBodyId
            
Next_vBaseViewFace:
        Next vBaseViewFace
        
Next_vBaseViewCpn:
    Next vBaseViewCpn
    
End_Sub:
End Sub

 

1 „Gefällt mir“