72 myCreateEdgeFrameParent(createEdgeFrameParent),
73 myDefaultEdgeType(new
GNEEdgeType(createEdgeFrameParent)),
76 myUseDefaultEdgeType =
new FXRadioButton(getCollapsableFrame(),
TL(
"Create default edge"),
79 myNoPedestriansCheckButton =
new FXCheckButton(getCollapsableFrame(),
TL(
"Disallow for pedestrians"),
81 myAddSidewalkCheckButton =
new FXCheckButton(getCollapsableFrame(),
TL(
"Add Sidewalk"),
84 myUseCustomEdgeType =
new FXRadioButton(getCollapsableFrame(),
TL(
"Use edgeType/template"),
101 myUseDefaultEdgeType->setCheck(TRUE);
103 for (
const auto& junction : createEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
104 if (junction.second->getNBNode()->getCrossings().size() > 0) {
105 enableCheckBoxDisablePedestrians();
121 const int index = myEdgeTypesComboBox->getCurrentItem();
125 if (myUseDefaultEdgeType->getCheck()) {
127 myAddSidewalkCheckButton->enable();
128 myNoPedestriansCheckButton->enable();
130 myCreateFromTemplate->disable();
132 myEdgeTypesComboBox->disable();
134 myAddEdgeTypeButton->disable();
135 myDeleteEdgeTypeButton->disable();
137 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myDefaultEdgeType, {
SUMO_ATTR_ID});
139 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
140 }
else if (myUseCustomEdgeType->getCheck()) {
142 myAddSidewalkCheckButton->disable();
143 myNoPedestriansCheckButton->disable();
145 myAddEdgeTypeButton->enable();
146 myDeleteEdgeTypeButton->enable();
148 if (myEdgeTypesComboBox->getNumItems() == 0) {
150 myEdgeTypesComboBox->disable();
151 myDeleteEdgeTypeButton->disable();
153 myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
154 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
157 myCreateFromTemplate->enable();
159 myEdgeTypesComboBox->enable();
161 myDeleteEdgeTypeButton->disable();
163 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(templateEditor->
getEdgeTemplate(), {SUMO_ATTR_ID});
164 myCreateEdgeFrameParent->myEdgeTypeAttributes->disableAttributesCreator();
166 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
169 myCreateFromTemplate->disable();
171 myEdgeTypesComboBox->enable();
173 myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(),
false);
175 if (myEdgeTypeSelected) {
177 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myEdgeTypeSelected, {});
179 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
182 myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
184 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
186 myEdgeTypesComboBox->setTextColor(FXRGB(255, 0, 0));
197 for (
int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
198 if (myEdgeTypesComboBox->getItem(i).text() == oldID) {
199 myEdgeTypesComboBox->setItemText(i, newID.c_str());
207 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
208 if ((myUseCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
221 return (myUseDefaultEdgeType->getCheck() == TRUE);
227 myNoPedestriansCheckButton->setCheck(TRUE);
233 return myDefaultEdgeType;
239 if (myUseDefaultEdgeType->getCheck() == TRUE) {
240 return myDefaultEdgeType;
242 return myEdgeTypeSelected;
249 return (myNoPedestriansCheckButton->getCheck() == TRUE);
255 return (myAddSidewalkCheckButton->getCheck() == TRUE);
261 myEdgeTypeSelected =
nullptr;
263 if (myCurrentIndex < 0) {
271 for (
int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
272 if (myEdgeTypesComboBox->getItem(i).text() == edgeType->
getID()) {
274 myEdgeTypesComboBox->setCurrentItem(i);
277 myUseDefaultEdgeType->setCheck(FALSE);
278 myUseCustomEdgeType->setCheck(TRUE);
280 refreshEdgeTypeSelector();
288 myUseDefaultEdgeType->setCheck(FALSE);
289 myUseCustomEdgeType->setCheck(TRUE);
290 refreshEdgeTypeSelector();
297 if (obj == myUseDefaultEdgeType) {
299 myUseDefaultEdgeType->setCheck(TRUE);
300 myUseCustomEdgeType->setCheck(FALSE);
303 myUseDefaultEdgeType->setCheck(FALSE);
304 myUseCustomEdgeType->setCheck(TRUE);
307 refreshEdgeTypeSelector();
317 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(
GUIIcon::EDGE,
"create new edge type");
318 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(edgeType,
true),
true);
319 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
321 myEdgeTypeSelected = edgeType;
323 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
325 refreshEdgeTypeSelector();
333 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
334 myEdgeTypeSelected =
nullptr;
339 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(
GUIIcon::EDGE,
"delete edge type");
340 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(edgeType,
false),
true);
341 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
343 refreshEdgeTypeSelector();
351 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
353 refreshEdgeTypeSelector();
360 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
364 edgeType->
copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
366 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(
GUIIcon::EDGE,
"create new edge type");
367 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(edgeType,
true),
true);
368 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
370 myEdgeTypeSelected = edgeType;
372 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
374 refreshEdgeTypeSelector();
382 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
383 myNoPedestriansCheckButton->setCheck(TRUE);
384 myNoPedestriansCheckButton->disable();
386 myNoPedestriansCheckButton->enable();
397 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
399 myEdgeTypesComboBox->clearItems();
401 myEdgeTypesComboBox->setTextColor(FXRGB(0, 0, 0));
404 myEdgeTypesComboBox->appendItem((
"template: " + templateEditor->
getEdgeTemplate()->
getID()).c_str(),
nullptr);
407 for (
const auto& edgeType : edgeTypes) {
408 myEdgeTypesComboBox->appendItem(edgeType.second->getID().c_str(),
nullptr);
411 if (myEdgeTypesComboBox->getNumItems() <= 10) {
412 myEdgeTypesComboBox->setNumVisible(myEdgeTypesComboBox->getNumItems());
414 myEdgeTypesComboBox->setNumVisible(10);
417 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
418 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
420 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
429 myCreateEdgeFrameParent(createEdgeFrameParent),
453 refreshLaneTypeSelector();
462 myCreateEdgeFrameParent->myLaneTypeAttributes->hideAttributesCreatorModule();
471 myLaneTypesComboBox->clearItems();
473 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
474 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
477 myLaneTypesComboBox->appendItem(laneTemplate->getAttribute(
SUMO_ATTR_ID).c_str(),
nullptr);
482 myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeTemplate->
getLaneTemplates().at(myLaneIndex), {SUMO_ATTR_ID});
484 myCreateEdgeFrameParent->myLaneTypeAttributes->disableAttributesCreator();
486 myAddLaneTypeButton->disable();
487 myDeleteLaneTypeButton->disable();
490 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
493 myLaneTypesComboBox->appendItem(laneType->getAttribute(
SUMO_ATTR_ID).c_str(),
nullptr);
498 myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeType->
getLaneTypes().at(myLaneIndex), {});
500 myAddLaneTypeButton->enable();
503 myDeleteLaneTypeButton->enable();
505 myDeleteLaneTypeButton->disable();
516 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType()) {
518 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->addLaneType(
new GNELaneType(myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()));
520 refreshLaneTypeSelector();
522 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
523 }
else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
525 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
530 for (
const auto& laneType : edgeType->getLaneTypes()) {
536 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(
GUIIcon::LANE,
"add laneType");
537 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(edgeType,
false),
true);
538 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(newEdgeType,
true),
true);
539 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
541 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
543 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
553 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType()) {
555 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->removeLaneType(myLaneIndex);
557 refreshLaneTypeSelector();
559 myLaneTypesComboBox->setCurrentItem(0);
560 }
else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
562 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
567 for (
int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
568 if (i != myLaneIndex) {
573 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(
GUIIcon::LANE,
"remove laneType");
574 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(edgeType,
false),
true);
575 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(
new GNEChange_EdgeType(newEdgeType,
true),
true);
576 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
578 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
580 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
590 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
592 refreshLaneTypeSelector();
600 if (myLaneIndex > myLaneTypesComboBox->getNumItems()) {
604 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
606 if (myLaneTypesComboBox->getNumItems() <= 10) {
607 myLaneTypesComboBox->setNumVisible(myLaneTypesComboBox->getNumItems());
609 myLaneTypesComboBox->setNumVisible(10);
619 std::ostringstream information;
622 <<
TL(
"- ESC:") <<
"\n"
623 <<
TL(
" Deselect origin") <<
"\n"
624 <<
TL(
"- Control+Click:") <<
"\n"
625 <<
TL(
" Move view") <<
"\n"
626 <<
TL(
"- Shift+Click:") <<
"\n"
627 <<
TL(
" Splits edge in both directions") <<
"\n"
628 <<
TL(
"- Alt+Shift+Click:") <<
"\n"
629 <<
TL(
" Splits edge in one direction");
642 GNEFrame(viewParent, viewNet,
"Create Edge"),
663 const bool oppositeEdge,
const bool chainEdge) {
666 WRITE_WARNING(
TL(
"Select either default edgeType or a custom edgeType or template"));
684 if (junction ==
nullptr) {
740 std::cout <<
"edge created without an open CommandGroup )-:\n";
835 for (
const auto& lane : edge->
getLanes()) {
839 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(
SUMO_ATTR_DISALLOW));
841 if (std::find(disallowList.begin(), disallowList.end(),
"pedestrian") == disallowList.end()) {
842 disallowList.push_back(
"pedestrian");
853 bool sidewalkFound =
false;
855 for (
const auto& lane : edge->
getLanes()) {
858 sidewalkFound =
true;
862 if (!sidewalkFound) {
FXDEFMAP(GNECreateEdgeFrame::EdgeTypeSelector) EdgeTypeSelectorMap[]
@ MID_GNE_CREATEEDGEFRAME_CREATEFROMTEMPLATE
create edge type from template
@ MID_GNE_CREATEEDGEFRAME_CHECKBUTTON
check button
@ MID_GNE_CREATEEDGEFRAME_SELECTTEMPLATE
select edge template
@ MID_GNE_CREATEEDGEFRAME_DELETE
delete edge type
@ MID_GNE_CREATEEDGEFRAME_ADD
add new edge type
@ MID_GNE_CREATEEDGEFRAME_SELECTLANE
select lane (used for default and template edges)
@ MID_GNE_CREATEEDGEFRAME_SELECTRADIOBUTTON
#define GUIDesignComboBoxAttribute
Combo box static (cannot be edited) extended over the matrix column.
#define GUIDesignComboBoxNCol
number of column of every combo box
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
#define GUIDesignCheckButton
checkButton placed in left position
#define GUIDesignRadioButton
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
#define WRITE_WARNING(msg)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
const std::string getID() const
get ID (all Attribute Carriers have one)
GNENet * getNet() const
get pointer to net
bool areValuesValid() const
check if parameters of attributes are valid
GNEEdgeType * getEdgeTypeSelected() const
get edgeType selected
~EdgeTypeSelector()
destructor
void useTemplate()
use template
GNEEdgeType * getDefaultEdgeType() const
get default edgeType
bool useEdgeTemplate() const
check if we have to use edge template
void updateIDinComboBox(const std::string &oldID, const std::string &newID)
update id in comboBox
long onCmdAddEdgeType(FXObject *, FXSelector, void *)
Called when the user press button for add a new edge type.
void enableCheckBoxDisablePedestrians()
void enable checkbox for disable pedestrians
bool useDefaultEdgeType() const
check if we're using default edge type
long onCmdDeleteEdgeType(FXObject *, FXSelector, void *)
Called when the user press button for delete edge type.
long onUpdAddSideWalk(FXObject *, FXSelector, void *)
Called when add sidewalk check buton is updated.
GNEEdgeType * myDefaultEdgeType
default edge type
long onCmdCreateFromTemplate(FXObject *, FXSelector, void *)
Called when the user press create edgeType from Template.
bool isAddSidewalkEnabled() const
check if add sidewalk check button is enabled
void fillComboBox()
fill comboBox
void refreshEdgeTypeSelector()
refresh edge type selector
bool isNoPedestriansEnabled() const
check if no pedestrian check button is enabled
long onCmdRadioButton(FXObject *, FXSelector, void *)
void setCurrentEdgeType(const GNEEdgeType *edgeType)
set current edgeType
void clearEdgeTypeSelected()
clear edgeType selected
long onCmdSelectEdgeTypeOrTemplate(FXObject *, FXSelector, void *)
Called when the user press select an edgeType or template in comboBox.
void updateComboBox()
update comboBox
long onCmdSelectLaneType(FXObject *, FXSelector, void *)
Called when the user press select an laneType in comboBox.
FXButton * myDeleteLaneTypeButton
button for delete lane type
FXComboBox * myLaneTypesComboBox
ComboBox for lane types.
void showLaneTypeSelector()
show lane type selector
LaneTypeSelector(GNECreateEdgeFrame *createEdgeFrameParent)
FOX-declaration.
void hideLaneTypeSelector()
hide lane type selector
~LaneTypeSelector()
destructor
long onCmdAddLaneType(FXObject *, FXSelector, void *)
FXButton * myAddLaneTypeButton
button for create new lane type
long onCmdDeleteLaneType(FXObject *, FXSelector, void *)
Called when the user press button for delete lane type.
void refreshLaneTypeSelector()
refresh LaneTypeSelector
Legend(GNECreateEdgeFrame *createEdgeFrameParent)
constructor
void processClick(const Position &clickedPosition, const GNEViewNetHelper::ObjectsUnderCursor &objectsUnderCursor, const bool oppositeEdge, const bool chainEdge)
handle processClick and set the relative colouring
EdgeTypeSelector * getEdgeTypeSelector() const
get edgeType selector
void abortEdgeCreation()
abort current edge creation
void show()
show create edge frame
GNECreateEdgeFrame::LaneTypeSelector * myLaneTypeSelector
lane type selector
GNEAttributesCreator * getLaneTypeAttributes() const
get laneType attributes
void updateObjectsUnderSnappedCursor(const std::vector< GUIGlObject * > &GUIGlObjects)
update objects under snapped cursor
GNEAttributesCreator * myEdgeTypeAttributes
internal edgeType attributes
GNEAttributesCreator * getEdgeTypeAttributes() const
get edgeType attributes
const GNEJunction * getJunctionSource() const
get junction source for new edge
GNEAttributesCreator * myLaneTypeAttributes
internal laneType attributes
~GNECreateEdgeFrame()
Destructor.
void disablePedestrians(GNEEdge *edge) const
disable pedestrians in the given edge (within undoRedo)
GNECreateEdgeFrame::Legend * myLegend
Legend.
GNEJunction * myCreateEdgeSource
source junction for new edge
GNEViewNetHelper::ObjectsUnderCursor myObjectsUnderSnappedCursor
objects under snapped cursor
GNECreateEdgeFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
void hide()
hide create edge frame
void addSidewalk(GNEEdge *edge) const
disable pedestrians in the given edge (within undoRedo)
EdgeTypeSelector * myEdgeTypeSelector
edge type selector
void setUseEdgeTemplate()
set default to using edge template
LaneTypeSelector * getLaneTypeSelector()
get lane type selector
A road/street connecting two junctions (netedit-version)
void copyEdgeType(const GNEEdgeType *edgeType, GNEUndoList *undoList)
copy edge attributes from edgeType
NBEdge * getNBEdge() const
returns the internal NBEdge
const std::vector< GNELane * > & getLanes() const
returns a reference to the lane vector
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
const std::vector< GNELaneTemplate * > & getLaneTemplates() const
get vector with the lane templates of this edge
void copyTemplate(const GNEEdgeTemplate *edgeTemplate)
copy edge template
const std::vector< GNELaneType * > & getLaneTypes() const
get laneTypes
void addLaneType(GNELaneType *laneType)
add laneType
GNEViewNet * myViewNet
FOX need this.
virtual void show()
show Frame
virtual void hide()
hide Frame
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
TemplateEditor * getTemplateEditor() const
get template editor
void markAsCreateEdgeSource()
marks as first junction in createEdge-mode
void unMarkAsCreateEdgeSource()
removes mark as first junction in createEdge-mode
std::vector< GNEEdge * > retrieveEdges(GNEJunction *from, GNEJunction *to) const
get all edges by from and to GNEJunction
GNEEdgeType * retrieveEdgeType(const std::string &id, bool hardFail=true) const
get edge type by id
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
GNEEdge * createEdge(GNEJunction *src, GNEJunction *dest, GNEEdge *edgeTemplate, GNEUndoList *undoList, const std::string &suggestedName="", bool wasSplit=false, bool allowDuplicateGeom=false, bool recomputeConnections=true)
creates a new edge (unless an edge with the same geometry already exists)
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
bool hasCommandGroup() const
Check if undoList has command group.
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
class used to group all variables related with objects under cursor after a click over view
void updateObjectUnderCursor(const std::vector< GUIGlObject * > &GUIGlObjects)
update objects under cursor (Called only in onLeftBtnPress(...) function)
GNEJunction * getJunctionFront() const
get front junction or a pointer to nullptr
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
void setStatusBarText(const std::string &text)
set statusBar text
A single child window which contains a view of the simulation area.
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
Position snapToActiveGrid(const Position &pos, bool snapXY=true) const
Returns a position that is mapped to the closest grid point if the grid is active.
MFXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
const std::string & getID() const
A point in 2D or 3D with translation and scaling methods.