ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/InterAreteFace.vb
(Generate patch)

Comparing magicsld/InterAreteFace.vb (file contents):
Revision 129 by bournival, Mon Aug 20 21:30:28 2007 UTC vs.
Revision 130 by bournival, Wed Jul 30 21:26:03 2008 UTC

# Line 1 | Line 1
1 + Imports SolidWorks.Interop
2 + Imports SolidWorks.Interop.swconst
3 + Imports SolidWorks.Interop.swpublished
4 +
5   Public MustInherit Class InterAreteFace
6      Inherits SuperIntersection
7  
# Line 9 | Line 13 | Public MustInherit Class InterAreteFace
13      Public x As Double ' la coordonnée x de l'intersection
14      Public y As Double
15      Public z As Double
16 +
17 +    Public sFaceVolume As SlyFaceVolume
18 +    Private BodySweep As sldworks.Body2
19 +
20 +
21 +    Public Sub DecouperLong()
22 +        ' on peut avoir une liste de poutres...
23 +        'For Each poutre As SlyAretePoutre In Me.lst_sPoutre
24 +        Dim poutre As SlyAretePoutre = Me.lst_sPoutre.Item(1)
25 +
26 +        Dim PetitSketch As sldworks.Sketch = Nothing
27 +        Dim swSketchManager As sldworks.SketchManager = swModel.SketchManager
28 +        Dim sfaceVol As SlyFaceVolume   ' la face du volume
29 +        Dim swfaceVol As sldworks.Face2
30 +
31 +        Dim segment As sldworks.Entity = poutre.swArete
32 +
33 +        swModel.ClearSelection()
34 +        If swModel.GetActiveSketch2() IsNot Nothing Then MsgBox("Déjà un sketch d'actif???")
35 +        swModel.Insert3DSketch2(False)
36 +        segment.Select4(False, Nothing)
37 +        swSketchManager.SketchUseEdge(False)
38 +        swModel.Insert3DSketch2(False)
39 +        swModel.EditRebuild3()
40 +
41 +        Dim feat As sldworks.Feature = swModel.FeatureByPositionReverse(0)
42 +        If Not feat.GetTypeName() = "3DProfileFeature" Then MsgBox("Problème ici")
43 +        PetitSketch = feat.GetSpecificFeature2() ' devrait être un sketch
44 +
45 +        ' 1 - créer le sweep à partir du sketch
46 +        Me.GénérerSweep(PetitSketch) ' hahahaha on réutilise la sub !!
47 +
48 +        ' sélectionner toutes les faces du sweep avec un mark de 16
49 +        Dim swFaceSweep As sldworks.Face2 = Me.BodySweep.GetFirstFace()
50 +        Dim swent As sldworks.Entity
51 +        Dim featmanager As sldworks.FeatureManager
52 +        Dim faces() As sldworks.Face2
53 +
54 +
55 +        '  ***** Découpage du volume****
56 +        swModel.EditRebuild3()
57 +        featmanager = swModel.FeatureManager
58 +        feat = Nothing
59 +        sfaceVol = Me.sFaceVolume
60 +        faces = sfaceVol.GetFaces
61 +
62 +
63 +        For q As Integer = 0 To UBound(faces)
64 +            swfaceVol = faces(q)
65 +            ' merde, on a 3 fois la même face??? vérifier que le for each marche bien et/ou que le .ToArray du faces est corect.
66 +            If swModel.ClosestDistance(swfaceVol, Me.BodySweep, Nothing, Nothing) < Epsilon Then
67 +
68 +                swModel.ClearSelection2(True)
69 +                Do While swFaceSweep IsNot Nothing  ' les faces coupantes (celles du sweep) ont un mark de 16
70 +                    swent = swFaceSweep : swent.Select2(True, 16)
71 +                    swFaceSweep = swFaceSweep.GetNextFace
72 +                Loop
73 +
74 +                swent = swfaceVol : swent.Select2(True, 32)
75 +                feat = featmanager.InsertSplitLineIntersect(7)
76 +                If feat IsNot Nothing Then Exit For
77 +
78 +            End If
79 +        Next
80 +
81 +        If feat Is Nothing Then
82 +            If swApp.SendMsgToUser2("Solidworks est incapable de découper la face du volume, entre " & Me.sFaceVolume.nom & " et " & Me.sFaceVolume.nom & vbCr & "  La géométrie est trop compliquée pour solidworks!", swconst.swMessageBoxIcon_e.swMbWarning, swconst.swMessageBoxBtn_e.swMbRetryCancel) = swconst.swMessageBoxResult_e.swMbHitCancel Then Exit Sub
83 +        End If
84 +
85 +        Me.BodySweep.HideBody(True)
86 +
87 +        ' ajout des nouvelles faces
88 +        Dim vfaces As Object = feat.GetFaces()
89 +        swModel.EditRebuild3()
90 +
91 +        For Each swfaceVol In vfaces  ' sélectionne les faces découpées.
92 +            If Not swfaceVol.GetBody Is Me.BodySweep Then
93 +                sfaceVol.AjouterFace(swfaceVol)
94 +                'là on a une connerie, la face originale n'est pas dans la liste des faces de vFaces
95 +                'et le pointeur original semble détruit
96 +                ' puisque ajouterface ne créé pas de doubles, on va chercher des faces que l'on mettra dans la liste
97 +                ' la grosse face en fera automatiquement partie.
98 +                Dim obj As Object = swfaceVol.GetEdges
99 +                Dim aretes As sldworks.Edge = obj(0)
100 +                Dim oBjfaces As Object = aretes.GetTwoAdjacentFaces2()
101 +                Dim NewFaces As sldworks.Face2 = oBjfaces(0)
102 +                sfaceVol.AjouterFace(NewFaces)
103 +                NewFaces = oBjfaces(1)
104 +                sfaceVol.AjouterFace(NewFaces)
105 +                aretes = obj(1)
106 +                NewFaces = oBjfaces(0)
107 +                sfaceVol.AjouterFace(NewFaces)
108 +                NewFaces = oBjfaces(1)
109 +                sfaceVol.AjouterFace(NewFaces)
110 +            End If
111 +        Next
112 +
113 +        ' il faut trouver les faces internes et les tagger comme des faces de coque(pour les mini-poutres orientées)
114 +
115 +        'Next poutre
116 +    End Sub
117 +
118 +    Public Sub GénérerSweep(Optional ByRef sketch As sldworks.Sketch = Nothing)
119 +        ' on peut essayer 2 méthodes, celle du offset des faces et celle du sweep d'un cercle
120 +        ' celle du offset ne marche pas dans toutes les circonstances...
121 +        Dim swEnt As SldWorks.Entity
122 +
123 +
124 +        ' 2- Placer un plan à l'extrémité
125 +        Dim Plan As SldWorks.RefPlane
126 +
127 +        Dim vSeg As Object 'SldWorks.SketchSegment
128 +        Dim seg As SldWorks.SketchSegment
129 +        Dim skPoint As SldWorks.SketchPoint = Nothing
130 +
131 +
132 +        vSeg = sketch.GetSketchSegments() : seg = vSeg(0)
133 +
134 +        Select Case seg.GetType ' faut faire attention, si le sketch est fermé, ça peut chier des taque pour séelectionner le point
135 +            Case SwConst.swSketchSegments_e.swSketchLINE
136 +                Dim skline As SldWorks.SketchLine = seg
137 +                skPoint = skline.GetStartPoint2()
138 +
139 +            Case SwConst.swSketchSegments_e.swSketchARC
140 +                Dim skarc As SldWorks.SketchArc = seg
141 +                skPoint = skarc.GetStartPoint2()
142 +            Case SwConst.swSketchSegments_e.swSketchELLIPSE
143 +                Dim skellipse As SldWorks.SketchEllipse = seg
144 +                skPoint = skellipse.GetStartPoint2()
145 +                If skPoint Is Nothing Then
146 +                    ' couper l'ellipse
147 +                    MsgBox("On a pas de startpoint sur cette ellipse")
148 +                End If
149 +            Case SwConst.swSketchSegments_e.swSketchSPLINE
150 +                Dim skSpline As SldWorks.SketchSpline = seg
151 +                Dim vPoints As Object
152 +                vPoints = skSpline.GetPoints2()
153 +                skPoint = vPoints(0)
154 +            Case SwConst.swSketchSegments_e.swSketchPARABOLA
155 +                Dim skPara As SldWorks.SketchParabola = seg
156 +                skPoint = skPara.GetStartPoint2()
157 +            Case Else
158 +                MsgBox(" Là y'a un problème! (case else....)")
159 +        End Select
160 +
161 +        seg.Select4(False, Nothing)
162 +        skPoint.Select4(True, Nothing)
163 +
164 +        Plan = swModel.CreatePlanePerCurveAndPassPoint3(True, False) ' le premier true met l'origine sur le point de la courbe, le second false est pour la visualisation.
165 +
166 +        ' 3 - on créé un cercle sur le plan
167 +        Dim rayon As Double
168 +        Dim sface As SlyFaceVolume = Me.sFaceVolume
169 +        Dim feat As SldWorks.Feature
170 +        Dim sketchCercle As SldWorks.Sketch
171 +        Dim poutre As SlyAretePoutre
172 +
173 +        rayon = Commun.ENG * Math.Sqrt(3) / 2 ' la bonne distance pour le maillage  :-)
174 +        swEnt = Plan : swEnt.Select4(False, Nothing)
175 +
176 +        swModel.InsertSketch2(False)
177 +        swModel.CreateCircle2(rayon / 2, 0, 0, 0, 0, 0)
178 +        swModel.InsertSketch2(True)
179 +
180 +        feat = swModel.FeatureByPositionReverse(0)
181 +        sketchCercle = feat.GetSpecificFeature2()
182 +
183 +        ' 4 - Sweep
184 +        Dim swFeatManager As SldWorks.FeatureManager = swModel.FeatureManager
185 +
186 +        Dim merge As Boolean = False
187 +
188 +        swEnt = sketchCercle : swEnt.Select2(False, 1)
189 +        swEnt = sketch : swEnt.Select2(True, 4)
190 +
191 +        feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 1, 1, False, 0, 0, 0, 0, merge, 1, 1, 0, 1) ' merge fait additionner le bnouveau corps...  Pas certain du false qui suit.
192 +
193 +        If feat Is Nothing Then
194 +            swEnt = sketchCercle : swEnt.Select2(False, 1)
195 +            swEnt = sketch : swEnt.Select2(True, 4)
196 +            feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 0, 0, False, 0, 0, 0, 0, 0, 1, 1, 0, 1)
197 +        End If
198 +
199 +        If feat Is Nothing Then
200 +            ' il est possible que la coque soit une spline
201 +            MsgBox("Il est impossible de découper la forme de la courbe, la coque est trop repliée sur elle-même..." & vbCr & "Un rayon de courbure de la section de la coque est inférieur à l'épaisseur de la coque", MsgBoxStyle.Information, "Impossible de découper à un endroit!")
202 +            ' on pourrait éventuellement appliquer une autre méthode.
203 +            Exit Sub
204 +        End If
205 +
206 +        Dim vfaces As Object = feat.GetFaces
207 +        Dim swface As SldWorks.Face2 = vfaces(0)
208 +        Me.BodySweep = swface.GetBody
209 +
210 +
211 +        If Me.BodySweep Is Nothing Then MsgBox(feat.Name)
212 +
213 +    End Sub
214 +
215   End Class

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines