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

Функция 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 пользователей

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




  • Сообщения

    • Kelny
      Намекаю на то, что многие новички используют зеркало не к месту, пытаясь отзеркалить, то чего не требуется зеркалить.   С тем же успехом можно создать зеркальную деталь в детали и потом так же привязать со своими привязками.   Как уже написали выше ищите стрелочки для продолжения настройки, а не зелёную галочку и так же смотрите справку: https://help.solidworks.com/2018/russian/SolidWorks/sldworks/c_mirror_components.htm?id=d23b5ebc313c42ce8798a416ab014931&_gl=1*v3nvpa*_up*MQ..*_ga*MTQyNjQxODU4Ni4xNzE5NzgzMzAy*_ga_XQJPQWHZHH*MTcxOTc4MzMwMi4xLjEuMTcxOTc4MzM3MS4wLjAuMA..#Pg0   https://help.solidworks.com/2018/russian/SolidWorks/sldworks/c_Component_Patterns_and_Mirroring_SWassy.htm?id=174930154bec4d2e9e1e07f07b4ae244&_gl=1*kkuj1z*_up*MQ..*_ga*NzI0Mzk5MDc4LjE3MTk3ODM1NDk.*_ga_XQJPQWHZHH*MTcxOTc4MzU0OC4xLjAuMTcxOTc4MzU0OC4wLjAuMA..#Pg0        
    • Kelny
      Что бы заказчику было удобно, вероятно надо использовать Driveworks и заказчику дать web-морду в которой дать возможность выбирать параметры изделия, а так же предварительный просмотр. А после подтверждения заказчиком получить набор моделей и чертежей для производиства.
    • Sabadash
      В этой обработке ширина 0.4, высота 0.2 мм фреза 3мм Дальше аккуратненько подрезаются 1 мм фрезой до 0.05 мм зигзагом по контуру детали в пределе перемычки.    
    • malvi.dp
      Это возможно. Нужно использовать оператор IF, например так  
    • Jesse
      За "страшилки" мне точно не заплатят   Ну все от конструкции зависит. Если большая выхлопная труба обдувается, то всё возможно..   Типа да) Решено забить. Множественные обоснования даны на этот счёт)
    • Roman Habbl
      Причину нашел, просто надо генерировать с временем обработки.  Тему можно закрыть 
    • maxx2000
      А вот мне интересно.  Как это делается в других системах? И как это портировать в SW? 
    • Guhl
      Я про точность ничего не говорил Я говорил про скорость работы Но сигнал о токе и так уже заведен в процессор. Получается, что компаратор - это дополнительное звено, где ж тут удешевление?
    • Ветерок
      Вопрос в названии темы: Можно ли гасить/негасить элементы в зависимости от значения глобальной переменной? Например, если длина детали меньше определенного значения, то часть элементов гасится, если длина больше, то присутствуют все. Гасимые элементы - не экземпляры массива. Хотелось бы реализовать без создания двух исполнений. Если такое возможно штатными средствами. Это некая базовая модель, по которой планируется генерировать различные варианты с разными произвольными (но в определенном диапазоне) габаритами. Генерировать буду не я, а заказчик. Моя задача реализовать это максимально удобно.   Адептов ТФ  и других систем прошу не рассказывать как это делается в других системах. Вопрос про Солид 2022.
    • gudstartup
      серво система принимает решение по мгновенному значению тока в течении периода времени времени отведенного для управления током и чем чаще она это делает тем лучше и качественней регулирование момента. с аналоговым контуром тока как бы вам не хотелось вы не получите  такие данные точности контура даже близко  дешево и никаких доп. функций не требуется.   
×
×
  • Создать...