Quantcast
Channel: NX Design Forum topics
Viewing all articles
Browse latest Browse all 5175

NX_Mass for subassemblies and assembly solution

$
0
0

Hello guys,

 

I spent a lot of time trying to get NX_Mass in assembly and also for subassemblies.

After doing a lot of research and combining multiple ideas from different forums and gtac samples i managed to write a NX command that will parse all the components of an assembly and set NX_Mass value equal to the one displayed in assembly navigator(weight kg).

This value can also be called in drafting title blocks using <WRef1*0@NX_Mass> .

I have tested it on NX managed but i think it also can work on native.

In case you guys have ideas to make it better, i'm open to suggestion.

Get your mass gentlemen.

You might get an error if you have multiple assemblies open in same time,but the command will still work.I am working on fixing that.

 

using System;
using NXOpen;
using NXOpen.UF;
using NXOpen.Utilities;


/*This code is wrote in C#.
Compile and add the new .dll as a command in NX.
The code was tested and implemented in NX 11.0
For questions or suggestions you can contact me at ionut.bilibou@adacomputers.ro
*/

public class NXJournal
{
static Session theSession = Session.GetSession();
static UFSession theUFSession = UFSession.GetUFSession();

static Part displayPart = theSession.Parts.Display;
static Part part = theSession.Parts.Work;


public static void Main(string[] args)
{


foreach (Part workPart in theSession.Parts.ToArray())
{
theSession.Parts.SetWork(workPart);

Body[] theBody = AskAllBodies(workPart);

Unit[] theUnits = {
workPart.UnitCollection.GetBase("Area"),
workPart.UnitCollection.GetBase("Volume"),
workPart.UnitCollection.GetBase("Mass"),
workPart.UnitCollection.GetBase("Length") };

MeasureBodies theMeasureBodies = workPart.MeasureManager.NewMassProperties(theUnits, 0.99, theBody);

NXOpen.Session.UndoMarkId markId1;
markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start");

NXOpen.NXObject[] objects1 = new NXOpen.NXObject[1];
objects1[0] = workPart;
NXOpen.AttributePropertiesBuilder attributePropertiesBuilder1;
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None);

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.DataType = NXOpen.AttributePropertiesBaseBuilder.DataTypeOptions.String;

attributePropertiesBuilder1.Units = "MilliMeter";

NXOpen.NXObject[] objects2 = new NXOpen.NXObject[1];
objects2[0] = workPart;
NXOpen.MassPropertiesBuilder massPropertiesBuilder1;
massPropertiesBuilder1 = workPart.PropertiesManager.CreateMassPropertiesBuilder(objects2);

NXOpen.SelectNXObjectList selectNXObjectList1;
selectNXObjectList1 = massPropertiesBuilder1.SelectedObjects;

NXOpen.NXObject[] objects3;
objects3 = selectNXObjectList1.GetArray();

massPropertiesBuilder1.LoadPartialComponents = true;

massPropertiesBuilder1.Accuracy = 0.98999999999999999;

NXOpen.NXObject[] objects4 = new NXOpen.NXObject[1];
objects4[0] = workPart;
NXOpen.PreviewPropertiesBuilder previewPropertiesBuilder1;
previewPropertiesBuilder1 = workPart.PropertiesManager.CreatePreviewPropertiesBuilder(objects4);

previewPropertiesBuilder1.StorePartPreview = true;

previewPropertiesBuilder1.StoreModelViewPreview = true;

previewPropertiesBuilder1.ModelViewCreation = NXOpen.PreviewPropertiesBuilder.ModelViewCreationOptions.OnViewSave;

attributePropertiesBuilder1.DataType = NXOpen.AttributePropertiesBaseBuilder.DataTypeOptions.Number;

attributePropertiesBuilder1.DateValue.FromDateItem.Year = "2017";

attributePropertiesBuilder1.DateValue.ToDateItem.Year = "2017";

NXOpen.NXObject[] objects5 = new NXOpen.NXObject[1];
objects5[0] = workPart;
attributePropertiesBuilder1.SetAttributeObjects(objects5);

attributePropertiesBuilder1.Units = "MilliMeter";

theSession.SetUndoMarkName(markId1, "Displayed Part Properties Dialog");

attributePropertiesBuilder1.DateValue.DateItem.Day = NXOpen.DateItemBuilder.DayOfMonth.Day18;

attributePropertiesBuilder1.DateValue.DateItem.Month = NXOpen.DateItemBuilder.MonthOfYear.Jan;

attributePropertiesBuilder1.DateValue.DateItem.Year = "2018";

attributePropertiesBuilder1.DateValue.DateItem.Time = "00:00:00";

massPropertiesBuilder1.UpdateOnSave = NXOpen.MassPropertiesBuilder.UpdateOptions.Yes;

attributePropertiesBuilder1.Title = "";

attributePropertiesBuilder1.Units = "MilliMeter";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.Units = "";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.StringValue = "";

attributePropertiesBuilder1.Units = "MilliMeter";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.Category = "Materials";

attributePropertiesBuilder1.Title = "NX_Mass";

attributePropertiesBuilder1.Units = "MilliMeter";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.Units = "Kilogram";

attributePropertiesBuilder1.Units = "Kilogram";

attributePropertiesBuilder1.NumberValue = 150000000000000.0;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.NumberValue = theMeasureBodies.Mass;

NXOpen.Session.UndoMarkId markId2;
markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Accept Edit");

attributePropertiesBuilder1.ValueAlias = "";

bool changed1;
changed1 = attributePropertiesBuilder1.CreateAttribute();

attributePropertiesBuilder1.Category = "";

attributePropertiesBuilder1.Title = "";

attributePropertiesBuilder1.Units = "Kilogram";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.Units = "";

attributePropertiesBuilder1.NumberValue = 0.0;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.StringValue = "";

attributePropertiesBuilder1.Units = "MilliMeter";

attributePropertiesBuilder1.IsArray = false;

attributePropertiesBuilder1.IsArray = false;

NXOpen.Session.UndoMarkId markId3;
markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Displayed Part Properties");

theSession.DeleteUndoMark(markId3, null);

NXOpen.Session.UndoMarkId markId4;
markId4 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Displayed Part Properties");

NXOpen.NXObject nXObject1;
nXObject1 = attributePropertiesBuilder1.Commit();

NXOpen.MassPropertiesBuilder.UpdateOptions updateoption1;
updateoption1 = massPropertiesBuilder1.UpdateOnSave;

NXOpen.NXObject nXObject2;
nXObject2 = massPropertiesBuilder1.Commit();

workPart.PartPreviewMode = NXOpen.BasePart.PartPreview.OnSave;

NXOpen.NXObject nXObject3;
nXObject3 = previewPropertiesBuilder1.Commit();

NXOpen.Session.UndoMarkId id1;
id1 = theSession.GetNewestUndoMark(NXOpen.Session.MarkVisibility.Visible);

int nErrs1;
nErrs1 = theSession.UpdateManager.DoUpdate(id1);

theSession.DeleteUndoMark(markId4, null);

theSession.SetUndoMarkName(markId1, "Displayed Part Properties");

attributePropertiesBuilder1.Destroy();

massPropertiesBuilder1.Destroy();

previewPropertiesBuilder1.Destroy();

theSession.DeleteUndoMark(id1, null);

}

theSession.Parts.SetWork(part);
}
static void DoIt()
{

}

static Body[] AskAllBodies(Part thePart)
{
System.Collections.ArrayList theBodies = new System.Collections.ArrayList();

Tag aBodyTag = Tag.Null;
do
{
theUFSession.Obj.CycleObjsInPart(thePart.Tag, UFConstants.UF_solid_type, ref aBodyTag);
if (aBodyTag == Tag.Null) break;

int theType, theSubtype;
theUFSession.Obj.AskTypeAndSubtype(aBodyTag, out theType, out theSubtype);
if (theSubtype == UFConstants.UF_solid_body_subtype)
theBodies.Add(NXObjectManager.Get(aBodyTag));

} while (true);

return ((Body[])theBodies.ToArray(typeof(Body)));
}

 

static void Echo(string output)
{
theSession.ListingWindow.Open();
theSession.ListingWindow.WriteLine(output);
theSession.LogFile.WriteLine(output);
}

static void reportPartLoadStatus(PartLoadStatus load_status)
{
if (load_status.NumberUnloadedParts == 0) return;

Echo(" Load notes:");

for (int ii = 0; ii < load_status.NumberUnloadedParts; ii++)
{
Echo(" " + load_status.GetPartName(ii) + " - "
+ load_status.GetStatusDescription(ii));
}
}

public static int GetUnloadOption(string arg)
{
return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
}
}


Viewing all articles
Browse latest Browse all 5175

Trending Articles