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

Sw Api: Как получить Drawingcomponent через Note?


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

Имеется: выбранное пользователем примечание.

Требуется: определить, к какому из компонентов это примечание привязано и получить свойства компонента.

Пробовал так:

получаем точку привязки примечания через Note.GetAttachPos;

используя эту точку выделяем компонент через SelectByID

ну и дальше работаем с выделенным компонентом.

Способ довольно шаткий (сработает или нет - зависит от масштаба), поэтому вопрос: нельзя ли добраться до DrawingComponent как-нибудь по-другому?

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


Я не пробывал,но попробуй так.

status = Note->IGetAnnotation ( &retval )

где

(LPANNOTATION) pAnnotation

затем status = pAnnotation->GetAttachedEntities2 ( &retval)

(VARIANT) retval

Pointer to an array of LPUNKNOWN objects

а потом через QueryInterface попытаться получить то, что нужно

ЗЫ: для SelectByID лучше использывать имя, а не координаты

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

Подскажите пожалуйста а как наоборот получить Note из выбранного DrawingComponent.

Много писать на эту тему, надо смотреть в справке API SW (то, что жирным выделенно):

...

Set owningComponent = SelMgr.GetSelectedObject5(2) <-- выбранный объект

Set swSelComp = owningComponent.GetComponent <-- собственно компонент

NameComp = swSelComp.name <-- имя компонента

...

А также :

"Annotation::GetSpecificAnnotation"

там пример есть.

Правда там ВСЕ `note` указанного компонента вычисляются,

потребуется, видимо, некоторая доп. обработка...

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

Подскажите пожалуйста а как наоборот получить Note из выбранного DrawingComponent.

Один из вариантов. Обойти все Note на виде, где выбрали DrawingComponent и проверить не принадлежат ли они этому DrawingComponent-у. Пример написан на C#, консоль. VS2005, SW2008. На C++ и VB аналогично.

using System;

using System.Collections.Generic;

using System.Text;

using SolidWorks.Interop.sldworks;

using SolidWorks.Interop.swconst;



namespace FindNote

{

	class Program

	{

		static void Main(string[] args)

		{

			List<INote> listNote = new List<INote>();



			ISldWorks swApp = new SldWorksClass();

			IModelDoc2 swModel = (IModelDoc2)swApp.IActiveDoc2;

			if (swModel == null)

				return;

			if (swModel.GetType() != (int)swDocumentTypes_e.swDocDRAWING)

				return;

			ISelectionMgr swSelMgr = (ISelectionMgr)swModel.ISelectionManager;

			int countObj = swSelMgr.GetSelectedObjectCount();

			if (countObj < 2)

				return;

			View swView = null;

			IEntity swEntity = null;

			for (int i = 1; i <= countObj; i++)

			{

				int selType = swSelMgr.GetSelectedObjectType2(i);

				switch (selType)

				{

					case ((int)swSelectType_e.swSelFACES):

					case ((int)swSelectType_e.swSelEDGES):

					case ((int)swSelectType_e.swSelSILHOUETTES):

						swEntity = (IEntity)swSelMgr.GetSelectedObject5(i);

						break;

					case((int)swSelectType_e.swSelDRAWINGVIEWS):

						swView = (View)swSelMgr.GetSelectedObject5(i);

						break;

				}				

			}

			if (swEntity == null)

				return;



			IDrawingComponent swDrawingComponent = (IDrawingComponent)swEntity.GetDrawingComponent(swView);

			// далее находим все Note принадлежащие вбранному компоненту и виду, где компонент находится

			INote swNote = (INote)swView.GetFirstNote();

			while (swNote != null)

			{

				IAnnotation swAnnot = (IAnnotation)swNote.IGetAnnotation();

				int count = swAnnot.GetAttachedEntityCount2();

				int[] objEntity = (int[])swAnnot.GetAttachedEntityTypes();

				if (objEntity == null)

				{

					swNote = (INote)swNote.IGetNext();

					continue;

				}

				int typeEntity;

				if (count == 1)

					typeEntity = objEntity[0];

				else

					typeEntity = objEntity[count - 1];

				swEntity = null;

				switch (typeEntity)

				{

					case (int)swSelectType_e.swSelFACES:

						IFace swFace = (IFace)swAnnot.IGetAttachedEntities();

						swEntity = (IEntity)swFace;						

						break;

					case (int)swSelectType_e.swSelEDGES:

						IEdge swEdge = (IEdge)swAnnot.IGetAttachedEntities();

						swEntity = (IEntity)swEdge;

						break;

					case (int)swSelectType_e.swSelVERTICES:

						IVertex swVertex = (IVertex)swAnnot.IGetAttachedEntities();

						swEntity = (IEntity)swVertex;

						break;

					default:

						swNote = (INote)swNote.IGetNext();

						continue;

				}



				IDrawingComponent swDrwComp = (IDrawingComponent)swEntity.GetDrawingComponent(swView);

				if (swDrawingComponent == swDrwComp)

					listNote.Add(swNote); // заполняем список нотами, которые принадлежат выбранному компоненту и виду

										  // и делаем с ним что хотим



				swNote = (INote)swNote.IGetNext();

			}

		}

	}

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Горыныч
      Только Вы решаете. Я Вам из собственного опыта привел рекомендации. Если страшно, то не берите, только и всего. Сломать можно все что угодно. 
    • Orchestra2603
      Ладно. Я примерно понял, что вы имеете в виду. В теории, даже чтобы выделить n-ный базис нужно зафиксировать какие-то значения n раз. Только надо так их задавать, чтобы каждый раз получались линейно-независимые вектора. Я бы не называл это "закреплением", потому что возникает ложная кажущаяся параллель со статическим решением, где мы ищем единственное решение и для этого фиксируем какие-то компоненты, хотя здесь цель расчета принципиально иная. Это, как по мне, приводит к путанице, но если вам нравится это так называть, то - пожалуйста. Кто я такой, чтобы вам запрещать)   Я не могу сказать, что решать нужно всегда. В моем понимании в определенных итерационных схемах собственные вектора получаются полседовательными приближениями сами по себе. Применяя всякие манипуляции к матрицам (сдвиги и т.д.) можно контролировать сходимость к наибольшему, наименьшему, i-му и т.д. собственному вектору. Я не прав?   Что касается факторизаций, то для любых квадратных матриц существует разложение Шура, где ортогональными преобразованиями матрица приводится к треугольной форме. В частности, для обобщенной задачи, вот выдержка из статьи. Алгоритм получаения такого разложения для обобщенной задачи называется QZ алгоритм. Он вовсю используется в Матлабею Я не вижу никаких препятствий принципиальных, чтобы получить такую факторизацию матриц.     Т.е. похоже, что, да, все же приходится решать СЛАУ, в общем случае для треугольной матрицы A-lambda*B. И покуда lambda будет собственным значением, вся матрица A-lambda*B будет вырождена. В частности, для нулевых СЗ A-lambda*B = A, и А, сама собой, вырождена.   Но.. не могу пока сказать точно, но вроде как если A и B - симметричны, то QAZ и QBZ из треугольных превращаются в диагональные, и тогда столбцы Q становятся автоматически собственными векторами (разложение Шура переходит в спектральное), т.е. и решать ничего не приходится. Но где-то пишут, что нужна положительная определенность, где-то пишут, что только симметрии достаточно... не могу пока точно сказать.  
    • ДОБРЯК
      Я вижу, что вы не поняли. А говорили, что это знали еще в детском саду... https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0 Читайте внимательно. :=)   Ме́тод Га́усса — классический метод решения системы линейных алгебраических уравнений (СЛАУ). Назван в честь немецкого математика Карла Фридриха Гаусса. Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе треугольного вида, из которой последовательно, начиная с последних (по номеру), находятся все переменные системы.  
    • Shura762
      (дисклеймер ) не взлетит... особенно учитывая его отношение, как человека колбасит, и почему в ТФ "узел" а не точка... перепутано местами "ты" , "на" и пропустили слово "пошёл" ... можно сказать я работаю в таком коллективе, и ЧЁ, плевали на ТФ с высокой колокольни, если молодежь можно еще как-то замотивировать, показать как надо работать, то старшее поколение делает на "отвали моя черешня" чертежи выдали тяп-ляп и что тебе надо то еще .... (дальше идиоматические выражения в рамках законодательства) p.s. я догадываюсь почему "узел" и считаю что правильное название дали.
    • lem_on
      Термообработка намного эффективнее, но из за размеров можно использовать локальное воздействие на сварочные швы вибрацией либо "проковкой" 
    • maxx2000
      так хозяин-барин, ты же деньги плотишь
    • lem_on
    • Павлуха
      Да повесть на команду S и не париться.
    • gudstartup
      та и ломают не от ума! так их не ремонтируют а просто новые устанавливают
    • lem_on
      Та хз, мне ехать а не шашечки. Жалоб нет , значить всех все устраивает.    С дуру можно много чего сломать, а по цене ремонта направляющие качения нам ного больше стоят чем скольжения. 
×
×
  • Создать...