Retouches des dessins 2D

This commit is contained in:
Youen 2023-11-08 18:12:22 +01:00
parent cbaa3c7cf7
commit 91a85e0f26
56 changed files with 252 additions and 230 deletions

View file

@ -11,248 +11,270 @@ verbose = False
project_folder = os.getcwd() 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): async def generate_2d_drawing(file_name):
doc = App.open(project_folder + '/' + file_name) doc = App.open(project_folder + '/' + file_name)
modified = False
page_name = doc.Name + '_Drawing' 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') 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: else:
code_obj = None modified = True
template_file_name = project_folder + '/lib/A4_Landscape_VSPT.svg'
sources = [main_object] root_objects = []
main_object = None
bound_box = main_object.Shape.BoundBox for obj in doc.Objects:
proj_size = [0, 0, 0] # size of the original part front view after projection at scale 1:1 if len(obj.Parents) == 0:
if bound_box.XLength > bound_box.YLength: root_objects.append(obj)
if bound_box.XLength > bound_box.ZLength: if obj.Label == doc.Name:
main_axis = 0 main_object = obj
proj_size[0] = bound_box.XLength
proj_size[1] = bound_box.ZLength if main_object is None and len(root_objects) == 1:
proj_size[2] = bound_box.YLength 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: else:
main_axis = 2 code_obj = None
proj_size[0] = bound_box.ZLength
proj_size[1] = bound_box.XLength sources = [main_object]
proj_size[2] = bound_box.YLength
else: bound_box = main_object.Shape.BoundBox
if bound_box.YLength > bound_box.ZLength: proj_size = [0, 0, 0] # size of the original part front view after projection at scale 1:1
main_axis = 1 if bound_box.XLength > bound_box.YLength:
proj_size[0] = bound_box.YLength if bound_box.XLength > bound_box.ZLength:
proj_size[1] = bound_box.ZLength main_axis = 0
proj_size[2] = bound_box.XLength 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: else:
main_axis = 2 if bound_box.YLength > bound_box.ZLength:
proj_size[0] = bound_box.ZLength main_axis = 1
proj_size[1] = bound_box.XLength proj_size[0] = bound_box.YLength
proj_size[2] = 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..."); if verbose: print("Adding drawing page...");
page = doc.addObject('TechDraw::DrawPage', page_name) page = doc.addObject('TechDraw::DrawPage', page_name)
template = doc.addObject('TechDraw::DrawSVGTemplate', 'Template') template = doc.addObject('TechDraw::DrawSVGTemplate', 'Template')
template.Template = template_file_name template.Template = template_file_name
page.Template = template page.Template = template
if verbose: print("Computing best scale..."); if verbose: print("Computing best scale...");
scale_denominators = [4.0, 5.0, 6.0, 8.0, 10.0] scale_denominators = [4.0, 5.0, 6.0, 8.0, 10.0]
scale_numerator = 1.0 scale_numerator = 1.0
scale_denominator = scale_denominators[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 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 spacingX = 20.0
spacingY = 50.0 spacingY = 50.0
maxSizeX = 280.0 maxSizeX = 280.0
maxSizeY = 160.0 maxSizeY = 160.0
for denom in scale_denominators: for denom in scale_denominators:
scale_denominator = denom scale_denominator = denom
if proj_total_size[0]*scale_numerator/denom + spacingX <= maxSizeX and proj_total_size[1]*scale_numerator/denom + spacingY <= maxSizeY: if proj_total_size[0]*scale_numerator/denom + spacingX <= maxSizeX and proj_total_size[1]*scale_numerator/denom + spacingY <= maxSizeY:
break break
if verbose: print("Adding projection group..."); if verbose: print("Adding projection group...");
projGroup = doc.addObject('TechDraw::DrawProjGroup', doc.Name + '_ProjGroup') projGroup = doc.addObject('TechDraw::DrawProjGroup', doc.Name + '_ProjGroup')
page.addView(projGroup) page.addView(projGroup)
projGroup.ScaleType = 'Custom' projGroup.ScaleType = 'Custom'
projGroup.Scale = scale_numerator/scale_denominator projGroup.Scale = scale_numerator/scale_denominator
projGroup.spacingX = 20.0 projGroup.spacingX = 20.0
projGroup.spacingY = 50.0 projGroup.spacingY = 50.0
projGroup.Source = sources projGroup.Source = sources
projGroup.addProjection('Front') projGroup.addProjection('Front')
if main_axis == 0: if main_axis == 0:
projGroup.Anchor.Direction = App.Vector(0,1,0) projGroup.Anchor.Direction = App.Vector(0,1,0)
projGroup.Anchor.XDirection = App.Vector(-1,0,0) projGroup.Anchor.XDirection = App.Vector(-1,0,0)
projGroup.Anchor.RotationVector = App.Vector(-1,0,0) projGroup.Anchor.RotationVector = App.Vector(-1,0,0)
elif main_axis == 1: elif main_axis == 1:
projGroup.Anchor.Direction = App.Vector(1,0,0) projGroup.Anchor.Direction = App.Vector(1,0,0)
projGroup.Anchor.XDirection = App.Vector(0,1,0) projGroup.Anchor.XDirection = App.Vector(0,1,0)
projGroup.Anchor.RotationVector = App.Vector(0,1,0) projGroup.Anchor.RotationVector = App.Vector(0,1,0)
elif main_axis == 2: elif main_axis == 2:
projGroup.Anchor.Direction = App.Vector(0,1,0) projGroup.Anchor.Direction = App.Vector(0,1,0)
projGroup.Anchor.XDirection = App.Vector(0,0,1) projGroup.Anchor.XDirection = App.Vector(0,0,1)
projGroup.Anchor.RotationVector = App.Vector(0,0,1) projGroup.Anchor.RotationVector = App.Vector(0,0,1)
projGroup.addProjection('Top') projGroup.addProjection('Top')
projGroup.addProjection('Left') projGroup.addProjection('Left')
projGroup.X = 130.0 projGroup.X = 130.0
projGroup.Y = 150.0 projGroup.Y = 150.0
texts = page.Template.EditableTexts texts = page.Template.EditableTexts
texts['SCALE'] = str(int(scale_numerator+0.5))+':'+str(int(scale_denominator+0.5)) texts['SCALE'] = str(int(scale_numerator+0.5))+':'+str(int(scale_denominator+0.5))
try: try:
texts['PM'] = main_object.Assembly_handbook_Material texts['PM'] = main_object.Assembly_handbook_Material
except: except:
pass pass
texts['PN'] = doc.Name texts['PN'] = doc.Name
texts['TITLELINE-1'] = doc.Name texts['TITLELINE-1'] = doc.Name
page.Template.EditableTexts = texts page.Template.EditableTexts = texts
async def addDimensions(): async def addDimensions():
for view in projGroup.Views: for view in projGroup.Views:
if verbose: print("View: " + view.Label + "...") if verbose: print("View: " + view.Label + "...")
edges = [] edges = []
visibleEdges = view.getVisibleEdges() visibleEdges = view.getVisibleEdges()
edgeIdx = 0 edgeIdx = 0
lowestEdgeName = '' lowestEdgeName = ''
lowestEdgePos = 1000000 lowestEdgePos = 1000000
while True: while True:
try: try:
edge = view.getEdgeByIndex(edgeIdx) edge = view.getEdgeByIndex(edgeIdx)
except: except:
break break
edges.append(edge) edges.append(edge)
if edge.BoundBox.YLength < 0.01 and edge.BoundBox.Center.y < lowestEdgePos: if edge.BoundBox.YLength < 0.01 and edge.BoundBox.Center.y < lowestEdgePos:
lowestEdgePos = edge.BoundBox.Center.y lowestEdgePos = edge.BoundBox.Center.y
lowestEdgeName = 'Edge' + str(edgeIdx) lowestEdgeName = 'Edge' + str(edgeIdx)
edgeIdx = edgeIdx + 1 edgeIdx = edgeIdx + 1
vertices = [] vertices = []
vertIdx = 0 vertIdx = 0
while True: while True:
try: try:
vert = view.getVertexByIndex(vertIdx) vert = view.getVertexByIndex(vertIdx)
except: except:
break break
vertices.append(vert) vertices.append(vert)
vertIdx = vertIdx + 1 vertIdx = vertIdx + 1
def getFeatureName(edge): def getFeatureName(edge):
if edge.Curve.TypeId == 'Part::GeomCircle': if edge.Curve.TypeId == 'Part::GeomCircle':
vertIdx = 0 vertIdx = 0
c = edge.BoundBox.Center c = edge.BoundBox.Center
closestDist = 100000000 closestDist = 100000000
closestVert = None closestVert = None
for vert in vertices: for vert in vertices:
dx = vert.X - c.x dx = vert.X - c.x
dy = vert.Y - c.y dy = vert.Y - c.y
dist = math.sqrt(dx*dx + dy*dy) dist = math.sqrt(dx*dx + dy*dy)
if dist < closestDist: if dist < closestDist:
closestDist = dist closestDist = dist
closestVert = vert closestVert = vert
vertIdx = vertIdx + 1 vertIdx = vertIdx + 1
if closestVert is not None: if closestVert is not None:
return 'Vertex' + str(vertices.index(closestVert)) return 'Vertex' + str(vertices.index(closestVert))
else:
return ''
else: else:
return '' return 'Edge'+str(edges.index(edge))
else:
return 'Edge'+str(edges.index(edge))
if verbose: print("Listing features...") if verbose: print("Listing features...")
features = [] features = []
for edge in edges: 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): 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) featureName = getFeatureName(edge)
if featureName == '': if featureName == '':
continue continue
pos = edge.BoundBox.Center.x pos = edge.BoundBox.Center.x
duplicate = False duplicate = False
for otherFeature in features: for otherFeature in features:
if abs(otherFeature[0] - pos) < 0.1: if abs(otherFeature[0] - pos) < 0.1:
duplicate = True duplicate = True
break break
if not duplicate: if not duplicate:
features.append((pos, edge, featureName)) features.append((pos, edge, featureName))
features.sort(key=lambda e: e[0]) features.sort(key=lambda e: e[0])
def addDimension(edgeA, edgeB, posY): def addDimension(edgeA, edgeB, posY):
dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') dim = doc.addObject('TechDraw::DrawViewDimension','Dimension')
dim.Type = 'DistanceX' dim.Type = 'DistanceX'
dim.FormatSpec = '%.1f' dim.FormatSpec = '%.1f'
dim.References2D = [(view, (getFeatureName(edgeA), getFeatureName(edgeB)))] dim.References2D = [(view, (getFeatureName(edgeA), getFeatureName(edgeB)))]
visibleEdgeA = visibleEdges[edges.index(edgeA)] visibleEdgeA = visibleEdges[edges.index(edgeA)]
visibleEdgeB = visibleEdges[edges.index(edgeB)] visibleEdgeB = visibleEdges[edges.index(edgeB)]
dim.X = (visibleEdgeA.BoundBox.Center.x + visibleEdgeB.BoundBox.Center.x) * 0.5 dim.X = (visibleEdgeA.BoundBox.Center.x + visibleEdgeB.BoundBox.Center.x) * 0.5
dim.Y = posY dim.Y = posY
page.addView(dim) page.addView(dim)
if edgeB.Curve.TypeId == 'Part::GeomCircle': if edgeB.Curve.TypeId == 'Part::GeomCircle':
if abs(edgeB.BoundBox.XLength - 6.5) > 0.01: if abs(edgeB.BoundBox.XLength - 6.5) > 0.01:
dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') dim = doc.addObject('TechDraw::DrawViewDimension','Dimension')
dim.Type = 'Diameter' dim.Type = 'Diameter'
dim.FormatSpec = '%.1f' dim.FormatSpec = '%.1f'
dim.References2D = [(view, ('Edge'+str(edges.index(edgeB)),))] dim.References2D = [(view, ('Edge'+str(edges.index(edgeB)),))]
dim.X = visibleEdgeB.BoundBox.Center.x + 6.0 dim.X = visibleEdgeB.BoundBox.Center.x + 6.0
dim.Y = -6.0 dim.Y = -6.0
page.addView(dim) page.addView(dim)
if abs(edgeB.BoundBox.Center.y) > 0.01 and lowestEdgeName != '': if abs(edgeB.BoundBox.Center.y) > 0.01 and lowestEdgeName != '':
dim = doc.addObject('TechDraw::DrawViewDimension','Dimension') dim = doc.addObject('TechDraw::DrawViewDimension','Dimension')
dim.Type = 'DistanceY' dim.Type = 'DistanceY'
dim.FormatSpec = '%.1f' dim.FormatSpec = '%.1f'
dim.References2D = [(view, (getFeatureName(edgeB),lowestEdgeName))] dim.References2D = [(view, (getFeatureName(edgeB),lowestEdgeName))]
dim.X = visibleEdgeB.BoundBox.Center.x + 2.0 dim.X = visibleEdgeB.BoundBox.Center.x + 2.0
dim.Y = -6.0 dim.Y = -6.0
page.addView(dim) page.addView(dim)
if verbose: print("Adding dimensions...") if verbose: print("Adding dimensions...")
if len(features) >= 2: if len(features) >= 2:
if projGroup.Views.index(view) != 0: if projGroup.Views.index(view) != 0:
addDimension(features[0][1], features[len(features)-1][1], -25.0) addDimension(features[0][1], features[len(features)-1][1], -25.0)
if len(features) > 2: if len(features) > 2:
for featureIdx in range(0, len(features) - 1): for featureIdx in range(0, len(features) - 1):
if featureIdx == 0 or features[featureIdx][1].Curve.TypeId != 'Part::GeomLine': if featureIdx == 0 or features[featureIdx][1].Curve.TypeId != 'Part::GeomLine':
addDimension(features[featureIdx][1], features[featureIdx + 1][1], 15.0) addDimension(features[featureIdx][1], features[featureIdx + 1][1], 15.0)
if verbose: print("Adding secondary objects...") if verbose: print("Adding secondary objects...")
if code_obj is not None: if code_obj is not None:
projGroup.Source = projGroup.Source + [code_obj] projGroup.Source = projGroup.Source + [code_obj]
page.recompute(True) page.recompute(True)
await vspt_coroutine.get_main_loop().wait(1) await vspt_coroutine.get_main_loop().wait(1)
await addDimensions() await addDimensions()
if verbose: print("Saving...") if apply_styles(page):
page.recompute(True) modified = True
page.ViewObject.Visibility = False # don't save the document with the page open or it will automatically reopen on load
doc.save() 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...") if verbose: print("Closing...")
vspt_freecad.close_all_docs() vspt_freecad.close_all_docs()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.