Eksport punktów w formacie STEP

Witam 

W związku z tym załączam plik SW, o którym mowa. Potrzebuję więc, w eksporcie STEP, chmury punktów oraz krzywych.

Jeśli ktoś przyjedzie, proszę o wyjaśnienie mi procedury

 

Z góry dziękuję


nuage_de_points_export_step.sldprt

Witam

Pozwolę sobie powrócić do tego tematu. Plik, o którym mowa, jest załączony do mojej poprzedniej odpowiedzi

Z góry dziękuję tym, którzy mogli mi pomóc

Witaj Aurélien,

 

Przyjrzałem się trochę twojemu problemowi dziś rano. Na pytanie, czy SolidWorks pozwala na natywny eksport punktów szkicu 3D do pliku STEP, jedyną odpowiedzią, która wydaje się być prawidłowa, jest to, że nie jest to możliwe.

Ponieważ plik STEP jest (niebinarnym) plikiem tekstowym, można go otworzyć za pomocą dowolnego edytora tekstu. A kiedy otwieram STEP utworzony przez SolidWorks z pliku części, nie mogę znaleźć współrzędnych punktów w nim zawartych.

 

Teraz możliwe jest wyodrębnienie współrzędnych punktów za pomocą makra, takiego jak to zaproponowane pod tym linkiem: https://forum.solidworks.com/thread/21628#comment-135766

Potem dobrze się bawiłem, robiąc to i generując KROK za pomocą skryptu Pythona (nie jestem fanem makr VBA). Ponieważ definicja formatu STEP jest w płatnym standardzie, zrobiłem to poprzez interpolację z przykładów plików STEP. Problem polega na tym, że SolidWorks nie importuje punktów z plików STEP jako punktów fizycznych. Jest to prawdopodobnie związane z faktem, że nie potrafi on odróżnić pojedynczego punktu, który powinien być traktowany jako taki, od punktów, które definiują punkty końcowe krzywej i które nie powinny być brane pod uwagę indywidualnie.

Zaimportowanie wygenerowanego przeze mnie pliku STEP spowoduje zatem powstanie pustej części. To samo dotyczy FreeCAD. Następnie zadaję sobie dwa pytania:

  • Czy masz przykład pliku STEP z samymi punktami wyeksportowanymi przez Creo, aby potraktować go jako szablon i mieć pewność, że wygenerowany przeze mnie plik jest podobny?
  • Czy możesz spróbować zaimportować dwa załączone pliki STEP do swojego oprogramowania metrologicznego (na wypadek, gdybym się ślepo mylił)?

Jeśli to zadziała w ten sposób, łatwo będzie przekonwertować mój skrypt Pythona na VBA, aby móc go używać bezpośrednio z oprogramowania.


fichiers_step_generes_v1.zip
2 polubienia

Witam

Tylko pytanie Dlaczego warto eksportować ściegi w kroku?

Za pomocą tego makra możesz podać je w formie tabeli Excela.

Niech moc będzie z tobą


pointtoexcel.swp
1 polubienie

Witaj mgauroy,

Przede wszystkim dziękuję za poświęcony czas i przeprowadzone testy .

Próbowałem więc zaimportować pliki do mojego oprogramowania metrologicznego, ale nic nie miałem, jest puste, jak przy próbie otwarcia na SW. Z drugiej strony, jeśli chodzi o Twoją prośbę o eksport punktów za pomocą creo,  będzie to trudne. Nie mam tego oprogramowania i jest to plik wysłany przez klienta, który przerobiłem, usuwając woluminy.

Z drugiej strony, SW jest doskonale w stanie odczytać punkty innych plików STEP, dowód z plikiem, który Ci wysłałem. 

Mogę spróbować sprawdzić, czy mogę pobrać tę chmurę punktów bezpośrednio w STEP i wysłać ją tutaj bez przerabiania jej na SW. 

Nawiasem mówiąc, o ile się nie mylę, nawet w szkicowaniu 2D eksport punktów nie działa.

Czy uważasz, że istnieje rozwiązanie?

Pozdrawiam

Witam

Po prostu dlatego, że potrzebuję tych punktów, aby wiedzieć, gdzie powinienem się znaleźć, aby sondować za pomocą mojej maszyny sterującej 3D. Problem polega jednak na tym, że punkty te muszą być połączone z modelem 3D części. Niestety pliki, które mogę zaimportować do mojego oprogramowania metrologicznego, to tylko format STEP.

Rysuję więc mój model, moje krzywe i moje punkty, a następnie eksportuję je w STEP. Muszę użyć różnych opcji eksportu, aby uzyskać krzywe i model (2 pliki STEP), ale nie mogę uzyskać punktów. 

Licencja oprogramowania metrologicznego obsługuje kilka formatów, w tym IGES, ale niestety opcja jest płatna, więc poprosiłem infolinię oprogramowania o zrobienie testu, czy z IGES działa i wszystko jest w porządku, jest wszystko, model, krzywe i punkty ponadto z jednym plikiem.

Wybraliśmy opcję STEP, ponieważ jeden z naszych klientów pracuje z tym formatem i dostarczył nam woluminy (wykonane w Creo), ale nie przewidzieliśmy, że nie będzie to działać z Solidworks. Więc jeśli muszę dokonać modyfikacji sondowania, jestem zirytowany

Stąd moje pytanie, aby znaleźć obejście, ponieważ obecnie nie ma możliwości zakupu opcji IGES .

To wszystko, teraz poprosiłem mojego klienta, aby przesłał mi, jeśli to możliwe, tylko krzywe, aby zobaczyć, jak są sformatowane i sprawdzić, czy możemy to odtworzyć za pomocą makra.

Dzięki za zainteresowanie

@ aurelien.buathier

ok rozumiem

Nie znam się dobrze na temacie, może powiem coś głupiego, ale i tak to powiem, czy da się umieścić mikro sferę w każdym punkcie?

Niech Moc będzie z wami.

 

1 polubienie

@ OBI WAN

Nie jest to głupota, wręcz przeciwnie.

Problem polega na tym, że potrzebuję mojego oprogramowania metrologicznego, aby móc zinterpretować to jako punkt, a nie kulę

Aby zilustrować moje słowa, załączam 1 zrzut ekranu w moim oprogramowaniu metrologicznym , który pokazuje, że potrzebuję 2 rzeczy. Powierzchnia modelu i punkt, którego używam jako współrzędnych eksat do pomiaru punktów. Wiedząc, że ten program jest współdzielony, ma to sprawić, że pomiar będzie bardziej wiarygodny, w przypadku zmiany możemy przesyłać sobie nawzajem poprawki. Mój problem polega na tym, że mogę modyfikować jego punkty na SW , ale nie mogę ich zapisać w STEP.

Wiem, że jest to bardzo konkretna prośba, ale dość zaskakujące jest to, że eksport do oczyszczalni ścieków stwarza tak wiele problemów. Zwłaszcza, że działa z innym oprogramowaniem. 

Uważam jednak, że rozwiązanie zaproponowane przez @mgauroy jest rozwiązaniem, które wymaga dopracowania

Dzięki za leady

Pozdrowienia


logiciel_metrologie.jpg
1 polubienie

Witam, jeśli dobrze zrozumiałem Twojego klienta w CREO.

Dlaczego nie wyślesz swojego pliku do IGES, aby mógł go przekonwertować na KROK

Jeśli otworzę plik SW w SW i zapiszę go w IGES, a następnie otworzę go w CATIA, mogę go łatwo zapisać w STEP.

 

1 polubienie

Cześć Franck

Rzeczywiście jest to możliwe, ale można zrozumieć, że dla 1 lub 2 plików jest to możliwe, ale mówimy o kilku programach. Pracując jako podwykonawca muszę tworzyć programy pośrednie, które nie dotyczą bezpośrednio produktu końcowego, nie wspominając o tym, że jeśli chcę zrobić program od A do Z, nie mogę tego zrobić samodzielnie. Gdyby to było tylko kilka programów, nie szukałbym innego rozwiązania niż to, które wymieniłeś. Nie wspominając już o projektach dla innych klientów. 

Potrzebuję realnego rozwiązania przy użyciu środków, którymi dysponuję

Dziękuję za odpowiedź

Franck

Czy byłoby możliwe, aby plik STEP został wygenerowany przez CATIA? Chciałbym sprawdzić, czy punkty pojawiają się w moim oprogramowaniu metrologicznym?

Z góry dziękuję 

Miłego weekendu dla wszystkich

Witam

Czy możesz dołączyć plik STEP wygenerowany przez Creo (z kropkami, które pojawiają się tak, jak powinny)

Witam

Otrzymałem plik wygenerowany przez CREO, stwierdziłem, że w rzeczywistości plik 2nd STEP wygenerowany przez mgauroy (6 dni temu) był podobny do formatu CREO. Przyjrzałem się więc, dlaczego kropki nie są wyświetlane w moim oprogramowaniu metrologicznym i odkryłem, że w rzeczywistości była to opcja oprogramowania, której zapomniałem aktywować.

Tak więc plik, który nie zawiera wierszy , VERTEX_POINT ('', #1); jest czytelny i użyteczny.

Teraz muszę być w stanie stworzyć makro, które pozwoli mi wyodrębnić jego punkty w . KROK dla każdego montażu, który wykonuję na SW. 

Jeśli mgauroy może pomóc mi lub innej osobie, jest to bardzo szczęśliwe

Dziękuję bardzo 

Witam Spróbuj tego:

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 polubienia

Witaj Jerome

Dziękuję za skrypt, zrobiłem test, działa idealnie, z drugiej strony nie mogę pracować bezpośrednio z zestawu z kilkoma plikami części, które mają punkty, prawda? Muszę otworzyć każdy utwór osobno i uruchomić skrypt. Nie jest to problem sam w sobie, ale chciałbym móc zrobić to, co dla reszty pliku (objętość i krzywa), a mianowicie wyświetlić na ekranie części zawierające punkty, a następnie uzyskać pojedynczy plik STEP ze wszystkimi punktami. 

Również jedno, numeracja punktów jest oznaczona jako BRAK, chciałbym móc nazwać punkty tak, jak chcę, ale spojrzałem na SW i nie mogłem znaleźć tej opcji. SW podaje liczbę punkt1, punkt2 itd. automatycznie, ale chciałbym mieć możliwość wskazania nazwy każdego punktu, a następnie podczas eksportu w STEP, aby nazwa została zachowana. Czy jest to możliwe?

Aby zilustrować mój punkt widzenia, zamieszczę plik CREO, który otrzymałem od mojego klienta. Kiedy próbuję go otworzyć na SW, mówi mi, że to zespół, a w środku tworzy pokój z kropkami. Dzięki temu mogę dobrze odczytać plik za pomocą tylko kropek. Zobaczysz, że wszystkie kropki są ponumerowane. 

Teraz doskonale zdaję sobie sprawę, że prośba nie jest prosta, a nawet jeśli jest możliwa, to jest to, co chciałbym osiągnąć

W międzyczasie dziękuję wszystkim państwu za pracę, a zwłaszcza za znalezienie rozwiązania. 

Powiedz mi, co myślisz

Dziękuję


nuages_de_points_creo.stp
2 polubienia

Witam

W rzeczywistości zdaję sobie sprawę, że naprawdę potrzebuję tego makra do pracy bezpośrednio z zespołu , w przeciwnym razie, gdy ponownie zaimportuję pliki, nie są one w odpowiednim układzie współrzędnych i nie pasują do części, ponieważ jestem w lokalnym układzie współrzędnych, a nie w układzie współrzędnych zespołu.

Czy jest to możliwe, czy nie?

Dziękuję

Witam, wypróbuj to na zestawie

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 polubienie

Witaj JérômeP,

Dziękuję, że przejąłeś ode mnie zadanie udzielenia odpowiedzi Aurélienowi, kiedy byłem na wakacjach. Ponadto powiadomienia o nowych postach wydają się już dla mnie nie działać, więc nie zamierzałem odpowiadać.

M.

PS: Aurélien, jeśli makro Jerome'a działa dobrze, czy mógłbyś wybrać jego odpowiedź jako najlepszą? Ma to na celu zamknięcie wątku dyskusji.

2 polubienia