File: special_calcers.cc

package info (click to toggle)
kig 4%3A25.08.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,716 kB
  • sloc: cpp: 41,465; xml: 851; python: 486; perl: 23; sh: 17; makefile: 3
file content (71 lines) | stat: -rw-r--r-- 2,299 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// SPDX-FileCopyrightText: 2004 Dominique Devriese <devriese@kde.org>

// SPDX-License-Identifier: GPL-2.0-or-later

#include "special_calcers.h"

static const ArgsParser::spec argsspecMeasureTransport[] = {{CircleImp::stype(), I18N_NOOP("Transport a measure on this circle")},
                                                            {PointImp::stype(), I18N_NOOP("Project this point onto the circle")},
                                                            {SegmentImp::stype(), I18N_NOOP("Segment to transport")}};

static ArgsParser measuretransportargsparser(argsspecMeasureTransport, 3);

std::vector<ObjectCalcer *> MeasureTransportCalcer::parents() const
{
    std::vector<ObjectCalcer *> ret;
    ret.push_back(mcircle);
    ret.push_back(mpoint);
    ret.push_back(msegment);
    return ret;
}

MeasureTransportCalcer::MeasureTransportCalcer(ObjectCalcer *circle, ObjectCalcer *point, ObjectCalcer *segment)
    : mcircle(circle)
    , mpoint(point)
    , msegment(segment)
    , mimp(0)
{
}

MeasureTransportCalcer::~MeasureTransportCalcer()
{
}

void MeasureTransportCalcer::calc(const KigDocument &)
{
    if (!measuretransportargsparser.checkArgs(parents()))
        return new InvalidImp();

    if (!isPointOnCurve(mpoint, mcircle))
        return new InvalidImp();

    const CircleImp *c = static_cast<const CircleImp *>(mcircle->imp());
    const PointImp *p = static_cast<const PointImp *>(mpoint->imp());
    const SegmentImp *s = static_cast<const SegmentImp *>(msegment->imp());
    double param = c->getParam(p->coordinate(), doc);
    double measure = s->length();
    measure /= 2 * c->radius() * M_PI;
    param += measure;
    while (param > 1)
        param -= 1;

    const Coordinate nc = c->getPoint(param, doc);
    if (nc.valid())
        return new PointImp(nc);
    else
        return new InvalidImp;
}

const ObjectImpType *MeasureTransportCalcer::impRequirement(ObjectCalcer *o, const std::vector<ObjectCalcer *> &os) const
{
    if (o->imp()->inherits(CircleImp::stype()))
        return CircleImp::stype();
    else if (o->imp()->inherits(PointImp::stype()))
        return PointImp::stype();
    else if (o->imp()->inherits(SegmentImp::stype()))
        return SegmentImp::stype();
    else {
        assert(false);
        return nullptr;
    }
}