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

news2024/11/26 0:54:16

一、前言

项目需要自动出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;
    //根据名字获取视图的Tag
    theUFSession.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.coloradmin.cn/o/154052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字图像处理(第四版)-冈萨雷斯-学习过程的笔记

作者介绍1.绪论自己读书存在一个问题&#xff0c;书太厚&#xff0c;重点难以把握&#xff0c;对如此经典的书籍&#xff0c;希望自己的学习历程和重点记录下来。 目前在持续更新和学习中&#xff0c;觉得有帮助的话可以先收藏和关注我博客的内容--更新于2023/1/102.数字图像基…

C语言进阶——自定义类型——结构体

目录 一. 结构体类型的声明 结构体的声明 特殊的声明 二. 结构的自引用 三. 结构体变量的定义和初始化 定义 初始化 四. 结构体内存对齐 未完待续 一. 结构体类型的声明 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以…

08-Alibaba微服务组件Nacos配置中心实战源码分析

Nacos配置中心源码分析 Config相关配置 Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串&#xff0c;公共命名空间&#xff08;public&#xff09;&#xff0c;分组默认是DEFAULT_GROUP 配置中心的架构 nacos config client源码分析 获取配置 获取配置的主要方…

windows配置java环境

windows配置java环境下载JDK安装JDK配置环境变量java9及以上版本配置环境变量&#xff08;以java17为例&#xff0c;只需要配置JAVA_HOME和Path变量&#xff09;配置JAVA_HOME变量配置Path变量java8及以下版本配置环境变量&#xff08;以java8为例&#xff0c;需要配置JAVA_HOM…

Unity官方本地化插件localization

官方文档地址&#xff1a;https://docs.unity3d.com/Packages/com.unity.localization1.0/manual/QuickStartGuideWithVariants.html 使用流程 安装 PackageManager搜索Localization完成对应插件的安装 配置 PlayerSetting->Localization 创建本地化相关配置 创建之后点…

python的安装以及pycharm的配置

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,html特效,vue2基础领域博主 哔哩哔哩欢迎关注&#xff1a;小淼前端 小淼前端的个人空间_哔哩哔哩_bilibili 本篇文章主要讲述python的安装以及pych…

【Linux】小程序进度条

目录回车换行问题日常中的换行代码中的回车换行倒计时函数进度条回车换行问题 日常中的换行 即&#xff1a; 回车&#xff1a;回到当前行的最开始 换行&#xff1a;列不变&#xff0c;新起一行 代码中的回车换行 我们先看一段代码&#xff1a; 这个是带\n的 &#x1f30d;结…

什么是运动神经元 你们真的知道吗

大家好&#xff0c;你们知道什么运动神经元吗&#xff0c;你们有误入这些误区吗&#xff1f; 运动神经元是一种神秘的疾病&#xff0c;导致的原因尚且不明确。这种疾病的发生可能是体内的运动神经元细胞的减少或是凋亡导致的&#xff0c;是一种慢性发展的神经类疾病。虽然导致运…

【晶振】NTP网络校时服务器(卫星时钟)电路里的主心跳

【晶振】NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路里的主心跳 【晶振】NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路里的主心跳 晶振是NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路板数字电路的&#xff02;心跳&#xff02;&#xff0c;在…

阿狸(Hans设计卡通形象)的幸福生活 ---- 充满趣味性(可自定义更改)

Ali the fox 目录 一、前言 二、关于代码 三、效果展示 四、详细介绍 五、编码实现 index.html css 文件夹 88rh.css js 文件夹 img 文件夹 fonts 文件夹 六、获取源码 需要源码&#xff0c;可以私信我(⊙o⊙)&#xff1f;关注我&#xff1f; 一、前言 时光荏苒&…

MyBatis­Plus快速入门

介绍 MyBatisPlus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性&#xff1a; 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xf…

冰冰学习笔记:异常处理

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

Github-Action-Workflow-概念和基本操作

workflow 文件 GitHub Actions 的配置文件叫做 workflow文件&#xff0c;存放在代码仓库的.github/workflows/目录下。比如写一个first.yaml文件&#xff0c;存储的目录就是.github/workflows/first.yaml workflow/下的文件采用 YAML 格式&#xff0c;文件名可以任意取&#xf…

代码随想录第56天|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583.两个字符串的删除操作 思路一 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 当word1[i - 1] 与 word2[j - 1]相同的时候 dp[i][j] dp[i - 1][j - 1];当word1[…

检修盒面板AI视觉检测系统,赋能工业发展!

制造业是中国工业化的源头&#xff0c;也是工业生产大国。任何一步的质量都可能影响生产过程的变化。表面缺陷不仅影响产品的美观和舒适性&#xff0c;还会对其性能产生不良影响。因此&#xff0c;制造商对产品的表面缺陷检测非常重视。传统的检修盒面板按钮安装是否正确的质量…

【深度学习】CNN应用于图像分类的建模全流程

文章目录1.摘要2.图片的准备及预处理3.打包并保存数据4.搭建模型5.训练模型6.测试模型7.总结1.摘要 图像分类&#xff0c;也可以称作图像识别&#xff0c;顾名思义&#xff0c;就是辨别图像中的物体属于什么类别。核心是从给定的分类集合中给图像分配一个标签的任务。实际上&a…

DBeaver连接InterSystems IRIS、Ensemble、Cache操作说明

一、驱动获取 1.1、本地安装目录获取 JDBC驱动&#xff1a;“安装目录\dev\java\lib\JDK18” 如需获取ODBC等其他连接驱动则返回“安装目录\dev”路径选择对应文件夹2.1、Intersystems官方获取 官方下载&#xff1a;https://intersystems-community.github.io/iris-driver-…

深度学习基本部件-激活函数详解

激活函数概述 前言激活函数定义激活函数性质 Sigmoid 型函数 Sigmoid 函数Tanh 函数 ReLU 函数及其变体 ReLU 函数Leaky ReLU/PReLU/ELU/Softplus 函数 Swish 函数激活函数总结参考资料 本文分析了激活函数对于神经网络的必要性&#xff0c;同时讲解了几种常见的激活函数的原理…

纸牌游戏红心大战拱猪设计(C语言)

纸牌游戏红心大战设计 ( C语言 ) 红心大战是Windows的经典游戏&#xff0c;中国式的红心是拱猪游戏&#xff0c;加入了方块J羊和梅花10 变压器&#xff08;即俗称加倍&#xff09;。加大了游戏难度和趣味性。 试制此游戏是准备编制网络版拱猪或红心大战的基础框架&#xff0c…

Linux下时间处理相关函数

Linux下时间处理相关函数 1 .系统时间和 RTC 时间 Linux 系统下包含两个时间&#xff1a; 系统时间和 RTC 时间。   系统时间&#xff1a; 是由主芯片的定时器进行维护的时间&#xff0c; 一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准&#xff0c; 以避…