ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/InterPoutreVolume.vb
Revision: 130
Committed: Wed Jul 30 21:26:03 2008 UTC (16 years, 9 months ago) by bournival
File size: 10475 byte(s)
Log Message:
Une mise à jour, car on aura peut-être besoin de mon code.

File Contents

# Content
1 Imports SolidWorks.Interop
2 Imports SolidWorks.Interop.swconst
3 Imports SolidWorks.Interop.swpublished
4
5 Public Class InterPoutreVolume
6 Inherits InterAreteFace
7
8 'Public sFaceVolume As SlyFaceVolume
9 'Private BodySweep As sldworks.Body2
10
11
12 ''' <summary>
13 ''' Sub qui prend les intersections entre les faces et les volumes et qui coupe les volumes
14 ''' </summary>
15 ''' <remarks></remarks>
16 Private Sub DecouperPoutreVolume()
17 ' #2 on procède au découpage de la face
18 Dim sVol As SlyFaceVolume
19
20 For Each sVol In lst_FaceVolume
21 If sVol.lst_InterPoutre.Count > 0 Then
22 sVol.decouper()
23
24 ' on met-a-jour l'attribut des conditions aux limites
25 Dim attr As SldWorks.Attribute
26 Dim swent As SldWorks.Entity
27 Dim nom3 As String = Nothing
28 Dim p As SldWorks.Parameter
29 If Not sVol.AttributCL Is Nothing Then
30 nom3 = "CL_" & sVol.nom
31 swent = sVol.SwFace
32 attr = swent.FindAttribute(Intersections.DefAttrConditionLimite, 0) ' si l'attribut existe déjà on pointe dessus.
33
34 If attr Is Nothing Then attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, sVol.SwFace, nom3, 0, 0)
35 p = attr.GetParameter("CL")
36 p.SetStringValue(sVol.condition)
37
38 End If
39 GererDossiers("Conditions Aux Limites", nom3)
40 End If
41
42 Next
43 End Sub
44
45
46 'Public Sub DecouperLong()
47 ' ' on peut avoir une liste de poutres...
48 ' 'For Each poutre As SlyAretePoutre In Me.lst_sPoutre
49 ' Dim poutre As SlyAretePoutre = Me.lst_sPoutre.Item(1)
50
51 ' Dim PetitSketch As sldworks.Sketch = Nothing
52 ' Dim swSketchManager As sldworks.SketchManager = swModel.SketchManager
53 ' Dim sfaceVol As SlyFaceVolume ' la face du volume
54 ' Dim swfaceVol As sldworks.Face2
55
56 ' Dim segment As sldworks.Entity = poutre.swArete
57
58 ' swModel.ClearSelection()
59 ' If swModel.GetActiveSketch2() IsNot Nothing Then MsgBox("Déjà un sketch d'actif???")
60 ' swModel.Insert3DSketch2(False)
61 ' segment.Select4(False, Nothing)
62 ' swSketchManager.SketchUseEdge(False)
63 ' swModel.Insert3DSketch2(False)
64 ' swModel.EditRebuild3()
65
66 ' Dim feat As sldworks.Feature = swModel.FeatureByPositionReverse(0)
67 ' If Not feat.GetTypeName() = "3DProfileFeature" Then MsgBox("Problème ici")
68 ' PetitSketch = feat.GetSpecificFeature2() ' devrait être un sketch
69
70 ' ' 1 - créer le sweep à partir du sketch
71 ' Me.GénérerSweep(PetitSketch) ' hahahaha on réutilise la sub !!
72
73 ' ' sélectionner toutes les faces du sweep avec un mark de 16
74 ' Dim swFaceSweep As sldworks.Face2 = Me.BodySweep.GetFirstFace()
75 ' Dim swent As sldworks.Entity
76 ' Dim featmanager As sldworks.FeatureManager
77 ' Dim faces() As sldworks.Face2
78
79
80 ' ' ***** Découpage du volume****
81 ' swModel.EditRebuild3()
82 ' featmanager = swModel.FeatureManager
83 ' feat = Nothing
84 ' sfaceVol = Me.sFaceVolume
85 ' faces = sfaceVol.GetFaces
86
87
88 ' For q As Integer = 0 To UBound(faces)
89 ' swfaceVol = faces(q)
90 ' ' 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.
91 ' If swModel.ClosestDistance(swfaceVol, Me.BodySweep, Nothing, Nothing) < Epsilon Then
92
93 ' swModel.ClearSelection2(True)
94 ' Do While swFaceSweep IsNot Nothing ' les faces coupantes (celles du sweep) ont un mark de 16
95 ' swent = swFaceSweep : swent.Select2(True, 16)
96 ' swFaceSweep = swFaceSweep.GetNextFace
97 ' Loop
98
99 ' swent = swfaceVol : swent.Select2(True, 32)
100 ' feat = featmanager.InsertSplitLineIntersect(7)
101 ' If feat IsNot Nothing Then Exit For
102
103 ' End If
104 ' Next
105
106 ' If feat Is Nothing Then
107 ' 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
108 ' End If
109
110 ' Me.BodySweep.HideBody(True)
111
112 ' ' ajout des nouvelles faces
113 ' Dim vfaces As Object = feat.GetFaces()
114 ' swModel.EditRebuild3()
115
116 ' For Each swfaceVol In vfaces ' sélectionne les faces découpées.
117 ' If Not swfaceVol.GetBody Is Me.BodySweep Then
118 ' sfaceVol.AjouterFace(swfaceVol)
119 ' 'là on a une connerie, la face originale n'est pas dans la liste des faces de vFaces
120 ' 'et le pointeur original semble détruit
121 ' ' puisque ajouterface ne créé pas de doubles, on va chercher des faces que l'on mettra dans la liste
122 ' ' la grosse face en fera automatiquement partie.
123 ' Dim obj As Object = swfaceVol.GetEdges
124 ' Dim aretes As sldworks.Edge = obj(0)
125 ' Dim oBjfaces As Object = aretes.GetTwoAdjacentFaces2()
126 ' Dim NewFaces As sldworks.Face2 = oBjfaces(0)
127 ' sfaceVol.AjouterFace(NewFaces)
128 ' NewFaces = oBjfaces(1)
129 ' sfaceVol.AjouterFace(NewFaces)
130 ' aretes = obj(1)
131 ' NewFaces = oBjfaces(0)
132 ' sfaceVol.AjouterFace(NewFaces)
133 ' NewFaces = oBjfaces(1)
134 ' sfaceVol.AjouterFace(NewFaces)
135 ' End If
136 ' Next
137
138 ' ' il faut trouver les faces internes et les tagger comme des faces de coque(pour les mini-poutres orientées)
139
140 ' 'Next poutre
141 'End Sub
142
143
144
145 'Public Sub GénérerSweep(Optional ByRef sketch As sldworks.Sketch = Nothing)
146 ' ' on peut essayer 2 méthodes, celle du offset des faces et celle du sweep d'un cercle
147 ' ' celle du offset ne marche pas dans toutes les circonstances...
148 ' Dim swEnt As SldWorks.Entity
149
150
151 ' ' 2- Placer un plan à l'extrémité
152 ' Dim Plan As SldWorks.RefPlane
153
154 ' Dim vSeg As Object 'SldWorks.SketchSegment
155 ' Dim seg As SldWorks.SketchSegment
156 ' Dim skPoint As SldWorks.SketchPoint = Nothing
157
158
159 ' vSeg = sketch.GetSketchSegments() : seg = vSeg(0)
160
161 ' Select Case seg.GetType ' faut faire attention, si le sketch est fermé, ça peut chier des taque pour séelectionner le point
162 ' Case SwConst.swSketchSegments_e.swSketchLINE
163 ' Dim skline As SldWorks.SketchLine = seg
164 ' skPoint = skline.GetStartPoint2()
165
166 ' Case SwConst.swSketchSegments_e.swSketchARC
167 ' Dim skarc As SldWorks.SketchArc = seg
168 ' skPoint = skarc.GetStartPoint2()
169 ' Case SwConst.swSketchSegments_e.swSketchELLIPSE
170 ' Dim skellipse As SldWorks.SketchEllipse = seg
171 ' skPoint = skellipse.GetStartPoint2()
172 ' If skPoint Is Nothing Then
173 ' ' couper l'ellipse
174 ' MsgBox("On a pas de startpoint sur cette ellipse")
175 ' End If
176 ' Case SwConst.swSketchSegments_e.swSketchSPLINE
177 ' Dim skSpline As SldWorks.SketchSpline = seg
178 ' Dim vPoints As Object
179 ' vPoints = skSpline.GetPoints2()
180 ' skPoint = vPoints(0)
181 ' Case SwConst.swSketchSegments_e.swSketchPARABOLA
182 ' Dim skPara As SldWorks.SketchParabola = seg
183 ' skPoint = skPara.GetStartPoint2()
184 ' Case Else
185 ' MsgBox(" Là y'a un problème! (case else....)")
186 ' End Select
187
188 ' seg.Select4(False, Nothing)
189 ' skPoint.Select4(True, Nothing)
190
191 ' Plan = swModel.CreatePlanePerCurveAndPassPoint3(True, False) ' le premier true met l'origine sur le point de la courbe, le second false est pour la visualisation.
192
193 ' ' 3 - on créé un cercle sur le plan
194 ' Dim rayon As Double
195 ' Dim sface As SlyFaceVolume = Me.sFaceVolume
196 ' Dim feat As SldWorks.Feature
197 ' Dim sketchCercle As SldWorks.Sketch
198 ' Dim poutre As SlyAretePoutre
199
200 ' rayon = Commun.ENG * Math.Sqrt(3) / 2 ' la bonne distance pour le maillage :-)
201 ' swEnt = Plan : swEnt.Select4(False, Nothing)
202
203 ' swModel.InsertSketch2(False)
204 ' swModel.CreateCircle2(rayon / 2, 0, 0, 0, 0, 0)
205 ' swModel.InsertSketch2(True)
206
207 ' feat = swModel.FeatureByPositionReverse(0)
208 ' sketchCercle = feat.GetSpecificFeature2()
209
210 ' ' 4 - Sweep
211 ' Dim swFeatManager As SldWorks.FeatureManager = swModel.FeatureManager
212
213 ' Dim merge As Boolean = False
214
215 ' swEnt = sketchCercle : swEnt.Select2(False, 1)
216 ' swEnt = sketch : swEnt.Select2(True, 4)
217
218 ' 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.
219
220 ' If feat Is Nothing Then
221 ' swEnt = sketchCercle : swEnt.Select2(False, 1)
222 ' swEnt = sketch : swEnt.Select2(True, 4)
223 ' feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 0, 0, False, 0, 0, 0, 0, 0, 1, 1, 0, 1)
224 ' End If
225
226 ' If feat Is Nothing Then
227 ' ' il est possible que la coque soit une spline
228 ' 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!")
229 ' ' on pourrait éventuellement appliquer une autre méthode.
230 ' Exit Sub
231 ' End If
232
233 ' Dim vfaces As Object = feat.GetFaces
234 ' Dim swface As SldWorks.Face2 = vfaces(0)
235 ' Me.BodySweep = swface.GetBody
236
237
238 ' If Me.BodySweep Is Nothing Then MsgBox(feat.Name)
239
240 'End Sub
241
242
243 Public Sub New()
244
245 End Sub
246 End Class