UG/NX 二次开发(C#)自动出2D零件图思路

news/2025/2/7 11:01:55/

一、前言

项目需要自动出2D零件图,可是我之前没做过这方面的内容,没有一点思路。然后我就做了下面几件事:

1、百度、google翻了一遍,搜索关键字“UG二次开发自动出图”

2、csdn.com 和 cnblogs.com翻了一遍

3、平时逛的qq技术群,微信技术群问候了一遍

4、做二开之后结交的技术大牛、小达人请教了一遍

现在有了一点思路,整理出来,自己也写了一部分主要源码分享出来供大家欣赏。

二、思路整理

自动出图方案经过我一番辛苦整理后,需要完成以下几步:

1、出图方案设置

     出图方式千千万,每个人都有自己的想法,我们需要先定一个标准,然后程序才能按照标准自动出图,标准如下:

      1)图纸参数设置,包括图纸类型,视图比例,图纸名称

      2)视图布局方案,根据用户需求对视图进行布局,视图包括:顶视图、左视图、右视图、后视图、底视图、正三轴视图、右剖视图、底剖视图。

      3)标注方案,目前我想到的先从简单的平面尺寸开始,先做水平、垂直、角度的标注

2、自动创建图纸、自动创建视图

3、自动标注

三、已完成部分源码分享

1、创建图纸

/// <summary>
/// 创建图纸
/// </summary>
/// <param name="workPart"></param>
/// <returns></returns>
public static Tag CreatDWG(Part workPart,string sheetName)
{NXOpen.Drawings.DrawingSheet nullDrawings_DrawingSheet = null;NXOpen.Drawings.DrawingSheetBuilder drawingSheetBuilder1;drawingSheetBuilder1 = workPart.DrawingSheets.DrawingSheetBuilder(nullDrawings_DrawingSheet);drawingSheetBuilder1.StandardMetricScale = NXOpen.Drawings.DrawingSheetBuilder.SheetStandardMetricScale.S11;drawingSheetBuilder1.EnglishSheetTemplateLocation = "";drawingSheetBuilder1.Height = 297.0;drawingSheetBuilder1.Length = 420.0;drawingSheetBuilder1.StandardMetricScale = NXOpen.Drawings.DrawingSheetBuilder.SheetStandardMetricScale.S11;drawingSheetBuilder1.StandardEnglishScale = NXOpen.Drawings.DrawingSheetBuilder.SheetStandardEnglishScale.S11;drawingSheetBuilder1.ScaleNumerator = 1.0;drawingSheetBuilder1.ScaleDenominator = 1.0;drawingSheetBuilder1.Units = NXOpen.Drawings.DrawingSheetBuilder.SheetUnits.Metric;drawingSheetBuilder1.ProjectionAngle = NXOpen.Drawings.DrawingSheetBuilder.SheetProjectionAngle.First;drawingSheetBuilder1.Number = "1";drawingSheetBuilder1.SecondaryNumber = "";drawingSheetBuilder1.Revision = "A";drawingSheetBuilder1.Name = sheetName;drawingSheetBuilder1.MetricSheetTemplateLocation = "D:\\Program Files\\Siemens\\NX 8.0\\localization\\prc\\simpl_chinese\\startup\\A3-noviews-template.prt";NXObject nXObject1;nXObject1 = drawingSheetBuilder1.Commit();drawingSheetBuilder1.Destroy();return nXObject1.Tag;
}

这里只是一个粗略的创建图纸,参数还没抽取出来,因为调用的是系统模板,后面应该会根据模板类型分别调用,也可以用自定义模板来创建图纸。

2、创建视图

/// <summary>
/// 创建基本视图(ufun)
/// </summary>
/// <param name="drawTag"></param>
public static void CreateView(Tag drawTag, string viewName, Point3d point,out Tag viewTag, out Tag drawViewTag)
{Session theSession = Session.GetSession();Part workPart = theSession.Parts.Work;Part displayPart = theSession.Parts.Display;theUFSession = UFSession.GetUFSession();viewTag = Tag.Null;//根据名字获取视图的TagtheUFSession.Obj.CycleByNameAndType(workPart.Tag, viewName, UFConstants.UF_view_type, false, ref viewTag);double[] dwg_point = new double[2] { point.X, point.Y };UFDraw.ViewInfo viewInfo = new UFDraw.ViewInfo();theUFSession.Draw.InitializeViewInfo(out viewInfo);drawViewTag = Tag.Null;//初始化视图信息theUFSession.Draw.ImportView(drawTag, viewTag, dwg_point, ref viewInfo, out drawViewTag);theUFSession.Draw.UpdateOneView(drawTag, drawViewTag);//更新视图
}

 这里通过ufun方法创建视图,可以完成根据viewName创建各种视图,包括顶视图、左视图、右视图、后视图、底视图、正三轴视图、右剖视图、底剖视图。

目前这个方法能基本符合需求,难点在于视图的位置point怎么确定下来? 

3、创建垂直标注尺寸 

//ufun创建垂直尺寸
UFDrf.Object object1 = new UFDrf.Object();
UFDrf.Object object2 = new UFDrf.Object();
object1.object_view_tag = topDrawViewTag;
object1.object_assoc_type = UFDrf.AssocType.EndPoint;
object1.object_assoc_modifier = UFConstants.UF_DRF_last_end_point;
object1.object_tag = edgeStart;
object2.object_view_tag = topDrawViewTag;
object2.object_assoc_type = UFDrf.AssocType.EndPoint;
object2.object_assoc_modifier = UFConstants.UF_DRF_first_end_point;
object2.object_tag = edgeEnd;UFDrf.Text drf_text = new UFDrf.Text();
drf_text.user_dim_text = "";
drf_text.lines_app_text = 0;
drf_text.appended_text = "";
double[] dimension_3d_origin = new double[3] { 50, 200, 0 };
Tag dimTag1 = Tag.Null;
theUFSession.Drf.CreateVerticalDim(ref object1, ref object2, ref drf_text, dimension_3d_origin, out dimTag1);

使用了ufun函数theUFSession.Drf.CreateVerticalDim来创建垂直尺寸,能实现标注的创建,但是问题还有很多:

1、各种视图分别需要哪些标注

2、如何创建需要的标注

3、标准的摆放位置的确定也是一个难点 

4、调用主方法

public static int Main(string[] args)
{theSession = Session.GetSession();theUFSession = UFSession.GetUFSession();displayPart = theSession.Parts.Display;workPart = theSession.Parts.Work;theUI = UI.GetUI();int retValue = 0;try{#region 创建标注Body rightBody = null;BodyTool.GetRightBody(theSession, out rightBody);Auto_Init.BodyInit init = new Auto_Init.BodyInit(rightBody);BodyModel model = init.ProcBody();int moduleid;theUFSession.UF.AskApplicationModule(out moduleid);if (moduleid != UFConstants.UF_APP_DRAFTING){theUI.MenuBarManager.ApplicationSwitchRequest("UG_APP_DRAFTING");}//新建图纸Tag topViewTag, leftViewTag, tfrViewTag;Tag topDrawViewTag, leftDrawViewTag, tfrDrawViewTag;Tag dragTag = DrawTool.CreatDWG(workPart, "Sheet1");Point3d point1 = new Point3d(120, 200, 0.0);DrawTool.CreateView(dragTag, "TOP", point1, out topViewTag, out topDrawViewTag);Point3d point2 = new Point3d(120, 80, 0.0);DrawTool.CreateView(dragTag, "LEFT", point2, out leftViewTag, out leftDrawViewTag);Point3d point3 = new Point3d(300, 180, 0.0);DrawTool.CreateView(dragTag, "TFR-ISO", point3, out tfrViewTag, out tfrDrawViewTag);Tag edgeStart = Tag.Null;Tag edgeEnd = Tag.Null;theUFSession.Obj.CycleByName("EDGESTART1", ref edgeStart);theUFSession.Obj.CycleByName("EDGEEND1", ref edgeEnd);//ufun创建垂直尺寸UFDrf.Object object1 = new UFDrf.Object();UFDrf.Object object2 = new UFDrf.Object();object1.object_view_tag = topDrawViewTag;object1.object_assoc_type = UFDrf.AssocType.EndPoint;object1.object_assoc_modifier = UFConstants.UF_DRF_last_end_point;object1.object_tag = edgeStart;object2.object_view_tag = topDrawViewTag;object2.object_assoc_type = UFDrf.AssocType.EndPoint;object2.object_assoc_modifier = UFConstants.UF_DRF_first_end_point;object2.object_tag = edgeEnd;UFDrf.Text drf_text = new UFDrf.Text();drf_text.user_dim_text = "";drf_text.lines_app_text = 0;drf_text.appended_text = "";double[] dimension_3d_origin = new double[3] { 50, 200, 0 };Tag dimTag1 = Tag.Null;theUFSession.Drf.CreateVerticalDim(ref object1, ref object2, ref drf_text, dimension_3d_origin, out dimTag1);#endregion           }catch (NXOpen.NXException ex){}return retValue;
}

 

四、总结

        以上只是一个不完整的思路和实现方案,希望有懂的大佬给一些建议,后续我会继续完善这一块内容并无偿分享给大家。

附一张当前完成度的效果图:

 


http://www.ppmy.cn/news/826050.html

相关文章

MATLAB如何输出图形到CAD或者UG,ug里面怎么导出cad图形

我们知道在ug中经常用到cad图形&#xff0c;其实ug也可以导出cad图形。但是很多同学还不太清楚。那么接下来下面是学习啦小编整理的一些关于ug里面导出cad图形&#xff0c;供您参阅。 ug里面导出cad图形的方法 1.双击或者右键选择打开UG软件&#xff0c;该经验以UG10.0为例。打…

ug里怎么导出x_t文件

在UG软件中导出X-T文件格式前&#xff0c;应当先打开一个三维模型&#xff0c;其操作步骤如下&#xff1a; 1、先打开一个三维零件&#xff1b;&#xff08;如图我使用是UG10.0版本&#xff0c;其它版本也是如此操作&#xff09; 2、执行文件&#xff0d;导出&#xff0d;para…

UG中批量导出点坐标等信息

1、打开3d&#xff1b;过滤器筛选点&#xff1b;鼠标框选你要导出的点&#xff1b;再被选中点上右键点属性&#xff0c;会出现弹窗2、弹窗选择-常规-信息图标3、然后就会显示这些点的相关信息&#xff0c;点击另存为TXT 3、然后用excel打开导出的txt文档进行分列、筛选你想要的…

ug导出html,UG如何将工程图导出到CAD中?

回答&#xff1a; 1、使用PowerDesigner打开或创建一个pdm模型文件&#xff0c;如果没有该软件请先下载并安装该软件。 2、点击菜单报告->report wizard&#xff0c;弹出报告创建向导窗口。 3、输入报告名字&#xff0c;例如&#xff1a;输入report2&#xff0c;然后选择语言…

UG导入导出

UG导入、导出 UG导入、导出DXF导出导入导入导出STL导入导出IGS/STP UG导入、导出DXF 导出 首先选择 文件-启动-制图 进入制图模式&#xff0c; 文件-导出-AutoCAD&#xff0c;其他设置项根据实际需要配置 导入 文件-启动-建模 切换到建模模式&#xff0c;文件-导入-AutoCA…

UG10.0如何导出CAD图

一、导出CAD三维图 这个比较简单,可以找到文件==>导出==>AutoCAD: 设置一下输出DWG文件的路径。如图蓝色部分: 一直下一步或者是直接点击完成就可了。 二、但是很多时候我们需要的不是三维图,而是平面图 一般我们是在 建模 模式下做的三维图,所以首先要将模式转换…

UG导出CAD图纸的方法

参考这篇文章 ug导出cad图纸步骤 友情提示 1.第8步按照文章写的选择导出自显示部件&#xff0c;导出选择2D。 2.以及导出数据选择图纸&#xff0c;并且导出的是当前图纸。 我按这样的步骤成功导出了&#xff01;希望能帮到大家&#xff01;

CAD二维图导入UG草图

查看这篇文章 CAD二维图导入UG草图的方法 如果导入不成功提示有报错&#xff0c;可能是导出的dwg版本和UG不匹配&#xff0c;导出低版本&#xff08;如2007版就可以了&#xff09;