Get point coordinates on block occurrences

Builder
Builder

Hello there,

 

I need to get all the Points2D and Lines2D endpoints coordinates inside a Sheet, including all those Points2d and Lines2d included inside BlockOccurrences placed on that Sheet.

 

As far as I see, there's no direct simple way of getting, for example, the "global" coordinates of each Point2d o Line2d sendpoints inside the different occurrences of all the blocks. A block can contain another blocks and each one can be rotated and scaled in different ways, which increases difficulty

 

One approach, not quite easy, is getting position (GetOrigin), ScaleFactor and RotationAngle of each occurrence and then apply those transformations to each of the points/lines inside it. This must be done recursively if we are dealing with blocks inside blocks and so on. Not an easy task.

 

The other approach is getting references of the different elements using MemberReference property of the BlockOccurrence, and using the transformation matrix provided in order to adjust coordinates to the upper level. Quite spare documentation about this matrix stuff, unfortunately. Also, I'm not sure about what happens with the scale in this case, since that matrix I guess only deals with position and rotation. Recursive thinking is also expected here... Not sure if this is even worse than the first choice!

 

Before getting absolutely mad with maths and testings, I would love to know if there's not really a simpler approach for getting the FINAL coordinates (refered to the main Sheet origin) of different geometric elements inside BlockOccurrences

 

Thanks in advance!

2 REPLIES

Re: Get point coordinates on block occurrences

Solution Partner Phenom Solution Partner Phenom
Solution Partner Phenom

Hi javigoca,

i fear doing the math yourself is the only possibility.

 

It's not that difficult...
Using the values of the BlockOccurrence you can transform the points of the 2d space of the occurrence plane to the space of the sheet:

Private Sub OccurrenceToSheet(BOcc As SEDraft.BlockOccurrence, xBlock As Double, yBlock As Double,
                                  ByRef xSheet As Double, ByRef ySheet As Double)
        Dim xOrig, yOrig As Double
        Dim xOccOrig, yOccOrig As Double

        Dim xTemp, yTemp As Double
        Dim Angle As Double
        Dim dSin As Double
        Dim dCos As Double

        ' get the origin points
        BOcc.GetOrigin(xOccOrig, yOccOrig)
        BOcc.BlockView.GetOrigin(xOrig, yOrig)

        ' transform point from block system relative to origin   
        xTemp = xBlock - xOrig
        yTemp = yBlock - yOrig
        'scale
        xTemp = xTemp * BOcc.ScaleFactor
        yTemp = yTemp * BOcc.ScaleFactor

        'rotate
        Angle = BOcc.RotationAngle
        If Angle <> 0.0 Then
            dSin = Sin(Angle)
            dCos = Cos(Angle)
            xSheet = dCos * xTemp - dSin * yTemp
            ySheet = dSin * xTemp + dCos * yTemp
        Else
            xSheet = xTemp
            ySheet = yTemp
        End If
        'move
        xSheet = xSheet + xOccOrig
        ySheet = ySheet + yOccOrig

    End Sub

If you are in some sub BlockOccurrence you have to test for the parent an do this "bottom up" until the parent is the sheet.

 

If you want to do this for a lot of points, then you can consider to generate a transformation matrix for each BlockOccurrence or sub BlockOccurrence to do this in one step.
There are lots of examples on some math / geometry pages in the web.

Then you could do just a matrix multiply of the transformation matrix with each point to transform it. 

 

hope this helps

regards

JB
VS2015, SE ST10

Re: Get point coordinates on block occurrences

Builder
Builder
Many thanks!

Yes, it's not too complicated but I was wodering if there was a more direct method to read sheet coordinates, also for making the process a bit faster.

Again, many thanks for the code, it will save me a lot of work.