Перейти к публикации

Функция Intersectcurve2


Eugene186

Рекомендованные сообщения

В хелпе описано:

This method gets a surface-curve intersection. The curves must be bounded.

Retval = Surface.IntersectCurve2 ( OtherCurve, CurveBound, PointArray, TArray, UvArray)

Input:

(LPDISPATCH) OtherCurve

Pointer to the curve

Input:

(VARIANT) CurveBound

Array of 6 doubles representing the start and end points of the curve

Property:

(VARIANT) PointArray

Array of points

Property:

(VARIANT) TArray

VARIANT of type SafeArray of parameters on curve

Property:

(VARIANT) UvArray

VARIANT of type SafeArray of parameters on surface

Output:

(VARIANT_BOOL) Retval

TRUE if getting the intersection succeeded, FALSE if not

Вопрос: где возвращаются точки пересения? :wallbash:

Ссылка на сообщение
Поделиться на других сайтах


А попробовать и посмотреть лениво??? Суди по названию это наверно PointArray - масив точки.

Ссылка на сообщение
Поделиться на других сайтах

Вот часть моего кода:

double Coords[6];

SAFEARRAY *saCB,*saTArray,*saUvArray;

SAFEARRAYBOUND sab;

VARIANT vCB,PointArray,TArray,UvArray;

sab.lLbound=0;

sab.cElements=6;

saCB=SafeArrayCreate(VT_R8,1,&sab);

saTArray=SafeArrayCreate(VT_R8,1,&sab);

saUvArray=SafeArrayCreate(VT_R8,1,&sab);

pSPoint->get_X(Coords);

pSPoint->get_Y(Coords+1);

pSPoint->get_Z(Coords+2);

pFPoint->get_X(Coords+3);

pFPoint->get_Y(Coords+4);

pFPoint->get_Z(Coords+5);

for(long i=0;i<=5;i++){

SafeArrayPutElement(saCB,&i,(Coords+i));}

vCB.vt=VT_ARRAY;

vCB.parray=saCB;

TArray.vt=VT_ARRAY;

TArray.parray=saTArray;

UvArray.vt=VT_ARRAY;

UvArray.parray=saUvArray;

pCurve->get_LineParams(&TArray);

pSurface->get_PlaneParams(&UvArray);

pSurface->IntersectCurve2(pCurve,vCB,&PointArray,&TArray,&UvArray,&nBool);

SafeArrayDestroy(saCB);

SafeArrayDestroy(saTArray);

SafeArrayDestroy(saUvArray);

в nBool возвращается false. Где может быть ошибка?

Ссылка на сообщение
Поделиться на других сайтах

Интересная задачка. Тоже не хрена не получается. Кол-во точек, которые пересекаются с поверхностью нашел, а координаты их увы....

P.S. C++

Ссылка на сообщение
Поделиться на других сайтах

На C# работает. Дома попробую на C++

private void button1_Click(object sender, System.EventArgs e)

		{

			SldWorks.SldWorks swApp = new SldWorks.SldWorksClass();

			SldWorks.ModelDoc2 swModel = (SldWorks.ModelDoc2)swApp.IActiveDoc2;

			if(swModel == null)

			{

				MessageBox.Show("Загрузите документ SolidWorks-a!");

				return;

			}

			int DocType = swModel.GetType();

			if(DocType != (int)SwConst.swDocumentTypes_e.swDocPART)

			{

				MessageBox.Show("Программа работает с документами деталей");

				return;

			}

			SldWorks.SelectionMgr swSelMgr = (SldWorks.SelectionMgr)swModel.ISelectionManager;

			int CountObj = swSelMgr.GetSelectedObjectCount();

			if (CountObj != 2)

			{

				MessageBox.Show("Выберите поверхность и кривую");

				return;

			}

			SldWorks.Face2 swFace = null;

			SldWorks.SketchSegment swSketchSegment= null;

			SldWorks.Curve swCurve = null;

			SldWorks.Surface swSurface = null;

			int SelType;



			for (int i = 1; i <= CountObj; i++)

			{

				SelType = (int)swSelMgr.GetSelectedObjectType2(i);

				if (SelType == (int)SwConst.swSelectType_e.swSelFACES)

				{

					swFace = (SldWorks.Face2)swSelMgr.GetSelectedObject5(i);

					swSurface = (SldWorks.Surface)swFace.GetSurface();



				}

				else if(SelType == (int)SwConst.swSelectType_e.swSelEXTSKETCHSEGS)

				{

					swSketchSegment = (SldWorks.SketchSegment)swSelMgr.GetSelectedObject5(i);

					swCurve = (SldWorks.Curve)swSketchSegment.GetCurve();

				}

			}

			if (swSurface == null)

			{

				MessageBox.Show("Выберите поверхность!", "Warning!");

				return;

			}

			if (swCurve == null)

			{

				MessageBox.Show("Выберите кривую!", "Warning!");

				return;

			}

			int CurveType = swCurve.Identity();

			// вставить проверку на тип Curve

			if ( CurveType != (int)SwConst.swCurveTypes_e.BCURVE_TYPE)

			{

				return;

			}



			double dStart, dEnd;

			bool bClosed, bPeriodic;

			

			bool bres = swCurve.GetEndParams(out dStart, out dEnd, out bClosed, out bPeriodic);



			object dStartParam = swCurve.Evaluate(dStart);

			object dEndParam = swCurve.Evaluate(dEnd);



			double[] arrStart = (double[])dStartParam;

			double[] arrEnd = (double[])dEndParam;



			double[] dCurveParam = new double[6];

			dCurveParam[0] = arrStart[0];

			dCurveParam[1] = arrStart[1];

			dCurveParam[2] = arrStart[2];

			dCurveParam[3] = arrEnd[0];

			dCurveParam[4] = arrEnd[1];

			dCurveParam[5] = arrEnd[2];



			object objCurve = (object)dCurveParam;



			double dCurveBound = 0;



			int nPoint = swSurface.GetIntersectCurveCount2(swCurve, ref dCurveBound);

			int nPointArray = nPoint * 3;



			double[] dPointArray = new double[nPointArray];

			object objPointArray = (object)dPointArray;



			double[] dTArray = new double [nPointArray];

			object objTArray = (object)dTArray;



			double[] dUvArray = new double [nPointArray * 2];

			object objUvArray = (object)dUvArray;



			bres = swSurface.IntersectCurve2(swCurve, objCurve,ref objPointArray, ref objTArray, ref objUvArray);

			double[]dPoint = (double[])objPointArray;



			Debug.WriteLine("Всего точек пересечения: " + nPoint);



			for(int i = 0; i < nPoint; i++)

			{

				double d_Px = dPoint[i*3] * 1000;

				double d_Py = dPoint[i * 3 +1] * 1000;

				double d_Pz = dPoint[i * 3 + 2] * 1000;



				Debug.WriteLine("Координаты " + (i + 1) + " точки пересечения:");

				Debug.WriteLine("X = " + d_Px);

				Debug.WriteLine("Y = " + d_Py);

				Debug.WriteLine("Z = " + d_Pz);

				Debug.WriteLine("			");

			}

		}

P.S. VS2003

Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ Shvg. :smile:

К сожалению на C# еще не пробовал писать, только на C++ и то недавно, и пишу exe приложения(до DLL не дорос еще). В exe если в функцию передается массив, то нужно использовать интерфейс OLE Automation. Возможно я делаю ошибку при работе с variant'ом, или где-то в другом месте.

Если что-то получится пиши.

Ссылка на сообщение
Поделиться на других сайтах

Exe код на C++ (рабочий)

{

	HRESULT hres;

	ISldWorksPtr swApp;

		swApp.GetActiveObject("SldWorks.Application");



	IModelDoc2Ptr swModel;

	hres = swApp->get_IActiveDoc2(&swModel);

	if(hres != S_OK)

	{	

		return;

	}

	long DocType;

	hres = swModel->GetType(&DocType);

	if (DocType != swDocPART)

	{

		return;

	}

	ISelectionMgrPtr swSelMgr;

	hres = swModel->get_ISelectionManager(&swSelMgr);

	long CountObj, SelType;

	hres = swSelMgr->GetSelectedObjectCount(&CountObj);

	if (CountObj!= 2)

	{

		return;

	}

	LPDISPATCH lpDisp;

	IFacePtr swFace;

	ISurfacePtr swSurface;

	ISketchSegmentPtr swSketchSegment;

	ICurvePtr swCurve;

	for (long i = 1; i <= CountObj; i++)

	{

		hres = swSelMgr->GetSelectedObjectType2(i, &SelType);

		if (SelType == swSelFACES)

		{

			hres = swSelMgr->GetSelectedObject5(i, &lpDisp);

			hres = lpDisp->QueryInterface(&swFace);

			hres = swFace->IGetSurface(&swSurface);

		}

		else if (SelType == swSelEXTSKETCHSEGS)

		{

			hres = swSelMgr->GetSelectedObject5(i, &lpDisp);

			hres = lpDisp->QueryInterface(&swSketchSegment);

			hres = swSketchSegment->IGetCurve(&swCurve);

				   

		}

	}

	if (!swSurface) { return;}

	if (!swCurve) { return;}

	

	long CurveType;

	hres = swCurve ->Identity(&CurveType);

	// необходима проверка типа Curve

	if (CurveType != BCURVE_TYPE)

	{

		return;

	}

	

	double dCurveBound;

	double dStartParam, dEndParam;

	VARIANT_BOOL bres;

	VARIANT_BOOL bIsClosed, bIsPeriodic;

	hres = swCurve->GetEndParams(&dStartParam, &dEndParam, &bIsClosed, &bIsPeriodic, &bres);

	VARIANT vStart, vEnd;

	hres = swCurve->Evaluate(dStartParam, &vStart);

	hres = swCurve->Evaluate(dEndParam, &vEnd);

	

	SafeDoubleArray arrStart(vStart);

	SafeDoubleArray arrEnd(vEnd);

	double *arrSplines = new double[6];

		arrSplines[0] = arrStart[0];

		arrSplines[1] = arrStart[1];

		arrSplines[2] = arrStart[2];

		arrSplines[3] = arrEnd[0];

		arrSplines[4] = arrEnd[1];

		arrSplines[5] = arrEnd[2];





	long nPoint;

	hres = swSurface->GetIntersectCurveCount2(swCurve, arrSplines, &nPoint);

	if (nPoint == 0)

	{

		return;

	}

	VARIANT vCB,vPointArray,vTArray,vUvArray;

	SAFEARRAY *saCB,*saPointArray, *saTArray,*saUvArray;

	SAFEARRAYBOUND ubCB, ubPointArray, ubTArray, ubUvArray;

	ubCB.lLbound = 0;

	ubCB.cElements = nPoint;

	

	ubPointArray.lLbound = 0;

	ubPointArray.cElements = nPoint * 3;

	

	ubTArray.lLbound = 0;

	ubTArray.cElements = nPoint;

	

	ubUvArray.lLbound = 0;

	ubUvArray.cElements = nPoint * 2;

	

	saCB = SafeArrayCreate(VT_R8, 1, &ubCB);

	saPointArray = SafeArrayCreate(VT_R8, 1, &ubPointArray);

	saTArray = SafeArrayCreate(VT_R8, 1, &ubTArray);

	saUvArray = SafeArrayCreate(VT_R8, 1, &ubUvArray);

	nPoint = (long)nPoint;

	for (long i = 0; i < nPoint; i++)

	{

		double dVal = arrSplines[i];

		SafeArrayPutElement(saCB, &i, &dVal);

	}

	vCB.vt = VT_ARRAY;

	vCB.parray = saCB;

	

	vPointArray.vt = VT_ARRAY;

	vPointArray.parray = saPointArray;

	

	vTArray.vt = VT_ARRAY;

	vTArray.parray = saTArray;

	

	vUvArray.vt = VT_ARRAY;

	vUvArray.parray = saUvArray;

	

	hres = swSurface->IntersectCurve2(swCurve, vCB, &vPointArray, &vTArray, &vUvArray, &bres);

	

	SafeDoubleArray dCoordPoint(vPointArray);

	nPoint = (int)nPoint;

#ifdef _DEBUG		

		afxDump << "In total points of crossing: " << nPoint << "\n";

#endif

	

	for (int i = 0; i < nPoint; i++)

	{

		double d_Px = dCoordPoint[i * 3] * 1000;

		double d_Py = dCoordPoint[i * 3 + 1] * 1000;

		double d_Pz = dCoordPoint[i * 3 + 2] * 1000;

#ifdef _DEBUG		

		afxDump << "Coordinates "<< (i + 1)<< " Points of crossing:" << "\n";

		afxDump << "X = " << d_Px << "\n";

		afxDump << "Y = " << d_Py << "\n";

		afxDump << "Z = " << d_Pz << "\n";

#endif		

		

	}

	SafeArrayDestroy(saCB);

	SafeArrayDestroy(saPointArray);

	SafeArrayDestroy(saTArray);

	SafeArrayDestroy(saUvArray);

	delete[]arrSplines;



}

P.S. VS2005

Ссылка на сообщение
Поделиться на других сайтах

Спасибо за помощь. Завтра попробую сделать по твоему образцу, а то уже решил пересечение искать с помощью привязок точки к кривой и поверхности.

Ссылка на сообщение
Поделиться на других сайтах

У меня то просто 3D сплайн и вытянутая поверхность. А так необходимо выполнить проверку кривой: тип ее, замкнутый контур или нет, периодическая или нет, взять ее параметры и далее, соответственно, ветвление программы. Это только пример, дальше сам.

Ссылка на сообщение
Поделиться на других сайтах

В догонку. В цикле, где выбирается тип объекта, необходимо предусмотреть все варианты объектов из которых выходишь на Curve, а не только SketchSegment. Это только пример!!!

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...