1 |
+ |
Imports SolidWorks.Interop |
2 |
+ |
Imports SolidWorks.Interop.swconst |
3 |
+ |
Imports SolidWorks.Interop.swpublished |
4 |
+ |
|
5 |
|
Public Class InterCoqueCoque |
6 |
|
Inherits InterFaceFace |
7 |
|
|
11 |
|
Public AreteCoque1 As SldWorks.Edge |
12 |
|
Public AreteCoque2 As SldWorks.Edge |
13 |
|
|
14 |
+ |
''' <summary> |
15 |
+ |
''' Sub qui dessine le sweep à l'endroit d'intersection |
16 |
+ |
''' </summary> |
17 |
+ |
''' <remarks>Je pourrais couper et mettre les faces internes ici, mais je préfère séparer...</remarks> |
18 |
+ |
Public Function GénérerSweep(ByRef sketch As SldWorks.Sketch, ByVal rayon As Double) As SldWorks.Body2 |
19 |
+ |
|
20 |
+ |
Dim swEnt As SldWorks.Entity |
21 |
+ |
|
22 |
+ |
|
23 |
+ |
|
24 |
+ |
' technique du sweep du cercle |
25 |
+ |
' 1 - trace de la ligne d'intersection |
26 |
+ |
' en théorie c'est déjà fait et on a interFF.sketch qui a le sketch d'intersection... |
27 |
+ |
|
28 |
+ |
' 2- Placer un plan à l'extrémité |
29 |
+ |
Dim Plan As SldWorks.RefPlane |
30 |
+ |
|
31 |
+ |
Dim vSeg As Object 'SldWorks.SketchSegment |
32 |
+ |
Dim seg As SldWorks.SketchSegment |
33 |
+ |
Dim skPoint As SldWorks.SketchPoint = Nothing |
34 |
+ |
|
35 |
+ |
|
36 |
+ |
vSeg = sketch.GetSketchSegments() : seg = vSeg(0) |
37 |
+ |
|
38 |
+ |
Select Case seg.GetType ' faut faire attention, si le sketch est fermé, ça peut chier des taque pour séelectionner le point |
39 |
+ |
Case swconst.swSketchSegments_e.swSketchLINE |
40 |
+ |
Dim skline As SldWorks.SketchLine = seg |
41 |
+ |
skPoint = skline.GetStartPoint2() |
42 |
+ |
|
43 |
+ |
Case swconst.swSketchSegments_e.swSketchARC |
44 |
+ |
Dim skarc As SldWorks.SketchArc = seg |
45 |
+ |
skPoint = skarc.GetStartPoint2() |
46 |
+ |
Case swconst.swSketchSegments_e.swSketchELLIPSE |
47 |
+ |
Dim skellipse As SldWorks.SketchEllipse = seg |
48 |
+ |
skPoint = skellipse.GetStartPoint2() |
49 |
+ |
If skPoint Is Nothing Then |
50 |
+ |
' couper l'ellipse |
51 |
+ |
MsgBox("On a pas de startpoint sur cette ellipse") |
52 |
+ |
End If |
53 |
+ |
Case swconst.swSketchSegments_e.swSketchSPLINE |
54 |
+ |
Dim skSpline As SldWorks.SketchSpline = seg |
55 |
+ |
Dim vPoints As Object |
56 |
+ |
vPoints = skSpline.GetPoints2() |
57 |
+ |
skPoint = vPoints(0) |
58 |
+ |
Case swconst.swSketchSegments_e.swSketchPARABOLA |
59 |
+ |
Dim skPara As SldWorks.SketchParabola = seg |
60 |
+ |
skPoint = skPara.GetStartPoint2() |
61 |
+ |
Case Else |
62 |
+ |
MsgBox(" Là y'a un problème! (case else....)") |
63 |
+ |
End Select |
64 |
+ |
|
65 |
+ |
seg.Select4(False, Nothing) |
66 |
+ |
skPoint.Select4(True, Nothing) |
67 |
+ |
|
68 |
+ |
Plan = swModel.CreatePlanePerCurveAndPassPoint3(True, False) ' le premier true met l'origine sur le point de la courbe, le second false est pour la visualisation. |
69 |
+ |
|
70 |
+ |
' 3 - on créé un cercle sur le plan |
71 |
+ |
'Dim rayon As Double |
72 |
+ |
'Dim sface As SlyFaceCoque = Me.sFaceCoque |
73 |
+ |
Dim feat As SldWorks.Feature |
74 |
+ |
Dim sketchCercle As SldWorks.Sketch |
75 |
+ |
|
76 |
+ |
' rayon = sface.GetEpaisseur |
77 |
+ |
swEnt = Plan : swEnt.Select4(False, Nothing) |
78 |
+ |
|
79 |
+ |
swModel.InsertSketch2(False) |
80 |
+ |
swModel.CreateCircleByRadius2(0, 0, 0, rayon) |
81 |
+ |
swModel.InsertSketch2(True) |
82 |
+ |
|
83 |
+ |
feat = swModel.FeatureByPositionReverse(0) |
84 |
+ |
sketchCercle = feat.GetSpecificFeature2() |
85 |
+ |
|
86 |
+ |
' 4 - Sweep |
87 |
+ |
Dim swFeatManager As SldWorks.FeatureManager = swModel.FeatureManager |
88 |
+ |
|
89 |
+ |
Dim merge As Boolean = False |
90 |
+ |
|
91 |
+ |
swEnt = sketchCercle : swEnt.Select2(False, 1) |
92 |
+ |
swEnt = sketch : swEnt.Select2(True, 4) |
93 |
+ |
|
94 |
+ |
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. |
95 |
+ |
|
96 |
+ |
If feat Is Nothing Then |
97 |
+ |
swEnt = sketchCercle : swEnt.Select2(False, 1) |
98 |
+ |
swEnt = sketch : swEnt.Select2(True, 4) |
99 |
+ |
feat = swFeatManager.InsertProtrusionSwept3(False, False, 0, False, False, 0, 0, False, 0, 0, 0, 0, 0, 1, 1, 0, 1) |
100 |
+ |
End If |
101 |
+ |
|
102 |
+ |
If feat Is Nothing Then |
103 |
+ |
' il est possible que la coque soit une spline |
104 |
+ |
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!") |
105 |
+ |
' on pourrait éventuellement appliquer une autre méthode. |
106 |
+ |
Return Nothing |
107 |
+ |
End If |
108 |
+ |
|
109 |
+ |
Dim vfaces As Object = feat.GetFaces |
110 |
+ |
Dim swface As SldWorks.Face2 = vfaces(0) |
111 |
+ |
Me.BodySweep = swface.GetBody |
112 |
+ |
|
113 |
+ |
|
114 |
+ |
If Me.BodySweep Is Nothing Then MsgBox(feat.Name) |
115 |
+ |
Return Me.BodySweep |
116 |
+ |
|
117 |
+ |
End Function |
118 |
+ |
|
119 |
+ |
''' <summary> |
120 |
+ |
''' |
121 |
+ |
''' </summary> |
122 |
+ |
''' <param name="LaCoque"></param> |
123 |
+ |
''' <param name="sweep"></param> |
124 |
+ |
''' <remarks></remarks> |
125 |
+ |
Public Sub DecouperCoque(ByRef LaCoque As SlyFaceCoque, ByRef sweep As SldWorks.Body2) |
126 |
+ |
If Me.BodySweep Is Nothing Then Exit Sub |
127 |
+ |
|
128 |
+ |
|
129 |
+ |
' on a un sketch avec 2 ou plusieurs segments à l'intérieur |
130 |
+ |
' et si je sélectionnais un segment à la fois et partait un sketch3d, puis je convertis ce segment et construit ce nouveau sketch... |
131 |
+ |
Dim vseg As Object = Me.sketch.GetSketchSegments |
132 |
+ |
Dim PetitSketch As SldWorks.Sketch = Nothing |
133 |
+ |
Dim swSketchManager As SldWorks.SketchManager = swModel.SketchManager |
134 |
+ |
'Dim lstFeat As New Collections.Generic.List(Of SldWorks.Feature) |
135 |
+ |
Dim swFace As SldWorks.Face2 = Me.BodySweep.GetFirstFace() |
136 |
+ |
Dim swent As SldWorks.Entity |
137 |
+ |
Dim featmanager As SldWorks.FeatureManager |
138 |
+ |
Dim swface2 As SldWorks.Face2 |
139 |
+ |
Dim LautreCoque As SlyFaceCoque |
140 |
+ |
LautreCoque = IIf(LaCoque Is Me.sFaceCoque1, Me.sFaceCoque2, Me.sFaceCoque1) |
141 |
+ |
|
142 |
+ |
|
143 |
+ |
For Each segment As SldWorks.SketchSegment In vseg |
144 |
+ |
swModel.ClearSelection() |
145 |
+ |
If swModel.GetActiveSketch2() IsNot Nothing Then MsgBox("Déjà un sketch d'actif???") |
146 |
+ |
swModel.Insert3DSketch2(False) |
147 |
+ |
segment.Select4(False, Nothing) |
148 |
+ |
swSketchManager.SketchUseEdge(False) |
149 |
+ |
swModel.Insert3DSketch2(False) |
150 |
+ |
swModel.EditRebuild3() |
151 |
+ |
|
152 |
+ |
Dim feat As SldWorks.Feature = swModel.FeatureByPositionReverse(0) |
153 |
+ |
If Not feat.GetTypeName() = "3DProfileFeature" Then MsgBox("Problème ici") |
154 |
+ |
PetitSketch = feat.GetSpecificFeature2() ' devrait être un sketch |
155 |
+ |
|
156 |
+ |
|
157 |
+ |
' 2 - Couper la coque à partir su sweep |
158 |
+ |
swModel.EditRebuild3() |
159 |
+ |
featmanager = swModel.FeatureManager |
160 |
+ |
Dim faces() As SldWorks.Face2 = LaCoque.GetFaces ' les faces de la coque qui sont découpées |
161 |
+ |
For Each swface2 In faces ' les faces de la coque |
162 |
+ |
If swModel.ClosestDistance(swface2, sweep, Nothing, Nothing) < Epsilon Then |
163 |
+ |
swModel.ClearSelection2(True) |
164 |
+ |
swFace = sweep.GetFirstFace() |
165 |
+ |
Do While swFace IsNot Nothing ' les faces coupantes (celles du sweep) ont un mark de 16 |
166 |
+ |
swent = swFace : swent.Select2(True, 16) |
167 |
+ |
swFace = swFace.GetNextFace |
168 |
+ |
Loop |
169 |
+ |
LautreCoque.SelectionnerToutes(16, True) |
170 |
+ |
|
171 |
+ |
swent = swface2 : swent.Select2(True, 32) ' la face qui est coupée |
172 |
+ |
feat = featmanager.InsertSplitLineIntersect(7) |
173 |
+ |
'If feat IsNot Nothing Then lstFeat.Add(feat) |
174 |
+ |
End If |
175 |
+ |
Next |
176 |
+ |
sweep.HideBody(True) |
177 |
+ |
|
178 |
+ |
' rajout des nouvelles faces à la coque |
179 |
+ |
feat = swModel.FeatureByPositionReverse(0) |
180 |
+ |
Dim vFaces As Object = feat.GetFaces() |
181 |
+ |
For Each swFace In vFaces |
182 |
+ |
LaCoque.AjouterFace(swFace) |
183 |
+ |
Next |
184 |
+ |
|
185 |
+ |
Next |
186 |
+ |
End Sub |
187 |
+ |
|
188 |
+ |
|
189 |
+ |
''' <summary> |
190 |
+ |
''' Sub qui met les attributs de faces internes sur les bonnes faces. |
191 |
+ |
''' </summary> |
192 |
+ |
''' <remarks></remarks> |
193 |
+ |
Public Sub MarquerFacesInternes(ByRef CoqueCoupante As SlyFaceCoque, ByRef CoqueCoupee As SlyFaceCoque) |
194 |
+ |
' bon, là il faut trouver les faces internes... mais: la liste de faces dans la slyface |
195 |
+ |
'mais j'ai maintenant un moyen de comparer les arètes. |
196 |
+ |
Dim trouve As Boolean = False |
197 |
+ |
' si une face de la liste des facesVol a une arête qui est comparer à true à une des arètes des faces de la coque, FACEINTERNE!!! |
198 |
+ |
Dim swFaces() As SldWorks.Face2 = CoqueCoupee.GetFaces |
199 |
+ |
Dim swAreteCoques() As SldWorks.Edge = CoqueCoupante.GetAretes |
200 |
+ |
|
201 |
+ |
For Each face As SldWorks.Face2 In swFaces |
202 |
+ |
Dim sFace As New SuperFace(face, True) |
203 |
+ |
Dim swAreteVols() As SldWorks.Edge = sFace.GetAretes |
204 |
+ |
For Each swAreteVol As SldWorks.Edge In swAreteVols |
205 |
+ |
Dim e As New SuperArete(swAreteVol, True) : e.Colorer(2, 0, 1, 0) |
206 |
+ |
For Each swAreteCoque As SldWorks.Edge In swAreteCoques |
207 |
+ |
If e.comparer(swAreteCoque) Then |
208 |
+ |
sFace.MettreAttributFaceInterne() |
209 |
+ |
trouve = True : Exit For |
210 |
+ |
End If |
211 |
+ |
Next |
212 |
+ |
If trouve Then trouve = False : Exit For ' on arete de gosser |
213 |
+ |
Next |
214 |
+ |
Next |
215 |
|
|
216 |
|
|
217 |
< |
|
217 |
> |
End Sub |
218 |
|
|
219 |
|
|
220 |
|
End Class |