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

Количество деталей в борке


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



это я знаю, мне програмно надо

<{POST_SNAPBACK}>

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

Одни из функций, которые, лично я использую, при чтении и подсчете компонентов сборки из FeatureManager:

status = Configuration->GetChildrenCount ( &numChildren ),

status = Component2->IGetChildren ( &retval ),

status = Configuration->IGetChildren ( numChildren, Children ).

Но стоит помнить, что встречаются некоторые случаи, где придется програмно потрудиться при подсчете кол-ва компонентов. Например одинаковые имена во FeatureManager у разных моделей (у меня чаще всего это бывает с крепежом) и разные имена у одной модели (и такое бывало), плюс еще конфигурации и т.д и т.п.

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

Shvg, а как ты с массивами обходишься

public int GetComponentsCount(string FeatureName)

		{

			SldWorks.SldWorks swApp = new SldWorks.SldWorks();

			ModelDoc2 model;

			model = swApp.IActiveDoc2;

			Feature ft;

			int count = 0;

			ft = (Feature)model.FirstFeature();

			while (ft != null)

			{

				if (ft.GetTypeName() == "Reference")

				{

				   if (ft.Name.Remove(ft.Name.Length - 2, 2) == FeatureName) count++;

				}

				Application.DoEvents();

				ft = (Feature)ft.GetNextFeature();

			}

			return count;

		}

вот так получаю количество каждого элемента в сборке, но если вставлен 1 элемент и в массиве создано 12 экземпляров этого элемента то функция мне возвращает количество 1. Как обойти эту багу?

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

To Pit-Bul Тебе Component нужен или Feature? Непонятно, вначале ты хочешь

По ссылкам сборки определяю состав оной, а вот как определить количество каждой входимой моделъ

, а затем по коду
public int GetComponentsCount(string FeatureName)

		{

			SldWorks.SldWorks swApp = new SldWorks.SldWorks();

			ModelDoc2 model;

			model = swApp.IActiveDoc2;

			Feature ft;

			int count = 0;

			ft = (Feature)model.FirstFeature();

			while (ft != null)

			{

				if (ft.GetTypeName() == "Reference")

				{

				   if (ft.Name.Remove(ft.Name.Length - 2, 2) == FeatureName) count++;

				}

				Application.DoEvents();

				ft = (Feature)ft.GetNextFeature();

			}

			return count;

		}
ищешь Feature, хотя как ты пишешь

вот так получаю количество каждого элемента в сборке

Подсчет компонентов и фьючерсов производится немного по разному.

Поставь четкую и конкретную задачу. Прочитай девиз Kelny

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

вот так получаю количество каждого элемента в сборке, но если вставлен 1 элемент и в массиве создано 12 экземпляров этого элемента то функция мне возвращает количество 1. Как обойти эту багу?

to Pit-Bul:

по секрету и только между нами:

А если проверять значение не только ft.GetTypeName равно "Reference"

а еще и ft.GetTypeName равно "ReferencePattern", то наверно все и получится...

у меня в VBA например это выглядит так

If Feat.GetTypeName = "Reference" Or Feat.GetTypeName = "ReferencePattern" Then

и так далее ...

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

Myklkl, спасибо!

To Shvg

на самом деле я из списка элементов дерева (FeatureManager) и выделяю эти компоненты модели, функции которые подсказали мне вы почему то не захотели дать нужного ответа.

а четкая задача такова:

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

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

...функции которые подсказали мне вы почему то не захотели дать нужного ответа...

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

Теперь более менее понятно. Вот код, который просто читает компоненты из дерева и подсчитывет кол-во. Может, что нибудь и возмешь полезное.

using System;

using System.Collections;

using System.Collections.Generic;

using System.Text;

using SldWorks;

using SwConst;

using System.Windows.Forms;

using System.Diagnostics;



namespace PitBul

{

	public class AssemblyComponent

	{

		#region Object

		SldWorks.SldWorks swApp;

		SldWorks.ModelDoc2  swModel;

		SldWorks.Configuration swConfigAsm;

		SldWorks.Component2 swRootComponent;



		ArrayList arrSubAsm = null;

		ArrayList arrPart = null;

		#endregion Object



		public AssemblyComponent()

		{

		}

		public void GetComponentInAsm()

		{

			try

			{

				swApp = new SldWorks.SldWorks();

				swModel = swApp.IActiveDoc2;

				if (swModel == null)

					return;

				int DocType = swModel.GetType();

				if (DocType != (int)SwConst.swDocumentTypes_e.swDocASSEMBLY)

				{

					MessageBox.Show("Функция выполняется только с документом сборки!");

					return;

				}



				arrSubAsm = new ArrayList(); // для подсборок

				arrPart = new ArrayList(); // для деталей



				swConfigAsm = swModel.IGetActiveConfiguration();

				swRootComponent = (Component2)swConfigAsm.IGetRootComponent();

				object[] arrComponent = (object[])swRootComponent.GetChildren(); // массив компонентов для сборки

				int iCount = arrComponent.Length;  // общее кол-во компонентов в сборке

				if (iCount == 0) // пустая сборка

					return;

				for (int i = 0; i < iCount; i++) // обходим циклом весь массив компонентов

				{

					SldWorks.Component2 swComponent = (Component2)arrComponent[i];

					object[] child = (object[])swComponent.GetChildren(); // существуют-ли дочерние компоненты

					int iChild = child.Length; 

					if (iChild > 0) // подсборка

						SelectPart(swComponent, 0);

					else // деталь

						SelectPart(swComponent, 1);

				}

				// Вывод результатов

				{

					if (arrSubAsm.Count > 0)

						PrintNameAndValues(arrSubAsm, "Подсборки");

					if (arrPart.Count > 0)

						PrintNameAndValues(arrPart, "Детали");

				}





			}

			catch (Exception e)

			{

				MessageBox.Show(e.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

			}

		}



		private void SelectPart(Component2 swComponent, int iGroup)

		{

			string strNameComponent = swComponent.Name2; // имя компонента в дереве

			string strConfigComponent = swComponent.ReferencedConfiguration; // конфигурация компонента в дереве

			CorrectionNameComponent(ref strNameComponent); // удаляем "-" в имени компонента



			// в зависимости подсборка или деталь записываем в разные ArrayList-ы

			switch (iGroup)

			{

				case 0:

					ValueComponent(arrSubAsm, strNameComponent, strConfigComponent);

					break;

				case 1:

					ValueComponent(arrPart, strNameComponent, strConfigComponent);

					break;

			}

		}



		private void ValueComponent(ArrayList arrList, string strName, string strConfig)

		{

			// подсчет кол-ва по наименованию и конфигурации

			bool bres = false;

			int iLen = arrList.Count;

			if (iLen == 0) // ArrayList еще пустой

			{

				TreeComponent selComp = new TreeComponent();

				selComp.Name = strName;

				selComp.Configuration = strConfig;

				selComp.Count = 1;

				arrList.Add(selComp);

			}

			else

			{

				for (int i = 0; i < iLen; i++) 

				{

					// проверяем записан ли компонент в ArrayList

					TreeComponent arrComp = (TreeComponent)arrList[i];

					string strNameTemp = arrComp.Name;

					string strConfigTemp = arrComp.Configuration;

					int count = arrComp.Count;

					if (strName == strNameTemp)

					{

						if (strConfig == strConfigTemp)

						{

							arrComp.Count = count + 1; // если совпадает имя и конфигурация прибавляем 1 и выходим из цикла

							bres = true;

							break;

						}

					}

				}

				if (bres == false) // если компонент еще не записан в ArrayList, то записываем его 

				{

					TreeComponent selComp = new TreeComponent();

					selComp.Name = strName;

					selComp.Configuration = strConfig;

					selComp.Count = 1;

					arrList.Add(selComp);

				}

			}

		}



		private void CorrectionNameComponent(ref string strNameComponent)

		{			

			// удаляем "-" в имени компонента

			char[] separator = new char[] { '-' };

			string[] splName = strNameComponent.Split(separator, StringSplitOptions.None);

			int iLen = splName.Length;

			string Sep = "-";

			strNameComponent = String.Join(Sep, splName, 0, iLen - 1);

		}



		private void PrintNameAndValues(ArrayList arrList, string strGroup)

		{

			int iCount = arrList.Count;

			for (int i = 0; i < iCount; i++)

			{

				TreeComponent tree = (TreeComponent)arrList[i];

				string strName = tree.Name;

				string strValue = tree.Count.ToString();

				Debug.WriteLine(strName + "	" + strValue);

			}

		}

	}



	public class TreeComponent

	{

		public string Name;

		public string Configuration;

		public int Count;

	}

}

Но как я и писал

Но стоит помнить, что встречаются некоторые случаи, где придется програмно потрудиться при подсчете кол-ва компонентов. Например одинаковые имена во FeatureManager у разных моделей (у меня чаще всего это бывает с крепежом) и разные имена у одной модели (и такое бывало), плюс еще конфигурации и т.д и т.п.

И еще, маленький совет. На .NET под SW пиши DLL-ки, код выполняется намного быстрее. У меня лично разница, при полном раскрытие сборки, при почти одинаковом коде, между exe и dll составляла 8-12 раз в зависимости от сборки. Ну это так для общего ознакомления.
Ссылка на сообщение
Поделиться на других сайтах

Shvg, огромное спасибо :clap_1:

Хоть у меня получилось все уже, но и твой пример будет очень полезен. Благодаря подсказке которую дал Myklkl, у меня все заработало, вот итог

Вот сама функция по выборке компонентов

/// <summary>

		/// Получаем список компонентов которые могут войти в состав изделия

		/// </summary>

		/// <returns></returns>

		public ArrayList  GetComponents()

		{

			SldWorks.SldWorks swApp = new SldWorks.SldWorks();

			ModelDoc2 model;

			model = swApp.IActiveDoc2;

			Feature ft;

			ArrayList featurs = new ArrayList();

			ft = (Feature)model.FirstFeature();

			while (ft != null)

			{

				if ((ft.GetTypeName() == "Reference") || (ft.GetTypeName() == "ReferencePattern"))

				{

					featurs.Add(ft.Name);

				}

				ft = (Feature)ft.GetNextFeature();

			}

			return featurs;

		}

только не пойму почему выборка из сборки 214 элеменов FeatureManager'а занимает около 16 секунд? Надо твой код попробывать :)

а вот обработка уже для подсчета количества

ArrayList Components = sf.GetComponents();

			for (int x = 0; x < items.Count; x++)

			{

				for (int y = 0; y < Compunents.Count; y++)

				{

					if (Components[y].ToString().Contains(items[x].ToString())) count++;

				}

				itemsCouter.Add(count);

				count = 0;

			}
Изменено пользователем Pit-Bul
Ссылка на сообщение
Поделиться на других сайтах

только не пойму почему выборка из сборки 214 элеменов FeatureManager'а занимает около 16 секунд?

По всей видимости здесь:

while (ft != null)

			{

				if ((ft.GetTypeName() == "Reference") || (ft.GetTypeName() == "ReferencePattern"))

				{

					featurs.Add(ft.Name);

				}

				ft = (Feature)ft.GetNextFeature();

			}
Обход feature может дорого обходиться. Но надо посмотреть.
Ссылка на сообщение
Поделиться на других сайтах

Я думаю дело в том, что происходит "Выбор" - Select компонента в дереве - лично у меня это сильно тормозит .

Но я пишу на VB (.exe)

Никак не дойду до СИ.

Кстати, и на VB можно делать DLL.

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

To Pit-Bul

Провел небольшой тест. Сборка 71 компонент, из них подсборок 1. В режиме Debug

Твой код по выбору через Feature(подсчет самих компонентов не проводился, на это еще уйдет время) - 4,6 сек

Твой код, но DLL - 0.016 сек (тоже без подсчета кол-ва)

Мой код exe-файл - 2.5 сек

Аналогичный моему код, но DLL - 0,015 сек. (Максимально, через раз показывал одни нули).

Это так для справки.

Изменено пользователем Shvg
Ссылка на сообщение
Поделиться на других сайтах
  • 8 месяцев спустя...

private void ValueComponent(ArrayList arrList, string strName, string strConfig)

{

// подсчет кол-ва по наименованию и конфигурации

bool bres = false;

int iLen = arrList.Count;

if (iLen == 0) // ArrayList еще пустой

{

TreeComponent selComp = new TreeComponent();

selComp.Name = strName;

selComp.Configuration = strConfig;

selComp.Count = 1;

arrList.Add(selComp);

}

Подскажите пожалуйста что это за компонент TreeComponent

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

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

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

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

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

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

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

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

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

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

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



  • Сообщения

    • Kasper
      Не подскажите есть ли плагин в ТС для быстрого просмотра формата solidworks?
    • Aurifer
      Редактировал отдельно подсборку открывая через Windows. Потом открываю главную сборку, выходит сообщение "модели изменились, перестроить?", соглашаюсь, ошибка.  Редактировал прямо из основной сборки, кнопкой "редактировать сборку" в дереве построений. Эффект тот же.  Из ограничений, каркас на котором крепятся валы, выбираю ПКМ - "зафиксированный". Чтобы остальные детали (подсборки) двигались относительно валов. И в то же время в "свойства компонента" - "решить как" - ставлю "свободно". Чтобы валы можно было сдвигать/раздвигать между собой. Если решить как, ставлю "точно", то опять же ошибка перестроения.  P.s: Картинку мою видно? Как то криво у меня отображает. 
    • maxx2000
      редактировать можно по-разному, в контексте сборки, либо сделав подсборку активной и редактируется уже в контексте подсборки. А так всё что понятно что ты в сборке наложил ограничения, потом открыл подсборку и в ней наложил ограничения и у тебя естественно возник конфликт.
    • Aurifer
      Добрый день, подскажите что я делаю не так.  Имеется такая сборка: Расстояние между валами не фиксировал, чтобы потом сопряжения сделать по факту. Сборку сделал. Теперь задача сохранить деталь (подсборку) с зафиксированными валами. Но вот не задача.Редактирую подсборку прямо из сборки, делаю валы зафиксированными. Но при открытии файла вне сборки, валы фиксированны, но не в тех местах как в сборке, а в тех где они были до вставки в сборку.  Ладно, опять открываю эту подсборку, делаю в ней сопряжение "граничащее расстояние" . Расстояние оставляю, то которое программа автоматически подставила. Сохраняю. Основная сборка пытается перестроиться и выпадают ошибки, что нельзя решить данные сопряжения!  Пробовал измерить расстояние на ответной части и вбить вручную, ошибки перестроения.  Любые попытки зафиксировать эти валы или их кронштейны приводят к ошибкам перестроения. 
    • SAVASTEEV
      Всем привет, у фанука есть цикл G72 очень удобный цикл когда нужно отрезным резцом сделать какие-либо проточки контура, а как можно задать такую же обработку на сиеменсе? Стойка siemens 808d ? То есть создаю нужный контур, но какой вариант обработки нужно указать? Либо как правильно нужно задать контур, попробовал разные варианты у меня резец выходит либо в заготовку (по симуляции), либо идет как проходной резец (типа как по тому же циклу G71 фанучному)   Буду благодарен за помощь, так-как вручную прописывать и рассчитывать все контуры такое себе.... В 840 и в 828 стойки вроде можно выбрать вариант проточки продольная либо поперечная, но вот как сделать это в 808.... 
    • maxx2000
      установить сверхкомпактные противовесы из обеднённого урана  а если серьёзно, то рассмотреть верньерный механизм
    • gudstartup
      а вы на манометр при резке посмотреть не пробовали?
    • Guhl
      Ха, точно. Я почему-то был уверен, что это только для аналоговых шпинделей. Спасибо! Это согласование датчика
    • Tad
      Делал не раз и не два. Более десячти лет тому назад рекомендовал эту схему с соответствующей картинкой на одном техническом форуме для проверки насоса. Там она была уместна. А теперь хотел бы услышать от вас, в чем я неправ - если выдаете себя за специалиста - аргументы в студию, дабы не прослыть простым трепачем.  
    • Иван1987
×
×
  • Создать...