ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/InterAreteFace.vb
Revision: 130
Committed: Wed Jul 30 21:26:03 2008 UTC (16 years, 9 months ago) by bournival
File size: 9382 byte(s)
Log Message:
Une mise à jour, car on aura peut-être besoin de mon code.

File Contents

# Content
1 Imports SolidWorks.Interop
2 Imports SolidWorks.Interop.swconst
3 Imports SolidWorks.Interop.swpublished
4
5 Public MustInherit Class InterAreteFace
6 Inherits SuperIntersection
7
8
9 Public lst_sPoutre As New Collection 'SlyAretePoutre ' une collection car on peut avoir plus d'une poutre au même point.
10 Public lst_type As New Collection ' type: à chaque poutre de la liste d'avant, il y a un type d'intersection. 1- coupe en X 2- sur face, intérieure 3 - sur face, extérieure
11
12
13 Public x As Double ' la coordonnée x de l'intersection
14 Public y As Double
15 Public z As Double
16
17 Public sFaceVolume As SlyFaceVolume
18 Private BodySweep As sldworks.Body2
19
20
21 Public Sub DecouperLong()
22 ' on peut avoir une liste de poutres...
23 'For Each poutre As SlyAretePoutre In Me.lst_sPoutre
24 Dim poutre As SlyAretePoutre = Me.lst_sPoutre.Item(1)
25
26 Dim PetitSketch As sldworks.Sketch = Nothing
27 Dim swSketchManager As sldworks.SketchManager = swModel.SketchManager
28 Dim sfaceVol As SlyFaceVolume ' la face du volume
29 Dim swfaceVol As sldworks.Face2
30
31 Dim segment As sldworks.Entity = poutre.swArete
32
33 swModel.ClearSelection()
34 If swModel.GetActiveSketch2() IsNot Nothing Then MsgBox("Déjà un sketch d'actif???")
35 swModel.Insert3DSketch2(False)
36 segment.Select4(False, Nothing)
37 swSketchManager.SketchUseEdge(False)
38 swModel.Insert3DSketch2(False)
39 swModel.EditRebuild3()
40
41 Dim feat As sldworks.Feature = swModel.FeatureByPositionReverse(0)
42 If Not feat.GetTypeName() = "3DProfileFeature" Then MsgBox("Problème ici")
43 PetitSketch = feat.GetSpecificFeature2() ' devrait être un sketch
44
45 ' 1 - créer le sweep à partir du sketch
46 Me.GénérerSweep(PetitSketch) ' hahahaha on réutilise la sub !!
47
48 ' sélectionner toutes les faces du sweep avec un mark de 16
49 Dim swFaceSweep As sldworks.Face2 = Me.BodySweep.GetFirstFace()
50 Dim swent As sldworks.Entity
51 Dim featmanager As sldworks.FeatureManager
52 Dim faces() As sldworks.Face2
53
54
55 ' ***** Découpage du volume****
56 swModel.EditRebuild3()
57 featmanager = swModel.FeatureManager
58 feat = Nothing
59 sfaceVol = Me.sFaceVolume
60 faces = sfaceVol.GetFaces
61
62
63 For q As Integer = 0 To UBound(faces)
64 swfaceVol = faces(q)
65 ' merde, on a 3 fois la même face??? vérifier que le for each marche bien et/ou que le .ToArray du faces est corect.
66 If swModel.ClosestDistance(swfaceVol, Me.BodySweep, Nothing, Nothing) < Epsilon Then
67
68 swModel.ClearSelection2(True)
69 Do While swFaceSweep IsNot Nothing ' les faces coupantes (celles du sweep) ont un mark de 16
70 swent = swFaceSweep : swent.Select2(True, 16)
71 swFaceSweep = swFaceSweep.GetNextFace
72 Loop
73
74 swent = swfaceVol : swent.Select2(True, 32)
75 feat = featmanager.InsertSplitLineIntersect(7)
76 If feat IsNot Nothing Then Exit For
77
78 End If
79 Next
80
81 If feat Is Nothing Then
82 If swApp.SendMsgToUser2("Solidworks est incapable de découper la face du volume, entre " & Me.sFaceVolume.nom & " et " & Me.sFaceVolume.nom & vbCr & " La géométrie est trop compliquée pour solidworks!", swconst.swMessageBoxIcon_e.swMbWarning, swconst.swMessageBoxBtn_e.swMbRetryCancel) = swconst.swMessageBoxResult_e.swMbHitCancel Then Exit Sub
83 End If
84
85 Me.BodySweep.HideBody(True)
86
87 ' ajout des nouvelles faces
88 Dim vfaces As Object = feat.GetFaces()
89 swModel.EditRebuild3()
90
91 For Each swfaceVol In vfaces ' sélectionne les faces découpées.
92 If Not swfaceVol.GetBody Is Me.BodySweep Then
93 sfaceVol.AjouterFace(swfaceVol)
94 'là on a une connerie, la face originale n'est pas dans la liste des faces de vFaces
95 'et le pointeur original semble détruit
96 ' puisque ajouterface ne créé pas de doubles, on va chercher des faces que l'on mettra dans la liste
97 ' la grosse face en fera automatiquement partie.
98 Dim obj As Object = swfaceVol.GetEdges
99 Dim aretes As sldworks.Edge = obj(0)
100 Dim oBjfaces As Object = aretes.GetTwoAdjacentFaces2()
101 Dim NewFaces As sldworks.Face2 = oBjfaces(0)
102 sfaceVol.AjouterFace(NewFaces)
103 NewFaces = oBjfaces(1)
104 sfaceVol.AjouterFace(NewFaces)
105 aretes = obj(1)
106 NewFaces = oBjfaces(0)
107 sfaceVol.AjouterFace(NewFaces)
108 NewFaces = oBjfaces(1)
109 sfaceVol.AjouterFace(NewFaces)
110 End If
111 Next
112
113 ' il faut trouver les faces internes et les tagger comme des faces de coque(pour les mini-poutres orientées)
114
115 'Next poutre
116 End Sub
117
118 Public Sub GénérerSweep(Optional ByRef sketch As sldworks.Sketch = Nothing)
119 ' on peut essayer 2 méthodes, celle du offset des faces et celle du sweep d'un cercle
120 ' celle du offset ne marche pas dans toutes les circonstances...
121 Dim swEnt As SldWorks.Entity
122
123
124 ' 2- Placer un plan à l'extrémité
125 Dim Plan As SldWorks.RefPlane
126
127 Dim vSeg As Object 'SldWorks.SketchSegment
128 Dim seg As SldWorks.SketchSegment
129 Dim skPoint As SldWorks.SketchPoint = Nothing
130
131
132 vSeg = sketch.GetSketchSegments() : seg = vSeg(0)
133
134 Select Case seg.GetType ' faut faire attention, si le sketch est fermé, ça peut chier des taque pour séelectionner le point
135 Case SwConst.swSketchSegments_e.swSketchLINE
136 Dim skline As SldWorks.SketchLine = seg
137 skPoint = skline.GetStartPoint2()
138
139 Case SwConst.swSketchSegments_e.swSketchARC
140 Dim skarc As SldWorks.SketchArc = seg
141 skPoint = skarc.GetStartPoint2()
142 Case SwConst.swSketchSegments_e.swSketchELLIPSE
143 Dim skellipse As SldWorks.SketchEllipse = seg
144 skPoint = skellipse.GetStartPoint2()
145 If skPoint Is Nothing Then
146 ' couper l'ellipse
147 MsgBox("On a pas de startpoint sur cette ellipse")
148 End If
149 Case SwConst.swSketchSegments_e.swSketchSPLINE
150 Dim skSpline As SldWorks.SketchSpline = seg
151 Dim vPoints As Object
152 vPoints = skSpline.GetPoints2()
153 skPoint = vPoints(0)
154 Case SwConst.swSketchSegments_e.swSketchPARABOLA
155 Dim skPara As SldWorks.SketchParabola = seg
156 skPoint = skPara.GetStartPoint2()
157 Case Else
158 MsgBox(" Là y'a un problème! (case else....)")
159 End Select
160
161 seg.Select4(False, Nothing)
162 skPoint.Select4(True, Nothing)
163
164 Plan = swModel.CreatePlanePerCurveAndPassPoint3(True, False) ' le premier true met l'origine sur le point de la courbe, le second false est pour la visualisation.
165
166 ' 3 - on créé un cercle sur le plan
167 Dim rayon As Double
168 Dim sface As SlyFaceVolume = Me.sFaceVolume
169 Dim feat As SldWorks.Feature
170 Dim sketchCercle As SldWorks.Sketch
171 Dim poutre As SlyAretePoutre
172
173 rayon = Commun.ENG * Math.Sqrt(3) / 2 ' la bonne distance pour le maillage :-)
174 swEnt = Plan : swEnt.Select4(False, Nothing)
175
176 swModel.InsertSketch2(False)
177 swModel.CreateCircle2(rayon / 2, 0, 0, 0, 0, 0)
178 swModel.InsertSketch2(True)
179
180 feat = swModel.FeatureByPositionReverse(0)
181 sketchCercle = feat.GetSpecificFeature2()
182
183 ' 4 - Sweep
184 Dim swFeatManager As SldWorks.FeatureManager = swModel.FeatureManager
185
186 Dim merge As Boolean = False
187
188 swEnt = sketchCercle : swEnt.Select2(False, 1)
189 swEnt = sketch : swEnt.Select2(True, 4)
190
191 feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 1, 1, False, 0, 0, 0, 0, merge, 1, 1, 0, 1) ' merge fait additionner le bnouveau corps... Pas certain du false qui suit.
192
193 If feat Is Nothing Then
194 swEnt = sketchCercle : swEnt.Select2(False, 1)
195 swEnt = sketch : swEnt.Select2(True, 4)
196 feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 0, 0, False, 0, 0, 0, 0, 0, 1, 1, 0, 1)
197 End If
198
199 If feat Is Nothing Then
200 ' il est possible que la coque soit une spline
201 MsgBox("Il est impossible de découper la forme de la courbe, la coque est trop repliée sur elle-même..." & vbCr & "Un rayon de courbure de la section de la coque est inférieur à l'épaisseur de la coque", MsgBoxStyle.Information, "Impossible de découper à un endroit!")
202 ' on pourrait éventuellement appliquer une autre méthode.
203 Exit Sub
204 End If
205
206 Dim vfaces As Object = feat.GetFaces
207 Dim swface As SldWorks.Face2 = vfaces(0)
208 Me.BodySweep = swface.GetBody
209
210
211 If Me.BodySweep Is Nothing Then MsgBox(feat.Name)
212
213 End Sub
214
215 End Class