1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
41def PrintFlatPatternInfo(theFlatPattern: mtk.SheetMetal_FlatPattern):
42 if theFlatPattern.IsNull():
43 print(" Failed to create flat pattern.")
44 return
45
46 print(" Flat Pattern with:")
47 print(" length: ", theFlatPattern.Length(), " mm", sep="")
48 print(" width: ", theFlatPattern.Width(), " mm", sep="")
49 print(" thickness: ", theFlatPattern.Thickness(), " mm", sep="")
50 print(" perimeter: ", theFlatPattern.Perimeter(), " mm", sep="")
51
52class PartProcessor(mtk.ModelData_ModelElementVoidVisitor):
53 def __init__(self, theDrawingFolderPath: str):
54 super().__init__()
55 self.myPartIndex = 0
56 self.myUnfolder = mtk.SheetMetal_Unfolder()
57 self.myDrawingFolderPath = theDrawingFolderPath
58
59 def ProcessSolid(self, theSolid: mtk.ModelData_Solid, thePartName: str, theShapeIndex: int):
60 aFlatPattern = self.myUnfolder.Perform(theSolid)
61 PrintFlatPatternInfo(aFlatPattern)
62
63 def ProcessShell(self, theShell: mtk.ModelData_Shell, thePartName: str, theShapeIndex: int):
64 aFlatPattern = self.myUnfolder.Perform(theShell)
65 PrintFlatPatternInfo(aFlatPattern)
66
67 def VisitPart(self, thePart: mtk.ModelData_Part):
68 aPartName = "noname" if thePart.Name().IsEmpty() else str(thePart.Name())
69 aBodyList = thePart.Bodies()
70 i = 0
71 for aBody in aBodyList:
72 aShapeIt = mtk.ModelData_ShapeIterator(aBody)
73 for aShape in aShapeIt:
74 if aShape.Type() == mtk.ShapeType_Solid:
75 print("Part #", self.myPartIndex, " [\"", aPartName, "\"] - solid #", i, " has:", sep="")
76 self.ProcessSolid(mtk.ModelData_Solid.Cast(aShape), aPartName, i)
77 i += 1
78 elif aShape.Type() == mtk.ShapeType_Shell:
79 print("Part #", self.myPartIndex, " [\"", aPartName, "\"] - shell #", i, " has:", sep="")
80 self.ProcessShell(mtk.ModelData_Shell.Cast (aShape), aPartName, i)
81 i += 1
82 self.myPartIndex += 1
83
84def main(theSource: str, theDrawingPath: str):
85 aKey = license.Value()
86
87 if not mtk.LicenseManager.Activate(aKey):
88 print("Failed to activate Manufacturing Toolkit license.")
89 return 1
90
91 aModel = mtk.ModelData_Model()
92 aReader = mtk.ModelData_ModelReader()
93
94
95 if not aReader.Read(mtk.UTF16String(theSource), aModel):
96 print("Failed to open and convert the file " + theSource)
97 return 1
98
99 print("Model: ", aModel.Name(), "\n", sep="")
100
101 aPartProcessor = PartProcessor(theDrawingPath)
102 aVisitor = mtk.ModelData_ModelElementUniqueVisitor(aPartProcessor)
103 aModel.Accept(aVisitor)
104
105 return 0
106
107if __name__ == "__main__":
108 if len(sys.argv) != 3:
109 print("Usage: <input_file> <output_folder>, where:")
110 print(" <input_file> is a name of the file to be read")
111 print(" <output_folder> is a name of the folder where DXF files with drawing to be written")
112 sys.exit()
113
114 aSource = os.path.abspath(sys.argv[1])
115 aRes = os.path.abspath(sys.argv[2])
116
117 sys.exit(main(aSource, aRes))