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

OpenAPI NX


Tproger

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

Здравствуйте. Может кто подскажет, как вытащить функцию экспорта файла в STL из NX 8.5, в журнале ничего не понятно, как он выбирает файл, с помощью какой функции экспортирует и тд.

Мне бы найти пример экспорта файла для C#. Экспорт из PRT.

Заранее спасибо. 

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


34 минуты назад, Tproger сказал:

Здравствуйте. Может кто подскажет, как вытащить функцию экспорта файла в STL из NX 8.5, в журнале ничего не понятно, как он выбирает файл, с помощью какой функции экспортирует и тд.

Мне бы найти пример экспорта файла для C#. Экспорт из PRT.

Заранее спасибо. 

Возможно подключиться к процессу и выполнить экспорт, как вариант. Как подключиться и как задать путь к файлу,который надо экспортировать? Спасибо.

Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Tproger сказал:

Возможно подключиться к процессу и выполнить экспорт, как вариант. Как подключиться и как задать путь к файлу,который надо экспортировать? Спасибо.

Может так, не работал с сименс

public void PutSolidInStlFile(
	IntPtr file_handle,
	Tag csys,
	Tag body,
	double min_edge_len,
	double max_edge_len,
	double facet_toler,
	out int num_errors,
	out UFStd..::..StlError[] error_info
)

и еще один

public void OpenBinaryStlFile(
	string file_name,
	bool append,
	string header,
	out IntPtr file_handle
)

Работать с файлами и перемещаться по каталогам наверное можно без api. Вот еще в справке

Ссылка на сообщение
Поделиться на других сайтах
//Export STL text
		public  void ExportToSTLtext(ArrayList MasObj, string FileName)
		{
			System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-us");

			StreamWriter SW=new StreamWriter(FileName);
			SW.WriteLine("solid");


			for (int k=0; k<MasObj.Count; k++)
			{
				Tag Obj=(Tag)MasObj[k];
				
				Tag facetTag=0;
				theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag);  

				int facet_id=-1;
				while (true)
				{
					theUFSession.Facet.CycleFacets(facetTag, ref facet_id);
					if (facet_id==-1) {break;}

					//normal
					double[] normal=new double[3];
					double coef=0;
					theUFSession.Facet.AskPlaneEquation(facetTag, facet_id, normal, out coef);
					string coorN=normal[0].ToString(ci)+" "+normal[1].ToString(ci)+" "+normal[2].ToString(ci); 
					SW.WriteLine("facet normal "+coorN);
					//

					//vertex
					int num_vertex=0;
					theUFSession.Facet.AskNumVertsInFacet(facetTag, facet_id, out num_vertex);
					double[,] vertex=new double[num_vertex,3];
					theUFSession.Facet.AskVerticesOfFacet(facetTag, facet_id, out num_vertex, vertex);
					SW.WriteLine("outer loop");
					for (int i=0; i<num_vertex; i++)
					{

						string coor=vertex[i,0].ToString(ci)+" "+vertex[i,1].ToString(ci)+" "+vertex[i,2].ToString(ci); 
						SW.WriteLine("vertex "+coor);
					}
					SW.WriteLine("endloop");
					SW.WriteLine("endfacet");
				}
			}
			SW.WriteLine("endsolid");
			SW.Close();
		}

//Export STL bin 
		public  void ExportToSTLbin(ArrayList MasObj, string FileName)
		{
			System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-us");
			BinaryWriter BW=new BinaryWriter(File.Create(FileName));

			char[] Header=new char[80]; for (int h=0; h<80; h++) Header[h]=' '; 
			BW.Write(Header);

			int num_fac=0;
			for (int f=0; f<MasObj.Count; f++)
			{
				Tag ft=0;
				theUFSession.Facet.FacetSolid((Tag)MasObj[f], ref param, out ft); theUFSession.Facet.FacetSolid((Tag)MasObj[f], ref param, out ft);
				int num=0;theUFSession.Facet.AskNFacetsInModel(ft, out num);
				num_fac+=num;
			}
			BW.Write(num_fac);

			for (int k=0; k<MasObj.Count; k++)
			{
				Tag Obj=(Tag)MasObj[k];
				//facet
				Tag facetTag=0;
				theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag);  
				int facet_id=-1;
				while (true)
				{
					theUFSession.Facet.CycleFacets(facetTag, ref facet_id);
					if (facet_id==-1) {break;}

					//normal
					double[] normal=new double[3];
					double coef=0;
					theUFSession.Facet.AskPlaneEquation(facetTag, facet_id, normal, out coef);

					BW.Write( (float)normal[0]);
					BW.Write( (float)normal[1]);
					BW.Write( (float)normal[2]);
					//

					//vertex
					int num_vertex=0;
					theUFSession.Facet.AskNumVertsInFacet(facetTag, facet_id, out num_vertex);
					double[,] vertex=new double[num_vertex,3];
					theUFSession.Facet.AskVerticesOfFacet(facetTag, facet_id, out num_vertex, vertex);
					for (int i=0; i<num_vertex; i++)
					{	
						BW.Write((float)vertex[i,0]);
						BW.Write((float)vertex[i,1]);
						BW.Write((float)vertex[i,2]);
					}
					ushort attr=0; BW.Write(attr);
				}
			}
			BW.Close();

		}

Пользуйтесь люди добрые.
и не добрые...

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, koner сказал:

//Export STL text
		public  void ExportToSTLtext(ArrayList MasObj, string FileName)
		{
			System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-us");

			StreamWriter SW=new StreamWriter(FileName);
			SW.WriteLine("solid");


			for (int k=0; k<MasObj.Count; k++)
			{
				Tag Obj=(Tag)MasObj[k];
				
				Tag facetTag=0;
				theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag);  

				int facet_id=-1;
				while (true)
				{
					theUFSession.Facet.CycleFacets(facetTag, ref facet_id);
					if (facet_id==-1) {break;}

					//normal
					double[] normal=new double[3];
					double coef=0;
					theUFSession.Facet.AskPlaneEquation(facetTag, facet_id, normal, out coef);
					string coorN=normal[0].ToString(ci)+" "+normal[1].ToString(ci)+" "+normal[2].ToString(ci); 
					SW.WriteLine("facet normal "+coorN);
					//

					//vertex
					int num_vertex=0;
					theUFSession.Facet.AskNumVertsInFacet(facetTag, facet_id, out num_vertex);
					double[,] vertex=new double[num_vertex,3];
					theUFSession.Facet.AskVerticesOfFacet(facetTag, facet_id, out num_vertex, vertex);
					SW.WriteLine("outer loop");
					for (int i=0; i<num_vertex; i++)
					{

						string coor=vertex[i,0].ToString(ci)+" "+vertex[i,1].ToString(ci)+" "+vertex[i,2].ToString(ci); 
						SW.WriteLine("vertex "+coor);
					}
					SW.WriteLine("endloop");
					SW.WriteLine("endfacet");
				}
			}
			SW.WriteLine("endsolid");
			SW.Close();
		}

//Export STL bin 
		public  void ExportToSTLbin(ArrayList MasObj, string FileName)
		{
			System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-us");
			BinaryWriter BW=new BinaryWriter(File.Create(FileName));

			char[] Header=new char[80]; for (int h=0; h<80; h++) Header[h]=' '; 
			BW.Write(Header);

			int num_fac=0;
			for (int f=0; f<MasObj.Count; f++)
			{
				Tag ft=0;
				theUFSession.Facet.FacetSolid((Tag)MasObj[f], ref param, out ft); theUFSession.Facet.FacetSolid((Tag)MasObj[f], ref param, out ft);
				int num=0;theUFSession.Facet.AskNFacetsInModel(ft, out num);
				num_fac+=num;
			}
			BW.Write(num_fac);

			for (int k=0; k<MasObj.Count; k++)
			{
				Tag Obj=(Tag)MasObj[k];
				//facet
				Tag facetTag=0;
				theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag);  
				int facet_id=-1;
				while (true)
				{
					theUFSession.Facet.CycleFacets(facetTag, ref facet_id);
					if (facet_id==-1) {break;}

					//normal
					double[] normal=new double[3];
					double coef=0;
					theUFSession.Facet.AskPlaneEquation(facetTag, facet_id, normal, out coef);

					BW.Write( (float)normal[0]);
					BW.Write( (float)normal[1]);
					BW.Write( (float)normal[2]);
					//

					//vertex
					int num_vertex=0;
					theUFSession.Facet.AskNumVertsInFacet(facetTag, facet_id, out num_vertex);
					double[,] vertex=new double[num_vertex,3];
					theUFSession.Facet.AskVerticesOfFacet(facetTag, facet_id, out num_vertex, vertex);
					for (int i=0; i<num_vertex; i++)
					{	
						BW.Write((float)vertex[i,0]);
						BW.Write((float)vertex[i,1]);
						BW.Write((float)vertex[i,2]);
					}
					ushort attr=0; BW.Write(attr);
				}
			}
			BW.Close();

		}

Пользуйтесь люди добрые.
и не добрые...

theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag); 

А что за объект theUFSession?

Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, koner сказал:

UFSession theUFSession=UFSession.getSession()
 

 theUFSession.Facet.FacetSolid(Obj, ref param, out facetTag);

А param объявлять же не надо?

Извиняюсь за тупые вопросы, недавно начал учить 

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

забыл, есть некоторые инициализирующиеся параметры
 

	public class FuncSTL
	{
		public static Session theSession;
		public static UFSession theUFSession;

		private static NXOpen.UF.UFFacet.Parameters param;
		public static double STL_dist_tolerance=0.2; 
		public static double STL_angular_tolerance=0; 
		public static double STL_curve_dist_tolerance=0.2; 
		public static double STL_curve_angular_tolerance=0; 


		public FuncSTL()
		{
			theSession = Session.GetSession();
			theUFSession =UFSession.GetUFSession();
			param=new NXOpen.UF.UFFacet.Parameters();
			theUFSession.Facet.AskDefaultParameters(out param);

			param.surface_dist_tolerance=STL_dist_tolerance;
			param.surface_angular_tolerance=STL_angular_tolerance;
			param.curve_dist_tolerance=STL_curve_dist_tolerance;
			param.curve_angular_tolerance=STL_curve_angular_tolerance;

			param.max_facet_edges=3;
			param.number_storage_type=1;
			param.specify_surface_tolerance=true;
			param.specify_curve_tolerance=true;
			param.specify_parameters=true;
			param.specify_view_direction=false;
		}
    }

Те самые функции нужно воткнуть в этот класс и создать экземпляр перед их вызовом.
Не красиво но как есть, писалось давно.

Ссылка на сообщение
Поделиться на других сайтах
13 минуты назад, koner сказал:

забыл, есть некоторые инициализирующиеся параметры
 


	public class FuncSTL
	{
		public static Session theSession;
		public static UFSession theUFSession;

		private static NXOpen.UF.UFFacet.Parameters param;
		public static double STL_dist_tolerance=0.2; 
		public static double STL_angular_tolerance=0; 
		public static double STL_curve_dist_tolerance=0.2; 
		public static double STL_curve_angular_tolerance=0; 


		public FuncSTL()
		{
			theSession = Session.GetSession();
			theUFSession =UFSession.GetUFSession();
			param=new NXOpen.UF.UFFacet.Parameters();
			theUFSession.Facet.AskDefaultParameters(out param);

			param.surface_dist_tolerance=STL_dist_tolerance;
			param.surface_angular_tolerance=STL_angular_tolerance;
			param.curve_dist_tolerance=STL_curve_dist_tolerance;
			param.curve_angular_tolerance=STL_curve_angular_tolerance;

			param.max_facet_edges=3;
			param.number_storage_type=1;
			param.specify_surface_tolerance=true;
			param.specify_curve_tolerance=true;
			param.specify_parameters=true;
			param.specify_view_direction=false;
		}
    }

Те самые функции нужно воткнуть в этот класс и создать экземпляр перед их вызовом.
Не красиво но как есть, писалось давно.

public void ExportToSTLtext(ArrayList MasObj, string FileName)

И получает чтобы заработало я должен свой файл каким-то образом передать в массив(MasObj)?

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

 

2 часа назад, koner сказал:

theUFSession.Facet.AskNumVertsInFacet(facetTag, facet_id, out num_vertex);

 

Только благодаря Вашему коду я узнал, что в STL могут хранится не только треугольники (сначала подумал "что за бред?!", потом успокоился и внимательнее почитал википедию).

Спасибо! :smile:

Ссылка на сообщение
Поделиться на других сайтах
29 минут назад, Tproger сказал:

И получает чтобы заработало я должен свой файл каким-то образом передать в массив(MasObj)?

на входе, теги тел. По крайне мере у меня это типы UF_solid_type (70). А вообще нужно смотреть что там функция принимает

 

4 минуты назад, Алексей256 сказал:

Только благодаря Вашему коду я узнал, что в STL могут хранится не только треугольники

Да, меня это тоже удивляло

Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, koner сказал:

Да, меня это тоже удивляло

Кстати, а как в случае бинарного STL приложение, которое использует в дальнейшей данный STL-файл, узнает, что в файле закодированные полигоны с большим количеством вершин?

Особенно если количество вершин переменное (тут  храним треугольник, там четырёхугольник и т.д.) в пределах одного файла?

В текстовом виде есть граничные признаки.

А в двоичном?

Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, Алексей256 сказал:

Кстати, а как в случае бинарного STL приложение

Трудно сказать, давно я с этим разбирался.
Может быть STL формат поддерживает только треугольники, а многоугольники это внутреннее "расширение" NX.

Ссылка на сообщение
Поделиться на других сайтах
16 минут назад, koner сказал:

Трудно сказать, давно я с этим разбирался.
Может быть STL формат поддерживает только треугольники, а многоугольники это внутреннее "расширение" NX.

На википедии к текстовому варианту STL есть примечание что вариант с многоугольниками допускается.

Так что это нормально.

Но в случае двоичного как-то умолчали в статье.

В двоичном варианте после заголовка поле есть под количество треугольников.

Но у нас то получается что каждая запись на "треугольник" (полигон) может (или могла бы) иметь нефиксированную длину.

И если в NX-овских фасетах попадётся не треугольник, то в случае кодирования "в лоб" бинарного STL всё может быть плохо в случае дальнейшей попытки этот файл прочитать и корректно интерпретировать?

Не тесселировать же вручную каждый полигон на составляющие треугольники?

 

P.S.: Извините если не по теме.

Изменено пользователем Алексей256
Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, Алексей256 сказал:

И если в NX-овских фасетах попадётся не треугольник, то в случае кодирования "в лоб" бинарного STL всё может быть плохо?

в параметрах есть максимальное количество ребер
 

max_facet_edges
int
The maximum number of edges allowed 
in the facets that are to be generated.

но, смысл Ваших слов я понял.
Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, koner сказал:

в параметрах есть максимальное количество ребер
 

Я Вас тоже понял - получается можно изначально параметры перед генерацией задать так, чтобы кроме треугольников NX ничего и не генерировал.

Спасибо! :smile:

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

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

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

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

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

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

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

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

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

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

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




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