// Copyright (C) 2003 Dominique Devriese // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // 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. #include "builtin_stuff.h" #include #include "object_constructor.h" #include "lists.h" #include "special_constructors.h" #include "guiaction.h" #include "../objects/angle_type.h" #include "../objects/arc_type.h" #include "../objects/circle_type.h" #include "../objects/conic_types.h" #include "../objects/cubic_type.h" #include "../objects/intersection_types.h" #include "../objects/inversion_type.h" #include "../objects/line_imp.h" #include "../objects/line_type.h" #include "../objects/object_imp.h" #include "../objects/other_imp.h" #include "../objects/other_type.h" #include "../objects/point_type.h" #include "../objects/tests_type.h" #include "../objects/transform_types.h" #include "../objects/vector_type.h" #include "../objects/polygon_type.h" #include void setupBuiltinStuff() { static bool done = false; if ( ! done ) { ObjectConstructorList* ctors = ObjectConstructorList::instance(); GUIActionList* actions = GUIActionList::instance(); ObjectConstructor* c = 0; // segment... c = new SimpleObjectTypeConstructor( SegmentABType::instance(), I18N_NOOP( "Segment" ), I18N_NOOP( "A segment constructed from its start and end point" ), "segment" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_segment", TQt::Key_S ) ); // line by two points.. c = new SimpleObjectTypeConstructor( LineABType::instance(), I18N_NOOP( "Line by Two Points" ), I18N_NOOP( "A line constructed through two points"), "line" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_linettp", TQt::Key_L ) ); // ray by two points.. c = new SimpleObjectTypeConstructor( RayABType::instance(), I18N_NOOP( "Half-Line" ), I18N_NOOP( "A half-line by its start point, and another point somewhere on it." ), "ray" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_ray", TQt::Key_R ) ); // perpendicular line c = new SimpleObjectTypeConstructor( LinePerpendLPType::instance(), I18N_NOOP( "Perpendicular" ), I18N_NOOP( "A line constructed through a point, perpendicular to another line or segment." ), "perpendicular" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_lineperpend" ) ); // parallel line c = new SimpleObjectTypeConstructor( LineParallelLPType::instance(), I18N_NOOP( "Parallel" ), I18N_NOOP( "A line constructed through a point, and parallel to another line or segment" ), "parallel" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_lineparallel" ) ); // circle c = new SimpleObjectTypeConstructor( CircleBCPType::instance(), I18N_NOOP( "Circle by Center && Point" ), I18N_NOOP( "A circle constructed by its center and a point that pertains to it" ), "circlebcp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_circlebcp", TQt::Key_C ) ); c = new SimpleObjectTypeConstructor( CircleBTPType::instance(), I18N_NOOP( "Circle by Three Points" ), I18N_NOOP( "A circle constructed through three points" ), "circlebtp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_circlebtp" ) ); // declare this object static to this function, so it gets deleted // at the end of the program, without us having to wonder about // deleting it.. We don't want to register this // object-constructor, because that way, "construct the bisector" // would appear twice in the angle popup menu: once as the generic // construct a property stuff, and once because of this ctor.. // we only register the guiaction, cause it makes sense to have a // toolbar icon for this.. static PropertyObjectConstructor anglebisectionctor( AngleImp::stype(), I18N_NOOP( "Construct Bisector of This Angle" ), I18N_NOOP( "Select the angle you want to construct the bisector of..." ), I18N_NOOP( "Angle Bisector" ), I18N_NOOP( "The bisector of an angle" ), "angle_bisector", "angle-bisector" ); actions->add( new ConstructibleAction( &anglebisectionctor, "objects_new_angle_bisector" ) ); // conic stuff c = new SimpleObjectTypeConstructor( ConicB5PType::instance(), I18N_NOOP( "Conic by Five Points" ), I18N_NOOP( "A conic constructed through five points" ), "conicb5p" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_conicb5p" ) ); c = new SimpleObjectTypeConstructor( ConicBAAPType::instance(), I18N_NOOP( "Hyperbola by Asymptotes && Point" ), I18N_NOOP( "A hyperbola with given asymptotes through a point" ), "conicbaap" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_conicbaap" ) ); c = new SimpleObjectTypeConstructor( EllipseBFFPType::instance(), I18N_NOOP( "Ellipse by Focuses && Point" ), // focuses is used in preference to foci I18N_NOOP( "An ellipse constructed by its focuses and a point that pertains to it" ), "ellipsebffp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_ellipsebffp" ) ); c = new SimpleObjectTypeConstructor( HyperbolaBFFPType::instance(), I18N_NOOP( "Hyperbola by Focuses && Point" ), // focuses is used in preference to foci I18N_NOOP( "A hyperbola constructed by its focuses and a point that pertains to it" ), "hyperbolabffp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_hyperbolabffp" ) ); c = new SimpleObjectTypeConstructor( ConicBDFPType::instance(), I18N_NOOP( "Conic by Directrix, Focus && Point" ), I18N_NOOP( "A conic with given directrix and focus, through a point" ), "conicbdfp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_conicbdfp" ) ); c = new SimpleObjectTypeConstructor( ParabolaBTPType::instance(), I18N_NOOP( "Vertical Parabola by Three Points" ), I18N_NOOP( "A vertical parabola constructed through three points" ), "parabolabtp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_parabolabtp" ) ); c = new SimpleObjectTypeConstructor( CubicB9PType::instance(), I18N_NOOP( "Cubic Curve by Nine Points" ), I18N_NOOP( "A cubic curve constructed through nine points" ), "cubicb9p" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_cubicb9p" ) ); c = new SimpleObjectTypeConstructor( ConicPolarPointType::instance(), I18N_NOOP( "Polar Point of a Line" ), I18N_NOOP( "The polar point of a line with respect to a conic." ), "polarpoint" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_pointpolar" ) ); c = new SimpleObjectTypeConstructor( ConicPolarLineType::instance(), I18N_NOOP( "Polar Line of a Point" ), I18N_NOOP( "The polar line of a point with respect to a conic." ), "polarline" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_linepolar" ) ); c = new SimpleObjectTypeConstructor( CubicNodeB6PType::instance(), I18N_NOOP( "Cubic Curve with Node by Six Points" ), I18N_NOOP( "A cubic curve with a nodal point at the origin through six points" ), "cubicnodeb6p" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_cubicnodeb6p" ) ); c = new SimpleObjectTypeConstructor( CubicCuspB4PType::instance(), I18N_NOOP( "Cubic Curve with Cusp by Four Points" ), I18N_NOOP( "A cubic curve with a horizontal cusp at the origin through four points" ), "cubiccuspb4p" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_cubiccuspb4p" ) ); c = new SimpleObjectTypeConstructor( ConicDirectrixType::instance(), I18N_NOOP( "Directrix of a Conic" ), I18N_NOOP( "The directrix line of a conic." ), "directrix" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_linedirectrix" ) ); c = new SimpleObjectTypeConstructor( AngleType::instance(), I18N_NOOP( "Angle by Three Points" ), I18N_NOOP( "An angle defined by three points" ), "angle" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_angle", TQt::Key_A ) ); c = new SimpleObjectTypeConstructor( EquilateralHyperbolaB4PType::instance(), I18N_NOOP( "Equilateral Hyperbola by Four Points" ), I18N_NOOP( "An equilateral hyperbola constructed through four points" ), "equilateralhyperbolab4p" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_equilateralhyperbolab4p" ) ); { // now for the Mid Point action. It does both the mid point of // a segment, and the mid point of two points. The midpoint of // two segments just shows the mid point property, and therefore // doesn't need to be added to the ctors, because there are // already facilities to construct an object's properties.. // therefore, we add only an mpotp to the ctors, and add the // merged constructor only to the actions.. ctors->add( new MidPointOfTwoPointsConstructor() ); ObjectConstructor* mpotp = new MidPointOfTwoPointsConstructor(); ObjectConstructor* mpos = new PropertyObjectConstructor( SegmentImp::stype(), I18N_NOOP( "Construct the midpoint of this segment" ), "", "", "", "", "mid-point" ); // make this a static object, so it gets deleted at the end of // the program. static MergeObjectConstructor m( I18N_NOOP( "Mid Point" ), I18N_NOOP( "The midpoint of a segment or two other points" ), "bisection" ); m.merge( mpotp ); m.merge( mpos ); actions->add( new ConstructibleAction( &m, "objects_new_midpoint", TQt::Key_M ) ); }; c = new SimpleObjectTypeConstructor( VectorType::instance(), I18N_NOOP( "Vector" ), I18N_NOOP( "Construct a vector from two given points." ), "vector" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_vector", TQt::Key_V ) ); c = new SimpleObjectTypeConstructor( VectorSumType::instance(), I18N_NOOP( "Vector Sum" ), I18N_NOOP( "Construct the vector sum of two vectors." ), "vectorsum" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_vectorsum", 0 ) ); c = new SimpleObjectTypeConstructor( LineByVectorType::instance(), I18N_NOOP( "Line by Vector" ), I18N_NOOP( "Construct the line by a given vector though a given point." ), "linebyvector" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_linebyvector", 0 ) ); c = new SimpleObjectTypeConstructor( HalflineByVectorType::instance(), I18N_NOOP( "Half-Line by Vector" ), I18N_NOOP( "Construct the half-line by a given vector starting at given point." ), "halflinebyvector" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_halflinebyvector", 0 ) ); c = new SimpleObjectTypeConstructor( ArcBTPType::instance(), I18N_NOOP( "Arc by Three Points" ), I18N_NOOP( "Construct an arc through three points." ), "arc" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_arcbtp" ) ); c = new SimpleObjectTypeConstructor( ArcBCPAType::instance(), I18N_NOOP( "Arc by Center, Angle && Point" ), I18N_NOOP( "Construct an arc by its center and a given angle, " "starting at a given point" ), "arcbcpa" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_arcbcpa" ) ); c = new SimpleObjectTypeConstructor( ParabolaBDPType::instance(), I18N_NOOP( "Parabola by Directrix && Focus" ), I18N_NOOP( "A parabola defined by its directrix and focus" ), "parabolabdp" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_parabolabdp" ) ); // Transformation stuff.. c = new InversionConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_inversion" ) ); c = new SimpleObjectTypeConstructor( TranslatedType::instance(), I18N_NOOP( "Translate" ), I18N_NOOP( "The translation of an object by a vector" ), "translation" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_translation" ) ); c = new SimpleObjectTypeConstructor( PointReflectionType::instance(), I18N_NOOP( "Reflect in Point" ), I18N_NOOP( "An object reflected in a point" ), "centralsymmetry" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_pointreflection" ) ); c = new SimpleObjectTypeConstructor( LineReflectionType::instance(), I18N_NOOP( "Reflect in Line" ), I18N_NOOP( "An object reflected in a line" ), "mirrorpoint" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_linereflection" ) ); c = new SimpleObjectTypeConstructor( RotationType::instance(), I18N_NOOP( "Rotate" ), I18N_NOOP( "An object rotated by an angle around a point" ), "rotation" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_rotation" ) ); c = new SimpleObjectTypeConstructor( ScalingOverCenterType::instance(), I18N_NOOP( "Scale" ), I18N_NOOP( "Scale an object over a point, by the ratio given by the length of a segment" ), "scale" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_scalingovercenter" ) ); c = new SimpleObjectTypeConstructor( ScalingOverLineType::instance(), I18N_NOOP( "Scale over Line" ), I18N_NOOP( "An object scaled over a line, by the ratio given by the length of a segment" ), "stretch" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_scalingoverline" ) ); c = new SimpleObjectTypeConstructor( ScalingOverCenter2Type::instance(), I18N_NOOP( "Scale (ratio given by two segments)" ), I18N_NOOP( "Scale an object over a point, by the ratio given by the length of two segments" ), "scale" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_scalingovercenter2" ) ); c = new SimpleObjectTypeConstructor( ScalingOverLine2Type::instance(), I18N_NOOP( "Scale over Line (ratio given by two segments)" ), I18N_NOOP( "An object scaled over a line, by the ratio given by the length of two segments" ), "stretch" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_scalingoverline2" ) ); c = new SimpleObjectTypeConstructor( SimilitudeType::instance(), I18N_NOOP( "Apply Similitude" ), I18N_NOOP( "Apply a similitude to an object ( the sequence of a scaling and rotation around a center )" ), "similitude" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_similitude" ) ); c = new SimpleObjectTypeConstructor( HarmonicHomologyType::instance(), I18N_NOOP( "Harmonic Homology" ), I18N_NOOP( "The harmonic homology with a given center and a given axis (this is a projective transformation)" ), "harmonichomology" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_harmonichomology" ) ); c = new GenericAffinityConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_genericaffinity" ) ); c = new GenericProjectivityConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_genericprojectivity" ) ); c = new SimpleObjectTypeConstructor( CastShadowType::instance(), I18N_NOOP( "Draw Projective Shadow" ), I18N_NOOP( "The shadow of an object with a given light source and projection plane (indicated by a line)" ), "castshadow" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_castshadow" ) ); // c = new SimpleObjectTypeConstructor( // ProjectiveRotationType::instance(), // I18N_NOOP( "Rotate Projectively" ), // I18N_NOOP( "An object projectively rotated by an angle and a half-line" ), // "projectiverotation" ); // ctors->add( c ); // actions->add( new ConstructibleAction( c, "objects_new_projectiverotation" ) ); c = new MultiObjectTypeConstructor( ConicAsymptoteType::instance(), I18N_NOOP( "Asymptotes of a Hyperbola" ), I18N_NOOP( "The two asymptotes of a hyperbola." ), "conicasymptotes", -1, 1 ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_lineconicasymptotes" ) ); c = new ConicRadicalConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_lineconicradical") ); /* ----------- start polygons --------- */ c = new SimpleObjectTypeConstructor( TriangleB3PType::instance(), I18N_NOOP( "Triangle by Its Vertices" ), I18N_NOOP( "Construct a triangle given its three vertices." ), "triangle" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_trianglebtp" ) ); c = new PolygonBNPTypeConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_polygonbnp" )); c = new PolygonBCVConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_polygonbcv" ) ); c = new PolygonVertexTypeConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_polygonvertices" )); c = new PolygonSideTypeConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_polygonsides" )); c = new SimpleObjectTypeConstructor( ConvexHullType::instance(), I18N_NOOP( "Convex Hull" ), I18N_NOOP( "A polygon that corresponds to the convex hull of another polygon" ), "convexhull" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_convexhull" ) ); /* ----------- end polygons --------- */ c = new LocusConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_locus" ) ); // tests c = new TestConstructor( AreParallelType::instance(), I18N_NOOP( "Parallel Test" ), I18N_NOOP( "Test whether two given lines are parallel" ), "testparallel" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_areparallel" ) ); c = new TestConstructor( AreOrthogonalType::instance(), I18N_NOOP( "Orthogonal Test" ), I18N_NOOP( "Test whether two given lines are orthogonal" ), "testorthogonal" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_areorthogonal" ) ); c = new TestConstructor( AreCollinearType::instance(), I18N_NOOP( "Collinear Test" ), I18N_NOOP( "Test whether three given points are collinear" ), "testcollinear" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_arecollinear" ) ); c = new TestConstructor( ContainsTestType::instance(), I18N_NOOP( "Contains Test" ), I18N_NOOP( "Test whether a given curve contains a given point" ), "testcontains" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_containstest" ) ); c = new TestConstructor( InPolygonTestType::instance(), I18N_NOOP( "In Polygon Test" ), I18N_NOOP( "Test whether a given polygon contains a given point" ), "test" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_inpolygontest" ) ); c = new TestConstructor( ConvexPolygonTestType::instance(), I18N_NOOP( "Convex Polygon Test" ), I18N_NOOP( "Test whether a given polygon is convex" ), "test" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_convexpolygontest" ) ); c = new TestConstructor( SameDistanceType::instance(), I18N_NOOP( "Distance Test" ), I18N_NOOP( "Test whether a given point have the same distance from a given point " "and from another given point" ), "testdistance" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_distancetest" ) ); c = new TestConstructor( VectorEqualityTestType::instance(), I18N_NOOP( "Vector Equality Test" ), I18N_NOOP( "Test whether two vectors are equal" ), "test" ); // "testequal" ); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_vectorequalitytest" ) ); c = new MeasureTransportConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_measuretransport" )); // c = new SimpleObjectTypeConstructor( // MeasureTransportType::instance(), // I18N_NOOP( "Measure Transport" ), // I18N_NOOP( "Transport the measure of a segment or arc over a line or circle." ), // "measuretransport" ); // ctors->add( c ); // actions->add( new ConstructibleAction( c, "objects_new_measuretransport" ) ); // the generic intersection constructor.. c = new GenericIntersectionConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_intersection", TQt::Key_I ) ); // the generic tangent constructor c = new TangentConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_tangent", TQt::Key_T ) ); // the generic center of curvature constructor c = new CocConstructor(); ctors->add( c ); actions->add( new ConstructibleAction( c, "objects_new_centerofcurvature" ) ); actions->add( new ConstructPointAction( "objects_new_normalpoint" ) ); actions->add( new ConstructTextLabelAction( "objects_new_textlabel" ) ); actions->add( new AddFixedPointAction( "objects_new_point_xy" ) ); #ifdef KIG_ENABLE_PYTHON_SCRIPTING #include "../scripting/script-common.h" actions->add( new NewScriptAction( I18N_NOOP( "Python Script" ), I18N_NOOP( "Construct a new Python script." ), "objects_new_script_python", ScriptType::Python ) ); #endif #if 0 actions->add( new TestAction( "test_stuff" ) ); #endif }; done = true; }