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

# Content
1 Module Intersections
2 Public DefAttrInterALAL As SldWorks.AttributeDef
3 Public DefAttrConditionLimite As SldWorks.AttributeDef
4 Public DefAttrRCP1 As SldWorks.AttributeDef
5 Public DefAttrRCCoque As SldWorks.AttributeDef
6 Public DefAttrFaceInterne As SldWorks.AttributeDef
7 Public DefAttrDoublon As SldWorks.AttributeDef
8 Public DefAttrIgnorer As SldWorks.AttributeDef
9
10 Public nbMinipoutre As Long
11
12
13
14 #Region "Enums"
15 Public Enum typeInterPoutreVolume
16 Centre = 0
17 Sur_arete = 1
18 Sur_sommet = 2
19 Courbe = 3
20 End Enum
21
22 #End Region
23
24
25 Public Sub Debuter(Optional ByRef nom2 As String = "C:\Documents and Settings\Sylvain Bournival\Bureau\testMAGiC.sldprt", Optional ByVal nomFichier As String = "", Optional ByRef original As Boolean = True, Optional ByRef modifie As Boolean = True)
26
27 ' *******
28 ' quelques options de performance
29 ' *******
30 swApp.SetUserPreferenceIntegerValue(SwConst.swUserPreferenceIntegerValue_e.swAutoSaveInterval, 0)
31 swModel.SetAddToDB(True)
32 swModel.SetDisplayWhenAdded(False)
33 ' ******
34 ' fin des options de performance
35 ' ******
36
37 Memoriser3iemePoint() ' mémorise le coord system car si on découpe, sa coordonnée est perdue.
38 CouperPoutres()
39 Commun.GenererListes() ' va ignorer les poutres à ignorer... et ajouter les poutres coupées dans la liste.
40
41
42
43 ' Traitement des intersection poutres-Volumes
44 DetectionPoutresVolumes()
45 DecouperPoutreVolume()
46 ' fin traitement intersection poutres-volumes
47
48 swModel.EditRebuild3()
49
50
51
52 ' Traitement des intersection entre poutre et coques
53 DetectionPoutresCoques()
54 DecouperPoutreCoque()
55 ' Fin du traitement des intersections entre poutre et coques
56
57
58 ' traitement des coques-volumes
59 DetectionCoqueVolume()
60 DécouperCoqueVolume()
61 ' fin traitement coque volume
62
63 ' traitement des coques-coques
64 DetectionCoqueCoque()
65 DecouperCoqueCoque()
66 '
67
68
69
70 ' *******
71 ' quelques options de performance, remettre à la position initiale
72 ' *******
73 swApp.SetUserPreferenceIntegerValue(SwConst.swUserPreferenceIntegerValue_e.swAutoSaveInterval, 15)
74 swModel.SetAddToDB(False)
75 swModel.SetDisplayWhenAdded(True)
76 swModel.GraphicsRedraw2()
77 ' ******
78 ' fin des options de performance
79 ' ******
80 ReplacerFolder()
81
82
83 End Sub
84
85
86 ''' <summary>
87 ''' Sub qui 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 ''' 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 Dim Coque1 As SlyFaceCoque, Coque2 As SlyFaceCoque
117
118 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 ' création de l'instance de interFace-face entre coque et coque
124
125 interCC = New InterCoqueCoque
126 interCC.sFaceCoque1 = Coque1
127 interCC.sFaceCoque2 = Coque2
128 interCC.FaceDeSection = False
129 interCC.sketch = sketch
130
131 Coque1.lst_InterCoqueCoque.Add(interCC)
132 Coque2.lst_InterCoqueCoque.Add(interCC)
133 End If
134
135 Next j
136 Next i
137
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