API solidworks. Déplacer face

Bonjour a tous.

 

Souhaitant créer une macro afin d'automatiser la création d'une fonction d'éplacer face => jusqu'a la surface + par la suite d'autre fonction j'ai écris le code suivant.

Cependant la fonction ne se créé pas et je ne vois vraiment pas le pourquoi du comment. J'ai sélectionnné mes face de départ et d'arrivé avec les mark requis mais rien n'est créé.

Aves vous une idée??

 

Dim swApp As Object
Dim swmodel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Dim swMoveFaceFeat As SldWorks.MoveFaceFeatureData

Sub main()

Set swApp = Application.SldWorks
Set swmodel = swApp.ActiveDoc


'Vérification que le fichier ouvert est un fichier pièce
If swmodel.GetType <> swDocPART Then
    MsgBox "Veuillez ouvrir un fichier pièce", vbApplicationModal + vbOKOnly + vbCritical, "Fichier pièce requis"
    Exit Sub
End If


Dim Selectmanager As SelectionMgr
        Set Selectmanager = swmodel.SelectionManager 'recuperer selection
        swmodel.ClearSelection2 True ' effacer selection
        
        

' boucle pour attente selection
            Dim bool1 As Boolean
            Dim y
            bool1 = False
            Do Until bool1 = True
                If Selectmanager.GetSelectedObjectType3(1, -1) = 2 Then
                bool1 = True
                End If
                For y = 1 To 50000
                DoEvents
                Next y
            Loop

        Dim Coord As Variant
        Coord = Selectmanager.GetSelectionPointInSketchSpace2(1, -1)
        
        Dim x0 As Single
        Dim y0 As Single
        Dim z0 As Single
        
        x0 = Coord(0)
        y0 = Coord(1)
        z0 = Coord(2)
        
        swmodel.ClearSelection2 (True)
       
        
    Set swModelDocExt = swmodel.Extension
    Set swFeatMgr = swmodel.FeatureManager


        
        swmodel.ClearSelection2 (True)
        
        ' boucle pour attente selection
            
            bool1 = False
            Do Until bool1 = True
                If Selectmanager.GetSelectedObjectType3(1, -1) = 2 Then
                bool1 = True
                End If
                For y = 1 To 50000
                DoEvents
                Next y
            Loop
        Coord = Selectmanager.GetSelectionPointInSketchSpace2(1, -1)
        x1 = Coord(0)
        y1 = Coord(1)
        z1 = Coord(2)
        swmodel.ClearSelection2 (True)
        bret = swmodel.Extension.SelectByID2("", "FACE", x0, y0, z0, True, 1, Nothing, 0)
        bret = swmodel.Extension.SelectByID2("", "FACE", x1, y1, z1, True, 8, Nothing, 0)
      
      Set swFeat = swFeatMgr.InsertMoveFace3(swMoveFaceTypeTranslate, False, 0, 0, Nothing, Nothing, swEndConditions_e.swEndCondUpToSurface, 0)


End Sub
 

 

Par avance merci

 

Happydad

question bete

mais pour quel raison ce type de macro ??????????????????????

moi pas bien comprendre !!!!!!!!!!!!

1 « J'aime »

Tout simplement car dans mon entreprise nous avons une bibliothèque de fichier piece qui nous sert de base de modélisation via la commande insertion => piece.

Nous insérons ces éléments dans l'espace puis les lier les un aux autres. Le nombre d'éléments de bibliothèque pouvant être assez conséquent, nous voulions faire une macro afin d'autoatiser quelque peu cette tache.

un peu dans le meme esprit que le routage

voir ce lien

http://help.solidworks.com/2015/French/SolidWorks/sldpiping/c_connection_route_points.htm?id=80ee80a724b34d0e8281b0af48e1a92d#Pg0&ProductType=&ProductName=

En effet un peu dans le même esprit mais nous n'avons que peu de licenses premuim donc je dois rester sur les fonctions de base de SW.

 

1 « J'aime »

et si par hasard tu creais tes pieces qui la face a deplacer entre 2 plans

il te sufirai de changer la longueur de decalage de ces 2 plans

je ne sais pas si je ma fais bien comprendre 

le truc serai de savoir quelle type de piece doit avoir un decalage de face et par rapport a quoi

@+

Si je comprends bien tu me parles d'une pièce dans un assemblage. Je me trompe?

Or je parle de cela dans un fichier pièce. Nous avons un fichier pièce dans lequel nous inserons d'autres fichiers pièce qui nous servent de base de construction.

Pour etre le plus complet possible, nous faisons du mécano soudé (avec nos propres profils) et nous reconstituons l'ensemble de une piece (fichier pice de tete) à partir des connections de profil qui sont établis par le service R&D.

Voir capture ci jointe si cela peut être plus parlant.

 


sans_titre.png

Bonjour,

Si j'ai bien compris la méthode utilisée (que je ne peux testée vu que je suis sur SW2014), il manque des paramètres dans la dernière ligne. En l'occurence vu que tu mets nothing dans les paramètres de déplacement il est normal qu'il ne se passe rien.

Il faut définir les paramètres X,Y,Z et probablement le sens de la fonction.

C'est ce que je me suis dis également au départ j'avais créer un variable de type variant pour donner mes valeurs X Y et Z dans la fonction mais cela n'a rien changé.

J'avoue que j'ai du mal a interpreter cette partie de l'aide API. Car entre les valeurs non utlies étant donné que je suis en condition jusqu'a la surface et non borgne, j'ai tendance a me dire quil gere la valeur de translation comme un gran etant donné qu'il a une face de départ et une face d'arrivée (dito comme si l'on fait la fonction en manuel.)

edit remplacement de l'extrait de l'aide par lien vers l'aide en ligne

http://help.solidworks.com/2015/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IFeatureManager~InsertMoveFace3.html

Bonjour,

je suis pas sûr d'avoir compris, mais pour créer une associativité, la fonction déplacer la face peu très bien être associée à un plan de référence en choisissant translater au lieu de décaler. Après il suffirait simplement d'ajouter une propriété pour changer la valeur du décalage, ou bien créer le plan selon une référence variable ( distance origine, face de corps, ...).

 

C'est bien pour cela que je souhaite utiliser la condition jusqu'a la surface qui en cas de variation suivra toujours des éléments.

J'ai testé dans l'entrefaite de modifier la macro, si je lui donne une condition de fin borgne avec des valeurs dans la fonction insertmoveface3 cela se fait nickel, cependant la condition de fin n'est pas celle qui repondrait a nos attentes.

Auparavant (avant de passer a SW 2015, nous faisions des extrusions d'esquisse converties jusqu'a la surface du corps suivant)

Apres moulte tests cette solution est plus rapide à mettre en oeuvre et surtout beaucoup moins chronophage en temps de reconstruction)

 

Je pense qu'il faut ajouter une sélection pour l'orientation de la fonction (paragraphe remarks) du fait de l'utilisation de la fonction swMoveFaceTypeTranslate. Dans les selctionbyID2 il faut une selection avec le paramètre mark à 2.

A tester.

Cela fait parti des solutions que j'ai testé, et cela n'a rien changé malheuresement.

 

 

Ok j'ai compris, effectivement  c'est compliqué, comment peu tu définir une orientation automatique selon le nombre de raccords verticaux et horizontaux? C'est un projet qui dépasse mes compétences je ne peu pas t'aider dsl. Sinon utiliser la fonction bossage / base frontière ne serait pas plus simple?

BOnjour a tous apres de tres long essais voici la solution 

 

Set swApp = Application.SldWorks
Set swmodel = swApp.ActiveDoc
Set swFrame = swApp.Frame
Set swModelDocExt = swmodel.Extension
Set swFeatMgr = swmodel.FeatureManager
z = 0
nb_profil = 0
'Vérification que le fichier ouvert est un fichier pièce
If swmodel.GetType <> swDocPART Then
    MsgBox "Veuillez ouvrir un fichier pièce", vbApplicationModal + vbOKOnly + vbCritical, "Fichier pièce requis"
    Exit Sub
End If

MsgBox "Sélectionner la face de départ, puis la face d'arrivée pour générer la liaison" & vbLf & "Recommencer autant de fois que nécessaire" & vbLf & vbLf & "Pour passer à la fusion des corps appuyer sur la touche F2", vbInformation + vbApplicationModal + vbOKOnly, "Création des fonctions déplacer face"

selection:
Dim Selectmanager As SelectionMgr
        Set Selectmanager = swmodel.SelectionManager 'recuperer selection
        swmodel.ClearSelection2 True ' effacer selection
' boucle pour attente selection
    Do Until Selectmanager.GetSelectedObjectType3(1, -1) = SwConst.swSelFACES Or GetAsyncKeyState(113) <> 0
      DoEvents
      swFrame.SetStatusBarText "Veuillez séléctionner la première face ou appuyer sur la touche F2 pour passer à la création des fonctions combiner" ' affichage du message dans la barre SW
    Loop
Dim swFace As SldWorks.Face2
Debug.Print GetAsyncKeyState(112)
Debug.Print GetAsyncKeyState(123)
nb = Selectmanager.GetSelectedObjectCount2(-1)
If nb <> 0 Then
    Set swFace = Selectmanager.GetSelectedObject6(1, -1)
    Dim swEntity As SldWorks.Entity
    Set swEntity = swFace
    Set body = swFace.GetBody
    profil = body.Name
    nb_car = (Len(profil) - Len(Replace(profil, "<", "", , , 0))) / Len("<")
        If nb_car <> 0 Then
             profil = Left(profil, (Len(profil) - 1))
             profil = "_" & Split(Split(Split(profil, "<")(nb_car), ">")(0), " ")(0) & "_" & nb_profil
             body.Name = profil
            nb_profil = nb_profil + 1
        End If
Else
    swmodel.ClearSelection2 True
    GoTo combiner
End If

swmodel.ClearSelection2 True

' boucle pour attente selection
    While Selectmanager.GetSelectedObjectType3(1, -1) <> SwConst.swSelFACES
      DoEvents
      swFrame.SetStatusBarText "Veuillez séléctionner la deuxième face" ' affichage du message dans la barre SW
    Wend
    
Set swFace = Selectmanager.GetSelectedObject6(1, -1)

swmodel.ClearSelection2 True
    
swEntity.SelectByMark True, 1
swEntity.SelectByMark True, 2
Set swEntity = swFace
swEntity.SelectByMark True, 8
Set body = swFace.GetBody
profil = body.Name
nb_car = (Len(profil) - Len(Replace(profil, "<", "", , , 0))) / Len("<")
If nb_car <> 0 Then
    profil = Left(profil, (Len(profil) - 1))
    profil = "_" & Split(Split(Split(profil, "<")(nb_car), ">")(0), " ")(0) & "_" & nb_profil
    body.Name = profil
    nb_profil = nb_profil + 1
End If

'creation de la fonction déplacer face + vérif création
Set swFeat = swFeatMgr.InsertMoveFace3(swMoveFaceTypeTranslate, False, 0, 0, Nothing, Nothing, 3, 0)
If swFeat Is Nothing Then
    Set swFeat = swFeatMgr.InsertMoveFace3(swMoveFaceTypeTranslate, True, 0, 0, Nothing, Nothing, 3, 0)
    If swFeat Is Nothing Then
        Select Case MsgBox("N'a pas pu créer la fonction de liaison" & vbLf & vbLf & "Voulez vous retenter la liaison?", vbApplicationModal + vbCritical + vbYesNo, "Erreur lors de la génération")
        Case vbYes
            GoTo selection
        Case vbNo
        End Select
    Else
        Select Case MsgBox("Voulez vous créer une liaison supplémentaire?", vbApplicationModal + vbCritical + vbYesNo, "Erreur lors de la génération")
        Case vbYes
            GoTo selection
        Case vbNo
        End Select
    End If
Else
z = z + 1
ReDim Preserve feat_name(z)
feat_name(z) = swFeat.Name
GoTo selection
End If