MStatus lrutils::setLocation(MObject obj, MVectorArray location, MFnTransform& transformFn, bool translate, bool rotation, bool scale) {
    MStatus status = MS::kFailure;

    status = transformFn.setObject(obj);
    MyCheckStatusReturn(status, "invalid MObject provided for MFnTransform.setObject()");

    if( status == MS::kSuccess ) {
        if(translate) {
            MVector vTranslation = location[0] ;
            //stringstream text; text << "(" << vTranslation.x << ", " << vTranslation.y << ", " << vTranslation.z << ")";
            //MGlobal::displayInfo( text.str().c_str() );
            status = transformFn.setTranslation(vTranslation, MSpace::kTransform);
            stringstream text; text << "MFnTransform.setTranslation() failed, status code [" << status.errorString().asChar() << "]";
            MyCheckStatusReturn(status, text.str().c_str() ); 
            vTranslation = transformFn.getTranslation(MSpace::kWorld);
            //text.clear(); text << "(" << vTranslation.x << ", " << vTranslation.y << ", " << vTranslation.z << ")";
            //MGlobal::displayInfo( text.str().c_str() );
        }
        if(rotation) {
            MVector vRotation = location[1]*3.141592/180.0;
            MEulerRotation eRotation = MEulerRotation(vRotation);
            status = transformFn.setRotation(eRotation);
        }
        if(scale) {
            MVector vScale = location[2];
            double* scale = new double[3];
            vScale.get(scale);
            transformFn.setScale(scale);
            //make the scale of the controller the identity
            MGlobal::executeCommand("select -r "+transformFn.name()+";");
            MGlobal::executeCommand("makeIdentity -s true -apply true;");
        }
    }

    return status;
}
Пример #2
0
// Main function
//
void MAppMain()
{
  MString str;                  // Program's output
  MVector<UInt32> L0, L1, L2;   // Database lists
// Encode List 1 (2-3-letter combinations from "exclude.txt")
  MStrings exc;
  MTextFile(dir+"/exclude.txt").readAll().parseTo(exc,"\r\n");
  for (MStrings::CIter it(exc); it(); ++it)
  {
    const MString& s = (*it).convToLower();
    if (s.cnt() == 2)
      L1.append(ch2int1(s[0]) + ch2int1(s[1])*28);
    else if (s.cnt() == 3)
      L1.append(ch2int1(s[0]) + ch2int1(s[1])*28 + ch2int1(s[2])*784);
  }
// Encode List 0 and List 2 (converted to lowercase in the process)
  MStrings words;
  MTextFile(dir+"/words.txt").readAll().parseTo(words,"\r\n");  // Load dictionary
  for (MStrings::CIter it(words); it(); ++it)
  {
    const MString s = (*it).convToLower();
  // Encode 1-4-length words to List 2 (as is, no signatures)
    if (s.cnt() >= 1 && s.cnt() <= 4)
    {
      if (s.cnt() == 1)
        L2.append(ch2int2(s[0]));
      else if (s.cnt() == 2)
        L2.append(ch2int2(s[0]) + ch2int2(s[1])*28);
      else if (s.cnt() == 3)
        L2.append(ch2int2(s[0]) + ch2int2(s[1])*28 + ch2int2(s[2])*784);
      else if (s.cnt() == 4)
        L2.append(ch2int2(s[0])     + ch2int2(s[1])*28 +
                  ch2int2(s[2])*784 + ch2int2(s[3])*21952);
    }
  // Skip words with "wrong" lengths (<5 - handled above, >15 - too few to care)
    if (s.cnt() < 5 || s.cnt() > 15) continue;
  // Encode 5-15-length words to List 0 as signatures
    UInt32 sig = (1-s.cnt()%2)<<ch2int0('*');           // Encode length bit (Note: produces a slightly smaller database than "s.cnt()%2")
    for (MNum i = 0; i < s.cnt(); ++i)  // Encode 19 letter bits
      sig |= (1 << ch2int0(s[i]));
    L0.append(sig);
  }
// Sort and merge the lists
  unique(L0);
  unique(L1);
  unique(L2); L2.setCnt(c2,0);
  MVector<UInt32> L = L0;                  // Merged list
  L.append(L1);
  L.append(L2);
// Calculate element differences (at lists' edges add initial element)
  MVector<UInt32> diffs;
  for (MNum i = 1; i < L.cnt(); ++i)
    if (L.get(i) > L.get(i-1))
      diffs.append(L.get(i) - L.get(i-1));
// Encode 'diffs' as optimized bitmaps (in a string form for convenience)
// Each diff value is encoded as "0..01n..n": 'z' zeroes, followed by 1,
// followed by bitmap of the 'x-a' number, where 'x' is the diff and 'a' is
// the nearest (smaller or equal) to 'x' power of 2
  MString bits;
  for (MNum i = 0; i < diffs.cnt(); ++i)
  {
    UInt32 d = diffs.get(i);
    for (UInt32 z = 0; ; ++z)
    {
      UInt32 a = (1<<z), b = a*2-1;   // [a,b] - suitable range of 'd' to process
      if (d<a || d>b) continue;       // Outside of proper range - keep looking
      for (UInt32 k = 0; k < z; ++k)
        bits << '0';
      bits << '1';
      for (UInt32 k = 0; k < z; ++k)
        bits << (GetBits(d-a,UInt8(k),UInt8(k))?'1':'0');
      break;
    }
  }
  while (bits.cnt()%8) bits << '0';   // Pad with zeroes to complete the last byte
// Encode the intermediary 'bits' string to actual bit vector
  MVector<UInt8> bytes;
  for (MNum i = 0; i < bits.cnt(); i+=8)
  {
    UInt8 b = 0;
    for (MNum j = 0; j < 8; ++j) if (bits[i+j]=='1') b |= (1<<j);
    bytes.append(b);
  }
// Save the data to the file and compress it, if 7z is available at the sprcified location
  MFile(dir+"/data",fmOverwrite) << bytes;
  if (MSys::getFileInfo(GZipExe).name.cnt())
  {
    MSys::deleteFile(dir+"/data.gz");
    MSys::open(GZipExe, (MString)"a -tgzip -mx=9 -sdel \""+dir+"/data.gz\" \""+dir+"/data\"");
  }
// Compile some useful information (needed for hardcoding in the Node.js file)
 // Prepare sizes
  int size1 = 0;
  while (!size1)
  {
    MApp::sleep(500);
    size1 = (UInt32)MSys::getFileInfo(dir+"/data.gz").size;
  }
  int size2 = (int)MSys::getFileInfo(dir+"/solution.js").size;
 // Initial elements and sizes
  str <<"w=["<<L0.get(0)<<","<<L1.get(0)<<","<<L2.get(0)<<","
      <<L0.cnt()<<","<<L1.cnt()<<","<<L2.cnt()<<"]\n";
 // Letter->index conversion string for L0
  str<<"C0: \" ";
  for (int j='a'; j<='z'; ++j) str<<MChar(int('a'+ch2int0(j)-1));
  str<<MChar(int('a'+ch2int0('\'')-1))<<"\"\n";
 // Letter->index conversion string for L1
  MString c1 = " ...........................";
  for (int j='a'; j<='z'; ++j) c1.setChar(ch2int1(j),j);
  c1.setChar(ch2int1('\''),'\'');
  str<<"C1: \""<<c1<<"\"\n";
 // Letter->index conversion string for L2
  str<<"C2: \" ";
  for (int j='a'; j<='z'; ++j) str<<MChar(int('a'+ch2int2(j)-1));
  str<<MChar(int('a'+ch2int2('\'')-1))<<"\"\n";
// Size report
  str <<"\n"<<words.cnt()<<" words => "<<L.cnt()<<" signatures => "
      <<bytes.cnt()<<" bytes =>\n"<<size1<<"+"<<size2<<" final bytes ("
      <<(65536-size1-size2)<<" left)\n\n";
// Display the information
  MMainFrame wnd;                                       // Create app's mainframe window
  wnd.plugBar(MEditBoxPtr(wnd,AutoRect,None,true,str)); // Create a text box
  wnd.setCaption("Data file written");
  wnd.runMessageLoop();                                 // Run the app
}
Пример #3
0
//  ========== DtCameraGetUpPosition ==========
//
//  SYNOPSIS
//  Return the camera Up position.
//
int DtCameraGetUpPosition( int cameraID,
                         float* xTran,
                         float* yTran,
                         float* zTran )
{                        
    // Check for error.  
    //
    if( (cameraID < 0) || (cameraID >= local->camera_ct ) )
    {
        *xTran = 0.0;
        *yTran = 0.0;
        *zTran = 0.0;
        return( 0 );
    }   
    
    MStatus stat = MS::kSuccess;
    
    MFnDagNode fnDagNode( local->cameras[cameraID].transformNode, &stat );
    MDagPath aPath;
    stat = fnDagNode.getPath( aPath );
    
    // Get the global transformation matrix of the camera node.
    //
    MMatrix globalMatrix = aPath.inclusiveMatrix();
    
    MFnCamera fnCamera( local->cameras[cameraID].cameraShapeNode, &stat );
    
    MPoint eyePt;
    double eyePos[4];
    double upPos[4];
    
    if( MS::kSuccess == stat )
    {
        eyePt = fnCamera.eyePoint( MSpace::kObject, &stat );
        
        eyePt *= globalMatrix;
        eyePt.get( eyePos );

	    MVector upVec = fnCamera.upDirection( MSpace::kObject, &stat );
		upVec *= globalMatrix;
		
	    if( DtExt_Debug() & DEBUG_CAMERA )
	    {
	        double up[3];
	        upVec.get( up );
	        cerr << "local up vector is " << up[0] << " " 
										<< up[1] << " " << up[2] << endl; 
    	}

    	MPoint upPoint = eyePt + upVec;
    	upPoint.get( upPos );
    	if( DtExt_Debug() & DEBUG_CAMERA )
    	{
    	    cerr << "global up point position is " 
						<< upPos[0] << " " << upPos[1]
            			<< " " << upPos[2] << " " << upPos[3] << endl;
    	}        
    	
    }   
    else
    {
        DtExt_Err( "Error in getting the camera function set\n" );
    }   

    *xTran = upPos[0];
    *yTran = upPos[1];
    *zTran = upPos[2];

	return(1);

}