~librecad-dev/librecad/librecad

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/****************************************************************************
**
** This file is part of the LibreCAD project, a 2D CAD program
**
** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
**
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file gpl-2.0.txt included in the
** packaging of this file.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
**
** This copyright notice MUST APPEAR in all copies of the script!
**
**********************************************************************/


#ifndef RS_INSERT_H
#define RS_INSERT_H

#include "rs_entitycontainer.h"

class RS_BlockList;

/**
 * Holds the data that defines an insert.
 */
class RS_InsertData {
public:
        /**
         * Default constructor.
         */
    RS_InsertData() {}

    /**
     * @param name The name of the block used as an identifier.
     * @param insertionPoint Insertion point of the block.
     * @param scaleFactor Scale factor in x / y.
     * @param angle Rotation angle.
     * @param cols Number of cols if we insert a whole array.
     * @param rows Number of rows if we insert a whole array.
     * @param spacing Spacing between rows and cols.
     * @param blockSource Source for the block to insert if other than parent.
     *    Normally blocks are requested from the entity's parent but the
     *    block can also come from another resource. RS_Text uses that
     *    to share the blocks (letters) from a font.
     * @param updateMode RS2::Update will update the insert entity instantly
     *    RS2::NoUpdate will not update the insert. You can update
     *	  it later manually using the update() method. This is
     *    often the case since you might want to adjust attributes
     *    after creating an insert entity.
     */
    RS_InsertData(const QString& name,
                  RS_Vector insertionPoint,
                  RS_Vector scaleFactor,
                  double angle,
                  int cols, int rows, RS_Vector spacing,
                  RS_BlockList* blockSource = NULL,
                  RS2::UpdateMode updateMode = RS2::Update) {
        this->name = name;
        this->insertionPoint = insertionPoint;
        this->scaleFactor = scaleFactor;
        this->angle = angle;
        this->cols = cols;
        this->rows = rows;
        this->spacing = spacing;
        this->blockSource = blockSource;
        this->updateMode = updateMode;

    }

    friend class RS_Insert;

    friend std::ostream& operator << (std::ostream& os,
                                      const RS_InsertData& d) {
        os << "(" << d.name.toLatin1().data() << ")";
        return os;
    }

    QString name;
    RS_Vector insertionPoint;
    RS_Vector scaleFactor;
    double angle;
    int cols, rows;
    RS_Vector spacing;
    RS_BlockList* blockSource;
    RS2::UpdateMode updateMode;
};



/**
 * An insert inserts a block into the drawing at a certain location
 * with certain attributes (angle, scale, ...).
 * Inserts don't really contain other entities internally. They just
 * refer to a block. However, to the outside world they act exactly
 * like EntityContainer.
 *
 * @author Andrew Mustun
 */
class RS_Insert : public RS_EntityContainer {
public:
    RS_Insert(RS_EntityContainer* parent,
              const RS_InsertData& d);
    virtual ~RS_Insert();

    virtual RS_Entity* clone() {
        RS_Insert* i = new RS_Insert(*this);
        i->setOwner(isOwner());
        i->initId();
        i->detach();
        return i;
    }

    /** @return RS2::EntityInsert */
    virtual RS2::EntityType rtti() const {
        return RS2::EntityInsert;
    }

    /** @return Copy of data that defines the insert. **/
    RS_InsertData getData() const {
        return data;
    }

        /**
         * Reimplementation of reparent. Invalidates block cache pointer.
         */
    virtual void reparent(RS_EntityContainer* parent) {
                RS_Entity::reparent(parent);
                block = NULL;
    }

    RS_Block* getBlockForInsert();

    virtual void update();

    QString getName() const {
        return data.name;
    }

        void setName(const QString& newName) {
                data.name = newName;
                update();
        }

    RS_Vector getInsertionPoint() const {
        return data.insertionPoint;
    }
    void setInsertionPoint(const RS_Vector& i) {
        data.insertionPoint = i;
    }

    RS_Vector getScale() const {
        return data.scaleFactor;
    }

        void setScale(const RS_Vector& s) {
                data.scaleFactor = s;
        }

    double getAngle() const {
        return data.angle;
    }
    void setAngle(double a) {
        data.angle = a;
    }

    int getCols() const {
        return data.cols;
    }
        void setCols(int c) {
                data.cols = c;
        }

    int getRows() const {
        return data.rows;
    }
        void setRows(int r) {
                data.rows = r;
        }

    RS_Vector getSpacing() const {
        return data.spacing;
    }
        void setSpacing(const RS_Vector& s) {
                data.spacing = s;
        }

    virtual bool isVisible();

    virtual RS_VectorSolutions getRefPoints();
    virtual RS_Vector getMiddlePoint(void) const{
            return RS_Vector(false);
    }
    virtual RS_Vector getNearestRef(const RS_Vector& coord,
                                     double* dist = NULL) ;

    virtual void move(const RS_Vector& offset);
    virtual void rotate(const RS_Vector& center, const double& angle);
    virtual void rotate(const RS_Vector& center, const RS_Vector& angleVector);
    virtual void scale(const RS_Vector& center, const RS_Vector& factor);
    virtual void mirror(const RS_Vector& axisPoint1, const RS_Vector& axisPoint2);

    friend std::ostream& operator << (std::ostream& os, const RS_Insert& i);

protected:
    RS_InsertData data;
        RS_Block* block;
};


#endif