Cotation dans une macro

Je voudrais réaliser une macro très simple avec une ligne avec la cotation de celle-ci:

Je réalise l'enregistrement, puis lorsque je lance la macro, elle s"arrête à la cotation où la fenêtre flottante demande que je tape une valeur; j'aurais voulu que la cote de 50 se mette toute seule. Mais même lorsque je rentre une valeur, le programme se met en débogage car il attend de pouvoir mettre la cote de 50 qui a déjà été mise.

Quelqu'un sait comment on procède pour coter une esquisse automatiquement?

1 « J'aime »

Bonjour,

Il faut désactiver l'option saisir la cote

1 « J'aime »

Dans le code, il faut ajouter en début : boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, False) puis en fin de code boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, True)
 

1 « J'aime »

@Cyril.f

Je suis en train d'essayer mais j'ai un message d'erreur:

Faudrait faire deux trois vérif, d'une part est-ce que swapp est déclaré comme Sldworks.Sldworks (ça peut régler le problème plutôt que déclaré comme objet).

Ensuite, est-ce que dans les références il n'y a pas des références manquantes?

1 « J'aime »

Oui, swapp est déclaré SldWorks.sldworks

Je sèche, pourrais-tu mettre tout le code en l'insérant avec l'option d'insertion de code du forum afin que je le récupère pour voir.

Sinon, à minima vérifies dans les références (Outils> références) si les références suivantes sont activées:

Solidworks 201X Extensibility Type Library

Sldworks 201X Type Library

Solidworks 201X Constant type library

Solidworks 201X Commands type library

Pour ma part je suis sur 2016 et pas de problèmes.

Pardon, Voilà le code initial:

Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim skSegment As Object
Dim myDisplayDim As Object
Dim myDimension As Object

Sub main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    Part.SketchManager.InsertSketch True
    boolstatus = Part.Extension.SelectByID2("Plan de face", "PLANE", -6.71223122593068E-02, 0.049524099883856, 0, False, 0, Nothing, 0)
       
    Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.052237, 0#, 0#)
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 3.01706029555596E-02, 3.7613240418119E-04, 0, False, 0, Nothing, 0)
    
    Set myDisplayDim = Part.AddDimension2(2.91675832110764E-02, -1.54214285714286E-02, 0)
    Part.ClearSelection2 True
    
    Set myDimension = Part.Parameter("D1@Esquisse1")
    myDimension.SystemValue = 0.05
    Part.ClearSelection2 True
    Part.SketchManager.InsertSketch True
    
End Sub

C'est sur SolidWorks 2016

Voici les références:

Voici le second code retouché:

Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim skSegment As Object
Dim myDisplayDim As Object
Dim myDimension As Object

Sub main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, False)
    
    Part.SketchManager.InsertSketch True
    boolstatus = Part.Extension.SelectByID2("Plan de face", "PLANE", -6.71223122593068E-02, 0.049524099883856, 0, False, 0, Nothing, 0)
    
    
    
    Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.052237, 0#, 0#)
    
    boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 3.01706029555596E-02, 3.7613240418119E-04, 0, False, 0, Nothing, 0)
    
    Set myDisplayDim = Part.AddDimension2(2.91675832110764E-02, -1.54214285714286E-02, 0)
    
    
    Set myDimension = Part.Parameter("D1@Esquisse1")
    myDimension.SystemValue = 0.05
    
    Part.SketchManager.InsertSketch True
    
    boolstatus = swApp.SetUserPreferenceToggle(swInputDimValOnCreate, True)
    
End Sub

 

Bonjour,

Remplace "Dim swApp As SldWorks.SldWorks" par "Dim swApp As Object", cela devrait fonctionner.

Cordialement,

1 « J'aime »

Et aussi, attention, quand on touche aux paramètres de SW il est préférable de relever la valeur du paramètre puis, si on a besoin de la modifier pour un traitement, de la remettre à son état initial en fin de traitement :

Dim value As Boolean
value = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate)
    
If value = True Then
  boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, False)
End If

###### Là tu mets ton traitement #######

boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, value)

 

Cordialement,

3 « J'aime »

Effectivement d.roger, je n'ai pas précisé puisque de base son sw était paramétré pour saisir la cote.

Dans tous les cas un set à False puis True fonctionne même si l'option est déjà cochée ou décochée (j'ai volontairement simplifié).

Pour le swApp as Object, j'ai essayé avec les deux (sldworks.sldworks et object) sur 2016 ça fonctionne chez moi. L'avantage du second étant d'avoir l'auto-complétion lors de la saisie du code et un aperçu de ce qui est attendu par chaque appel de fonction sans devoir garder l'aide ouverte en permanence ;)

Edit: Finalement, fonctionne avec Object, avec SldWorks.SldWorks ça génère une erreur de compilation, je pense qu'hier il avait gardé en mémoire le type Object.

1 « J'aime »

il n'y pas moyen de ne pas faire la saisie de cote, juste par un argument de la fonction, plutôt que de défaire puis remettre les paramètres généraux... ??

 

Remarque : si le fichier contient déjà une esquisse, celui créer par la macro ne sera pas "esquisse1" mais avec un autre numéro quelconque... (??)

1 « J'aime »

@ Olivier42 : Bonjour, il n'est pas possible de passer par un argument car c'est un paramètre général. Il n'y a ma connaissance rien dans les API qui permette d'outrepasser ces paramètres via un argument.

Ceci est confirmé par l'aide de l'API SW : Before calling this method, you might want to call ISldWorks::SetUserPreferenceToggle with swUserPreferenceToggle_e.swInputDimValOnCreate to suppress the dialog box that allows the user to type the dimension value.

1 « J'aime »

Bonjour,

L'idée générale est de réaliser des esquisses complètes cotées par programmation puis bien sur mettre des fonctions volumiques dessus. Mais c'est important qu'il y ait des cotes dans l'esquisse. D'où le test avec une seule ligne et sa cote.

J'essaie les modifs dans un petit moment.

Merci de votre aide!

Toujours pas .

Voici le nouveau code

Dim swApp As Object
Dim Part As Object

Dim boolstatus As Boolean
Dim value As Boolean

Sub main()

Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

value = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate)
    If value = True Then
      boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, False)
    End If

boolstatus = Part.Extension.SelectByID2("Plan de face", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
Dim skSegment As Object
Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.051925, 0#, 0#)
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 1.97416243507319E-02, -1.20689440993789E-03, 0, False, 0, Nothing, 0)
Dim myDisplayDim As Object
Set myDisplayDim = Part.AddDimension2(2.59101957793034E-02, -1.59578260869565E-02, 0)
Dim myDimension As Object
Set myDimension = Part.Parameter("D1@Esquisse1")
myDimension.SystemValue = 0.05
Part.SketchManager.InsertSketch True

boolstatus = swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate, value)

End Sub

Cela bloque au même endroit

Voici le message d'erreur :