Beispiel #1
0
bool outputCoordinateSystem( const ScenePlug *scene, const ScenePlug::ScenePath &path, IECore::Renderer *renderer )
{
	IECore::ConstCoordinateSystemPtr constCoordinateSystem = runTimeCast<const IECore::CoordinateSystem>( scene->object( path ) );
	if( !constCoordinateSystem )
	{
		return false;
	}

	if( !visible( scene, path ) )
	{
		return false;
	}

	const M44f transform = scene->fullTransform( path );

	std::string coordinateSystemName;
	ScenePlug::pathToString( path, coordinateSystemName );

	CoordinateSystemPtr coordinateSystem = constCoordinateSystem->copy();
	coordinateSystem->setName( coordinateSystemName );

	{
		TransformBlock transformBlock( renderer );
		renderer->concatTransform( transform );
		coordinateSystem->render( renderer );
	}

	return true;
}
Beispiel #2
0
bool outputClippingPlane( const ScenePlug *scene, const ScenePlug::ScenePath &path, IECore::Renderer *renderer )
{
	IECore::ConstClippingPlanePtr clippingPlane = runTimeCast<const IECore::ClippingPlane>( scene->object( path ) );
	if( !clippingPlane )
	{
		return false;
	}

	if( !visible( scene, path ) )
	{
		return false;
	}

	const M44f transform = scene->fullTransform( path );

	TransformBlock transformBlock( renderer );
	renderer->concatTransform( transform );
	clippingPlane->render( renderer );

	return true;
}
Beispiel #3
0
int ReadFamu::compute(const char * /*port*/)
{

    if (reset->getValue())
    {
        bottomLeft->setValue(origBottomLeft[0], origBottomLeft[1], origBottomLeft[2]);
        bottomRight->setValue(origBottomRight[0], origBottomRight[1], origBottomRight[2]);
        topRight->setValue(origTopRight[0], origTopRight[1], origTopRight[2]);
        topLeft->setValue(origTopLeft[0], origTopLeft[1], origTopLeft[2]);

        //reset params
        moveDist->setValue(0.0, 0.0, 0.0);
        scaleFactor->setValue(1.0);
        XYDegree->setValue(0.0);
        YZDegree->setValue(0.0);
        ZXDegree->setValue(0.0);

        reset->setValue(false);
    }

    const char *firstFile = _in_FirstFile->getValue();
    const char *secondFile = _in_SecondFile->getValue();

    if (FileExists(firstFile) && FileExists(secondFile) && _startSim->getValue())
    {
        Plane myPlane;
        //move the plane
        float xDist = 0, yDist = 0, zDist = 0;
        xDist = moveDist->getValue(0);
        yDist = moveDist->getValue(1);
        zDist = moveDist->getValue(2);

        //scale the plane
        float scale = 1;
        scale = sqrt(scaleFactor->getValue());
        float origCenter[3];
        origCenter[0] = (bottomLeft->getValue(0) + topRight->getValue(0)) / 2;
        origCenter[1] = (bottomLeft->getValue(1) + topRight->getValue(1)) / 2;
        origCenter[2] = (bottomLeft->getValue(2) + topRight->getValue(2)) / 2;

        float xDiff = 0, yDiff = 0, zDiff = 0;

        if (scale != 1)
        {

            xDiff = (1 - scale) * origCenter[0];
            yDiff = (1 - scale) * origCenter[1];
            zDiff = (1 - scale) * origCenter[2];
        }

        //initialize the reference points
        myPlane._referenceNode[0].x = bottomLeft->getValue(0) * scale + xDist + xDiff;
        myPlane._referenceNode[0].y = bottomLeft->getValue(1) * scale + yDist + yDiff;
        myPlane._referenceNode[0].z = bottomLeft->getValue(2) * scale + zDist + zDiff;

        myPlane._referenceNode[1].x = scale * (bottomLeft->getValue(0) + bottomRight->getValue(0)) / 2 + xDist + xDiff;
        myPlane._referenceNode[1].y = scale * (bottomLeft->getValue(1) + bottomRight->getValue(1)) / 2 + yDist + yDiff;
        myPlane._referenceNode[1].z = scale * (bottomLeft->getValue(2) + bottomRight->getValue(2)) / 2 + zDist + zDiff;

        myPlane._referenceNode[2].x = bottomRight->getValue(0) * scale + xDist + xDiff;
        myPlane._referenceNode[2].y = bottomRight->getValue(1) * scale + yDist + yDiff;
        myPlane._referenceNode[2].z = bottomRight->getValue(2) * scale + zDist + zDiff;

        myPlane._referenceNode[3].x = scale * (bottomRight->getValue(0) + topRight->getValue(0)) / 2 + xDist + xDiff;
        myPlane._referenceNode[3].y = scale * (bottomRight->getValue(1) + topRight->getValue(1)) / 2 + yDist + yDiff;
        myPlane._referenceNode[3].z = scale * (bottomRight->getValue(2) + topRight->getValue(2)) / 2 + zDist + zDiff;

        myPlane._referenceNode[4].x = topRight->getValue(0) * scale + xDist + xDiff;
        myPlane._referenceNode[4].y = topRight->getValue(1) * scale + yDist + yDiff;
        myPlane._referenceNode[4].z = topRight->getValue(2) * scale + zDist + zDiff;

        myPlane._referenceNode[5].x = scale * (topRight->getValue(0) + topLeft->getValue(0)) / 2 + xDist + xDiff;
        myPlane._referenceNode[5].y = scale * (topRight->getValue(1) + topLeft->getValue(1)) / 2 + yDist + yDiff;
        myPlane._referenceNode[5].z = scale * (topRight->getValue(2) + topLeft->getValue(2)) / 2 + zDist + zDiff;

        myPlane._referenceNode[6].x = topLeft->getValue(0) * scale + xDist + xDiff;
        myPlane._referenceNode[6].y = topLeft->getValue(1) * scale + yDist + yDiff;
        myPlane._referenceNode[6].z = topLeft->getValue(2) * scale + zDist + zDiff;

        myPlane._referenceNode[7].x = scale * (bottomLeft->getValue(0) + topLeft->getValue(0)) / 2 + xDist + xDiff;
        myPlane._referenceNode[7].y = scale * (bottomLeft->getValue(1) + topLeft->getValue(1)) / 2 + yDist + yDiff;
        myPlane._referenceNode[7].z = scale * (bottomLeft->getValue(2) + topLeft->getValue(2)) / 2 + zDist + zDiff;

        //rotate the electrode
        Node center1, center2, center3;
        float degree1 = 0, degree2 = 0, degree3 = 0;
        degree1 = XYDegree->getValue();

        //rotate eletrode around the axis Z

        if (XYDegree->getValue() > 0)
        {
            degree1 = XYDegree->getValue();
            center1.x = (myPlane._referenceNode[2].x + myPlane._referenceNode[0].x) / 2;
            center1.y = (myPlane._referenceNode[2].y + myPlane._referenceNode[0].y) / 2;
            center1.z = (myPlane._referenceNode[2].z + myPlane._referenceNode[0].z) / 2;

            rotatePoint(&(myPlane._referenceNode[0]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[2]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[3]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[4]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[5]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[6]), center1, degree1, 1);
            rotatePoint(&(myPlane._referenceNode[7]), center1, degree1, 1);
        }

        //rotate eletrode around the axis X
        if (YZDegree->getValue() > 0)
        {
            degree2 = YZDegree->getValue();
            center2.x = (myPlane._referenceNode[0].x + myPlane._referenceNode[4].x) / 2;
            center2.y = (myPlane._referenceNode[0].y + myPlane._referenceNode[4].y) / 2;
            center2.z = (myPlane._referenceNode[0].z + myPlane._referenceNode[4].z) / 2;

            rotatePoint(&(myPlane._referenceNode[0]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[1]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[2]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[3]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[4]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[5]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[6]), center2, degree2, 2);
            rotatePoint(&(myPlane._referenceNode[7]), center2, degree2, 2);
        }
        //rotate eletrode around the axis Y
        if (ZXDegree->getValue() > 0)
        {
            degree3 = ZXDegree->getValue();
            center3.x = (myPlane._referenceNode[6].x + myPlane._referenceNode[0].x) / 2;
            center3.y = (myPlane._referenceNode[6].y + myPlane._referenceNode[0].y) / 2;
            center3.z = (myPlane._referenceNode[6].z + myPlane._referenceNode[0].z) / 2;

            rotatePoint(&(myPlane._referenceNode[0]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[1]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[2]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[3]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[4]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[5]), center3, degree3, 3);
            rotatePoint(&(myPlane._referenceNode[6]), center3, degree3, 3);
        }

        //set the new values to the Param

        bottomLeft->setValue(myPlane._referenceNode[0].x, myPlane._referenceNode[0].y, myPlane._referenceNode[0].z);
        bottomRight->setValue(myPlane._referenceNode[2].x, myPlane._referenceNode[2].y, myPlane._referenceNode[2].z);
        topRight->setValue(myPlane._referenceNode[4].x, myPlane._referenceNode[4].y, myPlane._referenceNode[4].z);
        topLeft->setValue(myPlane._referenceNode[6].x, myPlane._referenceNode[6].y, myPlane._referenceNode[6].z);

        myPlane.controllPlaneCreating();
        myPlane.targetPlaneCreating();

        exportHmo(myPlane, _planeFile->getValue());
        //exportHmascii(myPlane);

        //load and transform the block file
        float blockMoveVec3[3] = { moveIsol->getValue(0), moveIsol->getValue(1), moveIsol->getValue(2) };
        float blockScaleVec3[3] = { scaleIsol->getValue(0), scaleIsol->getValue(1), scaleIsol->getValue(2) };
        const char *thirdFile;
        thirdFile = _in_ThirdFile->getValue();
        char tempFile[256];
        if (FileExists(thirdFile) && _startSim->getValue())
        {
            strncpy_s(tempFile, 256, thirdFile, strlen(thirdFile) - 10);
            strncat_s((char *)tempFile, 256, "tempBlock.hmo", 13);

            transformBlock(thirdFile, tempFile, blockMoveVec3, blockScaleVec3);
        }
        else
        {
            sendError("files %s and / or %s not existing, we do not execute simulation", firstFile, secondFile);
            return FAIL;
        }

        filesBinding(_in_FirstFile->getValue(), _in_SecondFile->getValue(), (const char *)tempFile, _targetFile->getValue());
        char command[1024];
        sprintf(command, "%s %s", _FamuExePath->getValue(), _FamuArgs->getValue());
        if (system(command) == -1)
            sendError("execution of %s failed", command);
        moveDist->setValue(0.0, 0.0, 0.0);
        scaleFactor->setValue(1.0);
        XYDegree->setValue(0);
        YZDegree->setValue(0);
        ZXDegree->setValue(0);
    }
    else
    {
        if (_startSim->getValue())
        {
            sendWarning("files %s and / or %s not existing, we do not execute simulation", firstFile, secondFile);
        }
    }

    try
    {
        // load mesh
        MeshDataTrans *meshDataTrans = NULL;
        getMeshDataTrans(&meshDataTrans);

        // get results and send them to output ports
        FactoryResultsFileParser *facParser = FactoryResultsFileParser::getInstance();
        ResultsFileParser *resFileParser = facParser->create(_resultsFileName->getValue(), meshDataTrans, this);

        if (_startSim->getValue())
        {
            std::string filename = _resultsFileName->getValue();
            // filename = parserTools::replace(filename, ".", "_.");
            resFileParser->parseResultsFile(filename.c_str(), _p_skip->getValue(), _p_numt->getValue(), meshDataTrans, std::string(_dataPort[0]->getObjName()));
        }
        else
        {
            resFileParser->parseResultsFile(_resultsFileName->getValue(), _p_skip->getValue(), _p_numt->getValue(), meshDataTrans, std::string(_dataPort[0]->getObjName()));
        }

        // ------------------
        ResultsFileData *resFileData = NULL;
        float symmAngle = _periodicAngle->getValue();
        int noOfSymmTimeSteps = _periodicTimeSteps->getValue();
        const bool isPeriodicRot = symmAngle != 0 && noOfSymmTimeSteps > 0;
        if (isPeriodicRot)
        {
            resFileData = new PeriodicRotResults(symmAngle, noOfSymmTimeSteps, resFileParser, this);
        }
        else
        {
            resFileData = resFileParser;
        }
        sendResultsToPorts(resFileData, meshDataTrans);
        // ------------------

        // create grids of all time steps and send them to output ports
        BuilderGrid builderGrid(this);
        coDoSet *gridSet = builderGrid.construct(_mesh->getObjName(), _scaleDisplacements->getValue(),
                           _periodicAngle->getValue(), (int)_periodicTimeSteps->getValue(),
                           meshDataTrans, resFileParser);
        _mesh->setCurrentObject(gridSet);

        coFeedback feedback("Famu");
        //feedback.addPara(moveDist);

        feedback.addPara(bottomLeft); //first Point   Param.0
        feedback.addPara(bottomRight); // second Point Param.1
        feedback.addPara(topRight); //third Point  Param.2
        feedback.addPara(topLeft); //fourth Point Param.3
        feedback.addPara(scaleFactor); //Param.4
        feedback.addPara(XYDegree); //Param.5
        feedback.addPara(YZDegree); //Param.6
        feedback.addPara(ZXDegree); //Param.7
        feedback.addPara(reset); //Param.8
        feedback.addPara(moveIsol); //Param.9
        feedback.addPara(scaleIsol); //Param.10

        feedback.addString("important information");
        feedback.apply(gridSet);

        delete meshDataTrans;
        delete resFileParser;
        //return SUCCESS;
        return CONTINUE_PIPELINE;
    }
    catch (ErrorInfo error)
    {
        error.outputError();
        return FAIL;
    }
    catch (int error)
    {
        sendError("sorry, error %d occured.", error);
        return FAIL;
    }
}