// 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 "other_type.h" #include "bogus_imp.h" #include "point_imp.h" #include "locus_imp.h" #include "../misc/common.h" #include "../misc/calcpaths.h" #include "../misc/goniometry.h" #include "../kig/kig_part.h" #include "../kig/kig_view.h" #include "../kig/kig_commands.h" #include #include #include using std::find; static const struct ArgsParser::spec argsspecLocus[] = { { HierarchyImp::stype(), "hierarchy", "SHOULD NOT BE SEEN", false }, { CurveImp::stype(), "curve", "SHOULD NOT BE SEEN", false } }; KIG_INSTANTIATE_OBJECT_TYPE_INSTANCE( LocusType ) LocusType::LocusType() : ArgsParserObjectType( "Locus", argsspecLocus, 2 ) { } LocusType::~LocusType() { } ObjectImp* LocusType::calc( const Args& args, const KigDocument& ) const { using namespace std; assert( args.size() >= 2 ); const Args firsttwo( args.begin(), args.begin() + 2 ); Args fixedargs( args.begin() + 2, args.end() ); if ( ! margsparser.checkArgs( firsttwo ) ) return new InvalidImp; for ( Args::iterator i = fixedargs.begin(); i != fixedargs.end(); ++i ) if ( ! (*i)->valid() ) return new InvalidImp; const ObjectHierarchy& hier = static_cast( args[0] )->data(); const CurveImp* curveimp = static_cast( args[1] ); return new LocusImp( curveimp->copy(), hier.withFixedArgs( fixedargs ) ); } bool LocusType::inherits( int type ) const { return type == ID_LocusType ? true : Parent::inherits( type ); } const ObjectImpType* LocusType::resultId() const { return LocusImp::stype(); } KIG_INSTANTIATE_OBJECT_TYPE_INSTANCE( CopyObjectType ) CopyObjectType::CopyObjectType() : ObjectType( "Copy" ) { } CopyObjectType::~CopyObjectType() { } CopyObjectType* CopyObjectType::instance() { static CopyObjectType t; return &t; } bool CopyObjectType::inherits( int ) const { return false; } ObjectImp* CopyObjectType::calc( const Args& parents, const KigDocument& ) const { assert( parents.size() == 1 ); return parents[0]->copy(); } const ObjectImpType* CopyObjectType::impRequirement( const ObjectImp*, const Args& ) const { return ObjectImp::stype(); } const ObjectImpType* CopyObjectType::resultId() const { // we don't know what we return.. return ObjectImp::stype(); } const ObjectImpType* LocusType::impRequirement( const ObjectImp* o, const Args& parents ) const { assert( parents.size() >= 2 ); Args firsttwo( parents.begin(), parents.begin() + 2 ); if ( o == parents[0] || o == parents[1] ) return margsparser.impRequirement( o, firsttwo ); else { const HierarchyImp* h = dynamic_cast( parents[0] ); if ( h ) { PointImp* p = new PointImp( Coordinate() ); Args hargs( parents.begin()+ 2, parents.end() ); hargs.push_back( p ); ArgsParser hparser = h->data().argParser(); const ObjectImpType* ret = hparser.impRequirement( o, hargs ); delete p; return ret; } else return ObjectImp::stype(); }; } const LocusType* LocusType::instance() { static const LocusType t; return &t; } std::vector CopyObjectType::sortArgs( const std::vector& os ) const { assert( os.size() == 1 ); return os; } std::vector LocusType::sortArgs( const std::vector& args ) const { assert( args.size() >= 2 ); std::vector firsttwo( args.begin(), args.begin() + 2 ); firsttwo = margsparser.parse( firsttwo ); std::copy( args.begin() + 2, args.end(), std::back_inserter( firsttwo ) ); return firsttwo; } Args LocusType::sortArgs( const Args& args ) const { assert( args.size() >= 2 ); Args firsttwo( args.begin(), args.begin() + 2 ); firsttwo = margsparser.parse( firsttwo ); std::copy( args.begin() + 2, args.end(), std::back_inserter( firsttwo ) ); return firsttwo; } Args CopyObjectType::sortArgs( const Args& args ) const { assert( args.size() == 1 ); return args; } bool CopyObjectType::isDefinedOnOrThrough( const ObjectImp*, const Args& ) const { // TODO: vragen aan parent ? // TODO: translate the above TODO ? return false; }