ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Intersections.vb
Revision: 46
Committed: Wed Aug 22 18:28:53 2007 UTC (17 years, 8 months ago) by bournival
File size: 96214 byte(s)
Log Message:
Ajout de la page de pré-optimisation automatique et des modification que j'ai apportées.

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