ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Intersections.vb
Revision: 40
Committed: Mon Aug 20 21:30:28 2007 UTC (17 years, 8 months ago) by bournival
File size: 94943 byte(s)
Log Message:
Projet de these de Sylvain Bournival. Attention projet VB.

File Contents

# Content
1 Module Intersections
2 Public DefAttrInterALAL As SldWorks.AttributeDef
3 Public DefAttrConditionLimite As SldWorks.AttributeDef
4 Public DefAttrRCP1 As SldWorks.AttributeDef
5 Public DefAttrRCCoque As SldWorks.AttributeDef
6 Public DefAttrFaceInterne As SldWorks.AttributeDef
7 Public DefAttrDoublon As SldWorks.AttributeDef
8 Public DefAttrIgnorer As SldWorks.AttributeDef
9
10 Public nbMinipoutre As Long
11
12
13
14 #Region "Enums"
15 Public Enum typeInterPoutreVolume
16 Centre = 0
17 Sur_arete = 1
18 Sur_sommet = 2
19 Courbe = 3
20 End Enum
21
22 #End Region
23
24
25 Public Sub Debuter(Optional ByRef nom2 As String = "C:\Documents and Settings\Sylvain Bournival\Bureau\testMAGiC.sldprt", Optional ByVal nomFichier As String = "", Optional ByRef original As Boolean = True, Optional ByRef modifie As Boolean = True)
26
27 ' *******
28 ' quelques options de performance
29 ' *******
30 swApp.SetUserPreferenceIntegerValue(SwConst.swUserPreferenceIntegerValue_e.swAutoSaveInterval, 0)
31 swModel.SetAddToDB(True)
32 swModel.SetDisplayWhenAdded(False)
33 ' ******
34 ' fin des options de performance
35 ' ******
36
37 Memoriser3iemePoint() ' mémorise le coord system car si on découpe, sa coordonnée est perdue.
38 CouperPoutres()
39 Commun.GenererListes() ' va ignorer les poutres à ignorer... et ajouter les poutres coupées dans la liste.
40
41
42
43 ' Traitement des intersection poutres-Volumes
44 DetectionPoutresVolumes()
45 DecouperPoutreVolume()
46 ' fin traitement intersection poutres-volumes
47
48 swModel.EditRebuild3()
49
50
51
52 ' Traitement des intersection entre poutre et coques
53 DetectionPoutresCoques()
54 DecouperPoutreCoque()
55 ' Fin du traitement des intersections entre poutre et coques
56
57
58 ' traitement des coques-volumes
59 DetectionCoqueVolume()
60 DécouperCoqueVolume()
61 ' fin traitement coque volume
62
63 ' traitement des coques-coques
64 DetectionCoqueCoque()
65
66 '
67
68
69
70 ' *******
71 ' quelques options de performance, remettre à la position initiale
72 ' *******
73 swApp.SetUserPreferenceIntegerValue(SwConst.swUserPreferenceIntegerValue_e.swAutoSaveInterval, 15)
74 swModel.SetAddToDB(False)
75 swModel.SetDisplayWhenAdded(True)
76 swModel.GraphicsRedraw2()
77 ' ******
78 ' fin des options de performance
79 ' ******
80 ReplacerFolder()
81
82
83 End Sub
84
85
86 ''' <summary>
87 ''' sub qui créé une instance de la classe interCoqueCoque s'il y a une intersection de ce type
88 ''' </summary>
89 ''' <remarks></remarks>
90 Private Sub DetectionCoqueCoque()
91
92 Dim sketch As SldWorks.Sketch = Nothing
93 Dim interCC As InterCoqueCoque = Nothing
94
95 For Each Coque1 As SlyFaceCoque In Commun.lst_FaceCoque
96 For Each coque2 As SlyFaceCoque In lst_FaceCoque
97
98 If DetectFaceFace(coque2.SwFace, Coque1.SwFace, True, sketch) Then
99 ' création de l'instance de interFace-face entre coque et coque
100
101 interCC = New InterCoqueCoque
102 interCC.sFaceCoque1 = Coque1
103 interCC.sFaceCoque2 = coque2
104 interCC.FaceDeSection = False
105 interCC.sketch = sketch
106
107 Coque1.lst_InterCoqueCoque.Add(interCC)
108 coque2.lst_InterCoqueCoque.Add(interCC)
109 End If
110
111
112 Next
113 Next
114
115 End Sub
116
117
118 Private Sub ReplacerFolder()
119 ' on doit mettre les folders à la fin pour que ça marche dans MAGiC
120 'Si on ne met pas les attributs à la fin on est baisé...
121
122 Dim swFeat As SldWorks.Feature = Nothing
123 Dim nomdernier As String
124 Dim dansFolder As Boolean = False
125 Dim i As Integer = 0
126 Dim ok As Boolean = False
127 Dim SelMgr As SldWorks.SelectionMgr
128
129 'trouver le premier feature qui n'est pas un folder...
130 Do Until ok
131 swFeat = swModel.FeatureByPositionReverse(i)
132 nomdernier = swFeat.GetTypeName
133
134 If (nomdernier = "FtrFolder") Then
135 dansFolder = Not dansFolder
136 Else
137 If Not dansFolder Then ok = True
138 End If
139 i += 1
140 Loop
141
142 nomdernier = swFeat.Name
143
144 SelMgr = swModel.SelectionManager
145 If swModel.Extension.SelectByID2("Poutres", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0) Then swModel.ReorderFeature("Poutres", nomdernier)
146 If swModel.Extension.SelectByID2("Coques", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0) Then swModel.ReorderFeature("Coques", nomdernier)
147 If swModel.Extension.SelectByID2("Conditions Aux Limites", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0) Then swModel.ReorderFeature("Conditions Aux Limites", nomdernier)
148 If swModel.Extension.SelectByID2("FaceInternes", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0) Then swModel.ReorderFeature("FaceInternes", nomdernier)
149
150 End Sub
151
152
153 Public Sub RegisterAttribut()
154 Static nouveau As Boolean
155 'propriétés des intersections entre 2 poutres (Arete-libre Arête-libre)
156
157 If nouveau Then Exit Sub
158 Dim nom As String
159 Dim retval As Boolean
160
161 nom = "InterALAL"
162 DefAttrInterALAL = swApp.DefineAttribute(nom)
163 DefAttrInterALAL.AddParameter("X", SwConst.swParamType_e.swParamTypeDouble, 0, 0)
164 DefAttrInterALAL.AddParameter("Y", SwConst.swParamType_e.swParamTypeDouble, 0, 0)
165 DefAttrInterALAL.AddParameter("Z", SwConst.swParamType_e.swParamTypeDouble, 0, 0)
166 DefAttrInterALAL.AddParameter("T", SwConst.swParamType_e.swParamTypeDouble, -1, 0)
167 retval = DefAttrInterALAL.Register()
168 If retval = False Then MsgBox("Enregistrement raté pour le InterALAL")
169
170
171 nom = "ConditionLimite"
172 DefAttrConditionLimite = swApp.DefineAttribute(nom)
173 DefAttrConditionLimite.AddParameter("CL", SwConst.swParamType_e.swParamTypeString, 0, 0)
174 retval = DefAttrConditionLimite.Register()
175 If retval = False Then MsgBox("Enregistrement raté pour le COndition Limite")
176
177
178 DefAttrRCP1 = swApp.DefineAttribute("Poutre1")
179 DefAttrRCP1.AddParameter("M", 1, 0, 0) ' 0 = double, 1 = string, 2 = integer
180 DefAttrRCP1.AddParameter("S", 1, 0, 0)
181 DefAttrRCP1.AddParameter("As", 0, 0, 0)
182 DefAttrRCP1.AddParameter("I1", 0, 0, 0)
183 DefAttrRCP1.AddParameter("I2", 0, 0, 0)
184 DefAttrRCP1.AddParameter("N3", 1, 0, 0) ' le nom du troisième point
185 DefAttrRCP1.AddParameter("X3", 0, 0, 0) ' le x du troisième point
186 DefAttrRCP1.AddParameter("Y3", 0, 0, 0) ' le y du troisième point
187 DefAttrRCP1.AddParameter("Z3", 0, 0, 0) ' le z du troisième point
188 DefAttrRCP1.AddParameter("D1", 0, 0, 0)
189 DefAttrRCP1.AddParameter("D2", 0, 0, 0)
190 DefAttrRCP1.AddParameter("D3", 0, 0, 0)
191 DefAttrRCP1.AddParameter("D4", 0, 0, 0)
192 DefAttrRCP1.AddParameter("D5", 0, 0, 0)
193 DefAttrRCP1.AddParameter("D6", 0, 0, 0)
194 DefAttrRCP1.AddParameter("Flag", 0, 0, 0)
195
196 retval = DefAttrRCP1.Register()
197 If retval = False Then MsgBox("Enregistrement raté pour le RCPoutre")
198
199 DefAttrRCCoque = swApp.DefineAttribute("Coque")
200 DefAttrRCCoque.AddParameter("M", 1, 0, 0) 'le matériau' 0 = double, 1 = string, 2 = integer
201 DefAttrRCCoque.AddParameter("Ep", 0, 0, 0) ' épaisseur
202 DefAttrRCCoque.AddParameter("Flag", 0, 0, 0) ' un flag pour les coques...
203 retval = DefAttrRCCoque.Register()
204 If retval = False Then MsgBox("Enregistrement raté pour le RCCoque")
205
206 DefAttrFaceInterne = swApp.DefineAttribute("FaceInterne")
207 DefAttrFaceInterne.AddParameter("FI", 0, 0, 0) ' la présence de l'attribut est suffisante.
208 retval = DefAttrFaceInterne.Register()
209 If retval = False Then MsgBox("Enregistrement raté pour le FaceInterne")
210
211 DefAttrDoublon = swApp.DefineAttribute("Doublon")
212 DefAttrDoublon.AddParameter("Maitre", 1, 0, 0) ' le nom du maitre...
213 DefAttrDoublon.AddParameter("Sens", 0, 0, 0) ' -1 si dans le sens oposé
214 retval = DefAttrDoublon.Register()
215 If retval = False Then MsgBox("Enregistrement raté pour le Doublon")
216
217 nom = "Ignorer"
218 DefAttrIgnorer = swApp.DefineAttribute(nom)
219 DefAttrIgnorer.AddParameter("Rien", 0, 0, 0)
220 retval = DefAttrIgnorer.Register()
221 If retval = False Then MsgBox("Enregistrement raté pour le Ignorer")
222
223 nouveau = True
224
225 End Sub
226
227 Private Sub TraiteAPAP()
228 ' procédure plus utilisée.
229 ' procédure qui trouve les intersections entre les poutres et qui créé un attribut contenant les informations
230
231 ' en premier on efface les features attributs, pour ne pas avoir de doubles
232 Dim feat As SldWorks.Feature
233 feat = swPart.FirstFeature
234 Dim nextfeat As SldWorks.Feature
235
236 Do While Not feat Is Nothing
237 If Left(feat.Name, 9) = "InterAPAP" Then
238 nextfeat = feat.GetNextFeature
239 swModel.Extension.SelectByID2(feat.Name, "ATTRIBUTE", 0, 0, 0, False, 0, Nothing, 0)
240 swPart.EditDelete()
241 feat = nextfeat
242 Else
243 feat = feat.GetNextFeature
244 End If
245 Loop
246 ' faut aussi détruire les liste de points dans les poutres
247 ' ce qui suit n'est pas optimisé en temps d'exécution, mais en temps de programmation ;-)
248 ' j'aurais besoin d'un trouver qui retourne le sly... en fonction d'un feature(edge)
249 Dim p As SlyAretePoutre
250 For Each p In lst_AretePoutre
251 p.EffacerIntersection()
252 Next
253
254
255 ' ' fin de l'effacement des attributs
256 Dim swArete1 As SldWorks.Edge
257 Dim swArete2 As SldWorks.Edge
258 Dim SlyArete1 As SlyAretePoutre
259 Dim SlyArete2 As SlyAretePoutre
260
261 Dim xyz() As Double = Nothing
262 Dim pt As New InterPoutrePoutre
263 'Dim lst_pts As New Collection
264 Dim i As Long
265
266 Dim a1 As Integer
267 Dim a2 As Integer
268
269
270 For a1 = 0 To lst_AretePoutre.Count - 2
271 SlyArete1 = lst_AretePoutre.Item(a1)
272 swArete1 = SlyArete1.swArete
273
274 For a2 = a1 + 1 To lst_AretePoutre.Count - 1
275 SlyArete2 = lst_AretePoutre.Item(a2)
276 swArete2 = SlyArete2.swArete
277
278 If DetectAreteArete(swArete1, swArete2, xyz) Then ' intersection courbe-courbe
279 For i = 0 To CInt((UBound(xyz) + 1) / 4) Step 4 ' si y'a plus d'une intersection entre les 2 courbes...
280
281 Select Case isIntersect_milieu(swArete1, swArete2, xyz(i), xyz(i + 1), xyz(i + 2))
282 Case 1 ' la première courbe est coupée
283 pt = New InterPoutrePoutre
284 pt.Arete = swArete1
285 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
286 SlyArete1.AjouterPointAPAP(pt)
287 pt = Nothing
288 Case 2 ' la seconde courbe est coupée
289 pt = New InterPoutrePoutre
290 pt.Arete = swArete2
291 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
292 SlyArete2.AjouterPointAPAP(pt)
293 pt = Nothing
294 Case 3 ' les doux courbes sont coupées
295 pt = New InterPoutrePoutre
296 pt.Arete = swArete1
297 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
298 SlyArete1.AjouterPointAPAP(pt)
299 pt = Nothing
300 pt = New InterPoutrePoutre
301 pt.Arete = swArete2
302 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
303 SlyArete2.AjouterPointAPAP(pt)
304 pt = Nothing
305 End Select
306 Next i
307 End If
308
309 Next a2
310 Next a1
311 pt = Nothing
312 End Sub
313
314
315 Public Function DetectAreteArete(ByRef swArete1 As SldWorks.Edge, ByRef swArete2 As SldWorks.Edge, ByRef xyz() As Double) As Boolean
316 ' function qui détermine si 2 arêtes se touchent, si oui alors la fonction retourne vrai et le tableau XYZ contient le point d'intersection
317 xyz = Nothing
318 If swArete2 Is Nothing Then Exit Function
319 If swArete1 Is Nothing Then Exit Function
320
321 Dim swSommet As SldWorks.Vertex
322 Dim point1 As Object ' point début courbe 1
323 Dim point2 As Object ' point fin, courbe 1
324 Dim point3 As Object ' point début courbe 2
325 Dim point4 As Object ' point fin, courbe 2
326 Dim swCourbe1 As SldWorks.Curve
327 Dim swCourbe2 As SldWorks.Curve
328 Dim vIntersectPts As Object
329
330 swSommet = swArete1.GetStartVertex
331 If swSommet Is Nothing Then ' cercle fermé
332 point1 = swArete1.Evaluate(0)
333 point2 = point1
334 Else
335 point1 = swSommet.GetPoint
336 swSommet = swArete1.GetEndVertex
337 point2 = swSommet.GetPoint
338 End If
339
340 swSommet = swArete2.GetStartVertex
341 If swSommet Is Nothing Then
342 point3 = swArete2.Evaluate(0)
343 point4 = point3
344 Else
345 point3 = swSommet.GetPoint
346
347 swSommet = swArete2.GetEndVertex
348 point4 = swSommet.GetPoint
349 End If
350 swCourbe1 = swArete1.GetCurve
351 swCourbe2 = swArete2.GetCurve
352
353
354 vIntersectPts = swCourbe1.IntersectCurve(swCourbe2, point1, point2, point3, point4)
355
356 Try ' je déteste cette façon de procéder, mais il ne détecte pas que le vintersectpts est nothing, il le croit system.dbnull. Et je ne peut comparer avec ça.
357 xyz = vIntersectPts
358
359 If Not xyz Is Nothing Then
360 DetectAreteArete = True
361 Dim i As Integer
362 For i = 0 To ((UBound(xyz) + 1) / 4) - 1
363 Debug.Write("x" & i & " = " & xyz(i * 4) * 1000 & " mm")
364 Debug.Write("y" & i & " = " & xyz(i * 4) * 1000 & " mm")
365 Debug.Write("z" & i & " = " & xyz(i * 4) * 1000 & " mm")
366 Next i
367 Else
368 Return False
369 End If
370 Catch ex As Exception
371 DetectAreteArete = False
372 End Try
373
374 End Function
375
376 Public Function DetectAreteArete(ByRef swArete1 As SldWorks.Edge, ByRef swCourbe2 As SldWorks.Curve, ByRef xyz() As Double) As Boolean
377 ' function qui détermine si 2 arêtes se touchent, si oui alors la fonction retourne vrai et le tableau XYZ contient le point d'intersection
378 xyz = Nothing
379 If swArete1 Is Nothing Then Exit Function
380 Dim swSommet As SldWorks.Vertex
381 Dim point1 As Object ' point début courbe 1
382 Dim point2 As Object ' point fin, courbe 1
383 Dim point3 As Object ' point début courbe 2
384 Dim point4 As Object ' point fin, courbe 2
385 Dim swCourbe1 As SldWorks.Curve
386
387 Dim vIntersectPts As Object
388
389 swSommet = swArete1.GetStartVertex
390 If swSommet Is Nothing Then ' cercle fermé
391 point1 = swArete1.Evaluate(0)
392 point2 = point1
393 Else
394 point1 = swSommet.GetPoint
395 swSommet = swArete1.GetEndVertex
396 point2 = swSommet.GetPoint
397 End If
398
399
400
401 If Not swCourbe2.IsTrimmedCurve Then
402 Dim vP1 As Object, vP2 As Object
403 vP1 = swCourbe2.Evaluate(-9000)
404 vP2 = swCourbe2.Evaluate(9000)
405 swCourbe2 = swCourbe2.CreateTrimmedCurve2(vP1(0), vP1(1), vP1(2), vP2(0), vP2(1), vP2(2))
406 End If
407
408 If Not swCourbe2.IsTrimmedCurve Then
409 MsgBox("Ça plante, le trimmage n'a pas fonctionné...")
410 End If
411
412 Dim dpoint3 As Double, dpoint4 As Double, isClosed As Boolean, isPeriodic As Boolean
413 swCourbe2.GetEndParams(dpoint3, dpoint4, isClosed, isPeriodic)
414
415 point3 = swCourbe2.Evaluate(dpoint3)
416 point4 = swCourbe2.Evaluate(dpoint4)
417
418 swCourbe1 = swArete1.GetCurve
419
420 vIntersectPts = swCourbe1.IntersectCurve(swCourbe2, point1, point2, point3, point4)
421
422 Try ' je déteste cette façon de procéder, mais il ne détecte pas que le vintersectpts est nothing, il le croit system.dbnull. Et je ne peut comparer avec ça.
423 xyz = vIntersectPts
424
425 If Not xyz Is Nothing Then
426 DetectAreteArete = True
427 Dim i As Integer
428 For i = 0 To ((UBound(xyz) + 1) / 4) - 1
429 Debug.Write("x" & i & " = " & xyz(i * 4) * 1000 & " mm")
430 Debug.Write("y" & i & " = " & xyz(i * 4) * 1000 & " mm")
431 Debug.Write("z" & i & " = " & xyz(i * 4) * 1000 & " mm")
432 Next i
433 Else
434 Return False
435 End If
436 Catch ex As Exception
437 DetectAreteArete = False
438 End Try
439
440 End Function
441
442 Private Function isIntersect_milieu(ByRef Arete1 As SldWorks.Edge, ByRef Arete2 As SldWorks.Edge, ByRef x As Double, ByRef y As Double, ByRef z As Double) As Byte
443 'procédure qui dit si les courbes s'intersectent au milieu ou à leurs point d'extrémité.
444 ' 0 si les deux intersections sont sur des points
445 ' 1 si la première courbe est coupée
446 ' 2 si la deuxième est coupée
447 ' 3 si les deux courbes sont coupées
448
449
450 Dim retv As Object ' mettre les valeurs de T dans la classe
451
452 retv = Arete1.GetCurveParams2() ' retv 0,1,2 point de départ, 3,4,5 point final
453 If (Math.Abs(retv(0) - x) < Epsilon) And (Math.Abs(retv(1) - y) < Epsilon) And (Math.Abs(retv(2) - z) < Epsilon) Or (Math.Abs(retv(3) - x) < Epsilon) And (Math.Abs(retv(4) - y) < Epsilon) And (Math.Abs(retv(5) - z) < Epsilon) Then isIntersect_milieu = 0 Else isIntersect_milieu = 1
454
455 retv = Arete2.GetCurveParams2() ' retv 0,1,2 point de départ, 3,4,5 point final
456 If (Math.Abs(retv(0) - x) < Epsilon) And (Math.Abs(retv(1) - y) < Epsilon) And (Math.Abs(retv(2) - z) < Epsilon) Or (Math.Abs(retv(3) - x) < Epsilon) And (Math.Abs(retv(4) - y) < Epsilon) And (Math.Abs(retv(5) - z) < Epsilon) Then isIntersect_milieu += 0 Else isIntersect_milieu += 2
457
458 End Function
459
460
461 ''' <summary>
462 ''' Sub qui traite les intersections entre les Poutres et les coques
463 ''' </summary>
464 ''' <remarks></remarks>
465 Private Sub DetectionPoutresCoques()
466 '#1 on détecte les intersections, on en a 4 types,
467 ' #1a) intersection au milieu de la coque
468 ' #1b) intersection sur une arête
469 ' #1c) intersection sur un sommet
470 ' #1d) intersection sur une certaine longueur
471 ' faut également faire attention, il peut y avoir plus d'une poutre qui se rejoint à la même intersection.
472 ' hypothèses: 1- les zones d'influence des poutres ne se croisent pas.
473 ' 2- une arête ne fait qu'une seule intersection, à un pount ou sur une ligne, mais pas à plusieurs endroits.
474 ' 3- une arête dont l'intersection est une courbe n'a pas d'autres intersections (pout l'instant)
475 ' lorsqu'une intersection est détectée on créé une instance de la classe InterPoutreCoque
476
477 Dim sPoutre As SlyAretePoutre
478 Dim sCoque As SlyFaceCoque
479 Dim inter As InterPoutreCoque
480 Dim xyz() As Double = Nothing
481 Dim tipe As Byte
482 Dim i As Integer
483 Dim premier2 As Boolean
484
485
486 For Each sCoque In lst_FaceCoque
487 For Each sPoutre In lst_AretePoutre
488 ' on cherche entre la coque et la poutre
489
490 If DetectFaceArete(sPoutre.swArete, sCoque.SwFace, xyz) Then
491 For i = 0 To UBound(xyz) - 1 Step 3
492 ' trouver le tipe d'intersection...
493
494 Dim u() As Double
495 Dim v() As Double
496
497 u = sPoutre.GetOrientation(xyz(i + 0), xyz(i + 1), xyz(i + 2))
498 v = sCoque.GetNormale(xyz(i + 0), xyz(i + 1), xyz(i + 2))
499
500 If Math.Abs((Math.Abs(Math.Acos(Outils_Math.cosdir(u, v))) - Pi / 2)) < Epsilon Then
501 ' on est dans le même plan que la coque, on doit déterminer si on sort ou entre dans la coque.
502 Dim T As Double, T1 As Double, T2 As Double
503 Dim PointTest(2) As Double
504 T = sPoutre.GetT(xyz(i + 0), xyz(i + 1), xyz(i + 2))
505
506 ' on fait T + ou - 15 * epsilon. si une valeur est dans la coque alors on considère que l'on a le type 2
507 ' on prend 15 fois epsilon car à 10, la fonction de solidworks considère que l'on est tellement près que l'on est sur la face
508 T1 = T + 15 * Epsilon
509 T2 = T - 15 * Epsilon
510
511 Dim effacer As Double
512
513 If sPoutre.Evaluer(T1, PointTest) Then
514 ' la valeur de T appartient à la poutre, maintenant on vérifie s'il appartient aussi à la coque
515 If Distance(sCoque.lst_Faces.Item(1), PointTest(0), PointTest(1), PointTest(2)) < Epsilon Then
516 ' on est dans la coque.
517 If Not premier2 Then tipe = 2 : premier2 = True Else tipe = 22
518 End If
519 End If
520
521 If sPoutre.Evaluer(T2, PointTest) Then
522 effacer = Distance(sCoque.lst_Faces.Item(1), PointTest(0), PointTest(1), PointTest(2))
523 If Distance(sCoque.lst_Faces.Item(1), PointTest(0), PointTest(1), PointTest(2)) < Epsilon Then
524 If Not premier2 Then tipe = 2 : premier2 = True Else tipe = 22
525 End If
526 End If
527
528
529 ' si tipe n'est pas à 2 alors on est par défaut à 3
530 If tipe = 0 Then tipe = 3
531
532 Else
533 tipe = 1 ' on va devoir couper en X
534 End If
535
536 inter = sCoque.AjouterInterPoutre(sPoutre, xyz, tipe)
537 sPoutre.lst_InterCoque.Add(inter)
538 tipe = 0 ' reset
539
540 Next i ' autre point d'intersection
541
542 End If
543 premier2 = False ' reset
544 Next sPoutre
545 Next sCoque
546 End Sub
547
548
549
550 ''' <summary>
551 ''' Sub qui procède au découpage des coques en fonction des poutres
552 ''' </summary>
553 ''' <remarks></remarks>
554 Private Sub DecouperPoutreCoque()
555 ' #2 on procède au découpage de la face
556 Dim sCoque As SlyFaceCoque
557 For Each sCoque In lst_FaceCoque
558 If sCoque.lst_InterPoutre.Count > 0 Then
559 'sVol.chercherAttributs()
560 sCoque.decouper()
561
562 ' on met-a-jour l'attribut des conditions aux limites
563 Dim attr As SldWorks.Attribute
564 Dim swent As SldWorks.Entity
565 Dim nom3 As String = Nothing
566 Dim p As SldWorks.Parameter
567 If Not sCoque.AttributCL Is Nothing Then
568 nom3 = "CL_" & sCoque.nom
569 swent = sCoque.lst_Faces.Item(1)
570 attr = swent.FindAttribute(Intersections.DefAttrConditionLimite, 0) ' si l'attribut existe déjà on pointe dessus.
571
572 If attr Is Nothing Then attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, sCoque.lst_Faces.Item(1), nom3, 0, 0)
573 p = attr.GetParameter("CL")
574 p.SetStringValue(sCoque.condition)
575
576 End If
577 GererDossiers("Conditions Aux Limites", nom3)
578 End If
579
580 Next
581 End Sub
582
583
584 ''' <summary>
585 ''' Sub qui détecte les intersections entre les faces du volume et les poutres
586 ''' </summary>
587 ''' <remarks></remarks>
588 Private Sub DetectionPoutresVolumes()
589 Dim sPoutre As SlyAretePoutre
590
591 For Each sPoutre In lst_AretePoutre
592 If Not sPoutre.IsFaceDeSection Then
593 Call Intersections.GestionPoutreNormaleAvecVolume(sPoutre)
594 Else
595 ' la poutre est flaggée pour prendre la face de section
596 Call Intersections.GestionFace_De_section(sPoutre)
597 End If
598 Next sPoutre
599 End Sub
600
601 ''' <summary>
602 ''' Sub qui prend les intersections entre les faces et les volumes et qui coupe les volumes
603 ''' </summary>
604 ''' <remarks></remarks>
605 Private Sub DecouperPoutreVolume()
606 ' #2 on procède au découpage de la face
607 Dim sVol As SlyFaceVolume
608
609 For Each sVol In lst_FaceVolume
610 If sVol.lst_InterPoutre.Count > 0 Then
611 sVol.decouper()
612
613 ' on met-a-jour l'attribut des conditions aux limites
614 Dim attr As SldWorks.Attribute
615 Dim swent As SldWorks.Entity
616 Dim nom3 As String = Nothing
617 Dim p As SldWorks.Parameter
618 If Not sVol.AttributCL Is Nothing Then
619 nom3 = "CL_" & sVol.nom
620 swent = sVol.SwFace
621 attr = swent.FindAttribute(Intersections.DefAttrConditionLimite, 0) ' si l'attribut existe déjà on pointe dessus.
622
623 If attr Is Nothing Then attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, sVol.SwFace, nom3, 0, 0)
624 p = attr.GetParameter("CL")
625 p.SetStringValue(sVol.condition)
626
627 End If
628 GererDossiers("Conditions Aux Limites", nom3)
629 End If
630
631 Next
632 End Sub
633
634
635
636
637
638 ''' <summary>
639 ''' Sub qui gère la poutre qui a été flaggée comme ayant une face de section. Met à jour les attributs avec les bonnes inerties et autre
640 ''' </summary>
641 ''' <param name="sPoutre">La poutre avec laquelle il faut travailler</param>
642 ''' <remarks></remarks>
643 Private Sub GestionFace_De_section(ByRef sPoutre As SlyAretePoutre)
644
645 Dim sVol As SlyFaceVolume
646 Dim swExt As SldWorks.ModelDocExtension
647 Dim xyz() As Double = Nothing, xyz2() As Double = Nothing
648 Dim section As Object
649 Dim Face1 As SlyFaceVolume = Nothing, prop1() As Double = Nothing
650 Dim Face2 As SlyFaceVolume = Nothing, prop2() As Double = Nothing
651 Dim proprietes() As Double
652 Dim i As Integer
653 swExt = swModel.Extension
654
655 ' 1 - Spotter la ou les faces en question
656 xyz = sPoutre.GetStartPoint
657 xyz2 = sPoutre.GetEndPoint
658 For Each sVol In Commun.lst_FaceVolume
659 If Intersections.DetectSurfaceArete(sPoutre.swArete, sVol.SwFace, Nothing) Then
660 swModel.ClearSelection2(True)
661 sVol.Selectionner()
662 section = swExt.GetSectionProperties2(sVol.SwFace) : proprietes = section
663 swModel.ClearSelection2(True)
664 ' la fontion getsectionproperties renvoie des valeurs dont la précision est très douteuse...
665 ' on met alors une beaucoup plus grosse tolérance...
666 If Math.Abs(xyz(0) - proprietes(2)) < 0.0001 And Math.Abs(xyz(1) - proprietes(3)) < 0.0001 And Math.Abs(xyz(2) - proprietes(4)) < 0.0001 Then Face1 = sVol : prop1 = proprietes
667 If Math.Abs(xyz2(0) - proprietes(2)) < 0.0001 And Math.Abs(xyz2(1) - proprietes(3)) < 0.0001 And Math.Abs(xyz2(2) - proprietes(4)) < 0.0001 Then Face2 = sVol : prop2 = proprietes
668 End If
669 Next
670
671 ' si les 2 faces sont nothing, c'est que l'on a un sérieux problème...
672 If Face1 Is Nothing AndAlso Face2 Is Nothing Then
673 MsgBox("La poutre " & sPoutre.nom & " doit avoir au moins une face pour évaluer sa section. Cette face n'a pas été trouvée." & vbCr & vbCr & " Vérifiez que: " & vbCr & " - Un sommet de la poutre repose sur le centre de gravité d'une face" & vbCr & " - Que l'arète de la poutre est perpendiculaire à la face" & vbCr & " - Que la face est plane " & vbCr & " - Je crois avoir tout couvert..." & vbCr & vbCr & " La poutre a problème a été colorée en rouge.", MsgBoxStyle.Critical, "Impossible de trouver la face représentant la section")
674 Dim e As New SuperArete(sPoutre.swArete, True)
675 e.Colorer(3, 1, 0, 0)
676 sPoutre.Selectionner()
677 Exit Sub
678 End If
679
680
681
682 ' 2 - s'assurer que:
683 ' 2.1 les 2 faces sont identiques (si 2 faces)
684 If Face1 IsNot Nothing And Face2 IsNot Nothing Then
685 If Not Math.Abs(prop1(1) - prop2(1)) < 0.0000001 Then
686 Dim chaine As String
687 chaine = "Les 2 faces ne sont pas identiques... "
688 For i = 0 To 14
689 chaine = chaine & vbCr & i & " - " & Format(prop1(i), "0.000E+00") & " " & Format(prop2(i), "0.000E+00")
690 Next i
691 MsgBox(chaine)
692 End If
693 End If
694 ' 2.2 le centroide est au point d'intersection
695 ' déjà fait
696 ' 2.3 la face est plane
697 If Face1 IsNot Nothing Then
698 If Not (Face1.estPlan Xor Face1.estFauxPlan(prop1(2), prop1(3), prop1(4))) Then
699 MsgBox("La face 1 n'est pas plane!")
700 Err.Raise(513, , "Ne peut pas prendre une face non plane comme source de la section de la poutre")
701 End If
702 End If
703 If Face2 IsNot Nothing Then
704 If Not (Face2.estPlan Xor Face2.estFauxPlan(prop1(2), prop1(3), prop1(4))) Then
705 MsgBox("La face 2 n'est pas plane!")
706 Err.Raise(513, , "Ne peut pas prendre une face non plane comme source de la section de la poutre")
707 End If
708 End If
709
710
711 ' 2.4 les face sont perpendiculaire aux point d'intersection
712 Dim u() As Double
713 Dim v() As Double
714 Dim angle As Double
715 If Face1 IsNot Nothing Then
716 u = Face1.GetNormaleSurface(prop1(2), prop1(3), prop1(4))
717 v = sPoutre.GetOrientation(prop1(2), prop1(3), prop1(4))
718 angle = Outils_Math.Angle2Vecteurs(u, v)
719 If Not (Math.Abs(angle - Pi) < (100 * Epsilon)) And Not (angle < 0.005) Then
720 MsgBox("La poutre n'est pas perpendiculaire à la face1")
721 Err.Raise(514, "GestionFace_de_section - Dans intersection.vb", "Ne peut pas traiter une poutre dont la face de base n'est pas perpendiculaire")
722 End If
723 End If
724
725 If Face2 IsNot Nothing Then
726 u = Face2.GetNormaleSurface(prop2(2), prop2(3), prop2(4))
727 v = sPoutre.GetOrientation(prop2(2), prop2(3), prop2(4))
728 angle = Outils_Math.Angle2Vecteurs(u, v)
729 If Not (Math.Abs(angle - Pi) < (100 * Epsilon)) And Not (angle < Epsilon) Then
730 MsgBox("La poutre n'est pas perpendiculaire à la face2")
731 Err.Raise(514, "GestionFace_de_section - Dans intersection.vb", "Ne peut pas traiter une poutre dont la face de base n'est pas perpendiculaire")
732 End If
733 End If
734
735 ' 3 - trouver l'inertie et l'aire, placer le point 3 de façon cohérente, updater l'attribut.
736 Dim Nom3 As String
737
738 Commun.MettreUnPoint(prop1(2) + prop1(18) / 1000, prop1(3) + prop1(19) / 1000, prop1(4) + prop1(20) / 1000, True)
739 Nom3 = RealConstant.RCCode.Creation3iemePoint(1)
740 sPoutre.SetAttributsDePoutre(False, Nom3, , , prop1(13), prop1(14), prop1(1), , , , , , , 1)
741
742 ' 4 créer une nouvelle instance de la classe interFacePoutre de tipe 5
743 Dim inter As New InterPoutreVolume
744 Dim inter2 As New InterPoutreVolume
745 If Face1 IsNot Nothing Then
746 xyz(0) = prop1(2) : xyz(1) = prop1(3) : xyz(2) = prop1(4)
747 inter = Face1.AjouterInterPoutre(sPoutre, xyz, 5)
748 sPoutre.lst_InterCoque.Add(inter)
749 End If
750
751 If Face2 IsNot Nothing Then
752 xyz(0) = prop2(2) : xyz(1) = prop2(3) : xyz(2) = prop2(4)
753 inter2 = Face2.AjouterInterPoutre(sPoutre, xyz, 5)
754 sPoutre.lst_InterCoque.Add(inter2)
755 End If
756
757 End Sub
758
759
760 ''' <summary>
761 ''' Sub qui trouve les intersections entre les poutres et les faces de volumes et qui créé une instance de la classe d'intersection
762 ''' </summary>
763 ''' <param name="sPoutre">La poutre avec laquelle il faut trouver les intersections</param>
764 ''' <remarks></remarks>
765 Private Sub GestionPoutreNormaleAvecVolume(ByRef sPoutre As SlyAretePoutre)
766 Dim inter As InterPoutreVolume
767 Dim xyz() As Double = Nothing
768 Dim tipe As Byte
769 Dim i As Integer
770 Dim premier2 As Boolean
771 Dim sVol As SlyFaceVolume
772
773 For Each sVol In lst_FaceVolume
774
775
776 ' on cherche entre la coque et la poutre
777
778
779
780 If DetectFaceArete(sPoutre.swArete, sVol, xyz) Then
781
782 For i = 0 To UBound(xyz) - 1 Step 3
783 ' trouver le tipe d'intersection...
784
785 Dim u() As Double
786 Dim v() As Double
787
788 u = sPoutre.GetOrientation(xyz(i + 0), xyz(i + 1), xyz(i + 2))
789 v = sVol.GetNormale(xyz(i + 0), xyz(i + 1), xyz(i + 2))
790
791 ' ***** ici, différencier entre coque et volume ****
792 If Math.Abs((Math.Abs(Math.Acos(Outils_Math.cosdir(u, v))) - Pi / 2)) < Epsilon Then
793 ' on est dans le même plan que la coque, on doit déterminer si on sort ou entre dans la coque.
794 Dim T As Double, T1 As Double, T2 As Double
795 Dim PointTest(2) As Double
796 T = sPoutre.GetT(xyz(i + 0), xyz(i + 1), xyz(i + 2))
797
798 ' on fait T + ou - 15 * epsilon. si une valeur est dans la coque alors on considère que l'on a le type 2
799 ' on prend 15 fois epxilon car à 10, la fonction de solidworks considère que l'on est tellement près que l'on est sur la face
800 T1 = T + 15 * Epsilon
801 T2 = T - 15 * Epsilon
802
803 Dim effacer As Double
804
805 If sPoutre.Evaluer(T1, PointTest) Then
806 ' la valeur de T appartient à la poutre, maintenant on vérifie s'il appartient aussi à la coque
807 If Distance(sVol.SwFace, PointTest(0), PointTest(1), PointTest(2)) < Epsilon Then
808 ' on est dans la coque.
809 If Not premier2 Then tipe = 2 : premier2 = True Else tipe = 22
810 End If
811 End If
812
813 If sPoutre.Evaluer(T2, PointTest) Then
814 effacer = Distance(sVol.SwFace, PointTest(0), PointTest(1), PointTest(2))
815 If Distance(sVol.SwFace, PointTest(0), PointTest(1), PointTest(2)) < Epsilon Then
816 If Not premier2 Then tipe = 2 : premier2 = True Else tipe = 22
817 End If
818 End If
819
820 ' si tipe n'est pas à 2 alors on est par défaut à 3
821 If tipe = 0 Then tipe = 3
822
823 Else
824 tipe = 1 ' on va devoir couper en X
825 End If
826
827 inter = sVol.AjouterInterPoutre(sPoutre, xyz, tipe)
828 sPoutre.lst_InterCoque.Add(inter)
829 tipe = 0 ' reset
830
831 Next i ' autre point d'intersection
832
833 End If
834 premier2 = False ' reset
835
836 Next sVol
837 End Sub
838
839
840
841
842 'Private Function DetectFaceArete(ByRef swCurve As SldWorks.Curve, ByRef swFace As SldWorks.Face2, ByRef xyz() As Double) As Boolean
843 ' ' function qui détecte si une arête coupe une face, si c'est le cas la function retourne true et remplie le tableau xyz avec le point d'intersection
844 ' Dim vCurveParam As Object
845 ' Dim swSurf As SldWorks.Surface
846 ' Dim vCurveBounds As Object, vPointArray As Object, vTArray As Object, vUVArray As Object
847 ' Dim nCurveBounds(5) As Double
848 ' Dim bRet As Boolean
849 ' Dim i As Integer
850
851 ' swSurf = swFace.GetSurface
852
853 ' ' 2- on va chercher les paramètres de la spline avec Curve::ConvertLineToBcurve
854 ' If swCurve.IsLine Then
855 ' Dim startp(2) As Double
856 ' Dim endp(2) As Double
857 ' Dim vStart As Object
858 ' Dim vEnd As Object
859
860 ' vCurveParam = swCurve.LineParams()
861 ' startp(0) = vCurveParam(0)
862 ' startp(1) = vCurveParam(1)
863 ' startp(2) = vCurveParam(2)
864 ' vStart = startp
865
866 ' endp(0) = vCurveParam(3)
867 ' endp(1) = vCurveParam(4)
868 ' endp(2) = vCurveParam(5)
869 ' vEnd = endp
870
871 ' Dim retval As Object
872 ' Dim valeur As Double
873 ' Dim dimension As Integer
874 ' Dim ordre As Integer
875 ' Dim nbpoints As Integer
876 ' Dim periodique As Integer
877
878 ' retval = swCurve.ConvertLineToBcurve(vStart, vEnd)
879
880 ' ' on suppose que la droite est toujours transformée en spline non-rationelle de dimension 3 et d'ordre 2
881 ' Dim knots(3) As Double
882 ' Dim ctrlPoints(5) As Double
883
884 ' knots(0) = retval(2)
885 ' knots(1) = retval(3)
886 ' knots(2) = retval(4)
887 ' knots(3) = retval(5)
888
889 ' ctrlPoints(0) = retval(6)
890 ' ctrlPoints(1) = retval(7)
891 ' ctrlPoints(2) = retval(8)
892 ' ctrlPoints(3) = retval(9)
893 ' ctrlPoints(4) = retval(10)
894 ' ctrlPoints(5) = retval(11)
895
896 ' '3 - on créé une spline dans le modeleur
897
898
899 ' Dim modeler As SldWorks.Modeler
900 ' modeler = swApp.GetModeler
901 ' Dim props As Object
902 ' Dim dProps(1) As Double
903 ' Dim vKnots As Object, vCtrlPoints As Object
904
905 ' dProps(0) = retval(0)
906 ' dProps(1) = retval(1)
907 ' props = dProps
908 ' vKnots = knots
909 ' vCtrlPoints = ctrlPoints
910
911 ' swCurve = modeler.CreateBsplineCurve(props, vKnots, vCtrlPoints)
912 ' ' 4 - on a une spline, on peut utiliser la fonction IntersectCurve
913 ' End If
914
915
916 ' For i = 0 To 5
917 ' nCurveBounds(i) = vCurveParam(i)
918 ' Next i
919
920 ' vCurveBounds = nCurveBounds
921 ' bRet = swSurf.IntersectCurve(swCurve, vCurveBounds, vPointArray, vTArray, vUVArray)
922
923 ' Dim Pts() As Double
924 ' Dim PointsTemp() As Double
925 ' Dim j As Integer
926
927 ' Pts = vPointArray
928
929 ' If UBound(Pts) < 1 Then Return False
930 ' ' ATTENTION, le point n'est pas nécessairement dans la face
931 ' For i = 0 To UBound(Pts) - 1 Step 3
932 ' If Commun.Distance(swFace, Pts(i + 0), Pts(i + 1), Pts(i + 2)) < Epsilon Then
933 ' ReDim Preserve PointsTemp(j + 2)
934 ' PointsTemp(j) = Pts(i + 0)
935 ' PointsTemp(j + 1) = Pts(i + 1)
936 ' PointsTemp(j + 2) = Pts(i + 2)
937 ' j += 3
938 ' End If
939 ' Next
940
941 ' xyz = PointsTemp
942 ' If xyz Is Nothing Then Return False
943 ' If UBound(xyz) > 0 Then Return True
944
945
946 'End Function
947
948 Private Function DetectFaceArete(ByRef swArete As SldWorks.Edge, ByRef swFace As SldWorks.Face2, ByRef xyz() As Double) As Boolean
949 ' function qui détecte si une arête coupe une face, si c'est le cas la function retourne true et remplie le tableau xyz avec le point d'intersection
950
951 Dim P1 As Object = Nothing, p2 As Object = Nothing
952 If swModel.ClosestDistance(swArete, swFace, P1, P2) > Epsilon Then Return False
953
954 Dim swCurve As SldWorks.Curve
955 Dim swSurf As SldWorks.Surface
956 Dim vCurveParam As Object
957
958 Dim vCurveBounds As Object, vPointArray As Object = Nothing, vTArray As Object = Nothing, vUVArray As Object = Nothing
959 Dim nCurveBounds(5) As Double
960 Dim bRet As Boolean
961 Dim i As Integer
962
963 '1 - on va chercher la courbe et la surface
964 swCurve = swArete.GetCurve
965 swSurf = swFace.GetSurface
966
967
968 ' 2- on va chercher les paramètres de la spline avec Curve::ConvertLineToBcurve
969 vCurveParam = swArete.GetCurveParams2
970 If swCurve.IsLine Then
971 Dim startp(2) As Double
972 Dim endp(2) As Double
973 Dim vStart As Object
974 Dim vEnd As Object
975
976
977 startp(0) = vCurveParam(0)
978 startp(1) = vCurveParam(1)
979 startp(2) = vCurveParam(2)
980 vStart = startp
981
982 endp(0) = vCurveParam(3)
983 endp(1) = vCurveParam(4)
984 endp(2) = vCurveParam(5)
985 vEnd = endp
986
987 Dim retval As Object
988
989 retval = swCurve.ConvertLineToBcurve(vStart, vEnd)
990
991 ' on suppose que la droite est toujours transformée en spline non-rationelle de dimension 3 et d'ordre 2
992 Dim knots(3) As Double
993 Dim ctrlPoints(5) As Double
994
995 knots(0) = retval(2)
996 knots(1) = retval(3)
997 knots(2) = retval(4)
998 knots(3) = retval(5)
999
1000 ctrlPoints(0) = retval(6)
1001 ctrlPoints(1) = retval(7)
1002 ctrlPoints(2) = retval(8)
1003 ctrlPoints(3) = retval(9)
1004 ctrlPoints(4) = retval(10)
1005 ctrlPoints(5) = retval(11)
1006
1007 '3 - on créé une spline dans le modeleur
1008
1009
1010 Dim modeler As SldWorks.Modeler
1011 modeler = swApp.GetModeler
1012 Dim props As Object
1013 Dim dProps(1) As Double
1014 Dim vKnots As Object, vCtrlPoints As Object
1015
1016 dProps(0) = retval(0)
1017 dProps(1) = retval(1)
1018 props = dProps
1019 vKnots = knots
1020 vCtrlPoints = ctrlPoints
1021
1022 swCurve = modeler.CreateBsplineCurve(props, vKnots, vCtrlPoints)
1023 ' 4 - on a une spline, on peut utiliser la fonction IntersectCurve
1024 End If
1025
1026
1027 For i = 0 To 5
1028 nCurveBounds(i) = vCurveParam(i)
1029 Next i
1030
1031 vCurveBounds = nCurveBounds
1032 bRet = swSurf.IntersectCurve(swCurve, vCurveBounds, vPointArray, vTArray, vUVArray)
1033
1034 Dim Pts() As Double
1035 Dim PointsTemp() As Double = Nothing
1036 Dim j As Integer
1037
1038 Pts = vPointArray
1039
1040 If UBound(Pts) < 1 Then Return False
1041 ' ATTENTION, le point n'est pas nécessairement dans la face
1042 For i = 0 To UBound(Pts) - 1 Step 3
1043 If Commun.Distance(swFace, Pts(i + 0), Pts(i + 1), Pts(i + 2)) < Epsilon Then
1044 ReDim Preserve PointsTemp(j + 2)
1045 PointsTemp(j) = Pts(i + 0)
1046 PointsTemp(j + 1) = Pts(i + 1)
1047 PointsTemp(j + 2) = Pts(i + 2)
1048 j += 3
1049 End If
1050 Next
1051
1052 xyz = PointsTemp
1053 If xyz Is Nothing Then Return False
1054 If UBound(xyz) > 0 Then Return True
1055
1056 End Function
1057
1058
1059
1060 Private Function DetectFaceArete(ByRef swArete As SldWorks.Edge, ByRef Slyface As SlyFaceVolume, ByRef xyz() As Double) As Boolean
1061 Dim swface As SldWorks.Face2
1062 Dim surarete As Boolean
1063 For Each swface In Slyface.lst_Faces
1064 If DetectFaceArete(swArete, swface, xyz) Then
1065 Dim vEdges As Object
1066 Dim Arete As SldWorks.Edge
1067 Dim inu() As Double = Nothing
1068
1069 vEdges = swface.GetEdges
1070
1071 For Each Arete In vEdges
1072 If DetectAreteArete(Arete, swArete, inu) Then
1073 ' on a un type d'intersection entre une face et une arète...
1074 Dim swSurf As SldWorks.Surface
1075 Dim retval As Object
1076 Dim v(2) As Double
1077 Dim u(2) As Double
1078 Dim angle As Double
1079 swSurf = swface.GetSurface
1080 retval = swSurf.EvaluateAtPoint(xyz(0), xyz(1), xyz(2))
1081 ' les 3 premiers de retval sont la normale...
1082 v(0) = retval(0) : v(1) = retval(1) : v(2) = retval(2)
1083
1084 retval = swArete.GetParameter(inu(0), inu(1), inu(2))
1085 retval = swArete.Evaluate(retval(0))
1086 u(0) = retval(3) : u(1) = retval(4) : u(2) = retval(5)
1087 angle = Outils_Math.Angle2Vecteurs(u, v)
1088 MsgBox(angle * 180 / Pi & "<-- angle sens --> " & swface.FaceInSurfaceSense)
1089
1090 If ((angle < (Pi / 2)) Xor swface.FaceInSurfaceSense()) Then
1091 Return True
1092 Else
1093 surarete = True
1094 End If
1095 End If
1096 Next
1097
1098
1099 If Not surarete Then Return True Else Return False
1100 End If
1101 Next
1102 End Function
1103
1104
1105
1106
1107 Private Function DetectSurfaceArete(ByRef swArete As SldWorks.Edge, ByRef swFace As SldWorks.Face2, ByRef xyz() As Double) As Boolean
1108 ' function qui détecte si une arête coupe une face, si c'est le cas la function retourne true et remplie le tableau xyz avec le point d'intersection
1109 Dim swCurve As SldWorks.Curve
1110 Dim swSurf As SldWorks.Surface
1111 Dim vCurveParam As Object
1112
1113 Dim vCurveBounds As Object, vPointArray As Object = Nothing, vTArray As Object = Nothing, vUVArray As Object = Nothing
1114 Dim nCurveBounds(5) As Double
1115 Dim bRet As Boolean
1116 Dim i As Integer
1117
1118 '1 - on va chercher la courbe et la surface
1119 swCurve = swArete.GetCurve
1120 swSurf = swFace.GetSurface
1121
1122
1123 ' 2- on va chercher les paramètres de la spline avec Curve::ConvertLineToBcurve
1124 vCurveParam = swArete.GetCurveParams2
1125 If swCurve.IsLine Then
1126 Dim startp(2) As Double
1127 Dim endp(2) As Double
1128 Dim vStart As Object
1129 Dim vEnd As Object
1130
1131
1132 startp(0) = vCurveParam(0)
1133 startp(1) = vCurveParam(1)
1134 startp(2) = vCurveParam(2)
1135 vStart = startp
1136
1137 endp(0) = vCurveParam(3)
1138 endp(1) = vCurveParam(4)
1139 endp(2) = vCurveParam(5)
1140 vEnd = endp
1141
1142 Dim retval As Object
1143
1144 retval = swCurve.ConvertLineToBcurve(vStart, vEnd)
1145
1146 ' on suppose que la droite est toujours transformée en spline non-rationelle de dimension 3 et d'ordre 2
1147 Dim knots(3) As Double
1148 Dim ctrlPoints(5) As Double
1149
1150 knots(0) = retval(2)
1151 knots(1) = retval(3)
1152 knots(2) = retval(4)
1153 knots(3) = retval(5)
1154
1155 ctrlPoints(0) = retval(6)
1156 ctrlPoints(1) = retval(7)
1157 ctrlPoints(2) = retval(8)
1158 ctrlPoints(3) = retval(9)
1159 ctrlPoints(4) = retval(10)
1160 ctrlPoints(5) = retval(11)
1161
1162 '3 - on créé une spline dans le modeleur
1163
1164
1165 Dim modeler As SldWorks.Modeler
1166 modeler = swApp.GetModeler
1167 Dim props As Object
1168 Dim dProps(1) As Double
1169 Dim vKnots As Object, vCtrlPoints As Object
1170
1171 dProps(0) = retval(0)
1172 dProps(1) = retval(1)
1173 props = dProps
1174 vKnots = knots
1175 vCtrlPoints = ctrlPoints
1176
1177 swCurve = modeler.CreateBsplineCurve(props, vKnots, vCtrlPoints)
1178 ' 4 - on a une spline, on peut utiliser la fonction IntersectCurve
1179 End If
1180
1181
1182 For i = 0 To 5
1183 nCurveBounds(i) = vCurveParam(i)
1184 Next i
1185
1186 vCurveBounds = nCurveBounds
1187 bRet = swSurf.IntersectCurve(swCurve, vCurveBounds, vPointArray, vTArray, vUVArray)
1188
1189 Dim Pts() As Double
1190 Dim PointsTemp() As Double = Nothing
1191 Dim j As Integer
1192
1193 Pts = vPointArray
1194
1195 If UBound(Pts) < 1 Then Return False
1196
1197 For i = 0 To UBound(Pts) - 1 Step 3
1198 ReDim Preserve PointsTemp(j + 2)
1199 PointsTemp(j) = Pts(i + 0)
1200 PointsTemp(j + 1) = Pts(i + 1)
1201 PointsTemp(j + 2) = Pts(i + 2)
1202 j += 3
1203 Next i
1204
1205 xyz = PointsTemp
1206 If xyz Is Nothing Then Return False
1207 If UBound(xyz) > 0 Then Return True
1208
1209
1210 End Function
1211
1212
1213
1214 Private Function DetectSommetArete(ByRef swsommet As SldWorks.Vertex, ByRef swArete As SldWorks.Edge, ByRef xyz() As Double) As Boolean
1215 Dim x As Double, y As Double, z As Double
1216 Dim vPoint As Object
1217 Dim vPoint2 As Object
1218 vPoint = swsommet.GetPoint
1219
1220 x = vPoint(0)
1221 y = vPoint(1)
1222 z = vPoint(2)
1223
1224 vPoint2 = swArete.GetClosestPointOn(x, y, z)
1225 If Math.Abs(vPoint2(0) - x) < Epsilon And Math.Abs(vPoint2(1) - y) < Epsilon And Math.Abs(vPoint2(2) - z) < Epsilon Then
1226 ReDim xyz(2)
1227 xyz(0) = x
1228 xyz(1) = y
1229 xyz(2) = z
1230 DetectSommetArete = True
1231 End If
1232
1233 End Function
1234
1235
1236 Private Function DetectSommetArete(ByRef x As Double, ByRef y As Double, ByRef z As Double, ByRef swArete As SldWorks.Edge) As Byte
1237 Dim vPoint As Object
1238 Dim vPoint2 As Object
1239
1240 vPoint2 = swArete.GetClosestPointOn(x, y, z)
1241 If Math.Abs(vPoint2(0) - x) < Epsilon And Math.Abs(vPoint2(1) - y) < Epsilon And Math.Abs(vPoint2(2) - z) < Epsilon Then
1242 DetectSommetArete = 1
1243
1244 ' maintenant on cherche à savoir si ca touche au premier sommet de l'arrête.
1245 vPoint = swArete.GetCurveParams2()
1246
1247 If Math.Abs(vPoint(0) - x) < Epsilon And Math.Abs(vPoint(1) - y) < Epsilon And Math.Abs(vPoint(2) - z) < Epsilon Then DetectSommetArete = 2
1248 If Math.Abs(vPoint(3) - x) < Epsilon And Math.Abs(vPoint(4) - y) < Epsilon And Math.Abs(vPoint(5) - z) < Epsilon Then DetectSommetArete = 2
1249
1250 End If
1251
1252 End Function
1253
1254 Private Function DetectSommetArete(ByRef swArete2som As SldWorks.Edge, ByRef swArete As SldWorks.Edge, ByRef xyz() As Double, Optional ByRef ret As Byte = 0) As Boolean
1255 ' ret: 1 = sur premier sommet, 2 = sur dernier sommet
1256 Dim x As Double, y As Double, z As Double
1257 Dim vPoint As Object
1258 Dim vPoint2 As Object
1259 Dim swSommet As SldWorks.Vertex
1260
1261 swSommet = swArete2som.GetStartVertex
1262 If IsNothing(swSommet) Then Exit Function ' on a un cercle...
1263
1264
1265 vPoint = swSommet.GetPoint
1266
1267 x = vPoint(0)
1268 y = vPoint(1)
1269 z = vPoint(2)
1270
1271 vPoint2 = swArete.GetClosestPointOn(x, y, z)
1272 If Math.Abs(vPoint2(0) - x) < Epsilon And Math.Abs(vPoint2(1) - y) < Epsilon And Math.Abs(vPoint2(2) - z) < Epsilon Then
1273 ReDim xyz(2)
1274 xyz(0) = x
1275 xyz(1) = y
1276 xyz(2) = z
1277 DetectSommetArete = True
1278 ret += 1
1279 End If
1280
1281 swSommet = swArete2som.GetEndVertex
1282 vPoint = swSommet.GetPoint
1283
1284 x = vPoint(0)
1285 y = vPoint(1)
1286 z = vPoint(2)
1287
1288 vPoint2 = swArete.GetClosestPointOn(x, y, z)
1289 If Math.Abs(vPoint2(0) - x) < Epsilon And Math.Abs(vPoint2(1) - y) < Epsilon And Math.Abs(vPoint2(2) - z) < Epsilon Then
1290 ReDim xyz(2)
1291 xyz(0) = x
1292 xyz(1) = y
1293 xyz(2) = z
1294 DetectSommetArete = True
1295 ret += 2
1296 End If
1297
1298
1299 End Function
1300
1301 Private Sub Memoriser3iemePoint()
1302 Dim poutre As SlyAretePoutre
1303 Dim attr As SldWorks.Attribute
1304 Dim p As SldWorks.Parameter
1305 Dim swEnt As SldWorks.Entity
1306
1307
1308
1309 For Each poutre In Commun.lst_AretePoutre
1310 Dim xyz() As Double
1311 Dim nom As String = Nothing
1312
1313 If Not poutre.IsFaceDeSection Then
1314 xyz = poutre.GetPoint3(nom)
1315
1316 poutre.X3 = xyz(0)
1317 poutre.Y3 = xyz(1)
1318 poutre.Z3 = xyz(2)
1319
1320 swEnt = poutre.swArete
1321
1322 attr = swEnt.FindAttribute(Intersections.DefAttrRCP1, 0)
1323 p = attr.GetParameter("N3")
1324
1325 p = attr.GetParameter("X3")
1326 p.SetDoubleValue2(poutre.X3, 2, "")
1327
1328 p = attr.GetParameter("Y3")
1329 p.SetDoubleValue2(poutre.Y3, 2, "")
1330
1331 p = attr.GetParameter("Z3")
1332 p.SetDoubleValue2(poutre.Z3, 2, "")
1333 End If
1334 Next poutre
1335
1336 End Sub
1337
1338
1339
1340 Private Sub CouperPoutres()
1341
1342 ' procédure qui trouve les intersections entre les poutres et qui les coupe.
1343 ' à la fin on a plus d'intersections entre les poutres (ailleur qu'un sommet)
1344
1345 Dim swArete1 As SldWorks.Edge
1346 Dim swArete2 As SldWorks.Edge
1347 Dim SlyArete1 As SlyAretePoutre
1348 Dim SlyArete2 As SlyAretePoutre
1349
1350 Dim xyz() As Double = Nothing
1351 Dim pt As New InterPoutrePoutre
1352 'Dim lst_pts As New Collection
1353 Dim i As Long
1354
1355 Dim a1 As Integer
1356 Dim a2 As Integer
1357
1358
1359 For a1 = 0 To lst_AretePoutre.Count - 2
1360 SlyArete1 = lst_AretePoutre.Item(a1)
1361 swArete1 = SlyArete1.swArete
1362
1363 For a2 = a1 + 1 To lst_AretePoutre.Count - 1
1364 SlyArete2 = lst_AretePoutre.Item(a2)
1365 swArete2 = SlyArete2.swArete
1366
1367 If DetectAreteArete(swArete1, swArete2, xyz) Then ' intersection courbe-courbe
1368 For i = 0 To CInt((UBound(xyz) + 1) / 4) Step 4 ' si y'a plus d'une intersection entre les 2 courbes...
1369
1370 Select Case isIntersect_milieu(swArete1, swArete2, xyz(i), xyz(i + 1), xyz(i + 2))
1371 Case 1 ' la première courbe est coupée
1372 pt = New InterPoutrePoutre
1373 pt.Arete = swArete1
1374 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1375 SlyArete1.AjouterPointAPAP(pt)
1376 pt = Nothing
1377 Case 2 ' la seconde courbe est coupée
1378 pt = New InterPoutrePoutre
1379 pt.Arete = swArete2
1380 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1381 SlyArete2.AjouterPointAPAP(pt)
1382 pt = Nothing
1383 Case 3 ' les doux poutres sont coupées
1384 pt = New InterPoutrePoutre
1385 pt.Arete = swArete1
1386 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1387 SlyArete1.AjouterPointAPAP(pt)
1388 pt = Nothing
1389 pt = New InterPoutrePoutre
1390 pt.Arete = swArete2
1391 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1392 SlyArete2.AjouterPointAPAP(pt)
1393 pt = Nothing
1394 End Select
1395 Next i
1396 End If
1397
1398 Next a2
1399
1400 Dim SlyArete3 As SlyAreteCoque
1401 For a2 = 0 To lst_AreteCoque.Count - 1
1402 SlyArete3 = lst_AreteCoque.Item(a2)
1403 swArete2 = SlyArete3.swArete
1404
1405 If DetectAreteArete(swArete1, swArete2, xyz) Then ' intersection courbe-courbe
1406 For i = 0 To CInt((UBound(xyz) + 1) / 4) Step 4 ' si y'a plus d'une intersection entre les 2 courbes...
1407
1408 Select Case isIntersect_milieu(swArete1, swArete2, xyz(i), xyz(i + 1), xyz(i + 2))
1409 Case 1 ' la première courbe est coupée
1410 pt = New InterPoutrePoutre
1411 pt.Arete = swArete1
1412 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1413 SlyArete1.AjouterPointAPAP(pt)
1414 pt = Nothing
1415 ' seul la coque est coupée, elle sera découpée anyway.
1416 Case 3 ' les doux poutres sont coupées, mais on note juste la deuxième
1417 pt = New InterPoutrePoutre
1418 pt.Arete = swArete1
1419 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1420 SlyArete1.AjouterPointAPAP(pt)
1421 pt = Nothing
1422 End Select
1423 Next i
1424 End If
1425 Next a2
1426
1427 Dim slyarete4 As SlyAreteVol
1428 For a2 = 0 To lst_AreteVolume.Count - 1
1429 slyarete4 = lst_AreteVolume.Item(a2)
1430 swArete2 = slyarete4.swArete
1431
1432 If DetectAreteArete(swArete1, swArete2, xyz) Then ' intersection courbe-courbe
1433 For i = 0 To CInt((UBound(xyz) + 1) / 4) Step 4 ' si y'a plus d'une intersection entre les 2 courbes...
1434
1435 Select Case isIntersect_milieu(swArete1, swArete2, xyz(i), xyz(i + 1), xyz(i + 2))
1436 Case 1 ' la première courbe est coupée
1437 pt = New InterPoutrePoutre
1438 pt.Arete = swArete1
1439 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1440 SlyArete1.AjouterPointAPAP(pt)
1441 pt = Nothing
1442 Case 3 ' les doux poutres sont coupées, mais on note juste la deuxième
1443 pt = New InterPoutrePoutre
1444 pt.Arete = swArete1
1445 pt.x = xyz(i) : pt.y = xyz(i + 1) : pt.z = xyz(i + 2)
1446 SlyArete1.AjouterPointAPAP(pt)
1447 pt = Nothing
1448 End Select
1449 Next i
1450 End If
1451 Next a2
1452
1453
1454
1455 Next a1
1456 pt = Nothing
1457
1458
1459
1460 'toutes les poutres ont des points où elles doivent être coupées
1461 ' il suffit de couper.
1462 ' en réalité on suppress et on créé 2 ou plus courbes par dessus.
1463 Dim attr As SldWorks.Attribute
1464 Dim swEnt As SldWorks.Entity
1465
1466 For Each SlyArete1 In lst_AretePoutre
1467 If SlyArete1.lst_PtsInterAPAP.Count > 0 Then ' on coupe
1468 '1 - ordonner les points, de Tmin à Tmax et inclure les 2 extrémités de la poutre
1469
1470
1471 ' si c'est une droite
1472 If SlyArete1.IsLine Then
1473 Dim Pts(,) As Double
1474 Dim swSketch As SldWorks.Sketch
1475 ReDim Pts(3, SlyArete1.lst_PtsInterAPAP.Count + 1)
1476
1477 SlyArete1.GetStartPoint(Pts(0, 0), Pts(1, 0), Pts(2, 0)) ' le premier point
1478 Pts(3, 0) = SlyArete1.GetT(Pts(0, 0), Pts(1, 0), Pts(2, 0))
1479
1480 For i = 1 To SlyArete1.lst_PtsInterAPAP.Count
1481 Pts(0, i) = SlyArete1.lst_PtsInterAPAP.Item(i).x
1482 Pts(1, i) = SlyArete1.lst_PtsInterAPAP.Item(i).y
1483 Pts(2, i) = SlyArete1.lst_PtsInterAPAP.Item(i).z
1484 Pts(3, i) = SlyArete1.GetT(Pts(0, i), Pts(1, i), Pts(2, i))
1485 Next i
1486
1487 Dim max As Integer = SlyArete1.lst_PtsInterAPAP.Count + 1
1488 SlyArete1.GetEndPoint(Pts(0, max), Pts(1, max), Pts(2, max)) ' le dernier point
1489 Pts(3, max) = SlyArete1.GetT(Pts(0, max), Pts(1, max), Pts(2, max))
1490
1491 ' faut ordonner les points selon T...
1492 Dim j As Integer
1493 Dim T1 As Double, T2 As Double, T3 As Double, T0 As Double
1494 For i = 0 To max - 2
1495 For j = 0 To max - i - 1
1496 If Pts(3, j) > Pts(3, j + 1) Then
1497 T0 = Pts(0, j) : T1 = Pts(1, j) : T2 = Pts(2, j) : T3 = Pts(3, j)
1498 Pts(0, j) = Pts(0, j + 1) : Pts(1, j) = Pts(1, j + 1) : Pts(2, j) = Pts(2, j + 1) : Pts(3, j) = Pts(3, j + 1)
1499 Pts(0, j + 1) = T0 : Pts(1, j + 1) = T1 : Pts(2, j + 1) = T2 : Pts(3, j + 1) = T3
1500 End If
1501 Next j
1502 Next i
1503
1504
1505 For i = 0 To UBound(Pts, 2) - 1
1506 swModel.Insert3DSketch2(False)
1507 swModel.CreateLine2(Pts(0, i), Pts(1, i), Pts(2, i), Pts(0, i + 1), Pts(1, i + 1), Pts(2, i + 1)) ' et pour chaque segment
1508 swSketch = swModel.GetActiveSketch2
1509 swModel.Insert3DSketch2(False)
1510
1511 swEnt = swSketch : swEnt.Select2(False, 1) ' doit avoir un mark de 1
1512 swModel.InsertCompositeCurve()
1513
1514 UpdateAttributs(SlyArete1, i) 'ajouter les attributs de la vieille poutre sur la nouvelle
1515 Next i
1516
1517
1518 Else ' If SlyArete1.IsCircle Then ' si c'est un cercle
1519
1520 Dim Pts(,) As Double
1521 Dim swSketch As SldWorks.Sketch
1522 ReDim Pts(3, SlyArete1.lst_PtsInterAPAP.Count + 1)
1523
1524 SlyArete1.GetStartPoint(Pts(0, 0), Pts(1, 0), Pts(2, 0)) ' le premier point
1525 Pts(3, 0) = SlyArete1.GetT(Pts(0, 0), Pts(1, 0), Pts(2, 0))
1526
1527 For i = 1 To SlyArete1.lst_PtsInterAPAP.Count
1528 Pts(0, i) = SlyArete1.lst_PtsInterAPAP.Item(i).x
1529 Pts(1, i) = SlyArete1.lst_PtsInterAPAP.Item(i).y
1530 Pts(2, i) = SlyArete1.lst_PtsInterAPAP.Item(i).z
1531 Pts(3, i) = SlyArete1.GetT(Pts(0, i), Pts(1, i), Pts(2, i))
1532 Next i
1533
1534 Dim max As Integer = SlyArete1.lst_PtsInterAPAP.Count + 1
1535 SlyArete1.GetEndPoint(Pts(0, max), Pts(1, max), Pts(2, max)) ' le dernier point
1536 Pts(3, max) = SlyArete1.GetT(Pts(0, max), Pts(1, max), Pts(2, max))
1537
1538 ' faut ordonner les points selon T...
1539 Dim j As Integer
1540 Dim T1 As Double, T2 As Double, T3 As Double, T0 As Double
1541 For i = 0 To max - 2
1542 For j = 0 To max - i - 1
1543 If Pts(3, j) > Pts(3, j + 1) Then
1544 T0 = Pts(0, j) : T1 = Pts(1, j) : T2 = Pts(2, j) : T3 = Pts(3, j)
1545 Pts(0, j) = Pts(0, j + 1) : Pts(1, j) = Pts(1, j + 1) : Pts(2, j) = Pts(2, j + 1) : Pts(3, j) = Pts(3, j + 1)
1546 Pts(0, j + 1) = T0 : Pts(1, j + 1) = T1 : Pts(2, j + 1) = T2 : Pts(3, j + 1) = T3
1547 End If
1548 Next j
1549 Next i
1550
1551 Dim skSeg As SldWorks.SketchSegment
1552 Dim x As Double, y As Double, z As Double
1553 Dim vretval As Object
1554 Dim useEdge As SldWorks.SketchSegment
1555 Dim m As Integer
1556
1557
1558 For i = 0 To UBound(Pts, 2) - 1
1559 swModel.Insert3DSketch2(False)
1560 ' sélectionner la edge originale
1561 swEnt = SlyArete1.swArete
1562 swEnt.Select4(False, Nothing)
1563 swModel.SketchUseEdge2(False)
1564 swSketch = swModel.GetActiveSketch2()
1565
1566 ' on créé 2 lignes de construction et on pick de chaque coté... mais on ne le fait pas si on est au premier ou au dernier segment. là on fait juste un pick.
1567 If i <> 0 Then ' premier pick, élimine ce qui est avant.
1568 skSeg = swModel.CreateLine2(Pts(0, i), Pts(1, i), Pts(2, i), 0.01, 0.01, 0.01) 'pts(0, i - 1) + 10000000 * Epsilon, pts(1, i - 1) + 100000 * Epsilon, pts(2, i - 1) + 100000 * Epsilon)
1569 skSeg.ConstructionGeometry = True ' ligne de construction
1570 swModel.ClearSelection2(True)
1571 ' x et y doit être sélectionné sur un point avec un T inférieur au point d'intersection
1572 SlyArete1.Evaluer((Pts(3, i - 1) + Pts(3, i)) / 2, x, y, z)
1573 vretval = swSketch.GetSketchSegments
1574 useEdge = vretval(0) : m = 0
1575 Do Until useEdge.ConstructionGeometry = False
1576 m += 1
1577 useEdge = vretval(m)
1578 Loop
1579 useEdge.Select4(False, Nothing)
1580 swModel.SketchTrim(1, 0, x, y) ' option = 1 pour trim, selEnd est pas utilisé ?, puis un point x et Y pour sélectionner. et y'a pas de Z????? c'est un sketch3D!!!!!
1581 skSeg = swModel.CreateLine2(0, 0, 0, x, y, 0)
1582 skSeg.ConstructionGeometry = True
1583 End If
1584
1585 If i <> UBound(Pts, 2) - 1 Then 'Second(pick)
1586 skSeg = swModel.CreateLine2(Pts(0, i + 1), Pts(1, i + 1), Pts(2, i + 1), 0.05, 0, 0.01) 'pts(0, i + 1) + 10000000 * Epsilon, pts(1, i + 1) + 1000000 * Epsilon, pts(2, i + 1) + 100000 * Epsilon)
1587 skSeg.ConstructionGeometry = True ' ligne de construction
1588 swModel.ClearSelection2(True)
1589
1590 ' x et y doit être sélectionné sur un point avec un T inférieur au point d'intersection
1591 SlyArete1.Evaluer((Pts(3, i + 1) + Pts(3, i + 2)) / 2, x, y, z)
1592 vretval = swSketch.GetSketchSegments
1593 useEdge = vretval(0) : m = 0
1594 Do Until useEdge.ConstructionGeometry = False
1595 m += 1
1596 useEdge = vretval(m)
1597 Loop
1598
1599 useEdge.Select4(False, Nothing)
1600 swModel.SketchTrim(1, 0, x, y) ' option = 1 pour trim, selEnd est pas utilisé ?, puis un point x et Y pour sélectionner. et y'a pas de Z????? c'est un sketch3D!!!!!
1601 skSeg = swModel.CreateLine2(0, 0.02, 0, x, y, 0)
1602 skSeg.ConstructionGeometry = True
1603 End If
1604
1605 swModel.Insert3DSketch2(False)
1606 swEnt = swSketch : swEnt.Select2(False, 1) ' doit avoir un mark de 1
1607 swModel.InsertCompositeCurve()
1608 UpdateAttributs(SlyArete1, i)
1609 Next i
1610
1611 End If
1612
1613 ' tagger la vieille poutre pour ne pas la reprendre dans magic
1614 'Pour ça on ajoute un attribut pour ignorer...
1615 Dim nom As String
1616 Dim no As Integer
1617 Dim arete As SldWorks.Edge
1618
1619 arete = SlyArete1.swArete
1620 swEnt = arete
1621 nom = "Ignorer" & SlyArete1.nom & "_" & CStr(no)
1622 attr = swEnt.FindAttribute(Intersections.DefAttrRCP1, 0)
1623 'attr = DefAttrRCP1.CreateInstance5(swModel, arete, nom, 0, 2) ' une deuxième instance du RCPoutre...
1624 If attr Is Nothing Then
1625 Commun.ColorerAretes()
1626 swEnt = SlyArete1.swArete
1627 attr = swEnt.FindAttribute(Intersections.DefAttrRCP1, 0)
1628 End If
1629
1630 Dim p As SldWorks.Parameter
1631 p = attr.GetParameter("D1")
1632 p.SetDoubleValue(-9)
1633 p = attr.GetParameter("D2")
1634 p.SetDoubleValue(-9)
1635 p = attr.GetParameter("D3")
1636 p.SetDoubleValue(-9)
1637 p = attr.GetParameter("D4")
1638 p.SetDoubleValue(-9)
1639
1640 If attr Is Nothing Then MsgBox("Pas marché")
1641
1642
1643 End If
1644 Next SlyArete1
1645
1646
1647 End Sub
1648
1649
1650 Private Sub UpdateAttributs(ByRef slyarete1 As SlyAretePoutre, ByRef i As Integer)
1651 Dim newArete As SldWorks.Edge
1652 Dim refcurve As SldWorks.ReferenceCurve
1653 Dim attr As SldWorks.Attribute
1654 Dim swfeat As SldWorks.Feature
1655
1656 swfeat = swModel.FeatureByPositionReverse(0)
1657
1658 refcurve = swfeat.GetSpecificFeature2()
1659 newArete = refcurve.GetFirstSegment()
1660
1661 Dim ParamM As SldWorks.Parameter
1662 Dim ParamS As SldWorks.Parameter
1663 Dim ParamI1 As SldWorks.Parameter
1664 Dim ParamI2 As SldWorks.Parameter
1665 Dim ParamD1 As SldWorks.Parameter
1666 Dim ParamD2 As SldWorks.Parameter
1667 Dim ParamD3 As SldWorks.Parameter
1668 Dim ParamD4 As SldWorks.Parameter
1669 Dim ParamD5 As SldWorks.Parameter
1670 Dim ParamD6 As SldWorks.Parameter
1671 Dim ParamAs As SldWorks.Parameter
1672 Dim ParamN3 As SldWorks.Parameter
1673
1674 attr = Intersections.DefAttrRCP1.CreateInstance5(swModel, newArete, "Nouveau" & i & slyarete1.nom, 0, 2)
1675
1676 ParamM = attr.GetParameter("M")
1677 ParamS = attr.GetParameter("S")
1678 ParamI1 = attr.GetParameter("I1")
1679 ParamI2 = attr.GetParameter("I2")
1680 ParamD1 = attr.GetParameter("D1")
1681 ParamD2 = attr.GetParameter("D2")
1682 ParamD3 = attr.GetParameter("D3")
1683 ParamD4 = attr.GetParameter("D4")
1684 ParamD5 = attr.GetParameter("D5")
1685 ParamD6 = attr.GetParameter("D6")
1686 ParamAs = attr.GetParameter("As")
1687
1688 ParamM.SetStringValue2(slyarete1.GetM, 2, "") ' swAllConfiguration = 2
1689 ParamS.SetStringValue2(slyarete1.GetSection, 2, "")
1690 ParamI1.SetDoubleValue2(slyarete1.GetInertieXX, 2, "")
1691 ParamI2.SetDoubleValue2(slyarete1.GetInertieYY, 2, "")
1692 ParamD1.SetDoubleValue2(slyarete1.GetD1, 2, "")
1693 ParamD2.SetDoubleValue2(slyarete1.GetD2, 2, "")
1694 ParamD3.SetDoubleValue2(slyarete1.GetD3, 2, "")
1695 ParamD4.SetDoubleValue2(slyarete1.GetD4, 2, "")
1696 ParamD5.SetDoubleValue2(slyarete1.GetD5, 2, "")
1697 ParamD6.SetDoubleValue2(slyarete1.GetD6, 2, "")
1698 ParamAs.SetDoubleValue2(slyarete1.GetAireSection, 2, "")
1699
1700 Dim p As SldWorks.Parameter
1701 p = attr.GetParameter("N3")
1702 p.SetStringValue(slyarete1.GetN3)
1703 p = attr.GetParameter("X3")
1704 p.SetDoubleValue2(slyarete1.X3, 2, "")
1705 p = attr.GetParameter("Y3")
1706 p.SetDoubleValue2(slyarete1.Y3, 2, "")
1707 p = attr.GetParameter("Z3")
1708 p.SetDoubleValue2(slyarete1.Z3, 2, "")
1709
1710 Commun.GererDossiers("Poutres", "Nouveau" & i & slyarete1.nom)
1711
1712 End Sub
1713
1714
1715
1716
1717 ''' <summary>
1718 ''' sub qui gère la détection des intersections entre les coques et les volumes.
1719 ''' </summary>
1720 ''' <remarks></remarks>
1721 Private Sub DetectionCoqueVolume()
1722
1723 ' détection de coque-coque
1724 Dim Face1 As SlyFaceVolume
1725 Dim coque2 As SlyFaceCoque
1726 Dim sketch As SldWorks.Sketch = Nothing
1727 Dim interFF As InterCoqueVolume
1728
1729 For Each Face1 In Commun.lst_FaceVolume
1730 For Each coque2 In lst_FaceCoque
1731
1732 If DetectFaceFace(coque2, Face1, True, sketch) Then
1733 ' création de l'instance de interFace-face entre coque et coque
1734
1735
1736 interFF = New InterCoqueVolume
1737 interFF.sFaceVolume = Face1
1738 interFF.sFaceCoque = coque2
1739 If coque2.PossedeFaceDeSection = True Then
1740 interFF.FaceDeSection = True
1741 Verifier_Coque_Section(interFF)
1742 Else
1743 interFF.FaceDeSection = False
1744 End If
1745 interFF.sketch = sketch
1746 coque2.lst_InterCoqueVolume.Add(interFF)
1747 End If
1748
1749 Next
1750 Next
1751
1752
1753
1754
1755 End Sub
1756
1757 ''' <summary>
1758 ''' Sub qui fait les 6 vérifications pour le type d'intersection où la coque est partiellement dessinée en 3D.
1759 ''' En profite également pour remettre à jour la proriété de l'épaisseur de la coque
1760 ''' </summary>
1761 ''' <param name="interFF">L'intersection</param>
1762 ''' <remarks>On fait au total 6 vérifications</remarks>
1763 Private Sub Verifier_Coque_Section(ByRef interFF As InterCoqueVolume)
1764 Dim sFaceCoque As SlyFaceCoque
1765 Dim sFaceVol As SlyFaceVolume
1766 Dim swFace1 As SldWorks.Face2
1767 Dim swent As SldWorks.Entity
1768
1769 sFaceCoque = interFF.sFaceCoque
1770 sFaceVol = interFF.sFaceVolume
1771
1772 ' 1 - vérifier que la face du volume est plane
1773 If Not sFaceVol.estPlan Then
1774 Err.Raise(513, "Verifier_Coque_Section", "La face représentant la section de la coque n'est pas plane...")
1775 End If
1776
1777 ' 1.5 - La face du volume a 4 courbes, 2 petites de même longueur et 2 longues
1778 ' 1.6 ou qu'elle est une courbe fermée avec 2 loop d'une seule arète chaque.
1779 Dim vEdges As Object
1780 Dim Aretes() As SldWorks.Edge
1781 Dim longueur(3) As Double
1782 Dim i As Integer
1783 Dim a As SldWorks.Edge
1784 ReDim Aretes(0)
1785
1786 swFace1 = sFaceVol.SwFace
1787
1788 vEdges = swFace1.GetEdges()
1789 For Each a In vEdges
1790 ReDim Preserve Aretes(i)
1791 Aretes(i) = a
1792 i += 1
1793 Next
1794
1795 If UBound(Aretes) = 3 Then
1796 For i = 0 To 3
1797 longueur(i) = Commun.GetLongueurArete(Aretes(i))
1798 Next i
1799 longueur = Ordonner(longueur, Aretes)
1800 If Not Math.Abs(longueur(0) - longueur(1)) < Epsilon Then
1801 swent = swFace1 : swent.Select2(False, 0)
1802 Err.Raise(514, "Verifier_Coque_Section", "La face du volume représentant la coque n'a pas 2 petites arètes de la même longueur, ce n'est pas normal. La face a problème a été sélectionée")
1803 End If
1804
1805 ElseIf UBound(Aretes) = 1 Then ' la coque représente un cylindre (ou un autre truc fermé)
1806 If Not swFace1.GetLoopCount = 2 Then
1807 swent = swFace1 : swent.Select2(False, 0)
1808 Err.Raise(514, "Verifier_Coque_Section", "La face du volume représentant la coque n'a pas 2 ou 4 arêtes ou n'est pas correcte... La face a problème a été sélectionée")
1809 End If
1810 Else
1811 swent = swFace1 : swent.Select2(False, 0)
1812 Err.Raise(514, "Verifier_Coque_Section", "La face du volume représentant la coque n'a pas 2 ou 4 arêtes. La face a problème a été sélectionée")
1813 End If
1814
1815 ' 2 - Vérifier que la ligne est plane, mais ça je ne sais pas comment
1816
1817 ' 3 - Perpendiculaire
1818 ' ok, on va chercher le midpoint de la ligne et on demande la normale à cette position des 2 faces. Puis on demande(l) 'angle entre les 2 normales...
1819
1820 Dim swArete As SldWorks.Edge
1821 Dim vmid As Object
1822 Dim mid() As Double = Nothing
1823 Dim T As Double
1824 Dim u() As Double, v() As Double
1825 Dim angle As Double
1826
1827 If interFF.AreteCoque Is Nothing Then interFF.QuelleAreteCoqueToucheVolume()
1828 swArete = interFF.AreteCoque
1829 T = Commun.GetTMilieu(swArete)
1830 vmid = swArete.Evaluate(T)
1831 mid = vmid
1832
1833 u = sFaceVol.GetNormale(mid(0), mid(1), mid(2))
1834 v = sFaceCoque.GetNormale(mid(0), mid(1), mid(2))
1835
1836 angle = Outils_Math.Angle2Vecteurs(u, v)
1837
1838 If Not Math.Abs(angle - Pi / 2) < (Epsilon * 10) Then
1839 sFaceVol.Selectionner(, False)
1840 sFaceCoque.Selectionner(, True)
1841 Err.Raise(515, "Verifier_Coque_Section", "La face de la coque n'est pas perpendiculaire à la face représentant sa section. Les faces fautives ont été sélectionées.")
1842 End If
1843
1844 ' 4 - vérifier que les 2 petites arètes sont coupées au milieu
1845
1846
1847 ' maintenant on update l'attribut de la coque, par chance, j'ai les coordonnées du point milieu...
1848 Dim epaisseur As Double
1849 Dim distance1 As Double, distance2 As Double
1850 Dim point1(2) As Double, point2(2) As Double
1851 Dim p As Object = Nothing, p2 As Object = Nothing
1852
1853 If UBound(Aretes) = 3 Then
1854 p = Aretes(2).GetClosestPointOn(mid(0), mid(1), mid(2))
1855 point1(0) = p(0) : point1(1) = p(1) : point1(2) = p(2)
1856 distance1 = Math.Sqrt((point1(0) - mid(0)) ^ 2 + (point1(1) - mid(1)) ^ 2 + (point1(2) - mid(2)) ^ 2)
1857
1858 p = Aretes(3).GetClosestPointOn(mid(0), mid(1), mid(2))
1859 point2(0) = p(0) : point2(1) = p(1) : point2(2) = p(2)
1860 distance2 = Math.Sqrt((point2(0) - mid(0)) ^ 2 + (point2(1) - mid(1)) ^ 2 + (point2(2) - mid(2)) ^ 2)
1861
1862 If Not Math.Abs(distance1 - distance2) < Epsilon Then
1863 Err.Raise(516, "Verifier_Coque_Section", "La distance n'est pas la même de chaque coté de la coque")
1864 Else
1865 epaisseur = distance1 * 2
1866 End If
1867
1868 ElseIf UBound(Aretes) = 1 Then ' on a des cercles
1869 epaisseur = swModel.ClosestDistance(Aretes(0), Aretes(1), p, p2)
1870 If epaisseur <= 0 Then MsgBox("Il y a un problème ici...")
1871 Else
1872 MsgBox("On ne doit jamias passer ici en principe")
1873 End If
1874
1875 sFaceCoque.SetAttributDeCoque(epaisseur)
1876
1877 End Sub
1878
1879 ''' <summary>
1880 ''' sub qui découpe une face en fonction des paramètres qu'on lui passe.
1881 ''' </summary>
1882 ''' <remarks></remarks>
1883 Private Sub DécouperCoqueVolume()
1884
1885 Dim coque1 As SlyFaceCoque
1886 Dim interFF As InterCoqueVolume
1887
1888 ' 1 - Pour toutes les coques
1889
1890 For Each coque1 In Commun.lst_FaceCoque
1891 For Each interFF In coque1.lst_InterCoqueVolume
1892 If interFF.FaceDeSection Then
1893 CoupeCoque1(interFF)
1894 Else
1895 interFF.GénérerSweep() ' étape 4
1896 interFF.DécouperVolume() ' étape 5
1897 If interFF.DoitCouperCoque Then ' on découpe aussi couper la coque selon le sweep
1898 interFF.DecouperCoque()
1899 interFF.QuelleAreteCoqueToucheVolume(True)
1900 Else
1901 interFF.QuelleAreteCoqueToucheVolume(False)
1902 End If
1903 If interFF.DerniereCoupe Then interFF.DecouperCoque()
1904 interFF.MarquerFacesInternes() ' étape 6
1905
1906 End If
1907 Next
1908 Next coque1
1909
1910
1911 End Sub
1912
1913
1914
1915 ''' <summary>
1916 ''' Lorsque la coque est modélisée en partie par un morceau de volume. Dessine et coupe.
1917 ''' </summary>
1918 ''' <param name="int">L'interFaceFace</param>
1919 ''' <remarks></remarks>
1920 Private Sub CoupeCoque1(ByRef int As InterCoqueVolume)
1921 Dim sCoque As SlyFaceCoque
1922 Dim sVol As SlyFaceVolume
1923 Dim swFace As SldWorks.Face2
1924 Dim swent As SldWorks.Entity
1925 Dim sketch As SldWorks.Sketch
1926 Dim vEdges As Object
1927 Dim swArete As SldWorks.Edge
1928 Dim aretes() As SldWorks.Edge = Nothing
1929 Dim i As Integer
1930
1931 ' a - prendre la face du volume
1932 sVol = int.sFaceVolume
1933 swFace = sVol.SwFace
1934 sVol.Selectionner(0, False)
1935
1936 ' b - lui mettre une esquisse
1937 swModel.InsertSketch2(True)
1938
1939 ' c - convertir l'esquisse déjà créée
1940 sketch = int.sketch
1941 swent = sketch
1942 swent.Select2(False, 0)
1943
1944 swModel.SketchUseEdge2(False)
1945
1946 ' si la face est carrée
1947
1948 If swFace.GetEdgeCount = 4 Then
1949 ' d - ajouter des lignes pour compléter l'esquisse
1950 Dim longueur(3) As Double
1951
1952
1953 Dim vLine As Object
1954 Dim line1 As SldWorks.SketchLine, line2 As SldWorks.SketchLine
1955 Dim P1 As SldWorks.SketchPoint, P2 As SldWorks.SketchPoint, P3 As SldWorks.SketchPoint, P4 As SldWorks.SketchPoint
1956 Dim skSeg As SldWorks.SketchSegment
1957 vEdges = swFace.GetEdges()
1958 For Each swArete In vEdges
1959 ReDim Preserve aretes(i)
1960 aretes(i) = swArete
1961 i += 1
1962 Next
1963 For i = 0 To 3
1964 longueur(i) = Commun.GetLongueurArete(vEdges(i))
1965 Next i
1966 longueur = Ordonner(longueur, aretes)
1967
1968 swent = aretes(3) : swent.Select2(False, 0) ' on prend la plus grande arète
1969 swModel.SketchUseEdge2(False)
1970 sketch = swModel.GetActiveSketch()
1971 vLine = sketch.GetSketchSegments()
1972 skSeg = vLine(0) : line1 = skSeg
1973 skSeg = vLine(1) : line2 = skSeg
1974
1975 P1 = line1.GetStartPoint2()
1976 P2 = line1.GetEndPoint2()
1977 P3 = line2.GetStartPoint2()
1978 P4 = line2.GetEndPoint2()
1979
1980 If Distance(P1.X, P1.Y, P1.Z, P3.X, P3.Y, P3.Z) < Distance(P1.X, P1.Y, P1.Z, P4.X, P4.Y, P4.Z) Then ' ligne entre 1 et 3
1981 swModel.CreateLine2(P1.X, P1.Y, P1.Z, P3.X, P3.Y, P3.Z)
1982 swModel.CreateLine2(P2.X, P2.Y, P2.Z, P4.X, P4.Y, P4.Z)
1983 Else ' ligne entre 1 et 4 & 2 et 3
1984 swModel.CreateLine2(P1.X, P1.Y, P1.Z, P4.X, P4.Y, P4.Z)
1985 swModel.CreateLine2(P2.X, P2.Y, P2.Z, P3.X, P3.Y, P3.Z)
1986 End If
1987 Else
1988 sketch = swModel.GetActiveSketch()
1989 End If
1990 swModel.InsertSketch2(True)
1991
1992
1993 ' e - splitter
1994 swent = swFace : swent.Select2(False, 1)
1995 swent = sketch : swent.Select2(True, 4)
1996 swModel.InsertSplitLineProject(False, False)
1997
1998
1999 ' f - mettre un FaceInterne sur les 2 faces résultantes.
2000 Dim swFeat As SldWorks.Feature
2001 Dim vFace As Object
2002 Dim swFace1 As SldWorks.Face2, swFace2 As SldWorks.Face2
2003 Dim attr As SldWorks.Attribute
2004 Dim nom As String
2005 Dim no As Long
2006 swFeat = swModel.FeatureByPositionReverse(0)
2007 vFace = swFeat.GetFaces
2008
2009 swFace1 = vFace(0)
2010 swFace2 = vFace(1)
2011
2012 swent = swFace1
2013 attr = swent.FindAttribute(Intersections.DefAttrFaceInterne, 0) ' si l'attribut existe déjà on pointe dessus.
2014 nom = "FaceInterneCoque1"
2015 If attr Is Nothing Then attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, swFace1, nom, 0, 2) ' 0 = swThisconfig
2016
2017 While attr Is Nothing
2018 no += 1
2019 nom = "FaceInterneCoque" & CStr(no)
2020 attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, swFace1, nom, 0, 2)
2021 End While
2022 GererDossiers("FaceInternes", nom)
2023
2024 swent = swFace2
2025 attr = swent.FindAttribute(Intersections.DefAttrFaceInterne, 0) ' si l'attribut existe déjà on pointe dessus.
2026 nom = "FaceInterneCoque1"
2027 If attr Is Nothing Then attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, swFace2, nom, 0, 2) ' 0 = swThisconfig
2028
2029 While attr Is Nothing
2030 no += 1
2031 nom = "FaceInterneCoque" & CStr(no)
2032 attr = Intersections.DefAttrFaceInterne.CreateInstance5(swModel, swFace2, nom, 0, 2)
2033 End While
2034 GererDossiers("FaceInternes", nom)
2035
2036
2037 End Sub
2038
2039
2040 ''' <summary>
2041 ''' Détecte s'il y a une intersection entre une coque et une face d'un volume
2042 ''' </summary>
2043 ''' <param name="sFaceCoque"></param>
2044 ''' <param name="sFaceVolume"></param>
2045 ''' <param name="dessiner">Si oui, alors on dessine une ligne à l'intersection</param>
2046 ''' <param name="sketch">Si dessiner est vrai, alors ce sketch contient la ligne d'intersection</param>
2047 ''' <returns>Vrai s'il y a une intersection</returns>
2048 ''' <remarks></remarks>
2049 Private Function DetectFaceFace(ByRef sFaceCoque As SlyFaceCoque, ByRef sFaceVolume As SlyFaceVolume, Optional ByRef dessiner As Boolean = False, Optional ByRef sketch As SldWorks.Sketch = Nothing) As Boolean
2050 For Each swfc As SldWorks.Face2 In sFaceCoque.lst_Faces
2051 For Each swFV As SldWorks.Face2 In sFaceVolume.lst_Faces
2052 If DetectFaceFace(swfc, swFV, dessiner, sketch) Then Return True
2053 Next
2054 Next
2055 End Function
2056
2057
2058 ''' <summary>
2059 ''' Function qui retourne vrai ou faux si 2 FACES (pas surfaces) se touchent. La routine finit par appeler la sub dessinecourbe pour dessiner la courbe.
2060 ''' </summary>
2061 ''' <param name="face1">Première face</param>
2062 ''' <param name="face2">Seconde face</param>
2063 ''' <param name="dessiner">Si l'on veut dessiner une esquisse contenant la courbe</param>
2064 ''' <param name="Sketch">Si la première option est vrai, ce paramètre redonne l'esquisse qui contient la courbe</param>
2065 ''' <returns>Vrai si les faces se touchent</returns>
2066 ''' <remarks>Si les 2 faces se touchent en un seul point alors ça retourne faux.</remarks>
2067 Private Function DetectFaceFace(ByRef face1 As SldWorks.Face2, ByRef face2 As SldWorks.Face2, Optional ByRef dessiner As Boolean = False, Optional ByRef Sketch As SldWorks.Sketch = Nothing) As Boolean
2068 ' sub qui détecte si 2 faces se touchent et retourne vrai si c'est le cas.
2069 Dim Surface1 As SldWorks.Surface
2070 Dim Surface2 As SldWorks.Surface
2071 Dim curveArray As Object = Nothing
2072 Dim curve As SldWorks.Curve
2073 Dim ret As Boolean
2074 Dim boundsArray As Object = Nothing
2075 Dim bounds() As Double
2076 Dim Point1(2) As Double
2077 Dim Point2(2) As Double
2078 Dim P1 As Object = Nothing, P2 As Object = Nothing
2079 Dim ClosestDist As Double
2080
2081 Surface1 = face1.GetSurface
2082 Surface2 = face2.GetSurface
2083
2084 ClosestDist = swModel.ClosestDistance(face1, face2, P1, P2)
2085 If ClosestDist > (Epsilon * 10) Then Return False
2086
2087 ' curvearray est un tableau de curves, boundsarray est un tableau de T des limites de la courbe
2088 ret = Surface1.IntersectSurface(Surface2, curveArray, boundsArray) ' si c'est une ligne, retourne une ligne infinie...
2089 ' il faut alors renvoyer vers le detectFaceArete()
2090 If Not ret Then Return False
2091 bounds = boundsArray
2092
2093 'On Error GoTo faceSurFace
2094 Try
2095 curve = curveArray(0)
2096 Catch
2097 Debug.Write("On a une intersection où 2 faces sont sur la même surface...")
2098 Return False ' ouch... pas certain.
2099 End Try
2100
2101
2102 If Not curve.IsLine Then ' si c'est une ligne, alors le principe de longueur ne fonctionnera pas...
2103 Dim longueur As Double = curve.GetLength2(bounds(0), bounds(1))
2104 If longueur < Epsilon Then Return False ' on a juste un point d'intersection
2105 Else
2106 Dim vParam As Object
2107 vParam = curve.GetClosestPointOn(P1(0), P1(1), P1(2)) ' vparam(3) est le U
2108
2109 P1 = curve.Evaluate(vParam(3) + 100 * Epsilon) : Point1 = P1
2110 P2 = curve.Evaluate(vParam(3) - 100 * Epsilon) : Point2 = P2
2111
2112 If (Distance(face1, Point1(0), Point1(1), Point1(2)) < Epsilon) And (Distance(face2, Point1(0), Point1(1), Point1(2)) < Epsilon) Then
2113 ElseIf (Distance(face1, Point2(0), Point2(1), Point2(2)) < Epsilon) And (Distance(face2, Point2(0), Point2(1), Point2(2)) < Epsilon) Then
2114 Else
2115 Return False
2116 End If
2117 End If
2118
2119
2120
2121 If dessiner Then
2122 Dim swent As SldWorks.Entity
2123 Dim feat As SldWorks.Feature
2124 swModel.Insert3DSketch2(False)
2125
2126 swent = face1 : swent.Select2(False, 0)
2127 swent = face2 : swent.Select2(True, 0)
2128 swModel.Sketch3DIntersections()
2129
2130 swModel.Insert3DSketch2(False)
2131 swModel.EditRebuild3()
2132 feat = swModel.FeatureByPositionReverse(0)
2133
2134 Sketch = feat.GetSpecificFeature2
2135 End If
2136
2137 Return True
2138 'If curve.IsTrimmedCurve = False And curve.IsLine Then ' si c'est une ligne, alors l'enfoirée est de longueur infinie. courbe spline... pas de problèmes.
2139
2140 ' Dim vEdge As Object, swAreteTest As SldWorks.Edge, xyz() As Double = Nothing, n As Integer
2141 ' Dim lst_T() As Double = Nothing, final() As Double
2142 ' Dim NewCourbe As SldWorks.Curve
2143
2144 ' For n = 1 To 2
2145 ' If n = 1 Then vEdge = face1.GetEdges() Else vEdge = face2.GetEdges()
2146 ' For f = 0 To UBound(vEdge)
2147 ' swAreteTest = vEdge(f)
2148 ' If DetectAreteArete(swAreteTest, curve, xyz) Then
2149
2150 ' If Not UBound(xyz) > 4 Then
2151 ' vT = curve.GetClosestPointOn(xyz(0), xyz(1), xyz(2))
2152 ' T = vT(3)
2153
2154 ' If lst_T Is Nothing Then ReDim lst_T(0) Else ReDim Preserve lst_T(UBound(lst_T) + 1)
2155 ' lst_T(UBound(lst_T)) = T
2156 ' End If
2157 ' End If
2158 ' Next f
2159 ' Next n
2160
2161 ' final = trier(lst_T)
2162
2163 ' For i = 0 To UBound(final) Step 2
2164 ' Dim skseg As SldWorks.SketchSegment, angle As Double
2165
2166 ' Point1 = curve.Evaluate(final(i)) : Point2 = curve.Evaluate(final(i + 1))
2167 ' NewCourbe = curve.CreateTrimmedCurve2(Point1(0), Point1(1), Point1(2), Point2(0), Point2(1), Point2(2))
2168 ' If dessiner Then skseg = Commun.DessineCourbe(NewCourbe) : Sketch = skseg.GetSketch
2169 ' angle = AngleEntre2Faces(face1, face2, Point1) / 0.0174532925
2170
2171 ' 'swApp.SendMsgToUser(" Courbe Droite " & angle)
2172 ' Next
2173
2174 'ElseIf curve.IsTrimmedCurve = False Then ' courbe périodique... donc pas trimmée mais avec des bounds...
2175 ' If dessiner Then
2176 ' Commun.DessineCourbe(curve)
2177 ' Sketch = swModel.FeatureByPositionReverse(0)
2178 ' End If
2179
2180
2181 'Else
2182 ' If dessiner Then
2183 ' Commun.DessineCourbe(curve)
2184 ' Sketch = swModel.FeatureByPositionReverse(0)
2185 ' End If
2186 'End If
2187
2188 'Return True
2189 faceSurFace: ' les 2 surfaces sont une sur l'autre...
2190 'Dim swent As SldWorks.Entity
2191 'Dim swent2 As SldWorks.Entity
2192 'swent = face1 : swent.Select2(False, 0)
2193 'swent2 = face2 : swent2.Select2(True, 0)
2194 'MsgBox("2 Faces avec une surface commune...")
2195 'Return True
2196 End Function
2197
2198
2199 Public Function trier(ByRef lst() As Double) As Double()
2200 ' sub qui retourne les T min et T max en fonction de la collection.
2201 ' normalement on enlève les 2 points max et min et il devrait nous rester un nombre pair de valeurs.
2202 Dim i As Integer, j As Integer
2203 Dim lst2() As Double
2204
2205 Dim temp As Double
2206
2207 If UBound(lst) < 1 Then Return Nothing
2208
2209 For j = 0 To UBound(lst) - 1
2210 For i = 0 To UBound(lst) - j - 1
2211 If lst(i) > lst(i + 1) Then
2212 temp = lst(i)
2213 lst(i) = lst(i + 1)
2214 lst(i + 1) = temp
2215 End If
2216 Next i
2217 Next j
2218
2219 ReDim lst2(UBound(lst) - 2)
2220 For i = 1 To UBound(lst) - 1
2221 lst2(i - 1) = lst(i)
2222 Next
2223 Return lst2
2224
2225
2226
2227 End Function
2228
2229 ''' <summary>
2230 ''' Function qui remet en ordre croissant les valeurs d'un tableau
2231 ''' </summary>
2232 ''' <param name="lst">Le tableau de valeurs à ordonner</param>
2233 ''' <param name="liste2">un second tableau que l'on peut ordonner</param>
2234 ''' <returns></returns>
2235 ''' <remarks></remarks>
2236 Public Function Ordonner(ByRef lst() As Double, Optional ByRef liste2() As SldWorks.Edge = Nothing) As Double()
2237
2238 Dim i As Integer, j As Integer
2239 Dim temp2 As Object
2240
2241 Dim temp As Double
2242
2243 If UBound(lst) < 1 Then Return Nothing
2244
2245 For j = 0 To UBound(lst) - 1
2246 For i = 0 To UBound(lst) - j - 1
2247 If lst(i) > lst(i + 1) Then
2248 temp = lst(i)
2249 lst(i) = lst(i + 1)
2250 lst(i + 1) = temp
2251 If Not liste2 Is Nothing Then
2252 temp2 = liste2(i)
2253 liste2(i) = liste2(i + 1)
2254 liste2(i + 1) = temp2
2255 End If
2256
2257 End If
2258 Next i
2259 Next j
2260
2261 Return lst
2262
2263
2264
2265 End Function
2266
2267
2268
2269
2270 End Module