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

我们在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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值