Hide menu
Loading...
Searching...
No Matches
MTKConverter/MTKConverter.py

Refer to the MTK Converter Example.

MTKConverter_PartProcessor.py

1# $Id$
2
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5
6# This file is part of the Manufacturing Toolkit software.
7
8# You may use this file under the terms of the BSD license as follows:
9
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30from abc import abstractmethod
31
32import manufacturingtoolkit.CadExMTK as mtk
33
34class MTKConverter_ProcessData:
35 def __init__(self, thePart: mtk.ModelData_Part):
36 self.myPart = thePart
37
38class MTKConverter_PartProcessor(mtk.ModelData_ModelElementVoidVisitor):
39 def __init__(self):
40 super().__init__()
41 self.myData = []
42
43 def VisitPart(self, thePart: mtk.ModelData_Part):
44 aBodyList = thePart.Bodies()
45 for aBody in aBodyList:
46 aShapeIt = mtk.ModelData_ShapeIterator(aBody)
47 for aShape in aShapeIt:
48 if aShape.Type() == mtk.ShapeType_Solid:
49 self.ProcessSolid(thePart, mtk.ModelData_Solid.Cast(aShape))
50 elif aShape.Type() == mtk.ShapeType_Shell:
51 self.ProcessShell(thePart, mtk.ModelData_Shell.Cast(aShape))
52
53 self.PostPartProcess (thePart)
54
55 @abstractmethod
56 def ProcessSolid(self, thePart: mtk.ModelData_Part, theSolid: mtk.ModelData_Solid):
57 pass
58
59 @abstractmethod
60 def ProcessShell(self, thePart: mtk.ModelData_Part, theShell: mtk.ModelData_Shell):
61 pass
62
63 @abstractmethod
64 def PostPartProcess(self, thePart: mtk.ModelData_Part):
65 pass
66
67class MTKConverter_VoidPartProcessor(MTKConverter_PartProcessor):
68 def __init__(self):
69 super().__init__()
70
71 def ProcessSolid (self, thePart: mtk.ModelData_Part, theSolid: mtk.ModelData_Solid):
72 pass
73
74 def ProcessShell (self, thePart: mtk.ModelData_Part, theShell: mtk.ModelData_Shell):
75 pass
76
77 def PostPartProcess(self, thePart: mtk.ModelData_Part):
78 pass
79

MTKConverter_MachiningProcessor.py

1# $Id$
2#
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5#
6# This file is part of the Manufacturing Toolkit software.
7#
8# You may use this file under the terms of the BSD license as follows:
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30import manufacturingtoolkit.CadExMTK as mtk
31
32import MTKConverter_PartProcessor as part_proc
33
34class MTKConverter_MachiningData(part_proc.MTKConverter_ProcessData):
35 def __init__(self, thePart: mtk.ModelData_Part):
36 super().__init__(thePart)
37 self.myFeatureList = mtk.MTKBase_FeatureList()
38 self.myIssueList = mtk.MTKBase_FeatureList()
39 self.myOperation = mtk.Machining_OT_Undefined
40
41class MTKConverter_MachiningProcessor(part_proc.MTKConverter_VoidPartProcessor):
42 def __init__(self, theOperation):
43 super().__init__()
44 self.myOperation = theOperation
45
46 def ProcessSolid (self, thePart: mtk.ModelData_Part, theSolid: mtk.ModelData_Solid):
47 aMachiningData = MTKConverter_MachiningData(thePart)
48 self.myData.append(aMachiningData)
49 aMachiningData.myOperation = self.myOperation
50
51 aParams = mtk.Machining_FeatureRecognizerParameters()
52 aParams.SetOperation(self.myOperation)
53 aFeatureRecognizer = mtk.Machining_FeatureRecognizer(aParams)
54 anAnalyzer = mtk.Machining_Analyzer()
55 anAnalyzer.AddTool (aFeatureRecognizer)
56 aData = anAnalyzer.Perform(theSolid)
57 if aData.IsEmpty():
58 return
59
60 # Features
61 for i in aData.FeatureList():
62 aMachiningData.myFeatureList.Append(i)
63
64 # Issues
65 aDrillingParameters = mtk.DFMMachining_DrillingAnalyzerParameters()
66 aDrillingAnalyzer = mtk.DFMMachining_Analyzer(aDrillingParameters)
67 aMachiningData.myIssueList = aDrillingAnalyzer.Perform(theSolid, aData)
68
69 aMillingParameters = mtk.DFMMachining_MillingAnalyzerParameters()
70 aMillingAnalyzer = mtk.DFMMachining_Analyzer(aMillingParameters)
71 aMillingIssueList = aMillingAnalyzer.Perform(theSolid, aData)
72 for anIssue in aMillingIssueList:
73 if self.myOperation == mtk.Machining_OT_LatheMilling and not mtk.DFMMachining_DeepPocketIssue.CompareType(anIssue):
74 continue
75 aMachiningData.myIssueList.Append(anIssue)
76
77 if self.myOperation == mtk.Machining_OT_LatheMilling:
78 aTurninigParameters = mtk.DFMMachining_TurningAnalyzerParameters()
79 aTurningAnalyzer = mtk.DFMMachining_Analyzer(aTurninigParameters)
80 aTurningIssueList = aTurningAnalyzer.Perform(theSolid, aData)
81 for anIssue in aTurningIssueList:
82 aMachiningData.myIssueList.Append(anIssue)

MTKConverter_SheetMetalProcessor.py

1# $Id$
2#
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5#
6# This file is part of the Manufacturing Toolkit software.
7#
8# You may use this file under the terms of the BSD license as follows:
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30import manufacturingtoolkit.CadExMTK as mtk
31
32import MTKConverter_PartProcessor as part_proc
33
34class MTKConverter_UnfoldedPartData:
35 def __init__(self):
36 self.myIsInit = False
37 self.myLength = 0.0
38 self.myWidth = 0.0
39 self.myThickness = 0.0
40 self.myPerimeter = 0.0
41 self.myIssueList = mtk.MTKBase_FeatureList()
42
43class MTKConverter_SheetMetalData(part_proc.MTKConverter_ProcessData):
44 def __init__(self, thePart: mtk.ModelData_Part):
45 super().__init__(thePart)
46 self.myIsSheetMetalPart = True
47 self.myFeatureList = mtk.MTKBase_FeatureList()
48 self.myIssueList = mtk.MTKBase_FeatureList()
49 self.myUnfoldedPartData = MTKConverter_UnfoldedPartData()
50
51class MTKConverter_SheetMetalProcessor(part_proc.MTKConverter_VoidPartProcessor):
52 def __init__(self, theUnfoldedModel: mtk.ModelData_Model):
53 super().__init__()
54 self.myAnalyzer = mtk.SheetMetal_Analyzer()
55 self.myUnfoldedModel = theUnfoldedModel
56 self.myCurrentUnfoldedBody = mtk.ModelData_SheetBody()
57
58 self.myAnalyzer.AddTool(mtk.SheetMetal_FeatureRecognizer())
59 self.myAnalyzer.AddTool(mtk.SheetMetal_Unfolder())
60
61 def __UpdateProcessData(self, theData: mtk.SheetMetal_Data, thePart: mtk.ModelData_Part):
62 anSMData = MTKConverter_SheetMetalData(thePart)
63 self.myData.append(anSMData)
64
65 if theData.IsEmpty():
66 anSMData.myIsSheetMetalPart = False
67 return
68
69 for i in theData.FeatureList():
70 anSMData.myFeatureList.Append(i)
71
72 anUnfoldedData = anSMData.myUnfoldedPartData
73 aFlatPattern = theData.FlatPattern()
74 if not aFlatPattern.IsNull():
75 anUnfoldedShell = aFlatPattern.UnfoldedShell()
76 if anUnfoldedShell:
77 self.myCurrentUnfoldedBody.Append(anUnfoldedShell)
78
79 anUnfoldedData.myIsInit = True
80 anUnfoldedData.myLength = aFlatPattern.Length()
81 anUnfoldedData.myWidth = aFlatPattern.Width()
82 anUnfoldedData.myThickness = aFlatPattern.Thickness()
83 anUnfoldedData.myPerimeter = aFlatPattern.Perimeter()
84
85 aDFMAnalyzer = mtk.DFMSheetMetal_Analyzer()
86 anIssueList = aDFMAnalyzer.Perform(theData)
87 for anIssue in anIssueList:
88 if (anUnfoldedData.myIsInit
89 and (mtk.DFMSheetMetal_FlatPatternInterferenceIssue.CompareType(anIssue)
90 or mtk.DFMSheetMetal_NonStandardSheetSizeIssue.CompareType(anIssue)
91 or mtk.DFMSheetMetal_NonStandardSheetThicknessIssue.CompareType(anIssue))):
92 anUnfoldedData.myIssueList.Append(anIssue)
93 else:
94 anSMData.myIssueList.Append(anIssue)
95
96 def ProcessSolid (self, thePart: mtk.ModelData_Part, theSolid: mtk.ModelData_Solid):
97 anSMData = self.myAnalyzer.Perform(theSolid)
98 self.__UpdateProcessData(anSMData, thePart)
99
100 def ProcessShell (self, thePart: mtk.ModelData_Part, theShell: mtk.ModelData_Shell):
101 anSMData = self.myAnalyzer.Perform(theShell)
102 self.__UpdateProcessData(anSMData, thePart)
103
104 def PostPartProcess(self, thePart: mtk.ModelData_Part):
105 if len(self.myCurrentUnfoldedBody.Shapes()) == 0:
106 return
107
108 anUnfoldedPart = mtk.ModelData_Part(thePart.Name())
109 anUnfoldedPart.SetUuid(thePart.Uuid())
110 anUnfoldedPart.AddBody(self.myCurrentUnfoldedBody)
111
112 self.myUnfoldedModel.AddRoot(anUnfoldedPart)
113 self.myCurrentUnfoldedBody = mtk.ModelData_SheetBody()

MTKConverter_Report.py

1# $Id$
2
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5
6# This file is part of the Manufacturing Toolkit software.
7
8# You may use this file under the terms of the BSD license as follows:
9
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30import io
31import math
32
33import manufacturingtoolkit.CadExMTK as mtk
34
35import MTKConverter_PartProcessor as part_proc
36import MTKConverter_MachiningProcessor as mach_proc
37import MTKConverter_MoldingProcessor as mold_proc
38import MTKConverter_SheetMetalProcessor as sm_proc
39import MTKConverter_WallThicknessProcessor as wt_proc
40
41class Pair:
42 def __init__(self, theFirst: float, theSecond: float):
43 self.First = theFirst
44 self.Second = theSecond
45
46 def __repr__(self):
47 return f"Pair({self.First}, {self.Second})"
48
49 def __str__(self):
50 return f"{self.First:.2f} x {self.Second:.2f}"
51
52class Dimension:
53 def __init__(self, theX: float, theY: float, theZ: float):
54 self.X = theX
55 self.Y = theY
56 self.Z = theZ
57
58 def __repr__(self):
59 return f"Dimension({self.X}, {self.Y}, {self.Z})"
60
61 def __str__(self):
62 return f"{self.X:.2f} x {self.Y:.2f} x {self.Z:.2f}"
63
64class Direction:
65 def __init__(self, theX: float, theY: float, theZ: float):
66 self.X = theX
67 self.Y = theY
68 self.Z = theZ
69
70 def __repr__(self):
71 return f"Direction({self.X}, {self.Y}, {self.Z})"
72
73 def __str__(self):
74 return f"({self.X:.2f}, {self.Y:.2f}, {self.Z:.2f})"
75
76class Point:
77 def __init__(self, theX: float, theY: float, theZ: float):
78 self.X = theX
79 self.Y = theY
80 self.Z = theZ
81
82 def __repr__(self):
83 return f"Point({self.X}, {self.Y}, {self.Z})"
84
85 def __str__(self):
86 return f"({self.X:.2f}, {self.Y:.2f}, {self.Z:.2f})"
87
88class JSONWriter:
89 def __init__(self, theFile: io.TextIOBase, theStartNestingLevel = 0):
90 self.__myStream = theFile
91 self.__myNestingLevel = theStartNestingLevel
92 self.__myPrevNestingLevel = theStartNestingLevel - 1
93 self.__myIsInit = False
94
95 def OpenSection(self, theName = ""):
96 self.__DoOpenSection (theName, '{')
97
98 def OpenArraySection (self, theName: str):
99 self.__DoOpenSection(theName, '[')
100
101 def CloseSection(self):
102 self.__DoCloseSection('}')
103
104 def CloseArraySection(self):
105 self.__DoCloseSection(']')
106
107 def WriteData(self, theParamName: str, theValue):
108 aValueStr = str(theValue)
109 if type(theValue) is float:
110 aValueStr = f"{theValue:.2f}"
111 self.__Stream().write("\"" + theParamName + "\": \"" + aValueStr + "\"")
112
113 def WriteRawData(self, theRawData: str):
114 self.__PrepareStream()
115 self.__myStream.write(theRawData)
116
117 def WriteEmptyArray (self, theParamName: str):
118 self.__Stream().write("\"" + theParamName + "\": []")
119
120 def NestingLevel(self):
121 return self.__myNestingLevel
122
123 def __DoOpenSection(self, theName: str, theOpenBracketSymbol: str):
124 aStream = self.__Stream()
125 if theName:
126 aStream.write("\"" + theName + "\": ")
127 aStream.write(theOpenBracketSymbol)
128 self.__myNestingLevel += 1
129
130 def __DoCloseSection (self, theCloseBracketSymbol: str):
131 self.__myNestingLevel -= 1
132 self.__Stream().write(theCloseBracketSymbol)
133
134 def __PrepareStream(self):
135 if self.__myNestingLevel == self.__myPrevNestingLevel:
136 self.__myStream.write(",")
137 self.__myPrevNestingLevel = self.__myNestingLevel
138 if self.__myIsInit:
139 self.__myStream.write('\n')
140 self.__myIsInit = True
141
142 def __Stream(self):
143 self.__PrepareStream()
144 for i in range(self.__myNestingLevel):
145 self.__myStream.write(" ")
146 return self.__myStream
147
148class FeatureGroupManager:
149 def __init__(self):
150 self.__myGroups = []
151
152 def AddGroupData (self,
153 theGroupName: str,
154 theGroupColor: str,
155 theFeatureData: str,
156 theFeatureNb: int):
157 # Find or create
158 aRes = -1
159 for i in range(len(self.__myGroups)):
160 aGroup = self.__myGroups[i]
161 if aGroup.myName == theGroupName:
162 aRes = i
163 break
164
165 if aRes == -1:
166 self.__myGroups.append(self.FeatureGroup(theGroupName, theGroupColor))
167 aRes = len(self.__myGroups) - 1
168
169 # Update
170 aGroup = self.__myGroups[aRes]
171 aGroup.myFeatureData.append(theFeatureData)
172 aGroup.myFeatureCount += theFeatureNb
173
174 def TotalFeatureCount(self):
175 aTotalFeatureCount = 0
176 for aGroup in self.__myGroups:
177 aTotalFeatureCount += aGroup.myFeatureCount
178 return aTotalFeatureCount
179
180 def Write(self, theWriter: JSONWriter):
181 for aGroup in self.__myGroups:
182 theWriter.OpenSection()
183 theWriter.WriteData("name", aGroup.myName)
184 theWriter.WriteData("color", aGroup.myColor)
185 theWriter.WriteData("totalGroupFeatureCount", aGroup.myFeatureCount)
186
187 aFeatureData = aGroup.myFeatureData
188 if aFeatureData:
189 aHasParams = "parameters" in aFeatureData[0]
190 if aHasParams:
191 theWriter.WriteData ("subGroupCount", len(aFeatureData))
192 theWriter.OpenArraySection ("subGroups")
193 for j in aFeatureData:
194 theWriter.WriteRawData(j)
195 theWriter.CloseArraySection()
196 else:
197 for j in aFeatureData:
198 theWriter.WriteRawData(j)
199
200 theWriter.CloseSection()
201
202 class FeatureGroup:
203 def __init__(self, theName: str, theColor: str):
204 self.myName = theName
205 self.myColor = theColor
206 self.myFeatureData = []
207 self.myFeatureCount = 0
208
209class OrderedFeatureList:
210 def __init__(self):
211 self.__myList = []
212
213 def Append(self, theFeature: mtk.MTKBase_Feature, theShapeIDs):
214 anInsertIndex = 0
215 for i in self.__myList:
216 aRes = OrderedFeatureList.__CompareFeatures(theFeature, i.Feature)
217 if aRes == 0:
218 i.Count += 1
219 i.ShapeIDs.append(theShapeIDs)
220 anInsertIndex = -1
221 break
222 elif aRes < 0:
223 break
224
225 anInsertIndex += 1
226
227 if anInsertIndex >= 0:
228 self.__myList.insert(anInsertIndex, self.FeatureData(theFeature, theShapeIDs))
229
230 def Size(self):
231 return len(self.__myList)
232
233 def GetFeature(self, theIndex: int):
234 return self.__GetFeatureData(theIndex).Feature
235
236 def GetFeatureCount(self, theIndex: int):
237 return self.__GetFeatureData(theIndex).Count
238
239 def GetFeatureShapeIDs(self, theIndex: int):
240 return self.__GetFeatureData(theIndex).ShapeIDs
241
242 def __GetFeatureData(self, theIndex: int):
243 return self.__myList[theIndex]
244
245 @staticmethod
246 def __CompareFeatures(theA: mtk.MTKBase_Feature, theB: mtk.MTKBase_Feature):
247 aComparator = mtk.MTKBase_FeatureComparator()
248 anALessThanB = aComparator(theA, theB)
249 if anALessThanB:
250 return -1
251
252 aBLessThanA = aComparator(theB, theA)
253 if aBLessThanA:
254 return 1
255
256 return 0
257
258 class FeatureData:
259 def __init__(self, theFeature: mtk.MTKBase_Feature, theShapeIDs):
260 self.Feature = theFeature
261 self.Count = 1
262 self.ShapeIDs = []
263 self.ShapeIDs.append(theShapeIDs)
264
265class MTKConverter_Report:
266 def __init__(self):
267 self.__myData = []
268
269 def AddData(self, theData: part_proc.MTKConverter_ProcessData):
270 self.__myData.append(theData)
271
272 def WriteToJSON(self, thePath: str):
273 aFile = open(thePath, "w")
274 if not aFile:
275 return False
276
277 aWriter = JSONWriter(aFile)
278 aWriter.OpenSection()
279 aWriter.WriteData("version", "1")
280
281 if not self.__myData:
282 aWriter.WriteData("error", "The model doesn't contain any parts.")
283 else:
284 aWriter.OpenArraySection("parts")
285 for aProcessData in self.__myData:
286 aWriter.OpenSection()
287 MTKConverter_Report.__WritePartProcessData(aWriter, aProcessData)
288 aWriter.CloseSection()
289 aWriter.CloseArraySection()
290 aWriter.CloseSection()
291
292 aFile.close()
293 return True
294
295 @staticmethod
296 def __WriteParameter(theWriter: JSONWriter, theParamName: str, theParamUnits: str, theParamValue):
297 theWriter.OpenSection()
298 theWriter.WriteData("name", theParamName)
299 theWriter.WriteData("units", theParamUnits)
300 theWriter.WriteData("value", theParamValue)
301 theWriter.CloseSection()
302
303 @staticmethod
304 def __WriteShapeIDs(theWriter: JSONWriter, theVector):
305 if not theVector:
306 return
307
308 theWriter.WriteData("featureCount", len(theVector))
309 theWriter.OpenArraySection("features")
310
311 for aShapeIDVector in theVector:
312 theWriter.OpenSection()
313 theWriter.WriteData("shapeIDCount", len(aShapeIDVector))
314 if not aShapeIDVector:
315 theWriter.WriteEmptyArray("shapeIDs")
316 else:
317 theWriter.OpenArraySection("shapeIDs")
318 for aShapeID in aShapeIDVector:
319 theWriter.OpenSection()
320 theWriter.WriteData("id", aShapeID)
321 theWriter.CloseSection()
322 theWriter.CloseArraySection()
323 theWriter.CloseSection()
324
325 theWriter.CloseArraySection()
326
327 @staticmethod
328 def __DoWriteFeatureDataToString (theFunc, theParamCount: int, theVector):
329 aStream = io.StringIO()
330 aWriter = JSONWriter(aStream, 7)
331
332 aWriter.OpenSection()
333 aWriter.WriteData("parametersCount", theParamCount)
334 aWriter.OpenArraySection("parameters")
335 theFunc(aWriter)
336 aWriter.CloseArraySection()
337 MTKConverter_Report.__WriteShapeIDs(aWriter, theVector)
338 aWriter.CloseSection()
339
340 aRes = aStream.getvalue()
341 aStream.close()
342 return aRes
343
344 @staticmethod
345 def __WriteFeatureDataToString0(theVector):
346 aStream = io.StringIO()
347 aWriter = JSONWriter(aStream, 6)
348
349 MTKConverter_Report.__WriteShapeIDs(aWriter, theVector)
350
351 aRes = aStream.getvalue()
352 aStream.close()
353 return aRes
354
355 @staticmethod
356 def __WriteFeatureDataToString1(theParamName: str, theParamUnits: str, theParamValue, theVector):
357 def WriteParams (theWriter: JSONWriter):
358 MTKConverter_Report.__WriteParameter(theWriter, theParamName, theParamUnits, theParamValue)
359 return MTKConverter_Report.__DoWriteFeatureDataToString(WriteParams, 1, theVector)
360
361 @staticmethod
362 def __WriteFeatureDataToString2(theParamName1: str, theParamUnits1: str, theParamValue1,
363 theParamName2: str, theParamUnits2: str, theParamValue2,
364 theVector):
365 def WriteParams (theWriter: JSONWriter):
366 MTKConverter_Report.__WriteParameter(theWriter, theParamName1, theParamUnits1, theParamValue1)
367 MTKConverter_Report.__WriteParameter(theWriter, theParamName2, theParamUnits2, theParamValue2)
368 return MTKConverter_Report.__DoWriteFeatureDataToString (WriteParams, 2, theVector)
369
370 @staticmethod
371 def __WriteFeatureDataToString3(theParamName1: str, theParamUnits1: str, theParamValue1,
372 theParamName2: str, theParamUnits2: str, theParamValue2,
373 theParamName3: str, theParamUnits3: str, theParamValue3,
374 theVector):
375 def WriteParams (theWriter: JSONWriter):
376 MTKConverter_Report.__WriteParameter(theWriter, theParamName1, theParamUnits1, theParamValue1)
377 MTKConverter_Report.__WriteParameter(theWriter, theParamName2, theParamUnits2, theParamValue2)
378 MTKConverter_Report.__WriteParameter(theWriter, theParamName3, theParamUnits3, theParamValue3)
379 return MTKConverter_Report.__DoWriteFeatureDataToString (WriteParams, 3, theVector)
380
381 @staticmethod
382 def __WriteFeatureDataToString4(theParamName1: str, theParamUnits1: str, theParamValue1,
383 theParamName2: str, theParamUnits2: str, theParamValue2,
384 theParamName3: str, theParamUnits3: str, theParamValue3,
385 theParamName4: str, theParamUnits4: str, theParamValue4,
386 theVector):
387 def WriteParams (theWriter: JSONWriter):
388 MTKConverter_Report.__WriteParameter(theWriter, theParamName1, theParamUnits1, theParamValue1)
389 MTKConverter_Report.__WriteParameter(theWriter, theParamName2, theParamUnits2, theParamValue2)
390 MTKConverter_Report.__WriteParameter(theWriter, theParamName3, theParamUnits3, theParamValue3)
391 MTKConverter_Report.__WriteParameter(theWriter, theParamName4, theParamUnits4, theParamValue4)
392 return MTKConverter_Report.__DoWriteFeatureDataToString (WriteParams, 4, theVector)
393
394 @staticmethod
395 def __MachiningFaceTypeToString(theType):
396 aFaceTypeMap = {
397 mtk.Machining_FT_FlatFaceMilled: "Flat Face Milled Face(s)",
398 mtk.Machining_FT_FlatSideMilled: "Flat Side Milled Face(s)",
399 mtk.Machining_FT_CurvedMilled: "Curved Milled Face(s)",
400 mtk.Machining_FT_CircularMilled: "Circular Milled Face(s)",
401 mtk.Machining_FT_Deburr: "Deburr Face(s)",
402 mtk.Machining_FT_ConvexProfileEdgeMilling: "Convex Profile Edge Milling Face(s)",
403 mtk.Machining_FT_ConcaveFilletEdgeMilling: "Concave Fillet Edge Milling Face(s)",
404 mtk.Machining_FT_FlatMilled: "Flat Milled Face(s)",
405 mtk.Machining_FT_TurnDiameter: "Turn Diameter Face(s)",
406 mtk.Machining_FT_TurnForm: "Turn Form Face(s)",
407 mtk.Machining_FT_TurnFace: "Turn Face Face(s)",
408 mtk.Machining_FT_Bore: "Bore Face(s)"
409 }
410
411 if theType in aFaceTypeMap:
412 return aFaceTypeMap[theType]
413 else:
414 return "Face(s)"
415
416 @staticmethod
417 def __MachiningFaceColor(theType):
418 aFaceTypeMap = {
419 mtk.Machining_FT_FlatFaceMilled: "(115, 251, 253)",
420 mtk.Machining_FT_FlatSideMilled: "(0, 35, 245)",
421 mtk.Machining_FT_CurvedMilled: "(22, 65, 124)",
422 mtk.Machining_FT_CircularMilled: "(255, 254, 145)",
423 mtk.Machining_FT_Deburr: "(0, 0, 0)",
424 mtk.Machining_FT_ConvexProfileEdgeMilling: "(240, 155, 89)",
425 mtk.Machining_FT_ConcaveFilletEdgeMilling: "(129, 127, 38)",
426 mtk.Machining_FT_FlatMilled: "(115, 43, 245)",
427 mtk.Machining_FT_TurnDiameter: "(88, 19, 94)",
428 mtk.Machining_FT_TurnForm: "(161, 251, 142)",
429 mtk.Machining_FT_TurnFace: "(239, 136, 190)",
430 mtk.Machining_FT_Bore: "(127, 130, 187)"
431 }
432
433 if theType in aFaceTypeMap:
434 return aFaceTypeMap[theType]
435 else:
436 return "(0, 0, 0)"
437
438 @staticmethod
439 def __MachiningHoleTypeToString(theType):
440 aHoleTypeMap = {
441 mtk.Machining_HT_Through: "Through Hole(s)",
442 mtk.Machining_HT_FlatBottom: "Flat Bottom Hole(s)",
443 mtk.Machining_HT_Blind: "Blind Hole(s)",
444 mtk.Machining_HT_Partial: "Partial Hole(s)"
445 }
446
447 if theType in aHoleTypeMap:
448 return aHoleTypeMap[theType]
449 else:
450 return "Hole(s)"
451
452 @staticmethod
453 def __MachiningHoleColor(theType):
454 aHoleTypeMap = {
455 mtk.Machining_HT_Through: "(240, 135, 132)",
456 mtk.Machining_HT_FlatBottom: "(235, 51, 36)",
457 mtk.Machining_HT_Blind: "(142, 64, 58)",
458 mtk.Machining_HT_Partial: "(58, 6, 3)"
459 }
460
461 if theType in aHoleTypeMap:
462 return aHoleTypeMap[theType]
463 else:
464 return "(0, 0, 0)"
465
466 @staticmethod
467 def __MachiningPocketTypeToString(theType):
468 aPocketTypeMap = {
469 mtk.Machining_PT_Closed: "Closed Pocket(s)",
470 mtk.Machining_PT_Open: "Open Pocket(s)",
471 mtk.Machining_PT_Through: "Through Pocket(s)"
472 }
473
474 if theType in aPocketTypeMap:
475 return aPocketTypeMap[theType]
476 else:
477 return "Pocket(s)"
478
479 @staticmethod
480 def __MachiningPocketColor(theType):
481 aPocketTypeMap = {
482 mtk.Machining_PT_Closed: "(81, 20, 0)",
483 mtk.Machining_PT_Open: "(189, 103, 37)",
484 mtk.Machining_PT_Through: "(255, 217, 188)"
485 }
486
487 if theType in aPocketTypeMap:
488 return aPocketTypeMap[theType]
489 else:
490 return "(0, 0, 0)"
491
492 @staticmethod
493 def __HemTypeToString(theType):
494 aHemTypeMap = {
495 mtk.SheetMetal_HBT_Flattened: "Flattened Hem Bend(s)",
496 mtk.SheetMetal_HBT_Open: "Open Hem Bend(s)",
497 mtk.SheetMetal_HBT_Teardrop: "Teardrop Hem Bend(s)",
498 mtk.SheetMetal_HBT_Rope: "Rope Hem Bend(s)",
499 mtk.SheetMetal_HBT_Rolled: "Rolled Hem Bend(s)"
500 }
501
502 if theType in aHemTypeMap:
503 return aHemTypeMap[theType]
504 else:
505 return "Hem Bend(s)"
506
507 @staticmethod
508 def __MachiningTurningGrooveTypeToString(theType):
509 aTurningGrooveTypeMap = {
510 mtk.Machining_TGT_OuterDiameter: "Outer Diameter Groove(s)",
511 mtk.Machining_TGT_InnerDiameter: "Inner Diameter Groove(s)",
512 mtk.Machining_TGT_EndFace: "End Face Groove(s)"
513 }
514
515 if theType in aTurningGrooveTypeMap:
516 return aTurningGrooveTypeMap[theType]
517 else:
518 return "Turning Groove(s)"
519
520 @staticmethod
521 def __MachiningTurningGrooveColor(theType):
522 aTurningGrooveTypeMap = {
523 mtk.Machining_TGT_OuterDiameter: "(175, 49, 37)",
524 mtk.Machining_TGT_InnerDiameter: "(234, 255, 53)",
525 mtk.Machining_TGT_EndFace: "(144, 66, 159)"
526 }
527
528 if theType in aTurningGrooveTypeMap:
529 return aTurningGrooveTypeMap[theType]
530 else:
531 return "(0, 0, 0)"
532
533 @staticmethod
534 def __BendName(theBend: mtk.SheetMetal_Bend):
535 if mtk.SheetMetal_HemBend.CompareType(theBend):
536 aHemBend = mtk.SheetMetal_HemBend.Cast(theBend)
537 return MTKConverter_Report.__HemTypeToString(aHemBend.Type())
538 elif mtk.SheetMetal_CurvedBend.CompareType(theBend):
539 return "Curved Bend(s)"
540 return "Bend(s)"
541
542 @staticmethod
543 def __BendColor(theBend: mtk.SheetMetal_Bend):
544 if mtk.SheetMetal_HemBend.CompareType(theBend):
545 aHemBend = mtk.SheetMetal_HemBend.Cast(theBend)
546 aType = aHemBend.Type()
547
548 aHemTypeMap = {
549 mtk.SheetMetal_HBT_Flattened: "(22, 65, 124)",
550 mtk.SheetMetal_HBT_Open: "(42, 85, 144)",
551 mtk.SheetMetal_HBT_Teardrop: "(62, 105, 164)",
552 mtk.SheetMetal_HBT_Rope: "(82, 125, 184)",
553 mtk.SheetMetal_HBT_Rolled: "(102, 145, 204)"
554 }
555
556 if aType in aHemTypeMap:
557 return aHemTypeMap[aType]
558 else:
559 return "(0, 0, 0)"
560 elif mtk.SheetMetal_CurvedBend.CompareType(theBend):
561 return "(255, 254, 145)"
562 return "(0, 35, 245)"
563
564 @staticmethod
565 def __SheetMetalHoleName(theHole: mtk.SheetMetal_Hole):
566 if mtk.SheetMetal_ComplexHole.CompareType(theHole):
567 return "Complex Hole(s)"
568 return "Hole(s)"
569
570 @staticmethod
571 def __SheetMetalHoleColor(theHole: mtk.SheetMetal_Hole):
572 if mtk.SheetMetal_ComplexHole.CompareType(theHole):
573 return "(115, 43, 245)"
574 return "(129, 127, 38)"
575
576 @staticmethod
577 def __SmallDistanceIssueName(theIssue: mtk.DFMSheetMetal_SmallDistanceBetweenFeaturesIssue):
578 if mtk.DFMSheetMetal_SmallDistanceBetweenBendAndLouverIssue.CompareType(theIssue):
579 return "Small Distance Between Bend And Louver Issue(s)"
580 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndBendIssue.CompareType(theIssue):
581 return "Small Distance Between Extruded Hole And Bend Issue(s)"
582 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndEdgeIssue.CompareType(theIssue):
583 return "Small Distance Between Extruded Hole And Edge Issue(s)"
584 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHolesIssue.CompareType(theIssue):
585 return "Small Distance Between Extruded Holes Issue(s)"
586 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndBendIssue.CompareType(theIssue):
587 return "Small Distance Between Hole And Bend Issue(s)"
588 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndCutoutIssue.CompareType(theIssue):
589 return "Small Distance Between Hole And Cutout Issue(s)"
590 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndEdgeIssue.CompareType(theIssue):
591 return "Small Distance Between Hole And Edge Issue(s)"
592 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndLouverIssue.CompareType(theIssue):
593 return "Small Distance Between Hole And Louver Issue(s)"
594 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndNotchIssue.CompareType(theIssue):
595 return "Small Distance Between Hole And Notch Issue(s)"
596 elif mtk.DFMSheetMetal_SmallDistanceBetweenHolesIssue.CompareType(theIssue):
597 return "Small Distance Between Holes Issue(s)"
598 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchAndBendIssue.CompareType(theIssue):
599 return "Small Distance Between Notch And Bend Issue(s)"
600 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchesIssue.CompareType(theIssue):
601 return "Small Distance Between Notches Issue(s)"
602 elif mtk.DFMSheetMetal_SmallDistanceBetweenTabsIssue.CompareType(theIssue):
603 return "Small Distance Between Tabs Issue(s)"
604 return "Small Distance Between Feature(s)"
605
606 @staticmethod
607 def __SmallDistanceIssueColor(theIssue: mtk.DFMSheetMetal_SmallDistanceBetweenFeaturesIssue):
608 if mtk.DFMSheetMetal_SmallDistanceBetweenBendAndLouverIssue.CompareType(theIssue):
609 return "(195, 56, 19)"
610 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndBendIssue.CompareType(theIssue):
611 return "(212, 75, 90)"
612 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndEdgeIssue.CompareType(theIssue):
613 return "(198, 75, 105)"
614 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHolesIssue.CompareType(theIssue):
615 return "(170, 65, 120)"
616 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndBendIssue.CompareType(theIssue):
617 return "(239, 136, 190)"
618 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndCutoutIssue.CompareType(theIssue):
619 return "(127, 130, 187)"
620 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndEdgeIssue.CompareType(theIssue):
621 return "(240, 135, 132)"
622 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndLouverIssue.CompareType(theIssue):
623 return "(15, 5, 129)"
624 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndNotchIssue.CompareType(theIssue):
625 return "(235, 51, 36)"
626 elif mtk.DFMSheetMetal_SmallDistanceBetweenHolesIssue.CompareType(theIssue):
627 return "(142, 64, 58)"
628 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchAndBendIssue.CompareType(theIssue):
629 return "(58, 6, 3)"
630 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchesIssue.CompareType(theIssue):
631 return "(0, 215, 3)"
632 elif mtk.DFMSheetMetal_SmallDistanceBetweenTabsIssue.CompareType(theIssue):
633 return "(157, 160, 207)"
634 return "(0, 0, 0)"
635
636 @staticmethod
637 def __AddShapeFeature(theManager: FeatureGroupManager, theFeature: mtk.MTKBase_ShapeFeature, theCount: int, theShapeIdVector):
638 aFeature = theFeature
639 #machining
640 if mtk.Machining_TurningFace.CompareType(aFeature):
641 aTurningFace = mtk.Machining_TurningFace.Cast(aFeature)
642 aType = aTurningFace.Type()
643 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString1("Radius", "mm", aTurningFace.Radius(), theShapeIdVector)
644 theManager.AddGroupData(MTKConverter_Report.__MachiningFaceTypeToString(aType),
645 MTKConverter_Report.__MachiningFaceColor(aType),
646 aFeatureData, theCount)
647 elif mtk.Machining_Face.CompareType(aFeature):
648 aFace = mtk.Machining_Face.Cast(aFeature)
649 aType = aFace.Type()
650 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
651 theManager.AddGroupData(MTKConverter_Report.__MachiningFaceTypeToString(aType),
652 MTKConverter_Report.__MachiningFaceColor(aType),
653 aFeatureData, theCount)
654 elif mtk.Machining_Countersink.CompareType(aFeature):
655 aCountersink = mtk.Machining_Countersink.Cast(aFeature)
656 anAxis = aCountersink.Axis().Axis()
657 aDirection = Direction(anAxis.X(), anAxis.Y(), anAxis.Z())
658 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
659 "Radius", "mm", aCountersink.Radius(),
660 "Depth", "mm", aCountersink.Depth(),
661 "Axis", "", aDirection,
662 theShapeIdVector)
663 theManager.AddGroupData("Countersink(s)", "(55, 125, 34)", aFeatureData, theCount)
664 elif mtk.Machining_Hole.CompareType(aFeature):
665 aHole = mtk.Machining_Hole.Cast(aFeature)
666 anAxis = aHole.Axis().Axis()
667 aDirection = Direction(anAxis.X(), anAxis.Y(), anAxis.Z())
668 aType = aHole.Type()
669 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
670 "Radius", "mm", aHole.Radius(),
671 "Depth", "mm", aHole.Depth(),
672 "Axis", "", aDirection,
673 theShapeIdVector)
674 theManager.AddGroupData(MTKConverter_Report.__MachiningHoleTypeToString(aType),
675 MTKConverter_Report.__MachiningHoleColor(aType),
676 aFeatureData, theCount)
677 elif mtk.Machining_Pocket.CompareType(aFeature):
678 aPocket = mtk.Machining_Pocket.Cast(aFeature)
679 anAxis = aPocket.Axis().Direction()
680 aDirection = Direction(anAxis.X(), anAxis.Y(), anAxis.Z())
681 aType = aPocket.Type()
682 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString4(
683 "Length", "mm", aPocket.Length(),
684 "Width", "mm", aPocket.Width(),
685 "Depth", "mm", aPocket.Depth(),
686 "Axis", "", aDirection,
687 theShapeIdVector)
688 theManager.AddGroupData(MTKConverter_Report.__MachiningPocketTypeToString(aType),
689 MTKConverter_Report.__MachiningPocketColor(aType),
690 aFeatureData, theCount)
691 elif mtk.Machining_TurningGroove.CompareType(aFeature):
692 aTurningGroove = mtk.Machining_TurningGroove.Cast(aFeature)
693 aType = aTurningGroove.Type()
694 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString4(
695 "Radius", "mm", aTurningGroove.Radius(),
696 "Depth", "mm", aTurningGroove.Depth(),
697 "Width", "mm", aTurningGroove.Width(),
698 theShapeIdVector)
699 theManager.AddGroupData(MTKConverter_Report.__MachiningTurningGrooveTypeToString(aType),
700 MTKConverter_Report.__MachiningTurningGrooveColor(aType),
701 aFeatureData, theCount)
702
703 #molding
704 elif mtk.Molding_ScrewBoss.CompareType(aFeature):
705 aScrewBoss = mtk.Molding_ScrewBoss.Cast(aFeature)
706 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
707 "Outer Radius", "mm", aScrewBoss.OuterRadius(),
708 "Inner Radius", "mm", aScrewBoss.InnerRadius(),
709 "Draft Angle", "deg", aScrewBoss.DraftAngle() * 180 / math.pi,
710 theShapeIdVector)
711 theManager.AddGroupData("Screw Boss(es)", "(12, 32, 63)", aFeatureData, theCount)
712 elif mtk.MTKBase_Boss.CompareType(aFeature):
713 aBoss = mtk.MTKBase_Boss.Cast(aFeature)
714 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
715 "Length", "mm", aBoss.Length(),
716 "Width", "mm", aBoss.Width(),
717 "Height", "mm", aBoss.Height(),
718 theShapeIdVector)
719 theManager.AddGroupData ("Boss(es)", "(56, 72, 13)", aFeatureData, theCount)
720 elif mtk.Molding_Rib.CompareType(aFeature):
721 aRib = mtk.Molding_Rib.Cast(aFeature)
722 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString4(
723 "Length", "mm", aRib.Length(),
724 "Height", "mm", aRib.Height(),
725 "Thickness", "mm", aRib.Thickness(),
726 "Draft Angle", "deg", aRib.DraftAngle() * 180 / math.pi,
727 theShapeIdVector)
728 theManager.AddGroupData("Rib(s)", "(34, 51, 127)", aFeatureData, theCount)
729
730 #sheet metal
731 elif mtk.SheetMetal_Bead.CompareType(aFeature):
732 aBead = mtk.SheetMetal_Bead.Cast(aFeature)
733 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString1("Depth", "mm", aBead.Depth(), theShapeIdVector)
734 theManager.AddGroupData("Bead(s)", "(115, 251, 253)", aFeatureData, theCount)
735 elif mtk.SheetMetal_Bend.CompareType(aFeature):
736 aBend = mtk.SheetMetal_Bend.Cast(aFeature)
737 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString4(
738 "Radius", "mm", aBend.Radius(),
739 "Angle", "deg", aBend.Angle() * 180 / math.pi,
740 "Length", "mm", aBend.Length(),
741 "Width", "mm", aBend.Width(),
742 theShapeIdVector)
743 theManager.AddGroupData(MTKConverter_Report.__BendName(aBend), MTKConverter_Report.__BendColor(aBend),
744 aFeatureData, theCount)
745 elif mtk.SheetMetal_Bridge.CompareType(aFeature):
746 aBridge = mtk.SheetMetal_Bridge.Cast(aFeature)
747 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
748 "Length", "mm", aBridge.Length(),
749 "Depth", "mm", aBridge.Depth(),
750 theShapeIdVector)
751 theManager.AddGroupData("Bridge(s)", "(240, 155, 89)", aFeatureData, theCount)
752 elif mtk.SheetMetal_Hole.CompareType(aFeature):
753 aHole = mtk.SheetMetal_Hole.Cast(aFeature)
754 anAxis = aHole.Axis().Axis()
755 aDirection = Direction(anAxis.X(), anAxis.Y(), anAxis.Z())
756 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
757 "Radius", "mm", aHole.Radius(),
758 "Depth", "mm", aHole.Depth(),
759 "Axis", "", aDirection,
760 theShapeIdVector)
761 theManager.AddGroupData (MTKConverter_Report.__SheetMetalHoleName(aHole),
762 MTKConverter_Report.__SheetMetalHoleColor(aHole),
763 aFeatureData, theCount)
764 elif mtk.SheetMetal_Cutout.CompareType(aFeature):
765 aCutout = mtk.SheetMetal_Cutout.Cast(aFeature)
766 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString1("Perimeter", "mm", aCutout.Perimeter(), theShapeIdVector)
767 theManager.AddGroupData ("Cutout(s)", "(88, 19, 94)", aFeatureData, theCount)
768 elif mtk.SheetMetal_Louver.CompareType(aFeature):
769 aLouver = mtk.SheetMetal_Louver.Cast(aFeature)
770 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString1(
771 "Depth", "mm", aLouver.Depth(),
772 theShapeIdVector)
773 theManager.AddGroupData("Louver(s)", "(161, 251, 142)", aFeatureData, theCount)
774 elif mtk.SheetMetal_Notch.CompareType(aFeature):
775 aNotch = mtk.SheetMetal_Notch.Cast(aFeature)
776 if mtk.SheetMetal_StraightNotch.CompareType(aNotch):
777 aStraightNotch = mtk.SheetMetal_StraightNotch.Cast(aNotch)
778 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
779 "Length", "mm", aNotch.Length(),
780 "Width", "mm", aNotch.Width(),
781 "Corner Fillet Radius", "mm", aStraightNotch.CornerFilletRadius(),
782 theShapeIdVector)
783 theManager.AddGroupData ("Straight Notch(es)", "(240, 135, 132)", aFeatureData, theCount)
784 elif mtk.SheetMetal_VNotch.CompareType(aNotch):
785 aVNotch = mtk.SheetMetal_VNotch.Cast(aNotch)
786 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
787 "Length", "mm", aNotch.Length(),
788 "Width", "mm", aNotch.Width(),
789 "Angle", "deg", aVNotch.Angle() * 180 / math.pi,
790 theShapeIdVector)
791 theManager.AddGroupData ("V Notch(es)", "(235, 51, 36)", aFeatureData, theCount)
792 else:
793 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
794 "Length", "mm", aNotch.Length(),
795 "Width", "mm", aNotch.Width(),
796 theShapeIdVector)
797 theManager.AddGroupData("Notch(es)", "(239, 136, 190)", aFeatureData, theCount)
798 elif mtk.SheetMetal_Tab.CompareType(aFeature):
799 aTab = mtk.SheetMetal_Tab.Cast(aFeature)
800 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
801 "Length", "mm", aTab.Length(),
802 "Width", "mm", aTab.Width(),
803 theShapeIdVector)
804 theManager.AddGroupData("Tab(s)", "(127, 130, 187)", aFeatureData, theCount)
805
806 @staticmethod
807 def __AddDrillingIssue(theManager: FeatureGroupManager, theIssue: mtk.DFMMachining_DrillingIssue, theCount: int, theShapeIdVector):
808 if mtk.DFMMachining_SmallDiameterHoleIssue.CompareType(theIssue):
809 aSmallHoleIssue = mtk.DFMMachining_SmallDiameterHoleIssue.Cast(theIssue)
810 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
811 "Expected Minimum Diameter", "mm", aSmallHoleIssue.ExpectedMinDiameter(),
812 "Actual Diameter", "mm", aSmallHoleIssue.ActualDiameter(),
813 theShapeIdVector)
814 theManager.AddGroupData("Small Diameter Hole(s)", "(115, 251, 253)", aFeatureData, theCount)
815 elif mtk.DFMMachining_DeepHoleIssue.CompareType(theIssue):
816 aDeepHoleIssue = mtk.DFMMachining_DeepHoleIssue.Cast(theIssue)
817 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
818 "Expected Maximum Depth", "mm", aDeepHoleIssue.ExpectedMaxDepth(),
819 "Actual Depth", "mm", aDeepHoleIssue.ActualDepth(), theShapeIdVector)
820 theManager.AddGroupData("Deep Hole(s)", "(0, 35, 245)", aFeatureData, theCount)
821 elif mtk.DFMMachining_NonStandardDiameterHoleIssue.CompareType(theIssue):
822 aNSDiameterHoleIssue = mtk.DFMMachining_NonStandardDiameterHoleIssue.Cast(theIssue)
823 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
824 "Nearest Standard Diameter", "mm", aNSDiameterHoleIssue.NearestStandardDiameter(),
825 "Actual Diameter", "mm", aNSDiameterHoleIssue.ActualDiameter(),
826 theShapeIdVector)
827 theManager.AddGroupData("Non Standard Diameter Hole(s)", "(22, 65, 124)", aFeatureData, theCount)
828 elif mtk.DFMMachining_NonStandardDrillPointAngleBlindHoleIssue.CompareType(theIssue):
829 aNSDrillPointAngleBlindHoleIssue = mtk.DFMMachining_NonStandardDrillPointAngleBlindHoleIssue.Cast(theIssue)
830 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
831 "Nearest Standard Angle", "deg", aNSDrillPointAngleBlindHoleIssue.NearestStandardAngle() * 180 / math.pi,
832 "Actual Angle", "deg", aNSDrillPointAngleBlindHoleIssue.ActualAngle() * 180 / math.pi,
833 theShapeIdVector)
834 theManager.AddGroupData("Non Standard Drill Point Angle Blind Hole(s)", "(88, 13, 78)", aFeatureData, theCount)
835 elif mtk.DFMMachining_PartialHoleIssue.CompareType(theIssue):
836 aPartialHoleIssue = mtk.DFMMachining_PartialHoleIssue.Cast(theIssue)
837 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
838 "Expected Minimum Material Percent", "%", aPartialHoleIssue.ExpectedMinMaterialPercent() * 100,
839 "Actual Material Percent", "%", aPartialHoleIssue.ActualMaterialPercent() * 100,
840 theShapeIdVector)
841 theManager.AddGroupData("Partial Hole(s)", "(255, 254, 145)", aFeatureData, theCount)
842 elif mtk.DFMMachining_FlatBottomHoleIssue.CompareType(theIssue):
843 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
844 theManager.AddGroupData("Flat Bottom Hole(s)", "(240, 155, 89)", aFeatureData, theCount)
845 elif mtk.DFMMachining_NonPerpendicularHoleIssue.CompareType(theIssue):
846 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
847 theManager.AddGroupData("Non Perpendicular Hole(s)", "(129, 127, 38)", aFeatureData, theCount)
848 elif mtk.DFMMachining_IntersectingCavityHoleIssue.Cast(theIssue):
849 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
850 theManager.AddGroupData("Intersecting Cavity Hole(s)", "(115, 43, 245)", aFeatureData, theCount)
851
852 @staticmethod
853 def __AddMillingIssue(theManager: FeatureGroupManager, theIssue: mtk.DFMMachining_MillingIssue, theCount: int, theShapeIdVector):
854 if mtk.DFMMachining_NonStandardRadiusMilledPartFloorFilletIssue.CompareType(theIssue):
855 aFloorRadiusIssue = mtk.DFMMachining_NonStandardRadiusMilledPartFloorFilletIssue.Cast(theIssue)
856 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
857 "Nearest Standard Radius", "mm", aFloorRadiusIssue.NearestStandardRadius(),
858 "Actual Radius", "mm", aFloorRadiusIssue.ActualRadius(),
859 theShapeIdVector)
860 theManager.AddGroupData("Non Standard Radius Milled Part Floor Fillet Issue(s)", "(0, 215, 3)", aFeatureData, theCount)
861 elif mtk.DFMMachining_DeepPocketIssue.CompareType(theIssue):
862 aDeepPocketIssue = mtk.DFMMachining_DeepPocketIssue.Cast(theIssue)
863 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
864 "Expected Maximum Depth", "mm", aDeepPocketIssue.ExpectedMaxDepth(),
865 "Actual Depth", "mm", aDeepPocketIssue.ActualDepth(),
866 theShapeIdVector)
867 theManager.AddGroupData("Deep Pocket Issue(s)", "(190, 10, 100)", aFeatureData, theCount)
868 elif mtk.DFMMachining_HighBossIssue.CompareType(theIssue):
869 aHighBossIssue = mtk.DFMMachining_HighBossIssue.Cast(theIssue)
870 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
871 "Expected Maximum Height", "mm", aHighBossIssue.ExpectedMaxHeight(),
872 "Actual Height", "mm", aHighBossIssue.ActualHeight(),
873 theShapeIdVector)
874 theManager.AddGroupData("High Boss Issue(s)", "(180, 100, 50)", aFeatureData, theCount)
875 elif mtk.DFMMachining_LargeMilledPartIssue.CompareType(theIssue):
876 aLMPIssue = mtk.DFMMachining_LargeMilledPartIssue.Cast(theIssue)
877 anExpectedSize = aLMPIssue.ExpectedMaxMilledPartSize()
878 anActualSize = aLMPIssue.ActualMilledPartSize()
879 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
880 "Expected Maximum Size (LxWxH)", "mm",
881 Dimension(anExpectedSize.Length(), anExpectedSize.Width(), anExpectedSize.Height()),
882 "Actual Size (LxWxH)", "mm",
883 Dimension(anActualSize.Length(), anActualSize.Width(), anActualSize.Height()),
884 theShapeIdVector)
885 theManager.AddGroupData("Large Milled Part(s)", "(17, 37, 205)", aFeatureData, theCount)
886 elif mtk.DFMMachining_SmallRadiusMilledPartInternalCornerIssue.CompareType(theIssue):
887 aMSICRIssue = mtk.DFMMachining_SmallRadiusMilledPartInternalCornerIssue.Cast(theIssue)
888 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
889 "Expected Minimum Radius", "mm", aMSICRIssue.ExpectedMinRadius(),
890 "Actual Radius", "mm", aMSICRIssue.ActualRadius(),
891 theShapeIdVector)
892 theManager.AddGroupData("Small Radius Milled Part Internal Corner(s)", "(10, 10, 200)", aFeatureData, theCount)
893 elif mtk.DFMMachining_NonPerpendicularMilledPartShapeIssue.CompareType(theIssue):
894 aNPMPSIssue = mtk.DFMMachining_NonPerpendicularMilledPartShapeIssue.Cast(theIssue)
895 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString1(
896 "Actual Angle", "deg", aNPMPSIssue.ActualAngle() * 180 / math.pi,
897 theShapeIdVector)
898 theManager.AddGroupData("Non Perpendicular Milled Part Shape(s)", "(129, 227, 138)", aFeatureData, theCount)
899 elif mtk.DFMMachining_MilledPartExternalEdgeFilletIssue.CompareType(theIssue):
900 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
901 theManager.AddGroupData("Milled Part External Edge Fillet(s)", "(201, 227, 13)", aFeatureData, theCount)
902 elif mtk.DFMMachining_InconsistentRadiusMilledPartFloorFilletIssue.CompareType(theIssue):
903 anInconsistentRadiusIssue = mtk.DFMMachining_InconsistentRadiusMilledPartFloorFilletIssue.Cast(theIssue)
904 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
905 "Expected Radius", "mm", anInconsistentRadiusIssue.ExpectedRadius(),
906 "Actual Radius", "mm", anInconsistentRadiusIssue.ActualRadius(),
907 theShapeIdVector)
908 theManager.AddGroupData("Inconsistent Radius Milled Part Floor Fillet Issue(s)", "(180, 15, 190)", aFeatureData, theCount)
909 elif mtk.DFMMachining_NarrowRegionInPocketIssue.CompareType(theIssue):
910 aNarrowRegionIssue = mtk.DFMMachining_NarrowRegionInPocketIssue.Cast(theIssue)
911 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
912 "Expected Minimum Region Size", "mm", aNarrowRegionIssue.ExpectedMinRegionSize(),
913 "Actual Region Size", "mm", aNarrowRegionIssue.ActualRegionSize(),
914 theShapeIdVector)
915 theManager.AddGroupData("Narrow Region In Pocket Issue(s)", "(70, 150, 150)", aFeatureData, theCount)
916 elif mtk.DFMMachining_LargeDifferenceRegionsSizeInPocketIssue.CompareType(theIssue):
917 aLargeRatioIssue = mtk.DFMMachining_LargeDifferenceRegionsSizeInPocketIssue.Cast(theIssue)
918 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
919 "Expected Regions Maximum To Minimum Size Ratio", "", aLargeRatioIssue.ExpectedMaxRegionsMaxToMinSizeRatio(),
920 "Actual Regions Maximum To Minimum Size Ratio", "", aLargeRatioIssue.ActualMaxRegionsMaxToMinSizeRatio(),
921 theShapeIdVector)
922 theManager.AddGroupData("Large Difference Regions Size In Pocket Issue(s)", "(100, 150, 150)", aFeatureData, theCount)
923 elif mtk.DFMMachining_SmallWallThicknessIssue.CompareType(theIssue):
924 aSWTIssue = mtk.DFMMachining_SmallWallThicknessIssue.Cast(theIssue)
925 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
926 "Expected Minimum Thickness", "mm", aSWTIssue.ExpectedMinThickness(),
927 "Actual Thickness", "mm", aSWTIssue.ActualThickness(),
928 theShapeIdVector)
929 theManager.AddGroupData("Small Wall Thickness Issue(s)", "(64, 224, 208)", aFeatureData, theCount)
930
931 @staticmethod
932 def __AddTurningIssue(theManager: FeatureGroupManager, theIssue: mtk.DFMBase_Issue, theCount: int, theShapeIdVector):
933 if mtk.DFMMachining_LargeTurnedPartIssue.CompareType(theIssue):
934 aLTSIssue = mtk.DFMMachining_LargeTurnedPartIssue.Cast(theIssue)
935 anExpectedSize = aLTSIssue.ExpectedMaxTurnedPartSize()
936 anActualSize = aLTSIssue.ActualTurnedPartSize()
937 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
938 "Expected Maximum Size (LxR)", "mm", Pair(anExpectedSize.Length(), anExpectedSize.Radius()),
939 "Actual Size (LxR)", "mm", Pair(anActualSize.Length(), anActualSize.Radius()),
940 theShapeIdVector)
941 theManager.AddGroupData("Large Turned Part(s)", "(195, 195, 195)", aFeatureData, theCount)
942 elif mtk.DFMMachining_LongSlenderTurnedPartIssue.CompareType(theIssue):
943 aLSTIssue = mtk.DFMMachining_LongSlenderTurnedPartIssue.Cast(theIssue)
944 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
945 "Expected Maximum Length", "mm", aLSTIssue.ExpectedMaxLength(),
946 "Actual Length", "mm", aLSTIssue.ActualLength(),
947 "Actual Minimum Diameter", "mm", aLSTIssue.ActualMinDiameter(),
948 theShapeIdVector)
949 theManager.AddGroupData("Long-Slender Turned Part(s)", "(195, 195, 195)", aFeatureData, theCount)
950 elif mtk.DFMMachining_SmallDepthBlindBoredHoleReliefIssue.CompareType(theIssue):
951 aBBHRIssue = mtk.DFMMachining_SmallDepthBlindBoredHoleReliefIssue.Cast(theIssue)
952 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
953 "Expected Minimum Relief Depth", "mm", aBBHRIssue.ExpectedMinReliefDepth(),
954 "Actual Relief Depth", "mm", aBBHRIssue.ActualReliefDepth(),
955 "Actual Diameter", "mm", aBBHRIssue.ActualDiameter(),
956 theShapeIdVector)
957 theManager.AddGroupData("Small Depth Blind Bored Hole Relief(s)", "(88, 19, 94)", aFeatureData, theCount)
958 elif mtk.DFMMachining_DeepBoredHoleIssue.CompareType(theIssue):
959 aISBHIssue = mtk.DFMMachining_DeepBoredHoleIssue.Cast(theIssue)
960 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
961 "Expected Maximum Depth", "mm", aISBHIssue.ExpectedMaxDepth(),
962 "Actual Depth", "mm", aISBHIssue.ActualDepth(),
963 "Actual Diameter", "mm", aISBHIssue.ActualDiameter(),
964 theShapeIdVector)
965 theManager.AddGroupData("Deep Bored Hole(s)", "(161, 251, 142)", aFeatureData, theCount)
966 elif mtk.DFMMachining_IrregularTurnedPartOuterDiameterProfileReliefIssue.CompareType(theIssue):
967 aODPRIssue = mtk.DFMMachining_IrregularTurnedPartOuterDiameterProfileReliefIssue.Cast(theIssue)
968 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
969 "Expected Maximum Face Incline Angle", "deg", aODPRIssue.ExpectedMaxFaceInclineAngle() * 180 / math.pi,
970 "Actual Face Incline Angle", "deg", aODPRIssue.ActualFaceInclineAngle() * 180 / math.pi,
971 theShapeIdVector)
972 theManager.AddGroupData("Irregular Turned Part Outer Diameter Profile Relief(s)", "(239, 136, 190)", aFeatureData, theCount)
973 elif mtk.DFMMachining_SmallRadiusTurnedPartInternalCornerIssue.CompareType(theIssue):
974 aTSICRIssue = mtk.DFMMachining_SmallRadiusTurnedPartInternalCornerIssue.Cast(theIssue)
975 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
976 "Expected Minimum Radius", "mm", aTSICRIssue.ExpectedMinRadius(),
977 "Actual Radius", "mm", aTSICRIssue.ActualRadius(),
978 theShapeIdVector)
979 theManager.AddGroupData("Small Radius Turned Part Internal Corner(s)", "(127, 130, 187)", aFeatureData, theCount)
980 elif mtk.DFMMachining_SquareEndKeywayIssue.CompareType(theIssue):
981 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
982 theManager.AddGroupData("Square End Keyway(s)", "(157, 160, 207)", aFeatureData, theCount)
983 elif mtk.DFMMachining_NonSymmetricalAxialSlotIssue.CompareType(theIssue):
984 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
985 theManager.AddGroupData("Non Symmetrical Axial Slot(s)", "(130, 170, 200)", aFeatureData, theCount)
986
987 @staticmethod
988 def __AddMoldingIssue(theManager: FeatureGroupManager, theIssue: mtk.DFMBase_Issue, theCount: int, theShapeIdVector):
989 if mtk.DFMMolding_HighRibIssue.CompareType(theIssue):
990 aHRIssue = mtk.DFMMolding_HighRibIssue.Cast(theIssue)
991 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
992 "Expected Maximum Height", "mm", aHRIssue.ExpectedMaxHeight(),
993 "Actual Height", "mm", aHRIssue.ActualHeight(),
994 theShapeIdVector)
995 theManager.AddGroupData("High Rib(s)", "(284, 36, 12)", aFeatureData, theCount)
996 elif mtk.DFMMolding_HighScrewBossIssue.CompareType(theIssue):
997 aHSBIssue = mtk.DFMMolding_HighScrewBossIssue.Cast(theIssue)
998 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
999 "Expected Maximum Height", "mm", aHSBIssue.ExpectedMaxHeight(),
1000 "Actual Height", "mm", aHSBIssue.ActualHeight(),
1001 theShapeIdVector)
1002 theManager.AddGroupData("High Screw Boss(es)", "(16, 75, 95)", aFeatureData, theCount)
1003 elif mtk.DFMMolding_IrregularCoreDepthScrewBossIssue.CompareType(theIssue):
1004 aICDSBIssue = mtk.DFMMolding_IrregularCoreDepthScrewBossIssue.Cast(theIssue)
1005 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1006 "Actual Height", "mm", aICDSBIssue.ActualHeight(),
1007 "Actual Core Depth", "mm", aICDSBIssue.ActualCoreDepth(),
1008 theShapeIdVector)
1009 theManager.AddGroupData("Irregular Core Depth Screw Boss(es)", "(56, 176, 95)", aFeatureData, theCount)
1010 elif mtk.DFMMolding_IrregularCoreDiameterScrewBossIssue.CompareType(theIssue):
1011 aICDSBIssue = mtk.DFMMolding_IrregularCoreDiameterScrewBossIssue.Cast(theIssue)
1012 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1013 "Expected Minimum Outer Diameter", "mm", aICDSBIssue.ExpectedMinCoreDiameter(),
1014 "Expected Maximum Outer Diameter", "mm", aICDSBIssue.ExpectedMaxCoreDiameter(),
1015 "actual core diameter", "mm", aICDSBIssue.ActualCoreDiameter(),
1016 theShapeIdVector)
1017 theManager.AddGroupData("Irregular Core Diameter Screw Boss(es)", "(195, 195, 195)", aFeatureData, theCount)
1018 elif mtk.DFMMolding_IrregularThicknessRibIssue.CompareType(theIssue):
1019 aITRIssue = mtk.DFMMolding_IrregularThicknessRibIssue.Cast(theIssue)
1020 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1021 "Expected Minimum Thickness", "mm", aITRIssue.ExpectedMinThickness(),
1022 "Expected Maximum Thickness", "mm", aITRIssue.ExpectedMaxThickness(),
1023 "Actual Thickness", "mm", aITRIssue.ActualThickness(),
1024 theShapeIdVector)
1025 theManager.AddGroupData("Irregular Thickness Rib(s)", "(68, 114, 250)", aFeatureData, theCount)
1026 elif mtk.DFMMolding_IrregularWallThicknessIssue.CompareType(theIssue):
1027 aIWTIssue = mtk.DFMMolding_IrregularWallThicknessIssue.Cast(theIssue)
1028 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1029 "Expected Maximum Wall Thickness", "mm", aIWTIssue.ExpectedMaxThickness(),
1030 "Expected Minimum Wall Thickness", "mm", aIWTIssue.ExpectedMinThickness(),
1031 "Actual Wall Thickness", "mm", aIWTIssue.ActualThickness(),
1032 theShapeIdVector)
1033 theManager.AddGroupData ("Irregular Wall(s)", "(23, 11, 19)", aFeatureData, theCount)
1034 elif mtk.DFMMolding_IrregularWallThicknessScrewBossIssue.CompareType(theIssue):
1035 aIWTSBIssue = mtk.DFMMolding_IrregularWallThicknessScrewBossIssue.Cast(theIssue)
1036 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1037 "Expected Maximum Thickness", "mm", aIWTSBIssue.ExpectedMaxThickness(),
1038 "Expected Minimum Thickness", "mm", aIWTSBIssue.ExpectedMinThickness(),
1039 "Actual Thickness", "mm", aIWTSBIssue.ActualThickness(),
1040 theShapeIdVector)
1041 theManager.AddGroupData("Irregular Wall Thickness Screw Boss(es)", "(13, 12, 245)", aFeatureData, theCount)
1042 elif mtk.DFMMolding_LargeWallThicknessIssue.CompareType(theIssue):
1043 aLWTIssue = mtk.DFMMolding_LargeWallThicknessIssue.Cast(theIssue)
1044 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1045 "Expected Maximum Wall Thickness", "mm", aLWTIssue.ExpectedMaxThickness(),
1046 "Actual Wall Thickness", "mm", aLWTIssue.ActualThickness(),
1047 theShapeIdVector)
1048 theManager.AddGroupData ("Large Wall(s)", "(101, 22, 129)", aFeatureData, theCount)
1049 elif mtk.DFMMolding_SmallBaseRadiusRibIssue.CompareType(theIssue):
1050 aSBRRIssue = mtk.DFMMolding_SmallBaseRadiusRibIssue.Cast(theIssue)
1051 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1052 "Expected Minimum Base Radius", "mm", aSBRRIssue.ExpectedMinBaseRadius(),
1053 "Actual Base Radius", "mm", aSBRRIssue.ActualBaseRadius(),
1054 theShapeIdVector)
1055 theManager.AddGroupData ("Small Base Radius Rib(s)", "(13, 12, 90)", aFeatureData, theCount)
1056 elif mtk.DFMMolding_SmallBaseRadiusScrewBossIssue.CompareType(theIssue):
1057 aSBRSBIssue = mtk.DFMMolding_SmallBaseRadiusScrewBossIssue.Cast(theIssue)
1058 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1059 "Expected Minimum Base Radius", "mm", aSBRSBIssue.ExpectedMinBaseRadius(),
1060 "Actual Base Radius", "mm", aSBRSBIssue.ActualBaseRadius(),
1061 theShapeIdVector)
1062 theManager.AddGroupData ("Small Base Radius Screw Boss(es)", "(56, 18, 23)", aFeatureData, theCount)
1063 elif mtk.DFMMolding_SmallDraftAngleRibIssue.CompareType(theIssue):
1064 aSDARIssue = mtk.DFMMolding_SmallDraftAngleRibIssue.Cast(theIssue)
1065 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1066 "Expected Minimum Draft Angle", "deg", aSDARIssue.ExpectedMinDraftAngle() * 180. / math.pi,
1067 "Actual Draft Angle", "deg", aSDARIssue.ActualDraftAngle() * 180. / math.pi,
1068 theShapeIdVector)
1069 theManager.AddGroupData("Small Draft Angle Rib(s)", "(189, 200, 13)", aFeatureData, theCount)
1070 elif mtk.DFMMolding_SmallDistanceBetweenRibsIssue.CompareType(theIssue):
1071 aSDBRIssue = mtk.DFMMolding_SmallDistanceBetweenRibsIssue.Cast(theIssue)
1072 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1073 "Expected Minimum Distance", "mm", aSDBRIssue.ExpectedMinDistanceBetweenRibs(),
1074 "Actual Distance", "mm", aSDBRIssue.ActualDistanceBetweenRibs(),
1075 theShapeIdVector)
1076 theManager.AddGroupData("Small Distance Between Ribs Issue(s)", "(11, 90, 111)", aFeatureData, theCount)
1077 elif mtk.DFMMolding_SmallDraftAngleScrewBossIssue.CompareType(theIssue):
1078 aSDASBIssue = mtk.DFMMolding_SmallDraftAngleScrewBossIssue.Cast(theIssue)
1079 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1080 "Expected Minimum Draft Angle", "deg", aSDASBIssue.ExpectedMinDraftAngle() * 180. / math.pi,
1081 "Actual Draft Angle", "deg", aSDASBIssue.ActualDraftAngle() * 180. / math.pi,
1082 theShapeIdVector)
1083 theManager.AddGroupData("Small Draft Angle Screw Boss(es)", "(27, 101, 27)", aFeatureData, theCount)
1084 elif mtk.DFMMolding_SmallHoleBaseRadiusScrewBossIssue.CompareType(theIssue):
1085 aSHBRSBIssue = mtk.DFMMolding_SmallHoleBaseRadiusScrewBossIssue.Cast(theIssue)
1086 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1087 "Expected Minimum Hole Base Radius", "mm", aSHBRSBIssue.ExpectedMinHoleBaseRadius(),
1088 "Actual Hole Base Radius", "mm", aSHBRSBIssue.ActualHoleBaseRadius(),
1089 theShapeIdVector)
1090 theManager.AddGroupData("Small Hole Base Radius Screw Boss(es)", "(98, 8, 2)", aFeatureData, theCount)
1091 elif mtk.DFMMolding_SmallDraftAngleWallIssue.CompareType(theIssue):
1092 aSDAWIssue = mtk.DFMMolding_SmallDraftAngleWallIssue.Cast(theIssue)
1093 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1094 "Expected Minimum Draft Angle", "deg", aSDAWIssue.ExpectedMinDraftAngle() * 180. / math.pi,
1095 "Actual Draft Angle", "deg", aSDAWIssue.ActualDraftAngle() * 180. / math.pi,
1096 theShapeIdVector)
1097 theManager.AddGroupData("Small Draft Angle Wall(s)", "(101, 67, 33)", aFeatureData, theCount)
1098 elif mtk.DFMMolding_NonChamferedScrewBossIssue.CompareType(theIssue):
1099 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
1100 theManager.AddGroupData("Non Chamfered Screw Boss(es)", "(38, 38, 10)", aFeatureData, theCount)
1101 elif mtk.DFMMolding_SmallWallThicknessIssue.CompareType(theIssue):
1102 aSWTIssue = mtk.DFMMolding_SmallWallThicknessIssue.Cast(theIssue)
1103 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1104 "Expected Minimum Wall Thickness", "mm", aSWTIssue.ExpectedMinThickness(),
1105 "Actual Wall Thickness", "mm", aSWTIssue.ActualThickness(),
1106 theShapeIdVector)
1107 theManager.AddGroupData ("Small Wall(s)", "(14, 209, 199)", aFeatureData, theCount)
1108 elif mtk.DFMMolding_SmallDistanceBetweenBossesIssue.CompareType(theIssue):
1109 aSDBBIssue = mtk.DFMMolding_SmallDistanceBetweenBossesIssue.Cast(theIssue)
1110 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1111 "Expected Minimum Distance Between Bosses", "mm", aSDBBIssue.ExpectedMinDistanceBetweenBosses(),
1112 "Actual Distance Between Bosses", "mm", aSDBBIssue.ActualDistanceBetweenBosses(),
1113 theShapeIdVector)
1114 theManager.AddGroupData ("Small Distance Between Bosses Issue(s)", "(255, 102, 0)", aFeatureData, theCount)
1115
1116 @staticmethod
1117 def __AddSheetMetalIssue(theManager: FeatureGroupManager, theIssue: mtk.DFMBase_Issue, theCount: int, theShapeIdVector):
1118 if mtk.DFMSheetMetal_FlatPatternInterferenceIssue.CompareType(theIssue):
1119 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString0(theShapeIdVector)
1120 theManager.AddGroupData("Flat Pattern Interference(s)", "(115, 251, 253)", aFeatureData, theCount)
1121 elif mtk.DFMSheetMetal_IrregularCornerFilletRadiusNotchIssue.CompareType(theIssue):
1122 aICFRNIssue = mtk.DFMSheetMetal_IrregularCornerFilletRadiusNotchIssue.Cast(theIssue)
1123 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1124 "Expected Corner Fillet Radius", "mm", aICFRNIssue.ExpectedCornerFilletRadius(),
1125 "Actual Corner Fillet Radius", "mm", aICFRNIssue.ActualCornerFilletRadius(),
1126 theShapeIdVector)
1127 theManager.AddGroupData("Irregular Corner Fillet Radius Notch(es)", "(239, 136, 190)", aFeatureData, theCount)
1128 elif mtk.DFMSheetMetal_IrregularDepthExtrudedHoleIssue.CompareType(theIssue):
1129 aIDEHIssue = mtk.DFMSheetMetal_IrregularDepthExtrudedHoleIssue.Cast(theIssue)
1130 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1131 "Expected Minimum Extruded Height", "mm", aIDEHIssue.ExpectedMinExtrudedHeight(),
1132 "Expected Maximum Extruded Height", "mm", aIDEHIssue.ExpectedMaxExtrudedHeight(),
1133 "Actual Extruded Height", "mm", aIDEHIssue.ActualExtrudedHeight(),
1134 theShapeIdVector)
1135 theManager.AddGroupData("Irregular Depth Extruded Hole(s)", "(50, 120, 210)", aFeatureData, theCount)
1136 elif mtk.DFMSheetMetal_IrregularRadiusOpenHemBendIssue.CompareType(theIssue):
1137 aIROHBIssue = mtk.DFMSheetMetal_IrregularRadiusOpenHemBendIssue.Cast(theIssue)
1138 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1139 "Expected Radius", "mm", aIROHBIssue.ExpectedRadius(),
1140 "Actual Radius", "mm", aIROHBIssue.ActualRadius(),
1141 theShapeIdVector)
1142 theManager.AddGroupData("Irregular Radius Open Hem Bend(s)", "(188, 121, 11)", aFeatureData, theCount)
1143 elif mtk.DFMSheetMetal_InconsistentRadiusBendIssue.CompareType(theIssue):
1144 aIRBIssue = mtk.DFMSheetMetal_InconsistentRadiusBendIssue.Cast(theIssue)
1145 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1146 "Expected Radius", "mm", aIRBIssue.ExpectedRadius(),
1147 "Actual Radius", "mm", aIRBIssue.ActualRadius(),
1148 theShapeIdVector)
1149 theManager.AddGroupData("Inconsistent Radius Bend(s)", "(0, 35, 245)", aFeatureData, theCount)
1150 elif mtk.DFMSheetMetal_IrregularSizeBendReliefIssue.CompareType(theIssue):
1151 aISBRIssue = mtk.DFMSheetMetal_IrregularSizeBendReliefIssue.Cast(theIssue)
1152 anExpectedRelief = aISBRIssue.ExpectedMinBendRelief()
1153 aFirstActualRelief = aISBRIssue.FirstActualRelief()
1154 aSecondActualRelief = aISBRIssue.SecondActualRelief()
1155 aFeatureData = ""
1156 if (not aFirstActualRelief.IsNull()) and (not aSecondActualRelief.IsNull()):
1157 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString3(
1158 "Expected Minimum Relief Size (LxW)", "mm", Pair(anExpectedRelief.Length(), anExpectedRelief.Width()),
1159 "First Actual Relief Size (LxW)", "mm", Pair(aFirstActualRelief.Length(), aFirstActualRelief.Width()),
1160 "Second Actual Relief Size (LxW)", "mm", Pair(aSecondActualRelief.Length(), aSecondActualRelief.Width()),
1161 theShapeIdVector)
1162 elif aFirstActualRelief.IsNull():
1163 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1164 "Expected Minimum Relief Size (LxW)", "mm", Pair(anExpectedRelief.Length(), anExpectedRelief.Width()),
1165 "Actual Relief Size (LxW)", "mm", Pair(aSecondActualRelief.Length(), aSecondActualRelief.Width()),
1166 theShapeIdVector)
1167 else:
1168 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1169 "Expected Minimum Relief Size (LxW)", "mm", Pair(anExpectedRelief.Length(), anExpectedRelief.Width()),
1170 "Actual Relief Size (LxW)", "mm", Pair(aFirstActualRelief.Length(), aFirstActualRelief.Width()),
1171 theShapeIdVector)
1172 theManager.AddGroupData("Irregular Size Bend Relief(s)", "(22, 65, 124)", aFeatureData, theCount)
1173 elif mtk.DFMSheetMetal_IrregularSizeNotchIssue.CompareType(theIssue):
1174 aISNIssue = mtk.DFMSheetMetal_IrregularSizeNotchIssue.Cast(theIssue)
1175 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1176 "Expected Size (LxW)", "mm", Pair(aISNIssue.ExpectedLength(), aISNIssue.ExpectedWidth()),
1177 "Actual Size (LxW)", "mm", Pair(aISNIssue.ActualLength(), aISNIssue.ActualWidth()),
1178 theShapeIdVector)
1179 theManager.AddGroupData("Irregular Size Notch(s)", "(255, 254, 145)", aFeatureData, theCount)
1180 elif mtk.DFMSheetMetal_IrregularSizeTabIssue.CompareType(theIssue):
1181 aISTIssue = mtk.DFMSheetMetal_IrregularSizeTabIssue.Cast(theIssue)
1182 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1183 "Expected Size (LxW)", "mm", Pair(aISTIssue.ExpectedLength(), aISTIssue.ExpectedWidth()),
1184 "Actual Size (LxW)", "mm", Pair(aISTIssue.ActualLength(), aISTIssue.ActualWidth()),
1185 theShapeIdVector)
1186 theManager.AddGroupData("Irregular Size Tab(s)", "(240, 155, 89)", aFeatureData, theCount)
1187 elif mtk.DFMSheetMetal_LargeDepthBeadIssue.CompareType(theIssue):
1188 aLDBIssue = mtk.DFMSheetMetal_LargeDepthBeadIssue.Cast(theIssue)
1189 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1190 "Expected Maximum Depth", "mm", aLDBIssue.ExpectedMaxDepth(),
1191 "Actual Depth", "mm", aLDBIssue.ActualDepth(),
1192 theShapeIdVector)
1193 theManager.AddGroupData("Large Depth Bead(s)", "(129, 127, 38)", aFeatureData, theCount)
1194 elif mtk.DFMSheetMetal_SmallDepthLouverIssue.CompareType(theIssue):
1195 aSDLIssue = mtk.DFMSheetMetal_SmallDepthLouverIssue.Cast(theIssue)
1196 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1197 "Expected Minimum Depth", "mm", aSDLIssue.ExpectedMinDepth(),
1198 "Actual Depth", "mm", aSDLIssue.ActualDepth(),
1199 theShapeIdVector)
1200 theManager.AddGroupData("Small Depth Louver(s)", "(190, 127, 58)", aFeatureData, theCount)
1201 elif mtk.DFMSheetMetal_NonStandardSheetSizeIssue.CompareType(theIssue):
1202 aNSSSIssue = mtk.DFMSheetMetal_NonStandardSheetSizeIssue.Cast(theIssue)
1203 aNesrestStandardSize = aNSSSIssue.NearestStandardSheetSize()
1204 anActualSize = aNSSSIssue.ActualSheetSize()
1205 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1206 "Nearest Standard Size (LxW)", "mm", Pair(aNesrestStandardSize.Length(), aNesrestStandardSize.Width()),
1207 "Actual Size (LxW)", "mm", Pair(anActualSize.Length(), anActualSize.Width()),
1208 theShapeIdVector)
1209 theManager.AddGroupData("Non Standard Sheet Size(s)", "(0, 0, 0)", aFeatureData, theCount)
1210 elif mtk.DFMSheetMetal_NonStandardSheetThicknessIssue.CompareType(theIssue):
1211 aNSSTIssue = mtk.DFMSheetMetal_NonStandardSheetThicknessIssue.Cast(theIssue)
1212 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1213 "Nearest Standard Thickness", "mm", aNSSTIssue.NearestStandardSheetThickness(),
1214 "Actual Thickness", "mm", aNSSTIssue.ActualSheetThickness(),
1215 theShapeIdVector)
1216 theManager.AddGroupData("Non Standard Sheet Thickness(s)", "(0, 0, 0)", aFeatureData, theCount)
1217 elif mtk.DFMSheetMetal_SmallDiameterHoleIssue.CompareType(theIssue):
1218 aSDHIssue = mtk.DFMSheetMetal_SmallDiameterHoleIssue.Cast(theIssue)
1219 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1220 "Expected Minimum Diameter", "mm", aSDHIssue.ExpectedMinDiameter(),
1221 "Actual Diameter", "mm", aSDHIssue.ActualDiameter(),
1222 theShapeIdVector)
1223 theManager.AddGroupData("Small Diameter Hole(s)", "(115, 43, 245)", aFeatureData, theCount)
1224 elif mtk.DFMSheetMetal_SmallLengthFlangeIssue.CompareType(theIssue):
1225 aSLFIssue = mtk.DFMSheetMetal_SmallLengthFlangeIssue.Cast(theIssue)
1226 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1227 "Expected Minimum Length", "mm", aSLFIssue.ExpectedMinLength(),
1228 "Actual Length", "mm", aSLFIssue.ActualLength(),
1229 theShapeIdVector)
1230 theManager.AddGroupData("Small Length Flange(s)", "(88, 19, 94)", aFeatureData, theCount)
1231 elif mtk.DFMSheetMetal_SmallLengthHemBendFlangeIssue.CompareType(theIssue):
1232 aSLHBFIssue = mtk.DFMSheetMetal_SmallLengthHemBendFlangeIssue.Cast(theIssue)
1233 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1234 "Expected Minimum Length", "mm", aSLHBFIssue.ExpectedMinLength(),
1235 "Actual Length", "mm", aSLHBFIssue.ActualLength(),
1236 theShapeIdVector)
1237 theManager.AddGroupData("Small Length Hem Bend Flange(s)", "(70, 139, 51)", aFeatureData, theCount)
1238 elif mtk.DFMSheetMetal_SmallRadiusBendIssue.CompareType(theIssue):
1239 aSRBIssue = mtk.DFMSheetMetal_SmallRadiusBendIssue.Cast(theIssue)
1240 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1241 "Expected Minimum Radius", "mm", aSRBIssue.ExpectedMinRadius(),
1242 "Actual Radius", "mm", aSRBIssue.ActualRadius(),
1243 theShapeIdVector)
1244 theManager.AddGroupData("Small Radius Bend(s)", "(161, 251, 142)", aFeatureData, theCount)
1245 elif mtk.DFMSheetMetal_SmallDistanceBetweenFeaturesIssue.CompareType(theIssue):
1246 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenFeaturesIssue.Cast(theIssue)
1247 aFeatureData = MTKConverter_Report.__WriteFeatureDataToString2(
1248 "Expected Minimum Distance", "mm", aSDIssue.ExpectedMinDistanceBetweenFeatures(),
1249 "Actual Distance", "mm", aSDIssue.ActualDistanceBetweenFeatures(),
1250 theShapeIdVector)
1251 theManager.AddGroupData(MTKConverter_Report.__SmallDistanceIssueName(aSDIssue),
1252 MTKConverter_Report.__SmallDistanceIssueColor(aSDIssue),
1253 aFeatureData, theCount)
1254
1255 @staticmethod
1256 def __GetShapesId(theShape: mtk.ModelData_Shape, theType):
1257 aShapeIdVector = []
1258 aShapeIt = mtk.ModelData_ShapeIterator(theShape, theType)
1259 for aShape in aShapeIt:
1260 aShapeIdVector.append(aShape.Id())
1261 return aShapeIdVector
1262
1263 @staticmethod
1264 def __AddShapesId(theShape: mtk.ModelData_Shape, theType, theShapesIdVec):
1265 aShapeIt = mtk.ModelData_ShapeIterator(theShape, theType)
1266 for aShape in aShapeIt:
1267 theShapesIdVec.append(aShape.Id())
1268
1269 @staticmethod
1270 def __SortFeatures(theFeatures: mtk.MTKBase_FeatureList, theOrderedFeatureList: OrderedFeatureList):
1271 for aFeature in theFeatures:
1272 if mtk.MTKBase_CompositeFeature.CompareType(aFeature):
1273 aCompositeFeature = mtk.MTKBase_CompositeFeature.Cast(aFeature)
1274 MTKConverter_Report.__SortFeatures(aCompositeFeature.FeatureList(), theOrderedFeatureList)
1275 continue
1276
1277 #features
1278 if mtk.MTKBase_ShapeFeature.CompareType(aFeature):
1279 aShapeFeature = mtk.MTKBase_ShapeFeature.Cast(aFeature)
1280 aShapeType = mtk.ShapeType_Face
1281 if (mtk.SheetMetal_Cutout.CompareType(aFeature)
1282 or (mtk.SheetMetal_Hole.CompareType(aFeature) and not mtk.SheetMetal_ComplexHole.CompareType(aFeature))
1283 or mtk.SheetMetal_Notch.CompareType(aFeature) or mtk.SheetMetal_Tab.CompareType(aFeature)):
1284 aShapeType = mtk.ShapeType_Edge
1285 aShapeIdVector = MTKConverter_Report.__GetShapesId(aShapeFeature.Shape(), aShapeType)
1286 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1287
1288 #dfm machining drilling
1289 elif mtk.DFMMachining_DrillingIssue.CompareType(aFeature):
1290 anIssue = mtk.DFMMachining_DrillingIssue.Cast(aFeature)
1291 aShapeIdVector = MTKConverter_Report.__GetShapesId(anIssue.Hole().Shape(), mtk.ShapeType_Face)
1292 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1293
1294 #dfm machining milling
1295 elif mtk.DFMMachining_NonStandardRadiusMilledPartFloorFilletIssue.CompareType(aFeature):
1296 aNSRMPFFIssue = mtk.DFMMachining_NonStandardRadiusMilledPartFloorFilletIssue.Cast(aFeature)
1297 aShapeIdVector = MTKConverter_Report.__GetShapesId(aNSRMPFFIssue.FloorFillet(), mtk.ShapeType_Face)
1298 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1299 elif mtk.DFMMachining_DeepPocketIssue.CompareType(aFeature):
1300 aDCIssue = mtk.DFMMachining_DeepPocketIssue.Cast(aFeature)
1301 aShapeIdVector = MTKConverter_Report.__GetShapesId(aDCIssue.Pocket().Shape(), mtk.ShapeType_Face)
1302 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1303 elif mtk.DFMMachining_HighBossIssue.CompareType(aFeature):
1304 aHBIssue = mtk.DFMMachining_HighBossIssue.Cast(aFeature)
1305 aShapeIdVector = MTKConverter_Report.__GetShapesId(aHBIssue.Boss().Shape(), mtk.ShapeType_Face)
1306 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1307 elif mtk.DFMMachining_LargeMilledPartIssue.CompareType(aFeature):
1308 aShapeIdVector = []
1309 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1310 elif mtk.DFMMachining_SmallRadiusMilledPartInternalCornerIssue.CompareType(aFeature):
1311 aMSICRIssue = mtk.DFMMachining_SmallRadiusMilledPartInternalCornerIssue.Cast(aFeature)
1312 aShapeIdVector = MTKConverter_Report.__GetShapesId(aMSICRIssue.Shape(), mtk.ShapeType_Face)
1313 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1314 elif mtk.DFMMachining_NonPerpendicularMilledPartShapeIssue.CompareType(aFeature):
1315 aNPMPSIssue = mtk.DFMMachining_NonPerpendicularMilledPartShapeIssue.Cast(aFeature)
1316 aShapeIdVector = MTKConverter_Report.__GetShapesId(aNPMPSIssue.Shape(), mtk.ShapeType_Face)
1317 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1318 elif mtk.DFMMachining_MilledPartExternalEdgeFilletIssue.CompareType(aFeature):
1319 aMPEEFIssue = mtk.DFMMachining_MilledPartExternalEdgeFilletIssue.Cast(aFeature)
1320 aShapeIdVector = MTKConverter_Report.__GetShapesId(aMPEEFIssue.Fillet(), mtk.ShapeType_Face)
1321 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1322 elif mtk.DFMMachining_InconsistentRadiusMilledPartFloorFilletIssue.CompareType(aFeature):
1323 aIRMPFFIssue = mtk.DFMMachining_InconsistentRadiusMilledPartFloorFilletIssue.Cast(aFeature)
1324 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIRMPFFIssue.FloorFillet(), mtk.ShapeType_Face)
1325 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1326 elif mtk.DFMMachining_NarrowRegionInPocketIssue.CompareType(aFeature):
1327 aNRIPIssue = mtk.DFMMachining_NarrowRegionInPocketIssue.Cast(aFeature)
1328 aShapeIdVector = []
1329 MTKConverter_Report.__AddShapesId(aNRIPIssue.InnerFeature(), mtk.ShapeType_Face, aShapeIdVector)
1330 MTKConverter_Report.__AddShapesId(aNRIPIssue.NarrowRegionSidewall(), mtk.ShapeType_Face, aShapeIdVector)
1331 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1332 elif mtk.DFMMachining_LargeDifferenceRegionsSizeInPocketIssue.CompareType(aFeature):
1333 aLDRSIPIssue = mtk.DFMMachining_LargeDifferenceRegionsSizeInPocketIssue.Cast(aFeature)
1334 aShapeIdVector = []
1335 MTKConverter_Report.__AddShapesId(aLDRSIPIssue.InnerFeature(), mtk.ShapeType_Face, aShapeIdVector)
1336 MTKConverter_Report.__AddShapesId(aLDRSIPIssue.MinRegionPocketSidewall(), mtk.ShapeType_Face, aShapeIdVector)
1337 MTKConverter_Report.__AddShapesId(aLDRSIPIssue.MaxRegionPocketSidewall(), mtk.ShapeType_Face, aShapeIdVector)
1338 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1339 elif mtk.DFMMachining_SmallWallThicknessIssue.CompareType(aFeature):
1340 aSWTIssue = mtk.DFMMachining_SmallWallThicknessIssue.Cast(aFeature)
1341 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSWTIssue.Shape(), mtk.ShapeType_Face)
1342 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1343
1344 #dfm machining turning
1345 elif mtk.DFMMachining_SmallDepthBlindBoredHoleReliefIssue.CompareType(aFeature):
1346 aBBHRIssue = mtk.DFMMachining_SmallDepthBlindBoredHoleReliefIssue.Cast(aFeature)
1347 aShapeIdVector = MTKConverter_Report.__GetShapesId(aBBHRIssue.BlindBoredHole(), mtk.ShapeType_Face)
1348 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1349 elif mtk.DFMMachining_DeepBoredHoleIssue.CompareType(aFeature):
1350 aISBHIssue = mtk.DFMMachining_DeepBoredHoleIssue.Cast(aFeature)
1351 aShapeIdVector = MTKConverter_Report.__GetShapesId(aISBHIssue.Shape(), mtk.ShapeType_Face)
1352 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1353 elif mtk.DFMMachining_IrregularTurnedPartOuterDiameterProfileReliefIssue.CompareType(aFeature):
1354 aODPRIssue = mtk.DFMMachining_IrregularTurnedPartOuterDiameterProfileReliefIssue.Cast(aFeature)
1355 aShapeIdVector = MTKConverter_Report.__GetShapesId(aODPRIssue.Face(), mtk.ShapeType_Face)
1356 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1357 elif mtk.DFMMachining_SmallRadiusTurnedPartInternalCornerIssue.CompareType(aFeature):
1358 aTSICRIssue = mtk.DFMMachining_SmallRadiusTurnedPartInternalCornerIssue.Cast(aFeature)
1359 aShapeIdVector = MTKConverter_Report.__GetShapesId(aTSICRIssue.Shape(), mtk.ShapeType_Face)
1360 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1361 elif mtk.DFMMachining_SquareEndKeywayIssue.CompareType(aFeature):
1362 aSEKIssue = mtk.DFMMachining_SquareEndKeywayIssue.Cast(aFeature)
1363 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSEKIssue.Keyway().Shape(), mtk.ShapeType_Face)
1364 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1365 elif mtk.DFMMachining_NonSymmetricalAxialSlotIssue.CompareType(aFeature):
1366 aNSASIssue = mtk.DFMMachining_NonSymmetricalAxialSlotIssue.Cast(aFeature)
1367 aShapeIdVector = MTKConverter_Report.__GetShapesId(aNSASIssue.AxialSlot().Shape(), mtk.ShapeType_Face)
1368 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1369 elif mtk.DFMMachining_LargeTurnedPartIssue.CompareType(aFeature):
1370 aShapeIdVector = []
1371 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1372 elif mtk.DFMMachining_LongSlenderTurnedPartIssue.CompareType(aFeature):
1373 aShapeIdVector = []
1374 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1375
1376 #dfm molding
1377 elif mtk.DFMMolding_IrregularCoreDepthScrewBossIssue.CompareType(aFeature):
1378 aICDSBIssue = mtk.DFMMolding_IrregularCoreDepthScrewBossIssue.Cast(aFeature)
1379 aShapeIdVector = MTKConverter_Report.__GetShapesId(aICDSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1380 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1381 elif mtk.DFMMolding_IrregularCoreDiameterScrewBossIssue.CompareType(aFeature):
1382 aICDSBIssue = mtk.DFMMolding_IrregularCoreDiameterScrewBossIssue.Cast(aFeature)
1383 aShapeIdVector = MTKConverter_Report.__GetShapesId(aICDSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1384 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1385 elif mtk.DFMMolding_IrregularThicknessRibIssue.CompareType(aFeature):
1386 aITRIssue = mtk.DFMMolding_IrregularThicknessRibIssue.Cast(aFeature)
1387 aShapeIdVector = MTKConverter_Report.__GetShapesId(aITRIssue.Rib().Shape(), mtk.ShapeType_Face)
1388 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1389 elif mtk.DFMMolding_IrregularWallThicknessIssue.CompareType(aFeature):
1390 aIWTssue = mtk.DFMMolding_IrregularWallThicknessIssue.Cast(aFeature)
1391 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIWTIssue.Shape(), mtk.ShapeType_Face)
1392 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1393 elif mtk.DFMMolding_IrregularWallThicknessScrewBossIssue.CompareType(aFeature):
1394 aIWTSBIssue = mtk.DFMMolding_IrregularWallThicknessScrewBossIssue.Cast(aFeature)
1395 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIWTSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1396 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1397 elif mtk.DFMMolding_SmallBaseRadiusRibIssue.CompareType(aFeature):
1398 aSBRRIssue = mtk.DFMMolding_SmallBaseRadiusRibIssue.Cast(aFeature)
1399 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSBRRIssue.Rib().Shape(), mtk.ShapeType_Face)
1400 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1401 elif mtk.DFMMolding_SmallBaseRadiusScrewBossIssue.CompareType(aFeature):
1402 aSBRSBIssue = mtk.DFMMolding_SmallBaseRadiusScrewBossIssue.Cast(aFeature)
1403 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSBRSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1404 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1405 elif mtk.DFMMolding_LargeWallThicknessIssue.CompareType(aFeature):
1406 aLWTssue = mtk.DFMMolding_LargeWallThicknessIssue.Cast(aFeature)
1407 aShapeIdVector = MTKConverter_Report.__GetShapesId(aLWTssue.Shape(), mtk.ShapeType_Face)
1408 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1409 elif mtk.DFMMolding_HighScrewBossIssue.CompareType(aFeature):
1410 aHRIssue = mtk.DFMMolding_HighScrewBossIssue.Cast(aFeature)
1411 aShapeIdVector = MTKConverter_Report.__GetShapesId(aHRIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1412 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1413 elif mtk.DFMMolding_HighRibIssue.CompareType(aFeature):
1414 aHRIssue = mtk.DFMMolding_HighRibIssue.Cast(aFeature)
1415 aShapeIdVector = MTKConverter_Report.__GetShapesId(aHRIssue.Rib().Shape(), mtk.ShapeType_Face)
1416 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1417 elif mtk.DFMMolding_SmallDraftAngleRibIssue.CompareType(aFeature):
1418 aSMARIssue = mtk.DFMMolding_SmallDraftAngleRibIssue.Cast(aFeature)
1419 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSMARIssue.Rib().Shape(), mtk.ShapeType_Face)
1420 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1421 elif mtk.DFMMolding_SmallDistanceBetweenRibsIssue.CompareType(aFeature):
1422 aSDBRIssue = mtk.DFMMolding_SmallDistanceBetweenRibsIssue.Cast(aFeature)
1423 aShapeIdVector = []
1424 MTKConverter_Report.__AddShapesId(aSDBRIssue.FirstRib().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1425 MTKConverter_Report.__AddShapesId(aSDBRIssue.SecondRib().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1426 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1427 elif mtk.DFMMolding_SmallHoleBaseRadiusScrewBossIssue.CompareType(aFeature):
1428 aSHBRSBIssue = mtk.DFMMolding_SmallHoleBaseRadiusScrewBossIssue.Cast(aFeature)
1429 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSHBRSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1430 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1431 elif mtk.DFMMolding_SmallDraftAngleWallIssue.CompareType(aFeature):
1432 aSDAWIssue = mtk.DFMMolding_SmallDraftAngleWallIssue.Cast(aFeature)
1433 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSDAWIssue.Shape(), mtk.ShapeType_Face)
1434 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1435 elif mtk.DFMMolding_NonChamferedScrewBossIssue.CompareType(aFeature):
1436 aWTCSBIssue = mtk.DFMMolding_NonChamferedScrewBossIssue.Cast(aFeature)
1437 aShapeIdVector = MTKConverter_Report.__GetShapesId(aWTCSBIssue.ScrewBoss().Shape(), mtk.ShapeType_Face)
1438 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1439 elif mtk.DFMMolding_SmallWallThicknessIssue.CompareType(aFeature):
1440 aSWTssue = mtk.DFMMolding_SmallWallThicknessIssue.Cast(aFeature)
1441 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSWTssue.Shape(), mtk.ShapeType_Face)
1442 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1443 elif mtk.DFMMolding_SmallDistanceBetweenBossesIssue.CompareType(aFeature):
1444 aSDBBIssue = mtk.DFMMolding_SmallDistanceBetweenBossesIssue.Cast(aFeature)
1445 aShapeIdVector = []
1446 MTKConverter_Report.__AddShapesId(aSDBBIssue.FirstBoss().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1447 MTKConverter_Report.__AddShapesId(aSDBBIssue.SecondBoss().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1448 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1449
1450 #dfm sheet metal
1451 elif mtk.DFMSheetMetal_FlatPatternInterferenceIssue.CompareType(aFeature):
1452 aFPIIssue = mtk.DFMSheetMetal_FlatPatternInterferenceIssue.Cast(aFeature)
1453 aShapeIdVector = [aFPIIssue.FirstFace().Id(), aFPIIssue.SecondFace().Id()]
1454 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1455 elif mtk.DFMSheetMetal_IrregularCornerFilletRadiusNotchIssue.CompareType(aFeature):
1456 aICFRNIssue = mtk.DFMSheetMetal_IrregularCornerFilletRadiusNotchIssue.Cast(aFeature)
1457 aShapeIdVector = MTKConverter_Report.__GetShapesId(aICFRNIssue.Notch().Shape(), mtk.ShapeType_Edge)
1458 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1459 elif mtk.DFMSheetMetal_IrregularDepthExtrudedHoleIssue.CompareType(aFeature):
1460 aIDEHIssue = mtk.DFMSheetMetal_IrregularDepthExtrudedHoleIssue.Cast(aFeature)
1461 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIDEHIssue.Hole().Shape(), mtk.ShapeType_Face)
1462 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1463 elif mtk.DFMSheetMetal_IrregularRadiusOpenHemBendIssue.CompareType(aFeature):
1464 aIROHBIssue = mtk.DFMSheetMetal_IrregularRadiusOpenHemBendIssue.Cast(aFeature)
1465 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIROHBIssue.Bend().Shape(), mtk.ShapeType_Face)
1466 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1467 elif mtk.DFMSheetMetal_InconsistentRadiusBendIssue.CompareType(aFeature):
1468 aIRBIssue = mtk.DFMSheetMetal_InconsistentRadiusBendIssue.Cast(aFeature)
1469 aShapeIdVector = MTKConverter_Report.__GetShapesId(aIRBIssue.Bend().Shape(), mtk.ShapeType_Face)
1470 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1471 elif mtk.DFMSheetMetal_IrregularSizeBendReliefIssue.CompareType(aFeature):
1472 aISBRIssue = mtk.DFMSheetMetal_IrregularSizeBendReliefIssue.Cast(aFeature)
1473 aFirstActualRelief = aISBRIssue.FirstActualRelief()
1474 aSecondActualRelief = aISBRIssue.SecondActualRelief()
1475 aShapeIdVector = []
1476 MTKConverter_Report.__AddShapesId(aISBRIssue.Bend().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1477 if not aFirstActualRelief.IsNull():
1478 MTKConverter_Report.__AddShapesId(aFirstActualRelief.Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1479 if not aSecondActualRelief.IsNull():
1480 MTKConverter_Report.__AddShapesId(aSecondActualRelief.Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1481 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1482 elif mtk.DFMSheetMetal_IrregularSizeNotchIssue.CompareType(aFeature):
1483 aISNIssue = mtk.DFMSheetMetal_IrregularSizeNotchIssue.Cast(aFeature)
1484 aShapeIdVector = MTKConverter_Report.__GetShapesId(aISNIssue.Notch().Shape(), mtk.ShapeType_Edge)
1485 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1486 elif mtk.DFMSheetMetal_IrregularSizeTabIssue.CompareType(aFeature):
1487 aISTIssue = mtk.DFMSheetMetal_IrregularSizeTabIssue.Cast(aFeature)
1488 aShapeIdVector = MTKConverter_Report.__GetShapesId(aISTIssue.Tab().Shape(), mtk.ShapeType_Edge)
1489 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1490 elif mtk.DFMSheetMetal_LargeDepthBeadIssue.CompareType(aFeature):
1491 aLDBIssue = mtk.DFMSheetMetal_LargeDepthBeadIssue.Cast(aFeature)
1492 aShapeIdVector = MTKConverter_Report.__GetShapesId(aLDBIssue.Bead().Shape(), mtk.ShapeType_Face)
1493 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1494 elif mtk.DFMSheetMetal_SmallDepthLouverIssue.CompareType(aFeature):
1495 aSDLIssue = mtk.DFMSheetMetal_SmallDepthLouverIssue.Cast(aFeature)
1496 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSDLIssue.Louver().Shape(), mtk.ShapeType_Face)
1497 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1498 elif mtk.DFMSheetMetal_NonStandardSheetSizeIssue.CompareType(aFeature):
1499 aShapeIdVector = []
1500 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1501 elif mtk.DFMSheetMetal_NonStandardSheetThicknessIssue.CompareType(aFeature):
1502 aShapeIdVector = []
1503 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1504 elif mtk.DFMSheetMetal_SmallDiameterHoleIssue.CompareType(aFeature):
1505 aSDHIssue = mtk.DFMSheetMetal_SmallDiameterHoleIssue.Cast(aFeature)
1506 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSDHIssue.Hole().Shape(), mtk.ShapeType_Edge)
1507 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1508 elif mtk.DFMSheetMetal_SmallLengthFlangeIssue.CompareType(aFeature):
1509 aSLFIssue = mtk.DFMSheetMetal_SmallLengthFlangeIssue.Cast(aFeature)
1510 aFlange = aSLFIssue.Flange().FeatureList()
1511 aShapeIdVector = []
1512 for aFlangeFace in aFlange:
1513 if mtk.MTKBase_ShapeFeature.CompareType(aFlangeFace):
1514 aShapeFeature = mtk.MTKBase_ShapeFeature.Cast(aFlangeFace)
1515 MTKConverter_Report.__AddShapesId(aShapeFeature.Shape(), mtk.ShapeType_Face, aShapeIdVector)
1516 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1517 elif mtk.DFMSheetMetal_SmallLengthHemBendFlangeIssue.CompareType(aFeature):
1518 aSLHBFIssue = mtk.DFMSheetMetal_SmallLengthHemBendFlangeIssue.Cast(aFeature)
1519 aFlange = aSLHBFIssue.Flange().FeatureList()
1520 aShapeIdVector = []
1521 for aFlangeFace in aFlange:
1522 if mtk.MTKBase_ShapeFeature.CompareType(aFlangeFace):
1523 aShapeFeature = mtk.MTKBase_ShapeFeature.Cast(aFlangeFace)
1524 MTKConverter_Report.__AddShapesId(aShapeFeature.Shape(), mtk.ShapeType_Face, aShapeIdVector)
1525 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1526 elif mtk.DFMSheetMetal_SmallRadiusBendIssue.CompareType(aFeature):
1527 aSRBIssue = mtk.DFMSheetMetal_SmallRadiusBendIssue.Cast(aFeature)
1528 aShapeIdVector = MTKConverter_Report.__GetShapesId(aSRBIssue.Bend().Shape(), mtk.ShapeType_Face)
1529 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1530 elif mtk.DFMSheetMetal_SmallDistanceBetweenBendAndLouverIssue.CompareType(aFeature):
1531 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenBendAndLouverIssue.Cast(aFeature)
1532 aShapeIdVector = []
1533 MTKConverter_Report.__AddShapesId(aSDIssue.Bend().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1534 MTKConverter_Report.__AddShapesId(aSDIssue.Louver().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1535 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1536 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndBendIssue.CompareType(aFeature):
1537 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndBendIssue.Cast(aFeature)
1538 aShapeIdVector = []
1539 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1540 MTKConverter_Report.__AddShapesId(aSDIssue.Bend().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1541 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1542 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndEdgeIssue.CompareType(aFeature):
1543 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHoleAndEdgeIssue.Cast(aFeature)
1544 aShapeIdVector = []
1545 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1546 aShapeIdVector.append(aSDIssue.Edge().Id())
1547 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1548 elif mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHolesIssue.CompareType(aFeature):
1549 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenExtrudedHolesIssue.Cast(aFeature)
1550 aShapeIdVector = []
1551 MTKConverter_Report.__AddShapesId(aSDIssue.FirstHole().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1552 MTKConverter_Report.__AddShapesId(aSDIssue.SecondHole().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1553 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1554 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndBendIssue.CompareType(aFeature):
1555 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndBendIssue.Cast(aFeature)
1556 aShapeIdVector = []
1557 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1558 MTKConverter_Report.__AddShapesId(aSDIssue.Bend().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1559 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1560 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndCutoutIssue.CompareType(aFeature):
1561 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndCutoutIssue.Cast(aFeature)
1562 aShapeIdVector = []
1563 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1564 MTKConverter_Report.__AddShapesId(aSDIssue.Cutout().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1565 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1566 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndEdgeIssue.CompareType(aFeature):
1567 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndEdgeIssue.Cast(aFeature)
1568 aShapeIdVector = []
1569 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1570 aShapeIdVector.append(aSDIssue.Edge().Id())
1571 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1572 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndLouverIssue.CompareType(aFeature):
1573 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndNotchIssue.Cast(aFeature)
1574 aShapeIdVector = []
1575 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1576 MTKConverter_Report.__AddShapesId(aSDIssue.Louver().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1577 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1578 elif mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndNotchIssue.CompareType(aFeature):
1579 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHoleAndNotchIssue.Cast(aFeature)
1580 aShapeIdVector = []
1581 MTKConverter_Report.__AddShapesId(aSDIssue.Hole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1582 MTKConverter_Report.__AddShapesId(aSDIssue.Notch().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1583 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1584 elif mtk.DFMSheetMetal_SmallDistanceBetweenHolesIssue.CompareType(aFeature):
1585 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenHolesIssue.Cast(aFeature)
1586 aShapeIdVector = []
1587 MTKConverter_Report.__AddShapesId(aSDIssue.FirstHole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1588 MTKConverter_Report.__AddShapesId(aSDIssue.SecondHole().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1589 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1590 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchAndBendIssue.CompareType(aFeature):
1591 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenNotchAndBendIssue.Cast(aFeature)
1592 aShapeIdVector = []
1593 MTKConverter_Report.__AddShapesId(aSDIssue.Notch().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1594 MTKConverter_Report.__AddShapesId(aSDIssue.Bend().Shape(), mtk.ShapeType_Face, aShapeIdVector)
1595 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1596 elif mtk.DFMSheetMetal_SmallDistanceBetweenNotchesIssue.CompareType(aFeature):
1597 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenNotchesIssue.Cast(aFeature)
1598 aShapeIdVector = []
1599 MTKConverter_Report.__AddShapesId(aSDIssue.FirstNotch().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1600 MTKConverter_Report.__AddShapesId(aSDIssue.SecondNotch().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1601 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1602 elif mtk.DFMSheetMetal_SmallDistanceBetweenTabsIssue.CompareType(aFeature):
1603 aSDIssue = mtk.DFMSheetMetal_SmallDistanceBetweenTabsIssue.Cast(aFeature)
1604 aShapeIdVector = []
1605 MTKConverter_Report.__AddShapesId(aSDIssue.FirstTab().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1606 MTKConverter_Report.__AddShapesId(aSDIssue.SecondTab().Shape(), mtk.ShapeType_Edge, aShapeIdVector)
1607 theOrderedFeatureList.Append(aFeature, aShapeIdVector)
1608
1609 @staticmethod
1610 def __WriteFeatures(theWriter: JSONWriter, theGroupName: str, theSubgroupName: str,
1611 theFeatures: mtk.MTKBase_FeatureList, theMessageForEmptyList: str):
1612 theWriter.OpenSection(theSubgroupName)
1613 theWriter.WriteData("name", theGroupName)
1614
1615 if theFeatures.IsEmpty():
1616 theWriter.WriteData("message", theMessageForEmptyList)
1617 else:
1618 aSortedFeatures = OrderedFeatureList()
1619 MTKConverter_Report.__SortFeatures(theFeatures, aSortedFeatures)
1620
1621 aFGManager = FeatureGroupManager()
1622 for i in range(aSortedFeatures.Size()):
1623 aFeature = aSortedFeatures.GetFeature(i)
1624 aCount = aSortedFeatures.GetFeatureCount(i)
1625 aShapeIDVec = aSortedFeatures.GetFeatureShapeIDs(i)
1626
1627 if mtk.MTKBase_ShapeFeature.CompareType(aFeature):
1628 MTKConverter_Report.__AddShapeFeature(aFGManager, mtk.MTKBase_ShapeFeature.Cast(aFeature),
1629 aCount, aShapeIDVec)
1630 elif mtk.DFMMachining_DrillingIssue.CompareType(aFeature):
1631 MTKConverter_Report.__AddDrillingIssue(aFGManager, mtk.DFMMachining_DrillingIssue.Cast(aFeature),
1632 aCount, aShapeIDVec)
1633 elif mtk.DFMMachining_MillingIssue.CompareType(aFeature):
1634 MTKConverter_Report.__AddMillingIssue(aFGManager, mtk.DFMMachining_MillingIssue.Cast(aFeature),
1635 aCount, aShapeIDVec)
1636 elif (mtk.DFMSheetMetal_BendIssue.CompareType(aFeature)
1637 or mtk.DFMSheetMetal_FlatPatternInterferenceIssue.CompareType(aFeature)
1638 or mtk.DFMSheetMetal_HoleIssue.CompareType(aFeature)
1639 or mtk.DFMSheetMetal_IrregularCornerFilletRadiusNotchIssue.CompareType(aFeature)
1640 or mtk.DFMSheetMetal_IrregularDepthExtrudedHoleIssue.CompareType(aFeature)
1641 or mtk.DFMSheetMetal_IrregularSizeNotchIssue.CompareType(aFeature)
1642 or mtk.DFMSheetMetal_IrregularSizeTabIssue.CompareType(aFeature)
1643 or mtk.DFMSheetMetal_LargeDepthBeadIssue.CompareType(aFeature)
1644 or mtk.DFMSheetMetal_SmallDepthLouverIssue.CompareType(aFeature)
1645 or mtk.DFMSheetMetal_NonStandardSheetSizeIssue.CompareType(aFeature)
1646 or mtk.DFMSheetMetal_NonStandardSheetThicknessIssue.CompareType(aFeature)
1647 or mtk.DFMSheetMetal_SmallDistanceBetweenFeaturesIssue.CompareType(aFeature)):
1648 MTKConverter_Report.__AddSheetMetalIssue(aFGManager, mtk.DFMBase_Issue.Cast(aFeature),
1649 aCount, aShapeIDVec)
1650 elif (mtk.DFMMolding_IrregularCoreDiameterScrewBossIssue.CompareType(aFeature)
1651 or mtk.DFMMolding_IrregularCoreDepthScrewBossIssue.CompareType(aFeature)
1652 or mtk.DFMMolding_IrregularThicknessRibIssue.CompareType(aFeature)
1653 or mtk.DFMMolding_IrregularWallThicknessIssue.CompareType(aFeature)
1654 or mtk.DFMMolding_IrregularWallThicknessScrewBossIssue.CompareType(aFeature)
1655 or mtk.DFMMolding_SmallBaseRadiusRibIssue.CompareType(aFeature)
1656 or mtk.DFMMolding_SmallBaseRadiusScrewBossIssue.CompareType(aFeature)
1657 or mtk.DFMMolding_LargeWallThicknessIssue.CompareType(aFeature)
1658 or mtk.DFMMolding_HighRibIssue.CompareType(aFeature)
1659 or mtk.DFMMolding_HighScrewBossIssue.CompareType(aFeature)
1660 or mtk.DFMMolding_SmallDraftAngleRibIssue.CompareType(aFeature)
1661 or mtk.DFMMolding_SmallDistanceBetweenRibsIssue.CompareType(aFeature)
1662 or mtk.DFMMolding_SmallHoleBaseRadiusScrewBossIssue.CompareType(aFeature)
1663 or mtk.DFMMolding_SmallDraftAngleWallIssue.CompareType(aFeature)
1664 or mtk.DFMMolding_NonChamferedScrewBossIssue.CompareType(aFeature)
1665 or mtk.DFMMolding_SmallWallThicknessIssue.CompareType(aFeature)
1666 or mtk.DFMMolding_SmallDistanceBetweenBossesIssue.CompareType(aFeature)):
1667 MTKConverter_Report.__AddMoldingIssue(aFGManager, mtk.DFMBase_Issue.Cast(aFeature),
1668 aCount, aShapeIDVec)
1669 elif mtk.DFMBase_Issue.CompareType(aFeature):
1670 MTKConverter_Report.__AddTurningIssue(aFGManager, mtk.DFMBase_Issue.Cast(aFeature),
1671 aCount, aShapeIDVec)
1672
1673 theWriter.WriteData("totalFeatureCount", aFGManager.TotalFeatureCount())
1674 theWriter.OpenArraySection("featureGroups")
1675 aFGManager.Write(theWriter)
1676 theWriter.CloseArraySection()
1677
1678 theWriter.CloseSection()
1679
1680 return True
1681
1682 @staticmethod
1683 def __MachiningProcessName(theOperation):
1684 aProcessMap = {
1685 mtk.Machining_OT_Milling: "CNC Machining Milling",
1686 mtk.Machining_OT_LatheMilling: "CNC Machining Lathe+Milling"
1687 }
1688
1689 if theOperation in aProcessMap:
1690 return aProcessMap[theOperation]
1691 else:
1692 return "CNC Machining"
1693
1694 @staticmethod
1695 def __HasShapes(thePart: mtk.ModelData_Part, theType):
1696 aBodyList = thePart.Bodies()
1697 for aBody in aBodyList:
1698 aShapeIt = mtk.ModelData_ShapeIterator(aBody, theType)
1699 if aShapeIt.HasNext():
1700 return True
1701 return False
1702
1703 @staticmethod
1704 def __WriteThicknessNode(theWriter: JSONWriter, theParamName: str, theParamValue: int,
1705 thePoints: wt_proc.PointPair, theNodeName: str):
1706 aFirstPoint = thePoints.First
1707 aSecondPoint = thePoints.Second
1708 theWriter.OpenSection(theNodeName)
1709 theWriter.WriteData("name", theParamName)
1710 theWriter.WriteData("units", "mm")
1711 theWriter.WriteData("value", theParamValue)
1712 theWriter.WriteData("firstPoint", Point(aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()))
1713 theWriter.WriteData("secondPoint", Point(aSecondPoint.X(), aSecondPoint.Y(), aSecondPoint.Z()))
1714 theWriter.CloseSection()
1715
1716 @staticmethod
1717 def __WriteUnfoldedPartFeatures(theWriter: JSONWriter, theData: sm_proc.MTKConverter_UnfoldedPartData):
1718 theWriter.OpenSection("featureRecognitionUnfolded")
1719 theWriter.WriteData("name", "Feature Recognition")
1720
1721 if theData.myIsInit:
1722 aStream = io.StringIO()
1723 aWriter = JSONWriter(aStream, 4)
1724
1725 aWriter.WriteData("parametersCount", 3)
1726 aWriter.OpenArraySection("parameters")
1727 MTKConverter_Report.__WriteParameter(aWriter, "Length", "mm", theData.myLength)
1728 MTKConverter_Report.__WriteParameter(aWriter, "Width", "mm", theData.myWidth)
1729 MTKConverter_Report.__WriteParameter(aWriter, "Thickness", "mm", theData.myThickness)
1730 MTKConverter_Report.__WriteParameter(aWriter, "Perimeter", "mm", theData.myPerimeter)
1731 aWriter.CloseArraySection()
1732
1733 theWriter.WriteRawData(aStream.getvalue())
1734 aStream.close()
1735 else:
1736 theWriter.WriteData("message", "Unfolded part wasn't generated.")
1737
1738 theWriter.CloseSection()
1739
1740 @staticmethod
1741 def __WritePartProcessData(theWriter: JSONWriter, theProcessData):
1742 aRes = False
1743 theWriter.WriteData("partId", theProcessData.myPart.Uuid())
1744
1745 anErrorMsg = "An error occurred while processing the part."
1746 if type(theProcessData) is mach_proc.MTKConverter_MachiningData:
1747 theWriter.WriteData("process", MTKConverter_Report.__MachiningProcessName(theProcessData.myOperation))
1748 if not theProcessData.myFeatureList.IsEmpty():
1749 MTKConverter_Report.__WriteFeatures(theWriter, "Feature Recognition", "featureRecognition",
1750 theProcessData.myFeatureList, "")
1751 MTKConverter_Report.__WriteFeatures(theWriter, "Design for Manufacturing", "dfm", theProcessData.myIssueList,
1752 "Part contains no DFM improvement suggestions.")
1753 aRes = True
1754 elif not MTKConverter_Report.__HasShapes(theProcessData.myPart, mtk.ShapeType_Solid):
1755 anErrorMsg = "The part can't be analyzed due to lack of: BRep representation or solids in BRep representation."
1756 elif type(theProcessData) is mold_proc.MTKConverter_MoldingData:
1757 theWriter.WriteData("process", "Molding Analysis")
1758 if not theProcessData.myFeatureList.IsEmpty():
1759 MTKConverter_Report.__WriteFeatures(theWriter, "Feature Recognition", "featureRecognition",
1760 theProcessData.myFeatureList, "")
1761 MTKConverter_Report.__WriteFeatures(theWriter, "Design for Manufacturing", "dfm", theProcessData.myIssueList,
1762 "Part contains no DFM improvement suggestions.")
1763 aRes = True
1764 elif not MTKConverter_Report.__HasShapes(theProcessData.myPart, mtk.ShapeType_Solid):
1765 anErrorMsg = "The part can't be analyzed due to lack of: BRep representation or solids in BRep representation."
1766 elif type(theProcessData) is sm_proc.MTKConverter_SheetMetalData:
1767 theWriter.WriteData("process", "Sheet Metal")
1768 if theProcessData.myIsSheetMetalPart:
1769 MTKConverter_Report.__WriteFeatures(theWriter, "Feature Recognition", "featureRecognition",
1770 theProcessData.myFeatureList, "Part contains no features.")
1771 MTKConverter_Report.__WriteFeatures(theWriter, "Design for Manufacturing", "dfm", theProcessData.myIssueList,
1772 "Part contains no DFM improvement suggestions.")
1773
1774 anUnfoldedPartData = theProcessData.myUnfoldedPartData
1775 MTKConverter_Report.__WriteUnfoldedPartFeatures(theWriter, anUnfoldedPartData)
1776 if anUnfoldedPartData.myIsInit:
1777 MTKConverter_Report.__WriteFeatures(theWriter, "Design for Manufacturing", "dfmUnfolded",
1778 anUnfoldedPartData.myIssueList,
1779 "Unfolded part contains no DFM improvement suggestions.")
1780 aRes = True
1781 elif (not MTKConverter_Report.__HasShapes(theProcessData.myPart, mtk.ShapeType_Solid)
1782 and (not MTKConverter_Report.__HasShapes (theProcessData.myPart, mtk.ShapeType_Shell))):
1783 anErrorMsg = "The part can't be analyzed due to lack of: BRep representation, solids and shells in BRep representation."
1784 else:
1785 anErrorMsg = "The part wasn't recognized as a sheet metal part."
1786 elif type(theProcessData) is wt_proc.MTKConverter_WallThicknessData:
1787 theWriter.WriteData("process", "Wall Thickness Analysis")
1788 if theProcessData.myIsInit:
1789 MTKConverter_Report.__WriteThicknessNode (theWriter, "Minimum Thickness", theProcessData.myMinThickness,
1790 theProcessData.myMinThicknessPoints, "minThickness")
1791 MTKConverter_Report.__WriteThicknessNode (theWriter, "Maximum Thickness", theProcessData.myMaxThickness,
1792 theProcessData.myMaxThicknessPoints, "maxThickness")
1793 aRes = True
1794 elif not MTKConverter_Report.__HasShapes (theProcessData.myPart.Bodies(), cadex.ModelData_ST_Solid):
1795 anErrorMsg = "The part can't be analyzed due to lack of: BRep representation, solids in BRep representation."
1796 else:
1797 anErrorMsg = "Unrecognized process"
1798
1799 if not aRes:
1800 theWriter.WriteData("error", anErrorMsg)
1801

MTKConverter_Application.py

1# $Id$
2
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5
6# This file is part of the Manufacturing Toolkit software.
7
8# You may use this file under the terms of the BSD license as follows:
9
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30from enum import Enum
31
32import os
33import manufacturingtoolkit.CadExMTK as mtk
34
35import MTKConverter_PartProcessor as part_proc
36
37from MTKConverter_Report import MTKConverter_Report
38from MTKConverter_MachiningProcessor import MTKConverter_MachiningProcessor
39from MTKConverter_MoldingProcessor import MTKConverter_MoldingProcessor
40from MTKConverter_SheetMetalProcessor import MTKConverter_SheetMetalProcessor
41from MTKConverter_WallThicknessProcessor import MTKConverter_WallThicknessProcessor
42
43class MTKConverter_ProcessType(Enum):
44 MTKConverter_PT_Undefined = -1
45 MTKConverter_PT_WallThickness = 0
46 MTKConverter_PT_MachiningMilling = 1
47 MTKConverter_PT_MachiningTurning = 2
48 MTKConverter_PT_Molding = 3
49 MTKConverter_PT_SheetMetal = 4
50
51class MTKConverter_ReturnCode(Enum):
52 # General codes
53 MTKConverter_RC_OK = 0
54 MTKConverter_RC_UnknownError = 1
55 MTKConverter_RC_GeneralException = 2
56 MTKConverter_RC_NoValidLicense = 3
57 MTKConverter_RC_InvalidArgumentsNumber = 4
58 MTKConverter_RC_InvalidArgument = 5
59
60 # Import errors
61 MTKConverter_RC_UnsupportedVersion = 100
62 MTKConverter_RC_UnexpectedFormat = 101
63 MTKConverter_RC_UnsupportedFileVariant = 102
64 MTKConverter_RC_ImportError = 103
65
66 # Process errors
67 MTKConverter_RC_ProcessError = 200
68
69 # Export errors
70 MTKConverter_RC_ExportError = 300
71
72class MTKConverter_Application:
73 def __init__(self):
74 pass
75
76 @staticmethod
77 def __ProcessType(theProcessName: str):
78 aProcessMap = {
79 "wall_thickness": MTKConverter_ProcessType.MTKConverter_PT_WallThickness,
80 "machining_milling": MTKConverter_ProcessType.MTKConverter_PT_MachiningMilling,
81 "machining_turning": MTKConverter_ProcessType.MTKConverter_PT_MachiningTurning,
82 "molding": MTKConverter_ProcessType.MTKConverter_PT_Molding,
83 "sheet_metal": MTKConverter_ProcessType.MTKConverter_PT_SheetMetal
84 }
85
86 if theProcessName in aProcessMap:
87 return aProcessMap[theProcessName]
88 else:
89 return mtk.MTKConverter_PT_Undefined
90
91 @staticmethod
92 def __Import(theFilePath: str, theModel: mtk.ModelData_Model):
93 print("Importing ", theFilePath, "...", sep="", end="")
94
95 aReader = mtk.ModelData_ModelReader()
96 if not aReader.Read(mtk.UTF16String(theFilePath), theModel):
97 print("\nERROR: Failed to import ", theFilePath, ". Exiting", sep="")
98 return MTKConverter_ReturnCode.MTKConverter_RC_ImportError
99
100 return MTKConverter_ReturnCode.MTKConverter_RC_OK
101
102 @staticmethod
103 def __ApplyProcessorToModel (theProcessor: part_proc.MTKConverter_PartProcessor,
104 theModel: mtk.ModelData_Model,
105 theReport: MTKConverter_Report):
106
107 aVisitor = mtk.ModelData_ModelElementUniqueVisitor(theProcessor)
108 theModel.Accept(aVisitor)
109 for i in theProcessor.myData:
110 theReport.AddData(i)
111
112 @staticmethod
113 def __Process (theProcess: str,
114 theModel: mtk.ModelData_Model,
115 theReport: MTKConverter_Report,
116 theProcessModel: mtk.ModelData_Model):
117 print("Processing ", theProcess, "... ", sep="", end="")
118
119 theModel.AssignUuids()
120
121 aProcessType = MTKConverter_Application.__ProcessType(theProcess)
122 if aProcessType == MTKConverter_ProcessType.MTKConverter_PT_MachiningMilling:
123 aProcessor = MTKConverter_MachiningProcessor(mtk.Machining_OT_Milling)
124 MTKConverter_Application.__ApplyProcessorToModel(aProcessor, theModel, theReport)
125 elif aProcessType == MTKConverter_ProcessType.MTKConverter_PT_MachiningTurning:
126 aProcessor = MTKConverter_MachiningProcessor(mtk.Machining_OT_LatheMilling)
127 MTKConverter_Application.__ApplyProcessorToModel(aProcessor, theModel, theReport)
128 elif aProcessType == MTKConverter_ProcessType.MTKConverter_PT_Molding:
129 aProcessor = MTKConverter_MoldingProcessor()
130 MTKConverter_Application.__ApplyProcessorToModel(aProcessor, theModel, theReport)
131 elif aProcessType == MTKConverter_ProcessType.MTKConverter_PT_SheetMetal:
132 anUnfoldedName = str(theModel.Name()) + "_unfolded"
133 theProcessModel.SetName(mtk.UTF16String(anUnfoldedName))
134 aProcessor = MTKConverter_SheetMetalProcessor(theProcessModel)
135 MTKConverter_Application.__ApplyProcessorToModel(aProcessor, theModel, theReport)
136 elif aProcessType == MTKConverter_ProcessType.MTKConverter_PT_WallThickness:
137 aProcessor = MTKConverter_WallThicknessProcessor(800)
138 MTKConverter_Application.__ApplyProcessorToModel(aProcessor, theModel, theReport)
139 else:
140 return MTKConverter_ReturnCode.MTKConverter_RC_InvalidArgument
141
142 return MTKConverter_ReturnCode.MTKConverter_RC_OK
143
144 @staticmethod
145 def __Export(theFolderPath: mtk.UTF16String,
146 theModel: mtk.ModelData_Model,
147 theReport: MTKConverter_Report,
148 theProcessModel: mtk.ModelData_Model):
149 print("Exporting ", theFolderPath, "...", sep="", end="")
150
151 os.mkdir(theFolderPath)
152
153 aModelPath = theFolderPath + "/" + str(theModel.Name()) + ".mtkweb" + "/scenegraph.mtkweb"
154 if not theModel.Save(mtk.UTF16String(aModelPath), mtk.ModelData_Model.FileFormatType_MTKWEB):
155 print("\nERROR: Failed to export ", aModelPath, ". Exiting", sep="")
156 return MTKConverter_ReturnCode.MTKConverter_RC_ExportError
157
158 if not theProcessModel.IsEmpty():
159 aProcessModelPath = theFolderPath + "/" + str(theProcessModel.Name()) + ".mtkweb" + "/scenegraph.mtkweb"
160 if not theProcessModel.Save(mtk.UTF16String(aProcessModelPath), mtk.ModelData_Model.FileFormatType_MTKWEB):
161 print("\nERROR: Failed to export ", aProcessModelPath, ". Exiting", sep="")
162 return MTKConverter_ReturnCode.MTKConverter_RC_ExportError
163
164 aJsonPath = theFolderPath + "\\process_data.json"
165 if not theReport.WriteToJSON (aJsonPath):
166 print("\nERROR: Failed to create JSON file ", aJsonPath, ". Exiting", sep="")
167 return MTKConverter_ReturnCode.MTKConverter_RC_ExportError
168
169 return MTKConverter_ReturnCode.MTKConverter_RC_OK
170
171 def Run(self, theSource: str, theProcess: str, theTarget: str):
172 aModel = mtk.ModelData_Model()
173 aProcessModel = mtk.ModelData_Model()
174 aReport = MTKConverter_Report()
175
176 aRes = MTKConverter_ReturnCode.MTKConverter_RC_OK
177 try:
178 aRes = MTKConverter_Application.__Import (theSource, aModel)
179 print("Done.")
180 if aRes == MTKConverter_ReturnCode.MTKConverter_RC_OK:
181 aRes = MTKConverter_Application.__Process (theProcess, aModel, aReport, aProcessModel)
182 print("Done.")
183 if aRes == MTKConverter_ReturnCode.MTKConverter_RC_OK:
184 aRes = MTKConverter_Application.__Export (theTarget, aModel, aReport, aProcessModel)
185 print("Done.")
186 except Exception as anE:
187 print("Failed.\nERROR: ", anE, sep="")
188 return MTKConverter_ReturnCode.MTKConverter_RC_GeneralException
189 except:
190 print("Failed.\nERROR: Unhandled exception caught.")
191 return MTKConverter_ReturnCode.MTKConverter_RC_GeneralException
192
193 return aRes

MTKConverter.py

1# $Id$
2
3# Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
4# Copyright (C) 2014-2025, CADEX. All rights reserved.
5
6# This file is part of the Manufacturing Toolkit software.
7
8# You may use this file under the terms of the BSD license as follows:
9
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions are met:
12# * Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14# * Redistributions in binary form must reproduce the above copyright notice,
15# this list of conditions and the following disclaimer in the documentation
16# and/or other materials provided with the distribution.
17
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30import os
31import sys
32
33from pathlib import Path
34
35import manufacturingtoolkit.CadExMTK as mtk
36
37sys.path.append(os.path.abspath(os.path.dirname(Path(__file__).resolve()) + "/../"))
38
39import mtk_license as license
40
41import MTKConverter_Application as app
42
43def PrintUsage():
44 print ("Usage:")
45 print ("MTKConverter -i <import_file> -p <process> -e <export_folder>\n")
46 print ("Arguments:")
47 print (" <import_file> - import file name")
48 print (" <process> - manufacturing process or algorithm name")
49 print (" <export_folder> - export folder name")
50 print ("Example:")
51 print ("MTKConverter -i C:\\models\\test.step -p machining_milling -e C:\\models\\test")
52
53 print ("\nRecognized processes:")
54 print (" wall_thickness :\t Wall Thickness analysis")
55 print (" machining_milling:\t CNC Machining Milling feature recognition and dfm analyzis")
56 print (" machining_turning:\t CNC Machining Lathe+Milling feature recognition and dfm analyzis")
57 print (" molding :\t Molding feature recognition and dfm analyzis")
58 print (" sheet_metal :\t Sheet Metal feature recognition, unfolding and dfm analysis")
59
60def main (theSource: str, theProcess: str, theTarget: str):
61 aKey = license.Value()
62
63 if not mtk.LicenseManager.Activate(aKey):
64 print("Failed to activate Manufacturing Toolkit license.")
65 return 1
66
67 anApp = app.MTKConverter_Application()
68 aRes = anApp.Run (theSource, theProcess, theTarget)
69 return aRes.value
70
71if __name__ == "__main__":
72 if (len(sys.argv) == 1
73 or sys.argv[1] == "-?" or sys.argv[1] == "/?"
74 or sys.argv[1] == "-h" or sys.argv[1] == "--help"):
75 PrintUsage()
76 sys.exit()
77
78 if len(sys.argv) < 6 :
79 print("Invalid number of arguments. Please use \"-h\" or \"--help\" for usage information.")
80 sys.exit(app.MTKConverter_ReturnCode.InvalidArgumentsNumber.value)
81
82 aSource = os.path.abspath(sys.argv[2])
83 aProcess = sys.argv[4]
84 aTarget = os.path.abspath(sys.argv[6])
85
86 sys.exit(main(aSource, aProcess, aTarget))