cancel
Showing results for 
Search instead for 
Did you mean: 

If line.equals(otherLine)

Valued Contributor
Valued Contributor

Using the NXOpen Line class, I need to compare lines vs lines to see if they are the exact same line. How can I know how the lines will compare when using the .equals() method provided in the NX 8.5 API (which is the version I'm using). I could create test cases and narrow down the potential options, but I thought I'd ask here first. 

 

Will the line.equals(otherLine) method compare the start points vs end points for each of the lines? Where can this information be found?

 

This is how I would like to parse through the list.

  If Not lines.Contains(line) Then
      lines.Add(line)
  End If

 However I could do something like this:

Dim lineFound As Boolean = False
For each line As Line in lines
    if math.abs(line.start.x - otherLine.start.x) < 0.001 and...etc
        lineFound = True
    end if
Next
if not lineFound
    lines.add(otherline)
end if

 It's just not as clean! Thanks

NX 9.0.3.4 MP13
VB.net
Visual Studio 2015
4 REPLIES

Re: If line.equals(otherLine)

Phenom
Phenom

The .Equals method is defined in the .net framework and is available to every object. Its behavior is slightly different depending on whether value types or reference types are passed to it. For a more complete discussion see:

http://msdn.microsoft.com/en-us/library/bsc2ak47

 

Comparing value types is fairly straightforward either the two values are equal or they are not.

Dim a As Integer = 5
Dim b As Integer = 5
a.Equals(b)

 returns True.

 

Comparing reference types (objects are reference types) is trickier.

Dim line1 As Line = workPart.Curves.CreateLine(stpt, endpt)
Dim line2 As Line = workPart.Curves.CreateLine(stpt, endpt)
Dim line3 As Line = line1

 The code above creates 3 references to line objects; 2 (overlapping) lines will appear in the graphics window. The line3 object variable references line1; we have 2 objects that reference the same instance of a line.

line1.Equals(line3)

 If the .Equals method uses the same implementation as the .net object.Equals method, then the above will return True because they reference the same object.

 

However, the .Equals method in the NXOpen API may be overridden to provide different behavior.

line1.Equals(line2)

 May return True or False, depending on the NXOpen implementation. It may be that the API developers have provided a way to test 2 different line objects to see if they occupy the same space. It is impossible to tell from the .net API reference document alone whether it compares object references or values on the line (start and end points, perhaps).

 

I'd suggest running a few tests; create 2 separate line objects that you know are equal (same start and end points), and examine the output of the .Equals method.

Re: If line.equals(otherLine)

Esteemed Contributor
Esteemed Contributor

Note you might also want to test if the lines are "equal" when the endpoints are reversed:

 

Dim line1 As Line = workPart.Curves.CreateLine(stpt, endpt)
Dim line2 As Line = workPart.Curves.CreateLine(endpt, stpt)

 in this case, is line1 == line2?

Technically, they both occupy the same space, but the (vector) direction is different.

Wheher or not that is an issue for you depends on your application - it may be important, it may not.

Ken Akerboom Sr CAx Systems Engr, Moog, Inc.
Production: NX10.0.3.5 MP5 + patch/TC11.2
I'd rather be e-steemed than e-diseaseled


Re: If line.equals(otherLine)

Phenom
Phenom

The function:

UF_CURVE_LINE_ARC_is_line_equal

might be a useful alternative to the .Equals method.

Re: If line.equals(otherLine)

Siemens Phenom Siemens Phenom
Siemens Phenom

I agree that UF_CURVE_LINE_ARC_is_line_equal is your best bet. According to its documentation, it does a *geometric* comparison of the two lines, which is what you want, apparently. The Equals function is probably checking whether two memory locations are the same, which is a much stronger requirement.

 

If you want your code to be pretty, write a function called GeomEqual, or something like that. It should receive two lines, call UF_CURVE_LINE_ARC_is_line_equal, and then return a boolean. Once you have this, you can write code like

 

 

if GeomEqual(line1, line2) then ...

 

山田
yamada