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, 10 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

# User Rev Content
1 bournival 130 Imports SolidWorks.Interop
2     Imports SolidWorks.Interop.swconst
3     Imports SolidWorks.Interop.swpublished
4    
5 bournival 40 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 bournival 130
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 bournival 40 End Class