// Perform the work of making a netlist from this design...
void CNetList::MakeNet( CTinyCadMultiDoc *pDesign )
{
	linkCollection nets;
	int file_name_index = 0;

	CImportFile *f = new CImportFile;
	f->m_file_name_index = file_name_index;
	m_imports.push_back( f );

	// Make the nets for our sheets
	nets.resize( pDesign->GetNumberOfSheets() );

	// Generate a netlist for every sheet in this design
	for (int i = 0; i < pDesign->GetNumberOfSheets(); i++)
	{
		nets[i].m_prefix_references = m_prefix_references;
		nets[i].m_prefix_import = m_prefix_import;
		nets[i].MakeNetForSheet( m_imports, 0, file_name_index, i+1, pDesign->GetSheet( i ) );
	}

	// Now include from our imports
	if (m_follow_imports)
	{
		for ( unsigned int ip = 1; ip < m_imports.size(); ++ ip )
		{
			// Now create the nets for it
			int base = nets.size();
			nets.resize( base + m_imports[ip]->m_pDesign->GetNumberOfSheets() );

			// Generate a netlist for every sheet in this imported design
			for (int i = 0; i < m_imports[ip]->m_pDesign->GetNumberOfSheets(); i++)
			{
				nets[i + base].m_prefix_references = m_prefix_references;
				nets[i + base].m_prefix_import = m_prefix_import;
				nets[i + base].MakeNetForSheet( m_imports, m_imports[ip]->m_file_name_index, file_name_index, i+1, m_imports[ip]->m_pDesign->GetSheet( i ) );
			}
		}
	}

	// Now link the nets together
	Link( nets );

	// ... and write the results into the design for ease of use...
	WriteWires();
}
Exemple #2
0
void WireExport::Export(string folder, string fileName)
{
	MStatus stat;

	mFolder = folder;
	mFileName = fileName;

	mSaver.SetFolder(mFolder);

	MItDependencyNodes itRenderLayers(MFn::kRenderLayer,&stat);
	err_code(stat);

	MFnRenderLayer wireLayer;
	while (!itRenderLayers.isDone())
	{		
		MFnRenderLayer renderLayer( itRenderLayers.item() );

		if (renderLayer.name() == "wire")
		{
			stat = wireLayer.setObject( renderLayer.object() );
			err_code(stat);
			break;
		}

		stat = itRenderLayers.next();
		err_code(stat);
	}

	MItDependencyNodes itDepCurve(MFn::kNurbsCurve,&stat);
	err_code(stat);

	vector<Wire> wires;

	while (!itDepCurve.isDone())
	{
		MObject obj = itDepCurve.item();
		MFnNurbsCurve wire(obj, &stat);
		err_code(stat);

		bool objInLayer = wireLayer.inLayer(obj, &stat);
		//err_code(stat);	

		if (!objInLayer)
		{
			stat = itDepCurve.next();
			err_code(stat);	
			continue;
		}

		MString cmd = MString("reference -q -f ") + wire.name();
		MString file_id;
		stat = MGlobal::executeCommand( cmd, file_id );
		if( stat == MS::kSuccess ) 
		{ 
			itDepCurve.next();
			continue;
		}

		MObject parentObj = wire.parent(0, &stat);
		err_code(stat);

		Wire newWire;
		newWire.name = wire.name().asChar();

		
		MPointArray points;

		stat = wire.getCVs(points);			
		err_code(stat);


		int numOfPoints = points.length();
		for (int n = 0; n < numOfPoints ; n++)
		{
			MPoint point = points[n];
			WirePoint wirePoint;
			wirePoint.x = (float)point.x;
			wirePoint.z = (float)point.z;

			double param;
			stat = wire.getParamAtPoint( point, param );
			err_code(stat);

			MVector	tangent = wire.tangent( param , MSpace::kObject, &stat);
			err_code(stat);

			tangent.normalize();

			wirePoint.tx = (float)tangent.x;
			wirePoint.tz = (float)tangent.z;

			newWire.wirePoints.push_back(wirePoint);
		}

		wires.push_back(newWire);

		stat = itDepCurve.next();
		err_code(stat);
	}

	WriteWires(wires);


}