diff --git a/tools/generate-2d-drawings.py b/tools/generate-2d-drawings.py index e6cd381..3840ece 100644 --- a/tools/generate-2d-drawings.py +++ b/tools/generate-2d-drawings.py @@ -11,248 +11,270 @@ verbose = False project_folder = os.getcwd() +def apply_styles(page): + modified = False + + dim_font_size = 3.0 + + for view in page.Views: + if view.TypeId == 'TechDraw::DrawViewDimension': + if view.ViewObject.Fontsize != dim_font_size: + view.ViewObject.Fontsize = dim_font_size + modified = True + + return modified + async def generate_2d_drawing(file_name): doc = App.open(project_folder + '/' + file_name) + modified = False + page_name = doc.Name + '_Drawing' - if doc.getObject(page_name) is not None: + page = doc.getObject(page_name) + if page is not None: print('2D drawing already exists - skipped') - return - template_file_name = project_folder + '/lib/A4_Landscape_VSPT.svg' - - root_objects = [] - main_object = None - - for obj in doc.Objects: - if len(obj.Parents) == 0: - root_objects.append(obj) - if obj.Label == doc.Name: - main_object = obj - - if main_object is None and len(root_objects) == 1: - main_object = root_objects[0] - - if main_object is None: - raise Exception("Can't find main object in file " + doc.FileName + " (found " + str(len(root_objects)) + " root object(s), none named like the document " + doc.Name + ")") - - code_obj = doc.getObjectsByLabel('Code_Tube_Draft') - if len(code_obj) == 1: - code_obj = code_obj[0] else: - code_obj = None - - sources = [main_object] - - bound_box = main_object.Shape.BoundBox - proj_size = [0, 0, 0] # size of the original part front view after projection at scale 1:1 - if bound_box.XLength > bound_box.YLength: - if bound_box.XLength > bound_box.ZLength: - main_axis = 0 - proj_size[0] = bound_box.XLength - proj_size[1] = bound_box.ZLength - proj_size[2] = bound_box.YLength + modified = True + template_file_name = project_folder + '/lib/A4_Landscape_VSPT.svg' + + root_objects = [] + main_object = None + + for obj in doc.Objects: + if len(obj.Parents) == 0: + root_objects.append(obj) + if obj.Label == doc.Name: + main_object = obj + + if main_object is None and len(root_objects) == 1: + main_object = root_objects[0] + + if main_object is None: + raise Exception("Can't find main object in file " + doc.FileName + " (found " + str(len(root_objects)) + " root object(s), none named like the document " + doc.Name + ")") + + code_obj = doc.getObjectsByLabel('Code_Tube_Draft') + if len(code_obj) == 1: + code_obj = code_obj[0] else: - main_axis = 2 - proj_size[0] = bound_box.ZLength - proj_size[1] = bound_box.XLength - proj_size[2] = bound_box.YLength - else: - if bound_box.YLength > bound_box.ZLength: - main_axis = 1 - proj_size[0] = bound_box.YLength - proj_size[1] = bound_box.ZLength - proj_size[2] = bound_box.XLength + code_obj = None + + sources = [main_object] + + bound_box = main_object.Shape.BoundBox + proj_size = [0, 0, 0] # size of the original part front view after projection at scale 1:1 + if bound_box.XLength > bound_box.YLength: + if bound_box.XLength > bound_box.ZLength: + main_axis = 0 + proj_size[0] = bound_box.XLength + proj_size[1] = bound_box.ZLength + proj_size[2] = bound_box.YLength + else: + main_axis = 2 + proj_size[0] = bound_box.ZLength + proj_size[1] = bound_box.XLength + proj_size[2] = bound_box.YLength else: - main_axis = 2 - proj_size[0] = bound_box.ZLength - proj_size[1] = bound_box.XLength - proj_size[2] = bound_box.YLength - - if verbose: print("Adding drawing page..."); - - page = doc.addObject('TechDraw::DrawPage', page_name) - template = doc.addObject('TechDraw::DrawSVGTemplate', 'Template') - - template.Template = template_file_name - page.Template = template - - if verbose: print("Computing best scale..."); - scale_denominators = [4.0, 5.0, 6.0, 8.0, 10.0] - scale_numerator = 1.0 - scale_denominator = scale_denominators[0] - proj_total_size = [proj_size[0] + proj_size[2], proj_size[1] + proj_size[2]] # projected size of all views (without spacing) at scale 1:1 - spacingX = 20.0 - spacingY = 50.0 - maxSizeX = 280.0 - maxSizeY = 160.0 - for denom in scale_denominators: - scale_denominator = denom - if proj_total_size[0]*scale_numerator/denom + spacingX <= maxSizeX and proj_total_size[1]*scale_numerator/denom + spacingY <= maxSizeY: - break - - if verbose: print("Adding projection group..."); - - projGroup = doc.addObject('TechDraw::DrawProjGroup', doc.Name + '_ProjGroup') - page.addView(projGroup) - projGroup.ScaleType = 'Custom' - projGroup.Scale = scale_numerator/scale_denominator - projGroup.spacingX = 20.0 - projGroup.spacingY = 50.0 - projGroup.Source = sources - projGroup.addProjection('Front') - if main_axis == 0: - projGroup.Anchor.Direction = App.Vector(0,1,0) - projGroup.Anchor.XDirection = App.Vector(-1,0,0) - projGroup.Anchor.RotationVector = App.Vector(-1,0,0) - elif main_axis == 1: - projGroup.Anchor.Direction = App.Vector(1,0,0) - projGroup.Anchor.XDirection = App.Vector(0,1,0) - projGroup.Anchor.RotationVector = App.Vector(0,1,0) - elif main_axis == 2: - projGroup.Anchor.Direction = App.Vector(0,1,0) - projGroup.Anchor.XDirection = App.Vector(0,0,1) - projGroup.Anchor.RotationVector = App.Vector(0,0,1) - projGroup.addProjection('Top') - projGroup.addProjection('Left') - projGroup.X = 130.0 - projGroup.Y = 150.0 - - texts = page.Template.EditableTexts - texts['SCALE'] = str(int(scale_numerator+0.5))+':'+str(int(scale_denominator+0.5)) - try: - texts['PM'] = main_object.Assembly_handbook_Material - except: - pass - texts['PN'] = doc.Name - texts['TITLELINE-1'] = doc.Name - page.Template.EditableTexts = texts - - async def addDimensions(): - for view in projGroup.Views: - if verbose: print("View: " + view.Label + "...") - - edges = [] - visibleEdges = view.getVisibleEdges() - edgeIdx = 0 - lowestEdgeName = '' - lowestEdgePos = 1000000 - while True: - try: - edge = view.getEdgeByIndex(edgeIdx) - except: - break - edges.append(edge) - - if edge.BoundBox.YLength < 0.01 and edge.BoundBox.Center.y < lowestEdgePos: - lowestEdgePos = edge.BoundBox.Center.y - lowestEdgeName = 'Edge' + str(edgeIdx) - - edgeIdx = edgeIdx + 1 - - vertices = [] - vertIdx = 0 - while True: - try: - vert = view.getVertexByIndex(vertIdx) - except: - break - vertices.append(vert) - vertIdx = vertIdx + 1 - - def getFeatureName(edge): - if edge.Curve.TypeId == 'Part::GeomCircle': - vertIdx = 0 - c = edge.BoundBox.Center - closestDist = 100000000 - closestVert = None - for vert in vertices: - dx = vert.X - c.x - dy = vert.Y - c.y - dist = math.sqrt(dx*dx + dy*dy) - if dist < closestDist: - closestDist = dist - closestVert = vert - vertIdx = vertIdx + 1 - if closestVert is not None: - return 'Vertex' + str(vertices.index(closestVert)) + if bound_box.YLength > bound_box.ZLength: + main_axis = 1 + proj_size[0] = bound_box.YLength + proj_size[1] = bound_box.ZLength + proj_size[2] = bound_box.XLength + else: + main_axis = 2 + proj_size[0] = bound_box.ZLength + proj_size[1] = bound_box.XLength + proj_size[2] = bound_box.YLength + + if verbose: print("Adding drawing page..."); + + page = doc.addObject('TechDraw::DrawPage', page_name) + template = doc.addObject('TechDraw::DrawSVGTemplate', 'Template') + + template.Template = template_file_name + page.Template = template + + if verbose: print("Computing best scale..."); + scale_denominators = [4.0, 5.0, 6.0, 8.0, 10.0] + scale_numerator = 1.0 + scale_denominator = scale_denominators[0] + proj_total_size = [proj_size[0] + proj_size[2], proj_size[1] + proj_size[2]] # projected size of all views (without spacing) at scale 1:1 + spacingX = 20.0 + spacingY = 50.0 + maxSizeX = 280.0 + maxSizeY = 160.0 + for denom in scale_denominators: + scale_denominator = denom + if proj_total_size[0]*scale_numerator/denom + spacingX <= maxSizeX and proj_total_size[1]*scale_numerator/denom + spacingY <= maxSizeY: + break + + if verbose: print("Adding projection group..."); + + projGroup = doc.addObject('TechDraw::DrawProjGroup', doc.Name + '_ProjGroup') + page.addView(projGroup) + projGroup.ScaleType = 'Custom' + projGroup.Scale = scale_numerator/scale_denominator + projGroup.spacingX = 20.0 + projGroup.spacingY = 50.0 + projGroup.Source = sources + projGroup.addProjection('Front') + if main_axis == 0: + projGroup.Anchor.Direction = App.Vector(0,1,0) + projGroup.Anchor.XDirection = App.Vector(-1,0,0) + projGroup.Anchor.RotationVector = App.Vector(-1,0,0) + elif main_axis == 1: + projGroup.Anchor.Direction = App.Vector(1,0,0) + projGroup.Anchor.XDirection = App.Vector(0,1,0) + projGroup.Anchor.RotationVector = App.Vector(0,1,0) + elif main_axis == 2: + projGroup.Anchor.Direction = App.Vector(0,1,0) + projGroup.Anchor.XDirection = App.Vector(0,0,1) + projGroup.Anchor.RotationVector = App.Vector(0,0,1) + projGroup.addProjection('Top') + projGroup.addProjection('Left') + projGroup.X = 130.0 + projGroup.Y = 150.0 + + texts = page.Template.EditableTexts + texts['SCALE'] = str(int(scale_numerator+0.5))+':'+str(int(scale_denominator+0.5)) + try: + texts['PM'] = main_object.Assembly_handbook_Material + except: + pass + texts['PN'] = doc.Name + texts['TITLELINE-1'] = doc.Name + page.Template.EditableTexts = texts + + async def addDimensions(): + for view in projGroup.Views: + if verbose: print("View: " + view.Label + "...") + + edges = [] + visibleEdges = view.getVisibleEdges() + edgeIdx = 0 + lowestEdgeName = '' + lowestEdgePos = 1000000 + while True: + try: + edge = view.getEdgeByIndex(edgeIdx) + except: + break + edges.append(edge) + + if edge.BoundBox.YLength < 0.01 and edge.BoundBox.Center.y < lowestEdgePos: + lowestEdgePos = edge.BoundBox.Center.y + lowestEdgeName = 'Edge' + str(edgeIdx) + + edgeIdx = edgeIdx + 1 + + vertices = [] + vertIdx = 0 + while True: + try: + vert = view.getVertexByIndex(vertIdx) + except: + break + vertices.append(vert) + vertIdx = vertIdx + 1 + + def getFeatureName(edge): + if edge.Curve.TypeId == 'Part::GeomCircle': + vertIdx = 0 + c = edge.BoundBox.Center + closestDist = 100000000 + closestVert = None + for vert in vertices: + dx = vert.X - c.x + dy = vert.Y - c.y + dist = math.sqrt(dx*dx + dy*dy) + if dist < closestDist: + closestDist = dist + closestVert = vert + vertIdx = vertIdx + 1 + if closestVert is not None: + return 'Vertex' + str(vertices.index(closestVert)) + else: + return '' else: - return '' - else: - return 'Edge'+str(edges.index(edge)) - - if verbose: print("Listing features...") - features = [] - for edge in edges: - if (edge.Curve.TypeId == 'Part::GeomLine' and edge.BoundBox.XLength <= 0.01) or (edge.Curve.TypeId == 'Part::GeomCircle' and abs(edge.Curve.Radius * 2.0 - edge.BoundBox.XLength) < 0.001 and abs(edge.Curve.Radius * 2.0 - edge.BoundBox.YLength) < 0.001): - featureName = getFeatureName(edge) - if featureName == '': - continue - - pos = edge.BoundBox.Center.x - duplicate = False - for otherFeature in features: - if abs(otherFeature[0] - pos) < 0.1: - duplicate = True - break - if not duplicate: - features.append((pos, edge, featureName)) - features.sort(key=lambda e: e[0]) - - def addDimension(edgeA, edgeB, posY): - dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') - dim.Type = 'DistanceX' - dim.FormatSpec = '%.1f' - dim.References2D = [(view, (getFeatureName(edgeA), getFeatureName(edgeB)))] - visibleEdgeA = visibleEdges[edges.index(edgeA)] - visibleEdgeB = visibleEdges[edges.index(edgeB)] - dim.X = (visibleEdgeA.BoundBox.Center.x + visibleEdgeB.BoundBox.Center.x) * 0.5 - dim.Y = posY - page.addView(dim) - - if edgeB.Curve.TypeId == 'Part::GeomCircle': - if abs(edgeB.BoundBox.XLength - 6.5) > 0.01: - dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') - dim.Type = 'Diameter' - dim.FormatSpec = '%.1f' - dim.References2D = [(view, ('Edge'+str(edges.index(edgeB)),))] - dim.X = visibleEdgeB.BoundBox.Center.x + 6.0 - dim.Y = -6.0 - page.addView(dim) - - if abs(edgeB.BoundBox.Center.y) > 0.01 and lowestEdgeName != '': - dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') - dim.Type = 'DistanceY' - dim.FormatSpec = '%.1f' - dim.References2D = [(view, (getFeatureName(edgeB),lowestEdgeName))] - dim.X = visibleEdgeB.BoundBox.Center.x + 2.0 - dim.Y = -6.0 - page.addView(dim) - - if verbose: print("Adding dimensions...") + return 'Edge'+str(edges.index(edge)) + + if verbose: print("Listing features...") + features = [] + for edge in edges: + if (edge.Curve.TypeId == 'Part::GeomLine' and edge.BoundBox.XLength <= 0.01) or (edge.Curve.TypeId == 'Part::GeomCircle' and abs(edge.Curve.Radius * 2.0 - edge.BoundBox.XLength) < 0.001 and abs(edge.Curve.Radius * 2.0 - edge.BoundBox.YLength) < 0.001): + featureName = getFeatureName(edge) + if featureName == '': + continue - if len(features) >= 2: - if projGroup.Views.index(view) != 0: - addDimension(features[0][1], features[len(features)-1][1], -25.0) - - if len(features) > 2: - for featureIdx in range(0, len(features) - 1): - if featureIdx == 0 or features[featureIdx][1].Curve.TypeId != 'Part::GeomLine': - addDimension(features[featureIdx][1], features[featureIdx + 1][1], 15.0) - - if verbose: print("Adding secondary objects...") - if code_obj is not None: - projGroup.Source = projGroup.Source + [code_obj] - - page.recompute(True) - await vspt_coroutine.get_main_loop().wait(1) - await addDimensions() - - if verbose: print("Saving...") - page.recompute(True) - page.ViewObject.Visibility = False # don't save the document with the page open or it will automatically reopen on load - doc.save() + pos = edge.BoundBox.Center.x + duplicate = False + for otherFeature in features: + if abs(otherFeature[0] - pos) < 0.1: + duplicate = True + break + if not duplicate: + features.append((pos, edge, featureName)) + features.sort(key=lambda e: e[0]) + + def addDimension(edgeA, edgeB, posY): + dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') + dim.Type = 'DistanceX' + dim.FormatSpec = '%.1f' + dim.References2D = [(view, (getFeatureName(edgeA), getFeatureName(edgeB)))] + visibleEdgeA = visibleEdges[edges.index(edgeA)] + visibleEdgeB = visibleEdges[edges.index(edgeB)] + dim.X = (visibleEdgeA.BoundBox.Center.x + visibleEdgeB.BoundBox.Center.x) * 0.5 + dim.Y = posY + page.addView(dim) + + if edgeB.Curve.TypeId == 'Part::GeomCircle': + if abs(edgeB.BoundBox.XLength - 6.5) > 0.01: + dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') + dim.Type = 'Diameter' + dim.FormatSpec = '%.1f' + dim.References2D = [(view, ('Edge'+str(edges.index(edgeB)),))] + dim.X = visibleEdgeB.BoundBox.Center.x + 6.0 + dim.Y = -6.0 + page.addView(dim) + + if abs(edgeB.BoundBox.Center.y) > 0.01 and lowestEdgeName != '': + dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') + dim.Type = 'DistanceY' + dim.FormatSpec = '%.1f' + dim.References2D = [(view, (getFeatureName(edgeB),lowestEdgeName))] + dim.X = visibleEdgeB.BoundBox.Center.x + 2.0 + dim.Y = -6.0 + page.addView(dim) + + if verbose: print("Adding dimensions...") + + if len(features) >= 2: + if projGroup.Views.index(view) != 0: + addDimension(features[0][1], features[len(features)-1][1], -25.0) + + if len(features) > 2: + for featureIdx in range(0, len(features) - 1): + if featureIdx == 0 or features[featureIdx][1].Curve.TypeId != 'Part::GeomLine': + addDimension(features[featureIdx][1], features[featureIdx + 1][1], 15.0) + + if verbose: print("Adding secondary objects...") + if code_obj is not None: + projGroup.Source = projGroup.Source + [code_obj] + + page.recompute(True) + await vspt_coroutine.get_main_loop().wait(1) + await addDimensions() + + if apply_styles(page): + modified = True + + if modified: + if verbose: print("Saving...") + page.recompute(True) + page.ViewObject.Visibility = False # don't save the document with the page open or it will automatically reopen on load + await vspt_coroutine.get_main_loop().wait(1) + doc.save() if verbose: print("Closing...") vspt_freecad.close_all_docs() diff --git a/tubes/E16.FCStd b/tubes/E16.FCStd index df4cbfc..f40f184 100644 Binary files a/tubes/E16.FCStd and b/tubes/E16.FCStd differ diff --git a/tubes/E20.FCStd b/tubes/E20.FCStd index d6e3a80..7e2a791 100644 Binary files a/tubes/E20.FCStd and b/tubes/E20.FCStd differ diff --git a/tubes/E21.FCStd b/tubes/E21.FCStd index 24795d8..ffab880 100644 Binary files a/tubes/E21.FCStd and b/tubes/E21.FCStd differ diff --git a/tubes/E36.FCStd b/tubes/E36.FCStd index 9d7b759..b028fe1 100644 Binary files a/tubes/E36.FCStd and b/tubes/E36.FCStd differ diff --git a/tubes/L00.FCStd b/tubes/L00.FCStd index 77d4a53..1f7ff4c 100644 Binary files a/tubes/L00.FCStd and b/tubes/L00.FCStd differ diff --git a/tubes/L01.FCStd b/tubes/L01.FCStd index 31931b4..1a80caa 100644 Binary files a/tubes/L01.FCStd and b/tubes/L01.FCStd differ diff --git a/tubes/L02.FCStd b/tubes/L02.FCStd index 0c9c7f9..bee7847 100644 Binary files a/tubes/L02.FCStd and b/tubes/L02.FCStd differ diff --git a/tubes/L03.FCStd b/tubes/L03.FCStd index b826566..00eb667 100644 Binary files a/tubes/L03.FCStd and b/tubes/L03.FCStd differ diff --git a/tubes/L04.FCStd b/tubes/L04.FCStd index 1739d95..1200c04 100644 Binary files a/tubes/L04.FCStd and b/tubes/L04.FCStd differ diff --git a/tubes/L05.FCStd b/tubes/L05.FCStd index 29e6c4f..714e5a1 100644 Binary files a/tubes/L05.FCStd and b/tubes/L05.FCStd differ diff --git a/tubes/L06.FCStd b/tubes/L06.FCStd index 04d9e8f..b156f43 100644 Binary files a/tubes/L06.FCStd and b/tubes/L06.FCStd differ diff --git a/tubes/L07.FCStd b/tubes/L07.FCStd index c821ac1..2edaded 100644 Binary files a/tubes/L07.FCStd and b/tubes/L07.FCStd differ diff --git a/tubes/L08.FCStd b/tubes/L08.FCStd index 7f9b0df..6170e8c 100644 Binary files a/tubes/L08.FCStd and b/tubes/L08.FCStd differ diff --git a/tubes/L09.FCStd b/tubes/L09.FCStd index a25650c..f6be6bd 100644 Binary files a/tubes/L09.FCStd and b/tubes/L09.FCStd differ diff --git a/tubes/L10.FCStd b/tubes/L10.FCStd index b4aff7d..e92b85d 100644 Binary files a/tubes/L10.FCStd and b/tubes/L10.FCStd differ diff --git a/tubes/L11.FCStd b/tubes/L11.FCStd index a1fc0c9..2bcb69d 100644 Binary files a/tubes/L11.FCStd and b/tubes/L11.FCStd differ diff --git a/tubes/L12.FCStd b/tubes/L12.FCStd index 0dda898..e50e90b 100644 Binary files a/tubes/L12.FCStd and b/tubes/L12.FCStd differ diff --git a/tubes/M00.FCStd b/tubes/M00.FCStd index d4a0983..7b0397d 100644 Binary files a/tubes/M00.FCStd and b/tubes/M00.FCStd differ diff --git a/tubes/M01.FCStd b/tubes/M01.FCStd index 3b06384..2c0839f 100644 Binary files a/tubes/M01.FCStd and b/tubes/M01.FCStd differ diff --git a/tubes/M02.FCStd b/tubes/M02.FCStd index 9efa11c..a223422 100644 Binary files a/tubes/M02.FCStd and b/tubes/M02.FCStd differ diff --git a/tubes/M03.FCStd b/tubes/M03.FCStd index fd715fb..6e31f60 100644 Binary files a/tubes/M03.FCStd and b/tubes/M03.FCStd differ diff --git a/tubes/M05.FCStd b/tubes/M05.FCStd index 1c0a200..51dbc56 100644 Binary files a/tubes/M05.FCStd and b/tubes/M05.FCStd differ diff --git a/tubes/M06.FCStd b/tubes/M06.FCStd index bd41412..fde37e3 100644 Binary files a/tubes/M06.FCStd and b/tubes/M06.FCStd differ diff --git a/tubes/M07.FCStd b/tubes/M07.FCStd index 9019539..df8a035 100644 Binary files a/tubes/M07.FCStd and b/tubes/M07.FCStd differ diff --git a/tubes/R00.FCStd b/tubes/R00.FCStd index 116f577..7402f32 100644 Binary files a/tubes/R00.FCStd and b/tubes/R00.FCStd differ diff --git a/tubes/R01.FCStd b/tubes/R01.FCStd index 8bfdb22..ededba9 100644 Binary files a/tubes/R01.FCStd and b/tubes/R01.FCStd differ diff --git a/tubes/R02.FCStd b/tubes/R02.FCStd index 4bc2e6d..9cd3cd5 100644 Binary files a/tubes/R02.FCStd and b/tubes/R02.FCStd differ diff --git a/tubes/R03.FCStd b/tubes/R03.FCStd index fd49201..2389d49 100644 Binary files a/tubes/R03.FCStd and b/tubes/R03.FCStd differ diff --git a/tubes/R04.FCStd b/tubes/R04.FCStd index 6802105..208ae50 100644 Binary files a/tubes/R04.FCStd and b/tubes/R04.FCStd differ diff --git a/tubes/T00.FCStd b/tubes/T00.FCStd index 7d30cf1..85d375c 100644 Binary files a/tubes/T00.FCStd and b/tubes/T00.FCStd differ diff --git a/tubes/T01.FCStd b/tubes/T01.FCStd index bb5422e..e221bda 100644 Binary files a/tubes/T01.FCStd and b/tubes/T01.FCStd differ diff --git a/tubes/T02.FCStd b/tubes/T02.FCStd index 7cd3546..c18737b 100644 Binary files a/tubes/T02.FCStd and b/tubes/T02.FCStd differ diff --git a/tubes/T03.FCStd b/tubes/T03.FCStd index da95196..eb159da 100644 Binary files a/tubes/T03.FCStd and b/tubes/T03.FCStd differ diff --git a/tubes/T04.FCStd b/tubes/T04.FCStd index 639978e..1ac91b6 100644 Binary files a/tubes/T04.FCStd and b/tubes/T04.FCStd differ diff --git a/tubes/T05.FCStd b/tubes/T05.FCStd index f2074b2..71e8669 100644 Binary files a/tubes/T05.FCStd and b/tubes/T05.FCStd differ diff --git a/tubes/T06.FCStd b/tubes/T06.FCStd index 2aae846..5a16659 100644 Binary files a/tubes/T06.FCStd and b/tubes/T06.FCStd differ diff --git a/tubes/T07.FCStd b/tubes/T07.FCStd index 127e289..bc0f0cf 100644 Binary files a/tubes/T07.FCStd and b/tubes/T07.FCStd differ diff --git a/tubes/T08.FCStd b/tubes/T08.FCStd index a3b3700..bff1213 100644 Binary files a/tubes/T08.FCStd and b/tubes/T08.FCStd differ diff --git a/tubes/T09.FCStd b/tubes/T09.FCStd index 25b230b..26b3dfd 100644 Binary files a/tubes/T09.FCStd and b/tubes/T09.FCStd differ diff --git a/tubes/T10.FCStd b/tubes/T10.FCStd index 9096dfe..3bc5739 100644 Binary files a/tubes/T10.FCStd and b/tubes/T10.FCStd differ diff --git a/tubes/T11.FCStd b/tubes/T11.FCStd index d0d0600..b6fe837 100644 Binary files a/tubes/T11.FCStd and b/tubes/T11.FCStd differ diff --git a/tubes/T12.FCStd b/tubes/T12.FCStd index 0e83f44..137d6db 100644 Binary files a/tubes/T12.FCStd and b/tubes/T12.FCStd differ diff --git a/tubes/T13.FCStd b/tubes/T13.FCStd index a4b4192..08b3c2b 100644 Binary files a/tubes/T13.FCStd and b/tubes/T13.FCStd differ diff --git a/tubes/T14.FCStd b/tubes/T14.FCStd index 7733ca9..3d83aa5 100644 Binary files a/tubes/T14.FCStd and b/tubes/T14.FCStd differ diff --git a/tubes/T15.FCStd b/tubes/T15.FCStd index ecfa4d1..f63239f 100644 Binary files a/tubes/T15.FCStd and b/tubes/T15.FCStd differ diff --git a/tubes/T16.FCStd b/tubes/T16.FCStd index 8558a75..f57e44c 100644 Binary files a/tubes/T16.FCStd and b/tubes/T16.FCStd differ diff --git a/tubes/T17.FCStd b/tubes/T17.FCStd index 38ecf6f..9e1cc12 100644 Binary files a/tubes/T17.FCStd and b/tubes/T17.FCStd differ diff --git a/tubes/T18.FCStd b/tubes/T18.FCStd index 2de42b1..24becd1 100644 Binary files a/tubes/T18.FCStd and b/tubes/T18.FCStd differ diff --git a/tubes/T19.FCStd b/tubes/T19.FCStd index f89588a..19e1f62 100644 Binary files a/tubes/T19.FCStd and b/tubes/T19.FCStd differ diff --git a/tubes/T20.FCStd b/tubes/T20.FCStd index 50e3c6e..96baf98 100644 Binary files a/tubes/T20.FCStd and b/tubes/T20.FCStd differ diff --git a/tubes/T21.FCStd b/tubes/T21.FCStd index bab62bb..5aba4b0 100644 Binary files a/tubes/T21.FCStd and b/tubes/T21.FCStd differ diff --git a/tubes/T22.FCStd b/tubes/T22.FCStd index 97389da..c354824 100644 Binary files a/tubes/T22.FCStd and b/tubes/T22.FCStd differ diff --git a/tubes/T23.FCStd b/tubes/T23.FCStd index 12dbf0a..01a246b 100644 Binary files a/tubes/T23.FCStd and b/tubes/T23.FCStd differ diff --git a/tubes/T24.FCStd b/tubes/T24.FCStd index 70dc8ea..914be88 100644 Binary files a/tubes/T24.FCStd and b/tubes/T24.FCStd differ diff --git a/tubes/T25.FCStd b/tubes/T25.FCStd index 0f2ee62..8566f74 100644 Binary files a/tubes/T25.FCStd and b/tubes/T25.FCStd differ