/** * Maps the given model position to the grid. */ RVector ROrthoGrid::snapToGrid(const RVector& positionUcs) { RDocumentInterface* documentInterface = view.getDocumentInterface(); if (documentInterface==NULL) { return RVector::invalid; } RVector sp = spacing; if (!sp.isValid()) { sp = metaSpacing; if (isometric) { sp /= 2; } } int x = RMath::mround(positionUcs.x / sp.x); int y = RMath::mround(positionUcs.y / sp.y); int z = RMath::mround(positionUcs.z / sp.z); // closest grid point is not available in isometric grid, // find closest available grid point: if (isometric && (x+y)%2!=0) { int cx, cy; double minDist = RMAXDOUBLE; double dist; for (int ix=-1; ix<=1; ix++) { for (int iy=-1; iy<=1; iy++) { if (qAbs(ix) + qAbs(iy)!=1) { continue; } cx = RMath::mround(positionUcs.x / sp.x) + ix; cy = RMath::mround(positionUcs.y / sp.y) + iy; dist = positionUcs.getDistanceTo(RVector(cx*sp.x, cy*sp.y)); if (dist<minDist) { x = cx; y = cy; minDist = dist; } } } } RVector gridPositionUcs = RVector( x * sp.x, y * sp.y, z * sp.z ); RUcs ucs = documentInterface->getCurrentUcs(); return ucs.mapFromUcs(gridPositionUcs); }
QScriptValue REcmaSharedPointerUcs::mapFromUcs (QScriptContext* context, QScriptEngine* engine) { //REcmaHelper::functionStart("REcmaSharedPointerUcs::mapFromUcs", context, engine); //qDebug() << "ECMAScript WRAPPER: REcmaSharedPointerUcs::mapFromUcs"; //QCoreApplication::processEvents(); QScriptValue result = engine->undefinedValue(); // public function: can be called from ECMA wrapper of ECMA shell: RUcs* self = getSelf("mapFromUcs", context); //Q_ASSERT(self!=NULL); if (self==NULL) { return REcmaHelper::throwError("self is NULL", context); } if( context->argumentCount() == 1 && ( context->argument(0).isVariant() || context->argument(0).isQObject() || context->argument(0).isNull() ) /* type: RVector */ ){ // prepare arguments: // argument isCopyable and has default constructor and isSimpleClass RVector* ap0 = qscriptvalue_cast< RVector* >( context->argument( 0 ) ); if (ap0 == NULL) { return REcmaHelper::throwError("RUcs: Argument 0 is not of type RVector.", context); } RVector a0 = *ap0; // end of arguments // call C++ function: // return type 'RVector' RVector cppResult = self->mapFromUcs(a0); // return type: RVector // not standard type nor reference result = qScriptValueFromValue(engine, cppResult); } else { return REcmaHelper::throwError("Wrong number/types of arguments for RUcs.mapFromUcs().", context); } //REcmaHelper::functionEnd("REcmaSharedPointerUcs::mapFromUcs", context, engine); return result; }