ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/Intersections.vb
Revision: 48
Committed: Wed Aug 22 21:18:12 2007 UTC (17 years, 8 months ago) by bournival
File size: 96320 byte(s)
Log Message:
On passe aux nouveaux .dll

File Contents

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