API: GetCorresponding in sectieweergave

Hoi allemaal

Ik ben op zoek naar een methode om een IFace2-referentie te gebruiken in de context van een dwarsdoorsnede om de overeenkomstige IFace2-referentie te vinden in de context van de bovenliggende weergave (IView::GetBaseView) en in de context van het referentiedocument (IView::ReferencedDocument). De IView::GetCorresponding(Entity)-methoden en IModelDocExtention::GetCorresponding(Entity)2 retourneren null-verwijzingen naar mij.

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

 

In de bovenstaande code begin ik met het verkrijgen van de gearceerde gezichten die door de snede worden gegenereerd. Dan krijg ik het lichaam dat bij deze gearceerde kant hoort. Ten slotte test ik de overeenkomst met alle gezichten van dit lichaam in de bovenliggende weergave en in het referentiedocument om te zien of er een resultaat wordt gevonden.

Helaas zijn er geen resultaten gevonden. Een beetje hulp zou welkom zijn.

Vriendelijke groeten


getcorresponding.zip

Hallo

Ik heb nog nooit GetFaceHatches gebruikt en weet niet wat het zou moeten retourneren, maar als ik toevoeg:

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

na:

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

door de macro uit te voeren met A-A Cut geselecteerd, selecteert het het gezicht van de kubus aan de rechterkant in de plan1-weergave, zodat GetCorrespondingEntity eruitziet alsof het iets retourneert.

3 likes

Hallo Hiëronymus,

Heel erg bedankt voor je hulp, ik zal meer tests doen en terugkomen om je te vertellen wat het is.

Vriendelijke groeten.

view.GetFaceHatches

Retourneert de gearceerde vlakken die in de sectieweergave zijn gemaakt.

Wat ik wil doen is: vanuit een entiteitsverwijzing in de context van een sectieweergave, zoek de entiteitsverwijzing in de context van de bovenliggende weergave.

Ik weet niet waarom, de methode View::GetCorrespondingEntity retourneert een niet-nulzijnde verwijzing voor het eerste gezicht, en vervolgens niets voor de andere.

Dus jouw oplossing loste mijn probleem niet op.

Vriendelijke groeten

De gearceerde zijde bestaat alleen in de context van het onderhavige aanzicht.

In jouw geval is het een virtueel en intern gezicht dat zich in het midden van de kubus zou bevinden.

Gebruik "vFaces = lichaam. GetFaces" retourneert de 6 buitenste vlakken  van de kubus.

Het vergelijken van elk van deze 6 gezichten met het virtuele gezicht zou geen resultaten moeten opleveren.

(Het feit dat het er een retourneert , is een fout die te wijten is aan het hergebruik van "face" in de invoer en uitvoer van de GetCorrespondational-functie of een fout van deze functie zelf )

In ieder geval: de gearceerde zijde bestaat niet in het hoofdaanzicht.

1 like
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.

 Absoluut, dit is de reden waarom ik vraag om de correspondentie van alle lichaamsgezichten van elk gearceerd gezicht:

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)

Deze gezichten, die overeenkomen in de bovenliggende weergave, leveren geen resultaten op.

 

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.

Ik begrijp niet wat je bedoelt, ik vergelijk geen gezichten, ik vraag om de bijbehorende referentie in de bovenliggende weergave.

 

(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.

Helemaal mee eens.

Terwijl ik de macro lees:

1- GetFaceHatches => retourneert 3 gearceerde gezichten uit weergave A-A

2- Voor elk van deze vlakken: GetBody => retourneert 1 volumelichaam (d.w.z.: 1 kubus - 3 in totaal)

3- GetFaces => retourneert alle vlakken van het lichaam onafhankelijk van het aanzicht (d.w.z.: de 6 vlakken van de kubus - 18 in totaal)

4- GetCorrespondingEntity => Ik weet niet zeker wat dit zou moeten bereiken, want zoals eerder gezegd zijn de 6 vlakken die bij punt 3 worden geretourneerd onafhankelijk van de weergave. Dus in het beste geval worden dezelfde gezichten omgedraaid (d.w.z.: 6 gezichten - 18 in totaal)

5- GetBody opnieuw, gevolgd door body. Naam => de naam van elk volumelichaam 6 keer geschreven - 3 lichamen in totaal

 

Uiteindelijk weet ik nog steeds niet zeker wat je wilt doen.

Nogmaals, hartelijk dank voor uw hulp.

1-OK met jou

2-OK met jou

3-In mijn gedachten wordt elk lichaam (volume of oppervlak) gekopieerd + gewijzigd van context tot context, bijvoorbeeld als ik de referenties van een lichaam in de context van een weergave vergelijk met degene die ermee overeenkomt in de 3D-context (assemblage of onderdeel waarnaar wordt verwezen door de weergave), dan zou ik een False krijgen, de lichamen zijn niet dezelfde Body2-instantie. Dus als je zegt view onafhankelijk, staat mijn ervaring met de API me niet toe om die verklaring te delen. Naar mijn mening hebben lichamen in elke context een aparte referentie (al dan niet met hun overeenkomstige gezichten), en dit is volledig afhankelijk van het standpunt. Een ander voorbeeld: een sectieweergave kan een hoofdtekst van de bovenliggende weergave segmenteren in twee afzonderlijke hoofdlichamen. Het kunnen dus niet dezelfde lichaamsverwijzingen zijn. Er is dus een verband van afhankelijkheid tussen lichamen en opvattingen.

4-Ik gebruikte vaak ModelDocExtention::GetCorrespondingEntity om overeenkomende gezichten te vinden uit de weergavecontext naar de context van het 3D-model. Ik ben echter nooit in staat geweest om View::GetCorrespondingEntity te vinden die overeenkomende gezichten uit de context van het 3D-model naar de context van de weergave hebben. Ik begrijp zijn ideale use case niet helemaal.

5-OK met jou, de bodysuit. Naam is alleen aanwezig als een debug, om te weten welke body het is

Wat ik uiteindelijk probeer te doen is:

Selecteer in een actieve dwarsdoorsnede alle lichamen in de bovenliggende weergave die zijn gesneden.

Ik ben het ermee eens dat het moeilijk is om de verschillende lichamen en contexten te begrijpen.

Na wat onderzoek te hebben gedaan, lijkt het erop dat de lichamen in de sectieweergave verschillende lichamen zijn van de basisweergave (bijv. GetArea van elk oppervlak laat zien dat elk lichaam eigenlijk een halve kubus is)

Ik weet niet hoe ik dit kan rijmen met de lichamen van de basisvisie. Aan de andere kant is er een omweg omdat elk lichaam minstens één ongesneden kant heeft. We kunnen dus het lichaam vinden door de eigenschappen van elk gezicht op te slaan en deze te vergelijken met die van elk gezicht in de basisweergave.

De bijgevoegde macro selecteert de gesneden body('s) in de bovenliggende weergave (werkt met A-A- of B-B-weergave)


selectionne_corps_coupes.swp

Hallo Jérôme,

Ik gaf mezelf de tijd om je antwoord te verwerken en verschillende dingen te testen voordat ik je antwoordde. Uw geometrische benadering (dichtstbijzijnde punt, oppervlakteberekening, enz.) lijkt op het eerste gezicht misschien onevenredig, maar het lijkt de ultieme oplossing te zijn waar de API geen meer voor de hand liggende laat. Dank u voor uw tijd. Het toepassingsgebied is echter beperkt, functioneel op dit demoplan, maar de beperkingen zijn snel voelbaar, en stelt me niet in staat om het te integreren in een meer algemeen ontwikkelingsproject (dit heeft niets te maken met de kwaliteit van uw code, laten we duidelijk zijn, maar alleen de beperkingen van de geometrische methode).

Ik heb echter enige vooruitgang geboekt met mijn probleem, zonder het op te lossen, deel ik dit stukje code met je:

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

 

Met deze macro kunt u de lichaamsverwijzingen van de geselecteerde gezichten (2 of meer) vergelijken tussen verschillende weergaven van een tekening, inclusief doorsnedeweergaven.

Ik ben nu op zoek naar een manier om het te koppelen aan de gearceerde gezichten van een actieve weergave (niet aan de geselecteerde gezichten).

Vriendelijke groeten.

Ik begin serieus dichter bij het doel te komen (vereist betrouwbaarheidstests), ik deel:

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 like