Export de points au format STEP

Bonjour 

Je vous joins donc le fichier SW en question. Il me faut donc, en export STEP, le nuage de point ainsi que les courbes.

Si qqn arrive merci de m'expliquer la procédure

 

D'avance merci


nuage_de_points_export_step.sldprt

Bonjour

Je me permet une petite relance de ce sujet. Le fichier en question est joint à ma précédente réponse

D'avance merci à ceux qui pourrait m'aider

Bonjour Aurélien,

 

Je me suis un peu penché sur votre problème ce matin. Pour la question de savoir si SolidWorks permet d'exporter nativement des points d'esquisse 3D dans un fichier STEP, la seule réponse qui semble être valable est que ce n'est pas possible.

Le fichier STEP étant un fichier texte (non binaire), il est possible de l'ouvrir avec un éditeur de texte quelconque. Et quand j'ouvre un STEP produit par SolidWorks à partir de votre fichier pièce, je ne trouves pas les coordonnées des points dedans.

 

Maintenant, il est possible d'extraire les coordonnées des points par une macro comme celle proposé sur ce lien : https://forum.solidworks.com/thread/21628#comment-135766

Je me suis alors amusé à le faire et à générer un STEP par un script en Python (je ne suis pas fan des macro VBA). La définition du format STEP étant dans une norme payante, je l'ai fait par interpolation depuis des exemples de fichiers STEP. Le problème est que SolidWorks n'importe pas les points des fichiers STEP comme des points physique. Cela est sans doute lié au fait qu'il ne peut pas faire la différence entre un point seul qui doit être considéré comme tel et les points qui définissent des extrémités de courbes et qui ne doivent pas être pris en compte individuellement.

Importer mon fichier STEP généré donnera donc une pièce vide. Idem pour FreeCAD. Je me pose alors deux questions :

  • Avez-vous un exemple de fichier STEP avec seulement des points exportés par Creo pour le prendre comme modèle et être sur que mon fichier généré est similaire ?
  • Pouvez-vous essayer d'importer les deux fichiers STEP joints sur votre logiciel de métrologie (au cas où je sois tombé juste, à l'aveuglette) ?

Si cela marche en passant par ce moyen, il sera aisé de convertir mon script Python en VBA pour pouvoir l'utiliser directement depuis SW.


fichiers_step_generes_v1.zip
2 « J'aime »

bonjour,

juste une question pourquoi exporter des points en step ?

tu peux les donner sous forme tableau excel en utilisant cette macro.

que la force soit ave toi


pointtoexcel.swp
1 « J'aime »

Bonjour mgauroy,

Tout d'abord je vous remercie pour le temps passé ainsi que les tests effectués.

Alors, j'ai essayé d'importer les fichiers dans mon logiciel de métrologie mais je n'ai rien c'est vide, comme lorsque j'essaie d'ouvir sur SW.  Par contre pour ce qui est de votre demande pour avoir les points exportés avec creo se sera difficile. Je n'ai pas ce logiciel et c'est un fichier envoyé par un client que j'ai retravaillé en enlevant les volumes.

Par contre SW arrive parfaitement à lire les points d'autre fichiers STEP, la preuve avec le fichier que je vous ai transmis. 

Je peux essayer de voir si je peux obtenir ce nuage de points directement en STEP et l'envoyer ici sans le retravailler sur SW. 

D'ailleurs si je ne me trompe pas même en esquisse 2D l'export de point de fonctionne pas.

Pensez-vous qu'il y ait une solution ?

Mes salutations

Bonjour,

Tout simplement parce que j'ai besoin de ces points pour savoir a quel endroit je dois venir palper avec ma machine de contrôle 3D. Hors le problème est que ces points doivent être liés à la maquette 3D de la pièce. Malheureusement les fichiers que je peux importer sur sur mon logiciel de métrologie est uniquement le format STEP.

Je dessine donc ma maquette, mes courbes et mes points et je fais l'export en STEP. Je dois utiliser les différentes options d'export pour avoir les courbes et la maquette ( 2 fichiers STEP) mais impossible d'obtenir les points. 

La licence du soft de métrologie gère plusieurs formats dont l'IGES mais malheureusement l'option est payante, j'ai donc demandé à la hotline du soft de faire un test si avec l'IGES cela fonctionne et la tout est en ordre il y tout, maquette, courbes et points qui plus est avec un seul et unique fichier.

Nous avons choisi l'option STEP car un de nos client travail avec ce format et nous fournissait les volumes (fait avec Creo) mais nous n'avions pas anticipé que cela ne fonctionnerait pas avec Solidworks. Donc si mje dois faire un modification de palpage je suis embêter

D'ou ma question de trouver une solution de contournement puisque actuellement il n'est pas possible d'acheter l'option IGES.

Voilà, maintenant j'ai demandé a mon client de m'envoyer, si possible, que les courbes pour voir comment il est formaté et voir si on arrive a reproduire cela avec une macros.

Merci pour l'intérêt

@ aurelien.buathier

ok je vois

je connais pas bien le sujet je vais peut être dire une sottise mais je le dis quand même  est il possible de placer une micro sphère à chaque points?

que la force soit avec toi.

 

1 « J'aime »

@ OBI WAN

Ce n'est pas une sottise bien au contraire

Le problème étant que j'ai besoin que mon logiciel de métrologie puisse l'interpréter comme un point et non une sphère

Pour illustrer mes propos je met en pièce jointe 1 capture d'écran dans mon logiciel de métrologie qui montre que j'ai besoin de 2 choses. La surface de la maquette et le point qui me servent de coordonnées exat pour la prise de points. Sachant que ce programme est partagé c'est pour fiabiliser la mesure en cas de modification nous pouvons nous transmettre les corrections. Mon problème étant que je peux modifier ses points sur SW mais je ne peux pas les sauver en STEP.

Je sais bien que c'est une demande bien spécifique mais c'est assez surprenant que l'export en STEP pose autant de problème. Surtout que cela fonctionne pour d'autre logiciel. 

Mais je pense que la solution proposé par @ mgauroy est une solution qu'il faut affiner

Merci pour les pistes

Cordialement


logiciel_metrologie.jpg
1 « J'aime »

Bonjour si j'ai bien compris ton client a CREO.

Pourquoi tu ne lui envoie pas ton fichier en IGES pour qu'il le convertisse en STEP

Si j'ouvre ton fichier SW sous SW que je l'enregistre en IGES puis je l'ouvre sous CATIA je peux facilement le sauvegarder en STEP.

 

1 « J'aime »

Bonjour Franck

C'est une possibilité effectivement mais vous pouvez bien comprendre que pour 1 ou 2 fichiers c'est envisageable mais la on parle de plusieurs programmes. Travaillant comme sous traitant j'ai besoin de faire des programmes intermédiaires qui ne concerne pas directement le produit final, sans compter que si je veux faire un programme de A à Z je ne peux pas de manière indépendante. SI il ne s'agissait que de quelques programmes je n'aurais pas chercher un solutions autre que celle que tu énumères. Sans compter les projets pour d'autres clients. 

Il me faut une solutions viable et avec les moyens que j'ai à disposition

Merci pour la réponse

Franck

Serait-il possible d'avoir le fichier STEP générer par CATIA? Je voudrait tester si les points apparaisse sur mon logiciel de métrologie?

D'avance je te remercie 

Très bon week-end à tous

Bonjour,

Est ce que tu peux joindre un fichier STEP généré par Creo (avec des points qui apparaisse comme il faut)

Bonjour

J'ai reçu le fichier généré par CREO, j'ai constaté qu'en fait le 2ème fichier STEP générer par mgauroy ( il ya 6 jours) était similaire au format CREO. J'ai donc chercher pourquoi les points ne s'affichait pas sur mon logiciel de métrologie et j'ai trouvé que c'était en fait une option du logiciel que j'avais omis d'activer.

Donc le fichier qui ne contient pas les lignes VERTEX_POINT ( '', #1 ); est lisible et exploitable.

Maintenant il me faut pourvoir créer une macro qui me permette d'extraire ses points en .STEP pour chaque assemblage que je fait sur SW. 

Si mgauroy peut m'aider ou une autre personne c'est bien volontiers

Merci beaucoup 

Bonjour Essaye ca:

Option Explicit
Dim FilePath As String
Dim myPoints As Collection

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then
        MsgBox "Ouvrir une pièce"
        Exit Sub
    End If
    If swModel.GetType <> swDocumentTypes_e.swDocPART Then
        MsgBox "Ouvrir une pièce"
        Exit Sub
    End If
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swStepAP, 214
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAs3DCurves_IncludeSketchEnts
    
    FilePath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".") - 1) & ".STEP"
    swModel.Extension.SaveAs2 FilePath, 0, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, Empty, False, Empty, Empty
    
    Set myPoints = New Collection

    Dim swFeat As SldWorks.Feature
    Dim swSubFeat As SldWorks.Feature
    Set swFeat = swModel.FirstFeature
    While Not swFeat Is Nothing
        ProcessFeat swFeat
        Set swSubFeat = swFeat.GetFirstSubFeature
        While Not swSubFeat Is Nothing
            ProcessFeat swSubFeat
            Set swSubFeat = swSubFeat.GetNextSubFeature
        Wend
        Set swFeat = swFeat.GetNextFeature
    Wend

    UpdateStep Empty
    
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface
End Sub

Sub ProcessFeat(ByVal swFeat As SldWorks.Feature)
    Dim swSketch As SldWorks.Sketch
    Dim swPt As SldWorks.SketchPoint
    Dim vPts As Variant
    Dim vPt As Variant
    'Debug.Print swfeat.Name & " " & swfeat.GetTypeName2
    If swFeat.GetTypeName2 = "ProfileFeature" Or swFeat.GetTypeName2 = "3DProfileFeature" Then
        Set swSketch = swFeat.GetSpecificFeature2
        vPts = swSketch.GetSketchPoints
        For Each vPt In vPts
            Set swPt = vPt
            If Not swPt Is Nothing Then
                If swPt.Type = swSketchPointType_e.swSketchPointType_User Then
                    myPoints.Add " = CARTESIAN_POINT ( 'NONE',  ( " & swPt.X * 1000 & ", " & swPt.Y * 1000 & ", " & swPt.Z * 1000 & " ) ) ;"
                End If
            End If
        Next
    End If
End Sub

Sub UpdateStep(void)
    Dim myData As String
    Dim filenum As Integer
    filenum = FreeFile
    Debug.Print FilePath
    Open FilePath For Binary As #filenum
    myData = Space$(LOF(1))
    Get #filenum, , myData
    Close #filenum
    
    Dim Lines() As String
    Lines = Split(myData, vbCrLf)
    Dim line As Variant
    Dim MaxNum As Integer
    For Each line In Lines
        If Left(line, 1) = "#" Then
            MaxNum = CInt(Mid(line, 2, InStr(line, "=") - 3))
        End If
    Next
    
    Dim i As Integer
    Dim myLines As String
    For i = 1 To myPoints.Count
        myLines = myLines & "#" & MaxNum + i & myPoints(i) & vbCrLf
    Next i
       
    Dim EndString As String
    EndString = "ENDSEC;" & vbCrLf & "END-ISO"
    myData = Replace(myData, EndString, myLines & EndString)
    
    Open FilePath For Output As #filenum
    Print #filenum, myData
    Close #filenum
End Sub

 

2 « J'aime »

Bonjour Jerome

Je te remercie pour le script, j'ai fait un test il fonctionne parfaitement, Par contre je ne peux pas travailler directement depuis un assemblage avec plusieurs fichiers pièces qui comporte des points, c'est bien juste? Je dois ouvrir chaque pièces séparément et exécuter le script. Ce n'est pas un problème en soi mais j'aurai aimé pouvoir faire comme pour le reste du fichier (volume et courbe) à savoir afficher à l'écran les pièces contenant les points et ensuite obtenir un seul fichier STEP avec tous les points. 

Également une chose, la numérotation des point est indiquer comme NONE, j'aurais aimé pouvoir nommé les points comme je le voulais mais j'ai regardé sur SW et je n'ai pas trouvé cette option. SW donne un numéro point1,point2, etc.. de manière automatique mais j'aurais voulu pouvoir indiquer le nom de chaque point et ensuite lors de l'export en STEP que les nom soient gardés. Est-ce possible ?

Afin d'illustrer mes propos, je vais mettre le fichier CREO que j'ai reçu de mon client. Lorsque j'essaie de l'ouvrir sur SW, celui-ci me dit que c'est un assemblage et à l'intérieur il créé une pièce avec les points. Je peux donc bien lire le fichier avec uniquement les points. vous verrez que les points sont tous numérotés. 

Voilà maintenant je suis bien conscient que la demande n'est pas simple et même si elle est possible mais c'est ce sur quoi j'aimerais arrivé

En attendant je vous remercie tous pour le travail et surtout l'apport d'une solution. 

Redite moi ce que vous en pensez

Merci


nuages_de_points_creo.stp
2 « J'aime »

Bonjour

En fait je me rend compte que j'ai vraiement besoin que cette macro fonctionne directement depuis un assemblage sinon, lorsque je réimporte les fichiers, il ne sont pas dans le bon repère et n'épouse pas la pièce puisque je suis dans le repère local et pas dans le repère de l'assemblage.

Est-ce possible ou non?

Merci

Bonjour, essaye ca sur un assemblage

Option Explicit
Dim fileNum As Integer
Dim lineNum As Integer
Dim swMathUtil As SldWorks.MathUtility

Sub main()
  Dim swApp As SldWorks.SldWorks
  Dim swModel As SldWorks.ModelDoc2
  Dim swConf As SldWorks.Configuration
  Dim swRootComp As SldWorks.Component2
  Dim filePath As String
  Set swApp = Application.SldWorks
  Set swMathUtil = swApp.GetMathUtility
  Set swModel = swApp.ActiveDoc
  If swModel Is Nothing Then
    MsgBox "Ouvrir un assemblage ou une pièce"
    Exit Sub
  End If
  If swModel.GetType = swDocumentTypes_e.swDocDRAWING Then
    MsgBox "Ouvrir un assemblage ou une pièce"
    Exit Sub
  End If
  
  filePath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".") - 1) & ".STEP"
  fileNum = FreeFile
  Open filePath For Output As #fileNum
  
  PrintTxt "ISO-10303-21;"
  PrintTxt "HEADER;"
  PrintTxt "FILE_DESCRIPTION (( 'STEP AP214' ), '1');"
  PrintTxt "FILE_NAME ('" & swModel.GetTitle & "', '', ('JeromeP'), (''), 'ExportePointsEnStepMacro', 'SolidWorks', '');"
  PrintTxt "ENDSEC;"
  PrintTxt "DATA;"
  
  lineNum = 0
  If swModel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
    TraverseComponent swRootComp
  Else
    TraverseFeat swModel, Nothing
  End If

  PrintSet Empty

  PrintTxt "ENDSEC;"
  PrintTxt "END-ISO-10303-21;"
  Close #fileNum
  MsgBox "Exporté dans: " & vbCr & filePath
End Sub

Sub PrintTxt(myTxt As String)
  Print #fileNum, myTxt
End Sub


Sub TraverseComponent(swComp As SldWorks.Component2)
  Dim vChilds As Variant
  Dim vChild As Variant
  Dim swChildComp As SldWorks.Component2
  Dim compTransform As SldWorks.MathTransform
  Dim swModel As SldWorks.ModelDoc2
  Dim swPart As SldWorks.PartDoc
  Dim vBoundBox As Variant
  Dim swMass As SldWorks.MassProperty
  vChilds = swComp.GetChildren
  For Each vChild In vChilds
    Set swChildComp = vChild
    Set compTransform = swChildComp.Transform2
    'Debug.Print swChildComp.Name2'
    Set swModel = swChildComp.GetModelDoc2
    If swModel.GetType = swDocumentTypes_e.swDocPART Then
      TraverseFeat swModel, compTransform
    End If
    TraverseComponent swChildComp
  Next
End Sub

Sub TraverseFeat(ByVal swModel As SldWorks.ModelDoc2, ByVal Xform As SldWorks.MathTransform)
  Dim swFeat As SldWorks.Feature
  Dim swSubFeat As SldWorks.Feature
  Set swFeat = swModel.FirstFeature
  While Not swFeat Is Nothing
    ProcessFeat swFeat, Xform
    Set swSubFeat = swFeat.GetFirstSubFeature
    While Not swSubFeat Is Nothing
      ProcessFeat swSubFeat, Xform
      Set swSubFeat = swSubFeat.GetNextSubFeature
    Wend
    Set swFeat = swFeat.GetNextFeature
  Wend
End Sub

Sub ProcessFeat(ByVal swFeat As SldWorks.Feature, ByVal Xform As SldWorks.MathTransform)
  Dim swSketch As SldWorks.Sketch
  Dim swPt As SldWorks.SketchPoint
  Dim vPts As Variant
  Dim vPt As Variant
  Dim mPt As SldWorks.MathPoint
  Dim nPt(2) As Double
  'Debug.Print swfeat.Name & " " & swfeat.GetTypeName2'
  If swFeat.GetTypeName2 = "ProfileFeature" Or swFeat.GetTypeName2 = "3DProfileFeature" Then
    Set swSketch = swFeat.GetSpecificFeature2
    vPts = swSketch.GetSketchPoints
    For Each vPt In vPts
      Set swPt = vPt
      If Not swPt Is Nothing Then
        If swPt.Type = swSketchPointType_e.swSketchPointType_User Then
          lineNum = lineNum + 1
          nPt(0) = swPt.X: nPt(1) = swPt.Y: nPt(2) = swPt.Z
          If Not Xform Is Nothing Then
            Set mPt = swMathUtil.CreatePoint(nPt)
            Set mPt = mPt.MultiplyTransform(Xform)
            nPt(0) = mPt.ArrayData(0)
            nPt(1) = mPt.ArrayData(1)
            nPt(2) = mPt.ArrayData(2)
          End If
          PrintTxt "#" & lineNum & " = CARTESIAN_POINT ( 'PNT" & lineNum & "', ( " & nPt(0) * 1000 & "E-3, " & nPt(1) * 1000 & "E-3, " & nPt(2) * 1000 & "E-3 ) ) ;"
        End If
      End If
    Next
  End If
End Sub

Sub PrintSet(void)
  Dim myTxt As String
  Dim j As Integer
  myTxt = "#" & lineNum + 1 & " = GEOMETRIC_SET('',(#"
  For j = 1 To lineNum - 1
    myTxt = myTxt & j & ", #"
  Next j
  myTxt = myTxt & lineNum & "));"
  PrintTxt myTxt
End Sub

 

1 « J'aime »

Bonjour JérômeP,

Merci d'avoir pris mon relais pour répondre à Aurélien pendant que j'étais en vacances. En plus les notifications de nouveaux postes ne semblent plus marcher chez moi alors je n'allais pas répondre.

M.

PS : Aurélien, si la macro de Jérôme fonctionne bien, pourrais tu sélectionner sa réponse comme meilleur réponse ? C'est pour clore le fil de discussion.

2 « J'aime »