cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 
Developer forum

API Calculate polyline length

Miha Nahtigal
Enthusiast

Is there a simple way to fetch polyline length apart from looping through memo data, vertexes and arcs?

I couldn't find one... has anyone already been through this?

1 ACCEPTED SOLUTION

Solution
Miha Nahtigal
Enthusiast

I'll answer to myself...

 

// first point of memo.coords is dummy zeroes
for (short r = 2; r <= element.polyLine.poly.nCoords; r++) {
    segmentLength = sqrt(pow((*memo.coords)[r].x - (*memo.coords)[r - 1].x, 2) + pow((*memo.coords)[r].y - (*memo.coords)[r - 1].y, 2));
    arcIndex = FindArc(*memo.parcs, element.polyLine.poly.nArcs, r - 1);
    if (arcIndex >= 0) {
        // points with indexes r-1 and r are beginning and ending of an arc
        segmentLength = abs((*memo.parcs)[arcIndex].arcAngle) * segmentLength / 2 / sin(abs((*memo.parcs)[arcIndex].arcAngle)/2);
    }
    totalLength += segmentLength;
}

View solution in original post

4 REPLIES 4

mthd
Expert

I am guessing that you already tried the measure tool ? I am not as skilled with Archicad as some are but there must be a way to determine the length of a complicated polyline in creating a bill of quantities somehow ?

AC8.1 - AC24

I am asking for C++ implementation inside an addon.

mthd
Expert

Whoops ! I didn’t check the category first. That’s something I know nothing about lol. I hope you get a reply here from someone who knows. Have fun.

AC8.1 - AC24

Solution
Miha Nahtigal
Enthusiast

I'll answer to myself...

 

// first point of memo.coords is dummy zeroes
for (short r = 2; r <= element.polyLine.poly.nCoords; r++) {
    segmentLength = sqrt(pow((*memo.coords)[r].x - (*memo.coords)[r - 1].x, 2) + pow((*memo.coords)[r].y - (*memo.coords)[r - 1].y, 2));
    arcIndex = FindArc(*memo.parcs, element.polyLine.poly.nArcs, r - 1);
    if (arcIndex >= 0) {
        // points with indexes r-1 and r are beginning and ending of an arc
        segmentLength = abs((*memo.parcs)[arcIndex].arcAngle) * segmentLength / 2 / sin(abs((*memo.parcs)[arcIndex].arcAngle)/2);
    }
    totalLength += segmentLength;
}

Still looking?

Browse more topics

Back to forum

See latest solutions

Accepted solutions

Start a new discussion!