SolidWorks_工程图设计1_工程图基础入门
2026/7/10 3:28:49 网站建设 项目流程

工程图基础入门:从模型创建标准三视图与图纸格式设置

摘要

在机械设计和制造领域,工程图是工程师之间交流设计思想、传递制造信息的通用语言。本文将从零开始,系统讲解如何从三维模型创建标准三视图(主视图、俯视图、左视图),并详细介绍工程图图纸格式的设置方法。通过本文的学习,读者将掌握工程图制作的核心技能,包括投影原理、视图布局、尺寸标注、标题栏填写等关键知识点。文中将提供完整的代码示例,帮助读者快速上手实践。

引言

工程图(Engineering Drawing)被誉为“工程师的语言”,它是产品设计、制造、检验和装配过程中不可或缺的技术文件。在计算机辅助设计(CAD)技术高度发达的今天,虽然三维建模已经非常普及,但二维工程图仍然在以下场景中发挥着不可替代的作用:

  • 制造加工:车间工人需要清晰的二维图纸进行零件加工
  • 质量检验:质检人员依据图纸尺寸进行产品检测
  • 装配指导:装配工人依赖装配图进行产品组装
  • 技术交流:不同部门之间通过图纸传递技术信息

本文将使用Python和ezdxf库作为主要工具,演示如何从三维模型数据生成标准三视图。选择ezdxf的原因是其开源性、跨平台性和对DXF格式的完整支持。通过本文的实践,读者将理解工程图制作的基本原理,并能够自动化生成符合国标(GB)的工程图纸。

1. 工程图基础理论

1.1 投影法与三视图

工程图的核心是正投影法,即投影线相互平行且垂直于投影面的投影方法。在正投影中,为了完整表达物体的形状,通常需要从三个方向进行投影:

  • 主视图(前视图):从前向后投影,最能反映物体形状特征
  • 俯视图(顶视图):从上向下投影,反映物体宽度和深度
  • 左视图(侧视图):从左向右投影,反映物体高度和深度

这三个视图之间存在严格的投影关系:

  • 主视图和俯视图:长对正(长度相等)
  • 主视图和左视图:高平齐(高度相等)
  • 俯视图和左视图:宽相等(宽度相等)

1.2 图纸幅面与格式

根据国家标准GB/T 14689-2008,常用图纸幅面尺寸如下:

幅面代号尺寸(B×L)mm
A0841×1189
A1594×841
A2420×594
A3297×420
A4210×297

图纸通常包含以下区域:

  • 图框:图纸的边界线
  • 标题栏:包含图纸名称、编号、比例、材料等信息
  • 绘图区域:放置视图的实际区域

2. 开发环境搭建

2.1 安装必要库

首先需要安装ezdxf库和numpy库:

pipinstallezdxf numpy

2.2 基础导入

importezdxffromezdxf.mathimportVec2,Vec3fromezdxf.enumsimportTextEntityAlignmentimportnumpyasnpfromtypingimportList,Tuple

3. 创建三维模型数据

3.1 定义基础几何体

首先,我们定义一个简单的三维模型——带孔矩形块。这个模型包含基本的几何特征(平面、孔),适合演示三视图的生成。

classSimplePart3D:"""定义三维零件模型"""def__init__(self):# 零件尺寸(单位:mm)self.width=100# X方向长度self.depth=60# Y方向长度self.height=40# Z方向长度self.hole_radius=10# 孔半径self.hole_x=50# 孔中心X坐标self.hole_y=30# 孔中心Y坐标defget_vertices(self)->List[Vec3]:"""获取所有顶点坐标"""w,d,h=self.width,self.depth,self.heightreturn[Vec3(0,0,0),# 顶点0Vec3(w,0,0),# 顶点1Vec3(w,d,0),# 顶点2Vec3(0,d,0),# 顶点3Vec3(0,0,h),# 顶点4Vec3(w,0,h),# 顶点5Vec3(w,d,h),# 顶点6Vec3(0,d,h),# 顶点7]defget_edges(self)->List[Tuple[int,int]]:"""获取所有棱边(顶点索引对)"""# 底部矩形边bottom_edges=[(0,1),(1,2),(2,3),(3,0)]# 顶部矩形边top_edges=[(4,5),(5,6),(6,7),(7,4)]# 垂直棱边vertical_edges=[(0,4),(1,5),(2,6),(3,7)]returnbottom_edges+top_edges+vertical_edgesdefget_hole_circle_points(self,num_points:int=32)->List[Vec3]:"""获取孔圆周上的点(在顶面和底面)"""points=[]forzin[0,self.height]:foriinrange(num_points):angle=2*np.pi*i/num_points x=self.hole_x+self.hole_radius*np.cos(angle)y=self.hole_y+self.hole_radius*np.sin(angle)points.append(Vec3(x,y,z))returnpoints

4. 生成标准三视图

4.1 投影变换函数

根据正投影原理,我们需要将三维坐标投影到三个投影面上:

defproject_to_front_view(point:Vec3)->Vec2:"""主视图投影:从前向后看,保留Y(高度)和X(宽度)"""returnVec2(point.x,point.z)# 注意:工程图中高度方向为Y轴defproject_to_top_view(point:Vec3)->Vec2:"""俯视图投影:从上向下看,保留X(长度)和Y(深度)"""returnVec2(point.x,point.y)defproject_to_left_view(point:Vec3)->Vec2:"""左视图投影:从左向右看,保留Z(高度)和Y(深度)"""returnVec2(point.z,point.y)# 注意:左视图深度方向为Y轴

4.2 视图布局计算

三视图在图纸上的布局需要满足“长对正、高平齐、宽相等”的原则:

defcalculate_view_positions(part:SimplePart3D,spacing:float=20):""" 计算三视图在图纸上的位置 返回:{视图名称: (基准点x, 基准点y)} """# 主视图位于左下角front_base=Vec2(50,50)# 俯视图位于主视图正上方(长对正)top_base=Vec2(50,50+part.height+spacing)# 左视图位于主视图正右方(高平齐)left_base=Vec2(50+part.width+spacing,50)return{'front':front_base,'top':top_base,'left':left_base}

4.3 绘制单个视图

defdraw_2d_view(msp,points_2d:List[Vec2],edges:List[Tuple[int,int]],base_point:Vec2,color:int=1):""" 在图纸上绘制二维视图 :param msp: 模型空间 :param points_2d: 二维点列表 :param edges: 边列表(顶点索引对) :param base_point: 视图基准点 :param color: 线条颜色(1=红色,2=黄色,3=绿色,4=青色,5=蓝色,7=白色) """forstart_idx,end_idxinedges:start=points_2d[start_idx]+base_point end=points_2d[end_idx]+base_point msp.add_line(start,end,dxfattribs={'color':color})

4.4 生成完整三视图

defcreate_three_views(part:SimplePart3D,msp)->None:""" 生成零件的标准三视图 """# 获取零件几何数据vertices=part.get_vertices()edges=part.get_edges()# 计算视图位置positions=calculate_view_positions(part)# 1. 主视图(前视图)front_points=[project_to_front_view(v)forvinvertices]draw_2d_view(msp,front_points,edges,positions['front'],color=7)# 白色# 2. 俯视图(顶视图)top_points=[project_to_top_view(v)forvinvertices]draw_2d_view(msp,top_points,edges,positions['top'],color=4)# 青色# 3. 左视图(侧视图)left_points=[project_to_left_view(v)forvinvertices]draw_2d_view(msp,left_points,edges,positions['left'],color=3)# 绿色# 4. 绘制孔(虚线表示隐藏特征)hole_points=part.get_hole_circle_points()# 在主视图中,孔显示为虚线矩形(上下两条水平线)hole_top_z=part.height hole_bottom_z=0# 主视图中的孔投影front_hole_left=part.hole_x-part.hole_radius front_hole_right=part.hole_x+part.hole_radius# 添加隐藏线(虚线)msp.add_line(Vec2(front_hole_left,hole_bottom_z)+positions['front'],Vec2(front_hole_right,hole_bottom_z)+positions['front'],dxfattribs={'color':2,'linetype':'DASHED'}# 黄色虚线)msp.add_line(Vec2(front_hole_left,hole_top_z)+positions['front'],Vec2(front_hole_right,hole_top_z)+positions['front'],dxfattribs={'color':2,'linetype':'DASHED'})

5. 图纸格式设置

5.1 创建图框

defcreate_drawing_frame(msp,paper_size:str='A4')->Tuple[float,float]:""" 创建标准图框 返回:图框左下角和右上角坐标 """# 图纸尺寸(mm)paper_sizes={'A4':(210,297),'A3':(297,420),'A2':(420,594),'A1':(594,841),'A0':(841,1189)}ifpaper_sizenotinpaper_sizes:raiseValueError(f"不支持的图纸尺寸:{paper_size}")width,height=paper_sizes[paper_size]# 图框边界(距纸边10mm)margin=10left=margin bottom=margin right=width-margin top=height-margin# 绘制外框(粗实线)msp.add_lwpolyline([(left,bottom),(right,bottom),(right,top),(left,top),(left,bottom)],dxfattribs={'color':7,'lineweight':30})# 线宽0.3mm# 绘制内框(细实线)inner_margin=5msp.add_lwpolyline([(left+inner_margin,bottom+inner_margin),(right-inner_margin,bottom+inner_margin),(right-inner_margin,top-inner_margin),(left+inner_margin,top-inner_margin),(left+inner_margin,bottom+inner_margin)],dxfattribs={'color':7,'lineweight':10})return(left,bottom),(right,top)

5.2 创建标题栏

defcreate_title_block(msp,bottom_left:Tuple[float,float],width:float=180,height:float=56):""" 创建标准标题栏(符合GB/T 10609.1-2008) """x,y=bottom_left# 标题栏外框msp.add_lwpolyline([(x,y),(x+width,y),(x+width,y+height),(x,y+height),(x,y)],dxfattribs={'color':7,'lineweight':20})# 内部网格线# 第一行(从上到下)row1_y=y+height-8msp.add_line((x,row1_y),(x+width,row1_y),dxfattribs={'color':7})# 第二行row2_y=y+height-16msp.add_line((x,row2_y),(x+width,row2_y),dxfattribs={'color':7})# 第三行row3_y=y+height-24msp.add_line((x,row3_y),(x+width,row3_y),dxfattribs={'color':7})# 垂直分隔线msp.add_line((x+40,y),(x+40,y+height),dxfattribs={'color':7})msp.add_line((x+80,y),(x+80,y+height),dxfattribs={'color':7})msp.add_line((x+120,y),(x+120,y+height),dxfattribs={'color':7})# 添加标题栏文字text_style={'height':3.5,'color':7}# 第一行:图纸名称msp.add_text("零件图",dxfattribs=text_style).set_placement(Vec2(x+20,row1_y+2),align=TextEntityAlignment.CENTER)# 第二行:材料msp.add_text("材料: 45钢",dxfattribs=text_style).set_placement(Vec2(x+60,row2_y+2),align=TextEntityAlignment.CENTER)# 第三行:比例msp.add_text("比例: 1:1",dxfattribs=text_style).set_placement(Vec2(x+100,row3_y+2),align=TextEntityAlignment.CENTER)# 第四行:图号msp.add_text("图号: 001",dxfattribs=text_style).set_placement(Vec2(x+140,y+2),align=TextEntityAlignment.CENTER)

5.3 添加尺寸标注

defadd_dimensions(msp,part:SimplePart3D,positions:dict):""" 为三视图添加尺寸标注 """# 主视图尺寸标注front_base=positions['front']# 标注宽度(水平方向)msp.add_linear_dim(base=front_base+Vec2(0,-10),# 尺寸线位置p1=front_base+Vec2(0,0),# 第一延伸线起点p2=front_base+Vec2(part.width,0),# 第二延伸线起点dimtext=f"{part.width}",dxfattribs={'color':5}# 蓝色)# 标注高度(垂直方向)msp.add_linear_dim(base=front_base+Vec2(-10,0),p1=front_base+Vec2(0,0),p2=front_base+Vec2(0,part.height),dimtext=f"{part.height}",dxfattribs={'color':5})# 俯视图标注深度top_base=positions['top']msp.add_linear_dim(base=top_base+Vec2(0,-10),p1=top_base+Vec2(0,0),p2=top_base+Vec2(part.depth,0),dimtext=f"{part.depth}",dxfattribs={'color':5})

6. 完整工作流程示例

6.1 主程序

defmain():"""主程序:生成完整的工程图纸"""# 1. 创建DXF文档doc=ezdxf.new('R2010')msp=doc.modelspace()# 2. 创建零件模型part=SimplePart3D()# 3. 设置图纸格式(A4竖放)create_drawing_frame(msp,'A4')# 4. 创建标题栏(位于图纸右下角)frame_bottom_left,frame_top_right=create_drawing_frame(msp,'A4')title_block_width=180title_block_height=56title_x=frame_top_right[0]-

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询