journal runnig in assembly
journal runnig in assembly
(OP)
Could someone please help modify this journal to run in an assembly.
I've got hundreds of files to run it on, and it'd be much better if the journal could run from the top level assembly, looking for all files with this expression, and adding the linked attribute accordingly.
This is so I can export to a spreadsheet the assembly navigator info with the sheet metal thickness in there too.
Any help much appreciated......
' NX 8.0.3.4
' Journal created by paulhorton on Fri Jan 29 10:28:58 2016 E. Australia Standard Time
'
Option Strict Off
Imports System
Imports NXOpen
Module NXJournal
Sub Main
Dim theSession As Session = Session.GetSession()
Dim workPart As Part = theSession.Parts.Work
Dim displayPart As Part = theSession.Parts.Display
' ----------------------------------------------
' Menu: File->Properties
' ----------------------------------------------
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Start")
Dim objects1(0) As NXObject
objects1(0) = workPart
Dim attributePropertiesBuilder1 As AttributePropertiesBuilder
attributePropertiesBuilder1 = workPart.PropertiesManager.CreateAttributePropertiesBuilder(objects1)
attributePropertiesBuilder1.ObjectPicker = AttributePropertiesBaseBuilder.ObjectOptions.Object
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.String
attributePropertiesBuilder1.Units = "MilliMeter"
Dim objects2(0) As NXObject
objects2(0) = workPart
Dim massPropertiesBuilder1 As MassPropertiesBuilder
massPropertiesBuilder1 = workPart.PropertiesManager.CreateMassPropertiesBuilder(objects2)
Dim selectNXObjectList1 As SelectNXObjectList
selectNXObjectList1 = massPropertiesBuilder1.SelectedObjects
Dim objects3() As NXObject
objects3 = selectNXObjectList1.GetArray()
massPropertiesBuilder1.UpdateOnSave = MassPropertiesBuilder.UpdateOptions.Yes
massPropertiesBuilder1.LoadPartialComponents = True
massPropertiesBuilder1.Accuracy = 0.99
Dim objects4(0) As NXObject
objects4(0) = workPart
Dim previewPropertiesBuilder1 As PreviewPropertiesBuilder
previewPropertiesBuilder1 = workPart.PropertiesManager.CreatePreviewPropertiesBuilder(objects4)
theSession.SetUndoMarkName(markId1, "Displayed Part Properties Dialog")
attributePropertiesBuilder1.DateValue.DateItem.Day = DateItemBuilder.DayOfMonth.Day29
attributePropertiesBuilder1.DateValue.DateItem.Month = DateItemBuilder.MonthOfYear.Jan
attributePropertiesBuilder1.DateValue.DateItem.Year = "2016"
attributePropertiesBuilder1.DateValue.DateItem.Time = "00:00:00"
attributePropertiesBuilder1.Units = "MilliMeter"
previewPropertiesBuilder1.StorePartPreview = True
previewPropertiesBuilder1.StoreModelViewPreview = True
previewPropertiesBuilder1.ModelViewCreation = PreviewPropertiesBuilder.ModelViewCreationOptions.OnViewSave
attributePropertiesBuilder1.Category = "Materials"
attributePropertiesBuilder1.Title = "thickness"
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.Number
attributePropertiesBuilder1.Units = "MilliMeter"
' ----------------------------------------------
' Dialog Begin Expressions
' ----------------------------------------------
attributePropertiesBuilder1.Units = "MilliMeter"
attributePropertiesBuilder1.Units = "MilliMeter"
attributePropertiesBuilder1.NumberValue = 4.0
attributePropertiesBuilder1.IsReferenceType = False
Dim expression1 As Expression = CType(workPart.Expressions.FindObject("Sheet_Metal_Material_Thickness"), Expression)
attributePropertiesBuilder1.Expression = expression1
Dim markId2 As Session.UndoMarkId
markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Displayed Part Properties")
Dim nXObject1 As NXObject
nXObject1 = attributePropertiesBuilder1.Commit()
Dim updateoption1 As MassPropertiesBuilder.UpdateOptions
updateoption1 = massPropertiesBuilder1.UpdateOnSave
Dim nXObject2 As NXObject
nXObject2 = massPropertiesBuilder1.Commit()
workPart.PartPreviewMode = BasePart.PartPreview.OnSave
Dim nXObject3 As NXObject
nXObject3 = previewPropertiesBuilder1.Commit()
theSession.DeleteUndoMark(markId2, Nothing)
theSession.SetUndoMarkName(markId1, "Displayed Part Properties")
attributePropertiesBuilder1.Destroy()
massPropertiesBuilder1.Destroy()
previewPropertiesBuilder1.Destroy()
' ----------------------------------------------
' Menu: Tools->Journal->Stop Recording
' ----------------------------------------------
End Sub
End Module
I've got hundreds of files to run it on, and it'd be much better if the journal could run from the top level assembly, looking for all files with this expression, and adding the linked attribute accordingly.
This is so I can export to a spreadsheet the assembly navigator info with the sheet metal thickness in there too.
Any help much appreciated......
' NX 8.0.3.4
' Journal created by paulhorton on Fri Jan 29 10:28:58 2016 E. Australia Standard Time
'
Option Strict Off
Imports System
Imports NXOpen
Module NXJournal
Sub Main
Dim theSession As Session = Session.GetSession()
Dim workPart As Part = theSession.Parts.Work
Dim displayPart As Part = theSession.Parts.Display
' ----------------------------------------------
' Menu: File->Properties
' ----------------------------------------------
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Start")
Dim objects1(0) As NXObject
objects1(0) = workPart
Dim attributePropertiesBuilder1 As AttributePropertiesBuilder
attributePropertiesBuilder1 = workPart.PropertiesManager.CreateAttributePropertiesBuilder(objects1)
attributePropertiesBuilder1.ObjectPicker = AttributePropertiesBaseBuilder.ObjectOptions.Object
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.String
attributePropertiesBuilder1.Units = "MilliMeter"
Dim objects2(0) As NXObject
objects2(0) = workPart
Dim massPropertiesBuilder1 As MassPropertiesBuilder
massPropertiesBuilder1 = workPart.PropertiesManager.CreateMassPropertiesBuilder(objects2)
Dim selectNXObjectList1 As SelectNXObjectList
selectNXObjectList1 = massPropertiesBuilder1.SelectedObjects
Dim objects3() As NXObject
objects3 = selectNXObjectList1.GetArray()
massPropertiesBuilder1.UpdateOnSave = MassPropertiesBuilder.UpdateOptions.Yes
massPropertiesBuilder1.LoadPartialComponents = True
massPropertiesBuilder1.Accuracy = 0.99
Dim objects4(0) As NXObject
objects4(0) = workPart
Dim previewPropertiesBuilder1 As PreviewPropertiesBuilder
previewPropertiesBuilder1 = workPart.PropertiesManager.CreatePreviewPropertiesBuilder(objects4)
theSession.SetUndoMarkName(markId1, "Displayed Part Properties Dialog")
attributePropertiesBuilder1.DateValue.DateItem.Day = DateItemBuilder.DayOfMonth.Day29
attributePropertiesBuilder1.DateValue.DateItem.Month = DateItemBuilder.MonthOfYear.Jan
attributePropertiesBuilder1.DateValue.DateItem.Year = "2016"
attributePropertiesBuilder1.DateValue.DateItem.Time = "00:00:00"
attributePropertiesBuilder1.Units = "MilliMeter"
previewPropertiesBuilder1.StorePartPreview = True
previewPropertiesBuilder1.StoreModelViewPreview = True
previewPropertiesBuilder1.ModelViewCreation = PreviewPropertiesBuilder.ModelViewCreationOptions.OnViewSave
attributePropertiesBuilder1.Category = "Materials"
attributePropertiesBuilder1.Title = "thickness"
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.Number
attributePropertiesBuilder1.Units = "MilliMeter"
' ----------------------------------------------
' Dialog Begin Expressions
' ----------------------------------------------
attributePropertiesBuilder1.Units = "MilliMeter"
attributePropertiesBuilder1.Units = "MilliMeter"
attributePropertiesBuilder1.NumberValue = 4.0
attributePropertiesBuilder1.IsReferenceType = False
Dim expression1 As Expression = CType(workPart.Expressions.FindObject("Sheet_Metal_Material_Thickness"), Expression)
attributePropertiesBuilder1.Expression = expression1
Dim markId2 As Session.UndoMarkId
markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Displayed Part Properties")
Dim nXObject1 As NXObject
nXObject1 = attributePropertiesBuilder1.Commit()
Dim updateoption1 As MassPropertiesBuilder.UpdateOptions
updateoption1 = massPropertiesBuilder1.UpdateOnSave
Dim nXObject2 As NXObject
nXObject2 = massPropertiesBuilder1.Commit()
workPart.PartPreviewMode = BasePart.PartPreview.OnSave
Dim nXObject3 As NXObject
nXObject3 = previewPropertiesBuilder1.Commit()
theSession.DeleteUndoMark(markId2, Nothing)
theSession.SetUndoMarkName(markId1, "Displayed Part Properties")
attributePropertiesBuilder1.Destroy()
massPropertiesBuilder1.Destroy()
previewPropertiesBuilder1.Destroy()
' ----------------------------------------------
' Menu: Tools->Journal->Stop Recording
' ----------------------------------------------
End Sub
End Module





RE: journal runnig in assembly
There is this tutorial on the very topic: Creating a Subroutine to Process all Components in an Assembly
Link
Paul
Paul Turner
CAD & Process Engineer
Mastip Technology
RE: journal runnig in assembly
RE: journal runnig in assembly
www.nxjournaling.com
RE: journal runnig in assembly
Code is created in C#.
Open the entire assembly and run it.
// --> Copy this code into the .cs file
using System;
using NXOpen;
using NXOpen.Assemblies;
public class Program
{
// class members
private static Session theSession;
public static Program theProgram;
public static bool isDisposeCalled;
//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
public Program()
{
try
{
theSession = Session.GetSession();
isDisposeCalled = false;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
// UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Error, ex.Message);
}
}
//------------------------------------------------------------------------------
// Explicit Activation
// This entry point is used to activate the application explicitly
//------------------------------------------------------------------------------
public static int Main(string[] args)
{
int retValue = 0;
try
{
theProgram = new Program();
const string expressionName = "Sheet_Metal_Material_Thickness";
const string attributeTitle = "thickness";
const string attributeCategory = "Materials";
Part[] parts = theSession.Parts.ToArray();
Part workPart = theSession.Parts.Work;
PartLoadStatus partLoadStatus1;
foreach (var item in parts)
{
theSession.Parts.SetDisplay(item, true, true, out partLoadStatus1);
CreateLinkedAttributeInWorkPart(expressionName, attributeTitle, attributeCategory);
}
theSession.Parts.SetWork(workPart);
theProgram.Dispose();
}
catch (NXOpen.NXException ex)
{
PrintInInfoWindow("ERROR :" + ex.ToString());
}
return retValue;
}
//------------------------------------------------------------------------------
// Following method disposes all the class members
//------------------------------------------------------------------------------
public void Dispose()
{
try
{
if (isDisposeCalled == false)
{
//TODO: Add your application code here
}
isDisposeCalled = true;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
}
}
public static int GetUnloadOption(string arg)
{
//Unloads the image explicitly, via an unload dialog
//return System.Convert.ToInt32(Session.LibraryUnloadOption.Explicitly);
//Unloads the image immediately after execution within NX
return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
//Unloads the image when the NX session terminates
// return System.Convert.ToInt32(Session.LibraryUnloadOption.AtTermination);
}
/// <summary>
/// Creates the linked attribute in work part
/// </summary>
/// <param name="expName">Expression name</param>
/// <param name="attributeTitle">Title of the attribute</param>
/// <param name="attributeCategory">attribute category. pass empty string if no category</param>
private static void CreateLinkedAttributeInWorkPart(string expName, string attributeTitle, string attributeCategory)
{
string partName = System.IO.Path.GetFileNameWithoutExtension(theSession.Parts.Work.FullPath);
Expression exp1 = GetExpressionByName(expName);
if (exp1 != null)
{
try
{
CreateExpressionLinkedAttribute(exp1, attributeTitle, attributeCategory);
}
catch
{
PrintInInfoWindow(string.Format("{0} linked attribute failed to create in {1} part", attributeTitle, partName));
}
}
else
{
PrintInInfoWindow(string.Format("{0} expression is not found in {1} part", expName, partName));
}
}
/// <summary>
/// Print the message in listing window
/// </summary>
/// <param name="message"></param>
private static void PrintInInfoWindow(string message)
{
if (!theSession.ListingWindow.IsOpen)
{
theSession.ListingWindow.Open();
}
theSession.ListingWindow.WriteLine(message);
}
/// <summary>
/// Gets a Expression by expression name.
/// </summary>
/// <param name="expressionName">Name of the expression</param>
/// <returns>Null value if no expression found with specified name</returns>
private static Expression GetExpressionByName(string expressionName)
{
Expression exp1 = null;
Part workPart = theSession.Parts.Work;
foreach (Expression item in workPart.Expressions)
{
if (item.Name.ToUpperInvariant() == expressionName.Trim().ToUpperInvariant())
{
exp1 = item;
}
}
return exp1;
}
/// <summary>
/// Creates a Expression linked Attribute
/// </summary>
/// <param name="exp1">Expression object</param>
/// <param name="attributeTitle">Title of the attribute</param>
/// <param name="attributeCategory">Category of the attribute. pass empty string if no category</param>
private static void CreateExpressionLinkedAttribute(Expression exp1, string attributeTitle, string attributeCategory)
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
NXOpen.Session.UndoMarkId id1;
id1 = theSession.GetNewestUndoMark(NXOpen.Session.MarkVisibility.Visible);
NXObject[] objects1 = new NXObject[1];
objects1[0] = workPart;
AttributePropertiesBuilder attributePropertiesBuilder1;
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None);
attributePropertiesBuilder1.IsArray = false;
NXObject[] objects5 = new NXObject[1];
objects5[0] = workPart;
attributePropertiesBuilder1.SetAttributeObjects(objects5);
attributePropertiesBuilder1.DataType = NXOpen.AttributePropertiesBaseBuilder.DataTypeOptions.Number;
attributePropertiesBuilder1.Units = exp1.Units.JournalIdentifier;
attributePropertiesBuilder1.IsReferenceType = false;
attributePropertiesBuilder1.Expression = exp1;
attributePropertiesBuilder1.Title = attributeTitle;
attributePropertiesBuilder1.Category = attributeCategory;
attributePropertiesBuilder1.Commit();
theSession.UpdateManager.DoUpdate(id1);
attributePropertiesBuilder1.Destroy();
}
}
RE: journal runnig in assembly
Cowski, the journal works, but is there a way to get it to dig down into the sub assemblies?
it only works on the workpart assembly, some components I have are mirror wave links (with the parent assembled in the part), I have to be workpart on those as well to get the attribute in them.
SelvarajC,
I tried to run this but got this error.. something about attributes builder 1
I tried removing the "1" from those lines but still it gave an error...
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None);
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None);
attributePropertiesBuilder1.SetAttributeObjects(objects5);
hope you can find time to tweek the code, Thanks..
RE: journal runnig in assembly
If you still get the error. please attach the snapshot of the error.
using System;
using NXOpen;
using NXOpen.Assemblies;
public class Program
{
// class members
private static Session theSession;
public static Program theProgram;
public static bool isDisposeCalled;
//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
public Program()
{
try
{
theSession = Session.GetSession();
isDisposeCalled = false;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
// UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Error, ex.Message);
}
}
//------------------------------------------------------------------------------
// Explicit Activation
// This entry point is used to activate the application explicitly
//------------------------------------------------------------------------------
public static int Main(string[] args)
{
int retValue = 0;
try
{
theProgram = new Program();
const string expressionName = "Sheet_Metal_Material_Thickness";
const string attributeTitle = "thickness";
const string attributeCategory = "Materials";
Part[] parts = theSession.Parts.ToArray();
Part workPart = theSession.Parts.Work;
PartLoadStatus partLoadStatus1;
foreach (var item in parts)
{
theSession.Parts.SetDisplay(item, true, true, out partLoadStatus1);
CreateLinkedAttributeInWorkPart(expressionName, attributeTitle, attributeCategory);
}
theSession.Parts.SetWork(workPart);
theProgram.Dispose();
}
catch (NXOpen.NXException ex)
{
PrintInInfoWindow("ERROR :" + ex.ToString());
}
return retValue;
}
//------------------------------------------------------------------------------
// Following method disposes all the class members
//------------------------------------------------------------------------------
public void Dispose()
{
try
{
if (isDisposeCalled == false)
{
//TODO: Add your application code here
}
isDisposeCalled = true;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
}
}
public static int GetUnloadOption(string arg)
{
//Unloads the image explicitly, via an unload dialog
//return System.Convert.ToInt32(Session.LibraryUnloadOption.Explicitly);
//Unloads the image immediately after execution within NX
return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
//Unloads the image when the NX session terminates
// return System.Convert.ToInt32(Session.LibraryUnloadOption.AtTermination);
}
/// <summary>
/// Creates the linked attribute in work part
/// </summary>
/// <param name="expName">Expression name</param>
/// <param name="attributeTitle">Title of the attribute</param>
/// <param name="attributeCategory">attribute category. pass empty string if no category</param>
private static void CreateLinkedAttributeInWorkPart(string expName, string attributeTitle, string attributeCategory)
{
string partName = System.IO.Path.GetFileNameWithoutExtension(theSession.Parts.Work.FullPath);
Expression exp1 = GetExpressionByName(expName);
if (exp1 != null)
{
try
{
CreateExpressionLinkedAttribute(exp1, attributeTitle, attributeCategory);
}
catch
{
PrintInInfoWindow(string.Format("{0} linked attribute failed to create in {1} part", attributeTitle, partName));
}
}
else
{
PrintInInfoWindow(string.Format("{0} expression is not found in {1} part", expName, partName));
}
}
/// <summary>
/// Print the message in listing window
/// </summary>
/// <param name="message"></param>
private static void PrintInInfoWindow(string message)
{
if (!theSession.ListingWindow.IsOpen)
{
theSession.ListingWindow.Open();
}
theSession.ListingWindow.WriteLine(message);
}
/// <summary>
/// Gets a Expression by expression name.
/// </summary>
/// <param name="expressionName">Name of the expression</param>
/// <returns>Null value if no expression found with specified name</returns>
private static Expression GetExpressionByName(string expressionName)
{
Expression exp1 = null;
Part workPart = theSession.Parts.Work;
foreach (Expression item in workPart.Expressions)
{
if (item.Name.ToUpperInvariant() == expressionName.Trim().ToUpperInvariant())
{
exp1 = item;
}
}
return exp1;
}
/// <summary>
/// Creates a Expression linked Attribute
/// </summary>
/// <param name="exp1">Expression object</param>
/// <param name="attributeTitle">Title of the attribute</param>
/// <param name="attributeCategory">Category of the attribute. pass empty string if no category</param>
private static void CreateExpressionLinkedAttribute(Expression exp1, string attributeTitle, string attributeCategory)
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
NXOpen.Session.UndoMarkId id1;
id1 = theSession.GetNewestUndoMark(NXOpen.Session.MarkVisibility.Visible);
NXObject[] objects1 = new NXObject[1];
objects1[0] = workPart;
AttributePropertiesBuilder attributePropertiesBuilder1;
attributePropertiesBuilder1 = workPart.PropertiesManager.CreateAttributePropertiesBuilder(objects1);// theSession.AttributeManager.CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None);
attributePropertiesBuilder1.IsArray = false;
NXObject[] objects5 = new NXObject[1];
objects5[0] = workPart;
attributePropertiesBuilder1.SetAttributeObjects(objects5);
attributePropertiesBuilder1.DataType = NXOpen.AttributePropertiesBaseBuilder.DataTypeOptions.Number;
attributePropertiesBuilder1.Units = exp1.Units.JournalIdentifier;
attributePropertiesBuilder1.IsReferenceType = false;
attributePropertiesBuilder1.Expression = exp1;
attributePropertiesBuilder1.Title = attributeTitle;
attributePropertiesBuilder1.Category = attributeCategory;
attributePropertiesBuilder1.Commit();
theSession.UpdateManager.DoUpdate(id1);
attributePropertiesBuilder1.Destroy();
}
}
RE: journal runnig in assembly
- If the expression doesn't exist in the part, the attribute won't be created/updated.
- It will attempt to fully load your components. If the component could not be fully loaded, the attribute change may not "stick".
If neither of the above applies to your part(s), please post back with more details so I can track down what is happening.www.nxjournaling.com
RE: journal runnig in assembly
Still got an error I'm afraid, here's the screenshot.
I'm using NX8 by the way, you probably picked that up from the original journal tho..
RE: journal runnig in assembly
that's fine if the expression doesn't exist.
When I create a mirrored wave link part, I assemble the parent into it, do the link, then remove it from the reference set, I guess this could be the problem.
I only did a quick test last night, now I've noticed it only catches some of the parts it should do, in the assembly. Most missed parts have the expression in them, and running the original journal works on them.
I'm pretty sure the journal stops running when it finds a part without the expression.
Hope this helps..
RE: journal runnig in assembly
Code is generated in NX 9. I thought it'll work for NX 8. but some methods have been changed in NX 9. So it is not allowing to compile in NX 8.
Remove the line no 186 and use the below line.
// attributePropertiesBuilder1.SetAttributeObjects(objects5); // To be removed.
attributePropertiesBuilder1.ObjectPicker = AttributePropertiesBaseBuilder.ObjectOptions.Object;
RE: journal runnig in assembly
Please download my code again (same link); I found and corrected a "copy & paste" error in my code. It should run for all the parts now.
www.nxjournaling.com
RE: journal runnig in assembly
Thanks very much that worked floorlessly, much appreciated.
That will be very useful,
I edited the code to add other attributes for me and it worked well.
I tried to put more than one in the same Journal, but couldn't get it to work, so did them separately instead.
Also thanks to SelvarajC for your time & help...