Pracujemy w ten sam sposób, oznaczenie umieszczamy ręcznie podczas tworzenia pliku, który wykorzystamy do oprogramowania do cięcia. Nie sądzę, aby można to było zrobić za pomocą makra, ponieważ twoje oznaczanie nie jest wykonywane przez Solidworks.
SW może wyświetlać linie zagięcia w widoku rozwiniętym (rysunkowym). Czy jest jakaś różnica w stosunku do tego, czego szukasz? W Twoim przykładzie nie ma "żółtych linii"
Poniższy kod utworzy linie o średnicy 3 mm na każdym końcu linii flądry.
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swMathUtil As SldWorks.MathUtility
Dim BendlinesArr As Variant
Dim Bendline As Variant
Dim swSketch As SldWorks.Sketch
Dim swModelToViewXForm As SldWorks.MathTransform
Dim swModelToSketchXForm As SldWorks.MathTransform
Dim swDrawingToViewXForm As SldWorks.MathTransform
Dim swSketchLine As SldWorks.SketchLine
Dim swSkStartPt As SldWorks.SketchPoint
Dim swSkEndPt As SldWorks.SketchPoint
Dim swSketchSeg As SldWorks.SketchSegment
Dim nPt(2) As Double
Dim vPt As Variant
Dim swStartPt As SldWorks.MathPoint
Dim swEndPt As SldWorks.MathPoint
Dim X1 As Double, Y1 As Double, X2 As Double, Y2 As Double
Dim X3 As Double, Y3 As Double, X4 As Double, Y4 As Double
Dim Length As Double, Delta As Double
Sub main()
Set swApp = Application.SldWorks
Set swMathUtil = swApp.GetMathUtility
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swView = swDraw.GetFirstView
Set swView = swView.GetNextView
Dim swLayerMgr As SldWorks.LayerMgr
Set swLayerMgr = swModel.GetLayerManager
Dim SavedLayerName As String
SavedLayerName = swLayerMgr.GetCurrentLayer
'optionnel: ajoute les lignes sur un nouveau calque'
'swLayerMgr.AddLayer "nouveauCalque", "", 0, 0, 0
'optionnel: ajoute les lignes sur un calque existant'
'swLayerMgr.SetCurrentLayer "monCalque"
While Not swView Is Nothing
If swView.IsFlatPatternView Then
swDraw.ActivateView swView.GetName2
If swView.GetBendLineCount > 0 Then
BendlinesArr = swView.GetBendLines
For Each Bendline In BendlinesArr
Set swSketchLine = Bendline
If swSketchLine.IsBendLine Then
Set swSkStartPt = swSketchLine.GetStartPoint2
Set swSkEndPt = swSketchLine.GetEndPoint2
Set swSketch = swSketchLine.GetSketch
Set swModelToSketchXForm = swSketch.ModelToSketchTransform.Inverse
Set swModelToViewXForm = swView.ModelToViewTransform
Set swDrawingToViewXForm = drawingToViewTransform(swView).Inverse
nPt(0) = swSkStartPt.X
nPt(1) = swSkStartPt.Y
nPt(2) = swSkStartPt.Z
vPt = nPt
Set swStartPt = swMathUtil.CreatePoint(vPt)
Set swStartPt = swStartPt.MultiplyTransform(swModelToSketchXForm)
Set swStartPt = swStartPt.MultiplyTransform(swModelToViewXForm)
Set swStartPt = swStartPt.MultiplyTransform(swDrawingToViewXForm)
nPt(0) = swSkEndPt.X
nPt(1) = swSkEndPt.Y
nPt(2) = swSkEndPt.Z
vPt = nPt
Set swEndPt = swMathUtil.CreatePoint(vPt)
Set swEndPt = swEndPt.MultiplyTransform(swModelToSketchXForm)
Set swEndPt = swEndPt.MultiplyTransform(swModelToViewXForm)
Set swEndPt = swEndPt.MultiplyTransform(swDrawingToViewXForm)
X1 = swStartPt.ArrayData(0)
Y1 = swStartPt.ArrayData(1)
X2 = swEndPt.ArrayData(0)
Y2 = swEndPt.ArrayData(1)
Set swSketchSeg = swSketchLine
'set lines length to 3mm'
Delta = 0.003
Length = swSketchSeg.GetLength
X3 = (X2 - X1) * Delta / Length + X1
Y3 = (Y2 - Y1) * Delta / Length + Y1
X4 = (X1 - X2) * Delta / Length + X2
Y4 = (Y1 - Y2) * Delta / Length + Y2
swModel.SetAddToDB True
Set swSketchSeg = swModel.SketchManager.CreateLine(X1, Y1, 0#, X3, Y3, 0#)
swSketchSeg.Color = RGB(255, 255, 0)
Set swSketchSeg = swModel.SketchManager.CreateLine(X2, Y2, 0#, X4, Y4, 0#)
swSketchSeg.Color = RGB(255, 255, 0)
swModel.SetAddToDB False
End If
Next
End If
End If
Set swView = swView.GetNextView
Wend
swLayerMgr.SetCurrentLayer SavedLayerName
swModel.ClearSelection2 True
End Sub
Public Function drawingToViewTransform(swView As SldWorks.View) As SldWorks.MathTransform
Dim swMathUtil As SldWorks.MathUtility
Dim transformData(15) As Double
Set swMathUtil = swApp.GetMathUtility
transformData(0) = Cos(swView.Angle)
transformData(1) = Sin(swView.Angle)
transformData(2) = 0#
transformData(3) = -Sin(swView.Angle)
transformData(4) = Cos(swView.Angle)
transformData(5) = 0#
transformData(6) = 0#
transformData(7) = 0#
transformData(8) = 1#
transformData(9) = swView.Position(0)
transformData(10) = swView.Position(1)
transformData(11) = 0#
transformData(12) = swView.ScaleDecimal
transformData(13) = 0#
transformData(14) = 0#
transformData(15) = 0#
Set drawingToViewTransform = swMathUtil.CreateTransform(transformData)
End Function
Dziękuję JeromeP za makro, działa świetnie. Wszystko, czego potrzebujemy, to znaleźć sposób, aby linie szkicu miały odpowiedni kolor, które są ograniczone na liniach zagięcia, ponieważ usuwamy je później i służą tylko do składania.
Cześć, ja też mogę być zainteresowany tym makrem, ale nie mogłem go zmusić do działania. Jak to dokładnie działa?
Z MEP z pokazanymi, ukrytymi liniami zagięcia?
Albo to kopiując kod, popełniam błąd...
Ostatni punkt, czy możliwe jest przepuszczenie tych żółtych linii również na określonej warstwie? (Mamy automatyczne czyszczenie płaszczyzn cięcia z integracją, która ukrywa niektóre warstwy, gwinty i warstwę tła przed zapisaniem w dxf)
Tak. Wystarczy, że umieścisz apostrof ' przed wierszami :(lub usuniesz te wiersze)
' swModel.SetAddToDB Prawda
' swModel.SetAddToDB Fałsz
Z drugiej strony umieści automatyczne relacje, więc może zrobić wszystko, zwłaszcza jeśli nastąpi pomniejszenie, więc powiększ (nawet jeśli pomieszczenie stanie się większe niż ekran) przed uruchomieniem makra.
Nawiązanie bardziej szczegółowych relacji jest możliwe, ale wymagałoby to więcej pracy.
Bardzo fajne makro teraz, gdy udało mi się go uruchomić! Z drugiej strony, z jakiejś niemożliwej części, ten błąd Przykład 1 dołączony, linie nie są we właściwym miejscu i błąd w makrze.
Ponadto nie można umieścić pociągnięć na nieutworzonej warstwie. Ale już na częściach, na których to działa, zaoszczędzi nam to dużo czasu!
Witam, kiedy muszę zaznaczyć linie na końcach, używam narzędzia w Mycadtools o nazwie "MarkFoldLines".
Generuje pożądany kształt na końcu linii zagięcia. (w tym przypadku trójkąt o średnicy 1 mm, ale bardzo dobrze możemy umieścić linię lub inną. Ta ścieżka to blok, więc musimy zobaczyć, czy w opcjach możemy powiedzieć, że bloki są żółte.