UG二次开发装配篇 添加/拖动/删除组件方法的实现

news2024/11/27 12:56:20

我们在UG装配的过程中,经常会遇到需要调整组件目录位置,在软件设计过程中可以通过在目录树里面拖动组件来完成。

那么,如果要用程序实现组件的移动/拖动,我们要怎么做呢?

本节就完成了添加/拖动/删除组件方法的实现,先看效果图:

根节点test下,有SHCS_01、SHCS_02、SHCS_03、SHCS_04这四个组件。

下面分别给出了添加组件、移动组件和删除组件的方法。

一、添加组件

1、实现方法

/// <summary>
/// 添加组件
/// </summary>
/// <param name="templatePrt">模板路径</param>
/// <param name="basePoint">中心点坐标位置</param>
/// <param name="orientation">矢量方向</param>
/// <param name="expModel">表达式集</param>
public static void AddComponent(string templatePrt, Point3d basePoint, Matrix3x3 orientation, ExpressionModel expModel)
{
    theUFSession = UFSession.GetUFSession();
    theSession = Session.GetSession();
    displayPart = theSession.Parts.Display;
    workPart = theSession.Parts.Work;
    componentNameList = new List<string>();
    BasePart basePart1;
    PartLoadStatus partLoadStatus1;

step1:
    string fileName = "";
    string newfile = GetNewFile(templatePrt, out fileName); //先拷贝一个备份
    try
    {
        basePart1 = theSession.Parts.OpenBase(newfile, out partLoadStatus1);
    }
    catch (Exception)
    {
        componentNameList.Add(fileName);
        goto step1;
    }
    partLoadStatus1.Dispose();

    #region 修正表达式
    ExpressionCollection expressionCollection = basePart1.Expressions;
    EventHelper.UpdateExpression(expressionCollection, expModel);
    #endregion

    #region 添加属性
    basePart1.SetAttribute("模具编号", "", Update.Option.Now);
    basePart1.SetAttribute("材料标准", "", Update.Option.Now);
    basePart1.SetAttribute("塑胶材料", "", Update.Option.Now);
    basePart1.SetAttribute("缩水率", "", Update.Option.Now);
    basePart1.SetAttribute("穴数", "", Update.Option.Now);
    basePart1.SetAttribute("客户", "", Update.Option.Now);
    basePart1.SetAttribute("项目编号", "", Update.Option.Now);
    basePart1.SetAttribute("产品名称", "", Update.Option.Now);
    basePart1.SetAttribute("产品编号", "", Update.Option.Now);
    basePart1.SetAttribute("设计", "", Update.Option.Now);
    #endregion

    PartLoadStatus partLoadStatus3;
    NXOpen.Assemblies.Component component1;
    component1 = workPart.ComponentAssembly.AddComponent(newfile, "model", fileName, basePoint, orientation, -1, out partLoadStatus3, true);
}

public static string GetNewFile(string fullFileName, out string fileName)
{
    fileName = "";
    string newFullFileName = "";
    displayPart = theSession.Parts.Display;
    FileInfo file = new FileInfo(fullFileName);

    List<Component> allComponents = new List<Component>();
    List<ComponentModel> componentList = new List<ComponentModel>();
    Component root = displayPart.ComponentAssembly.RootComponent;
    if (root != null)
    {
        GetAllComponents(displayPart.ComponentAssembly.RootComponent, allComponents, componentList);
    }
    foreach (ComponentModel model in componentList)
    {
        if (!componentNameList.Contains(model.instanceName))
        {
            componentNameList.Add(model.instanceName.ToLower());
        }
    }

    for (int i = 1; i < 100; i++)
    {
        newFullFileName = AppDomain.CurrentDomain.BaseDirectory.ToString() + "temp\\" + GetCompantName(fullFileName) + "_0" + i.ToString() + ".prt";
        fileName = GetCompantName(fullFileName) + "_0" + i.ToString();
        FileInfo fi = new FileInfo(newFullFileName);
        if (!fi.Exists)
        {
            file.CopyTo(newFullFileName);
        }
        if (componentNameList.Contains(fileName.ToLower()))
        {
            continue;
        }
        else
        {
            break;
        }
    }
    return newFullFileName;
}

/// <summary>
/// 修正表达式,自动完全匹配
/// </summary>
/// <param name="expCol"></param>
/// <param name="expModel"></param>
public static void UpdateExpression(ExpressionCollection expCol, ExpressionModel expModel)
{
    Expression[] expressions = expCol.ToArray();
    foreach (var ex in expressions)
    {
        foreach (PropertyInfo pi in expModel.GetType().GetProperties())
        {
            double value = 0.0;
            var name = pi.Name;
            string strVal = pi.GetValue(expModel, null).ToString();
            if (!string.IsNullOrEmpty(strVal))
            {
                value = double.Parse(strVal);
            }

            if (ex.Name == name)
            {
                ex.Value = value == 0.0 ? ex.Value : value;
            }
        }
    }
}

添加组件,主要使用了workPart.ComponentAssembly.AddComponent方法来实现,需要注意的是:

1、为了实现零件的重复添加,需要在添加组件的方法里做特殊处理,复制多个模板临时文件并实现文件名的递增命名

2、修正表达式是添加组件的一个重要方法,可以通过表达式的修正实现标准件的配置化

3、添加属性,是为了方便组件管理,为后期出图做铺垫 

二、移动/拖动组件

1、实现方法

/// <summary>
/// 移动组件
/// </summary>
/// <param name="origName">待移动组件名</param>
/// <param name="newParentName">父组件名</param>
public static void MoveCompant(string origName, string newParentName)
{
    Session theSession = Session.GetSession();
    Part workPart = theSession.Parts.Work;
    Component origComponent = GetComponentByDisplayName(origName);
    Component newParentComponent = GetComponentByDisplayName(newParentName);
    Part part1 = (Part)theSession.Parts.FindObject(newParentComponent.DisplayName);
    NXOpen.Assemblies.Component[] origComponents1 = new NXOpen.Assemblies.Component[1];
    NXOpen.Assemblies.Component component1 = origComponent;
    origComponents1[0] = component1;
    NXOpen.Assemblies.Component component2 = newParentComponent;
    NXOpen.Assemblies.Component[] newComponents1;
    ErrorList errorList1;
    part1.ComponentAssembly.RestructureComponents(origComponents1, component2, true, out newComponents1, out errorList1);
    errorList1.Dispose();
}

public static Component GetComponentByDisplayName(string displayName)
{
    List<Component> compList = new List<Component>();
    List<Body> bodyList = new List<Body>();
    GetBodyListFromComponet(ref compList, ref bodyList);
    foreach (Component comp in compList)
    {
        if (comp.DisplayName == displayName)
            return comp;
    }
    return null;
}

/// <summary>
/// 通过ufun获取组件里的部件信息
/// </summary>
public static void GetBodyListFromComponet(ref List<Component> compList, ref List<Body> bodyList)
{
    theSession = Session.GetSession();
    theUFSession = UFSession.GetUFSession();
    workPart = theSession.Parts.Work;
    compList = new List<Component>();
    bodyList = new List<Body>();
    GetComponentList(workPart, compList);
    ComponentAssembly compAssembly = workPart.ComponentAssembly;
    Component rootComponent = compAssembly.RootComponent;
    foreach (Component c in compList)
    {
        SetWorkPart(c);
        workPart = theSession.Parts.Work;
        Tag objTag = Tag.Null;
        theUFSession.Obj.CycleObjsInPart(workPart.Tag, UFConstants.UF_solid_type, ref objTag);
        while (objTag != Tag.Null)
        {
            int type, subtype;
            theUFSession.Obj.AskTypeAndSubtype(objTag, out type, out subtype);
            if (type == 70 && subtype == 0)
            {
                Body b = (Body)NXOpen.Utilities.NXObjectManager.Get(objTag);
                bodyList.Add(b);
            }
            theUFSession.Obj.CycleObjsInPart(workPart.Tag, UFConstants.UF_solid_type, ref objTag);
        }
    }
    SetWorkPart(rootComponent);
}

通过NXopen的方法part1.ComponentAssembly.RestructureComponents来实现组件移动拖动:

想要移动组件,先要弄清楚移动哪个组件到哪个位置,所以移动组件的在于待移动组件和移动到的父组件的识别

由于装配是一个临时的过程,所以在组件处理的时候我们不能像处理部件那样,组件的每次操作都会引起组件tag的变化。

所以这里,我们移动组件的参数用的是:待移动组件名和父组件名。

通过封装方法GetComponentByDisplayName,我们可以识别到需要的组件。

三、删除组件

 1、实现方法

/// <summary>
/// 删除组件
/// </summary>
/// <param name="displayName">待删除组件名称</param>
public static void RemoveComponent(string displayName)
{
    Session theSession = Session.GetSession();
    Component component = GetComponentByDisplayName(displayName);
    NXOpen.Session.UndoMarkId markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Delete");;
    NXObject[] objects1 = new NXObject[1];
    objects1[0] = component;
    theSession.UpdateManager.AddToDeleteList(objects1);
    bool notifyOnDelete2 = theSession.Preferences.Modeling.NotifyOnDelete;
    int nErrs2 = theSession.UpdateManager.DoUpdate(markId2);
}

删除组件比较简单,是通过NXopen的theSession.UpdateManager对象来实现的,具体操作分一下几步:

1、theSession 的初始化:Session theSession = Session.GetSession()

2、添加删除列表:theSession.UpdateManager.AddToDeleteList(objects1)

3、提交删除:theSession.UpdateManager.DoUpdate(markId2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345424.html

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

相关文章

ZooKeeper集群搭建步骤

一、准备虚拟机准备三台虚拟机&#xff0c;对应ip地址和主机名如下&#xff1a;ip地址Hostname192.168.153.150ant163192.168.153.151ant164192.168.153.152ant165修改hostname&#xff0c;并使之生效[rootlocalhost /]# hostnamectl set-hostname zookeeper1 //修改hostname …

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

近年来&#xff0c;市面上一直流行各种h5游戏&#xff0c;例如投票、答题、刮刮乐、大转盘等等等等&#xff0c;而且我在各种营销场景下经常看到它们的身影&#xff0c;是做促销&#xff0c;引流和宣传的神器之一&#xff01;那么&#xff0c;怎么做好玩的h5游戏&#xff1f;还…

网络安全-Nmap

网络安全-Nmap Nmap-号称诸神之眼 这个呢就是用来扫描网络端口的 Namp的工作原理很像一个雷达 做任何攻击之前&#xff0c;得先知道怎么去找破绽&#xff0c;而不是钢铁洪流&#xff0c;那个是不叫渗透了&#xff0c;叫硬钢。 咋用呢&#xff1f; 很简单 直接 nmap 后面跟网址…

Linux内核转储---kdump原理梳理

文章目录Kexec和Kdump设计的区别kexeckdumpKdump的执行流程kexec的实现用户空间kexec内核空间vmcoreKdump的实现可以分为两部分&#xff1a;内核和用户工具。内核提供机制&#xff0c;用户工具在这些机制上实现各种转储策略&#xff0c;内核机制对用户工具的接口是一个系统调用…

华为HCIE学习之Openstack Nova组件

文章目录一、openstack组成形式二、Nova的模块1、Nova-api功能2、Nova-scheduler功能3、Nova-conductor功能4、Nova-novncproxy5、Nova-compute三、nova中的一些概念 一、openstack组成形式 openstack由一个个组件组成&#xff0c;每个组件由一个个模块组成。 二、Nova的模块…

mac上安装redis的两种方法

mac上安装redis的两种方法1. 安装方式1->使用homebrew安装redis1.1 安装redis1.1.1 安装homebrew1.1.2 查看redis安装目录1.2 安装等简单命令1.3 启动等相关命令1.3.1 使用brew命令启动1.3.2 redis-cli连接redis服务1.3.3 使用配置文件启动1.42. 安装方式2->官网下载安装…

Spring Cloud之Zuul

目录 简介 Zuul中的过滤器 过滤器的执行流程 使用过滤器 route过滤器的默认三种配置 路由到服务 路由到url地址 转发给自己 自定义过滤器 简介 Zuul是Netflix开源的微服务网关&#xff0c;主要功能是路由转发和过滤器&#xff0c;其原理也是一系列filters&#xff0…

图文解说S参数(进阶篇)

S参数是RF工程师/SI工程师必须掌握的内容&#xff0c;业界已有多位大师写过关于S参数的文章&#xff0c;即便如此&#xff0c;在相关领域打滚多年的人&#xff0c; 可能还是会被一些问题困扰着。你懂S参数吗? 图文解说S参数&#xff08;基础篇&#xff09; 请继续往下看...台湾…

数据结构(三):集合、字典、哈希表

数据结构&#xff08;三&#xff09;一、集合&#xff08;Set&#xff09;1.封装一个集合类2.集合常见的操作&#xff08;1&#xff09;并集&#xff08;2&#xff09;交集&#xff08;3&#xff09;差集&#xff08;4&#xff09;子集二、字典&#xff08;Map&#xff09;三、…

Powershell Install SQL Server 2022

前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…

nginx如何用html显示多个图片并加入播放链接

需求背景通过nginx来做个点播服务&#xff0c;ffmpeg截取视频中的某一帧作为视频的封面&#xff0c;前端页面展示这个封面&#xff0c;&#xff0c;并链接到对应的视频播放链接&#xff0c;加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…

HashedWheelTimer

序言这种算法是一种轮询算法的优化升级,能够以只有一个Timer的情况下处理大量的定时任务.Begin结合HashedWheelTimer的思想根据自然时间1分钟为例,来做大批量的定时任务触发首先定一个长度为60的数组,数组中存放的是Set集合,集合里面是任务详情.当有定时任务刚来的时候判断是否…

死锁检测组件 -- 使用hook检测死锁

目录 hook hook是什么 dlsym()函数 hook的实现步骤 加入hook的demo C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 hook hook可以把系统或第三方库提供的函数&#xff0c;替换成我们写的同名函数。会调用我们实现的函数。 hook是什么 hook提供了两…

07-Java异常分类以及处理机制

1.异常概念 Java标准库内建了一些通用的异常&#xff0c;这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。 1.错误&#xff1a;是程序无法处理的错误&#xff0c;表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关&#xff0c;而表示…

企业电子招采系统源码——信息数智化招采系统

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…

Centos7.9安装GitLab

1、下载 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载最新版本gitlab-ce-15.4.2-ce.0.el7.x86_64 2、安装基础依赖并启动 #安装依赖 yum install -y curl policycoreutils-python openssh-server postfix #配置开机启动 sys…

APP测试面试题汇总基础+进阶

目录 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f; 2、APP测试需要提前准备哪些测试资源&#xff1f; 3、APP测试和Web测试的区别&#xff1f; 1.系统结构方面 2.性能方面 3.兼容性方面 4、相对于 Wed 项目&#xff0c;APP有专项测试 5、Android手机和…

七种方式实现高并发秒杀

新建skill模块 pom依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId>…

@Intercepts为基础实现数据完整性保护

本文以Intercepts为基础&#xff0c;通过拦截器的方式拦截数据库操作包括query、insert、update、delete操作对数据的完整性保护。Intercepts是mybatis中的一个常用拦截器注解&#xff0c;表明当前对象是一个拦截器&#xff0c;当前类通过implements Interceptor实现Intercepto…

cuda性能分析工具

NVIDIA nvprof / nvvpNSight系列Nsight Systems本地使用远程使用结果分析Nsight Compute本地使用远程使用结果分析NVIDIA nvprof / nvvp 由2008年起开始支持的性能分析器&#xff0c;交互性好&#xff0c;利于使用记录运行日志时使用命令nvprof可视化显示日志时使用命令nvvp&a…