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

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 пользователей

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




  • Сообщения

    • Dimetil Gidrozin Dnepr
      прикольный раздел. я раньше его не видел патамушта ниумею юзать меню данного форума. меня слишком быстро банили. а щаз чета не банят разбираюсь потихоньку с этим форумом. вот хочу тут отметиться. я глянул про что пишут другие авторы. вот заметил многие просят модель какой нибудь штуки или устройства и наверняка за долгое время где то нашли или сами замоделили)) припоминаю на одной работе я баловался конфигурациями. так я для этого дела вообще построил структуру той фирмы на своем компе. у меня там были папки со стандартными деталями, которые использовались абсолютно во всех столах, которые продавала та фирма)) ну элементы ножек, балок, а также крепеж мебельный)) я нигде не качал никаких моделей и не юзал тулбоксов с макросами, абсолютно все модели делал сам и складывал в папочки нужные откуда потом ссылил в своих моделях сборок)) предлагаю в этой теме солидвокерам делиться стандартными деталями, которые они часто используют в своей работе!!!!      
    • Dimetil Gidrozin Dnepr
      я кстати не юзаю тулбокс от слова совсем)) на каждой новой работе новый солид с новыми настройками и другого года выпуска и глянуть своиже модели с предыдущей работы с использованием тулбокса не выйдет)) я готов потратить месяц на создание детали. которая в тулбоксе за минуту делается, так я хоть в солиде умею работать, а вы полупограммисты с макросами тулбоксовскими))
    • Dimetil Gidrozin Dnepr
      почему во всех темах про ускоренную или эффективную работу все лупят только какие то макросы?)) ну я в жизни их не использовал и не представляю что это)) а почему просто про команды, кнопки, меню не пишет никто ничего?)) расскажите как вам удается быстрей и эффективней работать без макросов)) я возьму на заметку. макросы мне не интересны как и линукс, ато скоро уже будут эффективность в солиде через 1C повышать))
    • Dimetil Gidrozin Dnepr
      я не компания)) я частное лицо)) физлицо если быть точнее)) у меня нет работников)) я сам на заводе работаю))
    • Bot
      Чем сложнее методики и технологии, тем более компетентные специалисты нужны для работы с ними. При этом в строительной отрасли острая нехватка квалифицированных кадров. Айбим вносит свой вклад в решение этой проблемы, давно и плодотворно сотрудничает с 15 российскими вузами. А в этом году открылся Университет Айбим. Преподаватели и авторы курсов систематизируют компетенции в области управления проектами, обучают работе с передовым ПО, показывают, как внедрять лучшие мировые практики. На вебинаре: расскажут о планах Университета; познакомят с расписанием курсов; ответят на вопросы. Дата и время: 30 мая 2024 г., 11:00 МСК РЕГИСТРАЦИЯ View the full article
    • Maik812
      Бооольшой геморой!!! особенно для маленькой такой компании..
    • Snake 60
      @engyuri Держите версию без активных кнопок. Вроде бы ничего не поломал :) https://cloud.mail.ru/public/VE2U/7cbGso8EN Говорим спасибо Леониду aka @Leon, за предоставленные исходники.
    • lem_on
      Проблема чисто технического характера, все равно датчик под станок калибровать, неважно на каком он конусе сидит или через переходник.  И вообще проще не под МК конус брать, просто заготовку с ск40 и на ней уже сделать посадку под датчик. 
    • lem_on
      Где то да, совсем рядом. 
    • brigval
      Даже не пенсионер.
×
×
  • Создать...