Journal to open selected part's drawing from assy / Teamcenter

Hello all,

I use Teamcenter 9 and NX 8.5.

My parts are named as
part1-A1.prt DB_PART_NO ="part1" and DB_PART_REV = "A1"
part1-A2.prt DB_PART_NO ="part1" and DB_PART_REV = "A2"
part1-A3.prt DB_PART_NO ="part1" and DB_PART_REV = "A3"

My drawings are named as
part1_dr01.prt DB_PART_NO ="part1" and DB_PART_REV = "dr01"
part1_dr02.prt DB_PART_NO ="part1" and DB_PART_REV = "dr02"
part1_dr03.prt DB_PART_NO ="part1" and DB_PART_REV = "dr03"

When in assembly, i want to open the selected part's drawing by a journal.
I will select the part1 with one of the revision A1,A2 or A3
Journal will handle the File-open , search for the part name and find the relevant revision of the drawing of the part

I tried to write many journals but couldn't achieve because my lack of experience.

I am not currently using a TC install, so I probably won't be able to provide any useful code, but I do have a question. In your description it sounds as if the drawing and model are in two different datasets, is this the case? I've worked on 2 different TC installs, but both of them kept the model (master) and drawing (specification) in the same dataset. If the model and drawing are in the same dataset, this probably has an easy solution. If they are in different datasets, it might be a bit harder.

He is something I threw together a while back to do something similar where I work. If you have components selected in the assembly navigator, it will open the drawings for those, otherwise it will open the drawing for the currently viewed part. You will need to modify the code slightly to work with your naming convention in Teamcenter.

 '***************************************************************'
'* ¯\(°_o)/¯'
'* Created by Todd Mitchell'
'* Date: 07/31/2014'
'* Program Name: Super Drawing'
'* Description: Open Drawings From Selected Components'
'* Revisions: Initial'
'***************************************************************'
 
Option Strict Off  
 
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Windows.Forms
Imports NXOpen
Imports NXOpen.Assemblies
Imports NXOpen.UF
Imports NXOpen.UI
 
Module NXJournal
 
	Dim theSession As Session = Session.GetSession()
	Dim workPart = theSession.Parts.Work
	Dim theUFS As NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession()
	Dim theUI As UI = ui.GetUI
 
	Dim SelectedList As New List(Of String)
	Dim bolSelected As Boolean = False
 
	Dim objSelected As NXObject
	Dim intType As Integer
	Dim intSubType As Integer
 
	Sub Main()
 
		Try
 
			AreComponentsSelected()
			If bolSelected = False Then
				OpenDrawings(workPart.GetStringAttribute("DB_PART_NO") & "/" & workPart.GetStringAttribute("DB_PART_REV"))
			Else
				For Each selectedcomponent As String in SelectedList
					OpenDrawings(selectedcomponent)
				Next
			End If
			SendKeys.SendWait("{F12}") 'Created F12 Hotkey in NX To Switch to Drafting Environment'
 
		Catch ex As Exception
			LogError(ex.message)
		End Try
 
	End Sub
 
	Sub AreComponentsSelected()
		Try
		Dim intNumSelected As Integer = theUI.SelectionManager.GetNumSelectedObjects()
    		If intNumSelected = 0 Then
    			bolSelected = False
    			Exit Sub
    		End If
 
    		For i As Integer = 0 To intNumSelected-1
			objSelected = theUI.SelectionManager.GetSelectedObject(i)
			theUFS.Obj.AskTypeAndSubtype(objSelected.Tag, intType, intSubType)
			If intType = UFConstants.UF_component_type Then
				Dim theComp As Component = DirectCast(objSelected, Component)
				SelectedList.Add(theComp.DisplayName)
				bolSelected = True
			End If
		Next
		Catch ex As Exception
			LogError(ex.message)
		End Try
 
	End Sub
 
	Sub OpenDrawings(ByVal OpenMe As String)
		Try
 
			Dim strSplitString() As String = Split(OpenMe, "/")
			Dim strPartNo As String = strSplitString(0)
			Dim strRevNum As String = strSplitString(1)
			Dim strOpenString As String = "@DB/" & strPartNo & "/" & strRevNum & "/specification/" & strPartNo & "-DWG01"
			Try				
				theSession.Parts.SetNonmasterSeedPartData(strOpenString)				
				Dim prtBasePart As BasePart
				Dim lsBasePart As PartLoadStatus
				prtBasePart = theSession.Parts.OpenBaseDisplay(strOpenString, lsBasePart)
				lsBasePart.Dispose()
 
			Catch exc As Exception
				Dim prtPart As Part = CType(theSession.Parts.FindObject(strOpenString), Part)
				Dim lsPart As PartLoadStatus
				Dim status1 As PartCollection.SdpsStatus
				status1 = theSession.Parts.SetDisplay(prtPart, False, True, lsPart)
				lsPart.Dispose()
			End Try
 
		Catch ex As Exception
			LogError(ex.message)
		End Try
	End Sub
 
	Sub LogError(ErrorMessage As String)
		Dim errPath As String = Path.GetDirectoryName(theSession.ExecutingJournal)
		Dim errFile As String = Replace(Path.GetFileName(theSession.ExecutingJournal), ".vb", "")
		Using ErrorWriter As New IO.StreamWriter(errPath & "\" & errFile & "_LogError.txt", True)
			ErrorWriter.Write(vbCrLf + "Log Entry : ")
			ErrorWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString())
			ErrorWriter.WriteLine(ErrorMessage)
			ErrorWriter.WriteLine("--------------------------------------------------------------")
			ErrorWriter.Close
		End Using
	End Sub
 
	Public Function GetUnloadOption(ByVal dummy As String) As Integer
		GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY
	End Function
 
End Module

Hi

I am very interested in this Journal but don't appear to be able to get it working, can anyone please help?

Our numbering system is:

M-5774-0101-01-A (Master model)
M-5774-0101-01-A-DRG (Specification file)

The "A" is the Revision

below is a recorded journal showing our part naming.

' NX 7.5.5.4
' Journal created by mw111368 on Fri Dec 05 11:13:49 2014 GMT 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

Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Start")

theSession.SetUndoMarkName(markId1, "Open Part File Dialog")

Dim markId2 As Session.UndoMarkId
markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Open Part File")

theSession.DeleteUndoMark(markId2, Nothing)

theSession.SetUndoMarkName(markId1, "Open Part File")

theSession.DeleteUndoMark(markId1, Nothing)

theSession.Parts.SetNonmasterSeedPartData("@DB/G-6045-1040-01/A/specification/G-6045-1040-01-A_DRG")

Dim basePart1 As BasePart
Dim partLoadStatus1 As PartLoadStatus
basePart1 = theSession.Parts.OpenBaseDisplay("@DB/G-6045-1040-01/A/specification/G-6045-1040-01-A_DRG", partLoadStatus1)

workPart = theSession.Parts.Work
displayPart = theSession.Parts.Display
partLoadStatus1.Dispose()

End Sub
End Module

I have now managed to get this Journal working but have realized that our Specification files can have more then one different suffix on the end.

the journal is set to look for "-DRG", but we have also used "_DRG", "-DRG1". can I easily look for all of these variants and open the one that exists?

you could define an array of all the string you want/search for and loop through it until you found what you are looking for

Dim arrStrTofind(1) as String
arrStrTofind(0)="_DRG"
arrStrTofind(1)="-DRG1"

For i = 0 to UBound(arrStrTofind)
'position = 0 if character not found
position = InStr("the name you're searching in",arrStrTofind(i))
if position <> 0 Then
Select Case i
Case 0
"open file 1"
Case 1
"open file 2"
"etc"
End Select
Next

Thanks
Regards

Hi

I am looking to add "-DRG", and "_DRG", but am not experienced enough to do, so would very much appreciated some help.

Regards
Maryn

'***************************************************************'
'* ¯\(°_o)/¯'
'* Created by Todd Mitchell'
'* Date: 07/31/2014'
'* Program Name: Super Drawing'
'* Description: Open Drawings From Selected Components'
'* Revisions: Initial'
'***************************************************************'

Option Strict Off

Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Windows.Forms
Imports NXOpen
Imports NXOpen.Assemblies
Imports NXOpen.UF
Imports NXOpen.UI

Module NXJournal

Dim theSession As Session = Session.GetSession()
Dim workPart = theSession.Parts.Work
Dim theUFS As NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession()
Dim theUI As UI = ui.GetUI

Dim SelectedList As New List(Of String)
Dim bolSelected As Boolean = False

Dim objSelected As NXObject
Dim intType As Integer
Dim intSubType As Integer

Sub Main()

Try

AreComponentsSelected()
If bolSelected = False Then
OpenDrawings(workPart.GetStringAttribute("DB_PART_NO") & "/" & workPart.GetStringAttribute("DB_PART_REV"))
Else
For Each selectedcomponent As String in SelectedList
OpenDrawings(selectedcomponent)
Next
End If
SendKeys.SendWait("{F12}") 'Created F12 Hotkey in NX To Switch to Drafting Environment'

Catch ex As Exception
LogError(ex.message)
End Try

End Sub

Sub AreComponentsSelected()
Try
Dim intNumSelected As Integer = theUI.SelectionManager.GetNumSelectedObjects()
If intNumSelected = 0 Then
bolSelected = False
Exit Sub
End If

For i As Integer = 0 To intNumSelected-1
objSelected = theUI.SelectionManager.GetSelectedObject(i)
theUFS.Obj.AskTypeAndSubtype(objSelected.Tag, intType, intSubType)
If intType = UFConstants.UF_component_type Then
Dim theComp As Component = DirectCast(objSelected, Component)
SelectedList.Add(theComp.DisplayName)
bolSelected = True
End If
Next
Catch ex As Exception
LogError(ex.message)
End Try

End Sub

Sub OpenDrawings(ByVal OpenMe As String)
Try

Dim strSplitString() As String = Split(OpenMe, "/")
Dim strPartNo As String = strSplitString(0)
Dim strRevNum As String = strSplitString(1)
Dim strOpenString As String = "@DB/" & strPartNo & "/" & strRevNum & "/specification/" & strPartNo & "-" & strRevNum & "_DRG1"

Try
theSession.Parts.SetNonmasterSeedPartData(strOpenString)
Dim prtBasePart As BasePart
Dim lsBasePart As PartLoadStatus
prtBasePart = theSession.Parts.OpenBaseDisplay(strOpenString, lsBasePart)
lsBasePart.Dispose()

Catch exc As Exception
Dim prtPart As Part = CType(theSession.Parts.FindObject(strOpenString), Part)
Dim lsPart As PartLoadStatus
Dim status1 As PartCollection.SdpsStatus
status1 = theSession.Parts.SetDisplay(prtPart, False, True, lsPart)
lsPart.Dispose()

End Try

Catch ex As Exception
LogError(ex.message)
End Try
End Sub

Sub LogError(ErrorMessage As String)
Dim errPath As String = Path.GetDirectoryName(theSession.ExecutingJournal)
Dim errFile As String = Replace(Path.GetFileName(theSession.ExecutingJournal), ".vb", "")
Using ErrorWriter As New IO.StreamWriter(errPath & "\" & errFile & "_LogError.txt", True)
ErrorWriter.Write(vbCrLf + "Log Entry : ")
ErrorWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString())
ErrorWriter.WriteLine(ErrorMessage)
ErrorWriter.WriteLine("--------------------------------------------------------------")
ErrorWriter.Close
End Using
End Sub

Public Function GetUnloadOption(ByVal dummy As String) As Integer
GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY
End Function

End Module

can someone please help adding an array into this journal as detailed above.

Thanks
Martyn

The code below adds the ability to create a list of commonly used suffixes which it attempts to open until it succeeds.

'***************************************************************'
'* ¯\(°_o)/¯'
'* Created by Todd Mitchell'
'* Date: 07/31/2014'
'* Program Name: Super Drawing'
'* Description: Open Drawings From Selected Components'
'* Revisions: Initial'
'################################################################################################################
' Version History:
' Version | Date       | Changed by    | Description of change
' --------|------------|---------------|-------------------------------------------------------------------------
' 1.0     | 31/07/2014 | Todd Mitchell | Initial release
' 1.1     | 30/04/2015 | Ian Eldred    | Added multiple spec file extension capability
' 1.2     | 30/04/2015 | Ian Eldred    | Only switch to drawing mode if a drawing is found. Log errors in NX log file.
'################################################################################################################
 
Option Strict Off  
 
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Windows.Forms
Imports NXOpen
Imports NXOpen.Assemblies
Imports NXOpen.UF
Imports NXOpen.UI
 
Module NXJournal
 
	Dim theSession As Session = Session.GetSession()
	Dim workPart = theSession.Parts.Work
	Dim theUFS As NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession()
	Dim theUI As UI = ui.GetUI
    'Dim lw As ListingWindow = theSession.ListingWindow
    Dim lg As LogFile = theSession.LogFile
 
	Dim SelectedList As New List(Of String)
	Dim bolSelected As Boolean = False
 
	Dim objSelected As NXObject
	Dim intType As Integer
    Dim intSubType As Integer
    Dim ExtensionList As New List(Of String)
    Dim blnFoundSpec As Boolean = False
 
	Sub Main()
        'lw.Open()
        lg.WriteLine("~~ Journal: Open_Specification.vb ~~")
        lg.WriteLine("  timestamp: " & Now)
 
        BuildExtensionList()
 
		Try
            lg.WriteLine("  Find out if components are selected.")
            AreComponentsSelected()
			If bolSelected = False Then
                lg.WriteLine("  No components are selected.")
                lg.WriteLine("  Open drawing for current work part.")
                OpenDrawings(workPart.GetStringAttribute("DB_PART_NO") & "/" & workPart.GetStringAttribute("DB_PART_REV"))
			Else
				For Each selectedcomponent As String in SelectedList
                    lg.WriteLine("  Components are selected.")
                    lg.WriteLine("  Open drawing for selected parts.")
                    OpenDrawings(selectedcomponent)
				Next
            End If
            If blnFoundSpec Then
                lg.WriteLine("  Switch to drawing mode using F12 hotkey.")
                SendKeys.SendWait("{F12}") 'Created F12 Hotkey in NX To Switch to Drafting Environment'
            Else
                lg.WriteLine("  No drawing found.")
            End If
 
        Catch ex As Exception
            lg.WriteLine("  Error in Sub Main: " & ex.Message)
        End Try
        'lw.Close()
        lg.WriteLine("~~ Journal: Open_Specification.vb completed ~~")
        lg.WriteLine("  timestamp: " & Now)
    End Sub
 
	Sub AreComponentsSelected()
		Try
		Dim intNumSelected As Integer = theUI.SelectionManager.GetNumSelectedObjects()
    		If intNumSelected = 0 Then
    			bolSelected = False
    			Exit Sub
    		End If
 
    		For i As Integer = 0 To intNumSelected-1
			objSelected = theUI.SelectionManager.GetSelectedObject(i)
			theUFS.Obj.AskTypeAndSubtype(objSelected.Tag, intType, intSubType)
			If intType = UFConstants.UF_component_type Then
				Dim theComp As Component = DirectCast(objSelected, Component)
				SelectedList.Add(theComp.DisplayName)
				bolSelected = True
			End If
		Next
		Catch ex As Exception
            lg.WriteLine("  Error in Sub AreComponentsSelected: " & ex.Message)
        End Try
 
	End Sub
 
    Sub BuildExtensionList()
        'Add new extensions to this list.
        'This list should be sorted by most commonly used extension as opening will be attempted in this order.
        ExtensionList.Add("-DRG")
        ExtensionList.Add("-DRG1")
        ExtensionList.Add("_DRG")
        ExtensionList.Add("_DRG1")
    End Sub
 
    Sub OpenDrawings(ByVal OpenMe As String)
        Dim strExtension As String
        Dim strSplitString() As String = Split(OpenMe, "/")
        Dim strPartNo As String = strSplitString(0)
        Dim strRevNum As String = strSplitString(1)
        Dim strOpenString As String = ""
 
        For Each strExtension In ExtensionList
            Try
                strOpenString = "@DB/" & strPartNo & "/" & strRevNum & "/specification/" & strPartNo & "-" & strRevNum & strExtension
 
                Try
                    theSession.Parts.SetNonmasterSeedPartData(strOpenString)
                    Dim prtBasePart As BasePart
                    Dim lsBasePart As PartLoadStatus
                    prtBasePart = theSession.Parts.OpenBaseDisplay(strOpenString, lsBasePart)
                    lsBasePart.Dispose()
                    blnFoundSpec = True
                    Exit For
 
                Catch exc As Exception
                    Dim prtPart As Part = CType(theSession.Parts.FindObject(strOpenString), Part)
                    Dim lsPart As PartLoadStatus
                    Dim status1 As PartCollection.SdpsStatus
                    status1 = theSession.Parts.SetDisplay(prtPart, False, True, lsPart)
                    lsPart.Dispose()
                    blnFoundSpec = True
                    Exit For
 
                End Try
 
            Catch ex As Exception
                lg.WriteLine("  Error in Sub OpenDrawings:")
                lg.WriteLine("    " & ex.Message & ": " & strOpenString)
            End Try
        Next
    End Sub
 
	Public Function GetUnloadOption(ByVal dummy As String) As Integer
		GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY
	End Function
 
End Module

I am trying to adopt this code, however when the code can't find the specified filename, NX freezes up. Do you know what might be causing this? I assumed if there are no matches within the try...catch loop, the filename would be ignored and then the code would check the next item on the list?

Is this line of code critical?

Public Function GetUnloadOption(ByVal dummy As String) As Integer
		GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY
	End Function

If you reply to a comment (be sure to use the "reply" link below the comment you are replying to), an email notification will be sent to the author of the comment (unless he has disabled the notifications). Replying to the comment is your best chance of getting the comment author's attention.

The GetUnloadOption function only affects the code if you compile it into a .dll or .exe file. If you playback the code as a journal, it has no effect.

Hi,
I have am trying to adopt your code to open a list of part numbers (from an excel) and then export the notes in the drawing. I have the script for exporting the notes. However, could you help with the catch exception for if the filename is not found? I basically want to just ignore the row with that part number and move onto the next. I'm unfamiliar with the try...catch loops in VB. Thanks!