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

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

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




  • Сообщения

    • Cefius
      Добрый день! Интересует макрос сохраняющий тела из многотела в стп формат. У вас есть такой? Можете поделиться за вознаграждение?
    • Bellka
      станок был выкуплен и попал мне в руки, сейчас работает но тем кто его пытался ломать чинить точно спасибо не скажу
    • Девочка_конструктор
      Подскажите пожалуйста, как вы задаете тепловые трубки для расчета теплоотвода? Как отдельное тело (например, из меди), отдельно пористую среду и отдельно течение жидкости (в таком случае сложно задать конвекцию жидкости, тем более она у меня осуществляется без учета гравитации) / или как тепловую трубку? Тогда вопрос, как выбирать поверхности теплопоглощения и поверхности теплоотвода, если по сути это одни и те же поверхности, только в одном месте они поглощают тепло, в другом - отдают.  Считаю радиоэлектронный модуль, у меня микропроцессоры мощностью более 60 Вт нагреваются до 150 градусов. Хочу оценить влияние тепловой трубки, помогла бы она в этой ситуации отвести тепло должным образом или нет. Но гравитацию использовать не могу, конструкция не позволяет. Следовательно, нужно как-то разумно задать пористую среду для тепловой трубки, чтобы конденсат жидкости возвращался в зону нагрева. Помогите 
    • Ветерок
      Этот вариант хорош ещё тем, что сечение всегда будет ориентировано по нормали к цилиндру - не будет никаких перекосов на стенках. Но есть подозрение, что на цилиндре эта схема будет сложнее, чем на плоскости, поскольку края каждого "следующего" сечения наезжают на "предыдущее" (за счет изгиба стенки цилиндра). И точки касания двух стенок расположены не на диаметре шара, а на некой хорде, не проходящей через центр.
    • andrei4ik
      ну я же не новую деталь создаю... но щас гляну конечно но хз нет не хранит.... ошибка никуда и не ушла, и кажу более... если я добавляю какую сборку в главную сборку тот все детали в добавленной сборке становятся сокращенными
    • maxx2000
      можно и по линии сделать фрезой диаметром меньше чем паз
    • maxx2000
      зачем вообще считать то что априори не требует расчёта? Там чтобы что-то согнуть веса будут к тонне приближаться
    • persona1980_1
      Можно еще воспользоваться пользовательским анализом для создания дополнительных графиков и их уже учитывать при протягивании сечения как у вас на картинке (не по нормали к траектории). Там высота сечения будет меняться в зависимости от этого дополнительного графика.
    • maxx2000
      @filsan цилиндрическая. Я бы отдал модель, да Крео 11. Цилиндр, его пересекает поверхность, поверхность утолщаю с вычитанием материала. получаются два разорванных фрагмента, затем через всё вытянул цилиндр диаметром чуть меньше начального. Можно заморочиться построить поверхность с диркой, повлияет только на число фичеров в дереве
    • Kelny
      Рекомендовал бы удалить ветки реестра с настройками всех версий (возможно программа при запуске пытается стянуть настройки с другой версии в дополнении к основной), а потом поставить программу с нуля. Так же после настройки стоит сохранить настройки программы через Мастер настроек Solidworks, что бы при сбое можно было восстановить все ваши настройки, а не настраивать всё с нуля (это долго и нудно).   Это есть, но всё же первая настройка настройка, так понял, работает и надо просто добавить все кнопки сразу. А если вызвать настройку повторно, то все пользовательские кнопки остаются, но пусты, в них нет данных для запуска и они не отображаются на работающей панельки.   Как вариант загнать нужные кнопки во всплывающую панельку вызываемую клавишей "S" на клавиатуре.
×
×
  • Создать...