1 |
bournival |
48 |
Imports SolidWorks.Interop
|
2 |
|
|
Imports SolidWorks.Interop.swconst
|
3 |
|
|
Imports SolidWorks.Interop.swpublished
|
4 |
|
|
|
5 |
bournival |
40 |
Public Class SlyFaceCoque
|
6 |
|
|
Inherits SuperFace
|
7 |
|
|
|
8 |
|
|
|
9 |
bournival |
46 |
Private epaisseur As Double
|
10 |
bournival |
40 |
Public materiau As Long
|
11 |
|
|
Public swAttribute As SldWorks.Attribute ' l'attribut qui contient l'épaisseur. et le matériau
|
12 |
|
|
|
13 |
|
|
Private FlagFace_de_section As Integer = 99
|
14 |
|
|
|
15 |
|
|
Sub New(ByRef swface As SldWorks.Face2)
|
16 |
|
|
MyBase.New(swface, 1) ' 1 car c'est une coque
|
17 |
|
|
End Sub
|
18 |
|
|
|
19 |
|
|
Protected Overrides Sub Finalize()
|
20 |
|
|
Me.lst_Faces.Clear()
|
21 |
|
|
Me.lst_InterPoutre.Clear()
|
22 |
|
|
Me.lst_InterCoqueVolume.Clear()
|
23 |
|
|
MyBase.Finalize()
|
24 |
|
|
End Sub
|
25 |
|
|
|
26 |
|
|
|
27 |
bournival |
130 |
Public Overrides Sub decouper()
|
28 |
|
|
|
29 |
|
|
If lst_InterPoutre.Count = 0 Then Exit Sub ' sortir si on a pas d'intersection
|
30 |
|
|
|
31 |
|
|
|
32 |
|
|
' les attributs ne sont pas updatés sur les faces (mais sur les arètes et les sommets c'est OK)
|
33 |
|
|
' on mémorise l'attribut de la face et on la réapplique à la fin.
|
34 |
|
|
|
35 |
|
|
|
36 |
|
|
Dim i As Integer
|
37 |
|
|
Dim inter As InterPoutreCoque
|
38 |
|
|
Dim nb1 As Integer, nb2 As Integer, nb3 As Integer, nb5 As Integer
|
39 |
|
|
Dim poutre1 As SlyAretePoutre = Nothing, poutre3 As SlyAretePoutre = Nothing
|
40 |
|
|
Dim lst_poutre2 As New Collection
|
41 |
|
|
Dim aire As Double
|
42 |
|
|
Dim poutreTest As SlyAretePoutre
|
43 |
|
|
|
44 |
|
|
Dim lst_coupeXinter As New Collection
|
45 |
|
|
Dim lst_coupeXPoutre As New Collection
|
46 |
|
|
Dim lst_coupeLinter As New Collections.Generic.List(Of InterPoutreCoque)
|
47 |
|
|
Dim lst_coupeLPoutre As New Collection
|
48 |
|
|
Dim lst_coupeCinter As New Collection
|
49 |
|
|
Dim lst_coupeCPoutre As New Collection
|
50 |
|
|
|
51 |
|
|
|
52 |
|
|
For Each inter In lst_InterPoutre
|
53 |
|
|
'MsgBox("On découpe l'intersection # " & inter.Numero)
|
54 |
|
|
'pour chaque intersection on peut avoir plusieurs poutres...
|
55 |
|
|
For i = 1 To inter.lst_sPoutre.Count
|
56 |
|
|
poutreTest = inter.lst_sPoutre.Item(i)
|
57 |
|
|
Select Case CInt(inter.lst_type.Item(i))
|
58 |
|
|
Case 1
|
59 |
|
|
If poutreTest.GetAireCarree > aire Then poutre1 = poutreTest
|
60 |
|
|
nb1 += 1
|
61 |
|
|
Case 2
|
62 |
|
|
lst_poutre2.Add(poutreTest)
|
63 |
|
|
nb2 += 1
|
64 |
|
|
Case 3
|
65 |
|
|
If poutreTest.GetAireCarree > aire Then poutre3 = poutreTest
|
66 |
|
|
nb3 += 1
|
67 |
|
|
Case 5 ' un poutre à faceDeSection
|
68 |
|
|
nb5 += 1
|
69 |
|
|
Case 6
|
70 |
|
|
MsgBox("Une extrémité de la poutre est avec un «Guide» alors que l'autre coté ne l'est pas. Ceci n'est pas programmé...")
|
71 |
|
|
|
72 |
|
|
Case 22
|
73 |
|
|
' on fait rien, mais c'est pour éviter le msgbox du case else...
|
74 |
|
|
Case Else
|
75 |
|
|
MsgBox("Problème dans découper de SlyFaceCoque, le type d'intersection n'est pas reconnu", MsgBoxStyle.Critical)
|
76 |
|
|
End Select
|
77 |
|
|
Next i
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
|
81 |
|
|
If nb1 > 0 Then 'CoupeX(inter, poutre1) ' on coupe le x en premier
|
82 |
|
|
lst_coupeXinter.Add(inter)
|
83 |
|
|
lst_coupeXPoutre.Add(poutre1)
|
84 |
|
|
End If
|
85 |
|
|
|
86 |
|
|
|
87 |
|
|
For Each poutreTest In lst_poutre2 ' puis on coupe sur la longueur 'CoupeLong(inter, poutreTest)
|
88 |
|
|
lst_coupeLinter.Add(inter)
|
89 |
|
|
lst_coupeLPoutre.Add(poutreTest)
|
90 |
|
|
Next
|
91 |
|
|
|
92 |
|
|
If nb3 > 0 Then 'CoupeCote(inter, poutre3) ' finalement on coupe sur les cotés
|
93 |
|
|
lst_coupeCinter.Add(inter)
|
94 |
|
|
lst_coupeCPoutre.Add(poutre3)
|
95 |
|
|
End If
|
96 |
|
|
|
97 |
|
|
If nb5 = 1 And (nb1 > 0 Or nb2 > 0 Or nb3 > 0) Then
|
98 |
|
|
MsgBox("Problème, on a un type d'intersection impossible dans la vraie vie!", MsgBoxStyle.Exclamation, "Design impossible à obtenir en réalité...")
|
99 |
|
|
End If
|
100 |
|
|
|
101 |
|
|
|
102 |
|
|
lst_poutre2.Clear()
|
103 |
|
|
nb1 = 0 : nb2 = 0 : nb3 = 0
|
104 |
|
|
|
105 |
|
|
|
106 |
|
|
Next inter
|
107 |
|
|
|
108 |
|
|
|
109 |
|
|
' maintenant on a toutes les lists d'intersections. On les coupe.
|
110 |
|
|
For i = 1 To lst_coupeXinter.Count
|
111 |
|
|
CoupeX(lst_coupeXinter.Item(i), lst_coupeXPoutre.Item(i))
|
112 |
|
|
Next
|
113 |
|
|
|
114 |
|
|
For Each int As InterPoutreCoque In lst_coupeLinter ' i = 1 To lst_coupeLinter.Count
|
115 |
|
|
int.DecouperLong() 'CoupeLong(lst_coupeLinter.Item(i), lst_coupeLPoutre.Item(i))
|
116 |
|
|
Next
|
117 |
|
|
|
118 |
|
|
For i = 1 To lst_coupeCinter.Count
|
119 |
|
|
CoupeCote(lst_coupeCinter.Item(i), lst_coupeCPoutre.Item(i))
|
120 |
|
|
Next
|
121 |
|
|
|
122 |
|
|
' ne devrait pas avoir ça avec une coque...
|
123 |
|
|
'If nb5 = 1 Then
|
124 |
|
|
' If lst_InterPoutre.Count <> 1 Then MsgBox("Plus d'une intersection du type FacedeSection....")
|
125 |
|
|
' CoupeFaceDeSection(lst_InterPoutre(1))
|
126 |
|
|
'End If
|
127 |
|
|
|
128 |
|
|
End Sub
|
129 |
|
|
|
130 |
|
|
|
131 |
|
|
' sub qui découpe les bords de la face.
|
132 |
|
|
Friend Sub CoupeCote(ByRef inter As InterPoutreCoque, ByRef poutre As SlyAretePoutre)
|
133 |
|
|
Dim pt3() As Double, pt3Original() As Double
|
134 |
|
|
Dim base(2) As Double, baseOriginal(2) As Double
|
135 |
|
|
Dim swEnt As sldworks.Entity
|
136 |
|
|
Dim Directionnel As Boolean, Flip As Boolean
|
137 |
|
|
Dim planReference As sldworks.RefPlane = Nothing
|
138 |
|
|
Dim sketchline As sldworks.SketchSegment
|
139 |
|
|
Dim swSketch As sldworks.Sketch
|
140 |
|
|
Dim DemiLargeur As Double
|
141 |
|
|
Dim g As Integer
|
142 |
|
|
Dim Face(1) As sldworks.Face2
|
143 |
|
|
Dim PlanEntity As sldworks.Entity = Nothing
|
144 |
|
|
Dim r(2) As Double
|
145 |
|
|
Dim sk(1) As Double
|
146 |
|
|
pt3Original = poutre.GetPoint3
|
147 |
|
|
|
148 |
|
|
|
149 |
|
|
swModel.SetInferenceMode(False) ' ne pas mettre de contraintes par défaut
|
150 |
|
|
'swModel.SetAddToDB(True)
|
151 |
|
|
'swModel.SetDisplayWhenAdded(False) ' accélérer les performances
|
152 |
|
|
|
153 |
|
|
Dim vArete As Object
|
154 |
|
|
Dim cut As Double
|
155 |
|
|
|
156 |
|
|
If Me.estPlan Then
|
157 |
|
|
' la coque est plane, on met une esquisse dessus.#
|
158 |
|
|
PlanEntity = Me.SwFace
|
159 |
bournival |
205 |
swEnt = PlanEntity
|
160 |
|
|
swEnt.Select2(False, 0)
|
161 |
|
|
planReference = swModel.CreatePlaneAtOffset3(0, False, True)
|
162 |
bournival |
130 |
|
163 |
|
|
ElseIf Me.estCylindre Then
|
164 |
|
|
' on doit créer un plan de référence...
|
165 |
|
|
|
166 |
|
|
ElseIf Me.estFauxPlan(inter.x, inter.y, inter.z) Then
|
167 |
|
|
Dim vEdge As Object
|
168 |
|
|
Dim i As Integer
|
169 |
|
|
Dim swArete2() As sldworks.Edge
|
170 |
|
|
Dim swSommet As sldworks.Vertex
|
171 |
|
|
|
172 |
|
|
vEdge = Me.SwFace.GetEdges
|
173 |
|
|
swArete2 = vEdge
|
174 |
|
|
swModel.ClearSelection2(True)
|
175 |
|
|
|
176 |
|
|
While planReference Is Nothing
|
177 |
|
|
If UBound(swArete2) - 2 < i Then MsgBox("Dans CoupeLong, problème pour créer un plan avec 3 points. (La face est un FauxPlan)", MsgBoxStyle.Critical, "Le plan ne sera pas créé") : Exit While
|
178 |
|
|
swSommet = swArete2(i).GetStartVertex()
|
179 |
|
|
swEnt = swSommet
|
180 |
|
|
swEnt.Select4(False, Nothing)
|
181 |
|
|
swArete2(i + 1).GetStartVertex()
|
182 |
|
|
swEnt = swSommet
|
183 |
|
|
swEnt.Select4(True, Nothing)
|
184 |
|
|
swArete2(i + 2).GetStartVertex()
|
185 |
|
|
swEnt = swSommet
|
186 |
|
|
swEnt.Select4(True, Nothing)
|
187 |
|
|
i += 1
|
188 |
|
|
planReference = swModel.CreatePlaneThru3Points3(False)
|
189 |
|
|
PlanEntity = planReference
|
190 |
|
|
End While
|
191 |
|
|
|
192 |
|
|
|
193 |
|
|
Else ' la face est une spline
|
194 |
|
|
MsgBox("Dans coupeCoté, la face est un type de surface qui n'est pas encore traité")
|
195 |
|
|
End If
|
196 |
|
|
|
197 |
|
|
|
198 |
|
|
baseOriginal(0) = inter.x : baseOriginal(1) = inter.y : baseOriginal(2) = inter.z
|
199 |
|
|
|
200 |
|
|
|
201 |
|
|
Dim Psi As Double
|
202 |
|
|
Dim u(2) As Double, v(2) As Double, usketch(2) As Double, vsketch(2) As Double
|
203 |
|
|
Dim Arete As sldworks.Edge = Nothing
|
204 |
|
|
Dim retval As Object
|
205 |
|
|
u = poutre.GetOrientation(inter.x, inter.y, inter.z)
|
206 |
|
|
|
207 |
|
|
|
208 |
|
|
vArete = Me.SwFace.GetEdges
|
209 |
|
|
|
210 |
|
|
For Each Arete In vArete
|
211 |
|
|
If Commun.Distance(Arete, inter.x, inter.y, inter.z) < Epsilon Then Exit For
|
212 |
|
|
Next
|
213 |
|
|
|
214 |
|
|
retval = Arete.GetClosestPointOn(inter.x, inter.y, inter.z)
|
215 |
bournival |
205 |
Dim t As Double = retval(3)
|
216 |
|
|
retval = Arete.Evaluate(t)
|
217 |
bournival |
130 |
|
218 |
bournival |
205 |
If t > 0 Then ' ??????? solidworks inverse les valeurs dans des cas que je ne peut identifier.
|
219 |
|
|
v(0) = retval(3) : v(1) = retval(4) : v(2) = retval(5)
|
220 |
|
|
Else
|
221 |
|
|
v(0) = retval(4) : v(1) = -retval(3) : v(2) = retval(5)
|
222 |
|
|
End If
|
223 |
bournival |
130 |
|
224 |
|
|
|
225 |
|
|
|
226 |
|
|
For g = 0 To 1
|
227 |
|
|
|
228 |
|
|
PlanEntity.Select(False)
|
229 |
|
|
swModel.InsertSketch2(True)
|
230 |
|
|
swSketch = swModel.GetActiveSketch2
|
231 |
|
|
|
232 |
|
|
pt3 = Commun.TransfertModelSketch(swSketch, pt3Original)
|
233 |
|
|
usketch = Commun.TransfertModelSketch(swSketch, u) ' on les met dans le plan du sketch
|
234 |
|
|
vsketch = Commun.TransfertModelSketch(swSketch, v)
|
235 |
|
|
base = Commun.TransfertModelSketch(swSketch, baseOriginal)
|
236 |
|
|
Psi = Outils_Math.cosdir(usketch, vsketch)
|
237 |
|
|
|
238 |
|
|
Dim a As Double, b As Double
|
239 |
|
|
'longueur = Math.Sqrt(pt3(0) * pt3(0) + pt3(1) * pt3(1))
|
240 |
|
|
'If pt3(1) = 0 Then a = 999999999999 Else a = Math.Abs(poutre.GetD2() * longueur / pt3(1))
|
241 |
|
|
'If pt3(0) = 0 Then b = 999999999999 Else b = Math.Abs(poutre.GetD1() * longueur / pt3(0))
|
242 |
|
|
' À revoir. Si le plan est un cylindre ça marche plus. sans compter l'épaisseur de la poutre.
|
243 |
|
|
' pour l'instant je prend la plus prtite valeur...
|
244 |
|
|
a = poutre.GetD1
|
245 |
|
|
b = poutre.GetD2
|
246 |
|
|
DemiLargeur = Math.Min(a, b)
|
247 |
|
|
cut = DemiLargeur / Math.Sin(Pi / 2 - Psi)
|
248 |
|
|
|
249 |
|
|
|
250 |
|
|
Dim P1(1) As Double
|
251 |
|
|
Dim P2(1) As Double
|
252 |
|
|
Dim P3(1) As Double
|
253 |
|
|
Dim P4(1) As Double
|
254 |
|
|
Dim Ptest(2) As Double
|
255 |
bournival |
205 |
Dim Ptest2(2) As Double : Ptest2(0) = 0.5 : Ptest2(1) = 0
|
256 |
|
|
Dim Ptest3(2) As Double : Ptest3(0) = 0 : Ptest3(1) = 0.75
|
257 |
|
|
Dim Ptest4(2) As Double : Ptest4(0) = 1.5 : Ptest4(1) = 0
|
258 |
|
|
Dim Ptest5(2) As Double : Ptest5(0) = 0 : Ptest5(1) = 2
|
259 |
bournival |
130 |
|
260 |
|
|
|
261 |
|
|
If g = 0 Then
|
262 |
|
|
P1(0) = -cut
|
263 |
|
|
P1(1) = -cut '* mult ' 0
|
264 |
|
|
P2(0) = 0
|
265 |
|
|
P2(1) = -cut '* mult ' 0
|
266 |
|
|
P3(0) = 0
|
267 |
|
|
P3(1) = cut 'Intersections.Taille mult
|
268 |
|
|
P4(0) = -cut
|
269 |
|
|
P4(1) = cut 'Intersections.Taille mult
|
270 |
bournival |
205 |
'sk(0) = -Epsilon * 100 + base(0) : sk(1) = 0 + base(1)
|
271 |
|
|
sk(0) = -Epsilon * 100 : sk(1) = 0
|
272 |
bournival |
130 |
|
273 |
|
|
Else
|
274 |
|
|
P1(0) = 0
|
275 |
|
|
P1(1) = -cut '* mult '0
|
276 |
|
|
P2(0) = +cut
|
277 |
|
|
P2(1) = -cut '* mult '0
|
278 |
|
|
P3(0) = +cut
|
279 |
|
|
P3(1) = cut 'Intersections.Taille mult
|
280 |
|
|
P4(0) = 0
|
281 |
|
|
P4(1) = cut 'Intersections.Taille mult
|
282 |
bournival |
205 |
'sk(0) = Epsilon * 100 + base(0) : sk(1) = 0 + base(1)
|
283 |
|
|
sk(0) = Epsilon * 100 : sk(1) = 0
|
284 |
bournival |
130 |
End If
|
285 |
|
|
|
286 |
|
|
P1 = Outils_Math.Rotation2D(vsketch, P1)
|
287 |
|
|
P2 = Outils_Math.Rotation2D(vsketch, P2)
|
288 |
|
|
P3 = Outils_Math.Rotation2D(vsketch, P3)
|
289 |
|
|
P4 = Outils_Math.Rotation2D(vsketch, P4)
|
290 |
|
|
sk = Outils_Math.Rotation2D(vsketch, sk)
|
291 |
bournival |
205 |
Ptest4 = Outils_Math.Rotation2D(vsketch, Ptest4)
|
292 |
|
|
Ptest5 = Outils_Math.Rotation2D(vsketch, Ptest5)
|
293 |
bournival |
130 |
|
294 |
bournival |
205 |
sk(0) += base(0)
|
295 |
|
|
sk(1) += base(1)
|
296 |
|
|
|
297 |
|
|
Ptest(0) += base(0)
|
298 |
|
|
Ptest(1) += base(1)
|
299 |
|
|
|
300 |
|
|
swModel.CreatePoint2(Ptest(0), Ptest(1), 0)
|
301 |
|
|
|
302 |
|
|
sketchline = swModel.CreateLine2(base(0), base(1), 0, Ptest2(0) + base(0), Ptest2(1) + base(1), 0) : sketchline.ConstructionGeometry = True
|
303 |
|
|
sketchline = swModel.CreateLine2(base(0), base(1), 0, Ptest3(0) + base(0), Ptest3(1) + base(1), 0) : sketchline.ConstructionGeometry = True
|
304 |
|
|
sketchline = swModel.CreateLine2(base(0), base(1), 0, Ptest4(0) + base(0), Ptest4(1) + base(1), 0) : sketchline.ConstructionGeometry = True
|
305 |
|
|
sketchline = swModel.CreateLine2(base(0), base(1), 0, Ptest5(0) + base(0), Ptest5(1) + base(1), 0) : sketchline.ConstructionGeometry = True
|
306 |
|
|
sketchline = swModel.CreateLine2(base(0), base(1), 0, vsketch(0) + base(0), vsketch(1) + base(1), 0) : sketchline.ConstructionGeometry = True
|
307 |
|
|
|
308 |
bournival |
130 |
sketchline = swModel.CreateLine2(P1(0) + base(0), P1(1) + base(1), 0, P2(0) + base(0), P2(1) + base(1), 0)
|
309 |
|
|
sketchline = swModel.CreateLine2(P2(0) + base(0), P2(1) + base(1), 0, P3(0) + base(0), P3(1) + base(1), 0)
|
310 |
|
|
sketchline = swModel.CreateLine2(P3(0) + base(0), P3(1) + base(1), 0, P4(0) + base(0), P4(1) + base(1), 0)
|
311 |
|
|
sketchline = swModel.CreateLine2(P1(0) + base(0), P1(1) + base(1), 0, P4(0) + base(0), P4(1) + base(1), 0)
|
312 |
|
|
|
313 |
bournival |
205 |
|
314 |
|
|
|
315 |
bournival |
130 |
swModel.InsertSketch2(True) ' l'option true rebuild le modèle avec les modifications du sketch.
|
316 |
|
|
swModel.ClearSelection2(True)
|
317 |
|
|
'swEnt = Me.SwFace : swEnt.Select2(False, 1)
|
318 |
|
|
swEnt = swSketch : swEnt.Select2(False, 4)
|
319 |
|
|
Me.SelectionnerToutes(1, True)
|
320 |
|
|
|
321 |
|
|
swModel.InsertSplitLineProject(Directionnel, Flip)
|
322 |
|
|
r = Commun.TransfertSketchToModel(swSketch, sk)
|
323 |
bournival |
205 |
Face(g) = UpdateApresSplit(inter, poutre, r(0), r(1), r(2), planReference, , False)
|
324 |
bournival |
130 |
'If Face(g) Is Nothing Then
|
325 |
|
|
'swSketch.Select(False)
|
326 |
|
|
'swModel.EditDelete()
|
327 |
|
|
'End If
|
328 |
|
|
|
329 |
bournival |
205 |
|
330 |
bournival |
130 |
Next g
|
331 |
|
|
|
332 |
|
|
|
333 |
|
|
|
334 |
|
|
' mettre les mini-poutres
|
335 |
|
|
Dim vEdge2 As Object
|
336 |
|
|
Dim swArete As sldworks.Edge
|
337 |
|
|
Dim vPoint As Object
|
338 |
|
|
Dim Mini1 As sldworks.Edge = Nothing, Mini2 As sldworks.Edge = Nothing
|
339 |
|
|
|
340 |
|
|
|
341 |
|
|
' 1 - trouver les 2 arrères dont l'orientation est la même (ou l'inverse) que le v
|
342 |
|
|
For g = 0 To 1
|
343 |
|
|
If Not Face(g) Is Nothing Then
|
344 |
|
|
vEdge2 = Face(g).GetEdges()
|
345 |
|
|
|
346 |
|
|
|
347 |
|
|
' construire u
|
348 |
|
|
For Each swArete In vEdge2
|
349 |
|
|
If Commun.Distance(swArete, inter.x, inter.y, inter.z) < Epsilon Then
|
350 |
|
|
' l'arête touche à l'intersection,
|
351 |
|
|
vPoint = swArete.GetClosestPointOn(inter.x, inter.y, inter.z)
|
352 |
|
|
vPoint = swArete.Evaluate(vPoint(3))
|
353 |
|
|
u(0) = vPoint(3) : u(1) = vPoint(4) : u(2) = vPoint(5)
|
354 |
|
|
|
355 |
|
|
If Outils_Math.CompareSens(v, u) Then
|
356 |
|
|
' l'arète doit être une mini-poutre
|
357 |
|
|
If Mini1 Is Nothing Then Mini1 = swArete : Exit For Else Mini2 = swArete : Exit For
|
358 |
|
|
End If
|
359 |
|
|
End If
|
360 |
|
|
|
361 |
|
|
Next
|
362 |
|
|
|
363 |
|
|
End If
|
364 |
|
|
Next
|
365 |
|
|
|
366 |
|
|
swEnt = Mini1
|
367 |
|
|
If Not RealConstant.RCCode.CreationAttributPourPoutre(swEnt, "Mini", True) Then MsgBox("A pas marché!")
|
368 |
|
|
|
369 |
|
|
If Not Mini2 Is Nothing Then
|
370 |
|
|
swEnt = Mini2
|
371 |
|
|
If Not RealConstant.RCCode.CreationAttributPourPoutre(swEnt, "Mini", True) Then MsgBox("A pas marché!")
|
372 |
|
|
End If
|
373 |
|
|
|
374 |
|
|
swModel.SetInferenceMode(True) '
|
375 |
|
|
'swModel.SetAddToDB(False)
|
376 |
|
|
'swModel.SetDisplayWhenAdded(True) '
|
377 |
|
|
End Sub
|
378 |
|
|
|
379 |
|
|
|
380 |
|
|
|
381 |
bournival |
40 |
''' <summary>
|
382 |
|
|
''' sub qui CRÉÉ une instance de la classe InterPoutreCoque si et seulement si il n'en existe pas avant. S'il en existe alors on update la classe déjà existante.
|
383 |
|
|
''' </summary>
|
384 |
|
|
''' <param name="sPoutre">La SlyPoutre</param>
|
385 |
|
|
''' <param name="xyz1">Laposition du pount d'intersection</param>
|
386 |
|
|
''' <param name="tipe">=1 si on découpe en X, 2 si à l'intérieur, 3 si à l'extérieur</param>
|
387 |
|
|
''' <returns>La classe d'intersection</returns>
|
388 |
|
|
''' <remarks>dans tous les cas on retourne la classe (pour pouvoir l'ajouter à la poutre...)</remarks>
|
389 |
|
|
Public Function AjouterInterPoutre(ByRef sPoutre As SlyAretePoutre, ByRef xyz1() As Double, ByVal tipe As Byte) As InterPoutreCoque
|
390 |
|
|
|
391 |
|
|
Dim int As InterPoutreCoque
|
392 |
|
|
|
393 |
|
|
For Each int In lst_InterPoutre
|
394 |
|
|
If Math.Abs(int.x - xyz1(0)) < Epsilon And Math.Abs(int.y - xyz1(1)) < Epsilon And Math.Abs(int.z - xyz1(2)) < Epsilon Then
|
395 |
|
|
' on a un point déjà existant,
|
396 |
|
|
int.lst_sPoutre.Add(sPoutre)
|
397 |
|
|
int.lst_type.Add(tipe)
|
398 |
|
|
Return int
|
399 |
|
|
End If
|
400 |
|
|
Next
|
401 |
|
|
|
402 |
|
|
|
403 |
|
|
' si on est ici c'est que l'on doit créer l'intersection
|
404 |
|
|
int = New InterPoutreCoque
|
405 |
|
|
|
406 |
|
|
int.x = xyz1(0)
|
407 |
|
|
int.y = xyz1(1)
|
408 |
|
|
int.z = xyz1(2)
|
409 |
|
|
|
410 |
|
|
int.lst_sPoutre.Add(sPoutre)
|
411 |
|
|
int.lst_type.Add(tipe)
|
412 |
|
|
int.sFaceCoque = Me
|
413 |
|
|
lst_InterPoutre.Add(int)
|
414 |
|
|
Return int
|
415 |
|
|
|
416 |
|
|
End Function
|
417 |
|
|
|
418 |
|
|
|
419 |
|
|
|
420 |
bournival |
48 |
|
421 |
bournival |
40 |
Public Function PossedeFaceDeSection() As Boolean
|
422 |
|
|
|
423 |
|
|
If Not Me.FlagFace_de_section = 99 Then Return CBool(Me.FlagFace_de_section)
|
424 |
|
|
Dim retour As Double
|
425 |
|
|
|
426 |
|
|
Dim p As SldWorks.Parameter
|
427 |
|
|
Try
|
428 |
|
|
p = swAttribute.GetParameter("Flag")
|
429 |
|
|
Catch ex As Exception
|
430 |
bournival |
130 |
MsgBox("N'arrive pas à se lier à l'attribut pour obtenir l'épaissuer, la coque n'a peut-être pas d'attributs...")
|
431 |
bournival |
40 |
Return Nothing
|
432 |
|
|
End Try
|
433 |
|
|
|
434 |
|
|
retour = p.GetDoubleValue
|
435 |
|
|
Me.FlagFace_de_section = retour
|
436 |
|
|
If retour = 1 Then Return True Else Return False
|
437 |
|
|
|
438 |
|
|
End Function
|
439 |
|
|
|
440 |
|
|
|
441 |
bournival |
46 |
''' <summary>
|
442 |
|
|
''' Donne l'épaisseur de la coque
|
443 |
|
|
''' </summary>
|
444 |
bournival |
130 |
''' <value>La valeur de l'épaisseur ATTENTION: voir remarques</value>
|
445 |
|
|
''' <returns>L'épaisseur de la coque</returns>
|
446 |
|
|
''' <remarks>La propriété ne peut être un readonly à cause d'une petite exception, normalement on ne devrait pas setter l'épaisseur de la coque</remarks>
|
447 |
|
|
Public Property GetEpaisseur() As Double
|
448 |
bournival |
46 |
Get
|
449 |
bournival |
130 |
|
450 |
bournival |
46 |
If Not Me.epaisseur = 0 Then Return Me.epaisseur : Exit Property ' pour optimiser
|
451 |
bournival |
40 |
|
452 |
bournival |
130 |
Dim p As sldworks.Parameter
|
453 |
bournival |
40 |
|
454 |
bournival |
46 |
Try
|
455 |
|
|
p = swAttribute.GetParameter("Ep")
|
456 |
|
|
Catch ex As Exception
|
457 |
|
|
MsgBox("N'arrive pas à se lier à l'attribut pour obtenir l'épaisseur, la coque n'a peut-être pas d'attributs...")
|
458 |
|
|
Return 0
|
459 |
|
|
End Try
|
460 |
|
|
Me.epaisseur = p.GetDoubleValue
|
461 |
|
|
Return p.GetDoubleValue
|
462 |
bournival |
130 |
|
463 |
bournival |
46 |
End Get
|
464 |
bournival |
130 |
|
465 |
|
|
Set(ByVal value As Double)
|
466 |
|
|
Me.epaisseur = value
|
467 |
|
|
' faut aussi changer le paramètre de l'attribut
|
468 |
|
|
Dim p As sldworks.Parameter = Me.swAttribute.GetParameter("Ep")
|
469 |
|
|
p.SetDoubleValue(Me.epaisseur)
|
470 |
|
|
End Set
|
471 |
bournival |
46 |
End Property
|
472 |
bournival |
40 |
|
473 |
|
|
|
474 |
bournival |
46 |
|
475 |
bournival |
40 |
Public Function GetMateriau() As String
|
476 |
|
|
If Not Me.materiau Then Return Me.materiau : Exit Function ' pour optimiser
|
477 |
|
|
|
478 |
|
|
|
479 |
|
|
Dim p As SldWorks.Parameter = Nothing
|
480 |
|
|
|
481 |
|
|
Try
|
482 |
|
|
p = swAttribute.GetParameter("M")
|
483 |
|
|
Catch ex As Exception
|
484 |
|
|
MsgBox("N'arrive pas à se lier à l'attribut pour obtenir le matériau, la coque n'a peut-être pas d'attributs...")
|
485 |
|
|
End Try
|
486 |
|
|
Me.materiau = p.GetStringValue
|
487 |
|
|
Return p.GetStringValue
|
488 |
|
|
End Function
|
489 |
|
|
|
490 |
|
|
Public Function GetAttribute() As SldWorks.Attribute
|
491 |
|
|
Dim ent As SldWorks.Entity
|
492 |
|
|
Dim attr As SldWorks.Attribute = Nothing
|
493 |
|
|
|
494 |
|
|
Try
|
495 |
|
|
ent = lst_Faces.Item(1)
|
496 |
|
|
attr = ent.FindAttribute(Intersections.DefAttrRCCoque, 0)
|
497 |
|
|
Me.swAttribute = attr
|
498 |
|
|
Catch ex As Exception
|
499 |
|
|
MsgBox("ERREUR! Une coque sans attributs !", MsgBoxStyle.Critical)
|
500 |
|
|
End Try
|
501 |
|
|
If IsNothing(attr) Then ' on a trouvé un attribut de coque
|
502 |
|
|
MsgBox("Une coque sans attributs !")
|
503 |
|
|
End If
|
504 |
|
|
Return attr
|
505 |
|
|
End Function
|
506 |
|
|
|
507 |
|
|
Private Function PointInterne(ByRef P1() As Double, ByRef P2() As Double, ByRef centreX As Double, ByRef centreY As Double) As Double()
|
508 |
|
|
Dim b(1) As Double
|
509 |
|
|
Dim c(1) As Double
|
510 |
|
|
Dim d(1) As Double
|
511 |
|
|
b(0) = P1(0) - centreX
|
512 |
|
|
b(1) = P1(1) - centreY
|
513 |
|
|
c(0) = P1(0) - centreX
|
514 |
|
|
c(1) = P1(1) - centreY
|
515 |
|
|
|
516 |
|
|
b = Outils_Math.unitaire(b)
|
517 |
|
|
c = Outils_Math.unitaire(c)
|
518 |
|
|
|
519 |
|
|
d(0) = ((b(0) + c(0)) / 2) * 50 * Epsilon
|
520 |
|
|
d(1) = ((b(0) + c(0)) / 2) * 50 * Epsilon
|
521 |
|
|
|
522 |
|
|
Return d
|
523 |
|
|
|
524 |
|
|
End Function
|
525 |
|
|
|
526 |
|
|
' cette sub ajoute LES constantes de la coque aux nom de l'entité.
|
527 |
|
|
Public Sub AddConstantes()
|
528 |
|
|
' cette sub ajoute LES constantes de la coque aux nom de l'entité.
|
529 |
|
|
' on suppose qu'il n'y en a pas déjà
|
530 |
|
|
' tout ce que j'ai à faire c'est de modifier la propriété nom.
|
531 |
|
|
|
532 |
|
|
'Format(valeur, "0.00000e+000")
|
533 |
|
|
Dim epaisseur As Double
|
534 |
|
|
|
535 |
|
|
|
536 |
|
|
epaisseur = Me.GetEpaisseur()
|
537 |
|
|
If epaisseur <= 0 Then
|
538 |
|
|
MsgBox("Attention, une coque n'a pas d'épaisseur ou une épaisseur négative, celle-ci est affichée en rouge sur le modèle découpé. Une valeur de 1 a été utilisée par défaut")
|
539 |
|
|
epaisseur = 1
|
540 |
|
|
Dim ent As SldWorks.Entity
|
541 |
|
|
ent = Me.swFace : ent.Select4(False, Nothing)
|
542 |
|
|
swModel.SelectedFaceProperties(1, 0, 0, 0, 0, 0, 0, False, "")
|
543 |
|
|
End If
|
544 |
|
|
|
545 |
|
|
|
546 |
|
|
nom = nom & "¢" & Format(epaisseur, "0.00000e+000") & "MA" & Format(materiau, "00")
|
547 |
|
|
|
548 |
|
|
' attention, s'il y a une intersection, je dois la noter et l'ajouter au nom....
|
549 |
|
|
Dim c As Integer
|
550 |
|
|
For c = 1 To Len(nom)
|
551 |
|
|
If Mid(nom, c, 1) = "," Then Mid(nom, c, 1) = "."
|
552 |
|
|
Next c
|
553 |
|
|
End Sub
|
554 |
|
|
|
555 |
|
|
|
556 |
|
|
|
557 |
bournival |
205 |
Protected Function UpdateApresSplit(ByRef inter As InterPoutreCoque, ByRef poutre As SlyAretePoutre, ByRef x As Double, ByRef y As Double, ByRef z As Double, ByRef Plan As sldworks.RefPlane, Optional ByRef FI As Boolean = False, Optional ByVal ajouterMini As Boolean = False) As sldworks.Face2
|
558 |
bournival |
40 |
|
559 |
|
|
' le pointeur Me.swFace pointe soit sur une face, soit sur la face originale soit la face découpée
|
560 |
|
|
' cette procédure doit créer une nouvelle SlyFaceCoque
|
561 |
|
|
' et tout ce que j'ai c'est un pointeur, et je sais même pas lequel.
|
562 |
|
|
' la fonction ne créée pas de nouvelles slyEntités.
|
563 |
|
|
' si le découpage donne 3 faces ou plus, elles sont placées dans lst_AutreFaces
|
564 |
|
|
|
565 |
|
|
|
566 |
|
|
' 1 - on obtient les 2 nouvelles faces,
|
567 |
|
|
Dim vFace As Object
|
568 |
bournival |
205 |
Dim Face As sldworks.Face2 = Nothing
|
569 |
bournival |
130 |
Dim FaceInterne As sldworks.Face2
|
570 |
|
|
Dim swFeat As sldworks.Feature
|
571 |
bournival |
205 |
Dim swent As sldworks.Entity = Nothing
|
572 |
|
|
Dim swFaultEnt As sldworks.FaultEntity
|
573 |
bournival |
40 |
|
574 |
|
|
swFeat = swModel.FeatureByPositionReverse(0)
|
575 |
bournival |
205 |
Try
|
576 |
|
|
vFace = swFeat.GetFaces
|
577 |
|
|
For Each Face In vFace
|
578 |
|
|
Me.lst_Faces.Add(Face)
|
579 |
|
|
Next Face
|
580 |
|
|
Catch
|
581 |
|
|
' si on a une poutre dessinée en partie, on aura pas de feature... mais on a la face...
|
582 |
|
|
' on doit donc le déterminer anyway
|
583 |
|
|
End Try
|
584 |
bournival |
40 |
|
585 |
|
|
|
586 |
|
|
|
587 |
bournival |
205 |
For Each Face In Me.lst_Faces ' à revoir
|
588 |
|
|
swFaultEnt = Face.Check
|
589 |
|
|
If Not IsNothing(swFaultEnt) Then
|
590 |
|
|
Me.lst_Faces.GetEnumerator()
|
591 |
|
|
End If
|
592 |
|
|
Next Face
|
593 |
bournival |
40 |
|
594 |
|
|
|
595 |
bournival |
205 |
' on créé un point dans un sketch et on le place
|
596 |
|
|
' This method projects the selected sketch items from the current sketch on a selected surface.
|
597 |
|
|
' en fait ça projette juste une courbe...
|
598 |
|
|
' et si ça retourne nul alors la projection a pas marchée.
|
599 |
|
|
Dim swSKSeg As sldworks.SketchSegment
|
600 |
|
|
swSKSeg = Commun.MettreUneLigne(Plan, x - 20 * Epsilon, y - 20 * Epsilon, z, x + 20 * Epsilon, y + 20 * Epsilon, z)
|
601 |
bournival |
40 |
|
602 |
bournival |
205 |
swFeat = Nothing
|
603 |
|
|
For Each Face In Me.lst_Faces
|
604 |
|
|
swSKSeg.Select4(False, Nothing)
|
605 |
|
|
swent = Face : swent.Select4(True, Nothing)
|
606 |
|
|
swFeat = swModel.InsertProjectedSketch2(0) ' 1 pour inverser la direction de la projection
|
607 |
|
|
If swFeat IsNot Nothing Then Exit For
|
608 |
|
|
swFeat = swModel.InsertProjectedSketch2(1) ' 1 pour inverser la direction de la projection
|
609 |
|
|
If swFeat IsNot Nothing Then Exit For
|
610 |
|
|
Next Face
|
611 |
bournival |
40 |
|
612 |
|
|
|
613 |
bournival |
205 |
If swFeat Is Nothing Then
|
614 |
|
|
' on passe à un autre type d'essai...
|
615 |
|
|
Dim dist As Double
|
616 |
|
|
For Each Face In Me.lst_Faces
|
617 |
|
|
dist = swModel.ClosestDistance(Face, swSKSeg, Nothing, Nothing)
|
618 |
|
|
If Math.Abs(dist) < Epsilon Then FaceInterne = Face : Exit For
|
619 |
|
|
Next Face
|
620 |
|
|
|
621 |
|
|
|
622 |
|
|
If FaceInterne Is Nothing Then MsgBox("N'a pas réussi à trouver la bonne face dans le UpdateAPrèsSplit")
|
623 |
|
|
Return Nothing
|
624 |
|
|
|
625 |
|
|
|
626 |
|
|
Else
|
627 |
|
|
FaceInterne = Face
|
628 |
|
|
' effacer le feature...
|
629 |
bournival |
40 |
End If
|
630 |
|
|
|
631 |
|
|
|
632 |
|
|
' ************************************************
|
633 |
|
|
' pour placer un attribut sur la face interne
|
634 |
|
|
Static no As Integer
|
635 |
|
|
|
636 |
bournival |
205 |
If FI Then no = Me.MettreAttributFaceInterne(FaceInterne, poutre.SuggereGrosseurMaille, True)
|
637 |
|
|
If ajouterMini Then MyBase.AjouterMiniPoutresSurFaceInterne(poutre, FaceInterne, inter.x, inter.y, inter.z)
|
638 |
bournival |
40 |
|
639 |
|
|
|
640 |
bournival |
205 |
'If FI Then
|
641 |
|
|
' Dim nom2 As String = "FaceInterne" & no
|
642 |
bournival |
40 |
|
643 |
bournival |
205 |
' swent = FaceInterne
|
644 |
|
|
' attr = swent.FindAttribute(Intersections.DefAttrFaceInterne, 0) ' si l'attribut existe déjà on pointe dessus.
|
645 |
bournival |
40 |
|
646 |
bournival |
205 |
' If attr Is Nothing Then attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, FaceInterne, nom2, 0, 2) ' 0 = swThisconfig
|
647 |
bournival |
40 |
|
648 |
bournival |
205 |
' While attr Is Nothing
|
649 |
|
|
' no += 1
|
650 |
|
|
' nom2 = "FaceInterne" & CStr(no)
|
651 |
|
|
' attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, FaceInterne, nom2, 0, 2)
|
652 |
|
|
' End While
|
653 |
|
|
' GererDossiers("FaceInternes", nom2)
|
654 |
|
|
' no += 1
|
655 |
|
|
'ElseIf Flag = 2 Then ' on a un channel, on fait les 2 options
|
656 |
|
|
' Dim nom2 As String = "FaceInterne" & no
|
657 |
bournival |
40 |
|
658 |
bournival |
205 |
' swent = FaceInterne
|
659 |
|
|
' attr = swent.FindAttribute(Intersections.DefAttrFaceInterne, 0) ' si l'attribut existe déjà on pointe dessus.
|
660 |
bournival |
40 |
|
661 |
bournival |
205 |
' If attr Is Nothing Then attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, FaceInterne, nom2, 0, 2) ' 0 = swThisconfig
|
662 |
bournival |
40 |
|
663 |
|
|
' While attr Is Nothing
|
664 |
bournival |
205 |
' no += 1
|
665 |
|
|
' nom2 = "FaceInterne" & CStr(no)
|
666 |
|
|
' attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, FaceInterne, nom2, 0, 2)
|
667 |
bournival |
40 |
' End While
|
668 |
bournival |
205 |
' GererDossiers("FaceInternes", nom2)
|
669 |
|
|
' no += 1
|
670 |
|
|
' MyBase.AjouterMiniPoutresSurFaceInterne(poutre, FaceInterne, inter.x, inter.y, inter.z)
|
671 |
|
|
'Else
|
672 |
|
|
' If Not VientDeCoupecote Then MyBase.AjouterMiniPoutresSurFaceInterne(poutre, FaceInterne, inter.x, inter.y, inter.z)
|
673 |
|
|
'End If
|
674 |
bournival |
40 |
|
675 |
bournival |
205 |
' ************ l'attribut de la condition aux limites *******************
|
676 |
|
|
Dim attr As sldworks.Attribute
|
677 |
|
|
attr = Nothing
|
678 |
|
|
Dim nom3 As String
|
679 |
|
|
Dim p As sldworks.Parameter
|
680 |
|
|
If Not Me.condition = "" Then
|
681 |
|
|
nom3 = "CLc_" & no & "_" & Me.nom & " " & Me.condition
|
682 |
|
|
attr = swent.FindAttribute(Intersections.DefAttrConditionLimite, 0) ' si l'attribut existe déjà on pointe dessus.
|
683 |
bournival |
40 |
|
684 |
bournival |
205 |
While attr Is Nothing
|
685 |
|
|
If attr Is Nothing Then attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, FaceInterne, nom3, 0, 0)
|
686 |
|
|
If attr Is Nothing Then nom3 = nom3 & CStr(Timer)
|
687 |
|
|
End While
|
688 |
|
|
|
689 |
|
|
p = attr.GetParameter("CL")
|
690 |
|
|
p.SetStringValue(Me.condition)
|
691 |
|
|
|
692 |
|
|
End If
|
693 |
|
|
GererDossiers("Conditions Aux Limites", nom3)
|
694 |
bournival |
40 |
' *****************************************************
|
695 |
|
|
Return FaceInterne
|
696 |
|
|
|
697 |
|
|
|
698 |
|
|
End Function
|
699 |
|
|
|
700 |
|
|
Public Sub SetAttributDeCoque(ByRef epaisseur As Double, Optional ByRef materiau As String = Nothing)
|
701 |
|
|
Dim nom As String
|
702 |
|
|
Dim swFace As SldWorks.Face2
|
703 |
|
|
Dim swent As SldWorks.Entity
|
704 |
|
|
Dim no As Long
|
705 |
|
|
Dim Attr As SldWorks.Attribute
|
706 |
|
|
|
707 |
|
|
swFace = Me.SwFace
|
708 |
|
|
swent = swFace
|
709 |
|
|
|
710 |
|
|
|
711 |
|
|
Try
|
712 |
|
|
Attr = swent.FindAttribute(Intersections.DefAttrRCCoque, 0) ' si l'attribut existe déjà on pointe dessus.
|
713 |
|
|
Catch ex As Exception
|
714 |
|
|
'MsgBox("N'arrive pas à se lier à l'attribut!", MsgBoxStyle.Information, "SetAttributsDePoutre")
|
715 |
|
|
Exit Sub
|
716 |
|
|
End Try
|
717 |
|
|
|
718 |
|
|
If Attr Is Nothing Then Attr = Intersections.DefAttrRCCoque.CreateInstance5(swModel, swFace, nom, 0, 2) ' 0 = swThisconfig
|
719 |
|
|
|
720 |
|
|
While Attr Is Nothing
|
721 |
|
|
no += 1
|
722 |
|
|
nom = "RCCoque" & CStr(no)
|
723 |
|
|
Attr = Intersections.DefAttrRCCoque.CreateInstance5(swModel, swFace, nom, 0, 0)
|
724 |
|
|
If no > 100000 Then MsgBox("N'arrive pas à créer l'attribut sur la coque après 100 000 essais...", MsgBoxStyle.Exclamation, "Problème dans CreationAttributPourPoutre")
|
725 |
|
|
|
726 |
|
|
End While
|
727 |
|
|
|
728 |
|
|
|
729 |
|
|
Dim ParamM As SldWorks.Parameter
|
730 |
|
|
Dim ParamEp As SldWorks.Parameter
|
731 |
|
|
|
732 |
|
|
ParamM = Attr.GetParameter("M")
|
733 |
|
|
ParamEp = Attr.GetParameter("Ep")
|
734 |
|
|
|
735 |
|
|
If materiau IsNot Nothing Then ParamM.SetStringValue2(materiau, 2, "") ' swAllConfiguration = 2
|
736 |
|
|
ParamEp.SetStringValue2(epaisseur, 2, "")
|
737 |
|
|
|
738 |
|
|
End Sub
|
739 |
|
|
|
740 |
|
|
|
741 |
bournival |
130 |
Protected Sub CoupeX(ByRef inter As InterPoutreCoque, ByRef poutre As SlyAretePoutre)
|
742 |
|
|
Dim swEnt As sldworks.Entity = Nothing
|
743 |
|
|
Dim Directionnel As Boolean, Flip As Boolean
|
744 |
|
|
Dim Faces(3) As sldworks.Face2
|
745 |
|
|
Dim r(2) As Double
|
746 |
|
|
Dim LaSurface As sldworks.Surface
|
747 |
|
|
Dim sens As Boolean
|
748 |
|
|
Dim p(2) As Double
|
749 |
|
|
Dim retour() As Double
|
750 |
|
|
|
751 |
|
|
'swModel.SetInferenceMode(False) ' ne pas mettre de contraintes par défaut
|
752 |
|
|
'swModel.SetAddToDB(True)
|
753 |
|
|
'swModel.SetDisplayWhenAdded(False) ' accélérer les performances
|
754 |
|
|
|
755 |
|
|
|
756 |
|
|
' l'idée est de sélectionner le point et l'arète puis d'utiliser CreatePlanePerCurveAndPassPoint3
|
757 |
|
|
Dim planReference As sldworks.RefPlane
|
758 |
|
|
Dim swsketch As sldworks.Sketch
|
759 |
|
|
Dim swSommet As sldworks.Vertex, swSommet2 As sldworks.Vertex
|
760 |
|
|
Dim pointdeb(2) As Double, pointfin(2) As Double
|
761 |
|
|
|
762 |
|
|
'swModel.Extension.SelectByID2("", "POINTREF", inter.x, inter.y, inter.z, False, 0, Nothing, 0)
|
763 |
|
|
' faut vraiment sélectionner le bon point...
|
764 |
|
|
swSommet = poutre.swArete.GetStartVertex()
|
765 |
|
|
swSommet2 = poutre.swArete.GetEndVertex()
|
766 |
|
|
If swSommet Is Nothing Then
|
767 |
|
|
MsgBox("On a un cercle ou courbe sans sommets, dans coupeX, pas encore traité. Ne peut pas mettre un plan si pas de sommet")
|
768 |
|
|
Else
|
769 |
|
|
If Distance(swSommet, inter.x, inter.y, inter.z) < Epsilon Then
|
770 |
|
|
swEnt = swSommet
|
771 |
|
|
ElseIf Distance(swSommet2, inter.x, inter.y, inter.z) < Epsilon Then
|
772 |
|
|
swEnt = swSommet2
|
773 |
|
|
Else
|
774 |
|
|
MsgBox("Dans coupeX, l'intersection n'est pas sur un sommet. Pas encore traité. Nécessite de créer un point au coordonnées d'intersection")
|
775 |
|
|
End If
|
776 |
|
|
End If
|
777 |
|
|
|
778 |
|
|
swEnt.Select4(False, Nothing)
|
779 |
|
|
swEnt = poutre.swArete
|
780 |
|
|
swEnt.Select(True)
|
781 |
|
|
|
782 |
|
|
If Me.estPlan Or Me.estFauxPlan(inter.x, inter.y, inter.z) Then
|
783 |
|
|
' si la coque est plane alors on projette le plan de référence des deux cotés, sinon on doit le décaler vers le bas
|
784 |
|
|
planReference = swModel.CreatePlanePerCurveAndPassPoint3(True, True)
|
785 |
|
|
Directionnel = False
|
786 |
|
|
Flip = False
|
787 |
|
|
ElseIf Me.estCylindre Then
|
788 |
|
|
' on a un cylindre, on ne projette pas des 2 cotés. On créé un plan, puis un autre plus bas pour ensuite projeter d'un seul coté.
|
789 |
|
|
Dim PlanDessus As sldworks.RefPlane
|
790 |
|
|
Dim Rayon As Double, L As Double, B As Double, phi As Double, dist As Double, temp1 As Double, temp2 As Double
|
791 |
|
|
Dim u(2) As Double, v(2) As Double
|
792 |
|
|
PlanDessus = swModel.CreatePlanePerCurveAndPassPoint3(True, True)
|
793 |
|
|
temp1 = poutre.GetD1
|
794 |
|
|
temp2 = poutre.GetD2
|
795 |
|
|
L = Math.Sqrt(temp1 * temp1 + temp2 * temp2)
|
796 |
|
|
Rayon = Me.GetRayonCylindre()
|
797 |
|
|
u = poutre.GetOrientation(inter.x, inter.y, inter.z)
|
798 |
|
|
v = Me.GetNormale(inter.x, inter.y, inter.z)
|
799 |
|
|
phi = -(Math.Acos(Outils_Math.cosdir(u, v)))
|
800 |
|
|
B = Math.Abs(L / 2 * Math.Sin(phi))
|
801 |
|
|
dist = Rayon - Math.Sqrt(Rayon * Rayon - ((L / 2) * (L / 2))) + B
|
802 |
|
|
If dist < 0 Then MsgBox("Gros problème pour couper le cylindre, la poutre est plus grosse!!!!!!", MsgBoxStyle.Critical) : Exit Sub
|
803 |
|
|
|
804 |
|
|
swEnt = PlanDessus
|
805 |
|
|
swEnt.Select(False)
|
806 |
|
|
Directionnel = True
|
807 |
|
|
|
808 |
|
|
Flip = Flipper(PlanDessus, inter)
|
809 |
|
|
|
810 |
|
|
planReference = swModel.CreatePlaneAtOffset3(dist * 2, Flip, True)
|
811 |
|
|
Else
|
812 |
|
|
MsgBox("La coque n'est ni un cylindre, ni un plan" & vbCr & "Le résultat n'est pas certain...", MsgBoxStyle.Information, "Avertissement")
|
813 |
|
|
planReference = swModel.CreatePlanePerCurveAndPassPoint3(True, True)
|
814 |
|
|
Directionnel = False
|
815 |
|
|
Flip = False
|
816 |
|
|
End If
|
817 |
|
|
|
818 |
|
|
|
819 |
|
|
|
820 |
|
|
LaSurface = Me.SwFace.GetSurface()
|
821 |
|
|
sens = Me.SwFace.FaceInSurfaceSense()
|
822 |
|
|
|
823 |
|
|
' skx est la coordonnée du point de ref en coord de sketch, Rx est le point de référence dans le repère global.
|
824 |
bournival |
205 |
Dim i As Integer = 0, MettreFI As Boolean
|
825 |
bournival |
130 |
Dim swFeat As sldworks.Feature
|
826 |
bournival |
205 |
Dim autresection As Boolean = True
|
827 |
|
|
Dim AjouterMiniPoutre As Boolean = False
|
828 |
bournival |
130 |
|
829 |
bournival |
205 |
Do While autresection = True
|
830 |
|
|
i += 1
|
831 |
bournival |
130 |
swEnt = planReference
|
832 |
|
|
swEnt.Select(False)
|
833 |
|
|
swModel.InsertSketch2(False)
|
834 |
|
|
swModel.ClearSelection2(True)
|
835 |
|
|
swFeat = swModel.FeatureByPositionReverse(0)
|
836 |
|
|
swModel.SelectByID(swFeat.Name, "SKETCH", 0, 0, 0)
|
837 |
|
|
swModel.EditSketch()
|
838 |
|
|
swsketch = swModel.GetActiveSketch2
|
839 |
|
|
|
840 |
|
|
p(0) = inter.x : p(1) = inter.y : p(2) = inter.z
|
841 |
|
|
retour = Commun.TransfertModelSketch(swsketch, p)
|
842 |
|
|
|
843 |
|
|
|
844 |
bournival |
205 |
If SectionSimpleSurPoutre = True Then
|
845 |
|
|
r = DessineSectionPoutreSimple(poutre, retour(0), retour(1), i, swsketch, CType(inter, InterAreteFace), MettreFI, autresection, AjouterMiniPoutre)
|
846 |
|
|
Else
|
847 |
|
|
r = DessineSectionPoutre(poutre, retour(0), retour(1), i, swsketch, CType(inter, InterAreteFace), MettreFI, autresection, AjouterMiniPoutre)
|
848 |
|
|
End If
|
849 |
|
|
|
850 |
|
|
|
851 |
|
|
|
852 |
bournival |
130 |
swModel.InsertSketch2(True) ' l'option true rebuild le modèle avec les modifications du sketch.
|
853 |
|
|
swModel.ClearSelection2(True)
|
854 |
|
|
|
855 |
|
|
Dim face As sldworks.Face2
|
856 |
|
|
For Each face In Me.lst_Faces
|
857 |
|
|
swModel.ClearSelection2(True)
|
858 |
|
|
swEnt = face : swEnt.Select2(False, 1)
|
859 |
|
|
swEnt = swsketch : swEnt.Select2(True, 4)
|
860 |
|
|
swModel.InsertSplitLineProject(Directionnel, Flip)
|
861 |
|
|
Next
|
862 |
|
|
|
863 |
|
|
|
864 |
|
|
Me.SwFace.DetachSurface()
|
865 |
|
|
Me.SwFace.AttachSurface(LaSurface, sens)
|
866 |
|
|
|
867 |
bournival |
205 |
Faces(i) = UpdateApresSplit(inter, poutre, r(0), r(1), r(2), planReference, MettreFI, AjouterMiniPoutre)
|
868 |
bournival |
130 |
Commun.MettreUnPoint(r(0), r(1), r(2))
|
869 |
|
|
|
870 |
|
|
If Faces(i) Is Nothing Then
|
871 |
|
|
swEnt.Select(False)
|
872 |
|
|
swModel.EditDelete()
|
873 |
|
|
End If
|
874 |
bournival |
205 |
Loop
|
875 |
bournival |
130 |
|
876 |
bournival |
205 |
|
877 |
bournival |
130 |
End Sub
|
878 |
|
|
|
879 |
|
|
|
880 |
bournival |
40 |
End Class
|
881 |
|
|
|