ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/SuperArete.vb
Revision: 205
Committed: Thu Jul 23 20:53:57 2009 UTC (15 years, 9 months ago) by bournival
File size: 37658 byte(s)
Log Message:
Commit de MAGiC_SLD pendant que j'y pense.  Les modifications ne devraient pas concerner personne d'autre que moi.   -- Sylvain

File Contents

# User Rev Content
1 bournival 48 Imports SolidWorks.Interop
2     Imports SolidWorks.Interop.swconst
3     Imports SolidWorks.Interop.swpublished
4    
5 bournival 40 Public Class SuperArete
6     Inherits SuperEntite
7     Public swArete As SldWorks.Edge
8     Private Shared compteur As Long
9     Private Shared no As Long
10    
11     Protected swCourbe As SldWorks.Curve
12    
13    
14     ''' <summary>
15     ''' Le new pour un encapsulateur de l'arète
16     ''' </summary>
17     ''' <param name="swArete"></param>
18     ''' <param name="encapsulateur"></param>
19     ''' <remarks></remarks>
20     Public Sub New(ByRef swArete As SldWorks.Edge, ByRef encapsulateur As Boolean)
21     Me.swArete = swArete
22     Me.swCourbe = swArete.GetCurve
23 bournival 130
24    
25 bournival 40 End Sub
26    
27 bournival 130
28    
29 bournival 48 Public Sub New(ByRef arete As SldWorks.Edge, Optional ByVal tip As Integer = 0)
30 bournival 40 Me.swArete = arete
31     Me.swCourbe = swArete.GetCurve
32     Select Case tip
33     Case Commun.tipe_e.Volume
34     nom = "Arete" & compteur
35     Case Commun.tipe_e.coque
36     nom = "AreteCoque" & compteur
37     Case Commun.tipe_e.poutre
38     nom = "AretePoutre" & compteur
39     Case Commun.tipe_e.MiniPoutre
40     nom = "Mini-Poutre" & compteur
41     End Select
42     nomOrig = nom
43     compteur = compteur + 1
44     End Sub
45    
46    
47     Public Overrides Sub SaveNom()
48     ' procédure qui enregistre le nom et qui , pour l'instant ne tient pas compte des conditions aux limites
49     Dim ent As SldWorks.Entity
50     ent = swArete
51     Dim retval As Boolean
52    
53     Try
54     retval = swPart.SetEntityName(ent, nom)
55     Catch
56 bournival 130
57    
58     Dim i As Integer
59     If retval = False Then
60     Do Until retval = True
61     i += 1
62     retval = swPart.SetEntityName(ent, nom & Chr(96 + i))
63     Loop
64     Me.nom = nom & Chr(96 + i)
65     'MsgBox("Impossibilité d'écrire le nom de l'entité... il y a déjà un nom." & Chr(13) & nom) ' MsgBox("Impossibilité d'écrire le nom de l'entité... il y a déjà un nom." & Chr(13) & nom, MsgBoxStyle.Critical, "Problème dans le setID de l'arrète")
66     End If
67     MsgBox("Le prog ne veut pas mettre le nom sur une entité.." & vbCr & "Le nom devrait être: " & nom) ' MsgBox("Le prog ne veut pas mettre le nom sur une entité.." & vbCr & "Le nom devrait être: " & nom)
68 bournival 40 End Try
69     End Sub
70    
71     Shared Sub reinitialiser()
72     compteur = 0
73     End Sub
74    
75     Public Function GetOrientation(ByRef T As Double) As Double()
76     'retval = Edge.Evaluate ( Parameter) retval est un tableau, 4,5 et 6 sont les tangentes au point...
77    
78     Dim temp(2) As Double
79     Dim retval As Object
80    
81     retval = Me.swArete.Evaluate(T)
82    
83     temp(0) = retval(3)
84     temp(1) = retval(4)
85     temp(2) = retval(5)
86    
87     Return temp
88    
89     End Function
90    
91     Public Function GetOrientation(ByRef x As Double, ByRef y As Double, ByRef z As Double) As Double()
92     Dim retval As Object
93     retval = Me.swArete.GetClosestPointOn(x, y, z)
94     Return GetOrientation(retval(3))
95     End Function
96    
97    
98    
99     Public Sub MettreAttributPourConditionLimite()
100     Dim swent As SldWorks.Entity
101     Dim nom As String
102     Dim cond As String
103    
104     cond = Me.condition
105     If cond = "" Then Exit Sub
106    
107     swent = Me.swArete
108    
109     nom = "CL" & CStr(no) & "_" & cond
110     Dim Attr As SldWorks.Attribute = Nothing
111    
112     Try
113     Attr = swent.FindAttribute(Intersections.DefAttrConditionLimite, 0) ' si l'attribut existe déjà on pointe dessus.
114     Catch ex As Exception
115     MsgBox("N'arrive pas à se lier à l'attribut, erreur: " & ex.Message, MsgBoxStyle.Critical)
116     End Try
117    
118     ' si nothing c'est que l'attribut n'existe pas
119     If Attr Is Nothing Then Attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, Me.swArete, nom, 0, 2) ' 0 = swThisconfig, 2 = allconfig
120    
121     While Attr Is Nothing
122     no += 1
123     nom = "CL" & CStr(no) & "_" & cond
124     Attr = Intersections.DefAttrConditionLimite.CreateInstance5(swModel, Me.swArete, nom, 0, 2)
125     End While
126    
127     Dim ParamCL As SldWorks.Parameter
128     ParamCL = Attr.GetParameter("CL")
129    
130     ParamCL.SetStringValue2(cond, 2, "") ' swAllConfiguration = 2
131    
132     GererDossiers("Conditions Aux Limites", nom)
133     no = no + 1
134    
135     End Sub
136    
137    
138     ' une fonction qui transforme un attribut en condition aux limites
139     Public Sub AttributVersConditionLimite()
140     Dim p As SldWorks.Parameter
141     Dim ent As SldWorks.Entity
142     Dim attr As SldWorks.Attribute
143    
144     ent = Me.swArete
145     attr = ent.FindAttribute(Intersections.DefAttrConditionLimite, 0)
146     If Not attr Is Nothing Then
147     p = attr.GetParameter("CL")
148     nom = nomOrig & "@" & p.GetStringValue
149     End If
150    
151     End Sub
152    
153    
154     Public Function GetSwSommets() As SldWorks.Vertex()
155     Dim swsommet(1) As SldWorks.Vertex
156     swsommet(0) = Me.swArete.GetStartVertex()
157     If swsommet(0) Is Nothing Then Return Nothing
158     swsommet(1) = Me.swArete.GetEndVertex
159     Return swsommet
160     End Function
161    
162     Public Overrides Sub Selectionner(Optional ByVal Mark As Integer = 0, Optional ByRef Append As Boolean = True)
163     Dim swent As SldWorks.Entity
164     swent = swArete
165     swent.Select2(Append, Mark)
166     End Sub
167    
168    
169    
170     ''' <summary>
171     ''' Renvoie les coordonnées du point milieu
172     ''' </summary>
173     ''' <returns></returns>
174 bournival 130 ''' <remarks>Attention: Ce sont les coordonnées du point à T milieu, ce qui n'est pas nécessairement le milieu de l'arète dans le cas de b-spline </remarks>
175     Public Function GetPointMilieu(Optional ByVal Reverse As Boolean = False) As Double()
176 bournival 40 Dim T As Double
177     Dim xyz(2) As Double
178 bournival 130 T = Me.GetTMilieu(Reverse)
179 bournival 40 Me.Evaluer(T, xyz)
180     Return xyz
181     End Function
182    
183     ''' <summary>
184     ''' Renvoie les coordonnées du point milieu
185     ''' </summary>
186 bournival 130 ''' <returns>Faux si le sommet n'existe pas</returns>
187 bournival 40 ''' <remarks></remarks>
188 bournival 130 Public Function GetPointMilieu(ByRef x As Double, ByRef y As Double, ByRef z As Double, Optional ByVal Reverse As Boolean = False) As Boolean
189 bournival 40 Dim T As Double
190 bournival 130 T = Me.GetTMilieu(Reverse)
191 bournival 40 Me.Evaluer(T, x, y, z)
192     Return True
193     End Function
194    
195    
196    
197    
198     ''' <summary>
199     ''' Détermine si une courbe est une ligne
200     ''' </summary>
201     ''' <returns>Vrai si la courbe est une ligne</returns>
202     ''' <remarks></remarks>
203     Public Function IsLine() As Boolean
204 bournival 130
205     Dim ev As Object = Me.swArete.Evaluate(0.2)
206     Dim cr As sldworks.Curve = Me.swArete.GetCurve
207    
208 bournival 40 Try
209 bournival 130 Dim swCourbe As sldworks.Curve = Me.swArete.GetCurve
210     Select Case swCourbe.Identity()
211    
212     Case swconst.swCurveTypes_e.LINE_TYPE
213     Return True
214    
215     Case Else
216     Return False
217     End Select
218    
219 bournival 40 Catch
220 bournival 130 ' on a un drole de type de courbe... on ne peut dire si c'est une ligne ou autre...
221     Try
222     Dim swCourbe2 As sldworks.Curve = swCourbe.GetBaseCurve
223     Select Case swCourbe2.Identity()
224    
225     Case swconst.swCurveTypes_e.LINE_TYPE
226     Return True
227    
228     Case Else
229     Return False
230     End Select
231     Catch ex As Exception
232    
233     End Try
234    
235    
236     Return False
237 bournival 40 End Try
238    
239     End Function
240    
241 bournival 130
242 bournival 40 ''' <summary>
243 bournival 130 ''' Retourne vrai si la courbe est fermée
244     ''' </summary>
245     ''' <value></value>
246     ''' <returns></returns>
247     ''' <remarks></remarks>
248     Public ReadOnly Property IsClosed() As Boolean
249     Get
250     If Me.swArete.GetStartVertex Is Nothing Then Return False Else Return True
251     End Get
252     End Property
253    
254     ''' <summary>
255 bournival 40 ''' Détermine si la courbe est un cercle
256     ''' </summary>
257     ''' <returns>Vrai si la courbe est un cercle</returns>
258     ''' <remarks></remarks>
259     Public Function IsCircle() As Boolean
260 bournival 130
261 bournival 40 Try
262    
263 bournival 130 If Me.swCourbe.IsLine Then Return False
264 bournival 40 Return Me.swCourbe.IsCircle
265     Catch ex As Exception
266 bournival 130 Dim fault As sldworks.FaultEntity = Me.swArete.Check
267 bournival 40 Debug.WriteLine("N'arrive pas à déterminer si la courbe est un cercle" & vbCr & "FaultEntity.Count = " & IIf(fault Is Nothing, "0", fault.Count) & vbCr & Me.nom)
268 bournival 130
269     Try
270     If swCourbe.Identity() = swconst.swCurveTypes_e.CIRCLE_TYPE Then Return True Else Return False
271    
272     Catch
273     Debug.Print("Même merde que pour la ligne, le lien entre la courbe et le pointeur se perd par magie!")
274     End Try
275    
276 bournival 40 Return False
277     End Try
278    
279     End Function
280    
281     ''' <summary>
282     ''' Détermine si la courbe est une B-Spline
283     ''' </summary>
284     ''' <returns></returns>
285     ''' <remarks>Vrai si la courbe est une b-spline</remarks>
286     Public Function IsBcurve() As Boolean
287     Try
288     Dim swCourbe As SldWorks.Curve = Me.swArete.GetCurve
289     If swCourbe.IsLine Then Return False
290     If swCourbe.IsCircle Then Return False ' le manuel dit de vérifier ça avant de demander pour une Spline...
291     Return swCourbe.IsBcurve()
292     Catch
293     Dim fault As SldWorks.FaultEntity = Me.swArete.Check
294     Debug.WriteLine("N'arrive pas à déterminer si la courbe est une spline" & vbCr & "FaultEntity.Count = " & IIf(fault Is Nothing, "0", fault.Count) & vbCr & Me.nom)
295     Return False
296     End Try
297     End Function
298    
299     ''' <summary>
300     ''' Détermine si la courbe est une ellipse
301     ''' </summary>
302     ''' <returns></returns>
303     ''' <remarks>Vrai si ellipse</remarks>
304     Public Function IsEllipse() As Boolean
305     Try
306     Dim swCourbe As SldWorks.Curve = Me.swArete.GetCurve
307     If swCourbe.IsLine Then Return False
308     Return swCourbe.IsEllipse
309     Catch
310     Dim fault As SldWorks.FaultEntity = Me.swArete.Check
311     Debug.WriteLine("N'arrive pas à déterminer si la courbe est une ellipse" & vbCr & "FaultEntity.Count = " & IIf(fault Is Nothing, "0", fault.Count) & vbCr & Me.nom)
312     End Try
313    
314     End Function
315    
316    
317     ''' <summary>
318     ''' Sub pour sélectionner l'arète dans la fenètre de solidworks
319     ''' </summary>
320     ''' <param name="Append"></param>
321     ''' <remarks></remarks>
322     Public Sub sélectionner(Optional ByVal Append As Boolean = False)
323     Dim swent As SldWorks.Entity
324     swent = Me.SwArete
325     swent.Select2(Append, 0)
326     End Sub
327    
328     ''' <summary>
329     ''' Sub qui colore une arète
330     ''' </summary>
331     ''' <param name="Largeur">La largeur de la ligne</param>
332     ''' <param name="Rouge">Le ton de rouge, entre 0 et 1</param>
333     ''' <param name="Vert">Le ton de vert, entre 0 et 1</param>
334     ''' <param name="Bleu">Le ton de bleu, entre 0 et 1</param>
335     ''' <remarks></remarks>
336     Public Sub Colorer(Optional ByVal Largeur As Integer = 2, Optional ByRef Rouge As Double = 1, Optional ByRef Vert As Double = 0, Optional ByRef Bleu As Double = 0)
337 bournival 48 swArete.Display(Largeur, Rouge, Vert, Bleu, True)
338 bournival 40 End Sub
339    
340    
341     ''' <summary>
342 bournival 130 ''' Sub qui met ou Update les paramètres des doublons des arètes. Une entité avec un attribut de doublon est ignoré par MAGiC
343 bournival 40 ''' </summary>
344     ''' <param name="Numero">Le numéro que l'on veut attribuer</param>
345     ''' <param name="Maitre">Si ce,st un maitre on met true</param>
346     ''' <param name="NomMaitre">Le nom du maitre si on le connait.</param>
347     ''' <remarks>Il faut toujours effacer l'attribut du maitreé... ou s'assurer que dans MAGiC on ignore "Inconnu"... De plus, si l'attribut existe déjà, le numéro devient innutile.</remarks>
348     Public Sub MettreAttributDoublon(Optional ByRef Numero As Integer = 0, Optional ByRef Maitre As Boolean = False, Optional ByRef NomMaitre As String = Nothing)
349     Dim attr As SldWorks.Attribute
350     Dim swent As SldWorks.Entity
351     Dim nom As String
352     Dim ParamMaitre As SldWorks.Parameter
353     Dim paramSens As SldWorks.Parameter
354     Dim sens As Double = -5
355    
356     'mettre un attribut et l'updater...
357     swent = Me.SwArete
358    
359     nom = "DoublonA_" & Format(Numero, "000")
360     If Maitre Then nom &= "Maitre" Else nom &= "Esclave"
361    
362     attr = swent.FindAttribute(Intersections.DefAttrDoublon, 0)
363    
364     Do While attr Is Nothing
365     nom = "DoublonA_" & Format(Numero, "000")
366     If Maitre Then nom &= "Maitre" Else nom &= "Esclave"
367 bournival 48 attr = Intersections.DefAttrDoublon.CreateInstance5(swModel, swArete, nom, 0, 2) ' 0 = swThisconfig
368 bournival 40 If attr Is Nothing Then Numero += 1
369     Loop
370    
371     ParamMaitre = attr.GetParameter("Maitre")
372 bournival 48 paramSens = attr.GetParameter("Sens")
373 bournival 40 If NomMaitre = Nothing Then
374     NomMaitre = "Inconnu"
375    
376     Else ' il faut mettre les attribut de doublons sur les sommets.
377     Dim swSommet1 As SldWorks.Vertex
378     Dim swSommet2 As SldWorks.Vertex
379    
380     swSommet1 = Me.SwArete.GetStartVertex()
381     If swSommet1 IsNot Nothing Then
382     swSommet2 = Me.SwArete.GetEndVertex
383     Dim esom1 As New SuperSommet(swSommet1, True)
384     Dim esom2 As New SuperSommet(swSommet2, True)
385     Dim premier As Boolean = False
386     Dim second As Boolean = False
387    
388     Dim SlySommetTest As SlySommetVolume
389    
390     For Each SlySommetTest In Commun.lst_SommetVolume
391 bournival 130 If Not premier AndAlso Distance(esom1.GetSommet, SlySommetTest.swSommet) < (10000 * Epsilon) Then ' on vient de trouver le sommet du volume
392 bournival 40 esom1.MettreAttributDoublonSommet(SlySommetTest.nom, SlySommetTest.swSommet)
393     premier = True
394 bournival 130 ElseIf Distance(esom2.GetSommet, SlySommetTest.swSommet) < (10000 * Epsilon) Then
395 bournival 40 esom2.MettreAttributDoublonSommet(SlySommetTest.nom, SlySommetTest.swSommet)
396     second = True
397     End If
398     If premier AndAlso second Then Exit For
399     Next
400    
401     End If
402    
403     ' trouver si le sens est le même, mettre 1 si oui, et -1 si non.
404     ' on met 1 si les 2 startvertex sont au même endroit, -1 si ce n'est pas le cas
405    
406 bournival 130 Dim a As SuperArete = Nothing
407     Dim trouve As Boolean = False
408 bournival 40 Dim som1 As SldWorks.Vertex, som2 As SldWorks.Vertex
409     For Each a In Commun.lst_AreteVolume
410 bournival 130 If a.nom = NomMaitre Then trouve = True : Exit For
411 bournival 40 Next
412 bournival 130
413     If Not trouve Then
414     For Each a In Commun.lst_AreteCoque
415     If a.nom = NomMaitre Then Exit For
416     Next
417     End If
418    
419    
420     som1 = Me.swArete.GetStartVertex
421 bournival 40 If som1 IsNot Nothing Then
422     som2 = a.swArete.GetStartVertex
423 bournival 130 If som2 Is Nothing Then a.Colorer(4, 0.5, 0, 0.5) : Me.Colorer(4, 1, 0, 1) : MsgBox(a.nom & " " & Me.nom & "Comparer = " & Me.comparer(a.swArete))
424 bournival 40 If Distance(som1, som2) < Epsilon Then sens = 1 Else sens = -1
425     Else ' wouch!, si on a une courbe fermée, comment on trouve le sens de l'arête maitre comparé à l'arète esclave.
426     ' si les 2 arètes sont une par-dessus l'autre, alors je prend le point à t=0 et le T du point équivalent sur l'arète esclave
427     ' si T+ deltaT = le même point sur l'arète esclave alors Bingo, même sens
428    
429     ' a est la Slyarete du maitre, Me est l'arète esclave
430     Dim x, y, z, T2, T3 As Double
431     Dim ret As Boolean = Me.Evaluer(0, x, y, z)
432     T2 = a.GetT(x, y, z)
433     Me.Evaluer(0.1, x, y, z)
434     T3 = a.GetT(x, y, z)
435     If T3 = (T2 + 0.1) Then sens = 1 Else sens = -1
436     End If
437    
438     End If
439    
440     paramSens.SetDoubleValue2(sens, 2, "")
441     ParamMaitre.SetStringValue2(NomMaitre, 2, "") ' swAllConfiguration = 2
442 bournival 130 'GererDossiers("Doublons", nom)
443 bournival 40
444 bournival 130 ' Me.Colorer(2, 1, 1, 0)
445 bournival 40
446     End Sub
447    
448    
449     ''' <summary>
450 bournival 205 ''' Met un attribut sur l'arête pour qu'elle soit ignorée
451     ''' </summary>
452     ''' <remarks></remarks>
453     Public Sub MettreAttributIgnorer()
454     Dim attr As sldworks.Attribute
455     Dim swEnt As sldworks.Entity
456     Dim nom As String = Nothing
457     Dim i As Integer
458    
459     swEnt = Me.swArete
460    
461     attr = swEnt.FindAttribute(Intersections.DefAttrIgnorer, 0)
462    
463     While attr Is Nothing
464     nom = "Ignorer" & CStr(i)
465     attr = Intersections.DefAttrIgnorer.CreateInstance5(swModel, swEnt, nom, 0, swconst.swInConfigurationOpts_e.swAllConfiguration)
466     i += 1
467     End While
468    
469     End Sub
470    
471    
472     ''' <summary>
473 bournival 40 ''' sub qui efface l'attribut du doublon sur l'arète maitre.
474     ''' </summary>
475     ''' <remarks></remarks>
476     Public Sub EffacerAttributDoublon()
477     Dim attr As SldWorks.Attribute
478     Dim swent As SldWorks.Entity
479     swent = Me.SwArete
480     attr = swent.FindAttribute(Intersections.DefAttrDoublon, 0)
481     attr.Delete(True)
482     End Sub
483    
484 bournival 205
485 bournival 40 ''' <summary>
486 bournival 205 ''' Retourne vrai si l'arête a un attribut pour ignorer
487     ''' </summary>
488     ''' <returns>Vrai si on doit ignorer l'arête</returns>
489     ''' <remarks></remarks>
490     Public Function Ignorer() As Boolean
491     Dim attr As sldworks.Attribute
492     Dim swent As sldworks.Entity
493     swent = Me.swArete
494     attr = swent.FindAttribute(Intersections.DefAttrDoublon, 0)
495     If attr Is Nothing Then Return False Else Return True
496     End Function
497    
498     ''' <summary>
499 bournival 40 ''' Function qui retourne le nom qui est sur une arète
500     ''' </summary>
501     ''' <returns></returns>
502     ''' <remarks></remarks>
503     Public Function getNom() As String
504     Dim swEnt As SldWorks.Entity
505     swEnt = swArete
506     getNom = swPart.GetEntityName(swEnt)
507     End Function
508    
509    
510     ''' <summary>
511     ''' Calcule et retourne le T au milieu de l'arète
512     ''' </summary>
513 bournival 130 ''' <param name="Reverse">Si oui, alors oon retourne le milieu de la courbe inversée. Le «milieu» n'est pas le même si on a une spline...</param>
514 bournival 40 ''' <returns>Le T du milieu</returns>
515     ''' <remarks></remarks>
516 bournival 130 Public Function GetTMilieu(Optional ByVal Reverse As Boolean = False) As Double
517     Dim swCourbe As sldworks.Curve
518 bournival 40 Dim temp As Object
519     Dim T1 As Double, T2 As Double
520 bournival 130 Dim sommet As sldworks.Vertex
521 bournival 40 Dim point As Object
522    
523    
524 bournival 130 swCourbe = Me.swArete.GetCurve
525     If Reverse Then swCourbe = swCourbe.ReverseCurve()
526 bournival 40
527 bournival 130 sommet = Me.swArete.GetStartVertex()
528    
529 bournival 40 If sommet IsNot Nothing Then
530 bournival 48 point = sommet.GetPoint() : temp = swArete.GetParameter(point(0), point(1), point(2)) : T1 = temp(0)
531     sommet = swArete.GetEndVertex() : point = sommet.GetPoint() : temp = swArete.GetParameter(point(0), point(1), point(2)) : T2 = temp(0)
532 bournival 40 Return (T1 + T2) / 2
533    
534     Else
535     'l'arète est fermée.
536     Return 0.5 ' c'est un cercle... tous les points sont au milieu!
537     MsgBox("On demande la longueur d'une courbe fermée qui n'est pas un cercle... ce n'est pas encore programmé car ça ne devrait pas arriver.")
538     End If
539    
540     End Function
541    
542    
543     ''' <summary>
544     ''' Calcule et retourne la valeur de T à un certain endroit
545     ''' </summary>
546     ''' <param name="x"></param>
547     ''' <param name="y"></param>
548     ''' <param name="z"></param>
549     ''' <returns></returns>
550     ''' <remarks></remarks>
551     Public Function GetT(ByRef x As Double, ByRef y As Double, ByRef z As Double) As Double
552     Dim retval As Object
553     Dim retour(1) As Double
554     retval = Me.SwArete.GetParameter(x, y, z)
555     retour = retval
556 bournival 130 If Not retour(1) Then
557     Me.Colorer(2, 1, 0.5, 0) ' : Commun.MettreUnPoint(x, y, z)
558     Dim ret As Object = Me.swArete.GetClosestPointOn(x, y, z)
559    
560     Dim obj As Object = Me.swArete.GetClosestPointOn(x, y, z)
561     Dim ob() As Double = obj
562     retval = Me.swArete.GetParameter(ob(0), ob(1), ob(2))
563    
564     End If
565 bournival 40 Return retour(0)
566     End Function
567    
568     ''' <summary>
569     ''' Fonction qui retourne le Tmin de l'arète
570     ''' </summary>
571     ''' <returns>Tmax</returns>
572     ''' <remarks></remarks>
573     Public Function GetTMin() As Double
574     Dim vp As Object
575 bournival 48 swArete.GetCurve()
576     vp = swArete.GetCurveParams2()
577 bournival 40 Return vp(6)
578     End Function
579    
580    
581     ''' <summary>
582     ''' Fonction qui retourne le Tmax de l'arète
583     ''' </summary>
584     ''' <returns>Tmax</returns>
585     ''' <remarks></remarks>
586     Public Function GetTMax() As Double
587     Dim vp As Object
588 bournival 48 swArete.GetCurve()
589     vp = swArete.GetCurveParams2()
590 bournival 40 Return vp(7)
591     End Function
592    
593    
594     ''' <summary>
595     ''' Détermine si la valeur de T est sur la courbe, si oui ça retourne les coordonnées XYZ
596     ''' </summary>
597     ''' <param name="T"></param>
598     ''' <param name="xyz"></param>
599     ''' <returns></returns>
600     ''' <remarks></remarks>
601     Public Function Evaluer(ByRef T As Double, Optional ByRef xyz() As Double = Nothing) As Boolean
602    
603     Dim temp(2) As Double
604     Dim retval As Object
605     Dim retour() As Double
606     Dim T1 As Double
607     Dim T2 As Double
608    
609     retval = Me.SwArete.GetCurveParams2()
610     retour = retval
611     T1 = retour(6)
612     T2 = retour(7)
613    
614     If Not ((T >= T1) And (T <= T2)) Then Return False
615    
616     retval = Me.SwArete.Evaluate(T)
617    
618     temp(0) = retval(0)
619     temp(1) = retval(1)
620     temp(2) = retval(2)
621    
622     xyz = temp
623    
624     Return True
625    
626     End Function
627    
628    
629     ''' <summary>
630     ''' Détermine si la valeur de T est sur la courbe, si oui ça retourne les coordonnées XYZ
631     ''' </summary>
632     ''' <param name="T"></param>
633     ''' <param name="x"></param>
634     ''' <param name="y"></param>
635     ''' <param name="z"></param>
636     ''' <returns></returns>
637     ''' <remarks></remarks>
638     Public Function Evaluer(ByRef T As Double, ByRef x As Double, ByRef y As Double, ByRef z As Double) As Boolean
639     'si XYZ est omis alors on veut juste savoir si le paramètre est sur la courbe
640    
641     Dim temp(2) As Double
642     Dim retval As Object
643     Dim retour() As Double
644     Dim T1 As Double
645     Dim T2 As Double
646    
647     retval = Me.SwArete.GetCurveParams2()
648     retour = retval
649     T1 = retour(6)
650     T2 = retour(7)
651    
652     If Not ((T >= T1) And (T <= T2)) Then Return False
653    
654     retval = Me.SwArete.Evaluate(T)
655    
656     x = retval(0)
657     y = retval(1)
658     z = retval(2)
659    
660     Return True
661     End Function
662    
663     ''' <summary>
664     ''' Fonction qui compare la superarete avec une autre arète de solidworks
665     ''' </summary>
666     ''' <param name="swArete"></param>
667     ''' <returns></returns>
668     ''' <remarks></remarks>
669     Public Function comparer(ByRef swArete As SldWorks.Edge) As Boolean
670     Dim e As New SuperArete(swArete, True)
671     Return comparer(e)
672     End Function
673    
674    
675    
676    
677     ''' <summary>
678     ''' Fonction qui compare 2 superaretes. Retourne vrai si les 2 arêtes sont identiques
679     ''' </summary>
680     ''' <param name="sAreteTest">L'arète avec laquelle comparer</param>
681     ''' <returns>Vrais si les 2 arêtes peuvent être fusionnées. Faux sinon</returns>
682     ''' <remarks></remarks>
683     Public Function Comparer(ByRef sAreteTest As SuperArete) As Boolean
684     'on a 2 arètes, et on ne peut comparer directement les pointeurs...
685    
686     If swArete Is sAreteTest Then Return True
687    
688    
689    
690     ' 2 - les 2 points d'extrémités sont identiques.
691     Dim debut1() As Double = Me.GetStartPoint
692     Dim debut2() As Double = sAreteTest.GetStartPoint
693     Dim fin1() As Double = Me.GetEndPoint
694     Dim fin2() As Double = sAreteTest.GetEndPoint
695    
696     If debut1 Is Nothing Xor debut2 Is Nothing Then Return False
697     If debut1 Is Nothing And debut2 Is Nothing Then ' peut-être un cercle
698     If Not swModel.ClosestDistance(sAreteTest.swArete, Me.swArete, Nothing, Nothing) < Epsilon Then Return False
699     ' bon, on a 2 cercles (ou courbe fermées) qui se touchent à au moins un point...
700 bournival 130 Dim courbe1 As sldworks.Curve = Me.swArete.GetCurve
701     Dim courbe2 As sldworks.Curve = sAreteTest.swCourbe
702 bournival 40
703 bournival 130 If Me.IsCircle AndAlso sAreteTest.IsCircle Then
704 bournival 40 Dim vparam1 As Object = courbe1.CircleParams()
705     Dim vparam2 As Object = courbe2.CircleParams()
706 bournival 130 If Math.Abs(vparam1(0) - vparam2(0)) < 1000 * Epsilon AndAlso Math.Abs(vparam1(1) - vparam2(1)) < 1000 * Epsilon AndAlso Math.Abs(vparam1(2) - vparam2(2)) < 1000 * Epsilon AndAlso Math.Abs(vparam1(6) - vparam2(6)) < 1000 * Epsilon Then
707     Dim tmilieuC As Double = Me.GetTMilieu
708     Dim xyzC() As Double = Nothing
709     If Not Me.Evaluer(tmilieuC, xyzC) Then MsgBox("Marche pas ici...") ' alors prendre ce qu'il y a en commentaire plus haut....
710     Dim vPointC As Object = sAreteTest.swArete.GetClosestPointOn(xyzC(0), xyzC(1), xyzC(2))
711     If Distance(xyzC(0), xyzC(1), xyzC(2), vPointC(0), vPointC(1), vPointC(2)) < 0.000001 Then Return True Else Return False
712     Else
713     Return False
714     End If
715    
716     ElseIf Me.IsEllipse AndAlso sAreteTest.IsEllipse Then
717 bournival 40 Dim vparam1 As Object = courbe1.GetEllipseParams()
718     Dim vparam2 As Object = courbe2.GetEllipseParams()
719     For i As Integer = 0 To 10
720 bournival 130 If Math.Abs(vparam1(i) - vparam2(i)) > 1000 * Epsilon Then Return False
721 bournival 40 Next
722     Return True
723 bournival 130 Else ' peut-être des splines fermées...
724     ' on fait un test sur ... ? 20 points ? ... sur une des 2 courbes, et si le point appartient à l'autre courbe aussi on retourne true
725     ' la courbe Originale est me.swArete
726     Dim g As Integer = 0
727     Dim pointTest(2) As Double
728     Dim Tmin As Double = Me.GetTMin
729     Dim Tmax As Double = Me.GetTMax
730     Dim incrT As Double = (Tmax - Tmin) / 20
731    
732    
733     While g < 20
734     Me.Evaluer(Tmin + g * incrT, pointTest)
735     If Commun.Distance(sAreteTest.swArete, pointTest) > 0.000001 Then Return False ' merde, je déteste cette façon de procéder!
736     g += 1
737     End While
738    
739    
740     Return True
741 bournival 40 End If
742 bournival 130 End If
743 bournival 40
744 bournival 130 If Distance(debut1, debut2) > 1000 * Epsilon AndAlso Distance(debut1, fin2) > 1000 * Epsilon Then Return False
745     If Distance(fin1, debut2) > 1000 * Epsilon AndAlso Distance(fin1, fin2) > 1000 * Epsilon Then Return False
746 bournival 40
747 bournival 130 ' update, le point milieu ne marche pas toujours.., mais si on a une ligne, innutile de tester plus loin
748     If Me.IsLine And sAreteTest.IsLine Then Return True
749 bournival 40
750 bournival 130
751    
752     'Dim D1() As Double = Me.GetTangenceDepart()
753     'Dim A1() As Double = Me.GetTangenceArivee()
754    
755     'Dim D2() As Double = sAreteTest.GetTangenceDepart
756     'Dim A2() As Double = sAreteTest.GetTangenceArivee
757    
758    
759     'If Distance(debut1, debut2) < 1000 * Epsilon Then ' courbes dans même sens
760    
761     ' If Outils_Math.ComparerVecteurs3D(D1, D2) AndAlso Outils_Math.ComparerVecteurs3D(A1, A2) Then Return True Else Return False
762     'Else ' courbes dans sens différent
763     ' Dim P1(2) As Double
764     ' Dim P2(2) As Double
765     ' If Outils_Math.ComparerVecteurs3D(D1, A2) = 1 AndAlso Outils_Math.ComparerVecteurs3D(A1, D2) = 1 Then Return True Else Return False
766     'End If
767    
768    
769     ' une autre stratégie
770     Dim tmilieu As Double = Me.GetTMilieu
771     Dim xyz() As Double = Nothing
772     If Not Me.Evaluer(tmilieu, xyz) Then MsgBox("Marche pas ici...") ' alors prendre ce qu'il y a en commentaire plus haut....
773     Dim vPoint As Object = sAreteTest.swArete.GetClosestPointOn(xyz(0), xyz(1), xyz(2))
774     If Distance(xyz(0), xyz(1), xyz(2), vPoint(0), vPoint(1), vPoint(2)) < 0.000001 Then Return True Else Return False
775    
776    
777    
778 bournival 40 End Function
779    
780 bournival 130
781 bournival 40 ''' <summary>
782 bournival 130 ''' DOnne la longueur d'une arète
783 bournival 40 ''' </summary>
784 bournival 130 ''' <value></value>
785     ''' <returns>La longueur de l'arète</returns>
786 bournival 40 ''' <remarks></remarks>
787 bournival 130 Public ReadOnly Property Longueur() As Double
788     Get
789     Dim temp As Object
790     Dim T1 As Double, T2 As Double
791     Dim sommet As sldworks.Vertex
792     Dim point As Object
793 bournival 40
794 bournival 130 sommet = swArete.GetStartVertex()
795 bournival 40
796 bournival 130 If sommet IsNot Nothing Then
797     point = sommet.GetPoint() : temp = swArete.GetParameter(point(0), point(1), point(2)) : T1 = temp(0)
798     sommet = swArete.GetEndVertex() : point = sommet.GetPoint() : temp = swArete.GetParameter(point(0), point(1), point(2)) : T2 = temp(0)
799     Return swCourbe.GetLength2(T1, T2)
800 bournival 40
801 bournival 130 Else
802     'l'arète est fermée.
803     Dim params() As Double
804     If swCourbe.IsCircle Then
805     params = swCourbe.CircleParams
806     Return params(6) * Pi * 2
807     End If
808     MsgBox("On demande la longueur d'une courbe fermée qui n'est pas un cercle... ce n'est pas encore programmé car ça ne devrait pas arriver." & vbCr & " On pourrait prendre la tessellation, mais là on aurait une approximation!")
809 bournival 40 End If
810 bournival 130 End Get
811     End Property
812 bournival 40
813     ''' <summary>
814 bournival 130 ''' Si la courbe est un cercle, retourne le rayon.
815     ''' </summary>
816     ''' <value></value>
817     ''' <returns></returns>
818     ''' <remarks></remarks>
819     Public ReadOnly Property Rayon() As Double
820     Get
821     'MsgBox("Mettre du code ici")
822     Dim swCurve As sldworks.Curve = Me.swArete.GetCurve
823    
824    
825     If Me.IsCircle Then
826     Dim obj As Object = swCurve.CircleParams()
827     Return obj(6)
828     Else : Return (Nothing)
829     End If
830    
831     End Get
832     End Property
833    
834    
835     ''' <summary>
836 bournival 40 ''' Renvoie les coordonnées du point de départ
837     ''' </summary>
838     ''' <returns></returns>
839     ''' <remarks></remarks>
840     Public Function GetStartPoint() As Double()
841 bournival 130 Dim swSommet As sldworks.Vertex
842 bournival 40 Dim retval As Object
843     Dim xyz(2) As Double
844 bournival 130 swSommet = Me.swArete.GetStartVertex()
845 bournival 40 If swSommet Is Nothing Then Return Nothing
846     retval = swSommet.GetPoint()
847     xyz = retval
848     Return xyz
849     End Function
850    
851     ''' <summary>
852     ''' Renvoie les coordonnées du point de départ
853     ''' </summary>
854     ''' <returns>Faux si le sommet n'esiste pas</returns>
855     ''' <remarks></remarks>
856     Public Function GetStartPoint(ByRef x As Double, ByRef y As Double, ByRef z As Double) As Boolean
857 bournival 130 Dim swSommet As sldworks.Vertex
858 bournival 40 Dim retval As Object
859     Dim xyz(2) As Double
860 bournival 130 swSommet = Me.swArete.GetStartVertex()
861 bournival 40 If swSommet Is Nothing Then Return False
862     retval = swSommet.GetPoint()
863     x = retval(0)
864     y = retval(1)
865     z = retval(2)
866     Return True
867     End Function
868    
869     Public Function GetEndPoint() As Double()
870 bournival 130 Dim swSommet As sldworks.Vertex
871 bournival 40 Dim retval As Object
872     Dim xyz(2) As Double
873 bournival 130 swSommet = Me.swArete.GetEndVertex()
874 bournival 40 If swSommet Is Nothing Then Return Nothing
875     retval = swSommet.GetPoint()
876     xyz = retval
877     Return xyz
878     End Function
879    
880     ''' <summary>
881     ''' Renvoie les coordonnées du point de fin
882     ''' </summary>
883     ''' <returns>Faux si le sommet n'esiste pas</returns>
884     ''' <remarks></remarks>
885     Public Function GetEndPoint(ByRef x As Double, ByRef y As Double, ByRef z As Double) As Boolean
886 bournival 130 Dim swSommet As sldworks.Vertex
887 bournival 40 Dim retval As Object
888     Dim xyz(2) As Double
889 bournival 130 swSommet = Me.swArete.GetEndVertex()
890 bournival 40 If swSommet Is Nothing Then Return False
891     retval = swSommet.GetPoint()
892     x = retval(0)
893     y = retval(1)
894     z = retval(2)
895     Return True
896     End Function
897    
898    
899    
900    
901 bournival 130 ''' <summary>
902     ''' Retourne un tableau de 3 doubles représentant le vecteur de tangence au point de départ de la courbe
903     ''' </summary>
904     ''' <returns>La tangence de la courbe</returns>
905     ''' <remarks></remarks>
906     Public Function GetTangenceDepart() As Double()
907     Dim s1 As sldworks.Vertex = Me.SommetDebut
908     Dim es1 As New SuperSommet(s1, True)
909     Dim T As Double = Me.GetTMin
910 bournival 40
911 bournival 130 Dim tan(2) As Double
912     Me.Evaluer(T + 100 * Epsilon, tan)
913     tan(0) = es1.X - tan(0)
914     tan(1) = es1.Y - tan(1)
915     tan(2) = es1.Z - tan(2)
916 bournival 40
917 bournival 130 Return Outils_Math.unitaire(tan)
918 bournival 40
919 bournival 130 'Dim swCourbe As sldworks.Curve = Me.swArete.GetCurve
920     'Dim vTangent As Object = swCourbe.Evaluate(Me.GetTMin)
921     ''[ PointX, PointY, PointZ, TangentX, TangentY, TangentZ, Success ]
922     'Dim dTangent(2) As Double
923     'dTangent(0) = vTangent(3) : dTangent(1) = vTangent(4) : dTangent(2) = vTangent(5)
924     'Return dTangent
925     End Function
926 bournival 40
927 bournival 130 ''' <summary>
928     ''' Retourne un tableau de 3 doubles représentant le vecteur de tangence au point de fin de la courbe
929     ''' </summary>
930     ''' <returns>La tangence de la courbe</returns>
931     ''' <remarks></remarks>
932     Public Function GetTangenceArivee() As Double()
933     Dim s1 As sldworks.Vertex = Me.SommetFinal
934     Dim es1 As New SuperSommet(s1, True)
935     Dim T As Double = Me.GetTMax
936 bournival 40
937 bournival 130 Dim tan(2) As Double
938     Me.Evaluer(T - 100 * Epsilon, tan)
939     tan(0) = es1.X - tan(0)
940     tan(1) = es1.Y - tan(1)
941     tan(2) = es1.Z - tan(2)
942 bournival 40
943 bournival 130 Return Outils_Math.unitaire(tan)
944 bournival 40
945 bournival 130 End Function
946 bournival 40
947 bournival 130 ''' <summary>
948     ''' Retourne un tableau de 3 doubles représentant le vecteur de tangence au point de fin de la courbe
949     ''' </summary>
950     ''' <param name="T">La valuer de T à laquelle on cherche la tangence</param>
951     ''' <returns>La tangence de la courbe</returns>
952     ''' <remarks></remarks>
953     Public Function GetTangence(ByVal T As Double) As Double()
954     Dim s1 As sldworks.Vertex = Me.SommetFinal
955     Dim es1 As New SuperSommet(s1, True)
956 bournival 40
957 bournival 130 Dim tan(2) As Double
958     Me.Evaluer(T, tan)
959     tan(0) = es1.X - tan(0)
960     tan(1) = es1.Y - tan(1)
961     tan(2) = es1.Z - tan(2)
962    
963     Return Outils_Math.unitaire(tan)
964    
965     End Function
966    
967    
968     ''' <summary>
969     ''' Retourne le premier sommet de la courbe
970     ''' </summary>
971     ''' <value></value>
972     ''' <returns></returns>
973     ''' <remarks></remarks>
974     Public ReadOnly Property SommetDebut() As sldworks.Vertex
975     Get
976     Return Me.swArete.GetStartVertex
977     End Get
978     End Property
979    
980     ''' <summary>
981     ''' Retourne le dernier sommet de la courbe
982     ''' </summary>
983     ''' <value></value>
984     ''' <returns></returns>
985     ''' <remarks></remarks>
986     Public ReadOnly Property SommetFinal() As sldworks.Vertex
987     Get
988     Return Me.swArete.GetEndVertex
989     End Get
990     End Property
991    
992    
993     ''' <summary>
994     ''' Sub utilisée pour le débuggage qui met 100 points sur la courbe
995     ''' </summary>
996     ''' <remarks>POur évaluer la tolérance</remarks>
997     Public Sub RemplirDePoints()
998     Dim T As Double, Tmin As Double, Tmax As Double, Tinc As Double
999     Dim P(2) As Double
1000     swModel.Insert3DSketch2(False)
1001    
1002     Tmin = Me.GetTMin
1003     Tmax = Me.GetTMax
1004     Tinc = (Tmax - Tmin) / 100
1005     T = Tmin
1006    
1007     For i As Integer = 0 To 100
1008     T += Tinc
1009     Me.Evaluer(T, P)
1010     swModel.CreatePoint2(P(0), P(1), P(2))
1011     Next i
1012    
1013     swModel.Insert3DSketch2(False)
1014     End Sub
1015    
1016    
1017     ''' <summary>
1018     ''' Sélectionne l'arète, mais s'assure de ne pas la désélectionner si elle est déjà sélectionnée
1019     ''' </summary>
1020     ''' <remarks>Pas très rapide...</remarks>
1021     Public Sub SelectionnerSafe()
1022     Dim swEnt As sldworks.Entity = Me.swArete
1023     Dim selMgr As sldworks.SelectionMgr = swModel.SelectionManager
1024    
1025     For i As Integer = 1 To selMgr.GetSelectedObjectCount2(-1)
1026     If selMgr.GetSelectedObject6(i, -1) Is swEnt Then
1027     Exit Sub
1028     End If
1029     Next
1030    
1031     swEnt.Select4(True, Nothing)
1032     End Sub
1033    
1034    
1035     Public Sub PasserLes2FacesAdjascentes(ByRef swFace1 As sldworks.Face2, ByRef swFace2 As sldworks.Face2)
1036     Dim obj As Object = Me.swArete.GetTwoAdjacentFaces2()
1037     swFace1 = obj(0)
1038     swFace2 = obj(1)
1039     End Sub
1040    
1041 bournival 40 End Class