X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchAPI%2FSketchAPI_Sketch.cpp;h=8058fa5852acb12e0594f734d130c6f783098b7d;hb=f68074b0f3e013e10a9d06016ceac84827a5cdc2;hp=ce765e71bd9fb8961bb7032e23f026d76eb03283;hpb=63f80d9837b4dcb16e9fafc3b07fac36f6f7b00d;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index ce765e71b..8058fa585 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -1,6 +1,6 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D // Name : SketchAPI_Sketch.cpp -// Purpose: +// Purpose: // // History: // 07/06/16 - Sergey POKHODENKO - Creation of the file @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -24,12 +24,14 @@ #include #include #include +#include #include #include #include //-------------------------------------------------------------------------------------- #include #include +#include #include #include #include @@ -37,9 +39,11 @@ #include //-------------------------------------------------------------------------------------- #include "SketchAPI_Arc.h" +#include "SketchAPI_MacroArc.h" #include "SketchAPI_Circle.h" #include "SketchAPI_IntersectionPoint.h" #include "SketchAPI_Line.h" +#include "SketchAPI_MacroCircle.h" #include "SketchAPI_Mirror.h" #include "SketchAPI_Point.h" #include "SketchAPI_Projection.h" @@ -124,8 +128,6 @@ void SketchAPI_Sketch::setValue( const std::shared_ptr & theConstraint, const ModelHighAPI_Double & theValue) { - // TODO(spo): check somehow that the feature is a constraint or eliminate - // crash if the feature have no real attribute VALUE fillAttribute(theValue, theConstraint->feature()->real(SketchPlugin_Constraint::VALUE())); // theConstraint->execute(); @@ -156,7 +158,6 @@ std::list SketchAPI_Sketch::selectFace() const SketchPtr addSketch(const std::shared_ptr & thePart, const std::shared_ptr & thePlane) { - // TODO(spo): check that thePart is not empty std::shared_ptr aFeature = thePart->addFeature(SketchAPI_Sketch::ID()); return SketchPtr(new SketchAPI_Sketch(aFeature, thePlane)); } @@ -164,7 +165,6 @@ SketchPtr addSketch(const std::shared_ptr & thePart, SketchPtr addSketch(const std::shared_ptr & thePart, const ModelHighAPI_Selection & theExternal) { - // TODO(spo): check that thePart is not empty std::shared_ptr aFeature = thePart->addFeature(SketchAPI_Sketch::ID()); return SketchPtr(new SketchAPI_Sketch(aFeature, theExternal)); } @@ -172,7 +172,6 @@ SketchPtr addSketch(const std::shared_ptr & thePart, SketchPtr addSketch(const std::shared_ptr & thePart, const std::string & theExternalName) { - // TODO(spo): check that thePart is not empty std::shared_ptr aFeature = thePart->addFeature(SketchAPI_Sketch::ID()); return SketchPtr( new SketchAPI_Sketch(aFeature, ModelHighAPI_Selection("FACE", theExternalName))); @@ -190,27 +189,27 @@ SketchPtr addSketch(const std::shared_ptr & thePart, std::shared_ptr SketchAPI_Sketch::addPoint( double theX, double theY) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Point::ID()); return PointPtr(new SketchAPI_Point(aFeature, theX, theY)); } std::shared_ptr SketchAPI_Sketch::addPoint( const std::shared_ptr & thePoint) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Point::ID()); return PointPtr(new SketchAPI_Point(aFeature, thePoint)); } -std::shared_ptr +std::shared_ptr SketchAPI_Sketch::addPoint(const ModelHighAPI_Selection & theExternal) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Point::ID()); return PointPtr(new SketchAPI_Point(aFeature, theExternal)); } std::shared_ptr SketchAPI_Sketch::addPoint(const std::string & theExternalName) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Point::ID()); return PointPtr(new SketchAPI_Point(aFeature, theExternalName)); } @@ -219,23 +218,23 @@ std::shared_ptr SketchAPI_Sketch::addPoint(const std::string & std::shared_ptr SketchAPI_Sketch::addIntersectionPoint( const ModelHighAPI_Selection & theExternal) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_IntersectionPoint::ID()); return IntersectionPointPtr(new SketchAPI_IntersectionPoint(aFeature, theExternal)); } std::shared_ptr SketchAPI_Sketch::addIntersectionPoint( const std::string & theExternalName) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_IntersectionPoint::ID()); return IntersectionPointPtr(new SketchAPI_IntersectionPoint(aFeature, theExternalName)); } //-------------------------------------------------------------------------------------- -std::shared_ptr SketchAPI_Sketch::addLine(double theX1, double theY1, +std::shared_ptr SketchAPI_Sketch::addLine(double theX1, double theY1, double theX2, double theY2) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Line::ID()); return LinePtr(new SketchAPI_Line(aFeature, theX1, theY1, theX2, theY2)); } @@ -243,29 +242,29 @@ std::shared_ptr SketchAPI_Sketch::addLine( const std::shared_ptr & theStartPoint, const std::shared_ptr & theEndPoint) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Line::ID()); return LinePtr(new SketchAPI_Line(aFeature, theStartPoint, theEndPoint)); } -std::shared_ptr +std::shared_ptr SketchAPI_Sketch::addLine(const ModelHighAPI_Selection & theExternal) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Line::ID()); return LinePtr(new SketchAPI_Line(aFeature, theExternal)); } std::shared_ptr SketchAPI_Sketch::addLine(const std::string & theExternalName) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Line::ID()); return LinePtr(new SketchAPI_Line(aFeature, theExternalName)); } //-------------------------------------------------------------------------------------- -std::shared_ptr SketchAPI_Sketch::addRectangle(double theX1, double theY1, +std::shared_ptr SketchAPI_Sketch::addRectangle(double theX1, double theY1, double theX2, double theY2) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchAPI_Rectangle::ID()); return RectanglePtr(new SketchAPI_Rectangle(aFeature, theX1, theY1, theX2, theY2)); } @@ -273,7 +272,7 @@ std::shared_ptr SketchAPI_Sketch::addRectangle( const std::shared_ptr & theStartPoint, const std::shared_ptr & theEndPoint) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchAPI_Rectangle::ID()); return RectanglePtr(new SketchAPI_Rectangle(aFeature, theStartPoint, theEndPoint)); } @@ -283,7 +282,7 @@ std::shared_ptr SketchAPI_Sketch::addCircle(double theCenterX, double theCenterY, double theRadius) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); return CirclePtr(new SketchAPI_Circle(aFeature, theCenterX, theCenterY, theRadius)); } @@ -292,34 +291,56 @@ std::shared_ptr SketchAPI_Sketch::addCircle( const std::shared_ptr& theCenter, double theRadius) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); return CirclePtr(new SketchAPI_Circle(aFeature, theCenter, theRadius)); } -std::shared_ptr SketchAPI_Sketch::addCircle(double theX1, double theY1, - double theX2, double theY2, - double theX3, double theY3) +std::shared_ptr SketchAPI_Sketch::addCircle(double theCenterX, + double theCenterY, + double thePassedX, + double thePassedY) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); - return CirclePtr(new SketchAPI_Circle(aFeature, theX1, theY1, theX2, theY2, theX3, theY3)); + return MacroCirclePtr(new SketchAPI_MacroCircle(aFeature, theCenterX, theCenterY, + thePassedX, thePassedY)); } -std::shared_ptr SketchAPI_Sketch::addCircle( - const std::shared_ptr& thePoint1, - const std::shared_ptr& thePoint2, - const std::shared_ptr& thePoint3) +std::shared_ptr SketchAPI_Sketch::addCircle( + const std::shared_ptr& theCenterPoint, + const std::shared_ptr& thePassedPoint) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); - return CirclePtr(new SketchAPI_Circle(aFeature, thePoint1, thePoint2, thePoint3)); + return MacroCirclePtr(new SketchAPI_MacroCircle(aFeature, theCenterPoint, thePassedPoint)); } -std::shared_ptr +std::shared_ptr SketchAPI_Sketch::addCircle(double theX1, double theY1, + double theX2, double theY2, + double theX3, double theY3) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_Circle::ID()); + return MacroCirclePtr(new SketchAPI_MacroCircle(aFeature, theX1, theY1, + theX2, theY2, + theX3, theY3)); +} + +std::shared_ptr SketchAPI_Sketch::addCircle( + const std::shared_ptr& thePoint1, + const std::shared_ptr& thePoint2, + const std::shared_ptr& thePoint3) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_Circle::ID()); + return MacroCirclePtr(new SketchAPI_MacroCircle(aFeature, thePoint1, thePoint2, thePoint3)); +} + +std::shared_ptr SketchAPI_Sketch::addCircle(const ModelHighAPI_Selection & theExternal) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); return CirclePtr(new SketchAPI_Circle(aFeature, theExternal)); } @@ -327,7 +348,7 @@ std::shared_ptr std::shared_ptr SketchAPI_Sketch::addCircle(const std::string & theExternalName) { // TODO(spo): Add constraint SketchConstraintRigid like in PythonAPI. Is it necessary? - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Circle::ID()); return CirclePtr(new SketchAPI_Circle(aFeature, theExternalName)); } @@ -338,7 +359,7 @@ std::shared_ptr SketchAPI_Sketch::addArc(double theCenterX, doubl double theEndX, double theEndY, bool theInversed) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); return ArcPtr(new SketchAPI_Arc(aFeature, theCenterX, theCenterY, @@ -353,56 +374,57 @@ std::shared_ptr SketchAPI_Sketch::addArc( const std::shared_ptr& theEnd, bool theInversed) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); return ArcPtr(new SketchAPI_Arc(aFeature, theCenter, theStart, theEnd, theInversed)); } -std::shared_ptr SketchAPI_Sketch::addArc(double theStartX, double theStartY, +std::shared_ptr SketchAPI_Sketch::addArc(double theStartX, double theStartY, double theEndX, double theEndY, double thePassedX, double thePassedY) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); - return ArcPtr(new SketchAPI_Arc(aFeature, - theStartX, theStartY, - theEndX, theEndY, - thePassedX, thePassedY)); + return MacroArcPtr(new SketchAPI_MacroArc(aFeature, + theStartX, theStartY, + theEndX, theEndY, + thePassedX, thePassedY)); } -std::shared_ptr SketchAPI_Sketch::addArc( +std::shared_ptr SketchAPI_Sketch::addArc( const std::shared_ptr& theStart, const std::shared_ptr& theEnd, const std::shared_ptr& thePassed) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); - return ArcPtr(new SketchAPI_Arc(aFeature, theStart, theEnd, thePassed)); + return MacroArcPtr(new SketchAPI_MacroArc(aFeature, theStart, theEnd, thePassed)); } -std::shared_ptr SketchAPI_Sketch::addArc( +std::shared_ptr SketchAPI_Sketch::addArc( const ModelHighAPI_RefAttr& theTangentPoint, double theEndX, double theEndY, bool theInversed) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); - return ArcPtr(new SketchAPI_Arc(aFeature, theTangentPoint, theEndX, theEndY, theInversed)); + return MacroArcPtr(new SketchAPI_MacroArc( + aFeature, theTangentPoint, theEndX, theEndY, theInversed)); } -std::shared_ptr SketchAPI_Sketch::addArc( +std::shared_ptr SketchAPI_Sketch::addArc( const ModelHighAPI_RefAttr& theTangentPoint, const std::shared_ptr& theEnd, bool theInversed) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); - return ArcPtr(new SketchAPI_Arc(aFeature, theTangentPoint, theEnd, theInversed)); + return MacroArcPtr(new SketchAPI_MacroArc(aFeature, theTangentPoint, theEnd, theInversed)); } std::shared_ptr SketchAPI_Sketch::addArc(const ModelHighAPI_Selection & theExternal) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); return ArcPtr(new SketchAPI_Arc(aFeature, theExternal)); } @@ -410,7 +432,7 @@ std::shared_ptr SketchAPI_Sketch::addArc(const ModelHighAPI_Selec std::shared_ptr SketchAPI_Sketch::addArc(const std::string & theExternalName) { // TODO(spo): Add constraint SketchConstraintRigid like in PythonAPI. Is it necessary? - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Arc::ID()); return ArcPtr(new SketchAPI_Arc(aFeature, theExternalName)); } @@ -419,7 +441,7 @@ std::shared_ptr SketchAPI_Sketch::addArc(const std::string & theE std::shared_ptr SketchAPI_Sketch::addProjection( const ModelHighAPI_Selection & theExternalFeature) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Projection::ID()); return ProjectionPtr(new SketchAPI_Projection(aFeature, theExternalFeature)); } @@ -427,7 +449,7 @@ std::shared_ptr SketchAPI_Sketch::addProjection( std::shared_ptr SketchAPI_Sketch::addProjection( const std::string & theExternalName) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Projection::ID()); return ProjectionPtr(new SketchAPI_Projection(aFeature, theExternalName)); } @@ -437,7 +459,7 @@ std::shared_ptr SketchAPI_Sketch::addMirror( const ModelHighAPI_RefAttr & theMirrorLine, const std::list > & theObjects) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintMirror::ID()); return MirrorPtr(new SketchAPI_Mirror(aFeature, theMirrorLine, theObjects)); } @@ -450,9 +472,9 @@ std::shared_ptr SketchAPI_Sketch::addTranslation( const ModelHighAPI_Integer & theNumberOfObjects, bool theFullValue) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_MultiTranslation::ID()); - return TranslationPtr(new SketchAPI_Translation(aFeature, theObjects, thePoint1, + return TranslationPtr(new SketchAPI_Translation(aFeature, theObjects, thePoint1, thePoint2, theNumberOfObjects, theFullValue)); } @@ -464,10 +486,10 @@ std::shared_ptr SketchAPI_Sketch::addRotation( const ModelHighAPI_Integer & theNumberOfObjects, bool theFullValue) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_MultiRotation::ID()); return RotationPtr( - new SketchAPI_Rotation(aFeature, theObjects, theCenter, + new SketchAPI_Rotation(aFeature, theObjects, theCenter, theAngle, theNumberOfObjects, theFullValue)); } @@ -477,7 +499,7 @@ std::shared_ptr SketchAPI_Sketch::addSplit( const ModelHighAPI_RefAttr& thePoint1, const ModelHighAPI_RefAttr& thePoint2) { - std::shared_ptr aFeature = + std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintSplit::ID()); fillAttribute(theFeature, aFeature->reference(SketchPlugin_Constraint::VALUE())); fillAttribute(thePoint1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); @@ -486,6 +508,24 @@ std::shared_ptr SketchAPI_Sketch::addSplit( return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } +//-------------------------------------------------------------------------------------- +std::shared_ptr SketchAPI_Sketch::addTrim( + const ModelHighAPI_Reference& theFeature, + const std::shared_ptr& thePositionPoint) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_Trim::ID()); + fillAttribute(theFeature, aFeature->reference(SketchPlugin_Trim::SELECTED_OBJECT())); + + AttributePtr anAttribute = aFeature->attribute(SketchPlugin_Trim::SELECTED_POINT()); + if (anAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) { + AttributePoint2DPtr aPointAttr = std::dynamic_pointer_cast(anAttribute); + fillAttribute(thePositionPoint, aPointAttr); + } + + return InterfacePtr(new ModelHighAPI_Interface(aFeature)); +} + //-------------------------------------------------------------------------------------- std::shared_ptr SketchAPI_Sketch::setAngle( const ModelHighAPI_RefAttr & theLine1, @@ -496,9 +536,10 @@ std::shared_ptr SketchAPI_Sketch::setAngle( compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); fillAttribute(SketcherPrs_Tools::ANGLE_DIRECT, aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); + // fill the value before llines to avoid calculation of angle value by the Angle feature + fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); - fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -588,17 +629,33 @@ std::shared_ptr SketchAPI_Sketch::setEqual( } std::shared_ptr SketchAPI_Sketch::setFillet( - const std::list & thePoints, - const ModelHighAPI_Double & theRadius) + const ModelHighAPI_RefAttr & thePoint) { std::shared_ptr aFeature = - compositeFeature()->addFeature(SketchPlugin_ConstraintFillet::ID()); - fillAttribute(thePoints, aFeature->data()->refattrlist(SketchPlugin_Constraint::ENTITY_A())); - fillAttribute(theRadius, aFeature->real(SketchPlugin_Constraint::VALUE())); - aFeature->execute(); + compositeFeature()->addFeature(SketchPlugin_Fillet::ID()); + fillAttribute(thePoint, aFeature->data()->refattr(SketchPlugin_Fillet::FILLET_POINT_ID())); + apply(); // finish operation to remove Fillet feature correcly return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } +std::shared_ptr SketchAPI_Sketch::setFilletWithRadius( + const ModelHighAPI_RefAttr & thePoint, + const ModelHighAPI_Double & theRadius) +{ + CompositeFeaturePtr aSketch = compositeFeature(); + int aNbSubs = aSketch->numberOfSubs(); + + // create fillet + InterfacePtr aFilletFeature = setFillet(thePoint); + + // set radius for just created arc + FeaturePtr anArc = aSketch->subFeature(aNbSubs - 1); + if (anArc->getKind() == SketchPlugin_Arc::ID()) + setRadius(ModelHighAPI_RefAttr(ObjectPtr(anArc->lastResult())), ModelHighAPI_Double(theRadius)); + + return aFilletFeature; +} + std::shared_ptr SketchAPI_Sketch::setFixed( const ModelHighAPI_RefAttr & theObject) { @@ -703,6 +760,22 @@ std::shared_ptr SketchAPI_Sketch::setVertical( //-------------------------------------------------------------------------------------- +std::shared_ptr SketchAPI_Sketch::to2D(const std::shared_ptr& thePoint) +{ + FeaturePtr aBase = feature(); + std::shared_ptr aC = std::dynamic_pointer_cast( + aBase->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + aBase->attribute(SketchPlugin_Sketch::NORM_ID())); + std::shared_ptr aX = std::dynamic_pointer_cast( + aBase->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); + + return thePoint->to2D(aC->pnt(), aX->dir(), aY); +} + +//-------------------------------------------------------------------------------------- + void SketchAPI_Sketch::dump(ModelHighAPI_Dumper& theDumper) const { FeaturePtr aBase = feature(); @@ -723,13 +796,15 @@ void SketchAPI_Sketch::dump(ModelHighAPI_Dumper& theDumper) const // Check the plane is coordinate plane std::string aPlaneName = defaultPlane(anOrigin, aNormal, aDirX); - if (anExternal->context()) { // checking for selected planes - if (!aPlaneName.empty()) { + if(anExternal->context()) { // checking for selected planes + if (!aPlaneName.empty() + && anExternal->context()->data() + && anExternal->context()->data()->name() == aPlaneName) { // dump sketch based on coordinate plane theDumper << aBase << " = model.addSketch(" << aDocName << ", model.standardPlane(\"" << aPlaneName << "\"))" << std::endl; } else { // some other plane - theDumper << aBase << " = model.addSketch(" << aDocName << + theDumper << aBase << " = model.addSketch(" << aDocName << ", " << anExternal<< ")" << std::endl; } } else {