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

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

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




  • Сообщения

    • Jesse
      а что такое этот corioliss в Ansys? что делает эта опция?
    • Борман
      А ну вот как раз вспоминаю про гироскопический момент, как интеграл сил инерции, действующих на смещенное колесо. И вот тут как раз появляется зависимость от направления вращения. В одном случае этот момент будет выворачивать колесо наружу, а в другом пытаться вернуть колесо ближе к оси. Но это эффект следующего порядка, и prestress-модальник его не схватывает. А сиса как-то сама умеет это учитывать, отсюда будут и разные частоты. Много на эту тему почерпнул (для себя) из книги Жирицкого, на которую ссылался в теме по вашей ссылке. Эту тему я забросил в начале 2008 года и больше не касался ее.
    • rocket
      Добрый день, у нас 4 осевой станок Syntec 6MB с поворотной головой вокруг оси Y, покупали б/у и приехал еще с поворотной осью А подключенный но не видящий ось А. В итоге помогло поменять в параметрах в разделе/index 10 поменять на 2 и в index 24 где ось B поменять 4 на 0 а в index 25  поменять с 0 на 4 (чтобы он читал с 4 порта) если посмотреть как идет подключение, то от этого зависят цифры 
    • maxx2000
      Спасибо КЭП, но в ярлыке ничего прописывать не надо, достаточно создать новый ярлык. Вопрос был про вызов справки из приложения. Впрочем, перезагрузка ПК устранило это досадное недоразумение.
    • Maxmore
      Согласен полностью, через всё это пришлось пройти. От себя добавлю что у нас 400ый не PRO а обычный - его еще больше пришлось доводить до рабочего состояния, так как их производят разные заводы. с ITX508MY еще все более печально было - проблемы на пусконаладке, затем замена прокладок, затем пусконаладка уже с участием китайца...в общем да, помучаться пришлось. С большего оборудование рабочее, свои функции выполняет. Фануковские посты можно доработать до HNC без особых проблем.
    • Fedor
      Для любой размерности можно решать полином этой размерности. Такова сущность вопроса существования, а не конкретное явление вычисления. Дух, а не буква :)
    • anykeyto
      День добрый коллеги. Работает ли кто на этой стойке? Где берете информацию по программированию кроме мануала от Ками?  Интересует макропрограммирование, программирование цилиндрической интерполяции. Да и вообще, давайте делиться опытом. В свободном доступе практически нет никакой информации о работе станка и стойки этого чуда китайской инженерии.  Вопрос про G108, пользовался ли кто функцией CTOS/STOC?   
    • __Andrey__
      Доброго всем времени суток. Начал сборку станка для симуляции. Загрузил модель станка DMU50 в папку. В генераторе станков сделал настройки осей. Постпроцессор на sinumerik создал из шаблона. Скопировал папку cse_driver со станка с похожей кинематикой (sim06_mill_5ax). В файлы .dat внесены данные. При запуске симуляции по машинному коду ругается, что не найден файл PMAC. После закрытия окна с ошибкой продолжает работу и доходит до смены инструмента и там выскакивает ошибка. . Прошу помощи с этой проблемой. Файл to_ini генерируется в папку cse_driver.
    • anykeyto
      Устроился в начале года в контору где стоит IronMAC IMU-5X 400 Pro. Стойка HNC8-848di. Контора отправила на обучение, на курс 5-осной обработки на этой стойке, в цто Ками в Москве. В целом все доступно и понятно. Это когда было само обучение. Но в работе самой стойки есть куча вопросов. По факту на стойка не настроена. Не знаю, может наладчик который запускал станок попался ленивый, может в другом была причина. Но первый месяц-полтора занимался только настройкой системы (что знал, что пришло в процессе изучения параметров, ладдера, и прочее).   Сам станок интересный и понятный. Но русская локализация хромая, как и мануал от ками. Там голимый перевод то ли с английского, толи с китайского.... но вместо фрезы "нож" и так далее.  Основа тут G код, в целом почти фанук, но есть отличия. Есть группа циклов для фрезеровки сверления, резьбы и расточки, под них есть прям шаблон, в котором только переменные задаешь, но криво реализован синтаксис, который поправить можно уже непосредственно в коде.
    • Ветерок
      В ярлыке прописать путь к русскому файлу: "C:\PTC\Creo 8.0.4.0\creo_help_pma\russian\index.html"
×
×
  • Создать...