Find the next step in your career as a Graphisoft Certified BIM Manager!

Archicad C++ API
About Archicad add-on development using the C++ API.
SOLVED!

API Calculate polyline length

Miha Nahtigal
Advocate

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

Accepted Solutions
Solution
Miha Nahtigal
Advocate

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
Mentor

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 - AC27 ARM AUS + CI Tools
Apple Mac Studio M1 Max Chip 10C CPU
24C GPU 7.8TF 32GB RAM OS Ventura

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

mthd
Mentor

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 - AC27 ARM AUS + CI Tools
Apple Mac Studio M1 Max Chip 10C CPU
24C GPU 7.8TF 32GB RAM OS Ventura
Solution
Miha Nahtigal
Advocate

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;
}