Searching for title blocks in a drawing and checking the cells. Can it be done?

Hello everyone,

I have written something to search out title blocks (in 8.5 and 10) and then I try to check which ones it is storing by using getcell to get the first cell in the title block and print it. It doesn't seem to be accessible though, which is weird. Is it because it doesn't see a titleblock as a table or am I doing something wrong. Here is my code. Please help if you can.


Option Strict Off
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Drawings
Imports NXOpenUI
Imports NXOpen.Utilities
Imports NXOpen.Annotations

Module NXJournal
Sub Main (ByVal args() As String)
Dim theSession As Session = Session.GetSession()
Dim theUISession As UI = UI.GetUI
Dim theUfSession As UFSession = UFSession.GetUFSession()
Dim workPart As Part = theSession.Parts.Work
Dim lw As ListingWindow = theSession.ListingWindow
Dim tmpTitleBlock As NXOpen.Tag = NXOpen.Tag.Null
Dim tmpTitleBlockObj as displayableObject
Dim myTitleBlocks As New List(Of Tag)
Dim NxType As Integer
Dim NxSubtype As Integer

Do
theUfSession.Obj.CycleObjsInPart(workPart.Tag, UFConstants.UF_tabular_note_type, tmpTitleBlock)
If tmpTitleBlock <> NXOpen.Tag.Null Then
theUfSession.Obj.AskTypeAndSubtype(tmpTitleBlock, NxType, NxSubtype)
If NxSubtype = UFConstants.UF_draft_title_block_subtype
try
tmpTitleBlockObj = NXOpen.Utilities.NXObjectManager.Get(tmpTitleBlock)
Dim cellText As String = ""
cellText = GetCell(tmpTitleBlock, 0, 0)
If workPart.Layers.GetState(tmpTitleBlockObj.Layer) <> Layer.State.Hidden Then
lw.WriteLine("The table being stored Contains " & cellText)
myTitleBlocks.Add(tmpTitleBlock)
End If
catch nxexc as nxexception
‘msgbox(nxexc.message)
end try
End If
End If
Loop Until tmpTitleBlock = NXOpen.Tag.Null
End Sub
End Module

Is "GetCell" a function that you have written? I don't see it defined anywhere in the code above.

http://nxjournaling.com/comment/678#comment-678
You will find code in the link above that will return the text in each cell of a tabular note. The code just loops over all the cells in the note, but you can modify it to return a specific cell if that is what you need.

Hello,

Sorry I didnt explane myself well.

First, yes the getcell is a function I have written. I have forgotten to include the code, which could explain why it isnt working, I will try that.

But the problem I am finding currently is that in NX 10, the title block is not seen as a tabular note, and so the search I have is not finding it. I dont know why this is but it works fine in 8.5 then when I've tried in 10 it just misses the title blocks completely.

Each part has a collection of title block objects that you can access.
{part ref}.DraftingManager.TitleBlocks
You should be able to access all of the title block objects from this collection.

So I found that information in the documentation. I have been trying to access it the following way.


Dim theSession As Session = Session.GetSession()
Dim theUISession As UI = UI.GetUI
Dim theUfSession As UFSession = UFSession.GetUFSession()
Dim workPart As Part = theSession.Parts.Work
Dim lw As ListingWindow = theSession.ListingWindow
Dim DrftAppMngr As workPart.DraftingManager
Dim TtlBlkCol As TitleBlockCollection = DrftAppMngr.TitleBlocks

But for some reason, I keep getting the error that the drafting part manager is not defined.

These are all the imports I have in the script so far.

Option Strict Off
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Drawings
Imports NXOpenUI
Imports NXOpen.Utilities
Imports NXOpen.Annotations
Imports NXOpen.Drafting

Im not sure what to make of this.

Kind regards,

Jelrae

The next question I have is how do I create an edittitleblockbuilder for the titleblock collection? I tried the following:

Dim tmpString As String = workPart.DraftingManager.TitleBlocks.EditTitleBlockBuilder.GetCellValueForLabel("PIN")

But I cannot seem to get it to work.

I've not used the edit title block builder object, but the syntax for other builders is to pass in the specific object that you want to edit with the builder.

Dim editTitleBlockBuilder1 as EditTitleBlockBuilder
editTitleBlockBuilder1 = theSession.Parts.Work.DraftingManager.TitleBlocks.CreateEditTitleBlockBuilder({myTitleBlock})

Ok so I did try that, but it wouldnt compile. I ended up having wo write it like this:


Dim TBC As TitleBlockCollection = workPart.DraftingManager.TitleBlocks
Dim TitleBlkArry() As TitleBlock = TBC.ToArray()
Dim ETBB As Annotations.EditTitleBlockBuilder = workPart.DraftingManager.TitleBlocks.CreateEditTitleBlockBuilder(TitleBlkArry)

What I dont understand is the following.

I tried to declare a variable in two lines
Dim ETBB As Annotations.EditTitleBlockBuilder = workPart.DraftingManager.TitleBlocks.CreateEditTitleBlockBuilder(TitleBlkArry)
I wanted that to be
Dim ETBB As Annotations.EditTitleBlockBuilder
ETBB = workPart.DraftingManager.TitleBlocks.CreateEditTitleBlockBuilder(TitleBlkArry)
Just because that was how it was shown in an example/
But it told me that in the second declaration (the one with ETBB = ) That the ETBB = ..... line was expecting a declaration. Isnt what I wrote after it a declaration. Why does it work when I put it on one line but not two?

I don't have a definitive answer as that depends on how the internal API functions were implemented. However, I suspect that when you declare the builder object it implicitly calls the "New" method of the builder and that method expects a title block to be passed in at that time (and not later).