cancel
Showing results for 
Search instead for 
Did you mean: 

How to create a mapping between original model and Extracted Geometry model

Pioneer
Pioneer

In order to get the poles and knot vector of some faces, I first use "Extract Geometry" command to extract surfaces.

But now I need a mapping between edges of original model and edges of extracted geometry model. 

 

My proposal is to first compare the length and vertices position of 2 edges, if they are same, we can say these two edges are same. 

It's not difficult to compare the length of two edges, but if I need to compare the vertices of edges, I need to first know order the vertices and do the comparsion, which is quite time-consuming. 

 

So I would like ask whether there are any other ways to find corresponding edge for extract and original geometry model.

 

Here in the following I list some useful commands for getting edge length 

******************************************************************

t1 = NXObjectManager::Get(tag);
Edge *Edge1(dynamic_cast<Edge*>(t1));
double length  = Edge1->GetLength() 

******************************************************************

9 REPLIES

Re: How to create a mapping between original model and Extracted Geometry model

Legend
Legend

Unless I am missing somethig I feel that it is unnecessary to use edges and vertices to get the face relations.

 

Assuming you can easily identify all faces that you wish to extract then simply cycle through these faces  doing the extraction one face at a time (not all faces of a body) which then gives you the extracted face for each model face.

 

Frank Swinkels

Re: How to create a mapping between original model and Extracted Geometry model

Pioneer
Pioneer

Thanks for you reply.

Up to now, I do extract the faces one by one as you said. 

But in order to get the mapping information of edges, I think I should still do the length and vertices checking.

 

How do you think ? 

 

 

Re: How to create a mapping between original model and Extracted Geometry model

Legend
Legend

I have never needed to do what you want.  What I have needed was to determine edge loops.  I think the general method should work for you.

 

Basically what I would do is use a distance function between two points.  I have my own functions for using point3d object to get the distance. 

 

Public Shared Function Distance(ByVal pnt1 As Point3d, ByVal pnt2 As Point3d) As Double
        Return Math.Sqrt((pnt1.X - pnt2.X) ^ 2 + (pnt1.Y - pnt2.Y) ^ 2 + (pnt1.Z - pnt2.Z) ^ 2)
    End Function

 

So basically I would compare similar points (say 0.1 parameter value along the edge) on model and extracted edges.  The minimum distance (allowing for modelling tolerance error) case would result in the correct edges pair.  Do not use vertices because this would give you two possible edges. If you do not use mid points then the edge direction is also known.

 

Frank Swinkels

 

Re: How to create a mapping between original model and Extracted Geometry model

Pioneer
Pioneer

Thanks for your reply, Frank.

 

If I have not interpreted wrong,

You mean, I can first loop over each edge's loop, and then choose a parameter (for example, 0.1 ) in order to get a vertice for each edge among an edge's loop. Then if the distance between two vertices are small(Let's say 0.01). We can say they are one edge pair.

 

But in this case, we still need to check the edge sense first due to the reason that in parameter space, zero value may start either  at one end of the edge or at the other end of the edge.

 

Would it be better if we only compare mid point so that we don't need to check edge sense?

 

Thanks a lot 

Re: How to create a mapping between original model and Extracted Geometry model

Siemens Phenom Siemens Phenom
Siemens Phenom

Checking arclengths plus mid-points might be OK.

 

Of course, it's easy to invent cases where this algorithm won't work (where two edges have the same length and the same mid-point, even though they are not the same). But these cases are probably pretty rare, and it's probably OK to take the risk of an error (only you can decide that).

 

If you really want to be sure that two edges are the same, then you need to measure the maximum distance between them. This will be slow, and, in effect, you'll just be re-implementing the Deviation Checking function.

 

 

山田
yamada

Re: How to create a mapping between original model and Extracted Geometry model

Legend
Legend

My original reason for suggesting you do not use the mid point is that for checking the direction I thought it would be enough to know the relevent 0 and 1 parameter values.  If you find that this is not sufficiently positive then a further distance test for a pair of vertices would give the desired result.

 

I am sorry but I think using deviation checking would be slower and more difficul..

 

Regards

 

Frank Swinkels

Re: How to create a mapping between original model and Extracted Geometry model

Valued Contributor
Valued Contributor

Frank,

 

To quote your own work Smiley Happy

http://www.nxjournaling.com/content/find-duplicate-sheet-bodies

 

Could the OP use the ufs.Modl.AskBoundingBox function on each edge and use a similar sorting routine?

 

I've found this extremely efficient even with large amounts of data.

 

 

Re: How to create a mapping between original model and Extracted Geometry model

Legend
Legend

My understanding re the originalquestion is that we have here a case of an extracted surface associated with (sitting on) a model face.  We then have a list of edges for both model face and extracted face and what is required is (why I do not know) the relation of edges.  If this is correct then simply checking a point on each model edge against all similar points on the extracted face edges and checking the distance would give a pair of edges (if the point is not a vertex) solution.  The next question was to get the direction relationship.  Now, again I do not know why, but it is possible to check the distances from the used points to the vertexes on the related edges.  The equal distances would give the required relationships.  This is why I suggested not using a centre point.

 

The starting position of this question was that the extracted face and model face is known.  When this is not the case then the face bounding box approach is useful.

 

Frank Swinkels

Re: How to create a mapping between original model and Extracted Geometry model

Valued Contributor
Valued Contributor

Frank,

 

I was suggesting edge bounding boxes not face bounding boxes.

A la.....

 

Option Strict Off
Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Utilities
Imports System.Data
Imports System.Collections.Generic




Module find_duplicates


    Dim ufs As UFSession = UFSession.GetUFSession()
    '  Explicit Activation
    '      This entry point is used to activate the application explicitly


    Dim theSession As Session = Session.GetSession()
    Dim workPart As Part = theSession.Parts.Work
    Dim theUfSession As UFSession = UFSession.GetUFSession()
    Dim lw As ListingWindow = theSession.ListingWindow

    Dim myModelingTolerance As Double

    Sub Main()
        Dim my_layers As Layer.LayerManager = workPart.Layers
        lw.Open()

        If IsNothing(theSession.Parts.Display) Then
            lw.WriteLine("Active part required, journal exiting")
            lw.Close()
            Exit Sub
        End If

        Dim sheetCount As Integer = 0
        For Each obj As Body In workPart.Bodies
            If obj.IsSheetBody Then
                sheetCount += 1
                'must have at least 2 sheet bodies to run a meaningful comparison
                If sheetCount >= 2 Then
                    Exit For
                End If
            End If
        Next

        If sheetCount < 2 Then
            lw.WriteLine("Insufficient number of sheet bodies found, journal exiting")
            Exit Sub
        End If

        'reset sheetCount variable
        sheetCount = 0

        Dim markId1 As Session.UndoMarkId
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Identify duplicate sheet bodies")

        'Optional: write output file with bounding box info that was used for preliminary comparison
       

        'layer we will move duplicate sheets to
        Const dumpLayer As Integer = 255
        'if any sheet bodies start out on the dumpLayer, move them to this layer
        Const holdingLayer As Integer = 251
        Dim numMatches As Integer = 0

        'time variables to record how long the operation took
        Dim startTime As DateTime = Now
        Dim endTime As DateTime
        Dim timeElapsed As TimeSpan
thesession.listingwindow.open
        Dim faceTable As New DataTable("Face")
        faceTable.Columns.Add("ID", GetType(Integer))
        faceTable.Columns.Add("Xmin", GetType(Double))
        faceTable.Columns.Add("Ymin", GetType(Double))
        faceTable.Columns.Add("Zmin", GetType(Double))
        faceTable.Columns.Add("Xmax", GetType(Double))
        faceTable.Columns.Add("Ymax", GetType(Double))
        faceTable.Columns.Add("Zmax", GetType(Double))

        Dim bbox(5) As Double
        Dim facePt(2) As Double
        Dim faceDir(2) As Double

        'collect info on each face
        For Each obj As Body In workPart.Bodies
            If obj.IsSheetBody Then
                If not my_layers.GetState(obj.Layer) > 1 Then


                    If obj.IsBlanked = false Then ' only check visible objects
                        Dim myFace As Face = obj.GetFaces(0)
                        If obj.Layer = dumpLayer Then
                            obj.Layer = holdingLayer
                            obj.RedisplayObject()
                        End If
                        sheetCount += 1
dim my_edges() as edge = myface.getedges
for int as integer = 0 to my_edges.length-1
theUfSession.Modl.AskBoundingBox(my_edges(int).Tag, bbox)
thesession.listingwindow.writeline( bbox(0)& " , "& bbox(1)& " , "& bbox(2)& " , "& bbox(3)& " , "& bbox(4)& " , "& bbox(5))
next
                        
                    End If
                End If
            End If
        Next
end sub
end module

As an alternative approach.

 

Not sure how the bounding box would work on a striaght line in const x y or z though.