API - Cotation d'execution angulaire - Erreur 424

Bonjour à tous,

Je tente de creer via les API une cotation d'execution angulaire sur une MEP. Je selectionne bien mes entités mais arrivé a la ligne AddAngularRunningDim, j'ai une erreur 424. Le plus inquietant est que l'exemple donnée par Dassault comporte aussi cette erreur. J'ai bien ajouté les reference dans Visual Basic.

D'ou est ce que peut venir cette erreur ?

 

Merci pour votre aide.

Mickael

Tu as probablement oublier d'affecter un objet, peut-on voir ton code ?

1 « J'aime »

C'est un code en cours de construction, merci pour ton indulgence. ^^

Je n'ai fait que reprendre l'exemple en l'adaptant a mon model,

L'exemple est dispo ici :

http://help.solidworks.com/2016/English/api/sldworksapi/Set_Properties_of_Angular_Running_Dimension_Example_VB.htm

 

 

Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim swmodel As SldWorks.ModelDocExtension
Dim selmgr As SldWorks.SelectionMgr
Dim dispdim As SldWorks.DisplayDimension
Dim boolstatus As Boolean
Dim errstatus As Long

Option Explicit

Sub main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set swmodel = Part.Extension
    
    boolstatus = Part.ActivateView("Vue de mise en plan1")
    boolstatus = swmodel.SelectByID2("Line5@Esquisse3D4@Fonds-GRC-3@Vue de mise en plan1", "EXTSKETCHSEGMENT", 0.567145629669376, 0.556256162693586, 0, True, 0, Nothing, 0)
    boolstatus = swmodel.SelectByID2("Line5@Esquisse3D5@Fonds-GRC-3@Vue de mise en plan1", "EXTSKETCHSEGMENT", 0.159796832575413, 0.661760850386628, 0, True, 0, Nothing, 0)
   
    

    Set dispdim = swmodel.AddAngularRunningDim(True, False, True, 0.56, 0.64, 0, errstatus)
    Part.Extension.ReJogRunningDimension
    Part.Extension.AlignRunningDimension
    

    Part.SetPickMode

End Sub

 

Dans ton cas ici, SolidWorks va rechercher la le bout d'esquisse Line5@Esquisse3D4@Fonds-GRC-3@Vue de mise en plan1 Or, d'une mise en plan, ou même d'une vue à l'autre ça ne sera pas juste.

Si tu es sur que ça correspond à la bonne chose, redis le moi.

 

Ps: C'est sur quelle ligne que tu as l'erreur ?

1 « J'aime »

J'ai l'erreur sur la ligne : Set dispdim = swmodel.AddAngularRunningDim(True, False, True, 0.56, 0.64, 0, errstatus)

Je ne sais pas trop si j'ai pris le bon element, mais mon but est de recuperer justement le bout de cette ligne pour en faire le centre de ma cotation angulaire puis je selectionne la ligne suivante et je lance la cotation avec ces selections. 

C'est a la cotation que ca foire, je me dis donc que les elements recuperé ne remplisse pas bien leur role.

Ce que je me demande en fait c'est si la position des selections (en X, Y et Z) et de la cotation (LocX, LocY et LocZ) sont correct, mais a priori le retval de l'AddAngularRunningDim me retourne une valeur a 0, c'est qu'il ne peut pas creer la cote. 

Dans ce cas dois-je recuperer les coordonnées de chaque lignes que je souhaite pour les selectionner a nouveau dans le SelectByID2 ?

En ce qui concerne les LocX , Y et Z je ne vois pas bien à quoi ils correspondent, est-ce la position du "click" ou la position de la valeur 0° ?

Je remonte le sujet, quelqu'un aurait-il une solution ?

Bonjour,

essayez de changer les paramètres de la fonction (les true et false) pour voir ce qu'il se passe.

Cordialement.

Bonjour,

Voici le code de l'exemple modifié et fonctionnel (mais en C#, à traduire donc):

ModelDoc2 Part = default(ModelDoc2);
bool boolstatus = false;
int intstatus;
object obj;

Part = ((ModelDoc2)(Program.swapp.ActiveDoc));

boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.163726736787323, 0.199115091463415, 0.00479999999993197, true, 0, null, 0);
boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.220795425811714, 0.179644597560976, 0.00479999999998881, true, 0, null, 0);

obj = Part.Extension.AddAngularRunningDim(false, true, true, 0.154288188900673, 0.0794194886913027, 0, out intstatus);

Part.Extension.ReJogRunningDimension();
Part.Extension.AlignRunningDimension();

Part.SetPickMode();

 

Dans ton cas, essaye de mettre la variable "dispdim" en "objet" et non en "DisplayDimension".

Cordialement,

J'ai essayer de changer les true et les false (toute les combinaisons possible) de la fonction AddAngularRunningDim, ca fonctionne dans le modele mais l'erreur 424 apparait tout de meme sur cette ligne. Ces proprietes ne gerent que le type de cotation (ligne jusqu'au centre, tracé de l'arc de l'angle etc...)

 

J'ai essayer aussi de remplacer la declaration dispdim en Object. Ca ne fonctionne pas non plus.

 

D'autres idees ? 

Bonjour,

J'ai essayé hier soir votre code et j'ai aussi la même erreur.

J'ai également testé d'enregistrer une macro de l'ajout de ce type de côte et là, sw ne se sert pas de cette fonction mais de AddDimension2().

Faites l'essai sur un modèle prototype et vous devriez avoir votre code.

Dans la fonction SelectByID2(), si vous remplissez le nom de la première variable, vous n'avez pas besoin de remplir X,Y et Z. Il retrouve l'entité sans sa position.

Cordialement.

Merci pour le truc du SelectbyID2, il faut mettre 0 partout pour sectionner l'entité voulu. Ca marche impec.

Par contre, j'avais egalement testé l'enregistreur et abouti au meme code avec le AddDimension2 malheureusement en selctionnant 2 lignes il me tire bien une cote mais cela reste une cote d'angle simple sans le 0° qui m''est indispensable dans notre metier de chaudronnier, d'ou l'interet (depuis la version 2014) des cotes d'execution angulaire. 

J'arrive a comprender comment fonctiionne ce code (declaration de l'entite de base puis des entités secondaire puis affichage de la cote 0° a la position LocX, LocY et LocZ  et enfin des suivantes)mais cette erreur 424 est un vrai mystere.

N'y aurait-il pas une erreur dans les references API ? (On ne sait jamais et comme leur exemple contient aussi cette erreur...)

Bonjour,

En passant par un programme en C# il est parfaitement clair qu'il y a un problème de cast entre l'objet du type 'System.Object[]' et l'objet du type 'SolidWorks.Interop.sldworks.DisplayDimension'. Dès la modification faite sur ce problème tout fonctionne normalement.

Je ne connais pas suffisament le VBA pour t'affirmer que le problème est le même mais je peux supposer que oui, je laisse les spécialistes du VBA te répondre sur ce point.

Cordialement,


capture.png

Il y a effectivement un probleme sur l'API. J'ai ouvert un ticket aupres de Solidworks qui a detecté le meme probleme

Je reviendrais vers vous pour la suite, une correction pouvant etre apporté sur le prochain Service Pack.

Merci

Voici la correction appliqué par Dassault. Maintenant cette exemple fonctionne parfaitement avec le modele du tuto adv. (foodprocessor)

'----------------------------------------------------------------------------
' Preconditions:
' 1. Open public_documents\tutorial\advdrawings\foodprocessor.slddrw.
' 2. Open an Immediate window.
'
' Postconditions:
' 1. The specified angular running dimension is inserted into the drawing.
' 2. Inspect the Immediate window.
'
' NOTE: Because the model is used elsewhere, do not save changes to it.
' ---------------------------------------------------------------------------
Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim PartExt As SldWorks.ModelDocExtension
Dim selmgr As SldWorks.SelectionMgr
Dim dispdim As SldWorks.DisplayDimension
Dim swDispDim As SldWorks.DisplayDimension
Dim vdim As Variant
Dim boolstatus As Boolean
Dim errstatus As Long
Dim i As Long

Option Explicit

Sub main()

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

    boolstatus = Part.ActivateView("Drawing View1")
    boolstatus = Part.Extension.SelectByID2("", "VERTEX", 0.17648799570697, 0.195948476524618, 4.79999999998881E-03, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.270641278567064, 0.202920893989561, 4.79999999993197E-03, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.238383279638647, 0.257816085148446, -3.99999999899592E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.154059738580153, 0.26234352359454, 6.00000000247292E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.104823845478885, 0.213673560299033, 6.00000000019918E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.152361949162868, 0.163871737392003, 6.00000000019918E-04, True, 0, Nothing, 0)
    
    vdim = PartExt.AddAngularRunningDim(True, True, True, 0.154288188900673, 7.94194886913027E-02, 0, errstatus)
    Part.SetPickMode
    
    For i = 0 To UBound(vdim)
        Set dispdim = vdim(i)
        Part.Extension.ReJogRunningDimension
        Part.Extension.AlignRunningDimension
        
        Debug.Print "Display chained angular dimensions? " & dispdim.DisplayAsChain
        Debug.Print "Run the angular dimensions bidirectionally? " & dispdim.RunBidirectionally
        Debug.Print "Extend extension lines from center of angular running dimension? " & dispdim.ExtensionLineExtendsFromCenterOfSet
        Debug.Print "Are extension lines jogged? " & dispdim.Jogged
        Debug.Print "Extension line style same as leader line style? " & dispdim.ExtensionLineSameAsLeaderStyle
        Debug.Print "Extension line uses document settings? " & dispdim.ExtensionLineUseDocumentDisplay
        

    Next

End Sub

 

Si j'ai bien compris le probleme venait du fait que la fonction rebouclait a chaque fois sur le meme element d'ou la proposition de la declaration d'une variable et d'une boucle sur les elements. 

 

J'ai bon ?

 

Bonjour,

Ce qui a changé :

'----------------------------------------------------------------------------
' Preconditions:
' 1. Open public_documents\tutorial\advdrawings\foodprocessor.slddrw.
' 2. Open an Immediate window.
'
' Postconditions:
' 1. The specified angular running dimension is inserted into the drawing.
' 2. Inspect the Immediate window.
'
' NOTE: Because the model is used elsewhere, do not save changes to it.
' ---------------------------------------------------------------------------
Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim PartExt As SldWorks.ModelDocExtension
Dim selmgr As SldWorks.SelectionMgr
Dim dispdim As SldWorks.DisplayDimension
Dim swDispDim As SldWorks.DisplayDimension
Dim vdim As Variant
Dim boolstatus As Boolean
Dim errstatus As Long
Dim i As Long

Option Explicit

Sub main()

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

    boolstatus = Part.ActivateView("Drawing View1")
    boolstatus = Part.Extension.SelectByID2("", "VERTEX", 0.17648799570697, 0.195948476524618, 4.79999999998881E-03, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.270641278567064, 0.202920893989561, 4.79999999993197E-03, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.238383279638647, 0.257816085148446, -3.99999999899592E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.154059738580153, 0.26234352359454, 6.00000000247292E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.104823845478885, 0.213673560299033, 6.00000000019918E-04, True, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.152361949162868, 0.163871737392003, 6.00000000019918E-04, True, 0, Nothing, 0)
    
    vdim = PartExt.AddAngularRunningDim(True, True, True, 0.154288188900673, 7.94194886913027E-02, 0, errstatus)
    Part.SetPickMode
    
    For i = 0 To UBound(vdim)
        Set dispdim = vdim(i)
        Part.Extension.ReJogRunningDimension
        Part.Extension.AlignRunningDimension
        
        Debug.Print "Display chained angular dimensions? " & dispdim.DisplayAsChain
        Debug.Print "Run the angular dimensions bidirectionally? " & dispdim.RunBidirectionally
        Debug.Print "Extend extension lines from center of angular running dimension? " & dispdim.ExtensionLineExtendsFromCenterOfSet
        Debug.Print "Are extension lines jogged? " & dispdim.Jogged
        Debug.Print "Extension line style same as leader line style? " & dispdim.ExtensionLineSameAsLeaderStyle
        Debug.Print "Extension line uses document settings? " & dispdim.ExtensionLineUseDocumentDisplay

        

    Next

End Sub

En gras :

Il y avait un problème de cast en la valeur de retour  de la fonction AddAngularRunningDim() et swDispDim.

Aparement, AddAngularRunningDim() renvoie un Array(of DisplayDimension) que vba n'arrivait pas à caster en Object.

En italique, c'est juste une boucle pour afficher les propriétés des côtes créées.

Cordialement.

1 « J'aime »

Bonjour,

Bon à savoir, un "objet" générique en C# est donc un "Variant" en VBA.

Cordialement,

Bonsoir,

Faut croire que oui. C'est louche mais oui ...

Cordialement