KiCad PCB EDA Suite
Loading...
Searching...
No Matches
altium_parser_pcb.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2020 Thomas Pointhuber <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#ifndef ALTIUM_PARSER_PCB_H
22#define ALTIUM_PARSER_PCB_H
23
24#include <cstdint>
25#include <cstring>
26#include <limits>
27#include <map>
28#include <memory>
29#include <set>
30#include <vector>
31
32#include <wx/gdicmn.h>
33
34#include <math/vector2d.h>
35#include <math/vector3.h>
36
37
38// tthis constant specifies an unconnected net
39const uint16_t ALTIUM_NET_UNCONNECTED = std::numeric_limits<uint16_t>::max();
40
41// this constant specifies a item which is not inside an component
42const uint16_t ALTIUM_COMPONENT_NONE = std::numeric_limits<uint16_t>::max();
43
44// this constant specifies a item which does not define a polygon
45const uint16_t ALTIUM_POLYGON_NONE = std::numeric_limits<uint16_t>::max();
46
47// 65534 seems to be belonging to board outline
48const uint16_t ALTIUM_POLYGON_BOARD = std::numeric_limits<uint16_t>::max() - 1;
49
50// bits of the keepout restriction mask carried by tracks, arcs, fills and regions
51const uint8_t ALTIUM_KEEPOUT_VIA = 0x01;
52const uint8_t ALTIUM_KEEPOUT_TRACK = 0x02;
53const uint8_t ALTIUM_KEEPOUT_COPPER = 0x04;
54const uint8_t ALTIUM_KEEPOUT_SMD_PAD = 0x08;
55const uint8_t ALTIUM_KEEPOUT_TH_PAD = 0x10;
56const uint8_t ALTIUM_KEEPOUT_ALL = 0x1F;
57
58
59enum class ALTIUM_UNIT
60{
62
63 INCH = 1,
64 MILS = 2,
65 MM = 3,
66 CM = 4
67};
68
82
98
100{
102
103 COPPER = 0, // KIND=0
104 POLYGON_CUTOUT = 1, // KIND=1
105 DASHED_OUTLINE = 2, // KIND=2
106 UNKNOWN_3 = 3, // KIND=3
107 CAVITY_DEFINITION = 4, // KIND=4
108 BOARD_CUTOUT = 5, // KIND=0 AND ISBOARDCUTOUT=TRUE
109};
110
128
130{
135};
136
138{
140
141 ARC = 1,
142 PAD = 2,
143 VIA = 3,
144 TRACK = 4,
145 TEXT = 5,
146 FILL = 6,
147 REGION = 11,
148 MODEL = 12
149};
150
152{
155 RECT = 2,
157};
158
160{
163 RECT = 2, // TODO: valid?
164 OCTAGONAL = 3, // TODO: valid?
166};
167
169{
171 ROUND = 0,
174};
175
182
183enum class ALTIUM_MODE
184{
186 NONE = 0, // TODO: correct ID?
187 RULE = 1,
189};
190
202
204{
205 MANUAL = 0, // only relevant for NAMEAUTOPOSITION and COMMENTAUTOPOSITION
215};
216
218{
220
224};
225
227{
230};
231
233{
234 const bool isRound;
235 const int32_t radius;
236 const double startangle;
237 const double endangle;
240
241 explicit ALTIUM_VERTICE( const VECTOR2I& aPosition )
242 : isRound( false ),
243 radius( 0 ),
244 startangle( 0. ),
245 endangle( 0. ),
246 position( aPosition ),
247 center( VECTOR2I( 0, 0 ) )
248 {
249 }
250
251 explicit ALTIUM_VERTICE( bool aIsRound, int32_t aRadius, double aStartAngle, double aEndAngle,
252 const VECTOR2I aPosition, const VECTOR2I aCenter )
253 : isRound( aIsRound ),
254 radius( aRadius ),
255 startangle( aStartAngle ),
256 endangle( aEndAngle ),
257 position( aPosition ),
258 center( aCenter )
259 {
260 }
261};
262
263
273void altium_parse_polygons( std::map<wxString, wxString>& aProps,
274 std::vector<ALTIUM_VERTICE>& aVertices, int* aDiscarded = nullptr );
275
276
277enum class ALTIUM_LAYER : uint32_t
278{
280
313
320
337
340
357
368
369 // V7 format layers
370 V7_START = 0x01000000,
371
372 V7_COPPER_BASE = 0x01000000,
375
376 V7_MECHANICAL_BASE = 0x01020000,
380
381 // V8 format layers
382 V8_OTHER_BASE = 0x01030000,
404};
405
406// Specifies values from LayerKindMapping
408{
410
413
415 BOARD = 0x04,
416
419
422
425
428
431
435
436 FAB_NOTES = 0x12,
437
440
443
444 VALUE_TOP = 0x17,
445 VALUE_BOT = 0x18,
446
447 V_CUT = 0x19,
448
451
453 SHEET = 0x1D,
455};
456
458
465
481
483{
484 uint32_t layerId = 0;
485 wxString name;
486
487 size_t nextId;
488 size_t prevId;
489
490 int32_t copperthick;
491
496
497 bool mechenabled = false;
499
500 explicit ABOARD6_LAYER_STACKUP( const std::map<wxString, wxString>& aProps, const wxString& aPrefix,
501 uint32_t aLayerIdFallback );
502};
503
505{
507 std::vector<ABOARD6_LAYER_STACKUP> stackup;
508 std::set<wxString> layerNames;
509
510 explicit ALIBRARY( ALTIUM_BINARY_PARSER& aReader );
511};
512
514{
515 // ORIGINX/ORIGINY, the user's relative origin. Distinct from the sheet placement below
517
518 // SHEETX/SHEETY, the drawing sheet corner. Not a design origin
520 wxSize sheetsize;
521
523 std::vector<ABOARD6_LAYER_STACKUP> stackup;
524 std::set<wxString> layerNames;
525
526 std::vector<ALTIUM_VERTICE> board_vertices;
527
528 // Vertices the file placed outside the representable coordinate range
530
531 explicit ABOARD6( ALTIUM_BINARY_PARSER& aReader );
532};
533
535{
536 wxString name;
537 wxString uniqueid;
538
540
541 std::vector<wxString> names;
542
543 explicit ACLASS6( ALTIUM_BINARY_PARSER& aReader );
544};
545
567
601
602struct AMODEL
603{
604 wxString name;
605 wxString id;
607
609 double z_offset;
610 int32_t checksum;
611
612 explicit AMODEL( ALTIUM_BINARY_PARSER& aReader );
613};
614
615struct ANET6
616{
617 wxString name;
618
619 explicit ANET6( ALTIUM_BINARY_PARSER& aReader );
620};
621
623{
627 uint16_t net;
628 bool locked;
629
631
632 int32_t gridsize;
633 int32_t trackwidth;
636
637 // Note: Altium pour index is the opposite of KiCad zone priority!
638 int32_t pourindex;
639
640 std::vector<ALTIUM_VERTICE> vertices;
641
642 // Vertices the file placed outside the representable coordinate range
644
645 explicit APOLYGON6( ALTIUM_BINARY_PARSER& aReader );
646};
647
648
649struct ARULE6
650{
651 wxString name;
652 int priority = 0;
653 bool enabled = true;
654
656
657 wxString scope1expr;
658 wxString scope2expr;
659
660 // ALTIUM_RULE_KIND::CLEARANCE
661 // ALTIUM_RULE_KIND::HOLE_TO_HOLE_CLEARANCE
663
664 // ALTIUM_RULE_KIND::WIDTH
665 // ALTIUM_RULE_KIND::HOLE_SIZE
666 int minLimit = 0;
667 int maxLimit = 0;
668
669 // ALTIUM_RULE_KIND::WIDTH
671
672 // ALTIUM_RULE_KIND::ROUTING_VIAS
673 int width = 0;
674 int minWidth = 0;
675 int maxWidth = 0;
676 int holeWidth = 0;
679
680 // ALTIUM_RULE_KIND::PLANE_CLEARANCE
682
683 // ALTIUM_RULE_KIND::SOLDER_MASK_EXPANSION
685
686 // ALTIUM_RULE_KIND::PASTE_MASK_EXPANSION
688
689 // ALTIUM_RULE_KIND::POLYGON_CONNECT
694
695 // TODO: implement different types of rules we need to parse
696
697 ARULE6() = default;
698 explicit ARULE6( ALTIUM_BINARY_PARSER& aReader );
699};
700
702{
706
708
712 uint16_t net;
713 uint16_t component;
714 uint16_t polygon;
715 uint16_t subpolyindex;
717 uint16_t holecount;
718
719 ALTIUM_REGION_KIND kind; // I assume this means if normal or keepout?
720
721 std::vector<ALTIUM_VERTICE> outline;
722 std::vector<std::vector<ALTIUM_VERTICE>> holes;
723
724 explicit AREGION6( ALTIUM_BINARY_PARSER& aReader, bool aExtendedVertices );
725};
726
751
753{
754 uint16_t component = 0;
755
756 wxString body_name;
757 int kind = 0;
759 int unionindex = 0;
761 bool is_shape_based = false;
767 double body_opacity_3d = 0.0;
768 wxString identifier;
769 wxString texture;
775
776 wxString modelId;
778 bool modelIsEmbedded = false;
779 wxString modelName;
780 int modelType = 0;
781 int modelSource = 0;
783
786 double rotation = 0.0;
787
788 explicit ACOMPONENTBODY6( ALTIUM_BINARY_PARSER& aReader );
789};
790
803
850
851struct AVIA6
852{
853 bool is_locked = false;
854 bool is_tent_top = false;
855 bool is_tent_bottom = false;
856 bool is_test_fab_top = false;
857 bool is_test_fab_bottom = false;
858
859 uint16_t net = 0;
860
862 uint32_t pos_tolerance = 2147483640; // 2147483640 is N/A
863 uint32_t neg_tolerance = 2147483640; // 2147483640 is N/A
864 uint32_t diameter = 0;
865 uint32_t holesize = 0;
866
870
875
876 // When true, the manual solder mask expansion is measured outward from the hole edge rather
877 // than from the via land (copper) edge. Altium "Solder Mask Expansion From The Hole Edge".
879
883
884 // In PAD_MODE::SIMPLE, this is the same as the diameter
885 // In PAD_MODE::TOP_MIDDLE_BOTTOM, layer 0 is top, layer 1 is middle, layer 31 is bottom
886 // In PAD_MODE::FULL_STACK, layers correspond to the layer number
887 uint32_t diameter_by_layer[32]{ 0 };
888
889 explicit AVIA6( ALTIUM_BINARY_PARSER& aReader );
890};
891
914
915// Interactive length-tuning meander, stored in the SmartUnions stream and referenced by
916// copper primitives through their union index. Altium commits the tuned copper as ordinary
917// tracks and arcs, keeping the parametric meander definition here.
919{
920 int unionindex = 0;
921 bool is_tuning = false;
922 bool is_diffpair = false;
923
924 int style = 0;
925 int32_t gap = 0;
926 int32_t amplitude = 0;
927 int32_t minamplitude = 0;
928 double mitterradiusratio = 0.0;
929 bool singleside = false;
930
931 std::vector<VECTOR2I> baseline;
932 std::vector<VECTOR2I> baselinecoupled;
933
934 explicit ASMARTUNION6( ALTIUM_BINARY_PARSER& aReader );
935};
936
937struct ATEXT6
938{
940 {
944 };
945
946
950 uint16_t component = 0;
951
953 uint32_t height = 0;
954 double rotation = 0.0;
955 uint32_t strokewidth = 0;
957
958 bool isBold = false;
959 bool isItalic = false;
960 bool isMirrored = false;
961 bool isInverted = false;
962 bool isInvertedRect = false;
963 bool isFrame = false;
964 bool isOffsetBorder = false;
966
968 uint32_t textbox_rect_width = 0;
970 uint32_t text_offset_width = 0;
971
972 // Justification only applies when there is a text box size specified
973 // Then, the text is justified within the box
975
976 uint32_t widestring_index = 0;
977
978 bool isComment = false;
979 bool isDesignator = false;
980
982 wxString fontname;
984
985 // Barcode specific parameters
988 bool barcode_inverted = false;
989 wxString barcode_name;
990 bool barcode_show_text = false;
991
992 wxString text;
993
994 explicit ATEXT6( ALTIUM_BINARY_PARSER& aReader, std::map<uint32_t, wxString>& aStringTable );
995};
996
1015
1016
1021bool altiumScopeExprMatchesPolygon( const wxString& aExpr );
1022
1023
1033const ARULE6* selectAltiumPolygonRule( const std::vector<ARULE6>& aRulesByPriorityAsc );
1034
1035
1051bool altiumViaSideIsTented( bool aTentFlag, bool aManual, bool aFromHole, uint32_t aHoleSize,
1052 int32_t aMaskExpansion, int aLandDiameter );
1053
1054
1061VECTOR2I altiumSlotDrillSize( uint32_t aHoleSize, uint32_t aSlotSize, double aSlotRotation, bool& aRotationSupported );
1062
1063
1064#endif //ALTIUM_PARSER_PCB_H
bool altiumScopeExprMatchesPolygon(const wxString &aExpr)
Return true if an Altium rule scope expression targets polygon pour primitives (matches InPolygon,...
ALTIUM_REGION_KIND
ALTIUM_PAD_SHAPE_ALT
const uint8_t ALTIUM_KEEPOUT_VIA
ALTIUM_TEXT_POSITION
ALTIUM_CONNECT_STYLE
const uint8_t ALTIUM_KEEPOUT_COPPER
ALTIUM_MECHKIND
ALTIUM_POLYGON_HATCHSTYLE
ALTIUM_PAD_MODE
ALTIUM_UNIT
const uint8_t ALTIUM_KEEPOUT_SMD_PAD
ALTIUM_TEXT_TYPE
ALTIUM_RULE_KIND
ALTIUM_PAD_SHAPE
ALTIUM_BARCODE_TYPE
const uint8_t ALTIUM_KEEPOUT_TH_PAD
ALTIUM_DIMENSION_KIND
VECTOR2I altiumSlotDrillSize(uint32_t aHoleSize, uint32_t aSlotSize, double aSlotRotation, bool &aRotationSupported)
Convert an Altium slot's independent rotation and dimensions to KiCad's cardinal drill shape.
const uint8_t ALTIUM_KEEPOUT_TRACK
void altium_parse_polygons(std::map< wxString, wxString > &aProps, std::vector< ALTIUM_VERTICE > &aVertices, int *aDiscarded=nullptr)
Read the VX/VY/KIND/R/SA/EA/CX/CY vertex series out of a polygon or board outline record.
const ARULE6 * selectAltiumPolygonRule(const std::vector< ARULE6 > &aRulesByPriorityAsc)
Select the highest Altium-priority rule whose scope references polygons.
const uint8_t ALTIUM_KEEPOUT_ALL
ALTIUM_PAD_HOLE_SHAPE
const uint16_t ALTIUM_NET_UNCONNECTED
ALTIUM_CLASS_KIND
const uint16_t ALTIUM_POLYGON_NONE
bool altiumViaSideIsTented(bool aTentFlag, bool aManual, bool aFromHole, uint32_t aHoleSize, int32_t aMaskExpansion, int aLandDiameter)
Decide whether one side of an Altium via should be tented when imported into KiCad.
AEXTENDED_PRIMITIVE_INFORMATION_TYPE
const uint16_t ALTIUM_POLYGON_BOARD
ALTIUM_RECORD
const int ALTIUM_COMPONENT_NONE
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:410
Represent basic circle geometry with utility geometry functions.
Definition circle.h:33
Definition pad.h:61
A round rectangle shape, based on a rectangle and a radius.
Definition roundrect.h:32
@ SOLID
Definition eda_fill.h:43
@ NONE
Definition eda_fill.h:42
@ DIRECT
Unconstrained point-to-point.
@ VERTICAL
A segment (or two points) is vertical.
@ HORIZONTAL
A segment (or two points) is horizontal.
@ MANUAL
Text placement is manually set by the user.
#define MASK(x)
@ VIA
Normal via.
@ INCH
Definition rs274x.cpp:61
double startangle
uint16_t component
uint32_t unionindex
uint32_t width
ALTIUM_LAYER layer
AARC6(ALTIUM_BINARY_PARSER &aReader)
uint8_t keepoutrestrictions
uint16_t polygon
VECTOR2I center
uint32_t radius
uint16_t net
ALTIUM_LAYER layer_v6
ALTIUM_LAYER layer_v7
bool is_polygonoutline
double endangle
uint16_t subpolyindex
ABOARD6_LAYER_STACKUP(const std::map< wxString, wxString > &aProps, const wxString &aPrefix, uint32_t aLayerIdFallback)
VECTOR2I sheetpos
VECTOR2I origin
std::set< wxString > layerNames
ABOARD6(ALTIUM_BINARY_PARSER &aReader)
std::vector< ABOARD6_LAYER_STACKUP > stackup
std::vector< ALTIUM_VERTICE > board_vertices
wxString uniqueid
std::vector< wxString > names
ALTIUM_CLASS_KIND kind
wxString name
ACLASS6(ALTIUM_BINARY_PARSER &aReader)
wxString sourceHierachicalPath
ALTIUM_TEXT_POSITION commentautoposition
ALTIUM_TEXT_POSITION nameautoposition
ACOMPONENT6(ALTIUM_BINARY_PARSER &aReader)
wxString sourcefootprintlibrary
ALTIUM_LAYER layer
wxString sourcelibreference
wxString sourcedesignator
wxString sourceUniqueID
wxString sourcecomponentlibrary
ACOMPONENTBODY6(ALTIUM_BINARY_PARSER &aReader)
ALTIUM_UNIT textunit
uint32_t textlinewidth
ALTIUM_LAYER layer
ALTIUM_LAYER layer_v6
std::vector< VECTOR2I > textPoint
ALTIUM_DIMENSION_KIND kind
ALTIUM_LAYER layer_v7
ADIMENSION6(ALTIUM_BINARY_PARSER &aReader)
std::vector< VECTOR2I > referencePoint
AEXTENDED_PRIMITIVE_INFORMATION_TYPE type
AEXTENDED_PRIMITIVE_INFORMATION(ALTIUM_BINARY_PARSER &aReader)
VECTOR2I pos2
ALTIUM_LAYER layer
VECTOR2I pos1
uint8_t keepoutrestrictions
AFILL6(ALTIUM_BINARY_PARSER &aReader)
ALTIUM_LAYER layer_v6
uint16_t component
ALTIUM_LAYER layer_v7
std::set< wxString > layerNames
std::vector< ABOARD6_LAYER_STACKUP > stackup
ALIBRARY(ALTIUM_BINARY_PARSER &aReader)
ALTIUM_VERTICE(const VECTOR2I &aPosition)
const int32_t radius
const VECTOR2I center
const VECTOR2I position
const double endangle
const double startangle
ALTIUM_VERTICE(bool aIsRound, int32_t aRadius, double aStartAngle, double aEndAngle, const VECTOR2I aPosition, const VECTOR2I aCenter)
double z_offset
wxString id
int32_t checksum
wxString name
VECTOR3D rotation
AMODEL(ALTIUM_BINARY_PARSER &aReader)
ANET6(ALTIUM_BINARY_PARSER &aReader)
wxString name
ALTIUM_PAD_SHAPE inner_shape[29]
ALTIUM_PAD_HOLE_SHAPE holeshape
ALTIUM_PAD_SHAPE_ALT alt_shape[32]
double holerotation
int32_t soldermaskexpansionmanual
uint16_t net
ALTIUM_LAYER layer
APAD6(ALTIUM_BINARY_PARSER &aReader)
std::unique_ptr< APAD6_SIZE_AND_SHAPE > sizeAndShape
ALTIUM_LAYER layer_v7
ALTIUM_LAYER tolayer
ALTIUM_PAD_SHAPE topshape
ALTIUM_LAYER layer_v6
ALTIUM_PAD_MODE padmode
ALTIUM_MODE pastemaskexpansionmode
uint32_t holesize
double direction
ALTIUM_MODE soldermaskexpansionmode
wxString name
bool is_test_fab_bottom
int32_t pad_to_die_delay
bool is_tent_bottom
VECTOR2I botsize
ALTIUM_PAD_SHAPE botshape
uint16_t component
VECTOR2I midsize
ALTIUM_PAD_SHAPE midshape
int32_t pastemaskexpansionmanual
ALTIUM_LAYER fromlayer
VECTOR2I position
VECTOR2I topsize
bool is_test_fab_top
int32_t pad_to_die_length
ALTIUM_LAYER layer_v6
int32_t minprimlength
std::vector< ALTIUM_VERTICE > vertices
APOLYGON6(ALTIUM_BINARY_PARSER &aReader)
ALTIUM_LAYER layer_v7
ALTIUM_POLYGON_HATCHSTYLE hatchstyle
ALTIUM_LAYER layer
uint8_t keepoutrestrictions
ALTIUM_LAYER layer
AREGION6(ALTIUM_BINARY_PARSER &aReader, bool aExtendedVertices)
ALTIUM_LAYER layer_v7
uint16_t holecount
ALTIUM_LAYER layer_v6
std::vector< ALTIUM_VERTICE > outline
uint16_t subpolyindex
std::vector< std::vector< ALTIUM_VERTICE > > holes
uint16_t component
uint16_t polygon
ALTIUM_REGION_KIND kind
ALTIUM_RULE_KIND kind
ALTIUM_CONNECT_STYLE polygonconnectStyle
wxString scope1expr
wxString name
int planeclearanceClearance
int32_t polygonconnectReliefconductorwidth
int pastemaskExpansion
ARULE6()=default
wxString scope2expr
int soldermaskExpansion
int32_t polygonconnectAirgapwidth
int polygonconnectReliefentries
std::vector< VECTOR2I > baselinecoupled
std::vector< VECTOR2I > baseline
ASMARTUNION6(ALTIUM_BINARY_PARSER &aReader)
uint32_t text_offset_width
VECTOR2I barcode_margin
uint32_t textbox_rect_height
uint16_t component
bool barcode_show_text
ALTIUM_LAYER layer_v6
ALTIUM_TEXT_POSITION textbox_rect_justification
bool isInvertedRect
wxString text
uint32_t widestring_index
uint32_t textbox_rect_width
double rotation
uint32_t margin_border_width
uint32_t height
wxString fontname
bool isJustificationValid
ALTIUM_BARCODE_TYPE barcode_type
ALTIUM_LAYER layer
VECTOR2I position
ALTIUM_LAYER layer_v7
ALTIUM_TEXT_TYPE fonttype
STROKE_FONT_TYPE strokefonttype
wxString barcode_fontname
bool isOffsetBorder
ATEXT6(ALTIUM_BINARY_PARSER &aReader, std::map< uint32_t, wxString > &aStringTable)
bool barcode_inverted
wxString barcode_name
uint32_t strokewidth
ALTIUM_LAYER layer_v6
uint32_t unionindex
ATRACK6(ALTIUM_BINARY_PARSER &aReader)
uint32_t width
bool is_polygonoutline
ALTIUM_LAYER layer_v7
uint16_t polygon
uint16_t subpolyindex
uint8_t keepoutrestrictions
VECTOR2I start
ALTIUM_LAYER layer
uint16_t component
bool soldermask_expansion_linked
uint32_t thermal_relief_conductorcount
uint32_t diameter
uint32_t neg_tolerance
uint16_t net
VECTOR2I position
int32_t thermal_relief_airgap
bool is_test_fab_top
bool soldermask_expansion_from_hole
int32_t soldermask_expansion_front
uint32_t pos_tolerance
bool is_tent_bottom
bool is_test_fab_bottom
bool soldermask_expansion_manual
ALTIUM_PAD_MODE viamode
AVIA6(ALTIUM_BINARY_PARSER &aReader)
uint32_t thermal_relief_conductorwidth
int32_t soldermask_expansion_back
uint32_t diameter_by_layer[32]
ALTIUM_LAYER layer_start
ALTIUM_LAYER layer_end
uint32_t holesize
static const long long MM
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708
VECTOR3< double > VECTOR3D
Definition vector3.h:230