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

# User Rev Content
1 bournival 40 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